objtool/x86: Fix SRSO mess
commit4ae68b26c3
upstream. Objtool --rethunk does two things: - it collects all (tail) call's of __x86_return_thunk and places them into .return_sites. These are typically compiler generated, but RET also emits this same. - it fudges the validation of the __x86_return_thunk symbol; because this symbol is inside another instruction, it can't actually find the instruction pointed to by the symbol offset and gets upset. Because these two things pertained to the same symbol, there was no pressing need to separate these two separate things. However, alas, along comes SRSO and more crazy things to deal with appeared. The SRSO patch itself added the following symbol names to identify as rethunk: 'srso_untrain_ret', 'srso_safe_ret' and '__ret' Where '__ret' is the old retbleed return thunk, 'srso_safe_ret' is a new similarly embedded return thunk, and 'srso_untrain_ret' is completely unrelated to anything the above does (and was only included because of that INT3 vs UD2 issue fixed previous). Clear things up by adding a second category for the embedded instruction thing. Fixes:fb3bd914b3
("x86/srso: Add a Speculative RAS Overflow mitigation") Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Link: https://lore.kernel.org/r/20230814121148.704502245@infradead.org Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
5ddfe5cc87
Коммит
5de0a325c4
|
@ -725,8 +725,11 @@ bool arch_is_retpoline(struct symbol *sym)
|
|||
|
||||
bool arch_is_rethunk(struct symbol *sym)
|
||||
{
|
||||
return !strcmp(sym->name, "__x86_return_thunk") ||
|
||||
!strcmp(sym->name, "srso_untrain_ret") ||
|
||||
!strcmp(sym->name, "srso_safe_ret") ||
|
||||
!strcmp(sym->name, "retbleed_return_thunk");
|
||||
return !strcmp(sym->name, "__x86_return_thunk");
|
||||
}
|
||||
|
||||
bool arch_is_embedded_insn(struct symbol *sym)
|
||||
{
|
||||
return !strcmp(sym->name, "retbleed_return_thunk") ||
|
||||
!strcmp(sym->name, "srso_safe_ret");
|
||||
}
|
||||
|
|
|
@ -990,16 +990,33 @@ static int add_ignore_alternatives(struct objtool_file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Symbols that replace INSN_CALL_DYNAMIC, every (tail) call to such a symbol
|
||||
* will be added to the .retpoline_sites section.
|
||||
*/
|
||||
__weak bool arch_is_retpoline(struct symbol *sym)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Symbols that replace INSN_RETURN, every (tail) call to such a symbol
|
||||
* will be added to the .return_sites section.
|
||||
*/
|
||||
__weak bool arch_is_rethunk(struct symbol *sym)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Symbols that are embedded inside other instructions, because sometimes crazy
|
||||
* code exists. These are mostly ignored for validation purposes.
|
||||
*/
|
||||
__weak bool arch_is_embedded_insn(struct symbol *sym)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#define NEGATIVE_RELOC ((void *)-1L)
|
||||
|
||||
static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn)
|
||||
|
@ -1235,7 +1252,7 @@ static int add_jump_destinations(struct objtool_file *file)
|
|||
* middle of another instruction. Objtool only
|
||||
* knows about the outer instruction.
|
||||
*/
|
||||
if (sym && sym->return_thunk) {
|
||||
if (sym && sym->embedded_insn) {
|
||||
add_return_call(file, insn, false);
|
||||
continue;
|
||||
}
|
||||
|
@ -2066,6 +2083,9 @@ static int classify_symbols(struct objtool_file *file)
|
|||
if (arch_is_rethunk(func))
|
||||
func->return_thunk = true;
|
||||
|
||||
if (arch_is_embedded_insn(func))
|
||||
func->embedded_insn = true;
|
||||
|
||||
if (!strcmp(func->name, "__fentry__"))
|
||||
func->fentry = true;
|
||||
|
||||
|
|
|
@ -89,6 +89,7 @@ int arch_decode_hint_reg(u8 sp_reg, int *base);
|
|||
|
||||
bool arch_is_retpoline(struct symbol *sym);
|
||||
bool arch_is_rethunk(struct symbol *sym);
|
||||
bool arch_is_embedded_insn(struct symbol *sym);
|
||||
|
||||
int arch_rewrite_retpolines(struct objtool_file *file);
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@ struct symbol {
|
|||
u8 return_thunk : 1;
|
||||
u8 fentry : 1;
|
||||
u8 kcov : 1;
|
||||
u8 embedded_insn : 1;
|
||||
};
|
||||
|
||||
struct reloc {
|
||||
|
|
Загрузка…
Ссылка в новой задаче