[PATCH bpf-next 0/4] __jited_x86 test tag to check x86 assembly after jit

Eduard Zingerman
2024-08-09T01:05:49Z

Some of the logic in the BPF jits might be non-trivial.
It might be useful to allow testing this logic by comparing
generated native code with expected code template.
This patch set adds a macro __jit_x86() that could be used for
test_loader based tests in a following manner:

__success
__jit_x86("endbr64")
__jit_x86("nopl (%rax,%rax)")
__jit_x86("xorq %rax, %rax")
__jit_x86("pushq %rbp")
...
SEC("tc")
__naked int main(void) { ... }

The last patch in a set adds a test for jit code generated for tail
calls handling to demonstrate the feature.

The feature uses LLVM libraries to do the disassembly.
At selftests compilation time Makefile detects if these libraries are
available. When libraries are not available tests using __jit_x86()
are skipped.
Current CI environment does not include llvm development libraries,
but changes to add these are trivial.

This was previously discussed here:
https://lore.kernel.org/bpf/20240718205158.3651529-1-yonghong.song@linux.dev/

Eduard Zingerman (4):
selftests/bpf: less spam in the log for message matching
selftests/bpf: utility function to get program disassembly after jit
selftests/bpf: __jited_x86 test tag to check x86 assembly after jit
selftests/bpf: validate jit behaviour for tail calls

tools/testing/selftests/bpf/.gitignore | 1 +
tools/testing/selftests/bpf/Makefile | 51 +++-
.../selftests/bpf/jit_disasm_helpers.c | 228 ++++++++++++++++++
.../selftests/bpf/jit_disasm_helpers.h | 10 +
.../selftests/bpf/prog_tests/verifier.c | 2 +
tools/testing/selftests/bpf/progs/bpf_misc.h | 2 +
.../bpf/progs/verifier_tailcall_jit.c | 103 ++++++++
tools/testing/selftests/bpf/test_loader.c | 159 ++++++++----
8 files changed, 507 insertions(+), 49 deletions(-)
create mode 100644 tools/testing/selftests/bpf/jit_disasm_helpers.c
create mode 100644 tools/testing/selftests/bpf/jit_disasm_helpers.h
create mode 100644 tools/testing/selftests/bpf/progs/verifier_tailcall_jit.c

--
2.45.2