/** @file\r
PEI Services Table Pointer Library for IA-32 and X64.\r
\r
+ According to PI specification, the peiservice pointer is stored prior at IDT\r
+ table in IA32 and x64 architecture.\r
+ \r
Copyright (c) 2006 - 2007, Intel Corporation.<BR>\r
All rights reserved. This program and the accompanying materials \r
are licensed and made available under the terms and conditions of the BSD License \r
\r
**/\r
\r
-#include "InternalPeiServicesTablePointer.h"\r
+#include <PiPei.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/PeiServicesTablePointerLib.h>\r
+#include <Library/DebugLib.h>\r
\r
/**\r
\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
+ @return The pointer to PeiServices.\r
\r
**/\r
-EFI_PEI_SERVICES **\r
+CONST EFI_PEI_SERVICES **\r
EFIAPI\r
GetPeiServicesTablePointer (\r
VOID\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
-\r
- PeiServices = (EFI_PEI_SERVICES **) AsmPeiSevicesTablePointer ();\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
+ IA32_DESCRIPTOR Idtr;\r
+ \r
+ AsmReadIdtr (&Idtr);\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) (*(UINTN*)(Idtr.Base - sizeof (UINTN)));\r
ASSERT (PeiServices != NULL);\r
return PeiServices;\r
}\r
\r
+/**\r
+ \r
+ The function sets 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
+ \r
+ @param PeiServicesTablePointer The pointer to PeiServices.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetPeiServicesTablePointer (\r
+ IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer\r
+ )\r
+{\r
+ IA32_DESCRIPTOR Idtr;\r
+ \r
+ AsmReadIdtr (&Idtr);\r
+ (*(UINTN*)(Idtr.Base - sizeof (UINTN))) = (UINTN)PeiServicesTablePointer;\r
+}\r
+\r
+\r