diff --git a/0014-ArmPkg-Add-Pcd-to-disable-EFI_MEMORY_ATTRIBUTE_PROTO.patch b/0014-ArmPkg-Add-Pcd-to-disable-EFI_MEMORY_ATTRIBUTE_PROTO.patch deleted file mode 100644 index b2aab61..0000000 --- a/0014-ArmPkg-Add-Pcd-to-disable-EFI_MEMORY_ATTRIBUTE_PROTO.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 5068dd0dffb843c2fb8aad44471fcf56188af6a7 Mon Sep 17 00:00:00 2001 -From: Oliver Steffen -Date: Mon, 19 Jun 2023 22:32:25 +0200 -Subject: [PATCH 14/14] ArmPkg: Add Pcd to disable - EFI_MEMORY_ATTRIBUTE_PROTOCOL - -Recent versions of shim (15.6 and 15.7) crash when the newly added -EFI_MEMORY_ATTRIBUTE_PROTOCOL is provided by the firmware. To allow -existing installations to boot, provide a workaround in form of a Pcd -that allows tuning it off at build time (defaults to 'enabled'). - -Additionally, check the return code of the protocol installation calls. - -Signed-off-by: Oliver Steffen -Message-ID: <20230619203244.228933-1-osteffen@redhat.com> -Signed-off-by: Gerd Hoffmann ---- - ArmPkg/ArmPkg.dec | 3 +++ - ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 1 + - ArmPkg/Drivers/CpuDxe/CpuDxe.c | 13 +++++++++++-- - 3 files changed, 15 insertions(+), 2 deletions(-) - -diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec -index 1a16d044c94b..e8579c80bf08 100644 ---- a/ArmPkg/ArmPkg.dec -+++ b/ArmPkg/ArmPkg.dec -@@ -172,6 +172,9 @@ [PcdsFixedAtBuild.common] - gArmTokenSpaceGuid.PcdCpuVectorBaseAddress|0xffff0000|UINT64|0x00000004 - gArmTokenSpaceGuid.PcdCpuResetAddress|0x00000000|UINT32|0x00000005 - -+ # Enable/Disable EFI_MEMORY_ATTRIBUTE_PROTOCOL -+ gArmTokenSpaceGuid.PcdEnableEfiMemoryAttributeProtocol|FALSE|BOOLEAN|0x000000EE -+ - # - # ARM Secure Firmware PCDs - # -diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf -index 7d8132200e64..c5878c1ecc2e 100644 ---- a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf -+++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf -@@ -66,6 +66,7 @@ [Guids] - [Pcd.common] - gArmTokenSpaceGuid.PcdVFPEnabled - gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy -+ gArmTokenSpaceGuid.PcdEnableEfiMemoryAttributeProtocol - - [FeaturePcd.common] - gArmTokenSpaceGuid.PcdDebuggerExceptionSupport -diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.c b/ArmPkg/Drivers/CpuDxe/CpuDxe.c -index fc63e527846a..30c5963276e4 100644 ---- a/ArmPkg/Drivers/CpuDxe/CpuDxe.c -+++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.c -@@ -331,10 +331,19 @@ CpuDxeInitialize ( - &mCpuHandle, - &gEfiCpuArchProtocolGuid, - &mCpu, -- &gEfiMemoryAttributeProtocolGuid, -- &mMemoryAttribute, - NULL - ); -+ ASSERT_EFI_ERROR (Status); -+ -+ if (PcdGetBool (PcdEnableEfiMemoryAttributeProtocol)) { -+ Status = gBS->InstallMultipleProtocolInterfaces ( -+ &mCpuHandle, -+ &gEfiMemoryAttributeProtocolGuid, -+ &mMemoryAttribute, -+ NULL -+ ); -+ ASSERT_EFI_ERROR (Status); -+ } - - // - // Make sure GCD and MMU settings match. This API calls gDS->SetMemorySpaceAttributes () --- -2.41.0 - diff --git a/0019-ArmVirtPkg-add-runtime-option-to-enable-disable-Memo.patch b/0019-ArmVirtPkg-add-runtime-option-to-enable-disable-Memo.patch new file mode 100644 index 0000000..58a6c46 --- /dev/null +++ b/0019-ArmVirtPkg-add-runtime-option-to-enable-disable-Memo.patch @@ -0,0 +1,142 @@ +From 9ce0eb4b818cb66f29ec78334e19153268c6ccce Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 6 Dec 2023 13:00:53 +0100 +Subject: [PATCH 19/19] ArmVirtPkg: add runtime option to enable/disable + MemoryAttributesProtocol + +Based on a patch by Ard Biesheuvel + +Usage: + qemu-system-aarch64 $args \ + -fw_cfg name=opt/org.tianocore/MemAttrProtocol,string=y + +Default to 'n' (disabled) for now. + +Signed-off-by: Gerd Hoffmann +--- + .../PlatformBootManagerLib.inf | 2 + + .../PlatformBootManagerLib/PlatformBm.c | 69 +++++++++++++++++++ + 2 files changed, 71 insertions(+) + +diff --git a/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +index 997eb1a4429f..facd81a5d036 100644 +--- a/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf ++++ b/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +@@ -46,6 +46,7 @@ [LibraryClasses] + PcdLib + PlatformBmPrintScLib + QemuBootOrderLib ++ QemuFwCfgSimpleParserLib + QemuLoadImageLib + ReportStatusCodeLib + TpmPlatformHierarchyLib +@@ -73,5 +74,6 @@ [Guids] + [Protocols] + gEfiFirmwareVolume2ProtocolGuid + gEfiGraphicsOutputProtocolGuid ++ gEfiMemoryAttributeProtocolGuid + gEfiPciRootBridgeIoProtocolGuid + gVirtioDeviceProtocolGuid +diff --git a/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBm.c b/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBm.c +index 85c01351b09d..a50b9aec0f2c 100644 +--- a/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBm.c ++++ b/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBm.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1111,6 +1112,49 @@ PlatformBootManagerBeforeConsole ( + FilterAndProcess (&gEfiPciIoProtocolGuid, IsVirtioPciSerial, SetupVirtioSerial); + } + ++/** ++ Uninstall the EFI memory attribute protocol if it exists. ++**/ ++STATIC ++VOID ++UninstallEfiMemoryAttributesProtocol ( ++ VOID ++ ) ++{ ++ EFI_STATUS Status; ++ EFI_HANDLE Handle; ++ UINTN Size; ++ VOID *MemoryAttributeProtocol; ++ ++ Size = sizeof (Handle); ++ Status = gBS->LocateHandle ( ++ ByProtocol, ++ &gEfiMemoryAttributeProtocolGuid, ++ NULL, ++ &Size, ++ &Handle ++ ); ++ ++ if (EFI_ERROR (Status)) { ++ ASSERT (Status == EFI_NOT_FOUND); ++ return; ++ } ++ ++ Status = gBS->HandleProtocol ( ++ Handle, ++ &gEfiMemoryAttributeProtocolGuid, ++ &MemoryAttributeProtocol ++ ); ++ ASSERT_EFI_ERROR (Status); ++ ++ Status = gBS->UninstallProtocolInterface ( ++ Handle, ++ &gEfiMemoryAttributeProtocolGuid, ++ MemoryAttributeProtocol ++ ); ++ ASSERT_EFI_ERROR (Status); ++} ++ + /** + Do the platform specific action after the console is ready + Possible things that can be done in PlatformBootManagerAfterConsole: +@@ -1129,12 +1173,37 @@ PlatformBootManagerAfterConsole ( + ) + { + RETURN_STATUS Status; ++ BOOLEAN MemAttrProtocol; + + // + // Show the splash screen. + // + BootLogoEnableLogo (); + ++ // ++ // Work around shim's terminally broken use of the EFI memory attributes ++ // protocol, by just uninstalling it when requested on the QEMU command line. ++ // ++ Status = QemuFwCfgParseBool ( ++ "opt/org.tianocore/MemAttrProtocol", ++ &MemAttrProtocol ++ ); ++ if (RETURN_ERROR (Status)) { ++ // default ++ MemAttrProtocol = FALSE; ++ } ++ ++ DEBUG (( ++ DEBUG_ERROR, ++ "%a: MemAttrProtocol = %a\n", ++ __func__, ++ MemAttrProtocol ? "yes" : "no" ++ )); ++ ++ if (!MemAttrProtocol) { ++ UninstallEfiMemoryAttributesProtocol (); ++ } ++ + // + // Process QEMU's -kernel command line option. The kernel booted this way + // will receive ACPI tables: in PlatformBootManagerBeforeConsole(), we +-- +2.43.0 + diff --git a/edk2.spec b/edk2.spec index 859cfdf..f524974 100644 --- a/edk2.spec +++ b/edk2.spec @@ -109,13 +109,13 @@ Patch0010: 0010-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch Patch0011: 0011-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch Patch0012: 0012-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch Patch0013: 0013-UefiCpuPkg-MpInitLib-fix-apic-mode-for-cpu-hotplug.patch -Patch0014: 0014-ArmPkg-Add-Pcd-to-disable-EFI_MEMORY_ATTRIBUTE_PROTO.patch Patch0015: 0015-CryptoPkg-CrtLib-add-stat.h.patch Patch0016: 0016-CryptoPkg-CrtLib-add-access-open-read-write-close-sy.patch Patch0017: 0017-OvmfPkg-set-PcdVariableStoreSize-PcdMaxVolatileVaria.patch %if 0%{?fedora} >= 38 || 0%{?rhel} >= 10 Patch0018: 0018-silence-.-has-a-LOAD-segment-with-RWX-permissions-wa.patch %endif +Patch0019: 0019-ArmVirtPkg-add-runtime-option-to-enable-disable-Memo.patch # python3-devel and libuuid-devel are required for building tools.