1 /******************************************************************************/ 2 /* Copyright (c) Maxin John <maxin.john@gmail.com>, 2009 */ 3 /* LKML Reference: http://lkml.org/lkml/2009/4/9/203 */ 4 /* This program is free software; you can redistribute it and/or modify */ 5 /* it under the terms of the GNU General Public License as published by */ 6 /* the Free Software Foundation; either version 2 of the License, or */ 7 /* (at your option) any later version. */ 8 /* */ 9 /* This program is distributed in the hope that it will be useful, */ 10 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 11 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ 12 /* the GNU General Public License for more details. */ 13 /* */ 14 /* You should have received a copy of the GNU General Public License */ 15 /* along with this program; if not, write to the Free Software */ 16 /* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ 17 /* */ 18 /******************************************************************************/ 19 /******************************************************************************/ 20 /* */ 21 /* File: cacheflush01.c */ 22 /* */ 23 /* Description: The cacheflush_check() syscall */ 24 /* Tests EINVAL error of cacheflush system call. */ 25 /* Its expected behaviour is cacheflush() should return -EINVAL */ 26 /* when cache parameter is not one of ICACHE, DCACHE, or BCACHE. */ 27 /* */ 28 /* Usage: <for command-line> */ 29 /* cacheflush01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */ 30 /* where, -c n : Run n copies concurrently. */ 31 /* -e : Turn on errno logging. */ 32 /* -i n : Execute test n times. */ 33 /* -I x : Execute test for x seconds. */ 34 /* -P x : Pause for x seconds between iterations. */ 35 /* -t : Turn on syscall timing. */ 36 /* */ 37 /* Total Tests: 1 */ 38 /* */ 39 /* Test Name: cacheflush01 */ 40 /******************************************************************************/ 41 42 #include <unistd.h> 43 #include <stdio.h> 44 #include <stdlib.h> 45 #include <errno.h> 46 47 #include "test.h" 48 #include "lapi/syscalls.h" 49 50 #if __NR_cacheflush != __LTP__NR_INVALID_SYSCALL 51 #include <asm/cachectl.h> 52 #else 53 #ifndef ICACHE 54 #define ICACHE (1<<0) /* flush instruction cache */ 55 #endif 56 #ifndef DCACHE 57 #define DCACHE (1<<1) /* writeback and flush data cache */ 58 #endif 59 #ifndef BCACHE 60 #define BCACHE (ICACHE|DCACHE) /* flush both caches */ 61 #endif 62 #endif 63 64 char *TCID = "cacheflush01"; 65 int TST_TOTAL = 1; 66 67 /* Extern Global Functions */ 68 /******************************************************************************/ 69 /* */ 70 /* Function: cleanup */ 71 /* */ 72 /* Description: Performs all one time clean up for this test on successful */ 73 /* completion, premature exit or failure. Closes all temporary */ 74 /* files, removes all temporary directories exits the test with */ 75 /* appropriate return code by calling tst_exit() function. */ 76 /* */ 77 /* Input: None. */ 78 /* */ 79 /* Output: None. */ 80 /* */ 81 /* Return: On failure - Exits calling tst_exit(). Non '0' return code. */ 82 /* On success - Exits calling tst_exit(). With '0' return code. */ 83 /* */ 84 /******************************************************************************/ 85 void cleanup(void) 86 { 87 88 tst_rmdir(); 89 } 90 91 /* Local Functions */ 92 /******************************************************************************/ 93 /* */ 94 /* Function: setup */ 95 /* */ 96 /* Description: Performs all one time setup for this test. This function is */ 97 /* typically used to capture signals, create temporary dirs */ 98 /* and temporary files that may be used in the course of this */ 99 /* test. */ 100 /* */ 101 /* Input: None. */ 102 /* */ 103 /* Output: None. */ 104 /* */ 105 /* Return: On failure - Exits by calling cleanup(). */ 106 /* On success - returns 0. */ 107 /* */ 108 /******************************************************************************/ 109 void setup(void) 110 { 111 /* Capture signals if any */ 112 /* Create temporary directories */ 113 TEST_PAUSE; 114 tst_tmpdir(); 115 } 116 117 int main(int ac, char **av) 118 { 119 120 char *addr = NULL; 121 122 tst_parse_opts(ac, av, NULL, NULL); 123 124 setup(); 125 126 tst_count = 0; 127 /* Create some user address range */ 128 addr = malloc(getpagesize()); 129 if (addr == NULL) { 130 tst_brkm(TFAIL | TTERRNO, cleanup, "malloc failed"); 131 } 132 133 /* Invokes cacheflush() with proper parameters */ 134 TEST(ltp_syscall(__NR_cacheflush, addr, getpagesize(), ICACHE)); 135 if (TEST_RETURN == 0) { 136 tst_resm(TPASS, "passed with no errno"); 137 } else { 138 tst_resm(TFAIL, "failed with unexpected errno"); 139 } 140 141 TEST(ltp_syscall(__NR_cacheflush, addr, getpagesize(), DCACHE)); 142 if (TEST_RETURN == 0) { 143 tst_resm(TPASS, "passed with no errno"); 144 } else { 145 tst_resm(TFAIL, "failed with unexpected errno"); 146 } 147 148 TEST(ltp_syscall(__NR_cacheflush, addr, getpagesize(), BCACHE)); 149 if (TEST_RETURN == 0) { 150 tst_resm(TPASS, "passed with no errno"); 151 } else { 152 tst_resm(TFAIL, "failed with unexpected errno"); 153 } 154 155 cleanup(); 156 tst_exit(); 157 } 158