// Migrate IDT from CAR into real memory, so after stack switches to\r
// the new memory, the caller can get memory version PeiServiceTable. \r
//\r
- //MigrateIdtTable (PeiServices); \r
+ MigrateIdtTable (PeiServices);\r
+\r
//\r
// Since we are at dispatch level, only the Core's private data \r
// is preserved, nobody else should have any data on the stack. \r
\r
InitializePpiServices (&PrivateData, OldCoreData);\r
\r
+ //\r
+ // Save PeiServicePointer so that it can be retrieved anywhere.\r
+ //\r
+ SetPeiServicesTablePointer(&PrivateData.PS);\r
+ \r
if (OldCoreData != NULL) {\r
\r
PERF_END (NULL,"PreMem", NULL, 0);\r
VOID\r
);\r
\r
+/**\r
+ The function set the pointer of PEI services immediately preceding the IDT table\r
+ according to PI specification.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
VOID\r
EFIAPI\r
SetPeiServicesTablePointer (\r
EFI_PEI_SERVICES ** PeiServicesTablePointer\r
);\r
\r
+/**\r
+ After memory initialization in PEI phase, the IDT table in temporary memory should \r
+ be migrated to memory, and the address of PeiServicesPointer also need to be updated \r
+ immediately preceding the new IDT table.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
+VOID\r
+MigrateIdtTable (\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ );\r
+ \r
#endif\r
\r
\r
static EFI_PEI_SERVICES **gPeiServices;\r
\r
+/**\r
+ The function set the pointer of PEI services immediately preceding the IDT table\r
+ according to PI specification.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
VOID\r
EFIAPI\r
SetPeiServicesTablePointer (\r
gPeiServices = PeiServices;\r
return EFI_SUCCESS;\r
}\r
+\r
+/**\r
+ After memory initialization in PEI phase, the IDT table in temporary memory should \r
+ be migrated to memory, and the address of PeiServicesPointer also need to be updated \r
+ immediately preceding the new IDT table.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
+VOID\r
+MigrateIdtTable (\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ )\r
+{\r
+}\r
+\r
\r
#include <PiPei.h>\r
\r
+#include <Library/BaseLib.h>\r
#include <Library/PeiServicesTablePointerLib.h>\r
#include <Library/DebugLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
\r
-extern \r
-EFI_PEI_SERVICES **\r
-EFIAPI\r
-AsmPeiSevicesTablePointer (\r
- VOID\r
- );\r
-\r
-\r
+ \r
#endif\r
)\r
{\r
EFI_PEI_SERVICES **PeiServices;\r
-\r
- PeiServices = (EFI_PEI_SERVICES **) AsmPeiSevicesTablePointer ();\r
+ IA32_DESCRIPTOR Idtr;\r
+ \r
+ AsmReadIdtr (&Idtr);\r
+ PeiServices = (EFI_PEI_SERVICES **) (*(UINTN*)(Idtr.Base - 4));\r
ASSERT (PeiServices != NULL);\r
return PeiServices;\r
}\r
\r
+/**\r
+ \r
+ The function returns the pointer to PeiServicee following\r
+ PI1.0.\r
+ \r
+ For IA32, the four-bytes field immediately prior to new IDT\r
+ base addres is used to save the EFI_PEI_SERVICES**.\r
+ For x64, the eight-bytes field immediately prior to new IDT\r
+ base addres is used to save the EFI_PEI_SERVICES**\r
+ @retval The pointer to PeiServices.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetPeiServicesTablePointer (\r
+ EFI_PEI_SERVICES ** PeiServicesTablePointer\r
+ )\r
+{\r
+ IA32_DESCRIPTOR Idtr;\r
+ \r
+ AsmReadIdtr (&Idtr);\r
+ (*(UINTN*)(Idtr.Base - 4)) = (UINTN)PeiServicesTablePointer;\r
+}\r
+\r
+/**\r
+ After memory initialization in PEI phase, the IDT table in temporary memory should \r
+ be migrated to memory, and the address of PeiServicesPointer also need to be updated \r
+ immediately preceding the new IDT table.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
+VOID\r
+MigrateIdtTable (\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ )\r
+{\r
+ UINTN Size;\r
+ VOID *NewBase;\r
+ EFI_STATUS Status;\r
+ IA32_DESCRIPTOR Idtr;\r
+ \r
+ AsmReadIdtr (&Idtr);\r
+ \r
+ Size = sizeof(UINTN) + (Idtr.Limit + 1); \r
+ \r
+ Status = PeiServicesAllocatePool (Size, &NewBase);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ CopyMem ((VOID*)((UINTN)NewBase + sizeof(UINTN)), (VOID*)Idtr.Base, (Idtr.Limit + 1));\r
+ \r
+ Idtr.Base = (UINTN)NewBase + sizeof(UINTN);\r
+ AsmWriteIdtr (&Idtr);\r
+ SetPeiServicesTablePointer(PeiServices); \r
+} \r
+\r
[Packages]\r
MdePkg/MdePkg.dec\r
\r
-[Sources.Ia32]\r
- Ia32/AsmPeiSevicesTablePointer.c|MSFT\r
- Ia32/AsmPeiSevicesTablePointer.S|GCC\r
+[Sources]\r
PeiServicesTablePointer.c\r
+ InternalPeiServicesTablePointer.h\r
\r
-[Sources.X64]\r
- x64/AsmPeiSevicesTablePointer.asm|MSFT\r
- x64/AsmPeiSevicesTablePointer.S|GCC\r
- PeiServicesTablePointer.c\r
\r
[LibraryClasses]\r
DebugLib\r
+ BaseMemoryLib\r
+ PeiServicesLib\r
+ BaseLib\r
+\r
+\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ After memory initialization in PEI phase, the IDT table in temporary memory should \r
+ be migrated to memory, and the address of PeiServicesPointer also need to be updated \r
+ immediately preceding the new IDT table.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
+VOID\r
+MigrateIdtTable (\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ )\r
+{\r
+}\r
+\r
\r
#include <Library/PeiServicesTablePointerLib.h>\r
#include <Library/BaseLib.h>\r
#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/PeiServicesLib.h>\r
\r
VOID\r
EFIAPI\r
AsmWriteMm7 ((UINT64)(UINTN)PeiServices);\r
return EFI_SUCCESS;\r
}\r
+\r
+/**\r
+ After memory initialization in PEI phase, the IDT table in temporary memory should \r
+ be migrated to memory, and the address of PeiServicesPointer also need to be updated \r
+ immediately preceding the new IDT table.\r
+ \r
+ @param PeiServices The address of PeiServices pointer.\r
+**/\r
+VOID\r
+MigrateIdtTable (\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ )\r
+{\r
+ UINTN Size;\r
+ VOID *NewBase;\r
+ EFI_STATUS Status;\r
+ IA32_DESCRIPTOR Idtr;\r
+ \r
+ AsmReadIdtr (&Idtr);\r
+ \r
+ Size = Idtr.Limit + 1;\r
+ \r
+ Status = PeiServicesAllocatePool (Size, &NewBase);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ CopyMem (NewBase, (VOID*)Idtr.Base, Size);\r
+ \r
+ Idtr.Base = (UINTN)NewBase;\r
+ AsmWriteIdtr (&Idtr);\r
+}\r
+\r
[LibraryClasses]\r
DebugLib\r
BaseLib\r
-\r
+ BaseMemoryLib\r
+ PeiServicesLib\r