]> git.proxmox.com Git - mirror_edk2.git/commitdiff
PI Enabling: the address of PeiServices Pointer should be
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 9 Oct 2007 08:16:53 +0000 (08:16 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 9 Oct 2007 08:16:53 +0000 (08:16 +0000)
1) Set to preceding of IDT table in PeiCore's entry
2) Migrate to preceding of new memory IDT table when memory is discovery

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4059 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
MdePkg/Include/Library/PeiServicesTablePointerLib.h
MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
MdePkg/Library/PeiServicesTablePointerLibIdt/InternalPeiServicesTablePointer.h
MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c
MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf
MdePkg/Library/PeiServicesTablePointerLibKr7/PeiServicesTablePointer.c
MdePkg/Library/PeiServicesTablePointerLibMm7/PeiServicesTablePointer.c
MdePkg/Library/PeiServicesTablePointerLibMm7/PeiServicesTablePointerLibMm7.inf

index 9d73c53bb1cbc2b9eb2859502b20bfc23b862526..7294d85c6ce10ccc0eefe663052d1e5bb32ea3ed 100644 (file)
@@ -395,7 +395,8 @@ Returns:
               // 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
index f858740971891a72f7487196026b34adee98cc8f..4dd7f26c3094feaae756868ced39bb980afff460 100644 (file)
@@ -166,6 +166,11 @@ Returns:
 \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
index 7a602f9041126c67aae6bb4a6f736771e739267f..f6ced472651b62bd63ab5496b99b5a365477a0ae 100644 (file)
@@ -30,11 +30,29 @@ GetPeiServicesTablePointer (
   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
index 54a500a7326b1ff3aa25126ab6579b6185721c4d..871e52a25ac836b3c05b4c9bc534d86c50022d01 100644 (file)
 \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
@@ -70,3 +76,18 @@ PeiServicesTablePointerLibConstructor (
   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
index e1c74901ac77e1662f191673200fe9cd4114d24d..61bc1ebf413209d09bbe3c372ae806d214a8fbbc 100644 (file)
 \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
index 6a52451381bfcaab73723968a2ab5f8428c525be..2536d6a8614f3609d99b69227986af743f79a3aa 100644 (file)
@@ -33,9 +33,66 @@ GetPeiServicesTablePointer (
   )\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
index 049f8754e5b53bcf572870a3d6a086148b62b046..6baad7a600e19fffb93b052bd49570fe91864a32 100644 (file)
 [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
index 95d6d254478f53c076ed7fef4a24b95f0fc8cc27..5986e54af7f134a31365851b978d114fb9b57942 100644 (file)
@@ -62,4 +62,18 @@ PeiServicesTablePointerLibConstructor (
   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
index 4c439ebd5f6a4cac9b8fda8f16b69906ddbff4a7..46fe3083b96d3a2163c57cbf5282e32b79cc8a85 100644 (file)
@@ -21,6 +21,8 @@
 #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
@@ -75,3 +77,34 @@ PeiServicesTablePointerLibConstructor (
   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
index 54edec520ddca5f5536181731e13208c77c9f890..a0371843d1d82a1bc90ccd35e81e35a7f037c1ad 100644 (file)
@@ -44,4 +44,5 @@
 [LibraryClasses]\r
   DebugLib\r
   BaseLib\r
-\r
+  BaseMemoryLib\r
+  PeiServicesLib\r