mirror of https://github.com/acidanthera/audk.git
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
This commit is contained in:
parent
d173d9c761
commit
81c7803cf4
|
@ -395,7 +395,8 @@ Returns:
|
|||
// Migrate IDT from CAR into real memory, so after stack switches to
|
||||
// the new memory, the caller can get memory version PeiServiceTable.
|
||||
//
|
||||
//MigrateIdtTable (PeiServices);
|
||||
MigrateIdtTable (PeiServices);
|
||||
|
||||
//
|
||||
// Since we are at dispatch level, only the Core's private data
|
||||
// is preserved, nobody else should have any data on the stack.
|
||||
|
|
|
@ -166,6 +166,11 @@ Returns:
|
|||
|
||||
InitializePpiServices (&PrivateData, OldCoreData);
|
||||
|
||||
//
|
||||
// Save PeiServicePointer so that it can be retrieved anywhere.
|
||||
//
|
||||
SetPeiServicesTablePointer(&PrivateData.PS);
|
||||
|
||||
if (OldCoreData != NULL) {
|
||||
|
||||
PERF_END (NULL,"PreMem", NULL, 0);
|
||||
|
|
|
@ -30,11 +30,29 @@ GetPeiServicesTablePointer (
|
|||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
The function set the pointer of PEI services immediately preceding the IDT table
|
||||
according to PI specification.
|
||||
|
||||
@param PeiServices The address of PeiServices pointer.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SetPeiServicesTablePointer (
|
||||
EFI_PEI_SERVICES ** 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
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -20,6 +20,12 @@
|
|||
|
||||
static EFI_PEI_SERVICES **gPeiServices;
|
||||
|
||||
/**
|
||||
The function set the pointer of PEI services immediately preceding the IDT table
|
||||
according to PI specification.
|
||||
|
||||
@param PeiServices The address of PeiServices pointer.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SetPeiServicesTablePointer (
|
||||
|
@ -70,3 +76,18 @@ PeiServicesTablePointerLibConstructor (
|
|||
gPeiServices = PeiServices;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
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
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -19,15 +19,11 @@
|
|||
|
||||
#include <PiPei.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/PeiServicesTablePointerLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
extern
|
||||
EFI_PEI_SERVICES **
|
||||
EFIAPI
|
||||
AsmPeiSevicesTablePointer (
|
||||
VOID
|
||||
);
|
||||
#include <Library/PeiServicesLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -33,9 +33,66 @@ GetPeiServicesTablePointer (
|
|||
)
|
||||
{
|
||||
EFI_PEI_SERVICES **PeiServices;
|
||||
IA32_DESCRIPTOR Idtr;
|
||||
|
||||
PeiServices = (EFI_PEI_SERVICES **) AsmPeiSevicesTablePointer ();
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -62,4 +62,18 @@ PeiServicesTablePointerLibConstructor (
|
|||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
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
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
#include <Library/PeiServicesTablePointerLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PeiServicesLib.h>
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
|
@ -75,3 +77,34 @@ PeiServicesTablePointerLibConstructor (
|
|||
AsmWriteMm7 ((UINT64)(UINTN)PeiServices);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
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 = Idtr.Limit + 1;
|
||||
|
||||
Status = PeiServicesAllocatePool (Size, &NewBase);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
CopyMem (NewBase, (VOID*)Idtr.Base, Size);
|
||||
|
||||
Idtr.Base = (UINTN)NewBase;
|
||||
AsmWriteIdtr (&Idtr);
|
||||
}
|
||||
|
||||
|
|
|
@ -44,4 +44,5 @@
|
|||
[LibraryClasses]
|
||||
DebugLib
|
||||
BaseLib
|
||||
|
||||
BaseMemoryLib
|
||||
PeiServicesLib
|
||||
|
|
Loading…
Reference in New Issue