mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86_64/mm: introduce pl2e in paging_init
We will soon map and unmap pages in paging_init(). Introduce pl2e so that we can use l2_ro_mpt to point to the page table itself. No functional change. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
dd68f2e49b
commit
33a8018d2e
1 file changed
+9
-7
@@ -496,7 +496,7 @@ void __init paging_init(void)
|
||||
unsigned long i, mpt_size, va;
|
||||
unsigned int n, memflags;
|
||||
l3_pgentry_t *l3_ro_mpt;
|
||||
l2_pgentry_t *l2_ro_mpt = NULL;
|
||||
l2_pgentry_t *pl2e = NULL, *l2_ro_mpt = NULL;
|
||||
struct page_info *l1_pg;
|
||||
|
||||
/*
|
||||
@@ -546,7 +546,7 @@ void __init paging_init(void)
|
||||
(L2_PAGETABLE_SHIFT - 3 + PAGE_SHIFT)));
|
||||
|
||||
if ( cpu_has_page1gb &&
|
||||
!((unsigned long)l2_ro_mpt & ~PAGE_MASK) &&
|
||||
!((unsigned long)pl2e & ~PAGE_MASK) &&
|
||||
(mpt_size >> L3_PAGETABLE_SHIFT) > (i >> PAGETABLE_ORDER) )
|
||||
{
|
||||
unsigned int k, holes;
|
||||
@@ -606,7 +606,7 @@ void __init paging_init(void)
|
||||
memset((void *)(RDWR_MPT_VIRT_START + (i << L2_PAGETABLE_SHIFT)),
|
||||
0xFF, 1UL << L2_PAGETABLE_SHIFT);
|
||||
}
|
||||
if ( !((unsigned long)l2_ro_mpt & ~PAGE_MASK) )
|
||||
if ( !((unsigned long)pl2e & ~PAGE_MASK) )
|
||||
{
|
||||
if ( (l2_ro_mpt = alloc_xen_pagetable()) == NULL )
|
||||
goto nomem;
|
||||
@@ -614,13 +614,14 @@ void __init paging_init(void)
|
||||
l3e_write(&l3_ro_mpt[l3_table_offset(va)],
|
||||
l3e_from_paddr(__pa(l2_ro_mpt),
|
||||
__PAGE_HYPERVISOR_RO | _PAGE_USER));
|
||||
pl2e = l2_ro_mpt;
|
||||
ASSERT(!l2_table_offset(va));
|
||||
}
|
||||
/* NB. Cannot be GLOBAL: guest user mode should not see it. */
|
||||
if ( l1_pg )
|
||||
l2e_write(l2_ro_mpt, l2e_from_page(
|
||||
l2e_write(pl2e, l2e_from_page(
|
||||
l1_pg, /*_PAGE_GLOBAL|*/_PAGE_PSE|_PAGE_USER|_PAGE_PRESENT));
|
||||
l2_ro_mpt++;
|
||||
pl2e++;
|
||||
}
|
||||
#undef CNT
|
||||
#undef MFN
|
||||
@@ -632,6 +633,7 @@ void __init paging_init(void)
|
||||
goto nomem;
|
||||
compat_idle_pg_table_l2 = l2_ro_mpt;
|
||||
clear_page(l2_ro_mpt);
|
||||
pl2e = l2_ro_mpt;
|
||||
|
||||
/* Allocate and map the compatibility mode machine-to-phys table. */
|
||||
mpt_size = (mpt_size >> 1) + (1UL << (L2_PAGETABLE_SHIFT - 1));
|
||||
@@ -649,7 +651,7 @@ void __init paging_init(void)
|
||||
sizeof(*compat_machine_to_phys_mapping))
|
||||
BUILD_BUG_ON((sizeof(*frame_table) & ~sizeof(*frame_table)) % \
|
||||
sizeof(*compat_machine_to_phys_mapping));
|
||||
for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++, l2_ro_mpt++ )
|
||||
for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++, pl2e++ )
|
||||
{
|
||||
memflags = MEMF_node(phys_to_nid(i <<
|
||||
(L2_PAGETABLE_SHIFT - 2 + PAGE_SHIFT)));
|
||||
@@ -671,7 +673,7 @@ void __init paging_init(void)
|
||||
(i << L2_PAGETABLE_SHIFT)),
|
||||
0xFF, 1UL << L2_PAGETABLE_SHIFT);
|
||||
/* NB. Cannot be GLOBAL as the ptes get copied into per-VM space. */
|
||||
l2e_write(l2_ro_mpt, l2e_from_page(l1_pg, _PAGE_PSE|_PAGE_PRESENT));
|
||||
l2e_write(pl2e, l2e_from_page(l1_pg, _PAGE_PSE|_PAGE_PRESENT));
|
||||
}
|
||||
#undef CNT
|
||||
#undef MFN
|
||||
|
||||