-\r
- if (Section->Type == EFI_SECTION_PE32) {\r
- //\r
- // This is what we want\r
- //\r
- *Pe32Data = (VOID *) (Section + 1);\r
- return EFI_SUCCESS;\r
- } else if (Section->Type == EFI_SECTION_COMPRESSION) {\r
- //\r
- // This is a compression set, expand it\r
- //\r
- CompressionSection = (EFI_COMPRESSION_SECTION *) Section;\r
-\r
- switch (CompressionSection->CompressionType) {\r
- case EFI_STANDARD_COMPRESSION:\r
- //\r
- // Load EFI standard compression.\r
- //\r
- if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) {\r
- DecompressLibrary = &gEfiDecompress;\r
- } else {\r
- ASSERT (FALSE);\r
- return EFI_NOT_FOUND;\r
- }\r
- break;\r
-\r
- // porting note the original branch for customized compress is removed, it should be change to use GUID compress\r
-\r
- case EFI_NOT_COMPRESSED:\r
- //\r
- // Allocate destination buffer\r
- //\r
- DstBufferSize = CompressionSection->UncompressedLength;\r
- DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
- if (DstBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // stream is not actually compressed, just encapsulated. So just copy it.\r
- //\r
- CopyMem (DstBuffer, CompressionSection + 1, DstBufferSize);\r
- break;\r
-\r
- default:\r
- //\r
- // Don't support other unknown compression type.\r
- //\r
- ASSERT_EFI_ERROR (Status);\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- if (CompressionSection->CompressionType != EFI_NOT_COMPRESSED) {\r
- //\r
- // For compressed data, decompress them to dstbuffer.\r
- //\r
- Status = DecompressLibrary->GetInfo (\r
- (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
- (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),\r
- &DstBufferSize,\r
- &ScratchBufferSize\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // GetInfo failed\r
- //\r
- DEBUG ((EFI_D_ERROR, "Decompress GetInfo Failed - %r\n", Status));\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- //\r
- // Allocate scratch buffer\r
- //\r
- ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
- if (ScratchBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- //\r
- // Allocate destination buffer\r
- //\r
- DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
- if (DstBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- //\r
- // Call decompress function\r
- //\r
- Status = DecompressLibrary->Decompress (\r
- (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
- DstBuffer,\r
- ScratchBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Decompress failed\r
- //\r
- DEBUG ((EFI_D_ERROR, "Decompress Failed - %r\n", Status));\r
- return EFI_NOT_FOUND;\r
- }\r
- }\r
-\r
+ //\r
+ // Allocate scratch buffer\r
+ //\r
+ ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
+ if (ScratchBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ //\r
+ // Allocate destination buffer, extra one page for adjustment \r
+ //\r
+ DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize) + 1);\r
+ if (DstBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ //\r
+ // DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header\r
+ // to make section data at page alignment.\r
+ //\r
+ DstBuffer = DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER);\r
+ //\r
+ // Call decompress function\r
+ //\r
+ Status = UefiDecompress (\r
+ CompressionSource,\r
+ DstBuffer,\r
+ ScratchBuffer\r
+ );\r
+ if (EFI_ERROR (Status)) {\r