|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/spec-ctrl: Support for SRSO_US_NO and SRSO_MSR_FIX
On 26/03/2024 9:13 am, Jan Beulich wrote:
> On 25.03.2024 19:18, Andrew Cooper wrote:
>> --- a/docs/misc/xen-command-line.pandoc
>> +++ b/docs/misc/xen-command-line.pandoc
>> @@ -2377,7 +2377,8 @@ By default SSBD will be mitigated at runtime (i.e
>> `ssbd=runtime`).
>> > {msr-sc,rsb,verw,ibpb-entry}=<bool>|{pv,hvm}=<bool>,
>> > bti-thunk=retpoline|lfence|jmp, {ibrs,ibpb,ssbd,psfd,
>> > eager-fpu,l1d-flush,branch-harden,srb-lock,
>> -> unpriv-mmio,gds-mit,div-scrub,lock-harden}=<bool> ]`
>> +> unpriv-mmio,gds-mit,div-scrub,lock-harden,
>> +> bp-spec-reduce}=<bool> ]`
>>
>> Controls for speculative execution sidechannel mitigations. By default, Xen
>> will pick the most appropriate mitigations based on compiled in support,
>> @@ -2509,6 +2510,12 @@ boolean can be used to force or prevent Xen from
>> using speculation barriers to
>> protect lock critical regions. This mitigation won't be engaged by default,
>> and needs to be explicitly enabled on the command line.
>>
>> +On hardware supporting SRSO_MSR_FIX, the `bp-spec-reduce=` option can be
>> used
>> +to force or prevent Xen from using MSR_BP_CFG.BP_SPEC_REDUCE to mitigate the
>> +SRSO (Speculative Return Stack Overflow) vulnerability.
> "... against HVM guests" to avoid things being left ambiguous, and to also ...
>
>> By default, Xen will
>> +use bp-spec-reduce when available, as it preferable to using
>> `ibpb-entry=hvm`
>> +to mitigate SRSO.
> ... correlate with the `ibpb-entry=hvm` here?
Ok.
> Maybe at the start of the paragraph also add "AMD"?
The rest of the text specifically doesn't mention vendors, in an attempt
to prevent it going stale.
Although now I re-read it, it makes the statements about microcode drops
ambiguous.
>
>> --- a/xen/arch/x86/cpu/amd.c
>> +++ b/xen/arch/x86/cpu/amd.c
>> @@ -1009,16 +1009,31 @@ static void cf_check fam17_disable_c6(void *arg)
>> wrmsrl(MSR_AMD_CSTATE_CFG, val & mask);
>> }
>>
>> -static void amd_check_erratum_1485(void)
>> +static void amd_check_bp_cfg(void)
>> {
>> - uint64_t val, chickenbit = (1 << 5);
>> + uint64_t val, new = 0;
>>
>> - if (cpu_has_hypervisor || boot_cpu_data.x86 != 0x19 || !is_zen4_uarch())
>> + /*
>> + * AMD Erratum #1485. Set bit 5, as instructed.
>> + */
>> + if (!cpu_has_hypervisor && boot_cpu_data.x86 == 0x19 && is_zen4_uarch())
>> + new |= (1 << 5);
>> +
>> + /*
>> + * On hardware supporting SRSO_MSR_FIX, we prefer BP_SPEC_REDUCE to
>> + * IBPB-on-entry to mitigate SRSO for HVM guests.
>> + */
>> + if (IS_ENABLED(CONFIG_HVM) && boot_cpu_has(X86_FEATURE_SRSO_US_NO) &&
>> + opt_bp_spec_reduce)
> Nit: Indentation is odd here (wants to be a tab followed by a few spaces).
>
>> + new |= BP_CFG_SPEC_REDUCE;
> I take it that this goes from the assumption that it is deemed pretty unlikely
> that nowadays people would only run PV guests on a host? Otherwise, assuming
> that - like almost any such mitigation - its use costs performance, enabling
> the mitigation only as long as there are any HVM guests around might be
> better.
I have no idea what the perf cost is. Native systems are expected not
to use this.
However, I have no care to try and make this dynamic based on having HVM
guests active. For one, it would need a real spinlock to avoid the MSR
race, or a stop machine context, and anyone running PV guests on this
hardware really oughtn't to be.
[Edit, See later, but we need this for PV too]
>
>> + /* Avoid reading BP_CFG if we don't intend to change anything. */
>> + if (!new)
>> return;
>>
>> rdmsrl(MSR_AMD64_BP_CFG, val);
>>
>> - if (val & chickenbit)
>> + if ((val & new) == new)
>> return;
> Since bits may also need turning off:
>
> if (!((val ^ new) & (BP_CFG_SPEC_REDUCE | (1 << 5))))
> return;
>
> and the !new early-out dropped, too? Looks like this wasn't quite right
> before, either.
That's adding unnecessary complexity. It's unlikely that we'll ever
need to clear bits like this.
>
>> @@ -1078,22 +1082,41 @@ static void __init ibpb_calculations(void)
>> * Confusion. Mitigate with IBPB-on-entry.
>> */
>> if ( !boot_cpu_has(X86_FEATURE_BTC_NO) )
>> - def_ibpb_entry = true;
>> + def_ibpb_entry_pv = def_ibpb_entry_hvm = true;
>>
>> /*
>> - * Further to BTC, Zen3/4 CPUs suffer from Speculative Return Stack
>> - * Overflow in most configurations. Mitigate with IBPB-on-entry if
>> we
>> - * have the microcode that makes this an effective option.
>> + * Further to BTC, Zen3 and later CPUs suffer from Speculative
>> Return
>> + * Stack Overflow in most configurations. Mitigate with
>> IBPB-on-entry
>> + * if we have the microcode that makes this an effective option,
>> + * except where there are other mitigating factors available.
>> */
> Hmm, is "Zen3 and later" really appropriate?
Yes.
SRSO isn't fixed until SRSO_NO is enumerated.
> Isn't your "speculative coding"
> remark related to perhaps both of the new bits becoming available on Zen5
> (meaning that the vulnerability would be limited to the guest/host boundary,
> as long as the MSR-based mitigation isn't used)?
Both of these are interim fixes.
>> if ( !boot_cpu_has(X86_FEATURE_SRSO_NO) &&
>> boot_cpu_has(X86_FEATURE_IBPB_BRTYPE) )
>> - def_ibpb_entry = true;
>> + {
>> + /*
>> + * SRSO_U/S_NO is a subset of SRSO_NO, identifying that SRSO
>> isn't
>> + * possible across the user/supervisor boundary. We only need
>> to
>> + * use IBPB-on-entry for PV guests on hardware which doesn't
>> + * enumerate SRSO_US_NO.
>> + */
>> + if ( !boot_cpu_has(X86_FEATURE_SRSO_US_NO) )
>> + def_ibpb_entry_pv = true;
> opt_rsb_pv continues to take opt_pv32 into account, despite us having
> removed security support for 32-bit PV guests (by wording that's sadly a
> little ambiguous). Shouldn't that be done here too then, seeing that the
> flag only covers transitions from ring3?
Hmm, probably.
In practice, all these systems have CET so PV32 will be off-by-default,
but if people really want to run PV32 guests, we might as well do our best.
>
>> --- a/xen/include/public/arch-x86/cpufeatureset.h
>> +++ b/xen/include/public/arch-x86/cpufeatureset.h
>> @@ -304,7 +304,9 @@ XEN_CPUFEATURE(FSRSC, 11*32+19) /*A Fast
>> Short REP SCASB */
>> XEN_CPUFEATURE(AMD_PREFETCHI, 11*32+20) /*A PREFETCHIT{0,1}
>> Instructions */
>> XEN_CPUFEATURE(SBPB, 11*32+27) /*A Selective Branch
>> Predictor Barrier */
>> XEN_CPUFEATURE(IBPB_BRTYPE, 11*32+28) /*A IBPB flushes Branch Type
>> predictions too */
>> -XEN_CPUFEATURE(SRSO_NO, 11*32+29) /*A Hardware not vulenrable
>> to Speculative Return Stack Overflow */
>> +XEN_CPUFEATURE(SRSO_NO, 11*32+29) /*A Hardware not vulnerable
>> to Speculative Return Stack Overflow */
>> +XEN_CPUFEATURE(SRSO_US_NO, 11*32+30) /*A Hardware not vulnerable
>> to SRSO across the User/Supervisor boundary */
> Can we validly expose this to 64-bit PV guests, where there's no CPL
> boundary? Or else isn't my "x86/PV: issue branch prediction barrier
> when switching 64-bit guest to kernel mode" needed as a prereq?
Based on uarch details, if BP-SPEC-REDUCE is active, we can advertise
SRSO_US_NO to PV guests.
But I doubt I'll be able to persuade AMD to put the safety details
behind this in writing.
I also missed the hunks adding SRSO_US_NO and SRSO_MSR_FIX to
print_details(). Fixed locally.
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |