lkml.org 
[lkml]   [2022]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/core] objtool: Read the NOENDBR annotation
    The following commit has been merged into the x86/core branch of tip:

    Commit-ID: 51727f8e4a1ae15770ac30f05a90536c4aa3b2d8
    Gitweb: https://git.kernel.org/tip/51727f8e4a1ae15770ac30f05a90536c4aa3b2d8
    Author: Peter Zijlstra <peterz@infradead.org>
    AuthorDate: Tue, 08 Mar 2022 16:30:52 +01:00
    Committer: Peter Zijlstra <peterz@infradead.org>
    CommitterDate: Tue, 08 Mar 2022 23:53:38 +01:00

    objtool: Read the NOENDBR annotation

    Read the new NOENDBR annotation. While there, attempt to not bloat
    struct instruction.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
    Link: https://lore.kernel.org/r/20220308154319.586815435@infradead.org
    ---
    tools/objtool/check.c | 27 ++++++++++++++++++++++++++-
    tools/objtool/include/objtool/check.h | 13 ++++++++++---
    2 files changed, 37 insertions(+), 3 deletions(-)

    diff --git a/tools/objtool/check.c b/tools/objtool/check.c
    index aee6246..3f28ca4 100644
    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -1865,6 +1865,29 @@ static int read_unwind_hints(struct objtool_file *file)
    return 0;
    }

    +static int read_noendbr_hints(struct objtool_file *file)
    +{
    + struct section *sec;
    + struct instruction *insn;
    + struct reloc *reloc;
    +
    + sec = find_section_by_name(file->elf, ".rela.discard.noendbr");
    + if (!sec)
    + return 0;
    +
    + list_for_each_entry(reloc, &sec->reloc_list, list) {
    + insn = find_insn(file, reloc->sym->sec, reloc->sym->offset + reloc->addend);
    + if (!insn) {
    + WARN("bad .discard.noendbr entry");
    + return -1;
    + }
    +
    + insn->noendbr = 1;
    + }
    +
    + return 0;
    +}
    +
    static int read_retpoline_hints(struct objtool_file *file)
    {
    struct section *sec;
    @@ -2098,6 +2121,10 @@ static int decode_sections(struct objtool_file *file)
    if (ret)
    return ret;

    + ret = read_noendbr_hints(file);
    + if (ret)
    + return ret;
    +
    /*
    * Must be before add_{jump_call}_destination.
    */
    diff --git a/tools/objtool/include/objtool/check.h b/tools/objtool/include/objtool/check.h
    index 6cfff07..f10d737 100644
    --- a/tools/objtool/include/objtool/check.h
    +++ b/tools/objtool/include/objtool/check.h
    @@ -45,11 +45,18 @@ struct instruction {
    unsigned int len;
    enum insn_type type;
    unsigned long immediate;
    - bool dead_end, ignore, ignore_alts;
    - bool hint;
    - bool retpoline_safe;
    +
    + u8 dead_end : 1,
    + ignore : 1,
    + ignore_alts : 1,
    + hint : 1,
    + retpoline_safe : 1,
    + noendbr : 1;
    + /* 2 bit hole */
    s8 instr;
    u8 visited;
    + /* u8 hole */
    +
    struct alt_group *alt_group;
    struct symbol *call_dest;
    struct instruction *jump_dest;
    \
     
     \ /
      Last update: 2022-09-17 16:16    [W:2.733 / U:1.840 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site