Merge branch 'x86/debug' into core/urgent
Pick up the two pending objtool patches as the next round of objtool fixes depend on them.
This commit is contained in:
commit
54f698f31e
|
@ -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)
|
||||||
{
|
{
|
||||||
#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)
|
||||||
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 @@
|
||||||
|
|
||||||
#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,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue