mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/spec-ctrl: Cease using thunk=lfence on AMD
AMD have updated their Spectre v2 guidance, and lfence/jmp is no longer considered safe. AMD are recommending using retpoline everywhere. Retpoline is incompatible with CET. All CET-capable hardware has efficient IBRS (specifically, not something retrofitted in microcode), so use IBRS (and STIBP for consistency sake). This is a logical change on AMD, but not on Intel as the default calculations would end up with these settings anyway. Leave behind a message if IBRS is found to be missing. Also update the default heuristics to never select THUNK_LFENCE. This causes AMD CPUs to change their default to retpoline. Also update the printed message to include the AMD MSR_SPEC_CTRL settings, and STIBP now that we set it for consistency sake. This is part of XSA-398 / CVE-2021-26401. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
c0a56ea0fd
commit
8d03080d2a
2 files changed
+29
-17
No files matched your search
@@ -2297,9 +2297,9 @@ to use.
|
||||
|
||||
If Xen was compiled with INDIRECT_THUNK support, `bti-thunk=` can be used to
|
||||
select which of the thunks gets patched into the `__x86_indirect_thunk_%reg`
|
||||
locations. The default thunk is `retpoline` (generally preferred for Intel
|
||||
hardware), with the alternatives being `jmp` (a `jmp *%reg` gadget, minimal
|
||||
overhead), and `lfence` (an `lfence; jmp *%reg` gadget, preferred for AMD).
|
||||
locations. The default thunk is `retpoline` (generally preferred), with the
|
||||
alternatives being `jmp` (a `jmp *%reg` gadget, minimal overhead), and
|
||||
`lfence` (an `lfence; jmp *%reg` gadget).
|
||||
|
||||
On hardware supporting IBRS (Indirect Branch Restricted Speculation), the
|
||||
`ibrs=` option can be used to force or prevent Xen using the feature itself.
|
||||
|
||||
+26
-14
@@ -367,14 +367,19 @@ static void __init print_details(enum ind_thunk thunk, uint64_t caps)
|
||||
"\n");
|
||||
|
||||
/* Settings for Xen's protection, irrespective of guests. */
|
||||
printk(" Xen settings: BTI-Thunk %s, SPEC_CTRL: %s%s%s, Other:%s%s%s%s%s\n",
|
||||
printk(" Xen settings: BTI-Thunk %s, SPEC_CTRL: %s%s%s%s, Other:%s%s%s%s%s\n",
|
||||
thunk == THUNK_NONE ? "N/A" :
|
||||
thunk == THUNK_RETPOLINE ? "RETPOLINE" :
|
||||
thunk == THUNK_LFENCE ? "LFENCE" :
|
||||
thunk == THUNK_JMP ? "JMP" : "?",
|
||||
!boot_cpu_has(X86_FEATURE_IBRSB) ? "No" :
|
||||
(!boot_cpu_has(X86_FEATURE_IBRSB) &&
|
||||
!boot_cpu_has(X86_FEATURE_IBRS)) ? "No" :
|
||||
(default_xen_spec_ctrl & SPEC_CTRL_IBRS) ? "IBRS+" : "IBRS-",
|
||||
!boot_cpu_has(X86_FEATURE_SSBD) ? "" :
|
||||
(!boot_cpu_has(X86_FEATURE_STIBP) &&
|
||||
!boot_cpu_has(X86_FEATURE_AMD_STIBP)) ? "" :
|
||||
(default_xen_spec_ctrl & SPEC_CTRL_STIBP) ? " STIBP+" : " STIBP-",
|
||||
(!boot_cpu_has(X86_FEATURE_SSBD) &&
|
||||
!boot_cpu_has(X86_FEATURE_AMD_SSBD)) ? "" :
|
||||
(default_xen_spec_ctrl & SPEC_CTRL_SSBD) ? " SSBD+" : " SSBD-",
|
||||
!(caps & ARCH_CAPS_TSX_CTRL) ? "" :
|
||||
(opt_tsx & 1) ? " TSX+" : " TSX-",
|
||||
@@ -947,10 +952,23 @@ void __init init_speculation_mitigations(void)
|
||||
* First, disable the use of retpolines if Xen is using CET. Retpolines
|
||||
* are a ROP gadget so incompatbile with Shadow Stacks, while IBT depends
|
||||
* on executing indirect branches for the safety properties to apply.
|
||||
*
|
||||
* In the absence of retpolines, IBRS needs to be used for speculative
|
||||
* safety. All CET-capable hardware has efficient IBRS.
|
||||
*/
|
||||
if ( (read_cr4() & X86_CR4_CET) &&
|
||||
(opt_thunk == THUNK_DEFAULT || opt_thunk == THUNK_RETPOLINE) )
|
||||
thunk = THUNK_JMP;
|
||||
if ( read_cr4() & X86_CR4_CET )
|
||||
{
|
||||
if ( !has_spec_ctrl )
|
||||
printk(XENLOG_WARNING "?!? CET active, but no MSR_SPEC_CTRL?\n");
|
||||
else if ( opt_ibrs == -1 )
|
||||
{
|
||||
opt_ibrs = ibrs = true;
|
||||
default_xen_spec_ctrl |= SPEC_CTRL_IBRS | SPEC_CTRL_STIBP;
|
||||
}
|
||||
|
||||
if ( opt_thunk == THUNK_DEFAULT || opt_thunk == THUNK_RETPOLINE )
|
||||
thunk = THUNK_JMP;
|
||||
}
|
||||
|
||||
/*
|
||||
* Has the user specified any custom BTI mitigations? If so, follow their
|
||||
@@ -970,16 +988,10 @@ void __init init_speculation_mitigations(void)
|
||||
if ( IS_ENABLED(CONFIG_INDIRECT_THUNK) )
|
||||
{
|
||||
/*
|
||||
* AMD's recommended mitigation is to set lfence as being dispatch
|
||||
* serialising, and to use IND_THUNK_LFENCE.
|
||||
*/
|
||||
if ( cpu_has_lfence_dispatch )
|
||||
thunk = THUNK_LFENCE;
|
||||
/*
|
||||
* On Intel hardware, we'd like to use retpoline in preference to
|
||||
* On all hardware, we'd like to use retpoline in preference to
|
||||
* IBRS, but only if it is safe on this hardware.
|
||||
*/
|
||||
else if ( retpoline_safe(caps) )
|
||||
if ( retpoline_safe(caps) )
|
||||
thunk = THUNK_RETPOLINE;
|
||||
else if ( has_spec_ctrl )
|
||||
ibrs = true;
|
||||
|
||||