UINT8 *ScratchBuffer;\r
UINT32 DstBufferSize;\r
UINT32 ScratchBufferSize;\r
- EFI_COMMON_SECTION_HEADER *Section;\r
- UINT32 SectionLength;\r
+ VOID *CompressionSource;\r
+ UINT32 CompressionSourceSize;\r
+ UINT32 UncompressedLength;\r
+ UINT8 CompressionType;\r
\r
if (CompressionSection->CommonHeader.Type != EFI_SECTION_COMPRESSION) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Section = (EFI_COMMON_SECTION_HEADER *) CompressionSection;\r
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
+ if (IS_SECTION2 (CompressionSection)) {\r
+ CompressionSource = (VOID *) ((UINT8 *) CompressionSection + sizeof (EFI_COMPRESSION_SECTION2));\r
+ CompressionSourceSize = (UINT32) (SECTION2_SIZE (CompressionSection) - sizeof (EFI_COMPRESSION_SECTION2));\r
+ UncompressedLength = ((EFI_COMPRESSION_SECTION2 *) CompressionSection)->UncompressedLength;\r
+ CompressionType = ((EFI_COMPRESSION_SECTION2 *) CompressionSection)->CompressionType;\r
+ } else {\r
+ CompressionSource = (VOID *) ((UINT8 *) CompressionSection + sizeof (EFI_COMPRESSION_SECTION));\r
+ CompressionSourceSize = (UINT32) (SECTION_SIZE (CompressionSection) - sizeof (EFI_COMPRESSION_SECTION));\r
+ UncompressedLength = CompressionSection->UncompressedLength;\r
+ CompressionType = CompressionSection->CompressionType;\r
+ }\r
\r
//\r
// This is a compression set, expand it\r
//\r
- switch (CompressionSection->CompressionType) {\r
+ switch (CompressionType) {\r
case EFI_STANDARD_COMPRESSION:\r
if (FeaturePcdGet(PcdDxeIplSupportUefiDecompress)) {\r
//\r
// For compressed data, decompress them to destination buffer.\r
//\r
Status = UefiDecompressGetInfo (\r
- (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
- SectionLength - sizeof (EFI_COMPRESSION_SECTION),\r
+ CompressionSource,\r
+ CompressionSourceSize,\r
&DstBufferSize,\r
&ScratchBufferSize\r
);\r
// Call decompress function\r
//\r
Status = UefiDecompress (\r
- (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
+ CompressionSource,\r
DstBuffer,\r
ScratchBuffer\r
);\r
//\r
// Allocate destination buffer\r
//\r
- DstBufferSize = CompressionSection->UncompressedLength;\r
+ DstBufferSize = UncompressedLength;\r
DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize) + 1);\r
if (DstBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
//\r
// stream is not actually compressed, just encapsulated. So just copy it.\r
//\r
- CopyMem (DstBuffer, CompressionSection + 1, DstBufferSize);\r
+ CopyMem (DstBuffer, CompressionSource, DstBufferSize);\r
break;\r
\r
default:\r