edk2/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c
Kun Qin aedcb46e6f OvmfPkg: QemuFlashFvbServicesRuntimeDxe: Abstract out SMM/DXE functions
This update refactors QemuFlashFvbServicesRuntimeDxe to abstract out
direct calls to SMM and DXE specific functions.

Specifically, dynamic PCD usage and gBS references have been moved to SMM
specific files.

The constructor functionality has been relocated to a common
implementation and is invoked from their respective entry points.

These changes lay the groundwork for supporting a Standalone MM-based
solution in the future.

Signed-off-by: Kun Qin <kun.qin@microsoft.com>
2025-06-19 06:17:18 +00:00

98 lines
2.1 KiB
C

/**@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/SmmServicesTableLib.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 = gSmst->SmmInstallProtocolInterface (
&FvbHandle,
&gEfiSmmFirmwareVolumeBlockProtocolGuid,
EFI_NATIVE_INTERFACE,
&FvbDevice->FwVolBlockInstance
);
ASSERT_EFI_ERROR (Status);
Status = gSmst->SmmInstallProtocolInterface (
&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
)
{
RETURN_STATUS PcdStatus;
PcdStatus = PcdSetBoolS (PcdOvmfFlashVariablesEnable, TRUE);
ASSERT_RETURN_ERROR (PcdStatus);
}