Such handling consist in checking that no bits have been changed from
the read value, if that's the case silently drop the write, otherwise
inject a fault.
At least Windows guests will expect to write to the MISC_ENABLE MSR
with the same value that's been read from it.
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
switch ( msr )
{
- uint64_t rsvd;
+ uint64_t rsvd, tmp;
case MSR_IA32_SYSENTER_CS:
__vmwrite(GUEST_SYSENTER_CS, msr_content);
/* None of these MSRs are writeable. */
goto gp_fault;
+ case MSR_IA32_MISC_ENABLE:
+ /*
+ * Silently drop writes that don't change the reported value: At least
+ * some Windows guests will expect to be able to write to MISC_ENABLE
+ * with the same value that's been read from it.
+ */
+ if ( vmx_msr_read_intercept(msr, &tmp) != X86EMUL_OKAY ||
+ tmp != msr_content )
+ goto gp_fault;
+ break;
+
case MSR_P6_PERFCTR(0)...MSR_P6_PERFCTR(7):
case MSR_P6_EVNTSEL(0)...MSR_P6_EVNTSEL(7):
case MSR_CORE_PERF_FIXED_CTR0...MSR_CORE_PERF_FIXED_CTR2: