Lines Matching refs:td
67 static void default_result(struct tdescr *td, bool force_exit) in default_result() argument
69 if (td->result == KSFT_SKIP) { in default_result()
71 } else if (td->pass) { in default_result()
73 td->result = KSFT_PASS; in default_result()
76 td->result = KSFT_FAIL; in default_result()
80 exit(td->result); in default_result()
91 static bool handle_signal_unsupported(struct tdescr *td, in handle_signal_unsupported() argument
94 if (feats_ok(td)) in handle_signal_unsupported()
100 if (!td->initialized) { in handle_signal_unsupported()
106 td->pass = 1; in handle_signal_unsupported()
113 static bool handle_signal_trigger(struct tdescr *td, in handle_signal_trigger() argument
116 td->triggered = 1; in handle_signal_trigger()
118 td->run(td, si, uc); in handle_signal_trigger()
123 static bool handle_signal_ok(struct tdescr *td, in handle_signal_ok() argument
130 assert(!td->sig_trig || td->triggered); in handle_signal_ok()
134 si->si_addr, si->si_code, td->token, td->token - si->si_addr); in handle_signal_ok()
141 if (!td->sanity_disabled && !td->token) { in handle_signal_ok()
146 if (td->sig_ok_code) { in handle_signal_ok()
147 if (si->si_code != td->sig_ok_code) { in handle_signal_ok()
149 si->si_code, td->sig_ok_code); in handle_signal_ok()
160 if (td->sig_ok == SIGSEGV && si->si_code != SEGV_ACCERR) { in handle_signal_ok()
166 td->pass = 1; in handle_signal_ok()
178 static bool handle_signal_copyctx(struct tdescr *td, in handle_signal_copyctx() argument
196 head = get_header(head, EXTRA_MAGIC, td->live_sz, &offset); in handle_signal_copyctx()
210 copied_extra = (struct extra_context *)&(td->live_uc->uc_mcontext.__reserved[offset]); in handle_signal_copyctx()
216 if (to_copy > td->live_sz) { in handle_signal_copyctx()
219 td->live_sz, to_copy); in handle_signal_copyctx()
223 memcpy(td->live_uc, uc, to_copy); in handle_signal_copyctx()
235 td->live_uc_valid = 1; in handle_signal_copyctx()
269 static int default_setup(struct tdescr *td) in default_setup() argument
275 sa.sa_flags |= td->sa_flags; in default_setup()
289 if (td->sig_trig) in default_setup()
290 unblock_signal(td->sig_trig); in default_setup()
291 if (td->sig_ok) in default_setup()
292 unblock_signal(td->sig_ok); in default_setup()
293 if (td->sig_unsupp) in default_setup()
294 unblock_signal(td->sig_unsupp); in default_setup()
296 if (td->timeout) { in default_setup()
298 alarm(td->timeout); in default_setup()
305 static inline int default_trigger(struct tdescr *td) in default_trigger() argument
307 return !raise(td->sig_trig); in default_trigger()
310 int test_init(struct tdescr *td) in test_init() argument
312 if (td->sig_trig == sig_copyctx) { in test_init()
321 td->minsigstksz = getauxval(AT_MINSIGSTKSZ); in test_init()
322 if (!td->minsigstksz) in test_init()
323 td->minsigstksz = MINSIGSTKSZ; in test_init()
324 fprintf(stderr, "Detected MINSTKSIGSZ:%d\n", td->minsigstksz); in test_init()
326 if (td->feats_required || td->feats_incompatible) { in test_init()
327 td->feats_supported = 0; in test_init()
333 td->feats_supported |= FEAT_SSBS; in test_init()
335 td->feats_supported |= FEAT_SVE; in test_init()
337 td->feats_supported |= FEAT_SME; in test_init()
339 td->feats_supported |= FEAT_SME_FA64; in test_init()
341 td->feats_supported |= FEAT_SME2; in test_init()
343 td->feats_supported |= FEAT_GCS; in test_init()
344 if (feats_ok(td)) { in test_init()
345 if (td->feats_required & td->feats_supported) in test_init()
348 feats_to_string(td->feats_required & in test_init()
349 td->feats_supported)); in test_init()
350 if (!(td->feats_incompatible & td->feats_supported)) in test_init()
353 feats_to_string(td->feats_incompatible)); in test_init()
355 if ((td->feats_required & td->feats_supported) != in test_init()
356 td->feats_supported) in test_init()
359 feats_to_string(td->feats_required & in test_init()
360 ~td->feats_supported)); in test_init()
361 if (td->feats_incompatible & td->feats_supported) in test_init()
364 feats_to_string(td->feats_incompatible & in test_init()
365 ~td->feats_supported)); in test_init()
368 td->result = KSFT_SKIP; in test_init()
374 if (td->init && !td->init(td)) { in test_init()
378 td->initialized = 1; in test_init()
384 int test_setup(struct tdescr *td) in test_setup() argument
388 assert(td); in test_setup()
389 assert(td->name); in test_setup()
390 assert(td->run); in test_setup()
393 td->result = KSFT_FAIL; in test_setup()
394 if (td->setup) in test_setup()
395 return td->setup(td); in test_setup()
397 return default_setup(td); in test_setup()
400 int test_run(struct tdescr *td) in test_run() argument
402 if (td->trigger) in test_run()
403 return td->trigger(td); in test_run()
404 else if (td->sig_trig) in test_run()
405 return default_trigger(td); in test_run()
407 return td->run(td, NULL, NULL); in test_run()
410 void test_result(struct tdescr *td) in test_result() argument
412 if (td->initialized && td->result != KSFT_SKIP && td->check_result) in test_result()
413 td->check_result(td); in test_result()
414 default_result(td, 0); in test_result()
417 void test_cleanup(struct tdescr *td) in test_cleanup() argument
419 if (td->cleanup) in test_cleanup()
420 td->cleanup(td); in test_cleanup()