[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 2/3] amd/msr: allow passthrough of VIRT_SPEC_CTRL for HVM guests
On Fri, May 06, 2022 at 02:15:47PM +0200, Jan Beulich wrote: > On 03.05.2022 10:26, Roger Pau Monne wrote: > > --- a/xen/arch/x86/cpuid.c > > +++ b/xen/arch/x86/cpuid.c > > @@ -541,6 +541,9 @@ static void __init calculate_hvm_max_policy(void) > > raw_cpuid_policy.basic.sep ) > > __set_bit(X86_FEATURE_SEP, hvm_featureset); > > > > + if ( boot_cpu_has(X86_FEATURE_VIRT_SC_MSR_HVM) ) > > + __set_bit(X86_FEATURE_VIRT_SSBD, hvm_featureset); > > + > > /* > > * If Xen isn't virtualising MSR_SPEC_CTRL for HVM guests (functional > > * availability, or admin choice), hide the feature. > > Especially with the setting of VIRT_SSBD below here (from patch 1) I > don't think this can go without comment. The more that the other > instance ... > > > @@ -597,6 +600,13 @@ static void __init calculate_hvm_def_policy(void) > > guest_common_feature_adjustments(hvm_featureset); > > guest_common_default_feature_adjustments(hvm_featureset); > > > > + /* > > + * Only expose VIRT_SSBD if AMD_SSBD is not available, and thus > > + * VIRT_SC_MSR_HVM is set. > > + */ > > + if ( boot_cpu_has(X86_FEATURE_VIRT_SC_MSR_HVM) ) > > + __set_bit(X86_FEATURE_VIRT_SSBD, hvm_featureset); > > + > > sanitise_featureset(hvm_featureset); > > cpuid_featureset_to_policy(hvm_featureset, p); > > recalculate_xstate(p); > > ... here is about default exposure, so cannot really be extended to > the condition under which this is put in "max" (except that of course > "max" needs to include everything "def" has). Would you be OK with adding: /* * VIRT_SC_MSR_HVM ensures the selection of SSBD is context * switched between the hypervisor and guest selected values for * HVM when the platform doesn't expose AMD_SSBD support. */ > > @@ -3105,6 +3116,30 @@ 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 ( val == current->arch.msrs->virt_spec_ctrl.raw ) > > + return; > > + > > + if ( cpu_has_virt_ssbd ) > > + wrmsr(MSR_VIRT_SPEC_CTRL, val, 0); > > +} > > + > > +/* Called with GIF=0. */ > > +void vmentry_virt_spec_ctrl(void) > > +{ > > + unsigned int val = opt_ssbd ? SPEC_CTRL_SSBD : 0; > > + > > + if ( val == current->arch.msrs->virt_spec_ctrl.raw ) > > + return; > > + > > + if ( cpu_has_virt_ssbd ) > > + wrmsr(MSR_VIRT_SPEC_CTRL, current->arch.msrs->virt_spec_ctrl.raw, > > 0); > > +} > > I guess the double use of current makes it difficult for the compiler > to CSE both uses. Furthermore for symmetry with the other function > how about > > void vmentry_virt_spec_ctrl(void) > { > unsigned int val = current->arch.msrs->virt_spec_ctrl.raw; > > if ( val == (opt_ssbd ? SPEC_CTRL_SSBD : 0) ) > return; > > if ( cpu_has_virt_ssbd ) > wrmsr(MSR_VIRT_SPEC_CTRL, val, 0); > } > > i.e. "val" always representing the value we want to write? Yes, that's fine. I've adjusted the function. > With at least a comment added above, and preferably with the change > to the function (unless that gets in the way of the 3rd patch) > Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Thanks, will wait for confirmation that the proposed comment is fine. Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |