Patch "objtool: Allow alternatives to be ignored" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
objtool: Allow alternatives to be ignored
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
objtool-allow-alternatives-to-be-ignored.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
258c76059cece01bebae098e81bacb1af2edad17Mon Sep 17 00:00:00 2001
From: Josh Poimboeuf <[email protected]>
Date: Thu, 11 Jan 2018 21:46:24 +0000
Subject: objtool: Allow alternatives to be ignored
From: Josh Poimboeuf <[email protected]>
commit 258c76059cece01bebae098e81bacb1af2edad17 upstream.
Getting objtool to understand retpolines is going to be a bit of a challenge. For now, take advantage of the fact that retpolines are patched in with alternatives. Just read the original (sane) non-alternative instruction, and ignore the patched-in retpoline.
This allows objtool to understand the control flow *around* the retpoline, even if it can't yet follow what's inside. This means the ORC unwinder will fail to unwind from inside a retpoline, but will work fine otherwise.
--- tools/objtool/check.c | 62 +++++++++++++++++++++++++++++++++++++++++++++----- tools/objtool/check.h | 2 - 2 files changed, 57 insertions(+), 7 deletions(-)
tools/objtool/check.c +56 -6
@@ -428,6 +428,40 @@ static void add_ignores(struct objtool_f }/* +* FIXME: For now, just ignore any alternatives which add retpolines. This is +* a temporary hack, as it doesn't allow ORC to unwind from inside a retpoline. +* But it at least allows objtool to understand the control flow *around* the +* retpoline. +*/ +static int add_nospec_ignores (struct objtool_file *file) +{ +struct section *sec; +struct rela *rela; +struct instruction *insn; + + sec =find_section_by_name (file->elf,".rela.discard.nospec" ); +if (!sec) +return 0 ; + +list_for_each_entry (rela, &sec->rela_list, list) { +if (rela->sym->type !=STT_SECTION ) { +WARN ("unexpected relocation symbol type in %s" , sec->name); +return -1 ; + } + + insn =find_insn (file, rela->sym->sec, rela->addend); +if (!insn) { +WARN ("bad .discard.nospec entry" ); +return -1 ; + } + + insn->ignore_alts = true; + } + +return 0 ; +} + +/* * Find the destination instructions for all jumps. */ static int add_jump_destinations (struct objtool_file *file)
@@ -509,11 +543,18 @@ static int add_call_destinations(struct dest_off = insn->offset + insn->len + insn->immediate; insn->call_dest =find_symbol_by_offset (insn->sec, dest_off); +/* +* FIXME: Thanks to retpolines, it's now considered +* normal for a function to call within itself. So +* disable this warning for now. +*/ +#if 0 if (!insn->call_dest) {WARN_FUNC ("can't find call dest symbol at offset 0x%lx" , insn->sec, insn->offset, dest_off);return -1 ; } +#endif }else if (rela->sym->type ==STT_SECTION ) { insn->call_dest =find_symbol_by_offset (rela->sym->sec, rela->addend+4 );
@@ -678,12 +719,6 @@ static int add_special_section_alts(strureturn ret;list_for_each_entry_safe (special_alt, tmp, &special_alts, list) { - alt =malloc (sizeof (*alt)); -if (!alt) { -WARN ("malloc failed" ); - ret =-1 ; - goto out; - } orig_insn =find_insn (file, special_alt->orig_sec, special_alt->orig_off);
@@ -694,6 +729,10 @@ static int add_special_section_alts(stru goto out; } +/* Ignore retpoline alternatives. */ +if (orig_insn->ignore_alts) +continue ; + new_insn =NULL ;if (!special_alt->group || special_alt->new_len) { new_insn = find_insn(file, special_alt->new_sec,
@@ -719,6 +758,13 @@ static int add_special_section_alts(stru goto out; } + alt =malloc (sizeof (*alt)); +if (!alt) { +WARN ("malloc failed" ); + ret =-1 ; + goto out; + } + alt->insn = new_insn;list_add_tail (&alt->list, &orig_insn->alts);
@@ -1035,6 +1081,10 @@ static int decode_sections(struct objtooadd_ignores (file); + ret =add_nospec_ignores (file); +if (ret) +return ret; + ret =add_jump_destinations (file);if (ret)return ret;
tools/objtool/check.h +1 -1
@@ -44,7 +44,7 @@ struct instruction {unsigned int len;unsigned char type;unsigned long immediate; -bool alt_group, visited, dead_end, ignore, hint, save, restore; +bool alt_group, visited, dead_end, ignore, hint, save, restore, ignore_alts;struct symbol *call_dest;struct instruction *jump_dest;struct list_head alts;
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/x86-spectre-add-boot-time-option-to-select-spectre-v2-mitigation.patch queue-4.14/objtool-detect-jumps-to-retpoline-thunks.patch queue-4.14/objtool-allow-alternatives-to-be-ignored.patch queue-4.14/x86-retpoline-add-initial-retpoline-support.patch