2010-11-12 18:55:23 +01:00
|
|
|
# HG changeset patch
|
|
|
|
# User Keir Fraser <keir@xen.org>
|
|
|
|
# Date 1286784105 -3600
|
|
|
|
# Node ID a1405385db77c7c81aac27bd88d6c4b2d90b1389
|
|
|
|
# Parent a33886146b45da46a5161a7ebed4d2f607642aee
|
|
|
|
x86: emulate MSR_IA32_UCODE_REV Intel access protocol
|
|
|
|
|
|
|
|
Intel requires a write of zeros (hence such writes now get silently
|
|
|
|
ignored) followed by a cpuid(1) followed by the actual read.
|
|
|
|
|
|
|
|
Includes some code redundancy elimination possible after the actual
|
|
|
|
change.
|
|
|
|
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
|
|
|
2011-02-04 22:19:54 +01:00
|
|
|
Index: xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.0.2-testing.orig/xen/arch/x86/traps.c
|
|
|
|
+++ xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
|
|
@@ -2286,6 +2286,14 @@ static int emulate_privileged_op(struct
|
2010-11-12 18:55:23 +01:00
|
|
|
if ( wrmsr_safe(MSR_FAM10H_MMIO_CONF_BASE, eax, edx) != 0 )
|
|
|
|
goto fail;
|
|
|
|
break;
|
|
|
|
+ case MSR_IA32_UCODE_REV:
|
|
|
|
+ if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
|
|
|
|
+ goto fail;
|
|
|
|
+ if ( rdmsr_safe(regs->ecx, l, h) )
|
|
|
|
+ goto fail;
|
|
|
|
+ if ( l | h )
|
|
|
|
+ goto invalid;
|
|
|
|
+ break;
|
|
|
|
case MSR_IA32_MISC_ENABLE:
|
|
|
|
if ( rdmsr_safe(regs->ecx, l, h) )
|
|
|
|
goto invalid;
|
2011-02-04 22:19:54 +01:00
|
|
|
@@ -2393,16 +2401,21 @@ static int emulate_privileged_op(struct
|
2010-11-12 18:55:23 +01:00
|
|
|
regs->eax = regs->edx = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
- if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) != 0 )
|
|
|
|
- goto fail;
|
|
|
|
- break;
|
|
|
|
+ goto rdmsr_normal;
|
|
|
|
+ case MSR_IA32_UCODE_REV:
|
|
|
|
+ BUILD_BUG_ON(MSR_IA32_UCODE_REV != MSR_AMD_PATCHLEVEL);
|
|
|
|
+ if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL )
|
|
|
|
+ {
|
|
|
|
+ if ( wrmsr_safe(MSR_IA32_UCODE_REV, 0, 0) )
|
|
|
|
+ goto fail;
|
|
|
|
+ sync_core();
|
|
|
|
+ }
|
|
|
|
+ goto rdmsr_normal;
|
|
|
|
case MSR_IA32_MISC_ENABLE:
|
|
|
|
if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) )
|
|
|
|
goto fail;
|
|
|
|
regs->eax = guest_misc_enable(regs->eax);
|
|
|
|
break;
|
|
|
|
- case MSR_EFER:
|
|
|
|
- case MSR_AMD_PATCHLEVEL:
|
|
|
|
default:
|
|
|
|
if ( rdmsr_hypervisor_regs(regs->ecx, &val) )
|
|
|
|
{
|
2011-02-04 22:19:54 +01:00
|
|
|
@@ -2418,6 +2431,8 @@ static int emulate_privileged_op(struct
|
2010-11-12 18:55:23 +01:00
|
|
|
if ( rc )
|
|
|
|
goto rdmsr_writeback;
|
|
|
|
|
|
|
|
+ case MSR_EFER:
|
|
|
|
+ rdmsr_normal:
|
|
|
|
/* Everyone can read the MSR space. */
|
|
|
|
/* gdprintk(XENLOG_WARNING,"Domain attempted RDMSR %p.\n",
|
|
|
|
_p(regs->ecx));*/
|