Reviewed-by: Ray Ni <ray...@intel.com> > -----Original Message----- > From: Gao, Zhichao <zhichao....@intel.com> > Sent: Monday, February 18, 2019 3:33 PM > To: edk2-devel@lists.01.org > Cc: Ni, Ray <ray...@intel.com>; Gao, Liming <liming....@intel.com> > Subject: [PATCH 2/2] MdeModulePkg: Add a runtime library instance of > ResetSystemLib > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1461 > > For now there is no ResetSystemLib instance that can be linked against > Runtime driver. And it's improper to extend the existing DxeResetSystemLib > to support Runtime driver because no one converts gRT when entering RT > phase. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Zhichao Gao <zhichao....@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Liming Gao <liming....@intel.com> > --- > .../RuntimeResetSystemLib/RuntimeResetSystemLib.c | 216 > +++++++++++++++++++++ > .../RuntimeResetSystemLib.inf | 50 +++++ > .../RuntimeResetSystemLib.uni | 21 ++ > 3 files changed, 287 insertions(+) > create mode 100644 > MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib.c > create mode 100644 > MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib.i > nf > create mode 100644 > MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib.u > ni > > diff --git > a/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .c > b/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .c > new file mode 100644 > index 0000000000..17826cd6a9 > --- /dev/null > +++ > b/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .c > @@ -0,0 +1,216 @@ > +/** @file > + DXE Reset System Library instance that calls gRT->ResetSystem(). > + > + Copyright (c) 2017 - 2019, 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 > + http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > +**/ > + > +#include <PiDxe.h> > +#include <Library/ResetSystemLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/DebugLib.h> > + > +EFI_EVENT > mRuntimeResetSystemLibVirtualAddressChangeEvent; > +EFI_RUNTIME_SERVICES *mInternalRT; > + > +/** > + This function causes a system-wide reset (cold reset), in which > + all circuitry within the system returns to its initial state. This > +type of reset > + is asynchronous to system operation and operates without regard to > + cycle boundaries. > + > + If this function returns, it means that the system does not support cold > reset. > +**/ > +VOID > +EFIAPI > +ResetCold ( > + VOID > + ) > +{ > + mInternalRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); } > + > +/** > + This function causes a system-wide initialization (warm reset), in > +which all processors > + are set to their initial state. Pending cycles are not corrupted. > + > + If this function returns, it means that the system does not support warm > reset. > +**/ > +VOID > +EFIAPI > +ResetWarm ( > + VOID > + ) > +{ > + mInternalRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); } > + > +/** > + This function causes the system to enter a power state equivalent > + to the ACPI G2/S5 or G3 states. > + > + If this function returns, it means that the system does not support shut > down reset. > +**/ > +VOID > +EFIAPI > +ResetShutdown ( > + VOID > + ) > +{ > + mInternalRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); } > + > +/** > + This function causes the system to enter S3 and then wake up immediately. > + > + If this function returns, it means that the system does not support S3 > feature. > +**/ > +VOID > +EFIAPI > +EnterS3WithImmediateWake ( > + VOID > + ) > +{ > +} > + > +/** > + This function causes a systemwide reset. The exact type of the reset > +is > + defined by the EFI_GUID that follows the Null-terminated Unicode > +string passed > + into ResetData. If the platform does not recognize the EFI_GUID in > +ResetData > + the platform must pick a supported reset type to perform.The platform > +may > + optionally log the parameters from any non-normal reset that occurs. > + > + @param[in] DataSize The size, in bytes, of ResetData. > + @param[in] ResetData The data buffer starts with a Null-terminated > string, > + followed by the EFI_GUID. > +**/ > +VOID > +EFIAPI > +ResetPlatformSpecific ( > + IN UINTN DataSize, > + IN VOID *ResetData > + ) > +{ > + mInternalRT->ResetSystem (EfiResetPlatformSpecific, EFI_SUCCESS, > +DataSize, ResetData); } > + > +/** > + The ResetSystem function resets the entire platform. > + > + @param[in] ResetType The type of reset to perform. > + @param[in] ResetStatus The status code for the reset. > + @param[in] DataSize The size, in bytes, of ResetData. > + @param[in] ResetData For a ResetType of EfiResetCold, EfiResetWarm, > or EfiResetShutdown > + the data buffer starts with a Null-terminated > string, optionally > + followed by additional binary data. The string > is a description > + that the caller may use to further indicate the > reason for the > + system reset. ResetData is only valid if > ResetStatus is > something > + other than EFI_SUCCESS unless the ResetType is > EfiResetPlatformSpecific > + where a minimum amount of ResetData is always > required. > +**/ > +VOID > +EFIAPI > +ResetSystem ( > + IN EFI_RESET_TYPE ResetType, > + IN EFI_STATUS ResetStatus, > + IN UINTN DataSize, > + IN VOID *ResetData OPTIONAL > + ) > +{ > + mInternalRT->ResetSystem (ResetType, ResetStatus, DataSize, > +ResetData); } > + > +/** > + Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. > + > + @param Event Event whose notification function is being invoked. > + @param Context Pointer to the notification function's context > + > +**/ > +VOID > +EFIAPI > +RuntimeResetSystemLibVirtualAddressChange ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + mInternalRT->ConvertPointer (0, (VOID **) &mInternalRT); } > + > +/** > + The constructor function of Runtime Reset System Lib. > + > + This function allocates memory for extended status code data, caches > + the report status code service, and registers events. > + > + @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 > +RuntimeResetSystemLibConstruct ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + // > + // Library should not use the gRT directly, for it may be converted by > other > library instance. > + // > + mInternalRT = gRT; > + > + // > + // Register notify function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE > // > + Status = gBS->CreateEventEx ( > + EVT_NOTIFY_SIGNAL, > + TPL_NOTIFY, > + RuntimeResetSystemLibVirtualAddressChange, > + NULL, > + &gEfiEventVirtualAddressChangeGuid, > + &mRuntimeResetSystemLibVirtualAddressChangeEvent > + ); > + ASSERT_EFI_ERROR (Status); > + > + return EFI_SUCCESS; > +} > + > +/** > + The Deconstructor function of Runtime Reset System Lib. > + > + The destructor function frees memory allocated by constructor, and closes > related events. > + It will ASSERT() if that related operation fails and it will always return > EFI_SUCCESS. > + > + @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 > +RuntimeResetSystemLibDeconstruct ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + ASSERT (gBS != NULL); > + Status = gBS->CloseEvent > + (mRuntimeResetSystemLibVirtualAddressChangeEvent); > + ASSERT_EFI_ERROR (Status); > + > + return EFI_SUCCESS; > +} > diff --git > a/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .inf > b/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .inf > new file mode 100644 > index 0000000000..0a43b2827e > --- /dev/null > +++ > b/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .i > +++ nf > @@ -0,0 +1,50 @@ > +## @file > +# Runtime Reset System Library instance that calls gRT->ResetSystem(). > +# > +# Copyright (c) 2017 - 2019, 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 # > +http://opensource.org/licenses/bsd-license.php > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, > EITHER EXPRESS OR IMPLIED. > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = RuntimeResetSystemLib > + MODULE_UNI_FILE = RuntimeResetSystemLib.uni > + FILE_GUID = DD5D0821-F343-4C85-9CD9-54B3C1A19CEA > + MODULE_TYPE = DXE_RUNTIME_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = ResetSystemLib|DXE_RUNTIME_DRIVER > + > + CONSTRUCTOR = RuntimeResetSystemLibConstruct > + DESTRUCTOR = RuntimeResetSystemLibDeconstruct > + > + > +# > +# The following information is for reference only and not required by the > build tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 EBC > +# > + > +[Sources] > + RuntimeResetSystemLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + > +[LibraryClasses] > + UefiRuntimeServicesTableLib > + UefiBootServicesTableLib > + DebugLib > + > +[Guids] > + gEfiEventVirtualAddressChangeGuid ## CONSUMES ## Event > + > +[Depex] > + gEfiResetArchProtocolGuid > diff --git > a/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .uni > b/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .uni > new file mode 100644 > index 0000000000..e560643c10 > --- /dev/null > +++ > b/MdeModulePkg/Library/RuntimeResetSystemLib/RuntimeResetSystemLib > .u > +++ ni > @@ -0,0 +1,21 @@ > +// /** @file > +// Runtime Reset System Library instance that calls gRT->ResetSystem(). > +// > +// Runtime Reset System Library instance that calls gRT->ResetSystem(). > +// > +// Copyright (c) 2019, 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 // http://opensource.org/licenses/bsd-license.php > +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > +BASIS, // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, > EITHER EXPRESS OR IMPLIED. > +// > +// **/ > + > + > +#string STR_MODULE_ABSTRACT #language en-US "Runtime Reset > System Library instance that calls gRT->ResetSystem()" > + > +#string STR_MODULE_DESCRIPTION #language en-US "Runtime Reset > System Library instance that calls gRT->ResetSystem()." > + > -- > 2.16.2.windows.1
_______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel