Skip to content

Commit e55a732

Browse files
jpoimboeIngo Molnar
authored andcommitted
bpf: Fix ORC unwinding in non-JIT BPF code
Objtool previously ignored ___bpf_prog_run() because it didn't understand the jump table. This resulted in the ORC unwinder not being able to unwind through non-JIT BPF code. Now that objtool knows how to read jump tables, remove the whitelist and annotate the jump table so objtool can recognize it. Also add an additional "const" to the jump table definition to clarify that the text pointers are constant. Otherwise GCC sets the section writable flag and the assembler spits out warnings. Fixes: d15d356 ("perf/x86: Make perf callchains work without CONFIG_FRAME_POINTER") Reported-by: Song Liu <[email protected]> Signed-off-by: Josh Poimboeuf <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Kairui Song <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Daniel Borkmann <[email protected]> Link: https://lkml.kernel.org/r/881939122b88f32be4c374d248c09d7527a87e35.1561685471.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <[email protected]>
1 parent 87b512d commit e55a732

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

kernel/bpf/core.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
12991299
{
13001300
#define BPF_INSN_2_LBL(x, y) [BPF_##x | BPF_##y] = &&x##_##y
13011301
#define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z
1302-
static const void *jumptable[256] = {
1302+
static const void * const jumptable[256] __annotate_jump_table = {
13031303
[0 ... 255] = &&default_label,
13041304
/* Now overwrite non-defaults ... */
13051305
BPF_INSN_MAP(BPF_INSN_2_LBL, BPF_INSN_3_LBL),
@@ -1558,7 +1558,6 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
15581558
BUG_ON(1);
15591559
return 0;
15601560
}
1561-
STACK_FRAME_NON_STANDARD(___bpf_prog_run); /* jump table */
15621561

15631562
#define PROG_NAME(stack_size) __bpf_prog_run##stack_size
15641563
#define DEFINE_BPF_PROG_RUN(stack_size) \

0 commit comments

Comments
 (0)