lkml.org 
[lkml]   [2022]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 004/148] objtool: Add alt_group struct
    Date
    From: Josh Poimboeuf <jpoimboe@redhat.com>

    commit b23cc71c62747f2e4c3e56138872cf47e1294f8a upstream.

    Create a new struct associated with each group of alternatives
    instructions. This will help with the removal of fake jumps, and more
    importantly with adding support for stack layout changes in
    alternatives.

    Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    tools/objtool/check.c | 29 +++++++++++++++++++++++------
    tools/objtool/check.h | 13 ++++++++++++-
    2 files changed, 35 insertions(+), 7 deletions(-)

    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -1012,20 +1012,28 @@ static int handle_group_alt(struct objto
    struct instruction *orig_insn,
    struct instruction **new_insn)
    {
    - static unsigned int alt_group_next_index = 1;
    struct instruction *last_orig_insn, *last_new_insn, *insn, *fake_jump = NULL;
    - unsigned int alt_group = alt_group_next_index++;
    + struct alt_group *orig_alt_group, *new_alt_group;
    unsigned long dest_off;

    +
    + orig_alt_group = malloc(sizeof(*orig_alt_group));
    + if (!orig_alt_group) {
    + WARN("malloc failed");
    + return -1;
    + }
    last_orig_insn = NULL;
    insn = orig_insn;
    sec_for_each_insn_from(file, insn) {
    if (insn->offset >= special_alt->orig_off + special_alt->orig_len)
    break;

    - insn->alt_group = alt_group;
    + insn->alt_group = orig_alt_group;
    last_orig_insn = insn;
    }
    + orig_alt_group->orig_group = NULL;
    + orig_alt_group->first_insn = orig_insn;
    + orig_alt_group->last_insn = last_orig_insn;

    if (next_insn_same_sec(file, last_orig_insn)) {
    fake_jump = malloc(sizeof(*fake_jump));
    @@ -1056,8 +1064,13 @@ static int handle_group_alt(struct objto
    return 0;
    }

    + new_alt_group = malloc(sizeof(*new_alt_group));
    + if (!new_alt_group) {
    + WARN("malloc failed");
    + return -1;
    + }
    +
    last_new_insn = NULL;
    - alt_group = alt_group_next_index++;
    insn = *new_insn;
    sec_for_each_insn_from(file, insn) {
    struct reloc *alt_reloc;
    @@ -1069,7 +1082,7 @@ static int handle_group_alt(struct objto

    insn->ignore = orig_insn->ignore_alts;
    insn->func = orig_insn->func;
    - insn->alt_group = alt_group;
    + insn->alt_group = new_alt_group;

    /*
    * Since alternative replacement code is copy/pasted by the
    @@ -1118,6 +1131,10 @@ static int handle_group_alt(struct objto
    return -1;
    }

    + new_alt_group->orig_group = orig_alt_group;
    + new_alt_group->first_insn = *new_insn;
    + new_alt_group->last_insn = last_new_insn;
    +
    if (fake_jump)
    list_add(&fake_jump->list, &last_new_insn->list);

    @@ -2440,7 +2457,7 @@ static int validate_return(struct symbol
    static void fill_alternative_cfi(struct objtool_file *file, struct instruction *insn)
    {
    struct instruction *first_insn = insn;
    - int alt_group = insn->alt_group;
    + struct alt_group *alt_group = insn->alt_group;

    sec_for_each_insn_continue(file, insn) {
    if (insn->alt_group != alt_group)
    --- a/tools/objtool/check.h
    +++ b/tools/objtool/check.h
    @@ -19,6 +19,17 @@ struct insn_state {
    s8 instr;
    };

    +struct alt_group {
    + /*
    + * Pointer from a replacement group to the original group. NULL if it
    + * *is* the original group.
    + */
    + struct alt_group *orig_group;
    +
    + /* First and last instructions in the group */
    + struct instruction *first_insn, *last_insn;
    +};
    +
    struct instruction {
    struct list_head list;
    struct hlist_node hash;
    @@ -34,7 +45,7 @@ struct instruction {
    s8 instr;
    u8 visited;
    u8 ret_offset;
    - int alt_group;
    + struct alt_group *alt_group;
    struct symbol *call_dest;
    struct instruction *jump_dest;
    struct instruction *first_jump_src;

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