]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
1. Add ExtractGuidedSectionLib library to replace customdecompress library.
[mirror_edk2.git] / MdeModulePkg / Core / DxeIplPeim / DxeLoad.c
index cb13a7d4b08564b7318cc3ddf4bdf1cdc391f99c..1359fe99bc9ca176b78adeae502b572e568782b7 100644 (file)
@@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #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
@@ -47,8 +47,8 @@ static EFI_DXE_IPL_PPI mDxeIplPpi = {
   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
@@ -91,8 +91,8 @@ PeimInitializeDxeIpl (
 {\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
@@ -110,29 +110,21 @@ PeimInitializeDxeIpl (
       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
@@ -560,7 +552,7 @@ PeiLoadFile (
                                 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
@@ -570,70 +562,67 @@ CustomDecompressExtractSection (
 {\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