|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/3] amd/msr: allow passthrough of VIRT_SPEC_CTRL for HVM guests
On 15.03.2022 15:18, Roger Pau Monne wrote:
> Allow HVM guests untrapped access to MSR_VIRT_SPEC_CTRL if the
> hardware has support for it. This requires adding logic in the
> vm{entry,exit} paths for SVM in order to context switch between the
> hypervisor value and the guest one. The added handlers for context
> switch will also be used for the legacy SSBD support.
>
> Introduce a new synthetic feature leaf (X86_FEATURE_VIRT_SC_MSR_HVM)
> to signal whether VIRT_SPEC_CTRL needs to be handled on guest
> vm{entry,exit}.
>
> Note the change in the handling of VIRT_SSBD in the featureset
> description. The change from 's' to 'S' is due to the fact that now if
> VIRT_SSBD is exposed by the hardware it can be passed through to HVM
> guests.
But lower vs upper case mean "(do not) expose by default", not whether
underlying hardware exposes the feature. In patch 1 you actually used
absence in underlying hardware to justify !, not s.
> @@ -610,6 +611,14 @@ static void cf_check svm_cpuid_policy_changed(struct
> vcpu *v)
> svm_intercept_msr(v, MSR_SPEC_CTRL,
> cp->extd.ibrs ? MSR_INTERCEPT_NONE : MSR_INTERCEPT_RW);
>
> + /*
> + * Give access to MSR_VIRT_SPEC_CTRL if the guest has been told about it
> + * and the hardware implements it.
> + */
> + svm_intercept_msr(v, MSR_VIRT_SPEC_CTRL,
> + cp->extd.virt_ssbd && cpu_has_virt_ssbd ?
Despite giving the guest direct access guest_{rd,wr}msr() can be hit
for such guests. Don't you need to update what patch 1 added there?
Also, is there a reason the qualifier here is not in sync with ...
> @@ -3105,6 +3114,36 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
> vmcb_set_vintr(vmcb, intr);
> }
>
> +/* Called with GIF=0. */
> +void vmexit_virt_spec_ctrl(void)
> +{
> + unsigned int val = opt_ssbd ? SPEC_CTRL_SSBD : 0;
> +
> + if ( cpu_has_virt_ssbd )
... this one? Since the patching is keyed to VIRT_SC_MSR_HVM, which in
turn is enabled only when cpu_has_virt_ssbd, it would seem to me that
if any asymmetry was okay here, then using cp->extd.virt_ssbd without
cpu_has_virt_ssbd.
> @@ -1069,6 +1072,10 @@ void __init init_speculation_mitigations(void)
> setup_force_cpu_cap(X86_FEATURE_SC_MSR_HVM);
> }
>
> + /* Support VIRT_SPEC_CTRL.SSBD if AMD_SSBD is not available. */
> + if ( opt_msr_sc_hvm && !cpu_has_amd_ssbd && cpu_has_virt_ssbd )
> + setup_force_cpu_cap(X86_FEATURE_VIRT_SC_MSR_HVM);
In cpuid.c the comment (matching the code there) talks about exposing
by default. I can't bring this in line with the use of !cpu_has_amd_ssbd
here.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |