Add support for PI1.2.1 TempRam Done PPI.
Signed-off-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Jeff Fan <jeff.fan@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14846 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -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.<BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
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 <Library/BaseLib.h>
|
||||
#include <Library/PeiServicesTablePointerLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Ppi/TemporaryRamSupport.h>
|
||||
|
||||
/**
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user