Some of the line lengths in this driver are atrocious. While we have to put up with the status quo outside of OvmfPkg, we can at least rewrap this driver before refactoring it. In the FvbInitialize() function there's no way around introducing two local variables, just for the sake of sensibly rewrapping the code. Furthermore, in "FwBlockService.c" the function comment blocks are now indented; their original position causes diff to print bogus function names at the top of hunks. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18666 6f19259b-4bc3-4df7-8a09-765794883524
148 lines
4.2 KiB
C
148 lines
4.2 KiB
C
/**@file
|
|
|
|
Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
|
|
|
|
This program and the accompanying materials are licensed and made available
|
|
under the terms and conditions of the BSD License which accompanies this
|
|
distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
Module Name:
|
|
|
|
FvbInfo.c
|
|
|
|
Abstract:
|
|
|
|
Defines data structure that is the volume header found.These data is intent
|
|
to decouple FVB driver with FV header.
|
|
|
|
**/
|
|
|
|
//
|
|
// The package level header files this module uses
|
|
//
|
|
#include <PiDxe.h>
|
|
//
|
|
// The protocols, PPI and GUID defintions for this module
|
|
//
|
|
#include <Guid/EventGroup.h>
|
|
#include <Guid/FirmwareFileSystem2.h>
|
|
#include <Guid/SystemNvDataGuid.h>
|
|
#include <Protocol/FirmwareVolumeBlock.h>
|
|
#include <Protocol/DevicePath.h>
|
|
//
|
|
// The Library classes this module consumes
|
|
//
|
|
#include <Library/UefiLib.h>
|
|
#include <Library/UefiDriverEntryPoint.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/DxeServicesTableLib.h>
|
|
#include <Library/UefiRuntimeLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/HobLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/PcdLib.h>
|
|
|
|
typedef struct {
|
|
UINT64 FvLength;
|
|
EFI_FIRMWARE_VOLUME_HEADER FvbInfo;
|
|
//
|
|
// EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
|
|
//
|
|
EFI_FV_BLOCK_MAP_ENTRY End[1];
|
|
} EFI_FVB_MEDIA_INFO;
|
|
|
|
EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
|
|
//
|
|
// Systen NvStorage FVB
|
|
//
|
|
{
|
|
FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
|
|
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
|
FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
|
FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),
|
|
{
|
|
{
|
|
0,
|
|
}, // ZeroVector[16]
|
|
EFI_SYSTEM_NV_DATA_FV_GUID,
|
|
FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
|
|
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
|
FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
|
FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),
|
|
EFI_FVH_SIGNATURE,
|
|
EFI_FVB2_MEMORY_MAPPED |
|
|
EFI_FVB2_READ_ENABLED_CAP |
|
|
EFI_FVB2_READ_STATUS |
|
|
EFI_FVB2_WRITE_ENABLED_CAP |
|
|
EFI_FVB2_WRITE_STATUS |
|
|
EFI_FVB2_ERASE_POLARITY |
|
|
EFI_FVB2_ALIGNMENT_16,
|
|
sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
|
|
0, // CheckSum
|
|
0, // ExtHeaderOffset
|
|
{
|
|
0,
|
|
}, // Reserved[1]
|
|
2, // Revision
|
|
{
|
|
{
|
|
(FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
|
|
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
|
|
FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +
|
|
FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize)) /
|
|
FixedPcdGet32 (PcdOvmfFirmwareBlockSize),
|
|
FixedPcdGet32 (PcdOvmfFirmwareBlockSize),
|
|
}
|
|
} // BlockMap[1]
|
|
},
|
|
{
|
|
{
|
|
0,
|
|
0
|
|
}
|
|
} // End[1]
|
|
}
|
|
};
|
|
|
|
EFI_STATUS
|
|
GetFvbInfo (
|
|
IN UINT64 FvLength,
|
|
OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
|
|
)
|
|
{
|
|
STATIC BOOLEAN Checksummed = FALSE;
|
|
UINTN Index;
|
|
|
|
if (!Checksummed) {
|
|
for (Index = 0;
|
|
Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);
|
|
Index += 1) {
|
|
UINT16 Checksum;
|
|
mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = 0;
|
|
Checksum = CalculateCheckSum16 (
|
|
(UINT16*) &mPlatformFvbMediaInfo[Index].FvbInfo,
|
|
mPlatformFvbMediaInfo[Index].FvbInfo.HeaderLength
|
|
);
|
|
mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = Checksum;
|
|
}
|
|
Checksummed = TRUE;
|
|
}
|
|
|
|
for (Index = 0;
|
|
Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);
|
|
Index += 1) {
|
|
if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {
|
|
*FvbInfo = &mPlatformFvbMediaInfo[Index].FvbInfo;
|
|
return EFI_SUCCESS;
|
|
}
|
|
}
|
|
|
|
return EFI_NOT_FOUND;
|
|
}
|