Move SAL "initialization/virtual address change notification" from EdkUefiRuntimeLib to EdkDxeSalLib.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2009 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -21,6 +21,7 @@ Abstract:
|
||||
|
||||
|
||||
STATIC EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *mEsalBootService;
|
||||
STATIC EFI_PLABEL mPlabel;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
@@ -29,14 +30,59 @@ DxeSalLibConstruct (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PLABEL *Plabel;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiExtendedSalBootServiceProtocolGuid, NULL, &mEsalBootService);
|
||||
//
|
||||
// The protocol contains a function pointer, which is an indirect procedure call.
|
||||
// An indirect procedure call goes through a plabel, and pointer to a function is
|
||||
// a pointer to a plabel. To implement indirect procedure calls that can work in
|
||||
// both physical and virtual mode, two plabels are required (one physical and one
|
||||
// virtual). So lets grap the physical PLABEL for the EsalEntryPoint and store it
|
||||
// away. We cache it in a module global, so we can register the vitrual version.
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiExtendedSalBootServiceProtocolGuid, NULL, &mEsalBootService);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Plabel = (EFI_PLABEL *) (UINTN) mEsalBootService->ExtendedSalProc;
|
||||
|
||||
mPlabel.EntryPoint = Plabel->EntryPoint;
|
||||
mPlabel.GP = Plabel->GP;
|
||||
SetEsalPhysicalEntryPoint (mPlabel.EntryPoint, mPlabel.GP);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
DxeSalVirtualNotifyEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Fixup virtual address pointer of label.
|
||||
|
||||
Arguments:
|
||||
|
||||
Event - The Event that is being processed
|
||||
|
||||
Context - Event Context
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EfiConvertPointer (0x0, (VOID **) &mPlabel.EntryPoint);
|
||||
EfiConvertPointer (EFI_IPF_GP_POINTER, (VOID **) &mPlabel.GP);
|
||||
|
||||
SetEsalVirtualEntryPoint (mPlabel.EntryPoint, mPlabel.GP);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RegisterEsalFunction (
|
||||
|
Reference in New Issue
Block a user