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>
This commit is contained in:
Kun Qin
2025-04-23 11:43:47 -07:00
committed by mergify[bot]
parent aedcb46e6f
commit 4ea31ba020
2 changed files with 194 additions and 0 deletions

View File

@@ -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

View File

@@ -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);
}