From nobody Fri Nov 1 12:29:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1517553955472813.5426031811581; Thu, 1 Feb 2018 22:45:55 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id CDF86223AF814; Thu, 1 Feb 2018 22:40:05 -0800 (PST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 15C53223AF812 for ; Thu, 1 Feb 2018 22:40:03 -0800 (PST) Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Feb 2018 22:45:41 -0800 Received: from ray-dev.ccr.corp.intel.com ([10.239.9.19]) by fmsmga008.fm.intel.com with ESMTP; 01 Feb 2018 22:45:40 -0800 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.120; helo=mga04.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,447,1511856000"; d="scan'208";a="14900510" From: Ruiyu Ni To: edk2-devel@lists.01.org Date: Fri, 2 Feb 2018 14:45:27 +0800 Message-Id: <20180202064530.407028-8-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.15.1.windows.2 In-Reply-To: <20180202064530.407028-1-ruiyu.ni@intel.com> References: <20180202064530.407028-1-ruiyu.ni@intel.com> Subject: [edk2] [PATCH 07/10] MdeModulePkg: Add ResetUtility librray class and BASE instance X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael D Kinney , Star Zeng , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Michael D Kinney The library class that provides services to generate a GUID specific reset, parse the GUID from a GUID specific reset, and build the ResetData buffer for any type of reset that requires extra data. Cc: Liming Gao Reviewed-by: Ruiyu Ni Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney Signed-off-by: Ruiyu Ni --- MdeModulePkg/Include/Library/ResetUtilityLib.h | 111 +++++++++++ .../Library/ResetUtilityLib/ResetUtility.c | 221 +++++++++++++++++= ++++ .../Library/ResetUtilityLib/ResetUtilityLib.inf | 43 ++++ MdeModulePkg/MdeModulePkg.dsc | 7 + 4 files changed, 382 insertions(+) create mode 100644 MdeModulePkg/Include/Library/ResetUtilityLib.h create mode 100644 MdeModulePkg/Library/ResetUtilityLib/ResetUtility.c create mode 100644 MdeModulePkg/Library/ResetUtilityLib/ResetUtilityLib.inf diff --git a/MdeModulePkg/Include/Library/ResetUtilityLib.h b/MdeModulePkg/= Include/Library/ResetUtilityLib.h new file mode 100644 index 0000000000..94828785e2 --- /dev/null +++ b/MdeModulePkg/Include/Library/ResetUtilityLib.h @@ -0,0 +1,111 @@ +/** @file + This header describes various helper functions for resetting the system. + + Copyright (c) 2017 Intel Corporation. All rights reserved.
+ Copyright (c) 2016 Microsoft Corporation. All rights reserved.
+ + This program and the accompanying materials are licensed and made availa= ble under + the terms and conditions of the BSD License that accompanies this distri= bution. + 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 IMP= LIED. + +**/ +#ifndef _RESET_UTILITY_LIB_H_ +#define _RESET_UTILITY_LIB_H_ + +/** + This is a shorthand helper function to reset with a subtype so that + the caller doesn't have to bother with a function that has half a dozen + parameters. + + This will generate a reset with status EFI_SUCCESS, a NULL string, and + no custom data. The subtype will be formatted in such a way that it can = be + picked up by notification registrations and custom handlers. + + NOTE: This call will fail if the architectural ResetSystem underpinnings + are not initialized. For DXE, you can add gEfiResetArchProtocolGuid + to your DEPEX. + + @param[in] ResetType Base reset type as defined in UEFI spec. + @param[in] ResetSubtype GUID pointer for the reset subtype to be used. + +**/ +VOID +EFIAPI +ResetPlatformSpecificGuid ( + IN CONST GUID *ResetSubtype + ); + +/** + This function examines the DataSize and ResetData parameters passed to + to ResetSystem() and detemrines if the ResetData contains a Null-termina= ted + Unicode string followed by a GUID specific subtype. If the GUID specifi= c=20 + subtype is present, then a pointer to the GUID value in ResetData is ret= urned. + + @param[in] DataSize The size, in bytes, of ResetData. + @param[in] ResetData Pointer to the data buffer passed into ResetSyst= em(). + + @retval Pointer Pointer to the GUID value in ResetData. + @retval NULL ResetData is NULL. + @retval NULL ResetData does not start with a Null-terminated + Unicode string. + @retval NULL A Null-terminated Unicode string is present, but= there + are less than sizeof (GUID) bytes after the stri= ng. + @retval NULL No subtype is found. + +**/ +GUID * +EFIAPI +GetResetPlatformSpecificGuid ( + IN UINTN DataSize, + IN CONST VOID *ResetData + ); + +/** + This is a helper function that creates the reset data buffer that can be=20 + passed into ResetSystem(). + + The reset data buffer is returned in ResetData and contains ResetString + followed by the ResetSubtype GUID followed by the ExtraData. + + NOTE: Strings are internally limited by MAX_UINT16. + + @param[in, out] ResetDataSize On input, the size of the ResetData buffe= r. On + output, either the total number of bytes + copied, or the required buffer size. + @param[in, out] ResetData A pointer to the buffer in which to place= the + final structure. + @param[in] ResetSubtype Pointer to the GUID specific subtype. Th= is + parameter is optional and may be NULL. + @param[in] ResetString Pointer to a Null-terminated Unicode stri= ng + that describes the reset. This parameter= is + optional and may be NULL. + @param[in] ExtraDataSize The size, in bytes, of ExtraData buffer. + @param[in] ExtraData Pointer to a buffer of extra data. This + parameter is optional and may be NULL. + + @retval RETURN_SUCCESS ResetDataSize and ResetData are u= pdated. + @retval RETURN_INVALID_PARAMETER ResetDataSize is NULL. + @retval RETURN_INVALID_PARAMETER ResetData is NULL. + @retval RETURN_INVALID_PARAMETER ExtraData was provided without a + ResetSubtype. This is not support= ed by the + UEFI spec. + @retval RETURN_BUFFER_TOO_SMALL An insufficient buffer was provid= ed. + ResetDataSize is updated with min= imum size + required. +**/ +RETURN_STATUS +EFIAPI +BuildResetData ( + IN OUT UINTN *ResetDataSize, + IN OUT VOID *ResetData, + IN CONST GUID *ResetSubtype OPTIONAL, + IN CONST CHAR16 *ResetString OPTIONAL, + IN UINTN ExtraDataSize OPTIONAL, + IN CONST VOID *ExtraData OPTIONAL + ); + +#endif // _RESET_UTILITY_LIB_H_ diff --git a/MdeModulePkg/Library/ResetUtilityLib/ResetUtility.c b/MdeModul= ePkg/Library/ResetUtilityLib/ResetUtility.c new file mode 100644 index 0000000000..5bbe002be0 --- /dev/null +++ b/MdeModulePkg/Library/ResetUtilityLib/ResetUtility.c @@ -0,0 +1,221 @@ +/** @file + This contains the business logic for the module-specific Reset Helper fu= nctions. + + Copyright (c) 2017 Intel Corporation. All rights reserved.
+ Copyright (c) 2016 Microsoft Corporation. All rights reserved.
+ + This program and the accompanying materials are licensed and made availa= ble under + the terms and conditions of the BSD License that accompanies this distri= bution. + 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 IMP= LIED. + +**/ +#include +#include +#include +#include +#include + +typedef struct { + CHAR16 NullTerminator; + GUID ResetSubtype; +} RESET_UTILITY_GUID_SPECIFIC_RESET_DATA; + +/** + This is a shorthand helper function to reset with a subtype so that + the caller doesn't have to bother with a function that has half a dozen + parameters. + + This will generate a reset with status EFI_SUCCESS, a NULL string, and + no custom data. The subtype will be formatted in such a way that it can = be + picked up by notification registrations and custom handlers. + + NOTE: This call will fail if the architectural ResetSystem underpinnings + are not initialized. For DXE, you can add gEfiResetArchProtocolGuid + to your DEPEX. + + @param[in] ResetType Base reset type as defined in UEFI spec. + @param[in] ResetSubtype GUID pointer for the reset subtype to be used. + +**/ +VOID +EFIAPI +ResetPlatformSpecificGuid ( + IN CONST GUID *ResetSubtype + ) +{ + RESET_UTILITY_GUID_SPECIFIC_RESET_DATA ResetData; + + ResetData.NullTerminator =3D CHAR_NULL; + CopyGuid (&ResetData.ResetSubtype, ResetSubtype); + ResetPlatformSpecific (sizeof (ResetData), &ResetData); +} + +/** + This function examines the DataSize and ResetData parameters passed to + to ResetSystem() and detemrines if the ResetData contains a Null-termina= ted + Unicode string followed by a GUID specific subtype. If the GUID specifi= c=20 + subtype is present, then a pointer to the GUID value in ResetData is ret= urned. + + @param[in] DataSize The size, in bytes, of ResetData. + @param[in] ResetData Pointer to the data buffer passed into ResetSyst= em(). + + @retval Pointer Pointer to the GUID value in ResetData. + @retval NULL ResetData is NULL. + @retval NULL ResetData does not start with a Null-terminated + Unicode string. + @retval NULL A Null-terminated Unicode string is present, but= there + are less than sizeof (GUID) bytes after the stri= ng. + @retval NULL No subtype is found. + +**/ +GUID * +EFIAPI +GetResetPlatformSpecificGuid ( + IN UINTN DataSize, + IN CONST VOID *ResetData + ) +{ + UINTN ResetDataStringSize; + GUID *ResetSubtypeGuid; + + // + // Make sure parameters are valid + // + if ((ResetData =3D=3D NULL) || (DataSize < sizeof (GUID))) { + return NULL; + } + + // + // Determine the number of bytes in in the Null-terminated Unicode string + // at the beginning of ResetData including the Null terminator. + // + ResetDataStringSize =3D StrnSizeS (ResetData, (DataSize / sizeof (CHAR16= ))); + + // + // Now, assuming that we have enough data for a GUID after the string, t= he + // GUID should be immediately after the string itself. + // + if ((ResetDataStringSize < DataSize) && (DataSize - ResetDataStringSize)= >=3D sizeof (GUID)) { + ResetSubtypeGuid =3D (GUID *)((UINT8 *)ResetData + ResetDataStringSize= ); + DEBUG ((DEBUG_VERBOSE, __FUNCTION__" - Detected reset subtype %g...\n"= , ResetSubtypeGuid)); + return ResetSubtypeGuid; + } + return NULL; +} + +/** + This is a helper function that creates the reset data buffer that can be=20 + passed into ResetSystem(). + + The reset data buffer is returned in ResetData and contains ResetString + followed by the ResetSubtype GUID followed by the ExtraData. + + NOTE: Strings are internally limited by MAX_UINT16. + + @param[in, out] ResetDataSize On input, the size of the ResetData buffe= r. On + output, either the total number of bytes + copied, or the required buffer size. + @param[in, out] ResetData A pointer to the buffer in which to place= the + final structure. + @param[in] ResetSubtype Pointer to the GUID specific subtype. Th= is + parameter is optional and may be NULL. + @param[in] ResetString Pointer to a Null-terminated Unicode stri= ng + that describes the reset. This parameter= is + optional and may be NULL. + @param[in] ExtraDataSize The size, in bytes, of ExtraData buffer. + @param[in] ExtraData Pointer to a buffer of extra data. This + parameter is optional and may be NULL. + + @retval RETURN_SUCCESS ResetDataSize and ResetData are u= pdated. + @retval RETURN_INVALID_PARAMETER ResetDataSize is NULL. + @retval RETURN_INVALID_PARAMETER ResetData is NULL. + @retval RETURN_INVALID_PARAMETER ExtraData was provided without a + ResetSubtype. This is not support= ed by the + UEFI spec. + @retval RETURN_BUFFER_TOO_SMALL An insufficient buffer was provid= ed. + ResetDataSize is updated with min= imum size + required. +**/ +RETURN_STATUS +EFIAPI +BuildResetData ( + IN OUT UINTN *ResetDataSize, + IN OUT VOID *ResetData, + IN CONST GUID *ResetSubtype OPTIONAL, + IN CONST CHAR16 *ResetString OPTIONAL, + IN UINTN ExtraDataSize OPTIONAL, + IN CONST VOID *ExtraData OPTIONAL + ) +{ + UINTN ResetStringSize; + UINTN ResetDataBufferSize; + UINT8 *Data; + + // + // If the size return pointer is NULL. + // + if (ResetDataSize =3D=3D NULL) { + return RETURN_INVALID_PARAMETER; + } + // + // If extra data is indicated, but pointer is NULL. + // + if (ExtraDataSize > 0 && ExtraData =3D=3D NULL) { + return RETURN_INVALID_PARAMETER; + } + // + // If extra data is indicated, but no subtype GUID is supplied. + // + if (ResetSubtype =3D=3D NULL && ExtraDataSize > 0) { + return RETURN_INVALID_PARAMETER; + } + + // + // Determine the final string. + // + if (ResetString =3D=3D NULL) { + ResetString =3D L""; // Use an empty string. + } + =20 + // + // Calculate the total buffer required for ResetData. + // + ResetStringSize =3D StrnSizeS (ResetString, MAX_UINT16); + ResetDataBufferSize =3D ResetStringSize + ExtraDataSize; + if (ResetSubtype !=3D NULL) { + ResetDataBufferSize +=3D sizeof (GUID); + } + + // + // At this point, if the buffer isn't large enough (or if + // the buffer is NULL) we cannot proceed. + // + if (*ResetDataSize < ResetDataBufferSize) { + *ResetDataSize =3D ResetDataBufferSize; + return RETURN_BUFFER_TOO_SMALL; + } + *ResetDataSize =3D ResetDataBufferSize; + if (ResetData =3D=3D NULL) { + return RETURN_INVALID_PARAMETER; + } + + // + // Fill in ResetData with ResetString, the ResetSubtype GUID, and extra = data + // + Data =3D (UINT8 *)ResetData; + CopyMem (Data, ResetString, ResetStringSize); + Data +=3D ResetStringSize; + if (ResetSubtype !=3D NULL) { + CopyMem (Data, ResetSubtype, sizeof (GUID)); + Data +=3D sizeof (GUID); + } + if (ExtraDataSize > 0) { + CopyMem (Data, ExtraData, ExtraDataSize); + } + =20 + return RETURN_SUCCESS; +} diff --git a/MdeModulePkg/Library/ResetUtilityLib/ResetUtilityLib.inf b/Mde= ModulePkg/Library/ResetUtilityLib/ResetUtilityLib.inf new file mode 100644 index 0000000000..7a403749c5 --- /dev/null +++ b/MdeModulePkg/Library/ResetUtilityLib/ResetUtilityLib.inf @@ -0,0 +1,43 @@ +## @file +# This file contains the Reset Utility functions. +# +# The application pops up a menu showing all the boot options referenced = by +# BootOrder NV variable and user can choose to boot from one of them. +# =20 +# Copyright (c) 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# =20 +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# =20 +## +[Defines] + INF_VERSION =3D 0x00010017 + BASE_NAME =3D ResetUtilityLib + FILE_GUID =3D CAFC3CA1-3E32-449F-9B0E-40BA3CB73A12 + VERSION_STRING =3D 1.0 + MODULE_TYPE =3D BASE + LIBRARY_CLASS =3D ResetUtilityLib + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources] + ResetUtility.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + ResetSystemLib diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index dd7e9d5988..d96bff90b0 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -285,13 +285,16 @@ [Components] MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.inf MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf + MdeModulePkg/Library/DxeResetSystemLib/DxeResetSystemLib.inf MdeModulePkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf MdeModulePkg/Library/DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol= .inf MdeModulePkg/Library/PeiCrc32GuidedSectionExtractLib/PeiCrc32GuidedSecti= onExtractLib.inf MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf MdeModulePkg/Library/PeiRecoveryLibNull/PeiRecoveryLibNull.inf + MdeModulePkg/Library/PeiResetSystemLib/PeiResetSystemLib.inf MdeModulePkg/Library/PeiS3LibNull/PeiS3LibNull.inf MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf + MdeModulePkg/Library/ResetUtilityLib/ResetUtilityLib.inf MdeModulePkg/Library/BaseResetSystemLibNull/BaseResetSystemLibNull.inf MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.i= nf MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.i= nf @@ -358,6 +361,10 @@ [Components] MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf MdeModulePkg/Universal/Metronome/Metronome.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntim= eDxe.inf + MdeModulePkg/Universal/ResetSystemPei/ResetSystemPei.inf { + + ResetSystemLib|MdeModulePkg/Library/BaseResetSystemLibNull/BaseReset= SystemLibNull.inf + } MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.inf --=20 2.15.1.windows.2 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel