MSR_SPEC_CTRL,
MSR_INTEL_MISC_FEATURES_ENABLES,
MSR_IA32_BNDCFGS,
+ MSR_IA32_XSS,
MSR_AMD64_DR0_ADDRESS_MASK,
MSR_AMD64_DR1_ADDRESS_MASK,
MSR_AMD64_DR2_ADDRESS_MASK,
case MSR_SPEC_CTRL:
case MSR_INTEL_MISC_FEATURES_ENABLES:
case MSR_IA32_BNDCFGS:
+ case MSR_IA32_XSS:
case MSR_AMD64_DR0_ADDRESS_MASK:
case MSR_AMD64_DR1_ADDRESS_MASK ... MSR_AMD64_DR3_ADDRESS_MASK:
rc = guest_wrmsr(v, ctxt->msr[i].index, ctxt->msr[i].val);
MTRRcap_VCNT))];
break;
- case MSR_IA32_XSS:
- if ( !d->arch.cpuid->xstate.xsaves )
- goto gp_fault;
- *msr_content = v->arch.msrs->xss.raw;
- break;
-
case MSR_K8_ENABLE_C1E:
case MSR_AMD64_NB_CFG:
/*
goto gp_fault;
break;
- case MSR_IA32_XSS:
- /* No XSS features currently supported for guests. */
- if ( !d->arch.cpuid->xstate.xsaves || msr_content != 0 )
- goto gp_fault;
- v->arch.msrs->xss.raw = msr_content;
- break;
-
case MSR_AMD64_NB_CFG:
/* ignore the write */
break;
return 0;
}
-static unsigned int __init vmx_init_msr(void)
-{
- return (cpu_has_mpx && cpu_has_vmx_mpx) +
- (cpu_has_xsaves && cpu_has_vmx_xsaves);
-}
-
-static void vmx_save_msr(struct vcpu *v, struct hvm_msr *ctxt)
-{
- if ( cpu_has_xsaves && cpu_has_vmx_xsaves )
- {
- ctxt->msr[ctxt->count].val = v->arch.msrs->xss.raw;
- if ( ctxt->msr[ctxt->count].val )
- ctxt->msr[ctxt->count++].index = MSR_IA32_XSS;
- }
-}
-
-static int vmx_load_msr(struct vcpu *v, struct hvm_msr *ctxt)
-{
- unsigned int i;
- int err = 0;
-
- vmx_vmcs_enter(v);
-
- for ( i = 0; i < ctxt->count; ++i )
- {
- switch ( ctxt->msr[i].index )
- {
- case MSR_IA32_XSS:
- if ( cpu_has_xsaves && cpu_has_vmx_xsaves )
- v->arch.msrs->xss.raw = ctxt->msr[i].val;
- else
- err = -ENXIO;
- break;
- default:
- continue;
- }
- if ( err )
- break;
- ctxt->msr[i]._rsvd = 1;
- }
-
- vmx_vmcs_exit(v);
-
- return err;
-}
-
static void vmx_fpu_enter(struct vcpu *v)
{
vcpu_restore_fpu_lazy(v);
.vcpu_destroy = vmx_vcpu_destroy,
.save_cpu_ctxt = vmx_save_vmcs_ctxt,
.load_cpu_ctxt = vmx_load_vmcs_ctxt,
- .init_msr = vmx_init_msr,
- .save_msr = vmx_save_msr,
- .load_msr = vmx_load_msr,
.get_interrupt_shadow = vmx_get_interrupt_shadow,
.set_interrupt_shadow = vmx_set_interrupt_shadow,
.guest_x86_mode = vmx_guest_x86_mode,
break;
+ case MSR_IA32_XSS:
+ if ( !cp->xstate.xsaves )
+ goto gp_fault;
+
+ *val = msrs->xss.raw;
+ break;
+
case 0x40000000 ... 0x400001ff:
if ( is_viridian_domain(d) )
{
break;
+ case MSR_IA32_XSS:
+ if ( !cp->xstate.xsaves )
+ goto gp_fault;
+
+ /* No XSS features currently supported for guests */
+ if ( val != 0 )
+ goto gp_fault;
+
+ msrs->xss.raw = val;
+ break;
+
case 0x40000000 ... 0x400001ff:
if ( is_viridian_domain(d) )
{