From fcfd5fb01b2c5af6efd2df5e2f54d688d9bcd8a3 Mon Sep 17 00:00:00 2001 From: Liming Gao Date: Fri, 15 Nov 2013 02:04:57 +0000 Subject: Add support for PI1.2.1 TempRam Done PPI. Signed-off-by: Liming Gao Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14846 6f19259b-4bc3-4df7-8a09-765794883524 --- .../PeiServicesTablePointer.c | 40 ++++++++++++++++++++-- .../PeiServicesTablePointerLibIdt.inf | 7 ++-- 2 files changed, 41 insertions(+), 6 deletions(-) (limited to 'MdePkg/Library') diff --git a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c index c5fb8f552e..4e3f013ed9 100644 --- a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c +++ b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointer.c @@ -4,7 +4,7 @@ According to PI specification, the peiservice pointer is stored prior at IDT table in IA32 and x64 architecture. - Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -20,6 +20,8 @@ #include #include #include +#include +#include /** Retrieves the cached value of the PEI Services Table pointer. @@ -67,11 +69,43 @@ SetPeiServicesTablePointer ( IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer ) { - IA32_DESCRIPTOR Idtr; + IA32_DESCRIPTOR Idtr; + EFI_PHYSICAL_ADDRESS IdtBase; + EFI_STATUS Status; + EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI *TemporaryRamSupportPpi; ASSERT (PeiServicesTablePointer != NULL); AsmReadIdtr (&Idtr); - (*(UINTN*)(Idtr.Base - sizeof (UINTN))) = (UINTN)PeiServicesTablePointer; + if ((*(UINTN*)(Idtr.Base - sizeof (UINTN))) != (UINTN)PeiServicesTablePointer) { + (*(UINTN*)(Idtr.Base - sizeof (UINTN))) = (UINTN)PeiServicesTablePointer; + Status = (*PeiServicesTablePointer)->LocatePpi ( + PeiServicesTablePointer, + &gEfiTemporaryRamSupportPpiGuid, + 0, + NULL, + (VOID**)&TemporaryRamSupportPpi + ); + + if (EFI_ERROR (Status)) { + // + // If TemporaryRamSupportPpi is not found, Idt table needs to be migrated into memory. + // + Status = (*PeiServicesTablePointer)->AllocatePages ( + PeiServicesTablePointer, + EfiBootServicesCode, + EFI_SIZE_TO_PAGES(Idtr.Limit + 1 + sizeof (UINTN)), + &IdtBase + ); + if (!EFI_ERROR (Status)) { + // + // Migrate Idt table + // + CopyMem ((VOID *) (UINTN) IdtBase, (VOID *) (Idtr.Base - sizeof (UINTN)), Idtr.Limit + 1 + sizeof (UINTN)); + Idtr.Base = (UINTN) IdtBase + sizeof (UINTN); + AsmWriteIdtr (&Idtr); + } + } + } } diff --git a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf index 1a54bd4667..020a7f7e83 100644 --- a/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf +++ b/MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf @@ -4,7 +4,7 @@ # PEI Services Table Pointer Library implementation that retrieves a pointer to the PEI # Services Table from the IDT on IA-32 and x64. # -# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -39,6 +39,7 @@ [LibraryClasses] DebugLib BaseLib + BaseMemoryLib - - +[Ppis] + gEfiTemporaryRamSupportPpiGuid ## SOMETIMES_CONSUMES -- cgit v1.2.3