[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xen-devel
Subject:    [Xen-devel] [PATCH] nested-p2m: support 1gb pages
From:       Christoph Egger <Christoph.Egger () amd ! com>
Date:       2011-08-31 12:52:51
Message-ID: 4E5E2EA3.8010405 () amd ! com
[Download RAW message or body]

Support 1gb pages for nested-on-nested.
This patch applies on top of the patch series I submitted last week.

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

["xen_superpage5.diff" (text/plain)]

1gb page support.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

diff -r 692912bd974f -r 07a4305728d6 xen/arch/x86/mm/hap/nested_hap.c
--- a/xen/arch/x86/mm/hap/nested_hap.c
+++ b/xen/arch/x86/mm/hap/nested_hap.c
@@ -124,19 +124,19 @@ nestedhap_fix_p2m(struct vcpu *v, struct
          l0pg = maddr_to_page(L0_gpa);
          l0mfn = page_to_mfn(l0pg);
 
-         /* Workaround: Map 2m pages instead of 1gb pages till
-          * spage_to_mfn() and page_to_spage() work with
-          * 1gb pages. */
-         if (page_order == PAGE_ORDER_1G)
-             page_order = PAGE_ORDER_2M;
-
          switch (page_order) {
          case PAGE_ORDER_4K:
              break;
+#ifdef __x86_64__
          case PAGE_ORDER_2M:
              l2gfn &= ~GUEST_L2_GFN_MASK;
              l0mfn = _mfn(spage_to_mfn(page_to_spage(l0pg)));
              break;
+         case PAGE_ORDER_1G:
+             l2gfn &= ~GUEST_L3_GFN_MASK;
+             l0mfn = _mfn(spage1gb_to_mfn(page_to_spage1gb(l0pg)));
+             break;
+#endif
          }
 
          rv = set_p2m_entry(p2m, l2gfn, l0mfn,
diff -r 692912bd974f -r 07a4305728d6 xen/include/asm-x86/page.h
--- a/xen/include/asm-x86/page.h
+++ b/xen/include/asm-x86/page.h
@@ -245,13 +245,16 @@ void copy_page_sse2(void *, const void *
 #define __paddr_to_pfn(pa)  ((unsigned long)((pa) >> PAGE_SHIFT))
 
 /* Convert between machine frame numbers and spage-info structures. */
-#define __mfn_to_spage(mfn)  (spage_table + pfn_to_sdx(mfn))
-#define __spage_to_mfn(pg)   sdx_to_pfn((unsigned long)((pg) - spage_table))
+#define __mfn_to_spage(mfn,order) (spage_table + pfn_to_sdx(mfn,order))
+#define __spage_to_mfn(pg,order)  sdx_to_pfn((unsigned long)((pg) - spage_table),order)
 
 /* Convert between page-info structures and spage-info structures. */
 #define page_to_spage(page)  (spage_table+(((page)-frame_table)>>(SUPERPAGE_SHIFT-PAGE_SHIFT)))
 #define spage_to_page(spage)  (frame_table+(((spage)-spage_table)<<(SUPERPAGE_SHIFT-PAGE_SHIFT)))
 
+#define page_to_spage1gb(page)  \
+    (spage_table+(((page)-frame_table) >> (L3_PAGETABLE_SHIFT-PAGE_SHIFT)))
+
 /*
  * We define non-underscored wrappers for above conversion functions. These are
  * overridden in various source files while underscored versions remain intact.
@@ -263,8 +266,9 @@ void copy_page_sse2(void *, const void *
 #define maddr_to_virt(ma)   __maddr_to_virt((unsigned long)(ma))
 #define mfn_to_page(mfn)    __mfn_to_page(mfn)
 #define page_to_mfn(pg)     __page_to_mfn(pg)
-#define mfn_to_spage(mfn)    __mfn_to_spage(mfn)
-#define spage_to_mfn(pg)     __spage_to_mfn(pg)
+#define mfn_to_spage(mfn)   __mfn_to_spage(mfn, PAGE_ORDER_2M)
+#define spage_to_mfn(pg)    __spage_to_mfn(pg, PAGE_ORDER_2M)
+#define spage1gb_to_mfn(pg) __spage_to_mfn(pg, PAGE_ORDER_1G)
 #define maddr_to_page(ma)   __maddr_to_page(ma)
 #define page_to_maddr(pg)   __page_to_maddr(pg)
 #define virt_to_page(va)    __virt_to_page(va)
diff -r 692912bd974f -r 07a4305728d6 xen/include/asm-x86/x86_32/page.h
--- a/xen/include/asm-x86/x86_32/page.h
+++ b/xen/include/asm-x86/x86_32/page.h
@@ -56,8 +56,31 @@
 #define virt_to_pdx(va)         virt_to_mfn(va)
 #define pdx_to_virt(pdx)        mfn_to_virt(pdx)
 
-#define pfn_to_sdx(pfn)         ((pfn)>>(SUPERPAGE_SHIFT-PAGE_SHIFT))
-#define sdx_to_pfn(sdx)         ((sdx)<<(SUPERPAGE_SHIFT-PAGE_SHIFT))
+static inline unsigned long pfn_to_sdx(unsigned long pfn,
+    unsigned int page_order)
+{
+    switch (page_order) {
+    case PAGE_ORDER_4K:
+        return pfn_to_pdx(pfn);
+    case PAGE_ORDER_2M:
+        return (pfn >> (SUPERPAGE_SHIFT-PAGE_SHIFT));
+    default:
+        return ~0UL;
+    }
+}
+
+static inline unsigned long sdx_to_pfn(unsigned long sdx,
+    unsigned int page_order)
+{
+    switch (page_order) {
+    case PAGE_ORDER_4K:
+        return pdx_to_pfn(sdx);
+    case PAGE_ORDER_2M:
+        return (sdx << (SUPERPAGE_SHIFT-PAGE_SHIFT));
+    default:
+        return ~0UL;
+    }
+}
 
 static inline unsigned long __virt_to_maddr(unsigned long va)
 {
diff -r 692912bd974f -r 07a4305728d6 xen/include/asm-x86/x86_64/page.h
--- a/xen/include/asm-x86/x86_64/page.h
+++ b/xen/include/asm-x86/x86_64/page.h
@@ -71,14 +71,32 @@ static inline unsigned long pdx_to_pfn(u
            ((pdx << pfn_pdx_hole_shift) & pfn_top_mask);
 }
 
-static inline unsigned long pfn_to_sdx(unsigned long pfn)
+static inline unsigned long pfn_to_sdx(unsigned long pfn,
+    unsigned int page_order)
 {
-    return pfn_to_pdx(pfn) >> (SUPERPAGE_SHIFT-PAGE_SHIFT);
+    switch (page_order) {
+    case PAGE_ORDER_4K:
+        return pfn_to_pdx(pfn);
+    case PAGE_ORDER_2M:
+        return pfn_to_pdx(pfn) >> (SUPERPAGE_SHIFT-PAGE_SHIFT);
+    case PAGE_ORDER_1G:
+        return pfn_to_pdx(pfn) >> (L3_PAGETABLE_SHIFT-PAGE_SHIFT);
+    }
+    return ~0UL;
 }
 
-static inline unsigned long sdx_to_pfn(unsigned long sdx)
+static inline unsigned long sdx_to_pfn(unsigned long sdx,
+    unsigned int page_order)
 {
-    return pdx_to_pfn(sdx << (SUPERPAGE_SHIFT-PAGE_SHIFT));
+    switch (page_order) {
+    case PAGE_ORDER_4K:
+        return pdx_to_pfn(sdx);
+    case PAGE_ORDER_2M:
+        return pdx_to_pfn(sdx << (SUPERPAGE_SHIFT-PAGE_SHIFT));
+    case PAGE_ORDER_1G:
+        return pdx_to_pfn(sdx << (L3_PAGETABLE_SHIFT-PAGE_SHIFT));
+    }
+    return ~0UL;
 }
 
 static inline unsigned long __virt_to_maddr(unsigned long va)


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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic