Skip to content

Commit

Permalink
objtool: Fix ANNOTATE_REACHABLE to be a normal annotation
Browse files Browse the repository at this point in the history
Currently REACHABLE is weird for being on the instruction after the
instruction it modifies.

Since all REACHABLE annotations have an explicit instruction, flip
them around.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@kernel.org>
Link: https://lore.kernel.org/r/20241128094312.494176035@infradead.org
  • Loading branch information
Peter Zijlstra committed Dec 2, 2024
1 parent e7a174f commit 87116ae
Show file tree
Hide file tree
Showing 6 changed files with 8 additions and 32 deletions.
2 changes: 1 addition & 1 deletion arch/loongarch/include/asm/bug.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
#define __WARN_FLAGS(flags) \
do { \
instrumentation_begin(); \
__BUG_FLAGS(BUGFLAG_WARNING|(flags), ANNOTATE_REACHABLE);\
__BUG_FLAGS(BUGFLAG_WARNING|(flags), ANNOTATE_REACHABLE(10001b));\
instrumentation_end(); \
} while (0)

Expand Down
5 changes: 2 additions & 3 deletions arch/x86/entry/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -308,10 +308,9 @@ SYM_CODE_END(xen_error_entry)
movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */
.endif

call \cfunc

/* For some configurations \cfunc ends up being a noreturn. */
ANNOTATE_REACHABLE
call \cfunc

jmp error_return
.endm
Expand Down Expand Up @@ -529,10 +528,10 @@ SYM_CODE_START(\asmsym)
movq %rsp, %rdi /* pt_regs pointer into first argument */
movq ORIG_RAX(%rsp), %rsi /* get error code into 2nd argument*/
movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */
call \cfunc

/* For some configurations \cfunc ends up being a noreturn. */
ANNOTATE_REACHABLE
call \cfunc

jmp paranoid_exit

Expand Down
2 changes: 1 addition & 1 deletion arch/x86/include/asm/bug.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ do { \
do { \
__auto_type __flags = BUGFLAG_WARNING|(flags); \
instrumentation_begin(); \
_BUG_FLAGS(ASM_UD2, __flags, ANNOTATE_REACHABLE); \
_BUG_FLAGS(ASM_UD2, __flags, ANNOTATE_REACHABLE(1b)); \
instrumentation_end(); \
} while (0)

Expand Down
4 changes: 2 additions & 2 deletions arch/x86/include/asm/irq_stack.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@
}

#define ASM_CALL_ARG0 \
"call %c[__func] \n" \
ANNOTATE_REACHABLE
"1: call %c[__func] \n" \
ANNOTATE_REACHABLE(1b)

#define ASM_CALL_ARG1 \
"movq %[arg1], %%rdi \n" \
Expand Down
4 changes: 2 additions & 2 deletions include/linux/objtool.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,11 @@
*/
#define ANNOTATE_UNRET_BEGIN ASM_ANNOTATE(ANNOTYPE_UNRET_BEGIN)
/*
* This should be used directly after an instruction that is considered
* This should be used to refer to an instruction that is considered
* terminating, like a noreturn CALL or UD2 when we know they are not -- eg
* WARN using UD2.
*/
#define ANNOTATE_REACHABLE ASM_ANNOTATE(ANNOTYPE_REACHABLE)
#define ANNOTATE_REACHABLE(label) __ASM_ANNOTATE(label, ANNOTYPE_REACHABLE)

#else
#define ANNOTATE_NOENDBR ANNOTATE type=ANNOTYPE_NOENDBR
Expand Down
23 changes: 0 additions & 23 deletions tools/objtool/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -614,19 +614,6 @@ static int init_pv_ops(struct objtool_file *file)
return 0;
}

static struct instruction *find_last_insn(struct objtool_file *file,
struct section *sec)
{
struct instruction *insn = NULL;
unsigned int offset;
unsigned int end = (sec->sh.sh_size > 10) ? sec->sh.sh_size - 10 : 0;

for (offset = sec->sh.sh_size - 1; offset >= end && !insn; offset--)
insn = find_insn(file, sec, offset);

return insn;
}

static int create_static_call_sections(struct objtool_file *file)
{
struct static_call_site *site;
Expand Down Expand Up @@ -2281,16 +2268,6 @@ static int read_annotate(struct objtool_file *file,
offset = reloc->sym->offset + reloc_addend(reloc);
insn = find_insn(file, reloc->sym->sec, offset);

/*
* Reachable annotations are 'funneh' and act on the previous instruction :/
*/
if (type == ANNOTYPE_REACHABLE) {
if (insn)
insn = prev_insn_same_sec(file, insn);
else if (offset == reloc->sym->sec->sh.sh_size)
insn = find_last_insn(file, reloc->sym->sec);
}

if (!insn) {
WARN("bad .discard.annotate_insn entry: %d of type %d", reloc_idx(reloc), type);
return -1;
Expand Down

0 comments on commit 87116ae

Please sign in to comment.