nested-p2m: support 1gb pages
PATCH 1/1 nested-p2m: support 1gb pages
Support 1gb pages for nested-on-nested.
This patch applies on top of the patch series I submitted last week.
Signature · 6 lines
---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
1gb page support.
Signed-off-by Christoph Egger <[email protected]>
xen/arch/x86/mm/hap/nested_hap.c +6 -6
@@ -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,
xen/include/asm-x86/page.h +8 -4
@@ -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)
xen/include/asm-x86/x86_32/page.h +25 -2
@@ -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) {
xen/include/asm-x86/x86_64/page.h +22 -4
@@ -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
[email protected]
http://lists.xensource.com/xen-devel