1gb page support. Signed-off-by: Christoph Egger 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)