Re: [PATCH v10 3/8] selftest/bpf: Fixing powerpc JIT disassembly failure
Hari Bathini <[email protected]>
| Newsgroups | gmane.linux.ports.ppc.embedded |
|---|---|
| Message-ID | <e867421c-3700-451d-911e-b5eb235fae94__11825.9477125079$1786036808$gmane$org@linux.ibm.com> |
On 05/08/26 11:36 am, Saket Kumar Bhaskar wrote: > From: Abhishek Dubey <[email protected]> > > 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. > > Fixes: b991fc520700 ("selftests/bpf: utility function to get program disassembly after jit") The fixes tag on this patch doesn't really help. Please drop it. > Signed-off-by: Abhishek Dubey <[email protected]> > Signed-off-by: Saket Kumar Bhaskar <[email protected]> > Tested-by: Yeswanth Krishna Tellakula <[email protected]> > --- > .../selftests/bpf/jit_disasm_helpers.c | 25 ++++++++++++++++++- > 1 file changed, 24 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..c4aa1d69d3bb 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, disasm_len; > __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,30 @@ 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 > + */ > + disasm_len = func_lens[i] > trunc_len ? > + func_lens[i] - trunc_len : 0; > + disasm_one_func(text_out, image + pc, disasm_len); > + > fprintf(text_out, "\n"); > pc += func_lens[i]; > } - Hari