* [PATCH] nested-p2m: support 1gb pages
@ 2011-08-31 12:52 Christoph Egger
0 siblings, 0 replies; only message in thread
From: Christoph Egger @ 2011-08-31 12:52 UTC (permalink / raw)
To: xen-devel@lists.xensource.com, Tim Deegan
[-- Attachment #1: Type: text/plain, Size: 374 bytes --]
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
[-- Attachment #2: xen_superpage5.diff --]
[-- Type: text/plain, Size: 5386 bytes --]
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)
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-08-31 12:52 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-31 12:52 [PATCH] nested-p2m: support 1gb pages Christoph Egger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.