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

Reply via email to