\r
NT_FWH_PPI mSecFwhInformationPpi = { SecWinNtFdAddress };\r
\r
+TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport};\r
\r
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {\r
{\r
&gEfiPeiStatusCodePpiGuid,\r
&mSecStatusCodePpi\r
},\r
+ {\r
+ EFI_PEI_PPI_DESCRIPTOR_PPI,\r
+ &gEfiTemporaryRamSupportPpiGuid,\r
+ &mSecTemporaryRamSupportPpi\r
+ },\r
{\r
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
&gNtFwhPpiGuid,\r
PDB_NAME_TO_MOD_HANDLE *mPdbNameModHandleArray = NULL;\r
\r
\r
-\r
+VOID\r
+EFIAPI\r
+SecSwitchStack (\r
+ UINT32 TemporaryMemoryBase,\r
+ UINT32 PermenentMemoryBase\r
+ );\r
\r
INTN\r
EFIAPI\r
EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint;\r
EFI_PHYSICAL_ADDRESS PeiImageAddress;\r
EFI_SEC_PEI_HAND_OFF *SecCoreData;\r
+ UINTN PeiStackSize;\r
\r
//\r
// Compute Top Of Memory for Stack and PEI Core Allocations\r
//\r
- TopOfMemory = LargestRegion + LargestRegionSize;\r
+ TopOfMemory = LargestRegion + LargestRegionSize;\r
+ PeiStackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);\r
\r
//\r
- // Allocate 128KB for the Stack\r
+ // |-----------| <---- TemporaryRamBase + TemporaryRamSize\r
+ // | Heap |\r
+ // | |\r
+ // |-----------| <---- StackBase / PeiTemporaryMemoryBase\r
+ // | |\r
+ // | Stack |\r
+ // |-----------| <---- TemporaryRamBase\r
+ // \r
+ TopOfStack = (VOID *)(LargestRegion + PeiStackSize);\r
+ TopOfMemory = LargestRegion + PeiStackSize;\r
+\r
//\r
- TopOfStack = (VOID *)((UINTN)TopOfMemory - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);\r
+ // Reservet space for storing PeiCore's parament in stack.\r
+ // \r
+ TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);\r
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
- TopOfMemory = TopOfMemory - STACK_SIZE;\r
\r
//\r
// Patch value in dispatch table values\r
SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);\r
SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase;\r
SecCoreData->BootFirmwareVolumeSize = FixedPcdGet32(PcdWinNtFirmwareFdSize);\r
- SecCoreData->TemporaryRamBase = (VOID*)(UINTN)TopOfMemory; \r
+ SecCoreData->TemporaryRamBase = (VOID*)(UINTN)LargestRegion; \r
SecCoreData->TemporaryRamSize = STACK_SIZE;\r
- SecCoreData->PeiTemporaryRamBase = SecCoreData->TemporaryRamBase;\r
- SecCoreData->PeiTemporaryRamSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);\r
- SecCoreData->StackBase = (VOID*)((UINTN)SecCoreData->TemporaryRamBase + (UINTN)SecCoreData->TemporaryRamSize);\r
- SecCoreData->StackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);\r
+ SecCoreData->StackBase = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize);\r
+ SecCoreData->StackSize = PeiStackSize;\r
+ SecCoreData->PeiTemporaryRamBase = SecCoreData->StackBase;\r
+ SecCoreData->PeiTemporaryRamSize = STACK_SIZE - PeiStackSize;\r
\r
//\r
// Load the PEI Core from a Firmware Volume\r
{\r
}\r
\r
+EFI_STATUS\r
+EFIAPI\r
+SecTemporaryRamSupport (\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,\r
+ IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,\r
+ IN UINTN CopySize\r
+ )\r
+{\r
+ //\r
+ // Migrate the whole temporary memory to permenent memory.\r
+ // \r
+ CopyMem (\r
+ (VOID*)(UINTN)PermanentMemoryBase, \r
+ (VOID*)(UINTN)TemporaryMemoryBase, \r
+ CopySize\r
+ );\r
+\r
+ //\r
+ // SecSwitchStack function must be invoked after the memory migration\r
+ // immediatly, also we need fixup the stack change caused by new call into \r
+ // permenent memory.\r
+ // \r
+ SecSwitchStack (\r
+ (UINT32) TemporaryMemoryBase,\r
+ (UINT32) PermanentMemoryBase\r
+ );\r
+\r
+ //\r
+ // We need *not* fix the return address because currently, \r
+ // The PeiCore is excuted in flash.\r
+ //\r
+\r
+ //\r
+ // Simulate to invalid CAR, terminate CAR\r
+ // \r
+ //ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r