diff options
author | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-12-10 08:50:24 +0000 |
---|---|---|
committer | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-12-10 08:50:24 +0000 |
commit | 38837959db04259d0dbfc1ab906330961d5f9d8e (patch) | |
tree | bbfb2b1b9b1bcdbd29848d148dd7b1dd21a53e36 /MdeModulePkg/Core/Dxe | |
parent | 3d5c59747e661e3e45ac5e9f629de83b07f48fb9 (diff) | |
download | edk2-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
Diffstat (limited to 'MdeModulePkg/Core/Dxe')
-rw-r--r-- | MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c | 60 | ||||
-rw-r--r-- | MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c | 17 |
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);
|