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
\r
**/\r
EFI_STATUS\r
-DecompressGuidedFv (\r
+DecompressMemFvs (\r
IN OUT EFI_FIRMWARE_VOLUME_HEADER **Fv\r
)\r
{\r
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
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
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
\r
FindMainFv (BootFv);\r
\r
- DecompressGuidedFv (BootFv);\r
+ DecompressMemFvs (BootFv);\r
\r
FindPeiCoreImageBaseInFv (*BootFv, PeiCoreImageBase);\r
}\r