diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index a20fdcaea4..cd70aba60c 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -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;
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index 34cd8457cf..87edfe0a7e 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -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;
diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h
index 45ca742678..0a663b298d 100644
--- a/xen/include/asm-x86/page.h
+++ b/xen/include/asm-x86/page.h
@@ -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)
