summaryrefslogtreecommitdiff
path: root/Core/EM/PeiRamBoot/PeiRamBootFvHook.c
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/PeiRamBoot/PeiRamBootFvHook.c')
-rw-r--r--Core/EM/PeiRamBoot/PeiRamBootFvHook.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/Core/EM/PeiRamBoot/PeiRamBootFvHook.c b/Core/EM/PeiRamBoot/PeiRamBootFvHook.c
new file mode 100644
index 0000000..bab5415
--- /dev/null
+++ b/Core/EM/PeiRamBoot/PeiRamBootFvHook.c
@@ -0,0 +1,184 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2012, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/PEI Ram Boot/PeiRamBootFvHook.c 4 1/16/13 6:33a Calvinchen $
+//
+// $Revision: 4 $
+//
+// $Date: 1/16/13 6:33a $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/PEI Ram Boot/PeiRamBootFvHook.c $
+//
+// 4 1/16/13 6:33a Calvinchen
+// Update Header.
+//
+// 3 8/08/12 4:25a Calvinchen
+// 1. Changed for ReportFv2.c by Artem's suggestion.
+// 2. Fixed System hangs if Memory Mapping Changed with warm boot.
+//
+// 2 7/18/12 3:41a Calvinchen
+//
+// 1 7/18/12 3:33a Calvinchen
+// [TAG] EIPNone
+// [Category] New Feature
+// [Description] Added support for Nested Firmware Volume.
+//
+//
+//**********************************************************************
+//<AMI_FHDR_START>
+//
+// Name: PeiRamBootFvHook.c
+//
+// Description: Hook File for Report Firmware Volume.
+//
+//<AMI_FHDR_END>
+//**********************************************************************
+//----------------------------------------------------------------------------
+// Includes
+// Statements that include other files
+#include <RomLayout.h>
+#include <Token.h>
+#include <AmiPeiLib.h>
+#include <AmiCspLib.h>
+#include <PeiRamBoot.h>
+//----------------------------------------------------------------------------
+// Function Externs
+extern
+EFI_STATUS PublishFv(
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN ROM_AREA *Area,
+ IN BOOLEAN Nested
+);
+extern
+EFI_STATUS CreateFvHob2(
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN ROM_AREA *Area,
+ IN EFI_GUID *FvName,
+ IN EFI_GUID *FfsName
+);
+extern
+EFI_STATUS CreateFvInfoPpi(
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN ROM_AREA *Area,
+ IN EFI_GUID *FvName OPTIONAL,
+ IN EFI_GUID *FfsName OPTIONAL
+);
+//----------------------------------------------------------------------------
+// Local prototypes
+
+//----------------------------------------------------------------------------
+// Local Variables
+
+//----------------------------------------------------------------------------
+// Function Definitions
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+//
+// Procedure: PeiRamBootNestedFvPublishing
+//
+// Description:
+//
+// Input: EFI_PEI_SERVICES** - PeiServices
+// ROM_AREA* - Area
+//
+// Output: EFI_STATUS
+// ROM_AREA* - Area
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS
+PeiRamBootNestedFvPublishing (
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN OUT ROM_AREA *Area,
+ OUT EFI_FIRMWARE_VOLUME_HEADER **Fv,
+ OUT EFI_FIRMWARE_VOLUME_HEADER **NewFv,
+ OUT EFI_FFS_FILE_HEADER **Nfv
+)
+{
+ VOID *p, *p2;
+ static UINT8 NestedFvIndex = 0;
+ INTN Result;
+ EFI_STATUS Status;
+ EFI_BOOT_MODE BootMode;
+ EFI_GUID HobRomImageGuid = ROM_IMAGE_MEMORY_HOB_GUID;
+ EFI_PHYSICAL_ADDRESS NestedFvBuffer = 0, NestedFvInMem = 0, TopOfMemory = 0;
+ UINT32 NestedFvLength = 0;
+ EFI_FIRMWARE_VOLUME_HEADER *pFv;
+
+ Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode);
+ if (EFI_ERROR(Status) || \
+ (BootMode == BOOT_IN_RECOVERY_MODE) || \
+ (BootMode == BOOT_ON_FLASH_UPDATE)) return EFI_UNSUPPORTED;
+
+ for ((*PeiServices)->GetHobList(PeiServices,&p); \
+ !(FindNextHobByType(EFI_HOB_TYPE_GUID_EXTENSION, &p)); ) {
+ Result = guidcmp(&((EFI_HOB_GUID_TYPE*)p)->Name, &HobRomImageGuid);
+ if (!Result) break;
+ }
+ if (Result) return EFI_UNSUPPORTED;
+ if (((HOB_ROM_IMAGE*)p)->HobValid == 0) {
+ // Try to decompress the Nested FV from memory if possible
+ UINT8 i;
+ ((HOB_ROM_IMAGE*)p)->NestedFvValid = 0;
+ for (i = 0; i < ((HOB_ROM_IMAGE*)p)->NumOfFv; i++) {
+ if ((Area->Address == ((HOB_ROM_IMAGE*)p)->FvInfo[i].FvAddress) && \
+ (((HOB_ROM_IMAGE*)p)->FvInfo[i].FvMemReady == TRUE))
+ *Fv = (EFI_FIRMWARE_VOLUME_HEADER*)((HOB_ROM_IMAGE*)p)->FvInfo[i].MemAddress;
+ }
+ return EFI_UNSUPPORTED;
+ }
+ pFv = (EFI_FIRMWARE_VOLUME_HEADER*)Area->Address;
+ NestedFvLength = ((HOB_ROM_IMAGE*)p)->NestedFvInfo[NestedFvIndex].FvLength;
+ NestedFvInMem = (EFI_PHYSICAL_ADDRESS)((HOB_ROM_IMAGE*)p)->NestedFvInfo[NestedFvIndex++].MemAddress;
+ // check whether NestFv memory is valid.
+ for ((*PeiServices)->GetHobList(PeiServices,&p2); \
+ !(FindNextHobByType(EFI_HOB_TYPE_MEMORY_ALLOCATION, &p2)); ) {
+ TopOfMemory = ((EFI_HOB_MEMORY_ALLOCATION*)p2)->AllocDescriptor.MemoryBaseAddress;
+ }
+ if (TopOfMemory != ((NestedFvInMem & (EFI_PHYSICAL_ADDRESS)~0xfff) + NestedFvLength + 0x1000)) {
+ // Memory Mapping changed, decompress Nested FV and re-collect Nested FV information
+ ((HOB_ROM_IMAGE*)p)->NestedFvValid = 0;
+ return EFI_UNSUPPORTED;
+ }
+
+ Status = (*PeiServices)->FfsFindNextFile (PeiServices, \
+ EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, pFv, Nfv);
+ if(EFI_ERROR(Status)) return Status;
+
+ Status = (*PeiServices)->AllocatePages(PeiServices, \
+ EfiRuntimeServicesData, (NestedFvLength >> 12) + 1, &NestedFvBuffer);
+ if (EFI_ERROR(Status)) return EFI_UNSUPPORTED;
+ if ((NestedFvInMem & (EFI_PHYSICAL_ADDRESS)~0xfff) != NestedFvBuffer) {
+ return EFI_UNSUPPORTED;
+ }
+ *NewFv = (EFI_FIRMWARE_VOLUME_HEADER*)(EFI_PHYSICAL_ADDRESS)NestedFvInMem;
+ ((HOB_ROM_IMAGE*)p)->NestedFvValid = 1;
+ return EFI_SUCCESS;
+}
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2012, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//************************************************************************* \ No newline at end of file