提交 54f698f3 编写于 作者: T Thomas Gleixner

Merge branch 'x86/debug' into core/urgent

Pick up the two pending objtool patches as the next round of objtool fixes
depend on them.
...@@ -116,9 +116,14 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, ...@@ -116,9 +116,14 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
".pushsection .discard.unreachable\n\t" \ ".pushsection .discard.unreachable\n\t" \
".long 999b - .\n\t" \ ".long 999b - .\n\t" \
".popsection\n\t" ".popsection\n\t"
/* Annotate a C jump table to allow objtool to follow the code flow */
#define __annotate_jump_table __section(".rodata..c_jump_table")
#else #else
#define annotate_reachable() #define annotate_reachable()
#define annotate_unreachable() #define annotate_unreachable()
#define __annotate_jump_table
#endif #endif
#ifndef ASM_UNREACHABLE #ifndef ASM_UNREACHABLE
......
...@@ -1299,7 +1299,7 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) ...@@ -1299,7 +1299,7 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
{ {
#define BPF_INSN_2_LBL(x, y) [BPF_##x | BPF_##y] = &&x##_##y #define BPF_INSN_2_LBL(x, y) [BPF_##x | BPF_##y] = &&x##_##y
#define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z #define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z
static const void *jumptable[256] = { static const void * const jumptable[256] __annotate_jump_table = {
[0 ... 255] = &&default_label, [0 ... 255] = &&default_label,
/* Now overwrite non-defaults ... */ /* Now overwrite non-defaults ... */
BPF_INSN_MAP(BPF_INSN_2_LBL, BPF_INSN_3_LBL), 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) ...@@ -1558,7 +1558,6 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
BUG_ON(1); BUG_ON(1);
return 0; return 0;
} }
STACK_FRAME_NON_STANDARD(___bpf_prog_run); /* jump table */
#define PROG_NAME(stack_size) __bpf_prog_run##stack_size #define PROG_NAME(stack_size) __bpf_prog_run##stack_size
#define DEFINE_BPF_PROG_RUN(stack_size) \ #define DEFINE_BPF_PROG_RUN(stack_size) \
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#define FAKE_JUMP_OFFSET -1 #define FAKE_JUMP_OFFSET -1
#define C_JUMP_TABLE_SECTION ".rodata..c_jump_table"
struct alternative { struct alternative {
struct list_head list; struct list_head list;
struct instruction *insn; struct instruction *insn;
...@@ -1035,9 +1037,15 @@ static struct rela *find_switch_table(struct objtool_file *file, ...@@ -1035,9 +1037,15 @@ static struct rela *find_switch_table(struct objtool_file *file,
/* /*
* Make sure the .rodata address isn't associated with a * Make sure the .rodata address isn't associated with a
* symbol. gcc jump tables are anonymous data. * symbol. GCC jump tables are anonymous data.
*
* Also support C jump tables which are in the same format as
* switch jump tables. For objtool to recognize them, they
* need to be placed in the C_JUMP_TABLE_SECTION section. They
* have symbols associated with them.
*/ */
if (find_symbol_containing(rodata_sec, table_offset)) if (find_symbol_containing(rodata_sec, table_offset) &&
strcmp(rodata_sec->name, C_JUMP_TABLE_SECTION))
continue; continue;
rodata_rela = find_rela_by_dest(rodata_sec, table_offset); rodata_rela = find_rela_by_dest(rodata_sec, table_offset);
...@@ -1277,13 +1285,18 @@ static void mark_rodata(struct objtool_file *file) ...@@ -1277,13 +1285,18 @@ static void mark_rodata(struct objtool_file *file)
bool found = false; bool found = false;
/* /*
* This searches for the .rodata section or multiple .rodata.func_name * Search for the following rodata sections, each of which can
* sections if -fdata-sections is being used. The .str.1.1 and .str.1.8 * potentially contain jump tables:
* rodata sections are ignored as they don't contain jump tables. *
* - .rodata: can contain GCC switch tables
* - .rodata.<func>: same, if -fdata-sections is being used
* - .rodata..c_jump_table: contains C annotated jump tables
*
* .rodata.str1.* sections are ignored; they don't contain jump tables.
*/ */
for_each_sec(file, sec) { for_each_sec(file, sec) {
if (!strncmp(sec->name, ".rodata", 7) && if ((!strncmp(sec->name, ".rodata", 7) && !strstr(sec->name, ".str1.")) ||
!strstr(sec->name, ".str1.")) { !strcmp(sec->name, C_JUMP_TABLE_SECTION)) {
sec->rodata = true; sec->rodata = true;
found = true; found = true;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册