Lines Matching full:spec

90 static void free_test_spec(struct test_spec *spec)  in free_test_spec()  argument
92 free(spec->priv.name); in free_test_spec()
93 free(spec->unpriv.name); in free_test_spec()
94 free(spec->priv.expect_msgs); in free_test_spec()
95 free(spec->unpriv.expect_msgs); in free_test_spec()
97 spec->priv.name = NULL; in free_test_spec()
98 spec->unpriv.name = NULL; in free_test_spec()
99 spec->priv.expect_msgs = NULL; in free_test_spec()
100 spec->unpriv.expect_msgs = NULL; in free_test_spec()
173 struct test_spec *spec) in parse_test_spec() argument
181 memset(spec, 0, sizeof(*spec)); in parse_test_spec()
183 spec->prog_name = bpf_program__name(prog); in parse_test_spec()
184 spec->prog_flags = BPF_F_TEST_REG_INVARIANTS; /* by default be strict */ in parse_test_spec()
192 func_id = btf__find_by_name_kind(btf, spec->prog_name, BTF_KIND_FUNC); in parse_test_spec()
194 ASSERT_FAIL("failed to find FUNC BTF type for '%s'", spec->prog_name); in parse_test_spec()
215 spec->priv.expect_failure = true; in parse_test_spec()
216 spec->mode_mask |= PRIV; in parse_test_spec()
218 spec->priv.expect_failure = false; in parse_test_spec()
219 spec->mode_mask |= PRIV; in parse_test_spec()
221 spec->unpriv.expect_failure = true; in parse_test_spec()
222 spec->mode_mask |= UNPRIV; in parse_test_spec()
225 spec->unpriv.expect_failure = false; in parse_test_spec()
226 spec->mode_mask |= UNPRIV; in parse_test_spec()
229 spec->auxiliary = true; in parse_test_spec()
230 spec->mode_mask |= PRIV; in parse_test_spec()
232 spec->auxiliary = true; in parse_test_spec()
233 spec->mode_mask |= UNPRIV; in parse_test_spec()
236 err = push_msg(msg, &spec->priv); in parse_test_spec()
239 spec->mode_mask |= PRIV; in parse_test_spec()
242 err = push_msg(msg, &spec->unpriv); in parse_test_spec()
245 spec->mode_mask |= UNPRIV; in parse_test_spec()
248 err = parse_retval(val, &spec->priv.retval, "__retval"); in parse_test_spec()
251 spec->priv.execute = true; in parse_test_spec()
252 spec->mode_mask |= PRIV; in parse_test_spec()
255 err = parse_retval(val, &spec->unpriv.retval, "__retval_unpriv"); in parse_test_spec()
258 spec->mode_mask |= UNPRIV; in parse_test_spec()
259 spec->unpriv.execute = true; in parse_test_spec()
263 err = parse_int(val, &spec->log_level, "test log level"); in parse_test_spec()
274 update_flags(&spec->prog_flags, BPF_F_STRICT_ALIGNMENT, clear); in parse_test_spec()
276 update_flags(&spec->prog_flags, BPF_F_ANY_ALIGNMENT, clear); in parse_test_spec()
278 update_flags(&spec->prog_flags, BPF_F_TEST_RND_HI32, clear); in parse_test_spec()
280 update_flags(&spec->prog_flags, BPF_F_TEST_STATE_FREQ, clear); in parse_test_spec()
282 update_flags(&spec->prog_flags, BPF_F_SLEEPABLE, clear); in parse_test_spec()
284 update_flags(&spec->prog_flags, BPF_F_XDP_HAS_FRAGS, clear); in parse_test_spec()
286 update_flags(&spec->prog_flags, BPF_F_TEST_REG_INVARIANTS, clear); in parse_test_spec()
291 update_flags(&spec->prog_flags, flags, clear); in parse_test_spec()
294 spec->btf_custom_path = s + sizeof(TEST_BTF_PATH) - 1; in parse_test_spec()
298 if (spec->mode_mask == 0) in parse_test_spec()
299 spec->mode_mask = PRIV; in parse_test_spec()
302 description = spec->prog_name; in parse_test_spec()
304 if (spec->mode_mask & PRIV) { in parse_test_spec()
305 spec->priv.name = strdup(description); in parse_test_spec()
306 if (!spec->priv.name) { in parse_test_spec()
313 if (spec->mode_mask & UNPRIV) { in parse_test_spec()
327 spec->unpriv.name = name; in parse_test_spec()
330 if (spec->mode_mask & (PRIV | UNPRIV)) { in parse_test_spec()
332 spec->unpriv.expect_failure = spec->priv.expect_failure; in parse_test_spec()
335 spec->unpriv.retval = spec->priv.retval; in parse_test_spec()
336 spec->unpriv.execute = spec->priv.execute; in parse_test_spec()
339 if (!spec->unpriv.expect_msgs) { in parse_test_spec()
340 size_t sz = spec->priv.expect_msg_cnt * sizeof(void *); in parse_test_spec()
342 spec->unpriv.expect_msgs = malloc(sz); in parse_test_spec()
343 if (!spec->unpriv.expect_msgs) { in parse_test_spec()
348 memcpy(spec->unpriv.expect_msgs, spec->priv.expect_msgs, sz); in parse_test_spec()
349 spec->unpriv.expect_msg_cnt = spec->priv.expect_msg_cnt; in parse_test_spec()
353 spec->valid = true; in parse_test_spec()
358 free_test_spec(spec); in parse_test_spec()
363 struct test_spec *spec, in prepare_case() argument
380 if ((spec->log_level & 3) < min_log_level) in prepare_case()
381 bpf_program__set_log_level(prog, (spec->log_level & 4) | min_log_level); in prepare_case()
383 bpf_program__set_log_level(prog, spec->log_level); in prepare_case()
386 bpf_program__set_flags(prog, prog_flags | spec->prog_flags); in prepare_case()
464 static bool can_execute_unpriv(struct test_loader *tester, struct test_spec *spec) in can_execute_unpriv() argument
470 if ((spec->prog_flags & BPF_F_ANY_ALIGNMENT) && !EFFICIENT_UNALIGNED_ACCESS) in can_execute_unpriv()
532 static bool should_do_test_run(struct test_spec *spec, struct test_subspec *subspec) in should_do_test_run() argument
540 if ((spec->prog_flags & BPF_F_ANY_ALIGNMENT) && !EFFICIENT_UNALIGNED_ACCESS) { in should_do_test_run()
558 struct test_spec *spec, in run_subtest() argument
561 struct test_subspec *subspec = unpriv ? &spec->unpriv : &spec->priv; in run_subtest()
574 if (!can_execute_unpriv(tester, spec)) { in run_subtest()
586 open_opts->btf_custom_path = spec->btf_custom_path; in run_subtest()
598 if (strcmp(bpf_program__name(tprog_iter), spec->prog_name) == 0) { in run_subtest()
611 prepare_case(tester, spec, tobj, tprog); in run_subtest()
637 if (should_do_test_run(spec, subspec)) { in run_subtest()
699 PRINT_FAIL("Can't parse test spec for program '%s'\n", in process_subtest()
705 struct test_spec *spec = &specs[i++]; in process_subtest() local
707 if (!spec->valid || spec->auxiliary) in process_subtest()
710 if (spec->mode_mask & PRIV) in process_subtest()
712 specs, spec, false); in process_subtest()
713 if (spec->mode_mask & UNPRIV) in process_subtest()
715 specs, spec, true); in process_subtest()