2020-03-27 15:30:37

by Julien Thierry

[permalink] [raw]
Subject: [PATCH v2 07/10] objtool: check: Allow save/restore hint in non standard function symbols

The kernel code base provides CODE_SYM_START/END to declare assembly
code sequences that don't follow function standard calling conventions.

As non-C/non-standard code, these sequences can very much benefit from
unwind hints. However, when a restore unwind_hint is used in a
non-function code sequence, objtool will crash when looking for the
corresponding save hint.

Record the code symbol an instruction belongs to and look for save hints
belonging to the same code symbol as the restore hint.

Signed-off-by: Julien Thierry <[email protected]>
---
tools/objtool/check.c | 27 +++++++++++++++++++--------
tools/objtool/check.h | 1 +
2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 65809c74f6a8..fb1ddde66b48 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -236,7 +236,7 @@ static void clear_insn_state(struct insn_state *state)
static int decode_instructions(struct objtool_file *file)
{
struct section *sec;
- struct symbol *func;
+ struct symbol *sym;
unsigned long offset;
struct instruction *insn;
unsigned long nr_insns = 0;
@@ -278,18 +278,22 @@ static int decode_instructions(struct objtool_file *file)
nr_insns++;
}

- list_for_each_entry(func, &sec->symbol_list, list) {
- if (func->type != STT_FUNC || func->alias != func)
+ list_for_each_entry(sym, &sec->symbol_list, list) {
+ if ((sym->type != STT_FUNC && sym->type != STT_NOTYPE) ||
+ sym->alias != sym)
continue;

- if (!find_insn(file, sec, func->offset)) {
+ if (!find_insn(file, sec, sym->offset)) {
WARN("%s(): can't find starting instruction",
- func->name);
+ sym->name);
return -1;
}

- sym_for_each_insn(file, func, insn)
- insn->func = func;
+ sym_for_each_insn(file, sym, insn) {
+ insn->code_sym = sym;
+ if (sym->type == STT_FUNC)
+ insn->func = sym;
+ }
}
}

@@ -758,6 +762,7 @@ static int handle_group_alt(struct objtool_file *file,
fake_jump->type = INSN_JUMP_UNCONDITIONAL;
fake_jump->jump_dest = list_next_entry(last_orig_insn, list);
fake_jump->func = orig_insn->func;
+ fake_jump->code_sym = orig_insn->code_sym;
}

if (!special_alt->new_len) {
@@ -2065,9 +2070,15 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
if (insn->restore) {
struct instruction *save_insn, *i;

+ if (!insn->code_sym) {
+ WARN_FUNC("restore instruction doesn't belong to any symbol",
+ insn->sec, insn->offset);
+ return 1;
+ }
+
i = insn;
save_insn = NULL;
- sym_for_each_insn_continue_reverse(file, func, i) {
+ sym_for_each_insn_continue_reverse(file, insn->code_sym, i) {
if (i->save) {
save_insn = i;
break;
diff --git a/tools/objtool/check.h b/tools/objtool/check.h
index f0ce8ffe7135..d1b55961474c 100644
--- a/tools/objtool/check.h
+++ b/tools/objtool/check.h
@@ -42,6 +42,7 @@ struct instruction {
struct rela *jump_table;
struct list_head alts;
struct symbol *func;
+ struct symbol *code_sym;
struct stack_op stack_op;
struct insn_state state;
struct orc_entry orc;
--
2.21.1


2020-04-01 13:55:41

by Miroslav Benes

[permalink] [raw]
Subject: Re: [PATCH v2 07/10] objtool: check: Allow save/restore hint in non standard function symbols

On Fri, 27 Mar 2020, Julien Thierry wrote:

> The kernel code base provides CODE_SYM_START/END to declare assembly
> code sequences that don't follow function standard calling conventions.
>
> As non-C/non-standard code, these sequences can very much benefit from
> unwind hints. However, when a restore unwind_hint is used in a
> non-function code sequence, objtool will crash when looking for the
> corresponding save hint.
>
> Record the code symbol an instruction belongs to and look for save hints
> belonging to the same code symbol as the restore hint.
>
> Signed-off-by: Julien Thierry <[email protected]>

Looks ok, but save/restore hints are about to go away. See
https://lore.kernel.org/lkml/[email protected]/

Miroslav

2020-04-01 14:07:46

by Julien Thierry

[permalink] [raw]
Subject: Re: [PATCH v2 07/10] objtool: check: Allow save/restore hint in non standard function symbols



On 4/1/20 2:54 PM, Miroslav Benes wrote:
> On Fri, 27 Mar 2020, Julien Thierry wrote:
>
>> The kernel code base provides CODE_SYM_START/END to declare assembly
>> code sequences that don't follow function standard calling conventions.
>>
>> As non-C/non-standard code, these sequences can very much benefit from
>> unwind hints. However, when a restore unwind_hint is used in a
>> non-function code sequence, objtool will crash when looking for the
>> corresponding save hint.
>>
>> Record the code symbol an instruction belongs to and look for save hints
>> belonging to the same code symbol as the restore hint.
>>
>> Signed-off-by: Julien Thierry <[email protected]>
>
> Looks ok, but save/restore hints are about to go away. See
> https://lore.kernel.org/lkml/[email protected]/
>

Ah, just as I started bringing unwind hints to the arm64 side...

I'll have to scratch my head a bit more over this then. Thanks for
bringing it to my attention.

Thanks,

--
Julien Thierry