diff options
| -rw-r--r-- | tools/objtool/check.c | 13 | ||||
| -rw-r--r-- | tools/objtool/include/objtool/check.h | 12 |
2 files changed, 20 insertions, 5 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index a02f8db75827..93aaa4b5dce0 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -27,11 +27,6 @@ #include <linux/static_call_types.h> #include <linux/string.h> -struct alternative { - struct alternative *next; - struct instruction *insn; -}; - static unsigned long nr_cfi, nr_cfi_reused, nr_cfi_cache; static struct cfi_init_state initial_func_cfi; @@ -1924,6 +1919,7 @@ static int add_special_section_alts(struct objtool_file *file) struct list_head special_alts; struct instruction *orig_insn, *new_insn; struct special_alt *special_alt, *tmp; + enum alternative_type alt_type; struct alternative *alt; if (special_get_alts(file->elf, &special_alts)) @@ -1959,9 +1955,15 @@ static int add_special_section_alts(struct objtool_file *file) if (handle_group_alt(file, special_alt, orig_insn, &new_insn)) return -1; + alt_type = ALT_TYPE_INSTRUCTIONS; + } else if (special_alt->jump_or_nop) { if (handle_jump_alt(file, special_alt, orig_insn, &new_insn)) return -1; + + alt_type = ALT_TYPE_JUMP_TABLE; + } else { + alt_type = ALT_TYPE_EX_TABLE; } alt = calloc(1, sizeof(*alt)); @@ -1972,6 +1974,7 @@ static int add_special_section_alts(struct objtool_file *file) alt->insn = new_insn; alt->next = orig_insn->alts; + alt->type = alt_type; orig_insn->alts = alt; list_del(&special_alt->list); diff --git a/tools/objtool/include/objtool/check.h b/tools/objtool/include/objtool/check.h index fde958683485..cbf4af58e29b 100644 --- a/tools/objtool/include/objtool/check.h +++ b/tools/objtool/include/objtool/check.h @@ -38,6 +38,18 @@ struct alt_group { bool ignore; }; +enum alternative_type { + ALT_TYPE_INSTRUCTIONS, + ALT_TYPE_JUMP_TABLE, + ALT_TYPE_EX_TABLE, +}; + +struct alternative { + struct alternative *next; + struct instruction *insn; + enum alternative_type type; +}; + #define INSN_CHUNK_BITS 8 #define INSN_CHUNK_SIZE (1 << INSN_CHUNK_BITS) #define INSN_CHUNK_MAX (INSN_CHUNK_SIZE - 1) |
