| /** @file | |
| SMM Firmware Volume Block Driver. | |
| Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <PiSmm.h> | |
| #include <Library/SmmServicesTableLib.h> | |
| #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; | |
| } |