/** @file | |
UEFI Dxe DebugLib constructor that prevent some debug service after ExitBootServices event, | |
because some pointer is nulled at that phase. | |
Copyright (c) 2018, Microsoft Corporation | |
Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Uefi.h> | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
// | |
// BOOLEAN value to indicate if it is at the post ExitBootServices pahse | |
// | |
BOOLEAN mPostEBS = FALSE; | |
static EFI_EVENT mExitBootServicesEvent; | |
// | |
// Pointer to SystemTable | |
// This library instance may have a cycle consume with UefiBootServicesTableLib | |
// because of the constructors. | |
// | |
EFI_SYSTEM_TABLE *mDebugST; | |
/** | |
This routine sets the mPostEBS for exit boot servies true | |
to prevent DebugPort protocol dereferences when the pointer is nulled. | |
@param Event Event whose notification function is being invoked. | |
@param Context Pointer to the notification function's context. | |
**/ | |
VOID | |
EFIAPI | |
ExitBootServicesCallback ( | |
EFI_EVENT Event, | |
VOID *Context | |
) | |
{ | |
mPostEBS = TRUE; | |
return; | |
} | |
/** | |
The constructor gets the pointers to the system table. | |
And create a event to indicate it is after ExitBootServices. | |
@param ImageHandle The firmware allocated handle for the EFI image. | |
@param SystemTable A pointer to the EFI System Table. | |
@retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
DxeDebugLibConstructor ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
mDebugST = SystemTable; | |
SystemTable->BootServices->CreateEvent ( | |
EVT_SIGNAL_EXIT_BOOT_SERVICES, | |
TPL_NOTIFY, | |
ExitBootServicesCallback, | |
NULL, | |
&mExitBootServicesEvent | |
); | |
return EFI_SUCCESS; | |
} | |
/** | |
The destructor closes Exit Boot Services Event. | |
@param ImageHandle The firmware allocated handle for the EFI image. | |
@param SystemTable A pointer to the EFI System Table. | |
@retval EFI_SUCCESS The destructor always returns EFI_SUCCESS. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
DxeDebugLibDestructor ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
if (mExitBootServicesEvent != NULL) { | |
SystemTable->BootServices->CloseEvent (mExitBootServicesEvent); | |
} | |
return EFI_SUCCESS; | |
} |