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:
kaf24@scramble.cl.cam.ac.uk committed 2005-02-08 16:02:44 +00:00
1 parent f337575998
commit 6dd1ba682a
10 files changed
+162 -120

No files matched your search

+2
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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;
}
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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++ )
{
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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
View File
@@ -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))
+56
View File
@@ -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__ */
+84
View File
@@ -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__ */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.