40
40
} while (0)
41
41
#endif
42
42
43
+ #define ksft_assert (condition ) \
44
+ do { if (!(condition)) ksft_exit_fail_msg("Assertion failed: %s\n", #condition); } while (0)
45
+
43
46
static struct {
44
47
pthread_mutex_t lock ;
45
48
void * * states ;
@@ -111,26 +114,19 @@ static void vgetrandom_init(void)
111
114
const char * version = versions [VDSO_VERSION ];
112
115
const char * name = names [VDSO_NAMES ][6 ];
113
116
unsigned long sysinfo_ehdr = getauxval (AT_SYSINFO_EHDR );
114
- size_t ret ;
117
+ ssize_t ret ;
115
118
116
- if (!sysinfo_ehdr ) {
117
- printf ("AT_SYSINFO_EHDR is not present!\n" );
118
- exit (KSFT_SKIP );
119
- }
119
+ if (!sysinfo_ehdr )
120
+ ksft_exit_skip ("AT_SYSINFO_EHDR is not present\n" );
120
121
vdso_init_from_sysinfo_ehdr (sysinfo_ehdr );
121
122
vgrnd .fn = (__typeof__ (vgrnd .fn ))vdso_sym (version , name );
122
- if (!vgrnd .fn ) {
123
- printf ("%s is missing!\n" , name );
124
- exit (KSFT_SKIP );
125
- }
123
+ if (!vgrnd .fn )
124
+ ksft_exit_skip ("%s@%s symbol is missing from vDSO\n" , name , version );
126
125
ret = VDSO_CALL (vgrnd .fn , 5 , NULL , 0 , 0 , & vgrnd .params , ~0UL );
127
- if (ret == - ENOSYS ) {
128
- printf ("unsupported architecture\n" );
129
- exit (KSFT_SKIP );
130
- } else if (ret ) {
131
- printf ("failed to fetch vgetrandom params!\n" );
132
- exit (KSFT_FAIL );
133
- }
126
+ if (ret == - ENOSYS )
127
+ ksft_exit_skip ("CPU does not have runtime support\n" );
128
+ else if (ret )
129
+ ksft_exit_fail_msg ("Failed to fetch vgetrandom params: %zd\n" , ret );
134
130
}
135
131
136
132
static ssize_t vgetrandom (void * buf , size_t len , unsigned long flags )
@@ -139,10 +135,7 @@ static ssize_t vgetrandom(void *buf, size_t len, unsigned long flags)
139
135
140
136
if (!state ) {
141
137
state = vgetrandom_get_state ();
142
- if (!state ) {
143
- printf ("vgetrandom_get_state failed!\n" );
144
- exit (KSFT_FAIL );
145
- }
138
+ ksft_assert (state );
146
139
}
147
140
return VDSO_CALL (vgrnd .fn , 5 , buf , len , flags , state , vgrnd .params .size_of_opaque_state );
148
141
}
@@ -154,7 +147,7 @@ static void *test_vdso_getrandom(void *ctx)
154
147
for (size_t i = 0 ; i < TRIALS ; ++ i ) {
155
148
unsigned int val ;
156
149
ssize_t ret = vgetrandom (& val , sizeof (val ), 0 );
157
- assert (ret == sizeof (val ));
150
+ ksft_assert (ret == sizeof (val ));
158
151
}
159
152
return NULL ;
160
153
}
@@ -164,7 +157,7 @@ static void *test_libc_getrandom(void *ctx)
164
157
for (size_t i = 0 ; i < TRIALS ; ++ i ) {
165
158
unsigned int val ;
166
159
ssize_t ret = getrandom (& val , sizeof (val ), 0 );
167
- assert (ret == sizeof (val ));
160
+ ksft_assert (ret == sizeof (val ));
168
161
}
169
162
return NULL ;
170
163
}
@@ -174,7 +167,7 @@ static void *test_syscall_getrandom(void *ctx)
174
167
for (size_t i = 0 ; i < TRIALS ; ++ i ) {
175
168
unsigned int val ;
176
169
ssize_t ret = syscall (__NR_getrandom , & val , sizeof (val ), 0 );
177
- assert (ret == sizeof (val ));
170
+ ksft_assert (ret == sizeof (val ));
178
171
}
179
172
return NULL ;
180
173
}
@@ -209,7 +202,7 @@ static void bench_multi(void)
209
202
210
203
clock_gettime (CLOCK_MONOTONIC , & start );
211
204
for (size_t i = 0 ; i < THREADS ; ++ i )
212
- assert (pthread_create (& threads [i ], NULL , test_vdso_getrandom , NULL ) == 0 );
205
+ ksft_assert (pthread_create (& threads [i ], NULL , test_vdso_getrandom , NULL ) == 0 );
213
206
for (size_t i = 0 ; i < THREADS ; ++ i )
214
207
pthread_join (threads [i ], NULL );
215
208
clock_gettime (CLOCK_MONOTONIC , & end );
@@ -218,7 +211,7 @@ static void bench_multi(void)
218
211
219
212
clock_gettime (CLOCK_MONOTONIC , & start );
220
213
for (size_t i = 0 ; i < THREADS ; ++ i )
221
- assert (pthread_create (& threads [i ], NULL , test_libc_getrandom , NULL ) == 0 );
214
+ ksft_assert (pthread_create (& threads [i ], NULL , test_libc_getrandom , NULL ) == 0 );
222
215
for (size_t i = 0 ; i < THREADS ; ++ i )
223
216
pthread_join (threads [i ], NULL );
224
217
clock_gettime (CLOCK_MONOTONIC , & end );
@@ -227,7 +220,7 @@ static void bench_multi(void)
227
220
228
221
clock_gettime (CLOCK_MONOTONIC , & start );
229
222
for (size_t i = 0 ; i < THREADS ; ++ i )
230
- assert (pthread_create (& threads [i ], NULL , test_syscall_getrandom , NULL ) == 0 );
223
+ ksft_assert (pthread_create (& threads [i ], NULL , test_syscall_getrandom , NULL ) == 0 );
231
224
for (size_t i = 0 ; i < THREADS ; ++ i )
232
225
pthread_join (threads [i ], NULL );
233
226
clock_gettime (CLOCK_MONOTONIC , & end );
@@ -252,48 +245,46 @@ static void kselftest(void)
252
245
253
246
for (size_t i = 0 ; i < 1000 ; ++ i ) {
254
247
ssize_t ret = vgetrandom (weird_size , sizeof (weird_size ), 0 );
255
- if (ret != sizeof (weird_size ))
256
- exit (KSFT_FAIL );
248
+ ksft_assert (ret == sizeof (weird_size ));
257
249
}
258
250
259
251
ksft_test_result_pass ("getrandom: PASS\n" );
260
252
261
253
unshare (CLONE_NEWUSER );
262
- assert (unshare (CLONE_NEWTIME ) == 0 );
254
+ ksft_assert (unshare (CLONE_NEWTIME ) == 0 );
263
255
child = fork ();
264
- assert (child >= 0 );
256
+ ksft_assert (child >= 0 );
265
257
if (!child ) {
266
258
vgetrandom_init ();
267
259
child = getpid ();
268
- assert (ptrace (PTRACE_TRACEME , 0 , NULL , NULL ) == 0 );
269
- assert (kill (child , SIGSTOP ) == 0 );
270
- assert (vgetrandom (weird_size , sizeof (weird_size ), 0 ) == sizeof (weird_size ));
260
+ ksft_assert (ptrace (PTRACE_TRACEME , 0 , NULL , NULL ) == 0 );
261
+ ksft_assert (kill (child , SIGSTOP ) == 0 );
262
+ ksft_assert (vgetrandom (weird_size , sizeof (weird_size ), 0 ) == sizeof (weird_size ));
271
263
_exit (0 );
272
264
}
273
265
for (;;) {
274
266
struct ptrace_syscall_info info = { 0 };
275
267
int status , ret ;
276
- assert (waitpid (child , & status , 0 ) >= 0 );
268
+ ksft_assert (waitpid (child , & status , 0 ) >= 0 );
277
269
if (WIFEXITED (status )) {
278
- if (WEXITSTATUS (status ) != 0 )
279
- exit (KSFT_FAIL );
270
+ ksft_assert (WEXITSTATUS (status ) == 0 );
280
271
break ;
281
272
}
282
- assert (WIFSTOPPED (status ));
273
+ ksft_assert (WIFSTOPPED (status ));
283
274
if (WSTOPSIG (status ) == SIGSTOP )
284
- assert (ptrace (PTRACE_SETOPTIONS , child , 0 , PTRACE_O_TRACESYSGOOD ) == 0 );
275
+ ksft_assert (ptrace (PTRACE_SETOPTIONS , child , 0 , PTRACE_O_TRACESYSGOOD ) == 0 );
285
276
else if (WSTOPSIG (status ) == (SIGTRAP | 0x80 )) {
286
- assert (ptrace (PTRACE_GET_SYSCALL_INFO , child , sizeof (info ), & info ) > 0 );
277
+ ksft_assert (ptrace (PTRACE_GET_SYSCALL_INFO , child , sizeof (info ), & info ) > 0 );
287
278
if (info .op == PTRACE_SYSCALL_INFO_ENTRY && info .entry .nr == __NR_getrandom &&
288
279
info .entry .args [0 ] == (uintptr_t )weird_size && info .entry .args [1 ] == sizeof (weird_size ))
289
- exit ( KSFT_FAIL );
280
+ ksft_exit_fail_msg ( "vgetrandom passed buffer to syscall getrandom unexpectedly\n" );
290
281
}
291
- assert (ptrace (PTRACE_SYSCALL , child , 0 , 0 ) == 0 );
282
+ ksft_assert (ptrace (PTRACE_SYSCALL , child , 0 , 0 ) == 0 );
292
283
}
293
284
294
285
ksft_test_result_pass ("getrandom timens: PASS\n" );
295
286
296
- exit ( KSFT_PASS );
287
+ ksft_exit_pass ( );
297
288
}
298
289
299
290
static void usage (const char * argv0 )
0 commit comments