# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID aa1adbeecfcdafeb2cea4d4991368ff168a9329b
# Parent 20b6be0e1fa1feaf7942fdde976efa0bbac5c22d
With this patch, 32-bit binary can work on 64-bit VMX guest.
Signed-off-by: Chengyuan Li <chengyuan.li@xxxxxxxxx>
Signed-off-by: Jun Nakajima <jun.nakajima@xxxxxxxxx>
Signed-off-by: Asit Mallick <asit.k.mallick@xxxxxxxxx>
diff -r 20b6be0e1fa1 -r aa1adbeecfcd xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c Sat Sep 10 14:22:12 2005
+++ b/xen/arch/x86/vmx.c Sat Sep 10 14:24:39 2005
@@ -1394,21 +1394,20 @@
static inline void vmx_do_msr_read(struct cpu_user_regs *regs)
{
+ u64 msr_content = 0;
+
VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_read: ecx=%lx, eax=%lx, edx=%lx",
(unsigned long)regs->ecx, (unsigned long)regs->eax,
(unsigned long)regs->edx);
switch (regs->ecx) {
case MSR_IA32_SYSENTER_CS:
- __vmread(GUEST_SYSENTER_CS, ®s->eax);
- regs->edx = 0;
- break;
- case MSR_IA32_SYSENTER_ESP:
- __vmread(GUEST_SYSENTER_ESP, ®s->eax);
- regs->edx = 0;
- break;
- case MSR_IA32_SYSENTER_EIP:
- __vmread(GUEST_SYSENTER_EIP, ®s->eax);
- regs->edx = 0;
+ __vmread(GUEST_SYSENTER_CS, (u32 *)&msr_content);
+ break;
+ case MSR_IA32_SYSENTER_ESP:
+ __vmread(GUEST_SYSENTER_ESP, &msr_content);
+ break;
+ case MSR_IA32_SYSENTER_EIP:
+ __vmread(GUEST_SYSENTER_EIP, &msr_content);
break;
default:
if(long_mode_do_msr_read(regs))
@@ -1417,6 +1416,9 @@
break;
}
+ regs->eax = msr_content & 0xFFFFFFFF;
+ regs->edx = msr_content >> 32;
+
VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_read returns: "
"ecx=%lx, eax=%lx, edx=%lx",
(unsigned long)regs->ecx, (unsigned long)regs->eax,
@@ -1425,18 +1427,23 @@
static inline void vmx_do_msr_write(struct cpu_user_regs *regs)
{
+ u64 msr_content;
+
VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_write: ecx=%lx, eax=%lx, edx=%lx",
(unsigned long)regs->ecx, (unsigned long)regs->eax,
(unsigned long)regs->edx);
+
+ msr_content = (regs->eax & 0xFFFFFFFF) | ((u64)regs->edx << 32);
+
switch (regs->ecx) {
case MSR_IA32_SYSENTER_CS:
- __vmwrite(GUEST_SYSENTER_CS, regs->eax);
- break;
- case MSR_IA32_SYSENTER_ESP:
- __vmwrite(GUEST_SYSENTER_ESP, regs->eax);
- break;
- case MSR_IA32_SYSENTER_EIP:
- __vmwrite(GUEST_SYSENTER_EIP, regs->eax);
+ __vmwrite(GUEST_SYSENTER_CS, msr_content);
+ break;
+ case MSR_IA32_SYSENTER_ESP:
+ __vmwrite(GUEST_SYSENTER_ESP, msr_content);
+ break;
+ case MSR_IA32_SYSENTER_EIP:
+ __vmwrite(GUEST_SYSENTER_EIP, msr_content);
break;
default:
long_mode_do_msr_write(regs);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|