Re: [PATCH v7 3/7] selftest/bpf: Fixing powerpc JIT disassembly failure
From: Hari Bathini <hbathini@linux.ibm.com>
Date: 2026-06-13 12:41:00
Also in:
bpf, linux-kselftest, stable
On 11/06/26 9:08 pm, adubey@linux.ibm.com wrote:
quoted hunk ↗ jump to hunk
From: Abhishek Dubey <redacted> Ensure that the trampoline stubs JITed at the tail of the epilogue do not expose the dummy trampoline address stored in the last 8 bytes(64-bit) and last 4 bytes(32-bit) to the disassembly flow. Prevent the disassembler from ingesting this memory address, as it may occasionally decode into a seemingly valid but incorrect instruction. Fix this issue by truncating the last 8/4 bytes from JITed buffers before supplying them for disassembly. Signed-off-by: Abhishek Dubey <redacted> --- .../selftests/bpf/jit_disasm_helpers.c | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)diff --git a/tools/testing/selftests/bpf/jit_disasm_helpers.c b/tools/testing/selftests/bpf/jit_disasm_helpers.c index 3558fe10e28c..759d6a86803c 100644 --- a/tools/testing/selftests/bpf/jit_disasm_helpers.c +++ b/tools/testing/selftests/bpf/jit_disasm_helpers.c@@ -179,9 +179,11 @@ int get_jited_program_text(int fd, char *text, size_t text_sz) struct bpf_prog_info info = {}; __u32 info_len = sizeof(info); __u32 jited_funcs, len, pc; + __u32 trunc_len = 0; __u32 *func_lens = NULL; FILE *text_out = NULL; uint8_t *image = NULL; + char *triple = NULL; int i, err = 0; if (!llvm_initialized) {@@ -225,9 +227,26 @@ int get_jited_program_text(int fd, char *text, size_t text_sz) if (!ASSERT_OK(err, "bpf_prog_get_info_by_fd #2")) goto out; + /* + * last 8 bytes contains dummy_trampoline address in JIT + * output on 64-bit and last 4 bytes on 32-bit powerpc, + * which can't disassemble to a valid instruction. + */ + triple = LLVMGetDefaultTargetTriple(); + if (triple) { + if (strstr(triple, "powerpc64") || strstr(triple, "ppc64")) + trunc_len = 8; + else if (strstr(triple, "powerpc") || strstr(triple, "ppc")) + trunc_len = 4; + LLVMDisposeMessage(triple); + } + for (pc = 0, i = 0; i < jited_funcs; ++i) { fprintf(text_out, "func #%d:\n", i); - disasm_one_func(text_out, image + pc, func_lens[i]);
+ // Disabled JIT have zero func_lens, hence underflow + __u32 disasm_len = func_lens[i] > trunc_len ? + func_lens[i] - trunc_len : 0;
Following the traditional C style, declare the variable at the start of the block and leave a blank line before the fprintf() statement. Also, fix the comment style as noted by the bot.
+ disasm_one_func(text_out, image + pc, disasm_len); fprintf(text_out, "\n"); pc += func_lens[i]; }
- Hari