/** @file SMM Firmware Volume Block Driver. Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include "FvbSmmCommon.h" #include "FvbService.h" /** The function installs EFI_SMM_FIRMWARE_VOLUME_BLOCK protocol for each FV in the system. @param[in] FwhInstance The pointer to a FW volume instance structure, which contains the information about one FV. @param[in] InstanceNum The instance number which can be used as a ID to locate this FwhInstance in other functions. @retval EFI_SUCESS Installed successfully. @retval Else Did not install successfully. **/ EFI_STATUS InstallFvbProtocol ( IN EFI_FW_VOL_INSTANCE *FwhInstance, IN UINTN InstanceNum ) { EFI_FW_VOL_BLOCK_DEVICE *FvbDevice; EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; EFI_STATUS Status; EFI_HANDLE FvbHandle; FV_MEMMAP_DEVICE_PATH *FvDevicePath; VOID *TempPtr; FvbDevice = (EFI_FW_VOL_BLOCK_DEVICE *)AllocateRuntimeCopyPool ( sizeof (EFI_FW_VOL_BLOCK_DEVICE), &mFvbDeviceTemplate ); if (FvbDevice == NULL) { return EFI_OUT_OF_RESOURCES; } FvbDevice->Instance = InstanceNum; FwVolHeader = &FwhInstance->VolumeHeader; // // Set up the devicepath // if (FwVolHeader->ExtHeaderOffset == 0) { // // FV does not contains extension header, then produce MEMMAP_DEVICE_PATH // TempPtr = AllocateRuntimeCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH), &mFvMemmapDevicePathTemplate); FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)TempPtr; if (FvbDevice->DevicePath == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } FvDevicePath = (FV_MEMMAP_DEVICE_PATH *)FvbDevice->DevicePath; FvDevicePath->MemMapDevPath.StartingAddress = FwhInstance->FvBase; FvDevicePath->MemMapDevPath.EndingAddress = FwhInstance->FvBase + FwVolHeader->FvLength - 1; } else { TempPtr = AllocateRuntimeCopyPool (sizeof (FV_PIWG_DEVICE_PATH), &mFvPIWGDevicePathTemplate); FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)TempPtr; if (FvbDevice->DevicePath == NULL) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } CopyGuid ( &((FV_PIWG_DEVICE_PATH *)FvbDevice->DevicePath)->FvDevPath.FvName, (GUID *)(UINTN)(FwhInstance->FvBase + FwVolHeader->ExtHeaderOffset) ); } // // Install the SMM Firmware Volume Block Protocol and Device Path Protocol // FvbHandle = NULL; 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); // // Notify the Fvb wrapper driver SMM fvb is ready // FvbHandle = NULL; Status = gBS->InstallProtocolInterface ( &FvbHandle, &gEfiSmmFirmwareVolumeBlockProtocolGuid, EFI_NATIVE_INTERFACE, &FvbDevice->FwVolBlockInstance ); return Status; } /** The driver entry point for SMM Firmware Volume Block Driver. The function does the necessary initialization work Firmware Volume Block Driver. @param[in] ImageHandle The firmware allocated handle for the UEFI image. @param[in] SystemTable A pointer to the EFI system table. @retval EFI_SUCCESS This funtion always return EFI_SUCCESS. It will ASSERT on errors. **/ EFI_STATUS EFIAPI FvbSmmInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { FvbInitialize (); return EFI_SUCCESS; }