mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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
This commit is contained in:
1 parent
f337575998
commit
6dd1ba682a
10 files changed
+162
-120
No files matched your search
@@ -1038,6 +1038,7 @@
|
||||
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 @@
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
+10
-10
@@ -226,7 +226,7 @@ static void __invalidate_shadow_ldt(struct exec_domain *d)
|
||||
|
||||
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<<PGT_va_shift), d);
|
||||
|
||||
if ( unlikely(!rc) )
|
||||
@@ -462,7 +462,7 @@ get_page_from_l2e(
|
||||
static void put_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];
|
||||
struct domain *e;
|
||||
|
||||
@@ -512,7 +512,7 @@ static void put_page_from_l2e(l2_pgentry_t l2e, unsigned long pfn)
|
||||
{
|
||||
if ( (l2_pgentry_val(l2e) & _PAGE_PRESENT) &&
|
||||
((l2_pgentry_val(l2e) >> 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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -164,7 +164,7 @@ void subarch_init_memory(struct domain *dom_xen)
|
||||
}
|
||||
|
||||
/* 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++ )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -199,7 +199,7 @@ void subarch_init_memory(struct domain *dom_xen)
|
||||
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++ )
|
||||
{
|
||||
|
||||
+5
-105
@@ -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 <asm/x86_32/page.h>
|
||||
#elif defined(__x86_64__)
|
||||
#include <asm/x86_64/page.h>
|
||||
#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 <xen/config.h>
|
||||
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))
|
||||
|
||||
@@ -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 <xen/config.h>
|
||||
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__ */
|
||||
@@ -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 <xen/config.h>
|
||||
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__ */
|
||||