From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755364AbeARO6J (ORCPT ); Thu, 18 Jan 2018 09:58:09 -0500 Received: from merlin.infradead.org ([205.233.59.134]:46690 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755071AbeARO6C (ORCPT ); Thu, 18 Jan 2018 09:58:02 -0500 Message-Id: <20180118140151.998747015@infradead.org> User-Agent: quilt/0.63-1 Date: Thu, 18 Jan 2018 14:48:09 +0100 From: Peter Zijlstra From: Peter Zijlstra To: David Woodhouse , Thomas Gleixner , Josh Poimboeuf Cc: linux-kernel@vger.kernel.org, Dave Hansen , Ashok Raj , Tim Chen , Andy Lutomirski , Linus Torvalds , Greg KH , Andrea Arcangeli , Andi Kleen , Arjan Van De Ven , Dan Williams , Paolo Bonzini , Jun Nakajima , Asit Mallick , Jason Baron , Peter Zijlstra Subject: [PATCH 09/35] objtool: Introduce special_type References: <20180118134800.711245485@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline; filename=peterz-objtool-special-type.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use an enum for the special_alt entries instead of a collection of booleans. Signed-off-by: Peter Zijlstra (Intel) --- tools/objtool/check.c | 14 +++++++++++--- tools/objtool/special.c | 14 +++++++------- tools/objtool/special.h | 10 ++++++++-- 3 files changed, 26 insertions(+), 12 deletions(-) --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -773,7 +773,7 @@ static int add_special_section_alts(stru continue; new_insn = NULL; - if (!special_alt->group || special_alt->new_len) { + if (special_alt->type != alternative || special_alt->new_len) { new_insn = find_insn(file, special_alt->new_sec, special_alt->new_off); if (!new_insn) { @@ -785,16 +785,24 @@ static int add_special_section_alts(stru } } - if (special_alt->group) { + switch (special_alt->type) { + case alternative: ret = handle_group_alt(file, special_alt, orig_insn, &new_insn); if (ret) goto out; - } else if (special_alt->jump_or_nop) { + break; + + case jump_label: ret = handle_jump_alt(file, special_alt, orig_insn, &new_insn); if (ret) goto out; + + break; + + default: + break; } alt = malloc(sizeof(*alt)); --- a/tools/objtool/special.c +++ b/tools/objtool/special.c @@ -49,7 +49,7 @@ struct special_entry { const char *sec; - bool group, jump_or_nop; + enum special_type type; unsigned char size, orig, new; unsigned char orig_len, new_len; /* group only */ }; @@ -57,7 +57,7 @@ struct special_entry { struct special_entry entries[] = { { .sec = ".altinstructions", - .group = true, + .type = alternative, .size = ALT_ENTRY_SIZE, .orig = ALT_ORIG_OFFSET, .orig_len = ALT_ORIG_LEN_OFFSET, @@ -66,13 +66,14 @@ struct special_entry entries[] = { }, { .sec = "__jump_table", - .jump_or_nop = true, + .type = jump_label, .size = JUMP_ENTRY_SIZE, .orig = JUMP_ORIG_OFFSET, .new = JUMP_NEW_OFFSET, }, { .sec = "__ex_table", + .type = exception, .size = EX_ENTRY_SIZE, .orig = EX_ORIG_OFFSET, .new = EX_NEW_OFFSET, @@ -91,10 +92,9 @@ static int get_alt_entry(struct elf *elf offset = idx * entry->size; data = sec->data->d_buf + offset; - alt->group = entry->group; - alt->jump_or_nop = entry->jump_or_nop; + alt->type = entry->type; - if (alt->group) { + if (alt->type == alternative) { unsigned short feature; unsigned char type; @@ -130,7 +130,7 @@ static int get_alt_entry(struct elf *elf alt->orig_sec = orig_rela->sym->sec; alt->orig_off = orig_rela->addend; - if (!entry->group || alt->new_len) { + if (entry->type != alternative || alt->new_len) { new_rela = find_rela_by_dest(sec, offset + entry->new); if (!new_rela) { WARN_FUNC("can't find new rela", --- a/tools/objtool/special.h +++ b/tools/objtool/special.h @@ -21,12 +21,18 @@ #include #include "elf.h" +enum special_type { + alternative, + jump_label, + exception, +}; + struct special_alt { struct list_head list; - bool group; + enum special_type type; + bool skip_orig; - bool jump_or_nop; bool static_cpu_has; struct section *orig_sec;