mirror of https://github.com/acidanthera/audk.git
Make DxeIpl loop find the required section type in peiprocessfile functions.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2395 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
2afce6dff7
commit
d6992908a6
|
@ -383,7 +383,10 @@ Returns:
|
||||||
&Hob
|
&Hob
|
||||||
);
|
);
|
||||||
CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));
|
CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));
|
||||||
if (!EFI_ERROR (Status)) {
|
//
|
||||||
|
// Find all Fv type ffs to get all FvImage and add them into FvHob
|
||||||
|
//
|
||||||
|
if (!EFI_ERROR (Status) && (Type != EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE)) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -661,7 +664,6 @@ Returns:
|
||||||
EFI_GUID TempGuid;
|
EFI_GUID TempGuid;
|
||||||
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
|
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
|
||||||
EFI_COMPRESSION_SECTION *CompressionSection;
|
EFI_COMPRESSION_SECTION *CompressionSection;
|
||||||
UINT32 FvAlignment;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize local variables.
|
// Initialize local variables.
|
||||||
|
@ -878,8 +880,23 @@ Returns:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Decompress successfully.
|
||||||
|
// Loop the decompressed data searching for expected section.
|
||||||
|
//
|
||||||
CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;
|
CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;
|
||||||
if (CmpSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
|
CmpFileData = (VOID *) DstBuffer;
|
||||||
|
CmpFileSize = DstBufferSize;
|
||||||
|
do {
|
||||||
|
CmpSectionLength = *(UINT32 *) (CmpSection->Size) & 0x00ffffff;
|
||||||
|
if (CmpSection->Type == SectionType) {
|
||||||
|
//
|
||||||
|
// This is what we want
|
||||||
|
//
|
||||||
|
if (SectionType == EFI_SECTION_PE32) {
|
||||||
|
*Pe32Data = (VOID *) (CmpSection + 1);
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
} else if (SectionType == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
|
||||||
//
|
//
|
||||||
// Firmware Volume Image in this Section
|
// Firmware Volume Image in this Section
|
||||||
// Skip the section header to get FvHeader
|
// Skip the section header to get FvHeader
|
||||||
|
@ -888,33 +905,20 @@ Returns:
|
||||||
|
|
||||||
if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
|
if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
|
||||||
//
|
//
|
||||||
// Adjust Fv Base Address Alignment based on Align Attributes in Fv Header
|
// Because FvLength in FvHeader is UINT64 type,
|
||||||
//
|
// so FvHeader must meed at least 8 bytes alignment.
|
||||||
|
// If current FvImage base address doesn't meet its alignment,
|
||||||
//
|
|
||||||
// When FvImage support Alignment, we need to check whether
|
|
||||||
// its alignment is correct.
|
|
||||||
//
|
|
||||||
if (FvHeader->Attributes | EFI_FVB_ALIGNMENT_CAP) {
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate the mini alignment for this FvImage
|
|
||||||
//
|
|
||||||
FvAlignment = 1 << (LowBitSet32 (FvHeader->Attributes >> 16) + 1);
|
|
||||||
|
|
||||||
//
|
|
||||||
// If current FvImage base address doesn't meet the its alignment,
|
|
||||||
// we need to reload this FvImage to another correct memory address.
|
// we need to reload this FvImage to another correct memory address.
|
||||||
//
|
//
|
||||||
if (((UINTN) FvHeader % FvAlignment) != 0) {
|
if (((UINTN) FvHeader % sizeof (UINT64)) != 0) {
|
||||||
DstBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINTN) FvHeader->FvLength), FvAlignment);
|
DstBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINTN) CmpSectionLength - sizeof (EFI_COMMON_SECTION_HEADER)), sizeof (UINT64));
|
||||||
if (DstBuffer == NULL) {
|
if (DstBuffer == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
CopyMem (DstBuffer, FvHeader, (UINTN) FvHeader->FvLength);
|
CopyMem (DstBuffer, FvHeader, (UINTN) CmpSectionLength - sizeof (EFI_COMMON_SECTION_HEADER));
|
||||||
FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) DstBuffer;
|
FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) DstBuffer;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// Build new FvHob for new decompressed Fv image.
|
// Build new FvHob for new decompressed Fv image.
|
||||||
//
|
//
|
||||||
|
@ -928,32 +932,13 @@ Returns:
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// when search FvImage Section return true.
|
// return found FvImage data.
|
||||||
//
|
//
|
||||||
if (SectionType == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
|
|
||||||
*Pe32Data = (VOID *) FvHeader;
|
*Pe32Data = (VOID *) FvHeader;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
|
||||||
return EFI_NOT_FOUND;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// Decompress successfully.
|
|
||||||
// Loop the decompressed data searching for expected section.
|
|
||||||
//
|
|
||||||
CmpFileData = (VOID *) DstBuffer;
|
|
||||||
CmpFileSize = DstBufferSize;
|
|
||||||
do {
|
|
||||||
CmpSectionLength = *(UINT32 *) (CmpSection->Size) & 0x00ffffff;
|
|
||||||
if (CmpSection->Type == EFI_SECTION_PE32) {
|
|
||||||
//
|
|
||||||
// This is what we want
|
|
||||||
//
|
|
||||||
*Pe32Data = (VOID *) (CmpSection + 1);
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
OccupiedCmpSectionLength = GET_OCCUPIED_SIZE (CmpSectionLength, 4);
|
OccupiedCmpSectionLength = GET_OCCUPIED_SIZE (CmpSectionLength, 4);
|
||||||
CmpSection = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);
|
CmpSection = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);
|
||||||
} while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);
|
} while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);
|
||||||
|
|
Loading…
Reference in New Issue