mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/mm: switch to new APIs in arch_init_memory
The function will map and unmap pages on demand. Since we now map and unmap Xen PTE pages, we would like to track the lifetime of mappings so that 1) we do not dereference memory through a variable after it is unmapped, 2) we do not unmap more than once. Therefore, we introduce the UNMAP_DOMAIN_PAGE macro to nullify the variable after unmapping, and ignore NULL. 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
e5f88ef94a
commit
109ecb8945
2 files changed
+16
-6
No files matched your search
+8
-6
@@ -356,19 +356,21 @@ void __init arch_init_memory(void)
|
||||
ASSERT(root_pgt_pv_xen_slots < ROOT_PAGETABLE_PV_XEN_SLOTS);
|
||||
if ( l4_table_offset(split_va) == l4_table_offset(split_va - 1) )
|
||||
{
|
||||
l3_pgentry_t *l3tab = alloc_xen_pagetable();
|
||||
mfn_t l3mfn = alloc_xen_pagetable_new();
|
||||
|
||||
if ( l3tab )
|
||||
if ( !mfn_eq(l3mfn, INVALID_MFN) )
|
||||
{
|
||||
const l3_pgentry_t *l3idle =
|
||||
l4e_to_l3e(idle_pg_table[l4_table_offset(split_va)]);
|
||||
const l3_pgentry_t *l3idle = map_l3t_from_l4e(
|
||||
idle_pg_table[l4_table_offset(split_va)]);
|
||||
l3_pgentry_t *l3tab = map_domain_page(l3mfn);
|
||||
|
||||
for ( i = 0; i < l3_table_offset(split_va); ++i )
|
||||
l3tab[i] = l3idle[i];
|
||||
for ( ; i < L3_PAGETABLE_ENTRIES; ++i )
|
||||
l3tab[i] = l3e_empty();
|
||||
split_l4e = l4e_from_mfn(virt_to_mfn(l3tab),
|
||||
__PAGE_HYPERVISOR_RW);
|
||||
split_l4e = l4e_from_mfn(l3mfn, __PAGE_HYPERVISOR_RW);
|
||||
UNMAP_DOMAIN_PAGE(l3idle);
|
||||
UNMAP_DOMAIN_PAGE(l3tab);
|
||||
}
|
||||
else
|
||||
++root_pgt_pv_xen_slots;
|
||||
|
||||
@@ -72,4 +72,12 @@ static inline void unmap_domain_page_global(const void *va) {};
|
||||
|
||||
#endif /* !CONFIG_DOMAIN_PAGE */
|
||||
|
||||
#define UNMAP_DOMAIN_PAGE(p) do { \
|
||||
if ( p ) \
|
||||
{ \
|
||||
unmap_domain_page(p); \
|
||||
(p) = NULL; \
|
||||
} \
|
||||
} while ( false )
|
||||
|
||||
#endif /* __XEN_DOMAIN_PAGE_H__ */
|
||||