From 4cab22343b32fec515813584a2620d6dafe0b1c2 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 4 Jan 2023 16:51:35 +0100 Subject: [PATCH 33/34] ArmVirtPkg/ArmVirtQemu: Avoid early ID map on ThunderX The early ID map used by ArmVirtQemu uses ASID scoped non-global mappings, as this allows us to switch to the permanent ID map seamlessly without the need for explicit TLB maintenance. However, this triggers a known erratum on ThunderX, which does not tolerate non-global mappings that are executable at EL1, as this appears to result in I-cache corruption. (Linux disables the KPTI based Meltdown mitigation on ThunderX for the same reason) So work around this, by detecting the CPU implementor and part number, and proceeding without the early ID map if a ThunderX CPU is detected. Note that this requires the C code to be built with strict alignment again, as we may end up executing it with the MMU and caches off. Signed-off-by: Ard Biesheuvel Acked-by: Laszlo Ersek Tested-by: dann frazier (cherry picked from commit ec54ce1f1ab41b92782b37ae59e752fff0ef9c41) --- ArmVirtPkg/ArmVirtQemu.dsc | 5 +++++ .../AArch64/ArmPlatformHelper.S | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index a3d744931a15..6b4dc213a7f7 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -31,6 +31,7 @@ [Defines] DEFINE SECURE_BOOT_ENABLE = FALSE DEFINE TPM2_ENABLE = FALSE DEFINE TPM2_CONFIG_ENABLE = FALSE + DEFINE CAVIUM_ERRATUM_27456 = FALSE # # Network definition @@ -117,7 +118,11 @@ [LibraryClasses.common.UEFI_DRIVER] UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf [BuildOptions] +!if $(CAVIUM_ERRATUM_27456) == TRUE + GCC:*_*_AARCH64_PP_FLAGS = -DCAVIUM_ERRATUM_27456 +!else GCC:*_*_AARCH64_CC_XIPFLAGS == +!endif !include NetworkPkg/NetworkBuildOptions.dsc.inc diff --git a/ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S b/ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S index 05ccc7f9f043..1c0022c1efd9 100644 --- a/ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S +++ b/ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S @@ -44,6 +44,21 @@ ASM_FUNC(ArmPlatformPeiBootAction) +#ifdef CAVIUM_ERRATUM_27456 + /* + * On Cavium ThunderX, using non-global mappings that are executable at EL1 + * results in I-cache corruption. So just avoid the early ID mapping there. + * + * MIDR implementor 0x43 + * MIDR part numbers 0xA1 0xA2 (but not 0xAF) + */ + mrs x0, midr_el1 // read the MIDR into X0 + ubfx x1, x0, #24, #8 // grab implementor id + ubfx x0, x0, #7, #9 // grab part number bits [11:3] + cmp x1, #0x43 // compare implementor id + ccmp x0, #0xA0 >> 3, #0, eq // compare part# bits [11:3] + b.eq 0f +#endif mrs x0, CurrentEL // check current exception level tbz x0, #3, 0f // bail if above EL1 ret -- 2.39.0