else if ( ret )
break;
- if ( rdmsr_viridian_regs(msr, msr_content) ||
- rdmsr_hypervisor_regs(msr, msr_content) )
- break;
-
if ( rdmsr_safe(msr, *msr_content) == 0 )
break;
else if ( ret )
break;
- if ( wrmsr_viridian_regs(msr, msr_content) )
+ /* Match up with the RDMSR side; ultimately this should go away. */
+ if ( rdmsr_safe(msr, msr_content) == 0 )
break;
- switch ( wrmsr_hypervisor_regs(msr, msr_content) )
- {
- case -ERESTART:
- result = X86EMUL_RETRY;
- break;
- case 0:
- /*
- * Match up with the RDMSR side for now; ultimately this entire
- * case block should go away.
- */
- if ( rdmsr_safe(msr, msr_content) == 0 )
- break;
- goto gpf;
- case 1:
- break;
- default:
- goto gpf;
- }
- break;
+ goto gpf;
}
return result;
break;
}
- if ( rdmsr_viridian_regs(msr, msr_content) ||
- rdmsr_hypervisor_regs(msr, msr_content) )
- break;
-
if ( rdmsr_safe(msr, *msr_content) == 0 )
break;
if ( passive_domain_do_wrmsr(msr, msr_content) )
return X86EMUL_OKAY;
- if ( wrmsr_viridian_regs(msr, msr_content) )
- break;
-
if ( vmx_write_guest_msr(v, msr, msr_content) == 0 ||
is_last_branch_msr(msr) )
break;
- switch ( wrmsr_hypervisor_regs(msr, msr_content) )
- {
- case -ERESTART:
- return X86EMUL_RETRY;
- case 0:
- /*
- * Match up with the RDMSR side for now; ultimately this
- * entire case block should go away.
- */
- if ( rdmsr_safe(msr, msr_content) == 0 )
- break;
- goto gp_fault;
- case 1:
+ /* Match up with the RDMSR side; ultimately this should go away. */
+ if ( rdmsr_safe(msr, msr_content) == 0 )
break;
- default:
- goto gp_fault;
- }
- break;
+
+ goto gp_fault;
}
return X86EMUL_OKAY;
int guest_rdmsr(const struct vcpu *v, uint32_t msr, uint64_t *val)
{
- const struct cpuid_policy *cp = v->domain->arch.cpuid;
- const struct msr_policy *mp = v->domain->arch.msr;
+ const struct domain *d = v->domain;
+ const struct cpuid_policy *cp = d->arch.cpuid;
+ const struct msr_policy *mp = d->arch.msr;
const struct vcpu_msrs *msrs = v->arch.msrs;
+ int ret = X86EMUL_OKAY;
switch ( msr )
{
*val = msrs->misc_features_enables.raw;
break;
+ case 0x40000000 ... 0x400001ff:
+ if ( is_viridian_domain(d) )
+ {
+ ret = (rdmsr_viridian_regs(msr, val)
+ ? X86EMUL_OKAY : X86EMUL_EXCEPTION);
+ break;
+ }
+
+ /* Fallthrough. */
+ case 0x40000200 ... 0x400002ff:
+ ret = (rdmsr_hypervisor_regs(msr, val)
+ ? X86EMUL_OKAY : X86EMUL_EXCEPTION);
+ break;
+
default:
return X86EMUL_UNHANDLEABLE;
}
- return X86EMUL_OKAY;
+ /*
+ * Interim safety check that functions we dispatch to don't alias "Not yet
+ * handled by the new MSR infrastructure".
+ */
+ ASSERT(ret != X86EMUL_UNHANDLEABLE);
+
+ return ret;
gp_fault:
return X86EMUL_EXCEPTION;
const struct cpuid_policy *cp = d->arch.cpuid;
const struct msr_policy *mp = d->arch.msr;
struct vcpu_msrs *msrs = v->arch.msrs;
+ int ret = X86EMUL_OKAY;
switch ( msr )
{
break;
}
+ case 0x40000000 ... 0x400001ff:
+ if ( is_viridian_domain(d) )
+ {
+ ret = (wrmsr_viridian_regs(msr, val)
+ ? X86EMUL_OKAY : X86EMUL_EXCEPTION);
+ break;
+ }
+
+ /* Fallthrough. */
+ case 0x40000200 ... 0x400002ff:
+ switch ( wrmsr_hypervisor_regs(msr, val) )
+ {
+ case -ERESTART: ret = X86EMUL_RETRY; break;
+ case 1: ret = X86EMUL_OKAY; break;
+ default: ret = X86EMUL_EXCEPTION; break;
+ }
+ break;
+
default:
return X86EMUL_UNHANDLEABLE;
}
- return X86EMUL_OKAY;
+ /*
+ * Interim safety check that functions we dispatch to don't alias "Not yet
+ * handled by the new MSR infrastructure".
+ */
+ ASSERT(ret != X86EMUL_UNHANDLEABLE);
+
+ return ret;
gp_fault:
return X86EMUL_EXCEPTION;