Skip to contentSkip to conversation

vmx-worldswitch-1-to-1.patch

PATCH New Arun Sharma 1 participant 1 message May 27, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 vmx-worldswitch-1-to-1.patch

Fix VMX world switch to use 1:1 page tables when the guest has paging disabled. Also do a printk instead of VMX_DBG_LOG() anytime we crash a domain.

tools/libxc/xc_vmx_build.c +1 -1
@@ -10,7 +10,7 @@
 #include <zlib.h>
 #include "linux_boot_params.h"
 
-#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
+#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER)
 #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
 
 #define round_pgup(_p)    (((_p)+(PAGE_SIZE-1))&PAGE_MASK)

===== xen/arch/x86/domain.c 1.200 vs edited =====

xen/arch/x86/domain.c +0 -1
@@ -339,7 +339,6 @@
     }
 
     ed->arch.schedule_tail = arch_vmx_do_launch;
-    clear_bit(VMX_CPU_STATE_PG_ENABLED, &ed->arch.arch_vmx.cpu_state);
 
 #if defined (__i386)
     ed->arch.arch_vmx.vmx_platform.real_mode_data = 

===== xen/arch/x86/vmx.c 1.58 vs edited =====

xen/arch/x86/vmx.c +29 -29

160 lines not on this page · raw message

===== xen/arch/x86/vmx_io.c 1.24 vs edited =====

xen/arch/x86/vmx_io.c +1 -1
@@ -430,7 +430,7 @@
 void vmx_do_resume(struct exec_domain *d) 
 {
     vmx_stts();
-    if ( test_bit(VMX_CPU_STATE_PG_ENABLED, &d->arch.arch_vmx.cpu_state) )
+    if ( vmx_paging_enabled(d) )
         __vmwrite(GUEST_CR3, pagetable_val(d->arch.shadow_table));
     else
         // paging is not enabled in the guest

===== xen/arch/x86/vmx_platform.c 1.19 vs edited =====

xen/arch/x86/vmx_platform.c +7 -3
@@ -418,8 +418,12 @@
     }
 
     if ((guest_eip & PAGE_MASK) == ((guest_eip + inst_len) & PAGE_MASK)) {
-        gpte = gva_to_gpte(guest_eip);
-        mfn = phys_to_machine_mapping(l1e_get_pfn(gpte));
+        if (vmx_paging_enabled(current)) {
+                gpte = gva_to_gpte(guest_eip);
+                mfn = phys_to_machine_mapping(l1e_get_pfn(gpte));
+        } else {
+                mfn = phys_to_machine_mapping(guest_eip >> PAGE_SHIFT);
+        }
         ma = (mfn << PAGE_SHIFT) | (guest_eip & (PAGE_SIZE - 1));
         inst_start = (unsigned char *)map_domain_mem(ma);
                 
@@ -509,7 +513,7 @@
     } else
         p->count = 1;
 
-    if (pvalid)
+    if ((pvalid) && vmx_paging_enabled(current))
         p->u.pdata = (void *) gva_to_gpa(p->u.data);
 
 #if 0

===== xen/arch/x86/vmx_vmcs.c 1.25 vs edited =====

xen/arch/x86/vmx_vmcs.c +1 -1
@@ -291,7 +291,7 @@
 
     /* Initally PG, PE are not set*/
     shadow_cr = host_env->cr0;
-    shadow_cr &= ~(X86_CR0_PE | X86_CR0_PG);
+    shadow_cr &= ~X86_CR0_PG;
     error |= __vmwrite(CR0_READ_SHADOW, shadow_cr);
     /* CR3 is set in vmx_final_setup_guest */
     error |= __vmwrite(GUEST_CR4, host_env->cr4);

===== xen/arch/x86/x86_32/traps.c 1.27 vs edited =====

xen/arch/x86/x86_32/traps.c +7 -1
@@ -20,8 +20,9 @@
     unsigned long ss, ds, es, fs, gs, cs;
     unsigned long eip, esp, eflags;
     const char *context;
-
 #ifdef CONFIG_VMX
+    unsigned long cr0, cr3;
+
     if ( VMX_DOMAIN(current) && (regs->eflags == 0) )
     {
         __vmread(GUEST_EIP, &eip);
@@ -33,6 +34,8 @@
         __vmread(GUEST_FS_SELECTOR, &fs);
         __vmread(GUEST_GS_SELECTOR, &gs);
         __vmread(GUEST_CS_SELECTOR, &cs);
+        __vmread(CR0_READ_SHADOW, &cr0);
+        __vmread(GUEST_CR3, &cr3);
         context = "vmx guest";
     }
     else
@@ -77,6 +80,9 @@
     printk("ds: %04lx   es: %04lx   fs: %04lx   gs: %04lx   "
            "ss: %04lx   cs: %04lx\n",
            ds, es, fs, gs, ss, cs);
+#ifdef CONFIG_VMX
+    printk("cr0: %08lx   cr3: %08lx\n", cr0, cr3);
+#endif
 
     if ( GUEST_MODE(regs) )
         show_guest_stack();

===== xen/include/asm-x86/shadow.h 1.97 vs edited =====

xen/include/asm-x86/shadow.h +5 -2
@@ -31,6 +31,9 @@
 #include <asm/processor.h>
 #include <asm/domain_page.h>
 #include <public/dom0_ops.h>
+#ifdef CONFIG_VMX
+#include <asm/vmx.h>
+#endif
 
 /* Shadow PT operation mode : shadow-mode variable in arch_domain. */
 
@@ -1672,8 +1675,8 @@
 
 #ifdef CONFIG_VMX
     if ( VMX_DOMAIN(ed) )
-        paging_enabled =
-            test_bit(VMX_CPU_STATE_PG_ENABLED, &ed->arch.arch_vmx.cpu_state);
+        paging_enabled = vmx_paging_enabled(ed);
+            
     else
 #endif
         // HACK ALERT: there's currently no easy way to figure out if a domU

===== xen/include/asm-x86/vmx.h 1.8 vs edited =====

xen/include/asm-x86/vmx.h +10 -1
@@ -294,5 +294,14 @@
     if (!(cr0 & X86_CR0_TS))
        __vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_NM);
 }
- 
+
+/* Works only for ed == current */
+static inline int vmx_paging_enabled(struct exec_domain *ed)
+{
+    unsigned long cr0;
+
+    __vmread(CR0_READ_SHADOW, &cr0);
+    return (cr0 & X86_CR0_PE) && (cr0 & X86_CR0_PG);
+}
+
 #endif /* __ASM_X86_VMX_H__ */

===== xen/include/asm-x86/vmx_vmcs.h 1.11 vs edited =====

xen/include/asm-x86/vmx_vmcs.h +0 -1
@@ -29,7 +29,6 @@
 
 void vmx_enter_scheduler(void);
 
-#define VMX_CPU_STATE_PG_ENABLED        0       
 #define	VMX_CPU_STATE_ASSIST_ENABLED	1
 
 struct vmcs_struct {