void (*pv_post_outb_hook)(unsigned int port, u8 value);
+static inline uint64_t guest_misc_enable(uint64_t val)
+{
+ val &= ~(MSR_IA32_MISC_ENABLE_PERF_AVAIL |
+ MSR_IA32_MISC_ENABLE_MONITOR_ENABLE);
+ val |= MSR_IA32_MISC_ENABLE_BTS_UNAVAIL |
+ MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL |
+ MSR_IA32_MISC_ENABLE_XTPR_DISABLE;
+ return val;
+}
+
/* Instruction fetch with error handling. */
#define insn_fetch(type, base, eip, limit) \
({ unsigned long _rc, _ptr = (base) + (eip); \
if ( wrmsr_safe(MSR_FAM10H_MMIO_CONF_BASE, msr_content) != 0 )
goto fail;
break;
+ case MSR_IA32_MISC_ENABLE:
+ if ( rdmsr_safe(regs->ecx, val) )
+ goto invalid;
+ val = guest_misc_enable(val);
+ if ( msr_content != val )
+ goto invalid;
+ break;
case MSR_IA32_MPERF:
case MSR_IA32_APERF:
if (( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) &&
if ( rc )
break;
- if ( (rdmsr_safe(regs->ecx, val) != 0) ||
- (eax != (uint32_t)val) || (edx != (uint32_t)(val >> 32)) )
+ if ( (rdmsr_safe(regs->ecx, val) != 0) || (msr_content != val) )
invalid:
gdprintk(XENLOG_WARNING, "Domain attempted WRMSR %p from "
"0x%016"PRIx64" to 0x%016"PRIx64".\n",
case MSR_IA32_MISC_ENABLE:
if ( rdmsr_safe(regs->ecx, msr_content) )
goto fail;
+ msr_content = guest_misc_enable(msr_content);
regs->eax = (uint32_t)msr_content;
regs->edx = (uint32_t)(msr_content >> 32);
- regs->eax &= ~(MSR_IA32_MISC_ENABLE_PERF_AVAIL |
- MSR_IA32_MISC_ENABLE_MONITOR_ENABLE);
- regs->eax |= MSR_IA32_MISC_ENABLE_BTS_UNAVAIL |
- MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL |
- MSR_IA32_MISC_ENABLE_XTPR_DISABLE;
break;
case MSR_EFER:
case MSR_AMD_PATCHLEVEL:
__asm__ __volatile__( \
"1: rdmsr\n2:\n" \
".section .fixup,\"ax\"\n" \
- "3: movl %5,%2\n; jmp 2b\n" \
+ "3: xorl %0,%0\n; xorl %1,%1\n" \
+ " movl %5,%2\n; jmp 2b\n" \
".previous\n" \
".section __ex_table,\"a\"\n" \
" "__FIXUP_ALIGN"\n" \