xen/arm: Enlarge identity map space to 10TB

On ADLink AVA platform (Ampere Altra SoC with 32 Arm Neoverse N1 cores),
the physical memory regions are:

  DRAM memory regions:
    Node[0] Region[0]: 0x000080000000 - 0x0000ffffffff
    Node[0] Region[1]: 0x080000000000 - 0x08007fffffff
    Node[0] Region[2]: 0x080100000000 - 0x0807ffffffff

The UEFI loads Xen hypervisor and DTB into the high memory, the kernel
and ramdisk images are loaded into the low memory space:

  (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 8TB, which exceeds the
maximum supported identity map space of 2TB in Xen. Consequently, the
system fails to boot.

This patch enlarges identity map space to 10TB, allowing module loading
within the range of [0x0 .. 0x000009ff_ffff_ffff].

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>
Tested-by: Henry Wang <Henry.Wang@arm.com>
Release-acked-by: Henry Wang <Henry.Wang@arm.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com>
This commit is contained in:
Leo Yan authored and Julien Grall committed 2023-11-16 14:17:22 +00:00
1 parent 02df8ada5a
commit 6cd046c501
2 files changed
+8 -6

No files matched your search

+4 -2
View File
@@ -41,7 +41,8 @@ static void __init prepare_boot_identity_mapping(void)
clear_page(boot_third_id);
if ( id_offsets[0] >= IDENTITY_MAPPING_AREA_NR_L0 )
panic("Cannot handle ID mapping above 2TB\n");
panic("Cannot handle ID mapping above %uTB\n",
IDENTITY_MAPPING_AREA_NR_L0 >> 1);
/* Link first ID table */
pte = mfn_to_xen_entry(virt_to_mfn(boot_first_id), MT_NORMAL);
@@ -74,7 +75,8 @@ static void __init prepare_runtime_identity_mapping(void)
DECLARE_OFFSETS(id_offsets, id_addr);
if ( id_offsets[0] >= IDENTITY_MAPPING_AREA_NR_L0 )
panic("Cannot handle ID mapping above 2TB\n");
panic("Cannot handle ID mapping above %uTB\n",
IDENTITY_MAPPING_AREA_NR_L0 >> 1);
/* Link first ID table */
pte = pte_of_xenaddr((vaddr_t)xen_first_id);
+4 -4
View File
@@ -19,11 +19,11 @@
* 2G - 4G Domheap: on-demand-mapped
*
* ARM64 layout:
* 0x0000000000000000 - 0x000001ffffffffff (2TB, L0 slots [0..3])
* 0x0000000000000000 - 0x000009ffffffffff (10TB, L0 slots [0..19])
*
* Reserved to identity map Xen
*
* 0x0000020000000000 - 0x0000027fffffffff (512GB, L0 slot [4])
* 0x00000a0000000000 - 0x00000a7fffffffff (512GB, L0 slot [20])
* (Relative offsets)
* 0 - 2M Unmapped
* 2M - 10M Xen text, data, bss
@@ -35,7 +35,7 @@
*
* 32G - 64G Frametable: 56 bytes per page for 2TB of RAM
*
* 0x0000028000000000 - 0x00007fffffffffff (125TB, L0 slots [5..255])
* 0x00000a8000000000 - 0x00007fffffffffff (512GB+117TB, L0 slots [21..255])
* Unused
*
* 0x0000800000000000 - 0x000084ffffffffff (5TB, L0 slots [256..265])
@@ -49,7 +49,7 @@
#define XEN_VIRT_START _AT(vaddr_t, MB(2))
#else
#define IDENTITY_MAPPING_AREA_NR_L0 4
#define IDENTITY_MAPPING_AREA_NR_L0 20
#define XEN_VM_MAPPING SLOT0(IDENTITY_MAPPING_AREA_NR_L0)
#define SLOT0_ENTRY_BITS 39
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.