Skip to content

Commit b1b19cf

Browse files
jpoimboeIngo Molnar
authored andcommitted
x86/bugs: Fix RSB clearing in indirect_branch_prediction_barrier()
IBPB is expected to clear the RSB. However, if X86_BUG_IBPB_NO_RET is set, that doesn't happen. Make indirect_branch_prediction_barrier() take that into account by calling write_ibpb() which clears RSB on X86_BUG_IBPB_NO_RET: /* Make sure IBPB clears return stack preductions too. */ FILL_RETURN_BUFFER %rax, RSB_CLEAR_LOOPS, X86_BUG_IBPB_NO_RET Note that, as of the previous patch, write_ibpb() also reads 'x86_pred_cmd' in order to use SBPB when applicable: movl _ASM_RIP(x86_pred_cmd), %eax Therefore that existing behavior in indirect_branch_prediction_barrier() is not lost. Fixes: 50e4b3b ("x86/entry: Have entry_ibpb() invalidate return predictions") Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Nikolay Borisov <nik.borisov@suse.com> Link: https://lore.kernel.org/r/bba68888c511743d4cd65564d1fc41438907523f.1744148254.git.jpoimboe@kernel.org
1 parent fc9fd3f commit b1b19cf

File tree

2 files changed

+3
-4
lines changed

2 files changed

+3
-4
lines changed

arch/x86/include/asm/nospec-branch.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,11 +514,11 @@ void alternative_msr_write(unsigned int msr, u64 val, unsigned int feature)
514514
: "memory");
515515
}
516516

517-
extern u64 x86_pred_cmd;
518-
519517
static inline void indirect_branch_prediction_barrier(void)
520518
{
521-
alternative_msr_write(MSR_IA32_PRED_CMD, x86_pred_cmd, X86_FEATURE_IBPB);
519+
asm_inline volatile(ALTERNATIVE("", "call write_ibpb", X86_FEATURE_IBPB)
520+
: ASM_CALL_CONSTRAINT
521+
:: "rax", "rcx", "rdx", "memory");
522522
}
523523

524524
/* The Intel SPEC CTRL MSR base value cache */

arch/x86/kernel/cpu/bugs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ DEFINE_PER_CPU(u64, x86_spec_ctrl_current);
5959
EXPORT_PER_CPU_SYMBOL_GPL(x86_spec_ctrl_current);
6060

6161
u64 x86_pred_cmd __ro_after_init = PRED_CMD_IBPB;
62-
EXPORT_SYMBOL_GPL(x86_pred_cmd);
6362

6463
static u64 __ro_after_init x86_arch_cap_msr;
6564

0 commit comments

Comments
 (0)