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" \
|
||||
".long 999b - .\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
|
||||
#define annotate_reachable()
|
||||
#define annotate_unreachable()
|
||||
#define __annotate_jump_table
|
||||
#endif
|
||||
|
||||
#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_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,
|
||||
/* Now overwrite non-defaults ... */
|
||||
BPF_INSN_MAP(BPF_INSN_2_LBL, BPF_INSN_3_LBL),
|
||||
|
@ -1558,7 +1558,6 @@ out:
|
|||
BUG_ON(1);
|
||||
return 0;
|
||||
}
|
||||
STACK_FRAME_NON_STANDARD(___bpf_prog_run); /* jump table */
|
||||
|
||||
#define PROG_NAME(stack_size) __bpf_prog_run##stack_size
|
||||
#define DEFINE_BPF_PROG_RUN(stack_size) \
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
|
||||
#define FAKE_JUMP_OFFSET -1
|
||||
|
||||
#define C_JUMP_TABLE_SECTION ".rodata..c_jump_table"
|
||||
|
||||
struct alternative {
|
||||
struct list_head list;
|
||||
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
|
||||
* 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;
|
||||
|
||||
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;
|
||||
|
||||
/*
|
||||
* This searches for the .rodata section or multiple .rodata.func_name
|
||||
* sections if -fdata-sections is being used. The .str.1.1 and .str.1.8
|
||||
* rodata sections are ignored as they don't contain jump tables.
|
||||
* Search for the following rodata sections, each of which can
|
||||
* potentially 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) {
|
||||
if (!strncmp(sec->name, ".rodata", 7) &&
|
||||
!strstr(sec->name, ".str1.")) {
|
||||
if ((!strncmp(sec->name, ".rodata", 7) && !strstr(sec->name, ".str1.")) ||
|
||||
!strcmp(sec->name, C_JUMP_TABLE_SECTION)) {
|
||||
sec->rodata = true;
|
||||
found = true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue