aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2007-12-14 11:37:02 +0000
committerKeir Fraser <keir.fraser@citrix.com>2007-12-14 11:37:02 +0000
commita59ecf18bce3fcd7010b6edfe7edfc39ae759415 (patch)
treef69351eca70a9d94b1c08d0844f8c52169dbbd46
parent0a953b774b4053b15aadb9bd7b3123fb116889f8 (diff)
downloadxen-a59ecf18bce3fcd7010b6edfe7edfc39ae759415.tar.gz
xen-a59ecf18bce3fcd7010b6edfe7edfc39ae759415.tar.bz2
xen-a59ecf18bce3fcd7010b6edfe7edfc39ae759415.zip
cpufreq: Always return successfully from cpufreq MSR traps
Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com> Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r--xen/arch/x86/traps.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 970796e045..d814e296aa 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1878,7 +1878,7 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
eax = regs->eax;
edx = regs->edx;
res = ((u64)edx << 32) | eax;
- switch ( regs->ecx )
+ switch ( (u32)regs->ecx )
{
#ifdef CONFIG_X86_64
case MSR_FS_BASE:
@@ -1916,15 +1916,19 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
case MSR_K8_PSTATE5:
case MSR_K8_PSTATE6:
case MSR_K8_PSTATE7:
- if ( (cpufreq_controller != FREQCTL_dom0_kernel) ||
- (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) ||
- wrmsr_safe(regs->ecx, eax, edx) )
+ if ( boot_cpu_data.x86_vendor != X86_VENDOR_AMD )
+ goto fail;
+ if ( cpufreq_controller != FREQCTL_dom0_kernel )
+ break;
+ if ( wrmsr_safe(regs->ecx, eax, edx) != 0 )
goto fail;
break;
case MSR_IA32_PERF_CTL:
- if ( (cpufreq_controller != FREQCTL_dom0_kernel) ||
- (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) ||
- wrmsr_safe(regs->ecx, eax, edx) )
+ if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
+ goto fail;
+ if ( cpufreq_controller != FREQCTL_dom0_kernel )
+ break;
+ if ( wrmsr_safe(regs->ecx, eax, edx) != 0 )
goto fail;
break;
default:
@@ -1944,7 +1948,7 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
break;
case 0x32: /* RDMSR */
- switch ( regs->ecx )
+ switch ( (u32)regs->ecx )
{
#ifdef CONFIG_X86_64
case MSR_FS_BASE:
@@ -1979,9 +1983,14 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
case MSR_K8_PSTATE5:
case MSR_K8_PSTATE6:
case MSR_K8_PSTATE7:
- if ( (cpufreq_controller != FREQCTL_dom0_kernel) ||
- (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) ||
- rdmsr_safe(regs->ecx, regs->eax, regs->edx) )
+ if ( boot_cpu_data.x86_vendor != X86_VENDOR_AMD )
+ goto fail;
+ if ( cpufreq_controller != FREQCTL_dom0_kernel )
+ {
+ regs->eax = regs->edx = 0;
+ break;
+ }
+ if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) != 0 )
goto fail;
break;
case MSR_EFER: