lkml.org 
[lkml]   [2022]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 64/89] objtool: Re-add UNWIND_HINT_{SAVE_RESTORE}
    Date
    From: Josh Poimboeuf <jpoimboe@kernel.org>

    commit 8faea26e611189e933ea2281975ff4dc7c1106b6 upstream.

    Commit

    c536ed2fffd5 ("objtool: Remove SAVE/RESTORE hints")

    removed the save/restore unwind hints because they were no longer
    needed. Now they're going to be needed again so re-add them.

    Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/include/asm/unwind_hints.h | 12 ++++++++--
    include/linux/objtool.h | 6 +++--
    tools/include/linux/objtool.h | 6 +++--
    tools/objtool/check.c | 40 ++++++++++++++++++++++++++++++++++
    tools/objtool/include/objtool/check.h | 1
    5 files changed, 59 insertions(+), 6 deletions(-)

    --- a/arch/x86/include/asm/unwind_hints.h
    +++ b/arch/x86/include/asm/unwind_hints.h
    @@ -8,11 +8,11 @@
    #ifdef __ASSEMBLY__

    .macro UNWIND_HINT_EMPTY
    - UNWIND_HINT sp_reg=ORC_REG_UNDEFINED type=UNWIND_HINT_TYPE_CALL end=1
    + UNWIND_HINT type=UNWIND_HINT_TYPE_CALL end=1
    .endm

    .macro UNWIND_HINT_ENTRY
    - UNWIND_HINT sp_reg=ORC_REG_UNDEFINED type=UNWIND_HINT_TYPE_ENTRY end=1
    + UNWIND_HINT type=UNWIND_HINT_TYPE_ENTRY end=1
    .endm

    .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0
    @@ -56,6 +56,14 @@
    UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
    .endm

    +.macro UNWIND_HINT_SAVE
    + UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
    +.endm
    +
    +.macro UNWIND_HINT_RESTORE
    + UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
    +.endm
    +
    #endif /* __ASSEMBLY__ */

    #endif /* _ASM_X86_UNWIND_HINTS_H */
    --- a/include/linux/objtool.h
    +++ b/include/linux/objtool.h
    @@ -40,6 +40,8 @@ struct unwind_hint {
    #define UNWIND_HINT_TYPE_REGS_PARTIAL 2
    #define UNWIND_HINT_TYPE_FUNC 3
    #define UNWIND_HINT_TYPE_ENTRY 4
    +#define UNWIND_HINT_TYPE_SAVE 5
    +#define UNWIND_HINT_TYPE_RESTORE 6

    #ifdef CONFIG_STACK_VALIDATION

    @@ -102,7 +104,7 @@ struct unwind_hint {
    * the debuginfo as necessary. It will also warn if it sees any
    * inconsistencies.
    */
    -.macro UNWIND_HINT sp_reg:req sp_offset=0 type:req end=0
    +.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0
    .Lunwind_hint_ip_\@:
    .pushsection .discard.unwind_hints
    /* struct unwind_hint */
    @@ -132,7 +134,7 @@ struct unwind_hint {
    #define STACK_FRAME_NON_STANDARD(func)
    #else
    #define ANNOTATE_INTRA_FUNCTION_CALL
    -.macro UNWIND_HINT sp_reg:req sp_offset=0 type:req end=0
    +.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0
    .endm
    .macro STACK_FRAME_NON_STANDARD func:req
    .endm
    --- a/tools/include/linux/objtool.h
    +++ b/tools/include/linux/objtool.h
    @@ -40,6 +40,8 @@ struct unwind_hint {
    #define UNWIND_HINT_TYPE_REGS_PARTIAL 2
    #define UNWIND_HINT_TYPE_FUNC 3
    #define UNWIND_HINT_TYPE_ENTRY 4
    +#define UNWIND_HINT_TYPE_SAVE 5
    +#define UNWIND_HINT_TYPE_RESTORE 6

    #ifdef CONFIG_STACK_VALIDATION

    @@ -102,7 +104,7 @@ struct unwind_hint {
    * the debuginfo as necessary. It will also warn if it sees any
    * inconsistencies.
    */
    -.macro UNWIND_HINT sp_reg:req sp_offset=0 type:req end=0
    +.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0
    .Lunwind_hint_ip_\@:
    .pushsection .discard.unwind_hints
    /* struct unwind_hint */
    @@ -132,7 +134,7 @@ struct unwind_hint {
    #define STACK_FRAME_NON_STANDARD(func)
    #else
    #define ANNOTATE_INTRA_FUNCTION_CALL
    -.macro UNWIND_HINT sp_reg:req sp_offset=0 type:req end=0
    +.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0
    .endm
    .macro STACK_FRAME_NON_STANDARD func:req
    .endm
    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -1847,6 +1847,17 @@ static int read_unwind_hints(struct objt

    insn->hint = true;

    + if (hint->type == UNWIND_HINT_TYPE_SAVE) {
    + insn->hint = false;
    + insn->save = true;
    + continue;
    + }
    +
    + if (hint->type == UNWIND_HINT_TYPE_RESTORE) {
    + insn->restore = true;
    + continue;
    + }
    +
    if (hint->type == UNWIND_HINT_TYPE_REGS_PARTIAL) {
    struct symbol *sym = find_symbol_by_offset(insn->sec, insn->offset);

    @@ -3025,6 +3036,35 @@ static int validate_branch(struct objtoo
    state.instr += insn->instr;

    if (insn->hint) {
    + if (insn->restore) {
    + struct instruction *save_insn, *i;
    +
    + i = insn;
    + save_insn = NULL;
    +
    + sym_for_each_insn_continue_reverse(file, func, i) {
    + if (i->save) {
    + save_insn = i;
    + break;
    + }
    + }
    +
    + if (!save_insn) {
    + WARN_FUNC("no corresponding CFI save for CFI restore",
    + sec, insn->offset);
    + return 1;
    + }
    +
    + if (!save_insn->visited) {
    + WARN_FUNC("objtool isn't smart enough to handle this CFI save/restore combo",
    + sec, insn->offset);
    + return 1;
    + }
    +
    + insn->cfi = save_insn->cfi;
    + nr_cfi_reused++;
    + }
    +
    state.cfi = *insn->cfi;
    } else {
    /* XXX track if we actually changed state.cfi */
    --- a/tools/objtool/include/objtool/check.h
    +++ b/tools/objtool/include/objtool/check.h
    @@ -47,6 +47,7 @@ struct instruction {
    unsigned long immediate;
    bool dead_end, ignore, ignore_alts;
    bool hint;
    + bool save, restore;
    bool retpoline_safe;
    bool entry;
    s8 instr;

    \
     
     \ /
      Last update: 2022-07-22 11:28    [W:4.131 / U:0.376 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site