-/**\r
- FSP Init continuation function.\r
- Control will be returned to this callback function after FspInit API call.\r
-\r
- @param[in] Status Status of the FSP INIT API\r
- @param[in] HobListPtr Pointer to the HOB data structure defined in the PI specification.\r
-\r
-**/\r
-VOID\r
-ContinuationFunc (\r
- IN FSP_STATUS Status,\r
- IN VOID *HobListPtr\r
- )\r
-{\r
- EFI_BOOT_MODE BootMode;\r
- UINT64 StackSize;\r
- EFI_PHYSICAL_ADDRESS StackBase;\r
-\r
- DEBUG ((DEBUG_INFO, "ContinuationFunc - %r\n", Status));\r
- DEBUG ((DEBUG_INFO, "HobListPtr - 0x%x\n", HobListPtr));\r
-\r
- if (Status != FSP_SUCCESS) {\r
- CpuDeadLoop ();\r
- }\r
-\r
- //\r
- // Can not call any PeiServices\r
- //\r
- BootMode = GetBootMode ();\r
-\r
- GetStackInfo (BootMode, TRUE, &StackBase, &StackSize);\r
- DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));\r
- DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));\r
- CallPeiCoreEntryPoint (\r
- HobListPtr,\r
- (VOID *)(UINTN)StackBase,\r
- (VOID *)(UINTN)(StackBase + StackSize)\r
- );\r
-}\r
-\r
-/**\r
- Call FspInit API.\r
-\r
- @param[in] FspHeader FSP header pointer.\r
-**/\r
-VOID\r
-SecFspInit (\r
- IN FSP_INFO_HEADER *FspHeader\r
- )\r
-{\r
- FSP_INIT_PARAMS FspInitParams;\r
- FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;\r
- UINT8 FspUpdRgn[FixedPcdGet32 (PcdMaxUpdRegionSize)];\r
- UINT32 UpdRegionSize;\r
- EFI_BOOT_MODE BootMode;\r
- UINT64 StackSize;\r
- EFI_PHYSICAL_ADDRESS StackBase;\r
- FSP_STATUS FspStatus;\r
-\r
- DEBUG ((DEBUG_INFO, "SecFspInit enter\n"));\r
-\r
- PeiServicesGetBootMode (&BootMode);\r
- DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));\r
-\r
- GetStackInfo (BootMode, FALSE, &StackBase, &StackSize);\r
- DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));\r
- DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));\r
-\r
- ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));\r
- FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);\r
-\r
- FspRtBuffer.BootMode = BootMode;\r
-\r
- /* Platform override any UPD configs */\r
- UpdRegionSize = GetUpdRegionSize();\r
- DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));\r
- DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn)));\r
- ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);\r
- ZeroMem (FspUpdRgn, UpdRegionSize);\r
- FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);\r
-\r
- ZeroMem (&FspInitParams, sizeof(FspInitParams));\r
- FspInitParams.NvsBufferPtr = GetNvsBuffer ();\r
- DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspInitParams.NvsBufferPtr));\r
- FspInitParams.RtBufferPtr = (VOID *)&FspRtBuffer;\r
- FspInitParams.ContinuationFunc = (CONTINUATION_PROC)ContinuationFunc;\r
-\r
- SaveSecContext (GetPeiServicesTablePointer ());\r
-\r
- DEBUG ((DEBUG_INFO, "FspInitParams - 0x%x\n", &FspInitParams));\r
- DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspInitParams.NvsBufferPtr));\r
- DEBUG ((DEBUG_INFO, " RtBufferPtr - 0x%x\n", FspInitParams.RtBufferPtr));\r
- DEBUG ((DEBUG_INFO, " StackTop - 0x%x\n", FspRtBuffer.StackTop));\r
- DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspRtBuffer.BootMode));\r
- DEBUG ((DEBUG_INFO, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));\r
- DEBUG ((DEBUG_INFO, " ContinuationFunc - 0x%x\n", FspInitParams.ContinuationFunc));\r
-\r
- FspStatus = CallFspInit (FspHeader, &FspInitParams);\r
- //\r
- // Should never return\r
- //\r
- DEBUG((DEBUG_ERROR, "FSP Init failed, status: 0x%x\n", FspStatus));\r
- CpuDeadLoop ();\r
-}\r
-\r