summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>2007-12-10 08:50:24 +0000
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>2007-12-10 08:50:24 +0000
commit38837959db04259d0dbfc1ab906330961d5f9d8e (patch)
treebbfb2b1b9b1bcdbd29848d148dd7b1dd21a53e36
parent3d5c59747e661e3e45ac5e9f629de83b07f48fb9 (diff)
downloadedk2-38837959db04259d0dbfc1ab906330961d5f9d8e.zip
edk2-38837959db04259d0dbfc1ab906330961d5f9d8e.tar.gz
edk2-38837959db04259d0dbfc1ab906330961d5f9d8e.tar.bz2
Move sure FvImage buffer at its alignment when install FVB protocol on it.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4380 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c60
-rw-r--r--MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c17
2 files changed, 63 insertions, 14 deletions
diff --git a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c
index 9c99442..d348c82 100644
--- a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c
+++ b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c
@@ -859,14 +859,20 @@ Returns:
EFI_SECTION_TYPE SectionType;
UINT32 AuthenticationStatus;
VOID *Buffer;
+ VOID *AlignedBuffer;
UINTN BufferSize;
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
+ UINT32 FvAlignment;
//
// Read the first (and only the first) firmware volume section
//
SectionType = EFI_SECTION_FIRMWARE_VOLUME_IMAGE;
+ FvHeader = NULL;
+ FvAlignment = 0;
Buffer = NULL;
BufferSize = 0;
+ AlignedBuffer = NULL;
Status = Fv->ReadSection (
Fv,
DriverName,
@@ -878,22 +884,50 @@ Returns:
);
if (!EFI_ERROR (Status)) {
//
- // Produce a FVB protocol for the file
+ // FvImage should be at its required alignment.
//
- Status = ProduceFVBProtocolOnBuffer (
- (EFI_PHYSICAL_ADDRESS) (UINTN) Buffer,
- (UINT64)BufferSize,
- FvHandle,
- NULL
- );
+ FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) Buffer;
+ FvAlignment = 1 << ((FvHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);
+ //
+ // FvAlignment must be more than 8 bytes required by FvHeader structure.
+ //
+ if (FvAlignment < 8) {
+ FvAlignment = 8;
+ }
+
+ AlignedBuffer = AllocateAlignedPool ((UINTN) BufferSize, (UINTN) FvAlignment);
+ if (AlignedBuffer == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ } else {
+ //
+ // Move FvImage into the aligned buffer and release the original buffer.
+ //
+ CopyMem (AlignedBuffer, Buffer, BufferSize);
+ CoreFreePool (Buffer);
+ Buffer = NULL;
+ //
+ // Produce a FVB protocol for the file
+ //
+ Status = ProduceFVBProtocolOnBuffer (
+ (EFI_PHYSICAL_ADDRESS) (UINTN) AlignedBuffer,
+ (UINT64)BufferSize,
+ FvHandle,
+ NULL
+ );
+ }
}
- if (EFI_ERROR (Status) && (Buffer != NULL)) {
- //
- // ReadSection or Produce FVB failed, Free data buffer
- //
- CoreFreePool (Buffer);
-
+ if (EFI_ERROR (Status)) {
+ //
+ // ReadSection or Produce FVB failed, Free data buffer
+ //
+ if (Buffer != NULL) {
+ CoreFreePool (Buffer);
+ }
+
+ if (AlignedBuffer != NULL) {
+ FreeAlignedPool (AlignedBuffer);
+ }
}
return Status;
diff --git a/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c b/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c
index bdac781..d507167 100644
--- a/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c
+++ b/MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c
@@ -413,8 +413,10 @@ Returns:
UINTN BlockIndex;
UINTN BlockIndex2;
UINTN LinearOffset;
+ UINT32 FvAlignment;
EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry;
-
+
+ FvAlignment = 0;
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)BaseAddress;
//
// Validate FV Header, if not as expected, return
@@ -423,6 +425,19 @@ Returns:
return EFI_VOLUME_CORRUPTED;
}
//
+ // Get FvHeader alignment
+ //
+ FvAlignment = 1 << ((FwVolHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);
+ if (FvAlignment < 8) {
+ FvAlignment = 8;
+ }
+ if ((UINTN)BaseAddress % FvAlignment != 0) {
+ //
+ // FvImage buffer is not at its required alignment.
+ //
+ return EFI_VOLUME_CORRUPTED;
+ }
+ //
// Allocate EFI_FW_VOL_BLOCK_DEVICE
//
FvbDev = CoreAllocateCopyPool (sizeof (EFI_FW_VOL_BLOCK_DEVICE), &mFwVolBlock);