123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /** @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;
- }
|