# HG changeset patch # User kaf24@scramble.cl.cam.ac.uk # Date 1107878564 0 # Node ID 4dfebfdc7933d133652a94051305cf87d0e33160 # Parent 9db7fbdf56b6b7fca17bbaee7290b8df47a30618 bitkeeper revision 1.1159.252.1 (4208e2a42Fwe83QQfJdFQI8V302tYg) Reorganise mm.h to split out 32-bit and 64-bit definitions. Fix x86_64 definitions to mask out the bits that we don't care about. Signed-off-by: keir.fraser@cl.cam.ac.uk diff -r 9db7fbdf56b6 -r 4dfebfdc7933 .rootkeys --- a/.rootkeys Tue Feb 08 15:42:33 2005 +0000 +++ b/.rootkeys Tue Feb 08 16:02:44 2005 +0000 @@ -1038,6 +1038,7 @@ 41c0c412lQ0NVVN9PsOSznQ-qhOiPA xen/inclu 418fbcfe_WliJPToeVM-9VStvym-hw xen/include/asm-x86/x86_32/asm_defns.h 3ddb79c2ADvRmdexd9y3AYK9_NTx-Q xen/include/asm-x86/x86_32/current.h 3e20b82fl1jmQiKdLy7fxMcutfpjWA xen/include/asm-x86/x86_32/domain_page.h +4208e2a3ZNFroNXbX9OYaOB-xtUyDQ xen/include/asm-x86/x86_32/page.h 3ddb79c3mbqEM7QQr3zVq7NiBNhouA xen/include/asm-x86/x86_32/regs.h 3e7f358aG11EvMI9VJ4_9hD4LUO7rQ xen/include/asm-x86/x86_32/string.h 3ddb79c3M2n1ROZH6xk3HbyN4CPDqg xen/include/asm-x86/x86_32/uaccess.h @@ -1045,6 +1046,7 @@ 41bf1717bML6GxpclTWJabiaO5W5vg xen/inclu 404f1b9ceJeGVaPNIENm2FkK0AgEOQ xen/include/asm-x86/x86_64/current.h 41febc4b1aCGLsm0Y0b_82h7lFtrEA xen/include/asm-x86/x86_64/domain_page.h 404f1badfXZJZ2sU8sh9PS2EZvd19Q xen/include/asm-x86/x86_64/ldt.h +4208e2a3Fktw4ZttKdDxbhvTQ6brfQ xen/include/asm-x86/x86_64/page.h 404f1bb86rAXB3aLS1vYdcqpJiEcyg xen/include/asm-x86/x86_64/regs.h 40e1966azOJZfNI6Ilthe6Q-T3Hewg xen/include/asm-x86/x86_64/string.h 404f1bc4tWkB9Qr8RkKtZGW5eMQzhw xen/include/asm-x86/x86_64/uaccess.h diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/arch/x86/dom0_ops.c --- a/xen/arch/x86/dom0_ops.c Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/arch/x86/dom0_ops.c Tue Feb 08 16:02:44 2005 +0000 @@ -376,7 +376,7 @@ void arch_getdomaininfo_ctxt( { for ( i = 0; i < 16; i++ ) c->gdt_frames[i] = - l1_pgentry_to_pagenr(ed->arch.perdomain_ptes[i]); + l1_pgentry_to_pfn(ed->arch.perdomain_ptes[i]); c->gdt_ents = GET_GDT_ENTRIES(ed); } c->guestos_ss = ed->arch.guestos_ss; diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/arch/x86/mm.c Tue Feb 08 16:02:44 2005 +0000 @@ -226,7 +226,7 @@ static void __invalidate_shadow_ldt(stru for ( i = 16; i < 32; i++ ) { - pfn = l1_pgentry_to_pagenr(d->arch.perdomain_ptes[i]); + pfn = l1_pgentry_to_pfn(d->arch.perdomain_ptes[i]); if ( pfn == 0 ) continue; d->arch.perdomain_ptes[i] = mk_l1_pgentry(0); page = &frame_table[pfn]; @@ -364,14 +364,14 @@ get_linear_pagetable( if ( (l2_pgentry_val(l2e) >> PAGE_SHIFT) != pfn ) { /* Make sure the mapped frame belongs to the correct domain. */ - if ( unlikely(!get_page_from_pagenr(l2_pgentry_to_pagenr(l2e), d)) ) + if ( unlikely(!get_page_from_pagenr(l2_pgentry_to_pfn(l2e), d)) ) return 0; /* * Make sure that the mapped frame is an already-validated L2 table. * If so, atomically increment the count (checking for overflow). */ - page = &frame_table[l2_pgentry_to_pagenr(l2e)]; + page = &frame_table[l2_pgentry_to_pfn(l2e)]; y = page->u.inuse.type_info; do { x = y; @@ -395,7 +395,7 @@ get_page_from_l1e( l1_pgentry_t l1e, struct domain *d) { unsigned long l1v = l1_pgentry_val(l1e); - unsigned long pfn = l1_pgentry_to_pagenr(l1e); + unsigned long pfn = l1_pgentry_to_pfn(l1e); struct pfn_info *page = &frame_table[pfn]; extern int domain_iomem_in_pfn(struct domain *d, unsigned long pfn); @@ -449,7 +449,7 @@ get_page_from_l2e( } rc = get_page_and_type_from_pagenr( - l2_pgentry_to_pagenr(l2e), + l2_pgentry_to_pfn(l2e), PGT_l1_page_table | (va_idx<> PAGE_SHIFT) != pfn) ) - put_page_and_type(&frame_table[l2_pgentry_to_pagenr(l2e)]); + put_page_and_type(&frame_table[l2_pgentry_to_pfn(l2e)]); } @@ -1670,7 +1670,7 @@ void destroy_gdt(struct exec_domain *ed) for ( i = 0; i < 16; i++ ) { - if ( (pfn = l1_pgentry_to_pagenr(ed->arch.perdomain_ptes[i])) != 0 ) + if ( (pfn = l1_pgentry_to_pfn(ed->arch.perdomain_ptes[i])) != 0 ) put_page_and_type(&frame_table[pfn]); ed->arch.perdomain_ptes[i] = mk_l1_pgentry(0); } @@ -1798,7 +1798,7 @@ long do_update_descriptor( case PGT_gdt_page: /* Disallow updates of Xen-reserved descriptors in the current GDT. */ for_each_exec_domain(current->domain, ed) { - if ( (l1_pgentry_to_pagenr(ed->arch.perdomain_ptes[0]) == pfn) && + if ( (l1_pgentry_to_pfn(ed->arch.perdomain_ptes[0]) == pfn) && (((pa&(PAGE_SIZE-1))>>3) >= FIRST_RESERVED_GDT_ENTRY) && (((pa&(PAGE_SIZE-1))>>3) <= LAST_RESERVED_GDT_ENTRY) ) goto out; @@ -1939,7 +1939,7 @@ void ptwr_flush(const int which) l1pte_propagate_from_guest( d, &l1_pgentry_val(nl1e), &l1_pgentry_val(sl1e[i])); - put_page_type(&frame_table[l1_pgentry_to_pagenr(nl1e)]); + put_page_type(&frame_table[l1_pgentry_to_pfn(nl1e)]); } continue; } diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/arch/x86/x86_32/domain_build.c --- a/xen/arch/x86/x86_32/domain_build.c Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/arch/x86/x86_32/domain_build.c Tue Feb 08 16:02:44 2005 +0000 @@ -262,7 +262,7 @@ int construct_dom0(struct domain *d, for ( count = 0; count < nr_pt_pages; count++ ) { *l1tab = mk_l1_pgentry(l1_pgentry_val(*l1tab) & ~_PAGE_RW); - page = &frame_table[l1_pgentry_to_pagenr(*l1tab)]; + page = &frame_table[l1_pgentry_to_pfn(*l1tab)]; if ( count == 0 ) { page->u.inuse.type_info &= ~PGT_type_mask; diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/arch/x86/x86_32/mm.c --- a/xen/arch/x86/x86_32/mm.c Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/arch/x86/x86_32/mm.c Tue Feb 08 16:02:44 2005 +0000 @@ -164,7 +164,7 @@ void subarch_init_memory(struct domain * } /* M2P table is mappable read-only by privileged domains. */ - m2p_start_mfn = l2_pgentry_to_pagenr( + m2p_start_mfn = l2_pgentry_to_pfn( idle_pg_table[l2_table_offset(RDWR_MPT_VIRT_START)]); for ( i = 0; i < 1024; i++ ) { diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/arch/x86/x86_64/domain_build.c --- a/xen/arch/x86/x86_64/domain_build.c Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/arch/x86/x86_64/domain_build.c Tue Feb 08 16:02:44 2005 +0000 @@ -294,7 +294,7 @@ int construct_dom0(struct domain *d, for ( count = 0; count < nr_pt_pages; count++ ) { *l1tab = mk_l1_pgentry(l1_pgentry_val(*l1tab) & ~_PAGE_RW); - page = &frame_table[l1_pgentry_to_pagenr(*l1tab)]; + page = &frame_table[l1_pgentry_to_pfn(*l1tab)]; /* Read-only mapping + PGC_allocated + page-table page. */ page->count_info = PGC_allocated | 3; diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/arch/x86/x86_64/mm.c --- a/xen/arch/x86/x86_64/mm.c Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/arch/x86/x86_64/mm.c Tue Feb 08 16:02:44 2005 +0000 @@ -199,7 +199,7 @@ void subarch_init_memory(struct domain * l2e = l3_pgentry_to_l2(l3e)[l2_table_offset(v)]; if ( !(l2_pgentry_val(l2e) & _PAGE_PRESENT) ) continue; - m2p_start_mfn = l2_pgentry_to_pagenr(l2e); + m2p_start_mfn = l2_pgentry_to_pfn(l2e); for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ ) { diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/include/asm-x86/page.h --- a/xen/include/asm-x86/page.h Tue Feb 08 15:42:33 2005 +0000 +++ b/xen/include/asm-x86/page.h Tue Feb 08 16:02:44 2005 +0000 @@ -1,39 +1,14 @@ -/****************************************************************************** - * asm-x86/page.h - * - * Definitions relating to page tables. - */ +/* -*- Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */ #ifndef __X86_PAGE_H__ #define __X86_PAGE_H__ -#if defined(__x86_64__) - -#define L1_PAGETABLE_SHIFT 12 -#define L2_PAGETABLE_SHIFT 21 -#define L3_PAGETABLE_SHIFT 30 -#define L4_PAGETABLE_SHIFT 39 - -#define ENTRIES_PER_L1_PAGETABLE 512 -#define ENTRIES_PER_L2_PAGETABLE 512 -#define ENTRIES_PER_L3_PAGETABLE 512 -#define ENTRIES_PER_L4_PAGETABLE 512 - -#define __PAGE_OFFSET (0xFFFF830000000000) - -#elif defined(__i386__) - -#define L1_PAGETABLE_SHIFT 12 -#define L2_PAGETABLE_SHIFT 22 - -#define ENTRIES_PER_L1_PAGETABLE 1024 -#define ENTRIES_PER_L2_PAGETABLE 1024 - -#define __PAGE_OFFSET (0xFC400000) - +#if defined(__i386__) +#include +#elif defined(__x86_64__) +#include #endif -#define PAGE_SHIFT L1_PAGETABLE_SHIFT #ifndef __ASSEMBLY__ #define PAGE_SIZE (1UL << PAGE_SHIFT) #else @@ -44,84 +19,9 @@ #define clear_page(_p) memset((void *)(_p), 0, PAGE_SIZE) #define copy_page(_t,_f) memcpy((void *)(_t), (void *)(_f), PAGE_SIZE) -#ifndef __ASSEMBLY__ -#include -typedef struct { unsigned long l1_lo; } l1_pgentry_t; -typedef struct { unsigned long l2_lo; } l2_pgentry_t; -typedef struct { unsigned long l3_lo; } l3_pgentry_t; -typedef struct { unsigned long l4_lo; } l4_pgentry_t; -#endif /* !__ASSEMBLY__ */ - -/* Strip type from a table entry. */ -#define l1_pgentry_val(_x) ((_x).l1_lo) -#define l2_pgentry_val(_x) ((_x).l2_lo) -#define l3_pgentry_val(_x) ((_x).l3_lo) -#define l4_pgentry_val(_x) ((_x).l4_lo) - -/* Add type to a table entry. */ -#define mk_l1_pgentry(_x) ( (l1_pgentry_t) { (_x) } ) -#define mk_l2_pgentry(_x) ( (l2_pgentry_t) { (_x) } ) -#define mk_l3_pgentry(_x) ( (l3_pgentry_t) { (_x) } ) -#define mk_l4_pgentry(_x) ( (l4_pgentry_t) { (_x) } ) - -/* Turn a typed table entry into a page index. */ -#define l1_pgentry_to_pagenr(_x) (l1_pgentry_val(_x) >> PAGE_SHIFT) -#define l2_pgentry_to_pagenr(_x) (l2_pgentry_val(_x) >> PAGE_SHIFT) -#define l3_pgentry_to_pagenr(_x) (l3_pgentry_val(_x) >> PAGE_SHIFT) -#define l4_pgentry_to_pagenr(_x) (l4_pgentry_val(_x) >> PAGE_SHIFT) - -/* Turn a typed table entry into a physical address. */ -#define l1_pgentry_to_phys(_x) (l1_pgentry_val(_x) & PAGE_MASK) -#define l2_pgentry_to_phys(_x) (l2_pgentry_val(_x) & PAGE_MASK) -#define l3_pgentry_to_phys(_x) (l3_pgentry_val(_x) & PAGE_MASK) -#define l4_pgentry_to_phys(_x) (l4_pgentry_val(_x) & PAGE_MASK) - -/* Pagetable walking. */ -#define l2_pgentry_to_l1(_x) \ - ((l1_pgentry_t *)__va(l2_pgentry_val(_x) & PAGE_MASK)) -#define l3_pgentry_to_l2(_x) \ - ((l2_pgentry_t *)__va(l3_pgentry_val(_x) & PAGE_MASK)) -#define l4_pgentry_to_l3(_x) \ - ((l3_pgentry_t *)__va(l4_pgentry_val(_x) & PAGE_MASK)) - -/* Given a virtual address, get an entry offset into a page table. */ -#define l1_table_offset(_a) \ - (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1)) -#if defined(__i386__) -#define l2_table_offset(_a) \ - ((_a) >> L2_PAGETABLE_SHIFT) -#elif defined(__x86_64__) -#define l2_table_offset(_a) \ - (((_a) >> L2_PAGETABLE_SHIFT) & (ENTRIES_PER_L2_PAGETABLE - 1)) -#define l3_table_offset(_a) \ - (((_a) >> L3_PAGETABLE_SHIFT) & (ENTRIES_PER_L3_PAGETABLE - 1)) -#define l4_table_offset(_a) \ - (((_a) >> L4_PAGETABLE_SHIFT) & (ENTRIES_PER_L4_PAGETABLE - 1)) -#endif - -/* Given a virtual address, get an entry offset into a linear page table. */ -#if defined(__i386__) -#define l1_linear_offset(_a) ((_a) >> PAGE_SHIFT) -#elif defined(__x86_64__) -#define l1_linear_offset(_a) (((_a) & ((1UL << 48) - 1)) >> PAGE_SHIFT) -#endif - -#if defined(__i386__) -#define pagetable_t l2_pgentry_t -#define pagetable_val(_x) ((_x).l2_lo) -#define mk_pagetable(_x) ( (l2_pgentry_t) { (_x) } ) -#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L2_PAGETABLE -#elif defined(__x86_64__) -#define pagetable_t l4_pgentry_t -#define pagetable_val(_x) ((_x).l4_lo) -#define mk_pagetable(_x) ( (l4_pgentry_t) { (_x) } ) -#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L4_PAGETABLE -#endif - #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) -#define page_address(_p) (__va(((_p) - frame_table) << PAGE_SHIFT)) #define pfn_to_page(_pfn) (frame_table + (_pfn)) #define phys_to_page(kaddr) (frame_table + ((kaddr) >> PAGE_SHIFT)) #define virt_to_page(kaddr) (frame_table + (__pa(kaddr) >> PAGE_SHIFT)) diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/include/asm-x86/x86_32/page.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-x86/x86_32/page.h Tue Feb 08 16:02:44 2005 +0000 @@ -0,0 +1,56 @@ +/* -*- Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */ + +#ifndef __X86_32_PAGE_H__ +#define __X86_32_PAGE_H__ + +#define L1_PAGETABLE_SHIFT 12 +#define L2_PAGETABLE_SHIFT 22 +#define PAGE_SHIFT L1_PAGETABLE_SHIFT + +#define ENTRIES_PER_L1_PAGETABLE 1024 +#define ENTRIES_PER_L2_PAGETABLE 1024 + +#define __PAGE_OFFSET (0xFC400000) + +#ifndef __ASSEMBLY__ +#include +typedef struct { unsigned long l1_lo; } l1_pgentry_t; +typedef struct { unsigned long l2_lo; } l2_pgentry_t; +#endif /* !__ASSEMBLY__ */ + +/* Strip type from a table entry. */ +#define l1_pgentry_val(_x) ((_x).l1_lo) +#define l2_pgentry_val(_x) ((_x).l2_lo) + +/* Add type to a table entry. */ +#define mk_l1_pgentry(_x) ( (l1_pgentry_t) { (_x) } ) +#define mk_l2_pgentry(_x) ( (l2_pgentry_t) { (_x) } ) + +/* Turn a typed table entry into a physical address. */ +#define l1_pgentry_to_phys(_x) (l1_pgentry_val(_x) & PAGE_MASK) +#define l2_pgentry_to_phys(_x) (l2_pgentry_val(_x) & PAGE_MASK) + +/* Turn a typed table entry into a page index. */ +#define l1_pgentry_to_pfn(_x) (l1_pgentry_val(_x) >> PAGE_SHIFT) +#define l2_pgentry_to_pfn(_x) (l2_pgentry_val(_x) >> PAGE_SHIFT) + +/* Pagetable walking. */ +#define l2_pgentry_to_l1(_x) \ + ((l1_pgentry_t *)__va(l2_pgentry_to_phys(_x))) + +/* Given a virtual address, get an entry offset into a page table. */ +#define l1_table_offset(_a) \ + (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1)) +#define l2_table_offset(_a) \ + ((_a) >> L2_PAGETABLE_SHIFT) + +/* Given a virtual address, get an entry offset into a linear page table. */ +#define l1_linear_offset(_a) ((_a) >> PAGE_SHIFT) + +/* Root page-table definitions. */ +#define pagetable_t l2_pgentry_t +#define pagetable_val(_x) ((_x).l2_lo) +#define mk_pagetable(_x) ( (l2_pgentry_t) { (_x) } ) +#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L2_PAGETABLE + +#endif /* __X86_32_PAGE_H__ */ diff -r 9db7fbdf56b6 -r 4dfebfdc7933 xen/include/asm-x86/x86_64/page.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-x86/x86_64/page.h Tue Feb 08 16:02:44 2005 +0000 @@ -0,0 +1,84 @@ +/* -*- Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */ + +#ifndef __X86_64_PAGE_H__ +#define __X86_64_PAGE_H__ + +#define L1_PAGETABLE_SHIFT 12 +#define L2_PAGETABLE_SHIFT 21 +#define L3_PAGETABLE_SHIFT 30 +#define L4_PAGETABLE_SHIFT 39 +#define PAGE_SHIFT L1_PAGETABLE_SHIFT + +#define ENTRIES_PER_L1_PAGETABLE 512 +#define ENTRIES_PER_L2_PAGETABLE 512 +#define ENTRIES_PER_L3_PAGETABLE 512 +#define ENTRIES_PER_L4_PAGETABLE 512 + +#define __PAGE_OFFSET (0xFFFF830000000000) + +/* These may increase in future (phys. bits in particular). */ +#define PADDR_BITS 40 +#define VADDR_BITS 48 +#define PADDR_MASK ((1UL << PADDR_BITS)-1) +#define VADDR_MASK ((1UL << VADDR_BITS)-1) + +#ifndef __ASSEMBLY__ +#include +typedef struct { unsigned long l1_lo; } l1_pgentry_t; +typedef struct { unsigned long l2_lo; } l2_pgentry_t; +typedef struct { unsigned long l3_lo; } l3_pgentry_t; +typedef struct { unsigned long l4_lo; } l4_pgentry_t; +#endif /* !__ASSEMBLY__ */ + +/* Strip type from a table entry. */ +#define l1_pgentry_val(_x) ((_x).l1_lo) +#define l2_pgentry_val(_x) ((_x).l2_lo) +#define l3_pgentry_val(_x) ((_x).l3_lo) +#define l4_pgentry_val(_x) ((_x).l4_lo) + +/* Add type to a table entry. */ +#define mk_l1_pgentry(_x) ( (l1_pgentry_t) { (_x) } ) +#define mk_l2_pgentry(_x) ( (l2_pgentry_t) { (_x) } ) +#define mk_l3_pgentry(_x) ( (l3_pgentry_t) { (_x) } ) +#define mk_l4_pgentry(_x) ( (l4_pgentry_t) { (_x) } ) + +/* Turn a typed table entry into a physical address. */ +#define l1_pgentry_to_phys(_x) (l1_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK)) +#define l2_pgentry_to_phys(_x) (l2_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK)) +#define l3_pgentry_to_phys(_x) (l3_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK)) +#define l4_pgentry_to_phys(_x) (l4_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK)) + +/* Turn a typed table entry into a page index. */ +#define l1_pgentry_to_pfn(_x) (l1_pgentry_val(_x) >> PAGE_SHIFT) +#define l2_pgentry_to_pfn(_x) (l2_pgentry_val(_x) >> PAGE_SHIFT) +#define l3_pgentry_to_pfn(_x) (l3_pgentry_val(_x) >> PAGE_SHIFT) +#define l4_pgentry_to_pfn(_x) (l4_pgentry_val(_x) >> PAGE_SHIFT) + +/* Pagetable walking. */ +#define l2_pgentry_to_l1(_x) \ + ((l1_pgentry_t *)__va(l2_pgentry_to_phys(_x))) +#define l3_pgentry_to_l2(_x) \ + ((l2_pgentry_t *)__va(l3_pgentry_to_phys(_x))) +#define l4_pgentry_to_l3(_x) \ + ((l3_pgentry_t *)__va(l4_pgentry_to_phys(_x))) + +/* Given a virtual address, get an entry offset into a page table. */ +#define l1_table_offset(_a) \ + (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1)) +#define l2_table_offset(_a) \ + (((_a) >> L2_PAGETABLE_SHIFT) & (ENTRIES_PER_L2_PAGETABLE - 1)) +#define l3_table_offset(_a) \ + (((_a) >> L3_PAGETABLE_SHIFT) & (ENTRIES_PER_L3_PAGETABLE - 1)) +#define l4_table_offset(_a) \ + (((_a) >> L4_PAGETABLE_SHIFT) & (ENTRIES_PER_L4_PAGETABLE - 1)) + +/* Given a virtual address, get an entry offset into a linear page table. */ +#define l1_linear_offset(_a) (((_a) & VADDR_MASK) >> PAGE_SHIFT) + +/* Root page-table definitions. */ +#define pagetable_t l4_pgentry_t +#define pagetable_val(_x) ((_x).l4_lo) +#define mk_pagetable(_x) ( (l4_pgentry_t) { (_x) } ) +#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L4_PAGETABLE + +#endif /* __X86_64_PAGE_H__ */