mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86_64/mm: switch to new APIs in paging_init
Map and unmap pages instead of relying on the direct map. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Signed-off-by: Hongyan Xia <hongyxia@amazon.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
33a8018d2e
commit
d87e3ff90d
1 file changed
+20
-14
+20
-14
@@ -498,6 +498,7 @@ void __init paging_init(void)
|
||||
l3_pgentry_t *l3_ro_mpt;
|
||||
l2_pgentry_t *pl2e = NULL, *l2_ro_mpt = NULL;
|
||||
struct page_info *l1_pg;
|
||||
mfn_t mfn;
|
||||
|
||||
/*
|
||||
* We setup the L3s for 1:1 mapping if host support memory hotplug
|
||||
@@ -510,22 +511,22 @@ void __init paging_init(void)
|
||||
if ( !(l4e_get_flags(idle_pg_table[l4_table_offset(va)]) &
|
||||
_PAGE_PRESENT) )
|
||||
{
|
||||
l3_pgentry_t *pl3t = alloc_xen_pagetable();
|
||||
l3_pgentry_t *pl3t = alloc_mapped_pagetable(&mfn);
|
||||
|
||||
if ( !pl3t )
|
||||
goto nomem;
|
||||
clear_page(pl3t);
|
||||
UNMAP_DOMAIN_PAGE(pl3t);
|
||||
l4e_write(&idle_pg_table[l4_table_offset(va)],
|
||||
l4e_from_paddr(__pa(pl3t), __PAGE_HYPERVISOR_RW));
|
||||
l4e_from_mfn(mfn, __PAGE_HYPERVISOR_RW));
|
||||
}
|
||||
}
|
||||
|
||||
/* Create user-accessible L2 directory to map the MPT for guests. */
|
||||
if ( (l3_ro_mpt = alloc_xen_pagetable()) == NULL )
|
||||
l3_ro_mpt = alloc_mapped_pagetable(&mfn);
|
||||
if ( !l3_ro_mpt )
|
||||
goto nomem;
|
||||
clear_page(l3_ro_mpt);
|
||||
l4e_write(&idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)],
|
||||
l4e_from_paddr(__pa(l3_ro_mpt), __PAGE_HYPERVISOR_RO | _PAGE_USER));
|
||||
l4e_from_mfn(mfn, __PAGE_HYPERVISOR_RO | _PAGE_USER));
|
||||
|
||||
/*
|
||||
* Allocate and map the machine-to-phys table.
|
||||
@@ -608,12 +609,14 @@ void __init paging_init(void)
|
||||
}
|
||||
if ( !((unsigned long)pl2e & ~PAGE_MASK) )
|
||||
{
|
||||
if ( (l2_ro_mpt = alloc_xen_pagetable()) == NULL )
|
||||
UNMAP_DOMAIN_PAGE(l2_ro_mpt);
|
||||
|
||||
l2_ro_mpt = alloc_mapped_pagetable(&mfn);
|
||||
if ( !l2_ro_mpt )
|
||||
goto nomem;
|
||||
clear_page(l2_ro_mpt);
|
||||
|
||||
l3e_write(&l3_ro_mpt[l3_table_offset(va)],
|
||||
l3e_from_paddr(__pa(l2_ro_mpt),
|
||||
__PAGE_HYPERVISOR_RO | _PAGE_USER));
|
||||
l3e_from_mfn(mfn, __PAGE_HYPERVISOR_RO | _PAGE_USER));
|
||||
pl2e = l2_ro_mpt;
|
||||
ASSERT(!l2_table_offset(va));
|
||||
}
|
||||
@@ -625,15 +628,18 @@ void __init paging_init(void)
|
||||
}
|
||||
#undef CNT
|
||||
#undef MFN
|
||||
UNMAP_DOMAIN_PAGE(l2_ro_mpt);
|
||||
UNMAP_DOMAIN_PAGE(l3_ro_mpt);
|
||||
|
||||
/* Create user-accessible L2 directory to map the MPT for compat guests. */
|
||||
if ( opt_pv32 )
|
||||
{
|
||||
if ( (l2_ro_mpt = alloc_xen_pagetable()) == NULL )
|
||||
mfn = alloc_xen_pagetable_new();
|
||||
if ( mfn_eq(mfn, INVALID_MFN) )
|
||||
goto nomem;
|
||||
compat_idle_pg_table_l2 = l2_ro_mpt;
|
||||
clear_page(l2_ro_mpt);
|
||||
pl2e = l2_ro_mpt;
|
||||
compat_idle_pg_table_l2 = map_domain_page_global(mfn);
|
||||
clear_page(compat_idle_pg_table_l2);
|
||||
pl2e = compat_idle_pg_table_l2;
|
||||
|
||||
/* Allocate and map the compatibility mode machine-to-phys table. */
|
||||
mpt_size = (mpt_size >> 1) + (1UL << (L2_PAGETABLE_SHIFT - 1));
|
||||
|
||||