]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Sec/SecMain.c
OvmfPkg: Split MAINFV into a separate PEI and DXE FVs
[mirror_edk2.git] / OvmfPkg / Sec / SecMain.c
index 6e238fe3370160e95a6ce65405025905767fd348..0edc4f9af3cfbfee0f73c4d78f105a5ed0e7d939 100644 (file)
@@ -311,7 +311,7 @@ FindFfsFileAndSection (
   Locates the compressed main firmware volume and decompresses it.\r
 \r
   @param[in,out]  Fv            On input, the firmware volume to search\r
-                                On output, the decompressed main FV\r
+                                On output, the decompressed BOOT/PEI FV\r
 \r
   @retval EFI_SUCCESS           The file and section was found\r
   @retval EFI_NOT_FOUND         The file and section was not found\r
@@ -319,7 +319,7 @@ FindFfsFileAndSection (
 \r
 **/\r
 EFI_STATUS\r
-DecompressGuidedFv (\r
+DecompressMemFvs (\r
   IN OUT EFI_FIRMWARE_VOLUME_HEADER       **Fv\r
   )\r
 {\r
@@ -331,10 +331,11 @@ DecompressGuidedFv (
   UINT32                            AuthenticationStatus;\r
   VOID                              *OutputBuffer;\r
   VOID                              *ScratchBuffer;\r
-  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *NewFvSection;\r
-  EFI_FIRMWARE_VOLUME_HEADER        *NewFv;\r
+  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *FvSection;\r
+  EFI_FIRMWARE_VOLUME_HEADER        *PeiMemFv;\r
+  EFI_FIRMWARE_VOLUME_HEADER        *DxeMemFv;\r
 \r
-  NewFvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;\r
+  FvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;\r
 \r
   Status = FindFfsFileAndSection (\r
              *Fv,\r
@@ -358,8 +359,7 @@ DecompressGuidedFv (
     return Status;\r
   }\r
 \r
-  //PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize)\r
-  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfMemFvBase) + SIZE_1MB);\r
+  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase) + SIZE_1MB);\r
   ScratchBuffer = ALIGN_POINTER ((UINT8*) OutputBuffer + OutputBufferSize, SIZE_1MB);\r
   Status = ExtractGuidedSectionDecode (\r
              Section,\r
@@ -372,27 +372,57 @@ DecompressGuidedFv (
     return Status;\r
   }\r
 \r
-  Status = FindFfsSectionInSections (\r
+  Status = FindFfsSectionInstance (\r
              OutputBuffer,\r
              OutputBufferSize,\r
              EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
-             (EFI_COMMON_SECTION_HEADER**) &NewFvSection\r
+             0,\r
+             (EFI_COMMON_SECTION_HEADER**) &FvSection\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to find FV image in extracted data\n"));\r
+    DEBUG ((EFI_D_ERROR, "Unable to find PEI FV section\n"));\r
     return Status;\r
   }\r
 \r
-  NewFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfMemFvBase);\r
-  CopyMem (NewFv, (VOID*) (NewFvSection + 1), PcdGet32 (PcdOvmfMemFvSize));\r
+  ASSERT (SECTION_SIZE (FvSection) ==\r
+          (PcdGet32 (PcdOvmfPeiMemFvSize) + sizeof (*FvSection)));\r
+  ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);\r
 \r
-  if (NewFv->Signature != EFI_FVH_SIGNATURE) {\r
-    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", NewFv));\r
+  PeiMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfPeiMemFvBase);\r
+  CopyMem (PeiMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfPeiMemFvSize));\r
+\r
+  if (PeiMemFv->Signature != EFI_FVH_SIGNATURE) {\r
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", PeiMemFv));\r
+    CpuDeadLoop ();\r
+    return EFI_VOLUME_CORRUPTED;\r
+  }\r
+\r
+  Status = FindFfsSectionInstance (\r
+             OutputBuffer,\r
+             OutputBufferSize,\r
+             EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
+             1,\r
+             (EFI_COMMON_SECTION_HEADER**) &FvSection\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "Unable to find DXE FV section\n"));\r
+    return Status;\r
+  }\r
+\r
+  ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);\r
+  ASSERT (SECTION_SIZE (FvSection) ==\r
+          (PcdGet32 (PcdOvmfDxeMemFvSize) + sizeof (*FvSection)));\r
+\r
+  DxeMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase);\r
+  CopyMem (DxeMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfDxeMemFvSize));\r
+\r
+  if (DxeMemFv->Signature != EFI_FVH_SIGNATURE) {\r
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", DxeMemFv));\r
     CpuDeadLoop ();\r
     return EFI_VOLUME_CORRUPTED;\r
   }\r
 \r
-  *Fv = NewFv;\r
+  *Fv = PeiMemFv;\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -460,7 +490,7 @@ FindPeiCoreImageBase (
 \r
   FindMainFv (BootFv);\r
 \r
-  DecompressGuidedFv (BootFv);\r
+  DecompressMemFvs (BootFv);\r
 \r
   FindPeiCoreImageBaseInFv (*BootFv, PeiCoreImageBase);\r
 }\r