|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] x86/vmx: add support for virtualize SPEC_CTRL
On 09.02.2024 12:40, Roger Pau Monne wrote:
> @@ -1378,6 +1379,10 @@ static int construct_vmcs(struct vcpu *v)
> rc = vmx_add_msr(v, MSR_PRED_CMD, PRED_CMD_IBPB,
> VMX_MSR_HOST);
>
> + /* Set any bits we don't allow toggling in the mask field. */
> + if ( cpu_has_vmx_virt_spec_ctrl && v->arch.msrs->spec_ctrl.raw )
> + __vmwrite(SPEC_CTRL_MASK, v->arch.msrs->spec_ctrl.raw);
The right side of the conditional isn't strictly necessary here, is it?
Might it be better to omit it, for clarity?
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -823,18 +823,29 @@ static void cf_check vmx_cpuid_policy_changed(struct
> vcpu *v)
> {
> vmx_clear_msr_intercept(v, MSR_SPEC_CTRL, VMX_MSR_RW);
>
> - rc = vmx_add_guest_msr(v, MSR_SPEC_CTRL, 0);
> - if ( rc )
> - goto out;
> + if ( !cpu_has_vmx_virt_spec_ctrl )
> + {
> + rc = vmx_add_guest_msr(v, MSR_SPEC_CTRL, 0);
> + if ( rc )
> + goto out;
> + }
> }
> else
> {
> vmx_set_msr_intercept(v, MSR_SPEC_CTRL, VMX_MSR_RW);
>
> - rc = vmx_del_msr(v, MSR_SPEC_CTRL, VMX_MSR_GUEST);
> - if ( rc && rc != -ESRCH )
> - goto out;
> - rc = 0; /* Tolerate -ESRCH */
> + /*
> + * NB: there's no need to clear the virtualize SPEC_CTRL control, as
> + * the MSR intercept takes precedence. The SPEC_CTRL shadow VMCS
> field
> + * is also not loaded on guest entry/exit if the intercept is set.
> + */
It wasn't so much the shadow field than the mask one that I was concerned
might be used in some way. The shadow one clearly is used only during
guest RDMSR/WRMSR processing. To not focus on "shadow", maybe simple say
"The SPEC_CTRL shadow VMCS fields are also not ..."?
> + if ( !cpu_has_vmx_virt_spec_ctrl )
> + {
> + rc = vmx_del_msr(v, MSR_SPEC_CTRL, VMX_MSR_GUEST);
> + if ( rc && rc != -ESRCH )
> + goto out;
> + rc = 0; /* Tolerate -ESRCH */
> + }
> }
>
> /* MSR_PRED_CMD is safe to pass through if the guest knows about it. */
> @@ -2629,6 +2640,9 @@ static uint64_t cf_check vmx_get_reg(struct vcpu *v,
> unsigned int reg)
> switch ( reg )
> {
> case MSR_SPEC_CTRL:
> + if ( cpu_has_vmx_virt_spec_ctrl )
> + /* Requires remote VMCS loaded - fetched below. */
I could see what "fetch" refers to here, but ...
> + break;
> rc = vmx_read_guest_msr(v, reg, &val);
> if ( rc )
> {
> @@ -2652,6 +2666,11 @@ static uint64_t cf_check vmx_get_reg(struct vcpu *v,
> unsigned int reg)
> vmx_vmcs_enter(v);
> switch ( reg )
> {
> + case MSR_SPEC_CTRL:
> + ASSERT(cpu_has_vmx_virt_spec_ctrl);
> + __vmread(SPEC_CTRL_SHADOW, &val);
> + break;
> +
> case MSR_IA32_BNDCFGS:
> __vmread(GUEST_BNDCFGS, &val);
> break;
> @@ -2678,6 +2697,9 @@ static void cf_check vmx_set_reg(struct vcpu *v,
> unsigned int reg, uint64_t val)
> switch ( reg )
> {
> case MSR_SPEC_CTRL:
> + if ( cpu_has_vmx_virt_spec_ctrl )
> + /* Requires remote VMCS loaded - fetched below. */
... since you also use the word here, I'm not sure it's really
the VMREAD up there.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |