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