@@ -363,7 +363,7 @@ void __init arch_init_memory(void)
if ( l3tab )
{
const l3_pgentry_t *l3idle =
- l4e_to_l3e(idle_pg_table[l4_table_offset(split_va)]);
+ l4e_to_l3e(*virt_to_xen_l4e(split_va));
for ( i = 0; i < l3_table_offset(split_va); ++i )
l3tab[i] = l3idle[i];
@@ -1575,12 +1575,12 @@ void init_xen_l4_slots(l4_pgentry_t *l4t, mfn_t l4mfn,
/* Slot 256: RO M2P (if applicable). */
l4t[l4_table_offset(RO_MPT_VIRT_START)] =
- ro_mpt ? idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)]
+ ro_mpt ? *virt_to_xen_l4e(RO_MPT_VIRT_START)
: l4e_empty();
/* Slot 257: PCI MMCFG. */
l4t[l4_table_offset(PCI_MCFG_VIRT_START)] =
- idle_pg_table[l4_table_offset(PCI_MCFG_VIRT_START)];
+ *virt_to_xen_l4e(PCI_MCFG_VIRT_START);
/* Slot 258: Self linear mappings. */
ASSERT(!mfn_eq(l4mfn, INVALID_MFN));
@@ -1609,7 +1609,7 @@ void init_xen_l4_slots(l4_pgentry_t *l4t, mfn_t l4mfn,
l4_pgentry_t *next;
memcpy(&l4t[l4_table_offset(XEN_VIRT_START)],
- &idle_pg_table[l4_table_offset(XEN_VIRT_START)],
+ virt_to_xen_l4e(XEN_VIRT_START),
(ROOT_PAGETABLE_FIRST_XEN_SLOT + root_pgt_pv_xen_slots -
l4_table_offset(XEN_VIRT_START)) * sizeof(*l4t));
@@ -1629,7 +1629,7 @@ void init_xen_l4_slots(l4_pgentry_t *l4t, mfn_t l4mfn,
: ROOT_PAGETABLE_XEN_SLOTS);
memcpy(&l4t[l4_table_offset(XEN_VIRT_START)],
- &idle_pg_table[l4_table_offset(XEN_VIRT_START)],
+ virt_to_xen_l4e(XEN_VIRT_START),
(ROOT_PAGETABLE_FIRST_XEN_SLOT + slots -
l4_table_offset(XEN_VIRT_START)) * sizeof(*l4t));
}
@@ -1643,7 +1643,7 @@ bool fill_ro_mpt(mfn_t mfn)
if ( !l4e_get_intpte(l4tab[l4_table_offset(RO_MPT_VIRT_START)]) )
{
l4tab[l4_table_offset(RO_MPT_VIRT_START)] =
- idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)];
+ *virt_to_xen_l4e(RO_MPT_VIRT_START);
ret = true;
}
unmap_domain_page(l4tab);
@@ -4476,7 +4476,7 @@ static l3_pgentry_t *virt_to_xen_l3e(unsigned long v)
{
l4_pgentry_t *pl4e;
- pl4e = &idle_pg_table[l4_table_offset(v)];
+ pl4e = virt_to_xen_l4e(v);
if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) )
{
bool locking = system_state > SYS_STATE_boot;
@@ -133,7 +133,7 @@ static int m2p_mapped(unsigned long spfn)
l2_pgentry_t *l2_ro_mpt;
va = RO_MPT_VIRT_START + spfn * sizeof(*machine_to_phys_mapping);
- l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(va)]);
+ l3_ro_mpt = l4e_to_l3e(*virt_to_xen_l4e(va));
switch ( l3e_get_flags(l3_ro_mpt[l3_table_offset(va)]) &
(_PAGE_PRESENT |_PAGE_PSE))
@@ -166,7 +166,7 @@ static int share_hotadd_m2p_table(struct mem_hotadd_info *info)
v += n << PAGE_SHIFT )
{
n = L2_PAGETABLE_ENTRIES * L1_PAGETABLE_ENTRIES;
- l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[
+ l3e = l4e_to_l3e(*virt_to_xen_l4e(v))[
l3_table_offset(v)];
if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
continue;
@@ -193,7 +193,7 @@ static int share_hotadd_m2p_table(struct mem_hotadd_info *info)
v != RDWR_COMPAT_MPT_VIRT_END;
v += 1 << L2_PAGETABLE_SHIFT )
{
- l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[
+ l3e = l4e_to_l3e(*virt_to_xen_l4e(v))[
l3_table_offset(v)];
if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
continue;
@@ -226,7 +226,7 @@ static void destroy_compat_m2p_mapping(struct mem_hotadd_info *info)
if ( emap > ((RDWR_COMPAT_MPT_VIRT_END - RDWR_COMPAT_MPT_VIRT_START) >> 2) )
emap = (RDWR_COMPAT_MPT_VIRT_END - RDWR_COMPAT_MPT_VIRT_START) >> 2;
- l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(HIRO_COMPAT_MPT_VIRT_START)]);
+ l3_ro_mpt = l4e_to_l3e(*virt_to_xen_l4e(HIRO_COMPAT_MPT_VIRT_START));
ASSERT(l3e_get_flags(l3_ro_mpt[l3_table_offset(HIRO_COMPAT_MPT_VIRT_START)]) & _PAGE_PRESENT);
@@ -261,7 +261,7 @@ static void destroy_m2p_mapping(struct mem_hotadd_info *info)
unsigned long i, va, rwva;
unsigned long smap = info->spfn, emap = info->epfn;
- l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)]);
+ l3_ro_mpt = l4e_to_l3e(*virt_to_xen_l4e(RO_MPT_VIRT_START));
/*
* No need to clean m2p structure existing before the hotplug
@@ -340,7 +340,7 @@ static int setup_compat_m2p_table(struct mem_hotadd_info *info)
va = HIRO_COMPAT_MPT_VIRT_START +
smap * sizeof(*compat_machine_to_phys_mapping);
- l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(va)]);
+ l3_ro_mpt = l4e_to_l3e(*virt_to_xen_l4e(va));
ASSERT(l3e_get_flags(l3_ro_mpt[l3_table_offset(va)]) & _PAGE_PRESENT);
@@ -397,9 +397,9 @@ static int setup_m2p_table(struct mem_hotadd_info *info)
l3_pgentry_t *l3_ro_mpt = NULL;
int ret = 0;
- ASSERT(l4e_get_flags(idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)])
+ ASSERT(l4e_get_flags(*virt_to_xen_l4e(RO_MPT_VIRT_START))
& _PAGE_PRESENT);
- l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)]);
+ l3_ro_mpt = l4e_to_l3e(*virt_to_xen_l4e(RO_MPT_VIRT_START));
smap = (info->spfn & (~((1UL << (L2_PAGETABLE_SHIFT - 3)) -1)));
emap = ((info->epfn + ((1UL << (L2_PAGETABLE_SHIFT - 3)) - 1 )) &
@@ -504,15 +504,14 @@ void __init paging_init(void)
va < DIRECTMAP_VIRT_END && (void *)va < __va(mem_hotplug);
va += (1UL << L4_PAGETABLE_SHIFT) )
{
- if ( !(l4e_get_flags(idle_pg_table[l4_table_offset(va)]) &
- _PAGE_PRESENT) )
+ if ( !(l4e_get_flags(*virt_to_xen_l4e(va)) & _PAGE_PRESENT) )
{
l3_pgentry_t *pl3t = alloc_xen_pagetable();
if ( !pl3t )
goto nomem;
clear_page(pl3t);
- l4e_write(&idle_pg_table[l4_table_offset(va)],
+ l4e_write(virt_to_xen_l4e(va),
l4e_from_paddr(__pa(pl3t), __PAGE_HYPERVISOR_RW));
}
}
@@ -521,7 +520,7 @@ void __init paging_init(void)
if ( (l3_ro_mpt = alloc_xen_pagetable()) == NULL )
goto nomem;
clear_page(l3_ro_mpt);
- l4e_write(&idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)],
+ l4e_write(virt_to_xen_l4e(RO_MPT_VIRT_START),
l4e_from_paddr(__pa(l3_ro_mpt), __PAGE_HYPERVISOR_RO | _PAGE_USER));
/*
@@ -624,8 +623,7 @@ void __init paging_init(void)
/* Create user-accessible L2 directory to map the MPT for compat guests. */
BUILD_BUG_ON(l4_table_offset(RDWR_MPT_VIRT_START) !=
l4_table_offset(HIRO_COMPAT_MPT_VIRT_START));
- l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(
- HIRO_COMPAT_MPT_VIRT_START)]);
+ l3_ro_mpt = l4e_to_l3e(*virt_to_xen_l4e(HIRO_COMPAT_MPT_VIRT_START));
if ( (l2_ro_mpt = alloc_xen_pagetable()) == NULL )
goto nomem;
compat_idle_pg_table_l2 = l2_ro_mpt;
@@ -675,7 +673,7 @@ void __init paging_init(void)
machine_to_phys_mapping_valid = 1;
/* Set up linear page table mapping. */
- l4e_write(&idle_pg_table[l4_table_offset(LINEAR_PT_VIRT_START)],
+ l4e_write(virt_to_xen_l4e(LINEAR_PT_VIRT_START),
l4e_from_paddr(__pa(idle_pg_table), __PAGE_HYPERVISOR_RW));
return;
@@ -729,7 +727,7 @@ static void cleanup_frame_table(struct mem_hotadd_info *info)
while (sva < eva)
{
- l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(sva)])[
+ l3e = l4e_to_l3e(*virt_to_xen_l4e(sva))[
l3_table_offset(sva)];
if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) ||
(l3e_get_flags(l3e) & _PAGE_PSE) )
@@ -843,7 +841,7 @@ void __init subarch_init_memory(void)
v += n << PAGE_SHIFT )
{
n = L2_PAGETABLE_ENTRIES * L1_PAGETABLE_ENTRIES;
- l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[
+ l3e = l4e_to_l3e(*virt_to_xen_l4e(v))[
l3_table_offset(v)];
if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
continue;
@@ -871,7 +869,7 @@ void __init subarch_init_memory(void)
v != RDWR_COMPAT_MPT_VIRT_END;
v += 1 << L2_PAGETABLE_SHIFT )
{
- l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[
+ l3e = l4e_to_l3e(*virt_to_xen_l4e(v))[
l3_table_offset(v)];
if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
continue;
@@ -927,7 +925,7 @@ long subarch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
(v < (unsigned long)(machine_to_phys_mapping + max_page));
i++, v += 1UL << L2_PAGETABLE_SHIFT )
{
- l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[
+ l3e = l4e_to_l3e(*virt_to_xen_l4e(v))[
l3_table_offset(v)];
if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
mfn = last_mfn;
@@ -299,6 +299,11 @@ extern l2_pgentry_t l2_identmap[4*L2_PAGETABLE_ENTRIES];
extern l1_pgentry_t l1_fixmap[L1_PAGETABLE_ENTRIES];
void paging_init(void);
void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t);
+
+static inline l4_pgentry_t *virt_to_xen_l4e(unsigned long va)
+{
+ return &idle_pg_table[l4_table_offset(va)];
+}
#endif /* !defined(__ASSEMBLY__) */
#define _PAGE_NONE _AC(0x000,U)
Avoid open-coding in a lot of places. No functional change. Signed-off-by: Wei Liu <wei.liu2@citrix.com> --- Is this patch useful or is open-coding preferred? --- xen/arch/x86/mm.c | 14 +++++++------- xen/arch/x86/x86_64/mm.c | 36 +++++++++++++++++------------------- xen/include/asm-x86/page.h | 5 +++++ 3 files changed, 29 insertions(+), 26 deletions(-)