From 4ea31ba0200ecf734bbb5b6ae75ebce5612fb329 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 23 Apr 2025 11:43:47 -0700 Subject: [PATCH] OvmfPkg: QemuFlashFvbServices: Introduce Standalone MM instance This update introduces the implementation of QemuFlashFvbServices to support operation with Standalone MM backed platforms. Signed-off-by: Kun Qin --- .../FvbServicesStandaloneMm.inf | 78 ++++++++++++ .../FwBlockServiceStandaloneMm.c | 116 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf new file mode 100644 index 0000000000..f8d36340a8 --- /dev/null +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf @@ -0,0 +1,78 @@ +## @file +# Component description file for QEMU Flash Firmware Volume Block MM driver +# module. +# +# This Standalone MM driver implements and produces the MM Firmware Volue Block Protocol +# for a QEMU flash device. +# +# Copyright (C) 2015, Red Hat, Inc. +# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
+# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = FvbServicesStandaloneMm + FILE_GUID = 834DA76A-4EA1-41C7-9601-FE7A7C564757 + MODULE_TYPE = MM_STANDALONE + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + ENTRY_POINT = FvbInitializeStandaloneMm + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + FvbInfo.c + FwBlockService.c + FwBlockService.h + FwBlockServiceStandaloneMm.c + QemuFlash.c + QemuFlash.h + QemuFlashSmm.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + DevicePathLib + MemoryAllocationLib + MemEncryptSevLib + PcdLib + MmServicesTableLib + StandaloneMmDriverEntryPoint + +[Guids] + +[Protocols] + gEfiSmmFirmwareVolumeBlockProtocolGuid # PROTOCOL ALWAYS_PRODUCED + gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_PRODUCED + +[FixedPcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize + +[FeaturePcd] + gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + +[Depex] + TRUE diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c new file mode 100644 index 0000000000..3ec3826417 --- /dev/null +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c @@ -0,0 +1,116 @@ +/**@file + Functions related to the Firmware Volume Block service whose + implementation is specific to the SMM driver build. + + Copyright (C) 2015, Red Hat, Inc. + Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include + +#include "FwBlockService.h" + +VOID +InstallProtocolInterfaces ( + IN EFI_FW_VOL_BLOCK_DEVICE *FvbDevice + ) +{ + EFI_HANDLE FvbHandle; + EFI_STATUS Status; + + ASSERT (FeaturePcdGet (PcdSmmSmramRequire)); + + // + // There is no SMM service that can install multiple protocols in the SMM + // protocol database in one go. + // + // The SMM Firmware Volume Block protocol structure is the same as the + // Firmware Volume Block protocol structure. + // + FvbHandle = NULL; + DEBUG ((DEBUG_INFO, "Installing QEMU flash SMM FVB\n")); + Status = gMmst->MmInstallProtocolInterface ( + &FvbHandle, + &gEfiSmmFirmwareVolumeBlockProtocolGuid, + EFI_NATIVE_INTERFACE, + &FvbDevice->FwVolBlockInstance + ); + ASSERT_EFI_ERROR (Status); + + Status = gMmst->MmInstallProtocolInterface ( + &FvbHandle, + &gEfiDevicePathProtocolGuid, + EFI_NATIVE_INTERFACE, + FvbDevice->DevicePath + ); + ASSERT_EFI_ERROR (Status); +} + +VOID +InstallVirtualAddressChangeHandler ( + VOID + ) +{ + // + // Nothing. + // +} + +EFI_STATUS +MarkIoMemoryRangeForRuntimeAccess ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + // + // Nothing + // + + return EFI_SUCCESS; +} + +VOID +SetPcdFlashNvStorageBaseAddresses ( + VOID + ) +{ + // + // Do nothing. + // +} + +VOID +UpdateQemuFlashVariablesEnable ( + VOID + ) +{ + // + // Do nothing for Standalone MM. + // +} + +/** + Abstracted entry point for Standalone MM instance. + FVB Standalone MM driver entry point. + + @param[in] ImageHandle A handle for the image that is initializing this + driver + @param[in] MmSystemTable A pointer to the MM system table + + @retval EFI_SUCCESS Variable service successfully initialized. +**/ +EFI_STATUS +EFIAPI +FvbInitializeStandaloneMm ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *MmSystemTable + ) +{ + return FvbInitialize (NULL, NULL); +}