Skip to content

Commit 4ae68b2

Browse files
Peter Zijlstrabp3tk0v
authored andcommitted
objtool/x86: Fix SRSO mess
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: fb3bd91 ("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
1 parent af023ef commit 4ae68b2

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

tools/objtool/arch/x86/decode.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -824,8 +824,11 @@ bool arch_is_retpoline(struct symbol *sym)
824824

825825
bool arch_is_rethunk(struct symbol *sym)
826826
{
827-
return !strcmp(sym->name, "__x86_return_thunk") ||
828-
!strcmp(sym->name, "srso_untrain_ret") ||
829-
!strcmp(sym->name, "srso_safe_ret") ||
830-
!strcmp(sym->name, "__ret");
827+
return !strcmp(sym->name, "__x86_return_thunk");
828+
}
829+
830+
bool arch_is_embedded_insn(struct symbol *sym)
831+
{
832+
return !strcmp(sym->name, "__ret") ||
833+
!strcmp(sym->name, "srso_safe_ret");
831834
}

tools/objtool/check.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ static int decode_instructions(struct objtool_file *file)
455455
return -1;
456456
}
457457

458-
if (func->return_thunk || func->alias != func)
458+
if (func->embedded_insn || func->alias != func)
459459
continue;
460460

461461
if (!find_insn(file, sec, func->offset)) {
@@ -1288,16 +1288,33 @@ static int add_ignore_alternatives(struct objtool_file *file)
12881288
return 0;
12891289
}
12901290

1291+
/*
1292+
* Symbols that replace INSN_CALL_DYNAMIC, every (tail) call to such a symbol
1293+
* will be added to the .retpoline_sites section.
1294+
*/
12911295
__weak bool arch_is_retpoline(struct symbol *sym)
12921296
{
12931297
return false;
12941298
}
12951299

1300+
/*
1301+
* Symbols that replace INSN_RETURN, every (tail) call to such a symbol
1302+
* will be added to the .return_sites section.
1303+
*/
12961304
__weak bool arch_is_rethunk(struct symbol *sym)
12971305
{
12981306
return false;
12991307
}
13001308

1309+
/*
1310+
* Symbols that are embedded inside other instructions, because sometimes crazy
1311+
* code exists. These are mostly ignored for validation purposes.
1312+
*/
1313+
__weak bool arch_is_embedded_insn(struct symbol *sym)
1314+
{
1315+
return false;
1316+
}
1317+
13011318
static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn)
13021319
{
13031320
struct reloc *reloc;
@@ -1583,7 +1600,7 @@ static int add_jump_destinations(struct objtool_file *file)
15831600
* middle of another instruction. Objtool only
15841601
* knows about the outer instruction.
15851602
*/
1586-
if (sym && sym->return_thunk) {
1603+
if (sym && sym->embedded_insn) {
15871604
add_return_call(file, insn, false);
15881605
continue;
15891606
}
@@ -2502,6 +2519,9 @@ static int classify_symbols(struct objtool_file *file)
25022519
if (arch_is_rethunk(func))
25032520
func->return_thunk = true;
25042521

2522+
if (arch_is_embedded_insn(func))
2523+
func->embedded_insn = true;
2524+
25052525
if (arch_ftrace_match(func->name))
25062526
func->fentry = true;
25072527

tools/objtool/include/objtool/arch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ int arch_decode_hint_reg(u8 sp_reg, int *base);
9090

9191
bool arch_is_retpoline(struct symbol *sym);
9292
bool arch_is_rethunk(struct symbol *sym);
93+
bool arch_is_embedded_insn(struct symbol *sym);
9394

9495
int arch_rewrite_retpolines(struct objtool_file *file);
9596

tools/objtool/include/objtool/elf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct symbol {
6666
u8 fentry : 1;
6767
u8 profiling_func : 1;
6868
u8 warned : 1;
69+
u8 embedded_insn : 1;
6970
struct list_head pv_target;
7071
struct reloc *relocs;
7172
};

0 commit comments

Comments
 (0)