[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] This patch fixes an error booting 32bit vista on VMX.



# HG changeset patch
# User Steven Hand <steven@xxxxxxxxxxxxx>
# Node ID 0e9055d69f12e230ed086bd9445aef863a16e129
# Parent  3236311a23a5083ec78cac53ccad1e92d619e8a1
This patch fixes an error booting 32bit vista on VMX.

The shadow code uses hvm_get_guest_ctrl_reg(v, 4) to test whether
PAE is enabled or not.  But it is not always right if the hypervisor
calls hvm_get_guest_ctrl_reg(v, 4) between vmxassist_invoke and
vmxassist_restore

The patch uses the d->arch.hvm_vmx.cpu_state to test if the PAE is
enabled.

Also update SVM code to use the new 'pae_enabled' hvm func.

Signed-off-by: Xiaohui Xin <xiaohui.xin@xxxxxxxxx>
Signed-off-by: Steven Hand <steven@xxxxxxxxxxxxx>
---
 xen/arch/x86/hvm/svm/svm.c         |   12 ++++++++++++
 xen/arch/x86/hvm/vmx/vmx.c         |    1 +
 xen/arch/x86/mm/shadow/common.c    |    2 +-
 xen/include/asm-x86/hvm/hvm.h      |    7 +++++++
 xen/include/asm-x86/hvm/vmx/vmcs.h |    3 +++
 xen/include/asm-x86/hvm/vmx/vmx.h  |    6 ++++++
 6 files changed, 30 insertions(+), 1 deletion(-)

diff -r 3236311a23a5 -r 0e9055d69f12 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Fri Sep 22 12:14:22 2006 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri Sep 22 12:27:28 2006 +0100
@@ -259,6 +259,17 @@ static int svm_paging_enabled(struct vcp
     return (cr0 & X86_CR0_PE) && (cr0 & X86_CR0_PG);
 }
 
+static int svm_pae_enabled(struct vcpu *v)
+{
+    unsigned long cr4;
+
+    if(!svm_paging_enabled(v))
+        return 0;
+
+    cr4 = v->arch.hvm_svm.cpu_shadow_cr4;
+
+    return (cr4 & X86_CR4_PAE);
+}
 
 #define IS_CANO_ADDRESS(add) 1
 
@@ -865,6 +876,7 @@ int start_svm(void)
     hvm_funcs.realmode = svm_realmode;
     hvm_funcs.paging_enabled = svm_paging_enabled;
     hvm_funcs.long_mode_enabled = svm_long_mode_enabled;
+    hvm_funcs.pae_enabled = svm_pae_enabled;
     hvm_funcs.guest_x86_mode = svm_guest_x86_mode;
     hvm_funcs.instruction_length = svm_instruction_length;
     hvm_funcs.get_guest_ctrl_reg = svm_get_ctrl_reg;
diff -r 3236311a23a5 -r 0e9055d69f12 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Fri Sep 22 12:14:22 2006 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Sep 22 12:27:28 2006 +0100
@@ -746,6 +746,7 @@ static void vmx_setup_hvm_funcs(void)
     hvm_funcs.realmode = vmx_realmode;
     hvm_funcs.paging_enabled = vmx_paging_enabled;
     hvm_funcs.long_mode_enabled = vmx_long_mode_enabled;
+    hvm_funcs.pae_enabled = vmx_pae_enabled;
     hvm_funcs.guest_x86_mode = vmx_guest_x86_mode;
     hvm_funcs.instruction_length = vmx_instruction_length;
     hvm_funcs.get_guest_ctrl_reg = vmx_get_ctrl_reg;
diff -r 3236311a23a5 -r 0e9055d69f12 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c   Fri Sep 22 12:14:22 2006 +0100
+++ b/xen/arch/x86/mm/shadow/common.c   Fri Sep 22 12:27:28 2006 +0100
@@ -2343,7 +2343,7 @@ void sh_update_paging_modes(struct vcpu 
             }
             else
 #endif
-                if ( hvm_get_guest_ctrl_reg(v, 4) & X86_CR4_PAE )
+                if ( hvm_pae_enabled(v) )
                 {
 #if CONFIG_PAGING_LEVELS >= 3
                     // 32-bit PAE mode guest...
diff -r 3236311a23a5 -r 0e9055d69f12 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Fri Sep 22 12:14:22 2006 +0100
+++ b/xen/include/asm-x86/hvm/hvm.h     Fri Sep 22 12:27:28 2006 +0100
@@ -57,6 +57,7 @@ struct hvm_function_table {
     int (*realmode)(struct vcpu *v);
     int (*paging_enabled)(struct vcpu *v);
     int (*long_mode_enabled)(struct vcpu *v);
+    int (*pae_enabled)(struct vcpu *v);
     int (*guest_x86_mode)(struct vcpu *v);
     int (*instruction_length)(struct vcpu *v);
     unsigned long (*get_guest_ctrl_reg)(struct vcpu *v, unsigned int num);
@@ -146,6 +147,12 @@ hvm_long_mode_enabled(struct vcpu *v)
     return hvm_funcs.long_mode_enabled(v);
 }
 
+ static inline int
+hvm_pae_enabled(struct vcpu *v)
+{
+    return hvm_funcs.pae_enabled(v);
+}
+
 static inline int
 hvm_guest_x86_mode(struct vcpu *v)
 {
diff -r 3236311a23a5 -r 0e9055d69f12 xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Fri Sep 22 12:14:22 2006 +0100
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Fri Sep 22 12:27:28 2006 +0100
@@ -38,6 +38,9 @@ enum {
 
 #define VMX_LONG_GUEST(ed)    \
   (test_bit(VMX_CPU_STATE_LMA_ENABLED, &ed->arch.hvm_vmx.cpu_state))
+
+#define VMX_PAE_GUEST(ed)       \
+  (test_bit(VMX_CPU_STATE_PAE_ENABLED, &ed->arch.hvm_vmx.cpu_state))
 
 struct vmcs_struct {
     u32 vmcs_revision_id;
diff -r 3236311a23a5 -r 0e9055d69f12 xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Fri Sep 22 12:14:22 2006 +0100
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Fri Sep 22 12:27:28 2006 +0100
@@ -418,6 +418,12 @@ static inline int vmx_long_mode_enabled(
     return VMX_LONG_GUEST(current);
 }
 
+static inline int vmx_pae_enabled(struct vcpu *v)
+{
+    ASSERT(v == current);
+    return VMX_PAE_GUEST(current);
+}
+
 /* Works only for vcpu == current */
 static inline int vmx_realmode(struct vcpu *v)
 {

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.