Re: [PATCH bpf-next 3/4] selftests/bpf: __jited_x86 test tag to check x86 assembly after jit

Andrii Nakryiko
2024-08-15T21:11:15Z

On Thu, Aug 8, 2024 at 6:05 PM Eduard Zingerman <eddyz87@gmail.com> wrote:
>
> Allow to verify jit behaviour by writing tests as below:
>
> SEC("tp")
> __jit_x86("endbr64")
> __jit_x86("movabs $0x.*,%r9")
> __jit_x86("add %gs:0x.*,%r9")
> __jit_x86("mov $0x1,%edi")
> __jit_x86("mov %rdi,-0x8(%r9)")
> __jit_x86("mov -0x8(%r9),%rdi")
> __jit_x86("xor %eax,%eax")
> __jit_x86("lock xchg %rax,-0x8(%r9)")
> __jit_x86("lock xadd %rax,-0x8(%r9)")
> __naked void stack_access_insns(void)
> {
> asm volatile (... ::: __clobber_all);
> }
>
> Use regular expressions by default, use basic regular expressions
> class in order to avoid escaping symbols like $(), often used in AT&T
> disassembly syntax.
>
> Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
> ---
> tools/testing/selftests/bpf/progs/bpf_misc.h | 2 +
> tools/testing/selftests/bpf/test_loader.c | 156 +++++++++++++------
> 2 files changed, 112 insertions(+), 46 deletions(-)
>

[...]

> @@ -817,6 +866,21 @@ void run_subtest(struct test_loader *tester,
> validate_msgs(tester->log_buf, &subspec->expect_xlated, emit_xlated);
> }
>
> + if (arch > 0 && subspec->jited[arch].cnt) {
> + err = get_jited_program_text(bpf_program__fd(tprog),
> + tester->log_buf, tester->log_buf_sz);
> + if (err == -ENOTSUP) {

nit: let's use EOPNOTSUPP, ENOTSUP is internal Linux error

> + printf("%s:SKIP: jited programs disassembly is not supported,\n", __func__);
> + printf("%s:SKIP: tests are built w/o LLVM development libs\n", __func__);
> + test__skip();
> + goto tobj_cleanup;
> + }
> + if (!ASSERT_EQ(err, 0, "get_jited_program_text"))
> + goto tobj_cleanup;
> + emit_jited(tester->log_buf, false /*force*/);
> + validate_msgs(tester->log_buf, &subspec->jited[arch], emit_jited);
> + }
> +
> if (should_do_test_run(spec, subspec)) {
> /* For some reason test_verifier executes programs
> * with all capabilities restored. Do the same here.
> --
> 2.45.2
>