mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 08:04:07 +02:00
EmbeddedPkg/PrePiLib: add support for v2 sections
Implement the missing support for FFS files whose size equals or exceeds 16 MiB. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael Zimmermann <sigmaepsilon92@gmail.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
This commit is contained in:
parent
c6ded48cdd
commit
4efc8a402d
@ -296,35 +296,61 @@ FfsProcessSection (
|
|||||||
UINT32 SectionLength;
|
UINT32 SectionLength;
|
||||||
UINT32 ParsedLength;
|
UINT32 ParsedLength;
|
||||||
EFI_COMPRESSION_SECTION *CompressionSection;
|
EFI_COMPRESSION_SECTION *CompressionSection;
|
||||||
|
EFI_COMPRESSION_SECTION2 *CompressionSection2;
|
||||||
UINT32 DstBufferSize;
|
UINT32 DstBufferSize;
|
||||||
VOID *ScratchBuffer;
|
VOID *ScratchBuffer;
|
||||||
UINT32 ScratchBufferSize;
|
UINT32 ScratchBufferSize;
|
||||||
VOID *DstBuffer;
|
VOID *DstBuffer;
|
||||||
UINT16 SectionAttribute;
|
UINT16 SectionAttribute;
|
||||||
UINT32 AuthenticationStatus;
|
UINT32 AuthenticationStatus;
|
||||||
|
CHAR8 *CompressedData;
|
||||||
|
UINTN CompressedDataLength;
|
||||||
|
|
||||||
|
|
||||||
*OutputBuffer = NULL;
|
*OutputBuffer = NULL;
|
||||||
ParsedLength = 0;
|
ParsedLength = 0;
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
while (ParsedLength < SectionSize) {
|
while (ParsedLength < SectionSize) {
|
||||||
|
if (IS_SECTION2 (Section)) {
|
||||||
|
ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
if (Section->Type == SectionType) {
|
if (Section->Type == SectionType) {
|
||||||
*OutputBuffer = (VOID *)(Section + 1);
|
if (IS_SECTION2 (Section)) {
|
||||||
|
*OutputBuffer = (VOID *)((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
||||||
|
} else {
|
||||||
|
*OutputBuffer = (VOID *)((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
|
||||||
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) {
|
} else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) {
|
||||||
|
|
||||||
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
||||||
|
if (IS_SECTION2 (Section)) {
|
||||||
|
CompressionSection2 = (EFI_COMPRESSION_SECTION2 *) Section;
|
||||||
|
SectionLength = SECTION2_SIZE (Section);
|
||||||
|
|
||||||
|
if (CompressionSection2->CompressionType != EFI_STANDARD_COMPRESSION) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section + 1);
|
||||||
|
CompressedDataLength = (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION2);
|
||||||
|
} else {
|
||||||
CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
|
CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
|
||||||
SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF;
|
SectionLength = SECTION_SIZE (Section);
|
||||||
|
|
||||||
if (CompressionSection->CompressionType != EFI_STANDARD_COMPRESSION) {
|
if (CompressionSection->CompressionType != EFI_STANDARD_COMPRESSION) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1);
|
||||||
|
CompressedDataLength = (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION);
|
||||||
|
}
|
||||||
|
|
||||||
Status = UefiDecompressGetInfo (
|
Status = UefiDecompressGetInfo (
|
||||||
(UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
|
CompressedData,
|
||||||
(UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),
|
CompressedDataLength,
|
||||||
&DstBufferSize,
|
&DstBufferSize,
|
||||||
&ScratchBufferSize
|
&ScratchBufferSize
|
||||||
);
|
);
|
||||||
@ -362,13 +388,23 @@ FfsProcessSection (
|
|||||||
// DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header
|
// DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header
|
||||||
// to make section data at page alignment.
|
// to make section data at page alignment.
|
||||||
//
|
//
|
||||||
|
if (IS_SECTION2 (Section))
|
||||||
|
DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER2);
|
||||||
|
else
|
||||||
DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER);
|
DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER);
|
||||||
//
|
//
|
||||||
// Call decompress function
|
// Call decompress function
|
||||||
//
|
//
|
||||||
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
if (Section->Type == EFI_SECTION_COMPRESSION) {
|
||||||
|
if (IS_SECTION2 (Section)) {
|
||||||
|
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION2 *) Section + 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
CompressedData = (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1);
|
||||||
|
}
|
||||||
|
|
||||||
Status = UefiDecompress (
|
Status = UefiDecompress (
|
||||||
(CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
|
CompressedData,
|
||||||
DstBuffer,
|
DstBuffer,
|
||||||
ScratchBuffer
|
ScratchBuffer
|
||||||
);
|
);
|
||||||
@ -397,12 +433,15 @@ FfsProcessSection (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_SECTION2 (Section)) {
|
||||||
|
SectionLength = SECTION2_SIZE (Section);
|
||||||
|
} else {
|
||||||
|
SectionLength = SECTION_SIZE (Section);
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// Size is 24 bits wide so mask upper 8 bits.
|
|
||||||
// SectionLength is adjusted it is 4 byte aligned.
|
// SectionLength is adjusted it is 4 byte aligned.
|
||||||
// Go to the next section
|
// Go to the next section
|
||||||
//
|
//
|
||||||
SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF;
|
|
||||||
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
||||||
ASSERT (SectionLength != 0);
|
ASSERT (SectionLength != 0);
|
||||||
ParsedLength += SectionLength;
|
ParsedLength += SectionLength;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user