[HVM][VMX] Disable IA32e mode in VM_ENTRY_CONTROLS when guest tries
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 7 Nov 2006 10:18:50 +0000 (10:18 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 7 Nov 2006 10:18:50 +0000 (10:18 +0000)
to disable PG from LME mode.

Without this patch, the 64 Vista cannot boot.

Signed-off-by: Xiaohui Xin <xiaohui.xin@intel.com>
Signed-off-by: Xin Li <xin.b.li@intel.com>
xen/arch/x86/hvm/vmx/vmx.c

index 8ce1e1d503278d1ed94e28e5b3b7a3c218ba41e6..ca0bfbde75da29fc0ccff9f7a035ce5d1d71bb42 100644 (file)
@@ -1512,6 +1512,14 @@ static int vmx_set_cr0(unsigned long value)
     }
     else if ( (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PE )
     {
+        if ( vmx_long_mode_enabled(v) )
+        {
+            v->arch.hvm_vmx.msr_content.msr_items[VMX_INDEX_MSR_EFER]
+              &= ~EFER_LMA;
+            __vmread(VM_ENTRY_CONTROLS, &vm_entry_value);
+            vm_entry_value &= ~VM_ENTRY_IA32E_MODE;
+            __vmwrite(VM_ENTRY_CONTROLS, vm_entry_value);
+        }
         shadow_update_paging_modes(v);
         __vmwrite(GUEST_CR3, v->arch.hvm_vcpu.hw_cr3);
     }