mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
bpf, x86: Use emit_rsb_call() to call bpf_unwind_target()
clang inlines emit_unwind_ret_addr() and emit_patch() into do_jit() and
folds 'bpf_unwind_target - X86_PATCH_SIZE' into one relocation. It points
to a nop in the padding in front of the function, and objtool complains:
vmlinux.o: warning: objtool: do_jit+0x1330: relocation to !ENDBR: .text+0xc7fab
It's only used to compute rel32 of a direct call, so nothing is wrong at
run time.
emit_rsb_call() does call depth accounting too and hides func from
the optimizer. Use it instead of open coding.
Fixes: cff94a3d78 ("bpf, x86: Support unwind_goto and unwind_exit")
Reported-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org> # build
Link: https://patch.msgid.link/20261021220844.239400-1-alexei.starovoitov@gmail.com
Closes: https://lore.kernel.org/bpf/20261021201456.GA3197963@ax162/
This commit is contained in:
parent
605e6a0e5a
commit
02da62c2f8
|
|
@ -2564,9 +2564,7 @@ static int emit_unwind_ret_addr(u8 **pprog, u8 *ip)
|
|||
|
||||
EMIT2(0x50, 0x56); /* push rax; push rsi */
|
||||
EMIT4(0x48, 0x8B, 0x7D, 0x08); /* mov rdi, [rbp + 8] */
|
||||
ip += prog - start;
|
||||
ip += x86_call_depth_emit_accounting(&prog, bpf_unwind_target, ip);
|
||||
if (emit_call(&prog, bpf_unwind_target, ip))
|
||||
if (emit_rsb_call(&prog, bpf_unwind_target, ip + (prog - start)))
|
||||
return -EINVAL;
|
||||
EMIT4(0x48, 0x89, 0x45, 0x08); /* mov [rbp + 8], rax */
|
||||
EMIT2(0x5E, 0x58); /* pop rsi; pop rax */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user