From 026b722d415b11edcc04e46bbd394b18b61e554d Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 16 Jan 2025 17:20:38 +0100 Subject: [PATCH 17/21] OvmfPkg/X64: add opt/org.tianocore/UninstallMemAttrProtocol support Add support for opt/org.tianocore/UninstallMemAttrProtocol, to allow turning off EFI_MEMORY_ATTRIBUTE_PROTOCOL, simliar to ArmVirtPkg. Signed-off-by: Gerd Hoffmann --- a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -64,6 +64,7 @@ [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId gUefiOvmfPkgTokenSpaceGuid.PcdBootRestrictToFirmware + gUefiOvmfPkgTokenSpaceGuid.PcdUninstallMemAttrProtocol gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate ## CONSUMES @@ -82,6 +83,7 @@ [Protocols] gEfiDxeSmmReadyToLockProtocolGuid # PROTOCOL SOMETIMES_PRODUCED gEfiLoadedImageProtocolGuid # PROTOCOL SOMETIMES_PRODUCED gEfiFirmwareVolume2ProtocolGuid # PROTOCOL SOMETIMES_CONSUMED + gEfiMemoryAttributeProtocolGuid [Guids] gEfiEndOfDxeEventGroupGuid --- a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c +++ b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c @@ -1596,6 +1596,49 @@ SaveS3BootScript ( ASSERT_EFI_ERROR (Status); } +/** + 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 @@ -1616,6 +1659,7 @@ PlatformBootManagerAfterConsole ( ) { EFI_BOOT_MODE BootMode; + BOOLEAN Uninstall; DEBUG ((DEBUG_INFO, "PlatformBootManagerAfterConsole\n")); @@ -1660,6 +1704,25 @@ PlatformBootManagerAfterConsole ( // StoreQemuBootOrder (); + // + // Work around shim's terminally broken use of the EFI memory attributes + // protocol, by uninstalling it if requested on the QEMU command line. + // + // E.g., + // -fw_cfg opt/org.tianocore/UninstallMemAttrProtocol,string=y + // + Uninstall = FixedPcdGetBool (PcdUninstallMemAttrProtocol); + QemuFwCfgParseBool ("opt/org.tianocore/UninstallMemAttrProtocol", &Uninstall); + DEBUG (( + DEBUG_WARN, + "%a: %auninstalling EFI memory protocol\n", + __func__, + Uninstall ? "" : "not " + )); + if (Uninstall) { + UninstallEfiMemoryAttributesProtocol (); + } + // // Process QEMU's -kernel command line option // -- 2.49.0