Code Scrub for Dxe Core.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5560 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Implementations for Firmware Volume Block protocol.
|
||||
|
||||
It consumes FV HOBs and creates read-lonly Firmare Volume Block protocol
|
||||
Implementations for Firmware Volume Block protocol.
|
||||
|
||||
It consumes FV HOBs and creates read-lonly Firmare Volume Block protocol
|
||||
instances for each of them.
|
||||
|
||||
Copyright (c) 2006 - 2008, Intel Corporation. <BR>
|
||||
@ -38,10 +38,10 @@ EFI_FW_VOL_BLOCK_DEVICE mFwVolBlock = {
|
||||
{
|
||||
END_DEVICE_PATH_TYPE,
|
||||
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||
{
|
||||
{
|
||||
END_DEVICE_PATH_LENGTH,
|
||||
0
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -52,7 +52,7 @@ EFI_FW_VOL_BLOCK_DEVICE mFwVolBlock = {
|
||||
FwVolBlockReadBlock,
|
||||
(EFI_FVB_WRITE)FwVolBlockWriteBlock,
|
||||
(EFI_FVB_ERASE_BLOCKS)FwVolBlockEraseBlock,
|
||||
NULL
|
||||
NULL
|
||||
},
|
||||
0,
|
||||
NULL,
|
||||
@ -65,8 +65,8 @@ EFI_FW_VOL_BLOCK_DEVICE mFwVolBlock = {
|
||||
/**
|
||||
Retrieves Volume attributes. No polarity translations are done.
|
||||
|
||||
@param This Calling context
|
||||
@param Attributes output buffer which contains attributes
|
||||
@param This Calling context
|
||||
@param Attributes output buffer which contains attributes
|
||||
|
||||
@retval EFI_SUCCESS The firmware volume attributes were returned.
|
||||
|
||||
@ -79,7 +79,7 @@ FwVolBlockGetAttributes (
|
||||
)
|
||||
{
|
||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||
|
||||
|
||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||
|
||||
//
|
||||
@ -95,13 +95,13 @@ FwVolBlockGetAttributes (
|
||||
/**
|
||||
Modifies the current settings of the firmware volume according to the input parameter.
|
||||
|
||||
@param This Calling context
|
||||
@param Attributes input buffer which contains attributes
|
||||
@param This Calling context
|
||||
@param Attributes input buffer which contains attributes
|
||||
|
||||
@retval EFI_SUCCESS The firmware volume attributes were returned.
|
||||
@retval EFI_INVALID_PARAMETER The attributes requested are in conflict with
|
||||
the capabilities as declared in the firmware
|
||||
volume header.
|
||||
@retval EFI_SUCCESS The firmware volume attributes were returned.
|
||||
@retval EFI_INVALID_PARAMETER The attributes requested are in conflict with
|
||||
the capabilities as declared in the firmware
|
||||
volume header.
|
||||
@retval EFI_UNSUPPORTED Not supported.
|
||||
|
||||
**/
|
||||
@ -125,18 +125,18 @@ FwVolBlockSetAttributes (
|
||||
block of the firmware volume), the EraseBlock() function must return
|
||||
EFI_INVALID_PARAMETER without modifying the contents of the firmware volume.
|
||||
|
||||
@param This Calling context
|
||||
@param ... Starting LBA followed by Number of Lba to erase.
|
||||
a -1 to terminate the list.
|
||||
@param This Calling context
|
||||
@param ... Starting LBA followed by Number of Lba to erase.
|
||||
a -1 to terminate the list.
|
||||
|
||||
@retval EFI_SUCCESS The erase request was successfully completed.
|
||||
@retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled
|
||||
state.
|
||||
@retval EFI_DEVICE_ERROR The block device is not functioning correctly
|
||||
and could not be written. The firmware device
|
||||
may have been partially erased.
|
||||
@retval EFI_INVALID_PARAMETER One or more of the LBAs listed in the variable
|
||||
argument list do
|
||||
@retval EFI_SUCCESS The erase request was successfully completed.
|
||||
@retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled
|
||||
state.
|
||||
@retval EFI_DEVICE_ERROR The block device is not functioning correctly
|
||||
and could not be written. The firmware device
|
||||
may have been partially erased.
|
||||
@retval EFI_INVALID_PARAMETER One or more of the LBAs listed in the variable
|
||||
argument list do
|
||||
@retval EFI_UNSUPPORTED Not supported.
|
||||
|
||||
**/
|
||||
@ -155,20 +155,20 @@ FwVolBlockEraseBlock (
|
||||
/**
|
||||
Read the specified number of bytes from the block to the input buffer.
|
||||
|
||||
@param This Indicates the calling context.
|
||||
@param Lba The starting logical block index to read.
|
||||
@param Offset Offset into the block at which to begin reading.
|
||||
@param NumBytes Pointer to a UINT32. At entry, *NumBytes
|
||||
contains the total size of the buffer. At exit,
|
||||
*NumBytes contains the total number of bytes
|
||||
actually read.
|
||||
@param Buffer Pinter to a caller-allocated buffer that
|
||||
contains the destine for the read.
|
||||
@param This Indicates the calling context.
|
||||
@param Lba The starting logical block index to read.
|
||||
@param Offset Offset into the block at which to begin reading.
|
||||
@param NumBytes Pointer to a UINT32. At entry, *NumBytes
|
||||
contains the total size of the buffer. At exit,
|
||||
*NumBytes contains the total number of bytes
|
||||
actually read.
|
||||
@param Buffer Pinter to a caller-allocated buffer that
|
||||
contains the destine for the read.
|
||||
|
||||
@retval EFI_SUCCESS The firmware volume was read successfully.
|
||||
@retval EFI_BAD_BUFFER_SIZE The read was attempted across an LBA boundary.
|
||||
@retval EFI_ACCESS_DENIED Access denied.
|
||||
@retval EFI_DEVICE_ERROR The block device is malfunctioning and could not
|
||||
@retval EFI_SUCCESS The firmware volume was read successfully.
|
||||
@retval EFI_BAD_BUFFER_SIZE The read was attempted across an LBA boundary.
|
||||
@retval EFI_ACCESS_DENIED Access denied.
|
||||
@retval EFI_DEVICE_ERROR The block device is malfunctioning and could not
|
||||
be read.
|
||||
|
||||
**/
|
||||
@ -188,7 +188,7 @@ FwVolBlockReadBlock (
|
||||
UINTN LbaStart;
|
||||
UINTN NumOfBytesRead;
|
||||
UINTN LbaIndex;
|
||||
|
||||
|
||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||
|
||||
//
|
||||
@ -197,7 +197,7 @@ FwVolBlockReadBlock (
|
||||
if ((FvbDevice->FvbAttributes & EFI_FVB2_READ_STATUS) == 0) {
|
||||
return EFI_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
|
||||
LbaIndex = (UINTN) Lba;
|
||||
if (LbaIndex >= FvbDevice->NumBlocks) {
|
||||
//
|
||||
@ -206,7 +206,7 @@ FwVolBlockReadBlock (
|
||||
*NumBytes = 0;
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
|
||||
if (Offset > FvbDevice->LbaCache[LbaIndex].Length) {
|
||||
//
|
||||
// all exceed boundry, read nothing.
|
||||
@ -214,7 +214,7 @@ FwVolBlockReadBlock (
|
||||
*NumBytes = 0;
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
|
||||
NumOfBytesRead = *NumBytes;
|
||||
if (Offset + NumOfBytesRead > FvbDevice->LbaCache[LbaIndex].Length) {
|
||||
//
|
||||
@ -222,7 +222,7 @@ FwVolBlockReadBlock (
|
||||
//
|
||||
NumOfBytesRead = FvbDevice->LbaCache[LbaIndex].Length - Offset;
|
||||
}
|
||||
|
||||
|
||||
LbaStart = FvbDevice->LbaCache[LbaIndex].Base;
|
||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)((UINTN) FvbDevice->BaseAddress);
|
||||
LbaOffset = (UINT8 *) FwVolHeader + LbaStart + Offset;
|
||||
@ -231,38 +231,38 @@ FwVolBlockReadBlock (
|
||||
// Perform read operation
|
||||
//
|
||||
CopyMem (Buffer, LbaOffset, NumOfBytesRead);
|
||||
|
||||
|
||||
if (NumOfBytesRead == *NumBytes) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
*NumBytes = NumOfBytesRead;
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Writes the specified number of bytes from the input buffer to the block.
|
||||
|
||||
@param This Indicates the calling context.
|
||||
@param Lba The starting logical block index to write to.
|
||||
@param Offset Offset into the block at which to begin writing.
|
||||
@param NumBytes Pointer to a UINT32. At entry, *NumBytes
|
||||
contains the total size of the buffer. At exit,
|
||||
*NumBytes contains the total number of bytes
|
||||
actually written.
|
||||
@param Buffer Pinter to a caller-allocated buffer that
|
||||
contains the source for the write.
|
||||
@param This Indicates the calling context.
|
||||
@param Lba The starting logical block index to write to.
|
||||
@param Offset Offset into the block at which to begin writing.
|
||||
@param NumBytes Pointer to a UINT32. At entry, *NumBytes
|
||||
contains the total size of the buffer. At exit,
|
||||
*NumBytes contains the total number of bytes
|
||||
actually written.
|
||||
@param Buffer Pinter to a caller-allocated buffer that
|
||||
contains the source for the write.
|
||||
|
||||
@retval EFI_SUCCESS The firmware volume was written successfully.
|
||||
@retval EFI_BAD_BUFFER_SIZE The write was attempted across an LBA boundary.
|
||||
On output, NumBytes contains the total number of
|
||||
bytes actually written.
|
||||
@retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled
|
||||
state.
|
||||
@retval EFI_DEVICE_ERROR The block device is malfunctioning and could not
|
||||
be written.
|
||||
@retval EFI_SUCCESS The firmware volume was written successfully.
|
||||
@retval EFI_BAD_BUFFER_SIZE The write was attempted across an LBA boundary.
|
||||
On output, NumBytes contains the total number of
|
||||
bytes actually written.
|
||||
@retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled
|
||||
state.
|
||||
@retval EFI_DEVICE_ERROR The block device is malfunctioning and could not
|
||||
be written.
|
||||
@retval EFI_UNSUPPORTED Not supported.
|
||||
|
||||
**/
|
||||
@ -278,16 +278,16 @@ FwVolBlockWriteBlock (
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Get Fvb's base address.
|
||||
|
||||
@param This Indicates the calling context.
|
||||
@param Address Fvb device base address.
|
||||
@param This Indicates the calling context.
|
||||
@param Address Fvb device base address.
|
||||
|
||||
@retval EFI_SUCCESS Successfully got Fvb's base address.
|
||||
@retval EFI_SUCCESS Successfully got Fvb's base address.
|
||||
@retval EFI_UNSUPPORTED Not supported.
|
||||
|
||||
**/
|
||||
@ -299,14 +299,14 @@ FwVolBlockGetPhysicalAddress (
|
||||
)
|
||||
{
|
||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||
|
||||
|
||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||
|
||||
|
||||
if (FvbDevice->FvbAttributes & EFI_FVB2_MEMORY_MAPPED) {
|
||||
*Address = FvbDevice->BaseAddress;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -315,17 +315,17 @@ FwVolBlockGetPhysicalAddress (
|
||||
/**
|
||||
Retrieves the size in bytes of a specific block within a firmware volume.
|
||||
|
||||
@param This Indicates the calling context.
|
||||
@param Lba Indicates the block for which to return the
|
||||
size.
|
||||
@param BlockSize Pointer to a caller-allocated UINTN in which the
|
||||
size of the block is returned.
|
||||
@param NumberOfBlocks Pointer to a caller-allocated UINTN in which the
|
||||
number of consecutive blocks starting with Lba
|
||||
is returned. All blocks in this range have a
|
||||
size of BlockSize.
|
||||
@param This Indicates the calling context.
|
||||
@param Lba Indicates the block for which to return the
|
||||
size.
|
||||
@param BlockSize Pointer to a caller-allocated UINTN in which the
|
||||
size of the block is returned.
|
||||
@param NumberOfBlocks Pointer to a caller-allocated UINTN in which the
|
||||
number of consecutive blocks starting with Lba
|
||||
is returned. All blocks in this range have a
|
||||
size of BlockSize.
|
||||
|
||||
@retval EFI_SUCCESS The firmware volume base address is returned.
|
||||
@retval EFI_SUCCESS The firmware volume base address is returned.
|
||||
@retval EFI_INVALID_PARAMETER The requested LBA is out of range.
|
||||
|
||||
**/
|
||||
@ -342,20 +342,20 @@ FwVolBlockGetBlockSize (
|
||||
EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
|
||||
EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry;
|
||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||
|
||||
|
||||
FvbDevice = FVB_DEVICE_FROM_THIS (This);
|
||||
|
||||
|
||||
//
|
||||
// Do parameter checking
|
||||
//
|
||||
if (Lba >= FvbDevice->NumBlocks) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)((UINTN)FvbDevice->BaseAddress);
|
||||
|
||||
|
||||
PtrBlockMapEntry = FwVolHeader->BlockMap;
|
||||
|
||||
|
||||
//
|
||||
// Search the block map for the given block
|
||||
//
|
||||
@ -368,13 +368,13 @@ FwVolBlockGetBlockSize (
|
||||
//
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
PtrBlockMapEntry++;
|
||||
}
|
||||
|
||||
|
||||
*BlockSize = PtrBlockMapEntry->Length;
|
||||
*NumberOfBlocks = TotalBlocks - (UINTN)Lba;
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -384,16 +384,16 @@ FwVolBlockGetBlockSize (
|
||||
This routine produces a firmware volume block protocol on a given
|
||||
buffer.
|
||||
|
||||
@param BaseAddress base address of the firmware volume image
|
||||
@param Length length of the firmware volume image
|
||||
@param ParentHandle handle of parent firmware volume, if this image
|
||||
came from an FV image file in another firmware
|
||||
volume (ala capsules)
|
||||
@param FvProtocol Firmware volume block protocol produced.
|
||||
@param BaseAddress base address of the firmware volume image
|
||||
@param Length length of the firmware volume image
|
||||
@param ParentHandle handle of parent firmware volume, if this image
|
||||
came from an FV image file in another firmware
|
||||
volume (ala capsules)
|
||||
@param FvProtocol Firmware volume block protocol produced.
|
||||
|
||||
@retval EFI_VOLUME_CORRUPTED Volume corrupted.
|
||||
@retval EFI_OUT_OF_RESOURCES No enough buffer to be allocated.
|
||||
@retval EFI_SUCCESS Successfully produced a FVB protocol on given
|
||||
@retval EFI_VOLUME_CORRUPTED Volume corrupted.
|
||||
@retval EFI_OUT_OF_RESOURCES No enough buffer to be allocated.
|
||||
@retval EFI_SUCCESS Successfully produced a FVB protocol on given
|
||||
buffer.
|
||||
|
||||
**/
|
||||
@ -413,7 +413,7 @@ ProduceFVBProtocolOnBuffer (
|
||||
UINTN LinearOffset;
|
||||
UINT32 FvAlignment;
|
||||
EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry;
|
||||
|
||||
|
||||
FvAlignment = 0;
|
||||
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN) BaseAddress;
|
||||
//
|
||||
@ -436,7 +436,7 @@ ProduceFVBProtocolOnBuffer (
|
||||
return EFI_VOLUME_CORRUPTED;
|
||||
}
|
||||
//
|
||||
// Allocate EFI_FW_VOL_BLOCK_DEVICE
|
||||
// Allocate EFI_FW_VOL_BLOCK_DEVICE
|
||||
//
|
||||
FvbDev = CoreAllocateCopyPool (sizeof (EFI_FW_VOL_BLOCK_DEVICE), &mFwVolBlock);
|
||||
if (FvbDev == NULL) {
|
||||
@ -515,10 +515,10 @@ ProduceFVBProtocolOnBuffer (
|
||||
libraries, consumes FV hobs and NT_NON_MM_FV environment variable and
|
||||
produces instances of FW_VOL_BLOCK_PROTOCOL as appropriate.
|
||||
|
||||
@param ImageHandle The image handle.
|
||||
@param SystemTable The system table.
|
||||
@param ImageHandle The image handle.
|
||||
@param SystemTable The system table.
|
||||
|
||||
@retval EFI_SUCCESS Successfully initialized firmware volume block
|
||||
@retval EFI_SUCCESS Successfully initialized firmware volume block
|
||||
driver.
|
||||
|
||||
**/
|
||||
@ -539,7 +539,7 @@ FwVolBlockDriverInit (
|
||||
//
|
||||
// Produce an FVB protocol for it
|
||||
//
|
||||
ProduceFVBProtocolOnBuffer (FvHob.FirmwareVolume->BaseAddress, FvHob.FirmwareVolume->Length, NULL, NULL);
|
||||
ProduceFVBProtocolOnBuffer (FvHob.FirmwareVolume->BaseAddress, FvHob.FirmwareVolume->Length, NULL, NULL);
|
||||
FvHob.Raw = GET_NEXT_HOB (FvHob);
|
||||
}
|
||||
|
||||
@ -553,22 +553,22 @@ FwVolBlockDriverInit (
|
||||
particular, it can be called by BDS to process a single firmware
|
||||
volume found in a capsule.
|
||||
|
||||
@param FvHeader pointer to a firmware volume header
|
||||
@param Size the size of the buffer pointed to by FvHeader
|
||||
@param FVProtocolHandle the handle on which a firmware volume protocol
|
||||
was produced for the firmware volume passed in.
|
||||
@param FvHeader pointer to a firmware volume header
|
||||
@param Size the size of the buffer pointed to by FvHeader
|
||||
@param FVProtocolHandle the handle on which a firmware volume protocol
|
||||
was produced for the firmware volume passed in.
|
||||
|
||||
@retval EFI_OUT_OF_RESOURCES if an FVB could not be produced due to lack of
|
||||
system resources
|
||||
@retval EFI_VOLUME_CORRUPTED if the volume was corrupted
|
||||
@retval EFI_SUCCESS a firmware volume protocol was produced for the
|
||||
@retval EFI_OUT_OF_RESOURCES if an FVB could not be produced due to lack of
|
||||
system resources
|
||||
@retval EFI_VOLUME_CORRUPTED if the volume was corrupted
|
||||
@retval EFI_SUCCESS a firmware volume protocol was produced for the
|
||||
firmware volume
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
CoreProcessFirmwareVolume (
|
||||
IN VOID *FvHeader,
|
||||
IN UINTN Size,
|
||||
IN UINTN Size,
|
||||
OUT EFI_HANDLE *FVProtocolHandle
|
||||
)
|
||||
{
|
||||
@ -576,18 +576,18 @@ CoreProcessFirmwareVolume (
|
||||
EFI_STATUS Status;
|
||||
|
||||
*FVProtocolHandle = NULL;
|
||||
Status = ProduceFVBProtocolOnBuffer (
|
||||
(EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader,
|
||||
(UINT64)Size,
|
||||
NULL,
|
||||
Status = ProduceFVBProtocolOnBuffer (
|
||||
(EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader,
|
||||
(UINT64)Size,
|
||||
NULL,
|
||||
FVProtocolHandle
|
||||
);
|
||||
//
|
||||
// Since in our implementation we use register-protocol-notify to put a
|
||||
// FV protocol on the FVB protocol handle, we can't directly verify that
|
||||
// the FV protocol was produced. Therefore here we will check the handle
|
||||
// and make sure an FV protocol is on it. This indicates that all went
|
||||
// well. Otherwise we have to assume that the volume was corrupted
|
||||
// and make sure an FV protocol is on it. This indicates that all went
|
||||
// well. Otherwise we have to assume that the volume was corrupted
|
||||
// somehow.
|
||||
//
|
||||
if (!EFI_ERROR(Status)) {
|
||||
|
Reference in New Issue
Block a user