[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