[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86-64: pv wrmsr emulation fix
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1186671753 -3600 # Node ID 3876b4e7cc0a4d0404ca01fce0879d85cb98d213 # Parent db21f714d37fd931f363b9ab89460cc8b4db19de x86-64: pv wrmsr emulation fix Make sure the upper 32 bits of RAX are disregarded during MSR write emulation. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- xen/arch/x86/traps.c | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) diff -r db21f714d37f -r 3876b4e7cc0a xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Thu Aug 09 15:16:51 2007 +0100 +++ b/xen/arch/x86/traps.c Thu Aug 09 16:02:33 2007 +0100 @@ -1219,7 +1219,7 @@ static int emulate_privileged_op(struct unsigned long code_base, code_limit; char io_emul_stub[16]; void (*io_emul)(struct cpu_user_regs *) __attribute__((__regparm__(1))); - u32 l, h; + u32 l, h, eax, edx; if ( !read_descriptor(regs->cs, v, regs, &code_base, &code_limit, &ar, @@ -1696,43 +1696,43 @@ static int emulate_privileged_op(struct break; case 0x30: /* WRMSR */ + eax = regs->eax; + edx = regs->edx; + res = ((u64)edx << 32) | eax; switch ( regs->ecx ) { #ifdef CONFIG_X86_64 case MSR_FS_BASE: if ( is_pv_32on64_vcpu(v) ) goto fail; - if ( wrmsr_safe(MSR_FS_BASE, regs->eax, regs->edx) ) + if ( wrmsr_safe(MSR_FS_BASE, eax, edx) ) goto fail; - v->arch.guest_context.fs_base = - ((u64)regs->edx << 32) | regs->eax; + v->arch.guest_context.fs_base = res; break; case MSR_GS_BASE: if ( is_pv_32on64_vcpu(v) ) goto fail; - if ( wrmsr_safe(MSR_GS_BASE, regs->eax, regs->edx) ) + if ( wrmsr_safe(MSR_GS_BASE, eax, edx) ) goto fail; - v->arch.guest_context.gs_base_kernel = - ((u64)regs->edx << 32) | regs->eax; + v->arch.guest_context.gs_base_kernel = res; break; case MSR_SHADOW_GS_BASE: if ( is_pv_32on64_vcpu(v) ) goto fail; - if ( wrmsr_safe(MSR_SHADOW_GS_BASE, regs->eax, regs->edx) ) + if ( wrmsr_safe(MSR_SHADOW_GS_BASE, eax, edx) ) goto fail; - v->arch.guest_context.gs_base_user = - ((u64)regs->edx << 32) | regs->eax; + v->arch.guest_context.gs_base_user = res; break; #endif default: - if ( wrmsr_hypervisor_regs(regs->ecx, regs->eax, regs->edx) ) + if ( wrmsr_hypervisor_regs(regs->ecx, eax, edx) ) break; if ( (rdmsr_safe(regs->ecx, l, h) != 0) || - (regs->eax != l) || (regs->edx != h) ) + (eax != l) || (edx != h) ) gdprintk(XENLOG_WARNING, "Domain attempted WRMSR %p from " - "%08x:%08x to %08lx:%08lx.\n", - _p(regs->ecx), h, l, (long)regs->edx, (long)regs->eax); + "%08x:%08x to %08x:%08x.\n", + _p(regs->ecx), h, l, edx, eax); break; } break; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |