#include <FrameworkPei.h>\r
\r
EFI_STATUS\r
-CustomDecompressExtractSection (\r
+CustomGuidedSectionExtract (\r
IN CONST EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *This,\r
IN CONST VOID *InputSection,\r
OUT VOID **OutputBuffer,\r
DxeLoadCore\r
};\r
\r
-STATIC EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI mCustomDecompressExtractiongPpi = {\r
- CustomDecompressExtractSection\r
+STATIC EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI mCustomGuidedSectionExtractionPpi = {\r
+ CustomGuidedSectionExtract\r
};\r
\r
STATIC EFI_PEI_DECOMPRESS_PPI mDecompressPpi = {\r
{\r
EFI_STATUS Status;\r
EFI_BOOT_MODE BootMode;\r
- EFI_GUID **DecompressGuidList;\r
- UINT32 DecompressMethodNumber;\r
+ EFI_GUID *ExtractHandlerGuidTable;\r
+ UINTN ExtractHandlerNumber;\r
EFI_PEI_PPI_DESCRIPTOR *GuidPpi;\r
\r
Status = PeiServicesGetBootMode (&BootMode);\r
gInMemory = TRUE;\r
\r
//\r
- // Get custom decompress method guid list \r
+ // Get custom extract guided section method guid list \r
//\r
- DecompressGuidList = NULL;\r
- DecompressMethodNumber = 0;\r
- Status = CustomDecompressGetAlgorithms (DecompressGuidList, &DecompressMethodNumber);\r
- if (Status == EFI_OUT_OF_RESOURCES) {\r
- DecompressGuidList = (EFI_GUID **) AllocatePages (EFI_SIZE_TO_PAGES (DecompressMethodNumber * sizeof (EFI_GUID *)));\r
- ASSERT (DecompressGuidList != NULL);\r
- Status = CustomDecompressGetAlgorithms (DecompressGuidList, &DecompressMethodNumber);\r
- }\r
- ASSERT_EFI_ERROR(Status);\r
+ ExtractHandlerNumber = ExtractGuidedSectionGetGuidList (&ExtractHandlerGuidTable);\r
\r
//\r
- // Install custom decompress extraction guid ppi\r
+ // Install custom extraction guid ppi\r
//\r
- if (DecompressMethodNumber > 0) {\r
+ if (ExtractHandlerNumber > 0) {\r
GuidPpi = NULL;\r
- GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePages (EFI_SIZE_TO_PAGES (DecompressMethodNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR)));\r
+ GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR));\r
ASSERT (GuidPpi != NULL);\r
- while (DecompressMethodNumber-- > 0) {\r
+ while (ExtractHandlerNumber-- > 0) {\r
GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
- GuidPpi->Ppi = &mCustomDecompressExtractiongPpi;\r
- GuidPpi->Guid = DecompressGuidList [DecompressMethodNumber];\r
+ GuidPpi->Ppi = &mCustomGuidedSectionExtractionPpi;\r
+ GuidPpi->Guid = &(ExtractHandlerGuidTable [ExtractHandlerNumber]);\r
Status = PeiServicesInstallPpi (GuidPpi++);\r
ASSERT_EFI_ERROR(Status);\r
}\r
GUIDed Section Extraction PPI.\r
**/\r
EFI_STATUS\r
-CustomDecompressExtractSection (\r
+CustomGuidedSectionExtract (\r
IN CONST EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *This,\r
IN CONST VOID *InputSection,\r
OUT VOID **OutputBuffer,\r
{\r
EFI_STATUS Status;\r
UINT8 *ScratchBuffer;\r
- UINT32 ScratchSize;\r
- UINT32 SectionLength;\r
- UINT32 DestinationSize; \r
+ UINT32 ScratchBufferSize;\r
+ UINT32 OutputBufferSize;\r
+ UINT16 SectionAttribute;\r
\r
//\r
- // Set authentic value to zero.\r
- //\r
- *AuthenticationStatus = 0;\r
+ // Init local variable\r
//\r
- // Calculate Section data Size\r
- //\r
- SectionLength = *(UINT32 *) (((EFI_COMMON_SECTION_HEADER *) InputSection)->Size) & 0x00ffffff;\r
+ ScratchBuffer = NULL;\r
+\r
//\r
- // Get compressed data information\r
+ // Call GetInfo to get the size and attribute of input guided section data.\r
//\r
- Status = CustomDecompressGetInfo (\r
- (GUID *) ((UINT8 *) InputSection + sizeof (EFI_COMMON_SECTION_HEADER)),\r
- (UINT8 *) InputSection + sizeof (EFI_GUID_DEFINED_SECTION),\r
- SectionLength - sizeof (EFI_GUID_DEFINED_SECTION),\r
- &DestinationSize,\r
- &ScratchSize\r
- );\r
+ Status = ExtractGuidedSectionGetInfo (\r
+ InputSection,\r
+ &OutputBufferSize,\r
+ &ScratchBufferSize,\r
+ &SectionAttribute\r
+ );\r
+ \r
if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "GetInfo from guided section Failed - %r\n", Status));\r
+ return Status;\r
+ }\r
+ \r
+ if (ScratchBufferSize != 0) {\r
//\r
- // GetInfo failed\r
+ // Allocate scratch buffer\r
//\r
- DEBUG ((EFI_D_ERROR, "Extract guided section Failed - %r\n", Status));\r
- return Status;\r
+ ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
+ if (ScratchBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
}\r
\r
- //\r
- // Allocate scratch buffer\r
- //\r
- ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchSize));\r
- if (ScratchBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Allocate destination buffer\r
- //\r
- *OutputSize = (UINTN) DestinationSize;\r
- *OutputBuffer = AllocatePages (EFI_SIZE_TO_PAGES (*OutputSize));\r
- if (*OutputBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ if ((SectionAttribute & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) && OutputBufferSize > 0) { \r
+ //\r
+ // Allocate output buffer\r
+ //\r
+ *OutputBuffer = AllocatePages (EFI_SIZE_TO_PAGES (OutputBufferSize));\r
+ if (*OutputBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
}\r
-\r
- //\r
- // Call decompress function\r
- //\r
- Status = CustomDecompress (\r
- (GUID *) ((UINT8 *) InputSection + sizeof (EFI_COMMON_SECTION_HEADER)),\r
- (UINT8 *) InputSection + sizeof (EFI_GUID_DEFINED_SECTION),\r
- *OutputBuffer,\r
- ScratchBuffer\r
- );\r
+ \r
+ Status = ExtractGuidedSectionDecode (\r
+ InputSection, \r
+ OutputBuffer,\r
+ ScratchBuffer,\r
+ AuthenticationStatus\r
+ );\r
\r
if (EFI_ERROR (Status)) {\r
//\r
- // Decompress failed\r
+ // Decode failed\r
//\r
DEBUG ((EFI_D_ERROR, "Extract guided section Failed - %r\n", Status));\r
return Status;\r
}\r
\r
+ *OutputSize = (UINTN) OutputBufferSize;\r
+ \r
return EFI_SUCCESS;\r
}\r
\r