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

[Xen-changelog] [xen-unstable] hvm: More cleanups around paging interfaces.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1186565643 -3600
# Node ID 511c41a550458d50ae0adb9de2b392ae8a8e4379
# Parent  0f541efbb6d6e3883d103647ff6c8c0d332199dc
hvm: More cleanups around paging interfaces.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/x86/hvm/hvm.c             |   36 ++++++++++++++---------------------
 xen/arch/x86/hvm/svm/svm.c         |   15 --------------
 xen/arch/x86/mm/hap/hap.c          |   38 ++++++++++++-------------------------
 xen/include/asm-x86/hvm/svm/asid.h |    5 ----
 4 files changed, 29 insertions(+), 65 deletions(-)

diff -r 0f541efbb6d6 -r 511c41a55045 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Tue Aug 07 17:30:09 2007 +0100
+++ b/xen/arch/x86/hvm/hvm.c    Wed Aug 08 10:34:03 2007 +0100
@@ -527,30 +527,26 @@ int hvm_set_cr3(unsigned long value)
 
     if ( paging_mode_hap(v->domain) )
     {
+        /* HAP mode. HAP-specific code does all the hard work. */
         v->arch.hvm_vcpu.guest_cr[3] = value;
-        hvm_update_guest_cr3(v, value);
-        goto success;
-    }
-
-    if ( !hvm_paging_enabled(v) )
-    {
+        paging_update_cr3(v);
+    }
+    else if ( !hvm_paging_enabled(v) )
+    {
+        /* Shadow-mode, paging disabled. Just update guest CR3 value. */
         v->arch.hvm_vcpu.guest_cr[3] = value;
-        goto success;
-    }
-
-    if ( value == v->arch.hvm_vcpu.guest_cr[3] )
-    {
-        /* 
-         * This is simple TLB flush, implying the guest has removed some
-         * translation or changed page attributes. Invalidate the shadow.
-         */
+    }
+    else if ( value == v->arch.hvm_vcpu.guest_cr[3] )
+    {
+        /* Shadow-mode TLB flush. Invalidate the shadow. */
         mfn = get_mfn_from_gpfn(value >> PAGE_SHIFT);
         if ( mfn != pagetable_get_pfn(v->arch.guest_table) )
             goto bad_cr3;
+        paging_update_cr3(v);
     }
     else 
     {
-        /* Make a shadow. Check that the PDBR is valid first. */
+        /* Shadow-mode CR3 change. Check PDBR and then make a new shadow. */
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 value = %lx", value);
         mfn = get_mfn_from_gpfn(value >> PAGE_SHIFT);
         if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
@@ -564,11 +560,9 @@ int hvm_set_cr3(unsigned long value)
 
         v->arch.hvm_vcpu.guest_cr[3] = value;
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
-    }
-
-    paging_update_cr3(v);
-
- success:
+        paging_update_cr3(v);
+    }
+
     return 1;
 
  bad_cr3:
diff -r 0f541efbb6d6 -r 511c41a55045 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Tue Aug 07 17:30:09 2007 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c        Wed Aug 08 10:34:03 2007 +0100
@@ -481,7 +481,6 @@ int svm_vmcb_restore(struct vcpu *v, str
     }
 
     paging_update_paging_modes(v);
-    svm_asid_g_update_paging(v);
 
     return 0;
  
@@ -1680,10 +1679,7 @@ static int svm_set_cr0(unsigned long val
         vmcb->cr0 |= X86_CR0_PG | X86_CR0_WP;
 
     if ( (value ^ old_value) & X86_CR0_PG )
-    {
         paging_update_paging_modes(v);
-        svm_asid_g_update_paging(v);
-    }
 
     return 1;
 }
@@ -1770,8 +1766,6 @@ static int mov_to_cr(int gpreg, int cr, 
             v->arch.hvm_vcpu.guest_cr[4] = value;
             vmcb->cr4 = value | (HVM_CR4_HOST_MASK & ~X86_CR4_PAE);
             paging_update_paging_modes(v);
-            /* signal paging update to ASID handler */
-            svm_asid_g_update_paging (v);
             break;
         }
 
@@ -1796,8 +1790,6 @@ static int mov_to_cr(int gpreg, int cr, 
                 if ( old_base_mfn )
                     put_page(mfn_to_page(old_base_mfn));
                 paging_update_paging_modes(v);
-                /* signal paging update to ASID handler */
-                svm_asid_g_update_paging (v);
 
                 HVM_DBG_LOG(DBG_LEVEL_VMMU, 
                             "Update CR3 value = %lx, mfn = %lx",
@@ -1821,11 +1813,7 @@ static int mov_to_cr(int gpreg, int cr, 
          * all TLB entries except global entries.
          */
         if ((old_cr ^ value) & (X86_CR4_PSE | X86_CR4_PGE | X86_CR4_PAE))
-        {
             paging_update_paging_modes(v);
-            /* signal paging update to ASID handler */
-            svm_asid_g_update_paging (v);
-        }
         break;
 
     case 8:
@@ -2206,8 +2194,7 @@ void svm_handle_invlpg(const short invlp
     HVMTRACE_3D(INVLPG, v, (invlpga?1:0), g_vaddr, (invlpga?regs->ecx:0));
 
     paging_invlpg(v, g_vaddr);
-    /* signal invplg to ASID handler */
-    svm_asid_g_invlpg (v, g_vaddr);
+    svm_asid_g_invlpg(v, g_vaddr);
 }
 
 
diff -r 0f541efbb6d6 -r 511c41a55045 xen/arch/x86/mm/hap/hap.c
--- a/xen/arch/x86/mm/hap/hap.c Tue Aug 07 17:30:09 2007 +0100
+++ b/xen/arch/x86/mm/hap/hap.c Wed Aug 08 10:34:03 2007 +0100
@@ -603,38 +603,22 @@ static int hap_invlpg(struct vcpu *v, un
     return 0;
 }
 
-/*
- * HAP guests do not need to take any action on CR3 writes (they are still
- * intercepted, so that Xen's copy of the guest's CR3 can be kept in sync.)
- */
 static void hap_update_cr3(struct vcpu *v, int do_locking)
 {
+    hvm_update_guest_cr3(v, v->arch.hvm_vcpu.guest_cr[3]);
 }
 
 static void hap_update_paging_modes(struct vcpu *v)
 {
-    struct domain *d;
-
-    d = v->domain;
+    struct domain *d = v->domain;
+
     hap_lock(d);
 
-    /* update guest paging mode. Note that we rely on hvm functions to detect
-     * guest's paging mode. So, make sure the shadow registers (CR0, CR4, EFER)
-     * reflect guest's status correctly.
-     */
-    if ( hvm_paging_enabled(v) )
-    {
-        if ( hvm_long_mode_enabled(v) )
-            v->arch.paging.mode = &hap_paging_long_mode;
-        else if ( hvm_pae_enabled(v) )
-            v->arch.paging.mode = &hap_paging_pae_mode;
-        else
-            v->arch.paging.mode = &hap_paging_protected_mode;
-    }
-    else
-    {
-        v->arch.paging.mode = &hap_paging_real_mode;
-    }
+    v->arch.paging.mode =
+        !hvm_paging_enabled(v)   ? &hap_paging_real_mode :
+        hvm_long_mode_enabled(v) ? &hap_paging_long_mode :
+        hvm_pae_enabled(v)       ? &hap_paging_pae_mode  :
+                                   &hap_paging_protected_mode;
 
     v->arch.paging.translate_enabled = hvm_paging_enabled(v);
 
@@ -643,7 +627,11 @@ static void hap_update_paging_modes(stru
         mfn_t mmfn = hap_make_monitor_table(v);
         v->arch.monitor_table = pagetable_from_mfn(mmfn);
         make_cr3(v, mfn_x(mmfn));
-    }
+        hvm_update_host_cr3(v);
+    }
+
+    /* CR3 is effectively updated by a mode change. Flush ASIDs, etc. */
+    hvm_update_guest_cr3(v, v->arch.hvm_vcpu.guest_cr[3]);
 
     hap_unlock(d);
 }
diff -r 0f541efbb6d6 -r 511c41a55045 xen/include/asm-x86/hvm/svm/asid.h
--- a/xen/include/asm-x86/hvm/svm/asid.h        Tue Aug 07 17:30:09 2007 +0100
+++ b/xen/include/asm-x86/hvm/svm/asid.h        Wed Aug 08 10:34:03 2007 +0100
@@ -32,11 +32,6 @@ void svm_asid_inv_asid(struct vcpu *v);
 void svm_asid_inv_asid(struct vcpu *v);
 void svm_asid_inc_generation(void);
 
-static inline void svm_asid_g_update_paging(struct vcpu *v)
-{
-    svm_asid_inv_asid(v);
-}
-
 static inline void svm_asid_g_invlpg(struct vcpu *v, unsigned long g_vaddr)
 {
 #if 0

_______________________________________________
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®.