- if ((*(UINTN*)(Idtr.Base - sizeof (UINTN))) != (UINTN)PeiServicesTablePointer) {\r
- (*(UINTN*)(Idtr.Base - sizeof (UINTN))) = (UINTN)PeiServicesTablePointer;\r
- Status = (*PeiServicesTablePointer)->LocatePpi (\r
- PeiServicesTablePointer, \r
- &gEfiTemporaryRamSupportPpiGuid, \r
- 0, \r
- NULL, \r
- (VOID**)&TemporaryRamSupportPpi\r
- );\r
- \r
- if (EFI_ERROR (Status)) {\r
- //\r
- // If TemporaryRamSupportPpi is not found, Idt table needs to be migrated into memory.\r
- //\r
- Status = (*PeiServicesTablePointer)->AllocatePages (\r
- PeiServicesTablePointer, \r
- EfiBootServicesCode,\r
- EFI_SIZE_TO_PAGES(Idtr.Limit + 1 + sizeof (UINTN)),\r
- &IdtBase\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Migrate Idt table\r
- //\r
- CopyMem ((VOID *) (UINTN) IdtBase, (VOID *) (Idtr.Base - sizeof (UINTN)), Idtr.Limit + 1 + sizeof (UINTN));\r
- Idtr.Base = (UINTN) IdtBase + sizeof (UINTN);\r
- AsmWriteIdtr (&Idtr);\r
- }\r
- }\r
- }\r
+ (*(UINTN*)(Idtr.Base - sizeof (UINTN))) = (UINTN)PeiServicesTablePointer;\r
+}\r
+\r
+/**\r
+ Perform CPU specific actions required to migrate the PEI Services Table \r
+ pointer from temporary RAM to permanent RAM.\r
+\r
+ For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+ immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
+ For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+ immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
+ For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
+ a dedicated CPU register. This means that there is no memory storage \r
+ associated with storing the PEI Services Table pointer, so no additional \r
+ migration actions are required for Itanium or ARM CPUs.\r
+\r
+ If The cached PEI Services Table pointer is NULL, then ASSERT().\r
+ If the permanent memory is allocated failed, then ASSERT().\r
+**/\r
+VOID\r
+EFIAPI\r
+MigratePeiServicesTablePointer (\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ IA32_DESCRIPTOR Idtr;\r
+ EFI_PHYSICAL_ADDRESS IdtBase;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
+\r
+ //\r
+ // Get PEI Services Table pointer\r
+ //\r
+ AsmReadIdtr (&Idtr);\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) (*(UINTN*)(Idtr.Base - sizeof (UINTN)));\r
+ ASSERT (PeiServices != NULL);\r
+ //\r
+ // Allocate the permanent memory.\r
+ //\r
+ Status = (*PeiServices)->AllocatePages (\r
+ PeiServices, \r
+ EfiBootServicesCode,\r
+ EFI_SIZE_TO_PAGES(Idtr.Limit + 1 + sizeof (UINTN)),\r
+ &IdtBase\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Idt table needs to be migrated into memory.\r
+ //\r
+ CopyMem ((VOID *) (UINTN) IdtBase, (VOID *) (Idtr.Base - sizeof (UINTN)), Idtr.Limit + 1 + sizeof (UINTN));\r
+ Idtr.Base = (UINTN) IdtBase + sizeof (UINTN);\r
+ AsmWriteIdtr (&Idtr);\r
+ \r
+ return;\r