From 81c7803cf4a49ca2633c706b7630c1cf2d9e9b55 Mon Sep 17 00:00:00 2001 From: klu2 Date: Tue, 9 Oct 2007 08:16:53 +0000 Subject: PI Enabling: the address of PeiServices Pointer should be 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 --- .../InternalPeiServicesTablePointer.h | 12 ++--- .../PeiServicesTablePointer.c | 61 +++++++++++++++++++++- .../PeiServicesTablePointerLibIdt.inf | 14 ++--- 3 files changed, 70 insertions(+), 17 deletions(-) (limited to 'MdePkg/Library/PeiServicesTablePointerLibIdt') diff --git a/MdePkg/Library/PeiServicesTablePointerLibIdt/InternalPeiServicesTablePointer.h b/MdePkg/Library/PeiServicesTablePointerLibIdt/InternalPeiServicesTablePointer.h index e1c74901ac..61bc1ebf41 100644 --- a/MdePkg/Library/PeiServicesTablePointerLibIdt/InternalPeiServicesTablePointer.h +++ b/MdePkg/Library/PeiServicesTablePointerLibIdt/InternalPeiServicesTablePointer.h @@ -19,15 +19,11 @@ #include +#include #include #include +#include +#include -extern -EFI_PEI_SERVICES ** -EFIAPI -AsmPeiSevicesTablePointer ( - VOID - ); - - + #endif diff --git a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c index 6a52451381..2536d6a861 100644 --- a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c +++ b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c @@ -33,9 +33,66 @@ GetPeiServicesTablePointer ( ) { EFI_PEI_SERVICES **PeiServices; - - PeiServices = (EFI_PEI_SERVICES **) AsmPeiSevicesTablePointer (); + IA32_DESCRIPTOR Idtr; + + AsmReadIdtr (&Idtr); + PeiServices = (EFI_PEI_SERVICES **) (*(UINTN*)(Idtr.Base - 4)); ASSERT (PeiServices != NULL); return PeiServices; } +/** + + The function returns the pointer to PeiServicee following + PI1.0. + + For IA32, the four-bytes field immediately prior to new IDT + base addres is used to save the EFI_PEI_SERVICES**. + For x64, the eight-bytes field immediately prior to new IDT + base addres is used to save the EFI_PEI_SERVICES** + @retval The pointer to PeiServices. + +**/ +VOID +EFIAPI +SetPeiServicesTablePointer ( + EFI_PEI_SERVICES ** PeiServicesTablePointer + ) +{ + IA32_DESCRIPTOR Idtr; + + AsmReadIdtr (&Idtr); + (*(UINTN*)(Idtr.Base - 4)) = (UINTN)PeiServicesTablePointer; +} + +/** + After memory initialization in PEI phase, the IDT table in temporary memory should + be migrated to memory, and the address of PeiServicesPointer also need to be updated + immediately preceding the new IDT table. + + @param PeiServices The address of PeiServices pointer. +**/ +VOID +MigrateIdtTable ( + IN EFI_PEI_SERVICES **PeiServices + ) +{ + UINTN Size; + VOID *NewBase; + EFI_STATUS Status; + IA32_DESCRIPTOR Idtr; + + AsmReadIdtr (&Idtr); + + Size = sizeof(UINTN) + (Idtr.Limit + 1); + + Status = PeiServicesAllocatePool (Size, &NewBase); + ASSERT_EFI_ERROR (Status); + + CopyMem ((VOID*)((UINTN)NewBase + sizeof(UINTN)), (VOID*)Idtr.Base, (Idtr.Limit + 1)); + + Idtr.Base = (UINTN)NewBase + sizeof(UINTN); + AsmWriteIdtr (&Idtr); + SetPeiServicesTablePointer(PeiServices); +} + diff --git a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf index 049f8754e5..6baad7a600 100644 --- a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf +++ b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf @@ -31,16 +31,16 @@ [Packages] MdePkg/MdePkg.dec -[Sources.Ia32] - Ia32/AsmPeiSevicesTablePointer.c|MSFT - Ia32/AsmPeiSevicesTablePointer.S|GCC +[Sources] PeiServicesTablePointer.c + InternalPeiServicesTablePointer.h -[Sources.X64] - x64/AsmPeiSevicesTablePointer.asm|MSFT - x64/AsmPeiSevicesTablePointer.S|GCC - PeiServicesTablePointer.c [LibraryClasses] DebugLib + BaseMemoryLib + PeiServicesLib + BaseLib + + -- cgit v1.2.3