summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKun Qin <kuqin@microsoft.com>2025-04-23 11:43:47 -0700
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2025-06-19 06:17:18 +0000
commit4ea31ba0200ecf734bbb5b6ae75ebce5612fb329 (patch)
tree7749ed3b72777e548c479a6afe08bf888348cb7f
parentaedcb46e6fd260ab39cf0fc63a85c7f8da8aa476 (diff)
downloadedk2-4ea31ba0200ecf734bbb5b6ae75ebce5612fb329.zip
edk2-4ea31ba0200ecf734bbb5b6ae75ebce5612fb329.tar.gz
edk2-4ea31ba0200ecf734bbb5b6ae75ebce5612fb329.tar.bz2
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 <kun.qin@microsoft.com>
-rw-r--r--OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf78
-rw-r--r--OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c116
2 files changed, 194 insertions, 0 deletions
diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf
new file mode 100644
index 0000000..f8d3634
--- /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.<BR>
+# 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 0000000..3ec3826
--- /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.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/MmServicesTableLib.h>
+#include <Protocol/DevicePath.h>
+#include <Protocol/SmmFirmwareVolumeBlock.h>
+
+#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);
+}