@@ -40,8 +40,10 @@ static void __init prepare_boot_identity_mapping(void)
clear_page(boot_second_id);
clear_page(boot_third_id);
- if ( id_offsets[0] >= IDENTITY_MAPPING_AREA_NR_L0 )
- panic("Cannot handle ID mapping above 2TB\n");
+ if ( id_offsets[0] >= XEN_IDENTITY_MAP_L0_END )
+ /* 1TiB occupies 2 slots in zeroeth table */
+ panic("Cannot handle ID mapping above %dTiB\n",
+ XEN_IDENTITY_MAP_L0_END>>1);
/* Link first ID table */
pte = mfn_to_xen_entry(virt_to_mfn(boot_first_id), MT_NORMAL);
@@ -73,8 +75,10 @@ static void __init prepare_runtime_identity_mapping(void)
lpae_t pte;
DECLARE_OFFSETS(id_offsets, id_addr);
- if ( id_offsets[0] >= IDENTITY_MAPPING_AREA_NR_L0 )
- panic("Cannot handle ID mapping above 2TB\n");
+ if ( id_offsets[0] >= XEN_IDENTITY_MAP_L0_END )
+ /* 1TiB occupies 2 slots in zeroeth table */
+ panic("Cannot handle ID mapping above %dTiB\n",
+ XEN_IDENTITY_MAP_L0_END>>1);
/* Link first ID table */
pte = pte_of_xenaddr((vaddr_t)xen_first_id);
@@ -87,11 +87,11 @@
* 2G - 4G Domheap: on-demand-mapped
*
* ARM64 layout:
- * 0x0000000000000000 - 0x000001ffffffffff (2TB, L0 slots [0..3])
+ * 0x0000000000000000 - 0x00007effffffffff (127TB, L0 slots [0..253])
*
* Reserved to identity map Xen
*
- * 0x0000020000000000 - 0x0000027fffffffff (512GB, L0 slot [4])
+ * 0x000007f000000000 - 0x00007fffffffffff (1TB, L0 slot [254..255])
* (Relative offsets)
* 0 - 2M Unmapped
* 2M - 10M Xen text, data, bss
@@ -103,9 +103,6 @@
*
* 32G - 64G Frametable: 56 bytes per page for 2TB of RAM
*
- * 0x0000028000000000 - 0x00007fffffffffff (125TB, L0 slots [5..255])
- * Unused
- *
* 0x0000800000000000 - 0x000084ffffffffff (5TB, L0 slots [256..265])
* 1:1 mapping of RAM
*
@@ -117,8 +114,12 @@
#define XEN_VIRT_START _AT(vaddr_t, MB(2))
#else
-#define IDENTITY_MAPPING_AREA_NR_L0 4
-#define XEN_VM_MAPPING SLOT0(IDENTITY_MAPPING_AREA_NR_L0)
+#define XEN_IDENTITY_MAP_L0_START 0
+#define XEN_IDENTITY_MAP_L0_NUM 254
+#define XEN_IDENTITY_MAP_L0_END (XEN_IDENTITY_MAP_L0_START + \
+ XEN_IDENTITY_MAP_L0_NUM)
+#define XEN_VM_MAP_L0_START (XEN_IDENTITY_MAP_L0_END)
+#define XEN_VM_MAPPING SLOT0(XEN_VM_MAP_L0_START)
#define SLOT0_ENTRY_BITS 39
#define SLOT0(slot) (_AT(vaddr_t,slot) << SLOT0_ENTRY_BITS)
@@ -156,7 +156,7 @@ static void __init __maybe_unused build_assertions(void)
* with it.
*/
#define CHECK_OVERLAP_WITH_IDMAP(virt) \
- BUILD_BUG_ON(zeroeth_table_offset(virt) < IDENTITY_MAPPING_AREA_NR_L0)
+ BUILD_BUG_ON(zeroeth_table_offset(virt) < XEN_IDENTITY_MAP_L0_END)
CHECK_OVERLAP_WITH_IDMAP(XEN_VIRT_START);
CHECK_OVERLAP_WITH_IDMAP(VMAP_VIRT_START);
On some platforms, the memory regions could be: (XEN) MODULE[0]: 00000807f6df0000 - 00000807f6f3e000 Xen (XEN) MODULE[1]: 00000807f8054000 - 00000807f8056000 Device Tree (XEN) MODULE[2]: 00000000fa834000 - 00000000fc5de1d5 Ramdisk (XEN) MODULE[3]: 00000000fc5df000 - 00000000ffb3f810 Kernel In this case, the Xen binary is loaded above 2TiB. 2TiB is the maximum identity map space supported by Xen, thus it fails to boot up due to the out of the range. This patch introduces several macros to present the zeroth page table's slot numbers for easier readable. Based on the defined macros, it enlarges identity map space to 127TiB, which can support the memory space [0x0 .. 0x00007eff_ffff_ffff] so has flexibility for various platforms. Fixes: 1c78d76b67 ("xen/arm64: mm: Introduce helpers to prepare/enable/disable") Reported-by: Alexey Klimov <alexey.klimov@linaro.org> Signed-off-by: Leo Yan <leo.yan@linaro.org> --- xen/arch/arm/arm64/mm.c | 12 ++++++++---- xen/arch/arm/include/asm/config.h | 15 ++++++++------- xen/arch/arm/mm.c | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-)