diff --git a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf new file mode 100644 index 0000000000..84e9dbae22 --- /dev/null +++ b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf @@ -0,0 +1,61 @@ +## @file +# DebugLib instance that produces debug output directly via PL011UartLib. +# +# If there are at least two PL011 UARTs in the device tree, and the /chosen +# node's "stdout-path" property references one PL011 UART, then both raw +# SerialPortLib IO, and -- via SerialDxe -- UEFI console IO, will occur on that +# UART; and this DebugLib instance will produce output on a *different* UART. +# +# This instance is suitable for DXE_RUNTIME_DRIVER modules. When exiting boot +# services, UART access is stopped. +# +# Copyright (C) Red Hat +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 1.27 + BASE_NAME = DxeRuntimeDebugLibFdtPL011Uart + FILE_GUID = 8A6E0972-81B5-4FF4-BB24-A07748415947 + MODULE_TYPE = DXE_RUNTIME_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = DebugLib|DXE_RUNTIME_DRIVER + CONSTRUCTOR = DxeRuntimeDebugLibFdtPL011UartConstructor + DESTRUCTOR = DxeRuntimeDebugLibFdtPL011UartDestructor + +[Sources] + DebugLib.c + Ram.c + Ram.h + Runtime.c + Write.h + +[Packages] + ArmPlatformPkg/ArmPlatformPkg.dec + ArmVirtPkg/ArmVirtPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugPrintErrorLevelLib + HobLib # Ram.c + PL011UartLib + PcdLib + PrintLib + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask + gEfiMdePkgTokenSpaceGuid.PcdFixedDebugPrintErrorLevel + +[FixedPcd] + gArmPlatformTokenSpaceGuid.PL011UartClkInHz + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits + +[Guids] + gEarlyPL011BaseAddressGuid # Ram.c diff --git a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/Runtime.c b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/Runtime.c new file mode 100644 index 0000000000..de7144739c --- /dev/null +++ b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/Runtime.c @@ -0,0 +1,88 @@ +/** @file + Permanently disable the library instance in DXE_RUNTIME_DRIVER modules when + exiting boot services. + + Copyright (C) Red Hat + Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include "Ram.h" + +STATIC EFI_EVENT mExitBootServicesEvent; + +/** + Notification function that is triggered when the boot service + ExitBootServices() is called. + + @param[in] Event Event whose notification function is being invoked. Here, + unused. + + @param[in] Context The pointer to the notification function's context, which + is implementation-dependent. Here, unused. +**/ +STATIC +VOID +EFIAPI +ExitBootServicesNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + mDebugLibFdtPL011UartAddress = 0; + mDebugLibFdtPL011UartPermanentStatus = RETURN_ABORTED; +} + +/** + Library instance constructor, registering ExitBootServicesNotify(). + + @param[in] ImageHandle The firmware-allocated handle for the EFI image. + + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The operation completed successfully. + + @return Error codes propagated from CreateEvent(); the + registration of ExitBootServicesNotify() failed. +**/ +EFI_STATUS +EFIAPI +DxeRuntimeDebugLibFdtPL011UartConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return SystemTable->BootServices->CreateEvent ( + EVT_SIGNAL_EXIT_BOOT_SERVICES, + TPL_CALLBACK, + ExitBootServicesNotify, + NULL /* NotifyContext */, + &mExitBootServicesEvent + ); +} + +/** + Library instance destructor, deregistering ExitBootServicesNotify(). + + @param[in] ImageHandle The firmware-allocated handle for the EFI image. + + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS Library instance tear-down complete. + + @return Error codes propagated from CloseEvent(); the + deregistration of ExitBootServicesNotify() failed. +**/ +EFI_STATUS +EFIAPI +DxeRuntimeDebugLibFdtPL011UartDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return SystemTable->BootServices->CloseEvent (mExitBootServicesEvent); +}