From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (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 799282097410D for ; Mon, 4 Jun 2018 16:54:19 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Jun 2018 16:54:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,477,1520924400"; d="scan'208";a="205314497" Received: from orsmsx103.amr.corp.intel.com ([10.22.225.130]) by orsmga004.jf.intel.com with ESMTP; 04 Jun 2018 16:54:19 -0700 Received: from orsmsx113.amr.corp.intel.com ([169.254.9.88]) by ORSMSX103.amr.corp.intel.com ([169.254.5.63]) with mapi id 14.03.0319.002; Mon, 4 Jun 2018 16:54:18 -0700 From: "Kinney, Michael D" To: "Yao, Jiewen" , "edk2-devel@lists.01.org" , "Kinney, Michael D" Thread-Topic: [RFC v3 2/4] FmpDevicePkg: Add library instances Thread-Index: AQHT952eNOo4NLv4Z0S9nm6Hj0RNhKRROEuA//+XEvA= Date: Mon, 4 Jun 2018 23:54:18 +0000 Message-ID: References: <20180529223715.23896-1-michael.d.kinney@intel.com> <20180529223715.23896-3-michael.d.kinney@intel.com> <74D8A39837DF1E4DA445A8C0B3885C503AC27A65@shsmsx102.ccr.corp.intel.com> In-Reply-To: <74D8A39837DF1E4DA445A8C0B3885C503AC27A65@shsmsx102.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.200.100 dlp-reaction: no-action x-originating-ip: [10.22.254.140] MIME-Version: 1.0 Subject: Re: [RFC v3 2/4] FmpDevicePkg: Add library instances X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jun 2018 23:54:19 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Jiewen, Good suggestion. I will add then in next version. Mike > -----Original Message----- > From: Yao, Jiewen > Sent: Monday, June 4, 2018 4:09 PM > To: Kinney, Michael D ; > edk2-devel@lists.01.org > Cc: Sean Brogan > Subject: RE: [RFC v3 2/4] FmpDevicePkg: Add library > instances >=20 > Looks good. >=20 > Can we add "Is" before the function - > LowestSupportedVersionCheckRequired (), > LockFmpDeviceAtLockEventGuidRequired () ? >=20 > That is IsLowestSupportedVersionCheckRequired (), > IsLockFmpDeviceAtLockEventGuidRequired (). >=20 > Thank you > Yao Jiewen >=20 > > -----Original Message----- > > From: Kinney, Michael D > > Sent: Tuesday, May 29, 2018 3:37 PM > > To: edk2-devel@lists.01.org > > Cc: Kinney, Michael D ; > Sean Brogan > > ; Yao, Jiewen > > > Subject: [RFC v3 2/4] FmpDevicePkg: Add library > instances > > > > From: "Kinney, Michael D" > > > > > https://bugzilla.tianocore.org/show_bug.cgi?id=3D922 > > > > Based on content from the following branch: > > > > > https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsu > leSupport/MsCapsu > > leUpdatePkg > > > > Add library instances for FmpDeviceLib, > CapsuleUpdatePolicyLib, > > and FmpPayloadHeaderLib. > > > > Library Classes > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > * FmpDeviceLibNull - Non-functional template of the > FmpDeviceLib > > that can be used as a starting point for an > FmpDeviceLib for > > a specific firmware storage device. > > * CapsuleUpdatePolicyLibNull - Functional template of > the > > CapsuleUpdatePolicyLib that can be used as a > starting point > > of a platform specific implementation. > > * FmpPayloadHeaderLibV1 - Version 1 of the > FmpPayloadHeaderLib. > > This library is indented to be used "as is" with no > need for > > any device specific or platform specific changes. > > > > Cc: Sean Brogan > > Cc: Jiewen Yao > > Contributed-under: TianoCore Contribution Agreement > 1.1 > > Signed-off-by: Michael D Kinney > > > --- > > .../CapsuleUpdatePolicyLibNull.c | > 136 +++++++ > > .../CapsuleUpdatePolicyLibNull.inf | > 45 +++ > > .../CapsuleUpdatePolicyLibNull.uni | > 17 + > > .../Library/FmpDeviceLibNull/FmpDeviceLib.c | > 427 > > +++++++++++++++++++++ > > .../Library/FmpDeviceLibNull/FmpDeviceLibNull.inf | > 48 +++ > > .../Library/FmpDeviceLibNull/FmpDeviceLibNull.uni | > 18 + > > .../FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c | > 188 +++++++++ > > .../FmpPayloadHeaderLibV1.inf | > 48 +++ > > .../FmpPayloadHeaderLibV1.uni | > 21 + > > 9 files changed, 948 insertions(+) > > create mode 100644 > > > FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsule > UpdatePolicyLibNull > > .c > > create mode 100644 > > > FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsule > UpdatePolicyLibNull > > .inf > > create mode 100644 > > > FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsule > UpdatePolicyLibNull > > .uni > > create mode 100644 > > FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c > > create mode 100644 > > > FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull. > inf > > create mode 100644 > > > FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull. > uni > > create mode 100644 > > > FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHe > aderLib.c > > create mode 100644 > > > FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHe > aderLibV1.inf > > create mode 100644 > > > FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHe > aderLibV1.uni > > > > diff --git > > > a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.c > > > b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.c > > new file mode 100644 > > index 0000000000..b4cccc8f01 > > --- /dev/null > > +++ > > > b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.c > > @@ -0,0 +1,136 @@ > > +/** @file > > + Provides platform policy services used during a > capsule update. > > + > > + Copyright (c) 2016, Microsoft Corporation. All > rights reserved.
> > + Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > + > > + Redistribution and use in source and binary forms, > with or without > > + modification, are permitted provided that the > following conditions are met: > > + 1. Redistributions of source code must retain the > above copyright notice, > > + this list of conditions and the following > disclaimer. > > + 2. Redistributions in binary form must reproduce > the above copyright notice, > > + this list of conditions and the following > disclaimer in the documentation > > + and/or other materials provided with the > distribution. > > + > > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND > > CONTRIBUTORS "AS IS" AND > > + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, > > THE IMPLIED > > + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > > PURPOSE ARE DISCLAIMED. > > + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE > > FOR ANY DIRECT, > > + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > > DAMAGES (INCLUDING, > > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > > LOSS OF USE, > > + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > > ON ANY THEORY OF > > + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING > > NEGLIGENCE > > + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, > > EVEN IF > > + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > + > > +**/ > > + > > +#include > > +#include > > + > > +/** > > + Determine if the system power state supports a > capsule update. > > + > > + @param[out] Good Returns TRUE if system power > state supports a capsule > > + update. Returns FALSE if system > power state does not > > + support a capsule update. > Return value is only valid if > > + return status is EFI_SUCCESS. > > + > > + @retval EFI_SUCCESS Good parameter has > been updated with > > result. > > + @retval EFI_INVALID_PARAMETER Good is NULL. > > + @retval EFI_DEVICE_ERROR System power state > can not be > > determined. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +CheckSystemPower ( > > + OUT BOOLEAN *Good > > + ) > > +{ > > + *Good =3D TRUE; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Determines if the system thermal state supports a > capsule update. > > + > > + @param[out] Good Returns TRUE if system thermal > state supports a > > capsule > > + update. Returns FALSE if system > thermal state does > > not > > + support a capsule update. > Return value is only valid if > > + return status is EFI_SUCCESS. > > + > > + @retval EFI_SUCCESS Good parameter has > been updated with > > result. > > + @retval EFI_INVALID_PARAMETER Good is NULL. > > + @retval EFI_DEVICE_ERROR System thermal > state can not be > > determined. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +CheckSystemThermal ( > > + IN OUT BOOLEAN *Good > > + ) > > +{ > > + *Good =3D TRUE; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Determines if the system environment state > supports a capsule update. > > + > > + @param[out] Good Returns TRUE if system > environment state supports a > > capsule > > + update. Returns FALSE if system > environment state > > does not > > + support a capsule update. > Return value is only valid if > > + return status is EFI_SUCCESS. > > + > > + @retval EFI_SUCCESS Good parameter has > been updated with > > result. > > + @retval EFI_INVALID_PARAMETER Good is NULL. > > + @retval EFI_DEVICE_ERROR System environment > state can not be > > determined. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +CheckSystemEnvironment ( > > + IN OUT BOOLEAN *Good > > + ) > > +{ > > + *Good =3D TRUE; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Determines if the Lowest Supported Version checks > should be performed. > > The > > + expected result from this function is TRUE. A > platform can choose to return > > + FALSE (e.g. during manufacturing or servicing) to > allow a capsule update to a > > + version below the current Lowest Supported > Version. > > + > > + @retval TRUE The lowest supported version check > is required. > > + @retval FALSE Do not perform lowest support > version check. > > + > > +**/ > > +BOOLEAN > > +EFIAPI > > +LowestSupportedVersionCheckRequired ( > > + VOID > > + ) > > +{ > > + return TRUE; > > +} > > + > > +/** > > + Determines if the FMP device should be locked when > the event specified by > > + PcdFmpDeviceLockEventGuid is signaled. The > expected result from this > > function > > + is TRUE so the FMP device is always locked. A > platform can choose to return > > + FALSE (e.g. during manufacturing) to allow FMP > devices to remain unlocked. > > + > > + @retval TRUE The FMP device lock action is > required at lock event guid. > > + @retval FALSE Do not perform FMP device lock at > lock event guid. > > + > > +**/ > > +BOOLEAN > > +EFIAPI > > +LockFmpDeviceAtLockEventGuidRequired ( > > + VOID > > + ) > > +{ > > + return TRUE; > > +} > > diff --git > > > a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.inf > > > b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.inf > > new file mode 100644 > > index 0000000000..c7c669e3e0 > > --- /dev/null > > +++ > > > b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.inf > > @@ -0,0 +1,45 @@ > > +## @file > > +# Provides platform policy services used during a > capsule update. > > +# > > +# Copyright (c) 2016, Microsoft Corporation. All > rights reserved.
> > +# Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > +# > > +# Redistribution and use in source and binary > forms, with or without > > +# modification, are permitted provided that the > following conditions are met: > > +# 1. Redistributions of source code must retain the > above copyright notice, > > +# this list of conditions and the following > disclaimer. > > +# 2. Redistributions in binary form must reproduce > the above copyright > > notice, > > +# this list of conditions and the following > disclaimer in the documentation > > +# and/or other materials provided with the > distribution. > > +# > > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT > HOLDERS AND > > CONTRIBUTORS "AS IS" AND > > +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, > > THE IMPLIED > > +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > > PURPOSE ARE DISCLAIMED. > > +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE > > FOR ANY DIRECT, > > +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > > DAMAGES (INCLUDING, > > +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > > LOSS OF USE, > > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > > ON ANY THEORY OF > > +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING > > NEGLIGENCE > > +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > OF THIS SOFTWARE, > > EVEN IF > > +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > +## > > + > > +[Defines] > > + INF_VERSION =3D 0x00010005 > > + BASE_NAME =3D CapsuleUpdatePolicyLibNull > > + MODULE_UNI_FILE =3D CapsuleUpdatePolicyLibNull.uni > > + FILE_GUID =3D 8E36EC87-440D-44F9-AB2F- > AA806C61A1A6 > > + MODULE_TYPE =3D BASE > > + VERSION_STRING =3D 1.0 > > + LIBRARY_CLASS =3D CapsuleUpdatePolicyLib > > + > > +# > > +# VALID_ARCHITECTURES =3D IA32 X64 IPF ARM > AARCH64 > > +# > > + > > +[Sources] > > + CapsuleUpdatePolicyLibNull.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + FmpDevicePkg/FmpDevicePkg.dec > > diff --git > > > a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.uni > > > b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.uni > > new file mode 100644 > > index 0000000000..0f16fea391 > > --- /dev/null > > +++ > > > b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu > leUpdatePolicyLibN > > ull.uni > > @@ -0,0 +1,17 @@ > > +// /** @file > > +// Provides platform policy services used during a > capsule update. > > +// > > +// Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > +// > > +// 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 > "Provides platform > > policy services used during a capsule update." > > + > > +#string STR_MODULE_DESCRIPTION #language en-US > "Provides platform > > policy services used during a capsule update." > > diff --git > a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c > > > b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c > > new file mode 100644 > > index 0000000000..03e8750661 > > --- /dev/null > > +++ > b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c > > @@ -0,0 +1,427 @@ > > +/** @file > > + Provides firmware device specific services to > support updates of a firmware > > + image stored in a firmware device. > > + > > + Copyright (c) 2016, Microsoft Corporation. All > rights reserved.
> > + Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > + > > + Redistribution and use in source and binary forms, > with or without > > + modification, are permitted provided that the > following conditions are met: > > + 1. Redistributions of source code must retain the > above copyright notice, > > + this list of conditions and the following > disclaimer. > > + 2. Redistributions in binary form must reproduce > the above copyright notice, > > + this list of conditions and the following > disclaimer in the documentation > > + and/or other materials provided with the > distribution. > > + > > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND > > CONTRIBUTORS "AS IS" AND > > + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, > > THE IMPLIED > > + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > > PURPOSE ARE DISCLAIMED. > > + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE > > FOR ANY DIRECT, > > + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > > DAMAGES (INCLUDING, > > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > > LOSS OF USE, > > + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > > ON ANY THEORY OF > > + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING > > NEGLIGENCE > > + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, > > EVEN IF > > + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > + > > +**/ > > + > > +#include > > +#include > > + > > +/** > > + Provide a function to install the Firmware > Management Protocol instance > > onto a > > + device handle when the device is managed by a > driver that follows the UEFI > > + Driver Model. If the device is not managed by a > driver that follows the UEFI > > + Driver Model, then EFI_UNSUPPORTED is returned. > > + > > + @param[in] FmpInstaller Function that installs > the Firmware Management > > + Protocol. > > + > > + @retval EFI_SUCCESS The device is managed by > a driver that follows > > the > > + UEFI Driver Model. > FmpInstaller must be > > called on > > + each Driver Binding > Start(). > > + @retval EFI_UNSUPPORTED The device is not managed > by a driver that > > follows > > + the UEFI Driver Model. > > + @retval other The Firmware Management > Protocol for this > > firmware > > + device is not installed. > The firmware device is > > + still locked using > FmpDeviceLock(). > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RegisterFmpInstaller ( > > + IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Function > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Returns the size, in bytes, of the firmware image > currently stored in the > > + firmware device. This function is used to by the > GetImage() and > > + GetImageInfo() services of the Firmware Management > Protocol. If the > > image > > + size can not be determined from the firmware > device, then 0 must be > > returned. > > + > > + @param[out] Size Pointer to the size, in bytes, > of the firmware image > > + currently stored in the firmware > device. > > + > > + @retval EFI_SUCCESS The size of the > firmware image currently > > + stored in the > firmware device was > > returned. > > + @retval EFI_INVALID_PARAMETER Size is NULL. > > + @retval EFI_UNSUPPORTED The firmware device > does not support > > reporting > > + the size of the > currently stored firmware > > image. > > + @retval EFI_DEVICE_ERROR An error occurred > attempting to > > determine the > > + size of the > firmware image currently > > stored in > > + in the firmware > device. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetSize ( > > + IN UINTN *Size > > + ) > > +{ > > + if (Size =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + *Size =3D 0; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Returns the GUID value used to fill in the > ImageTypeId field of the > > + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is > returned by the > > GetImageInfo() > > + service of the Firmware Management Protocol. If > EFI_UNSUPPORTED is > > returned, > > + then the ImageTypeId field is set to > gEfiCallerIdGuid. If EFI_SUCCESS is > > + returned, then ImageTypeId is set to the Guid > returned from this function. > > + > > + @param[out] Guid Double pointer to a GUID value > that is updated to point > > to > > + to a GUID value. The GUID value > is not allocated and > > must > > + not be modified or freed by the > caller. > > + > > + @retval EFI_SUCCESS > EFI_FIRMWARE_IMAGE_DESCRIPTOR > > ImageTypeId GUID is set > > + to the returned Guid > value. > > + @retval EFI_UNSUPPORTED > EFI_FIRMWARE_IMAGE_DESCRIPTOR > > ImageTypeId GUID is set > > + to gEfiCallerIdGuid. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetImageTypeIdGuidPtr ( > > + OUT EFI_GUID **Guid > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Returns values used to fill in the > AttributesSupported and AttributesSettings > > + fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR > structure that is returned > > by the > > + GetImageInfo() service of the Firmware Management > Protocol. The > > following > > + bit values from the Firmware Management Protocol > may be combined: > > + IMAGE_ATTRIBUTE_IMAGE_UPDATABLE > > + IMAGE_ATTRIBUTE_RESET_REQUIRED > > + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED > > + IMAGE_ATTRIBUTE_IN_USE > > + IMAGE_ATTRIBUTE_UEFI_IMAGE > > + > > + @param[out] Supported Attributes supported by > this firmware device. > > + @param[out] Setting Attributes settings for > this firmware device. > > + > > + @retval EFI_SUCCESS The attributes > supported by the > > firmware > > + device were > returned. > > + @retval EFI_INVALID_PARAMETER Supported is NULL. > > + @retval EFI_INVALID_PARAMETER Setting is NULL. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetAttributes ( > > + IN OUT UINT64 *Supported, > > + IN OUT UINT64 *Setting > > + ) > > +{ > > + if (Supported =3D=3D NULL || Setting =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + *Supported =3D 0; > > + *Setting =3D 0; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Returns the value used to fill in the > LowestSupportedVersion field of the > > + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is > returned by the > > GetImageInfo() > > + service of the Firmware Management Protocol. If > EFI_SUCCESS is returned, > > then > > + the firmware device supports a method to report > the > > LowestSupportedVersion > > + value from the currently stored firmware image. > If the value can not be > > + reported for the firmware image currently stored > in the firmware device, > > then > > + EFI_UNSUPPORTED must be returned. > EFI_DEVICE_ERROR is returned if an > > error > > + occurs attempting to retrieve the > LowestSupportedVersion value for the > > + currently stored firmware image. > > + > > + @note It is recommended that all firmware devices > support a method to > > report > > + the LowestSupportedVersion value from the > currently stored > > firmware > > + image. > > + > > + @param[out] LowestSupportedVersion > LowestSupportedVersion value > > retrieved > > + from the > currently stored > > firmware image. > > + > > + @retval EFI_SUCCESS The lowest supported > version of currently > > stored > > + firmware image was > returned in > > LowestSupportedVersion. > > + @retval EFI_UNSUPPORTED The firmware device does > not support a > > method to > > + report the lowest > supported version of the > > currently > > + stored firmware image. > > + @retval EFI_DEVICE_ERROR An error occurred > attempting to retrieve the > > lowest > > + supported version of the > currently stored > > firmware > > + image. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetLowestSupportedVersion ( > > + OUT UINT32 *LowestSupportedVersion > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Returns the Null-terminated Unicode string that is > used to fill in the > > + VersionName field of the > EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that > > is > > + returned by the GetImageInfo() service of the > Firmware Management > > Protocol. > > + The returned string must be allocated using > > EFI_BOOT_SERVICES.AllocatePool(). > > + > > + @note It is recommended that all firmware devices > support a method to > > report > > + the VersionName string from the currently > stored firmware image. > > + > > + @param[out] VersionString The version string > retrieved from the currently > > + stored firmware image. > > + > > + @retval EFI_SUCCESS The version string > of currently stored > > + firmware image was > returned in > > Version. > > + @retval EFI_INVALID_PARAMETER VersionString is > NULL. > > + @retval EFI_UNSUPPORTED The firmware device > does not support > > a method > > + to report the > version string of the > > currently > > + stored firmware > image. > > + @retval EFI_DEVICE_ERROR An error occurred > attempting to retrieve > > the > > + version string of > the currently stored > > + firmware image. > > + @retval EFI_OUT_OF_RESOURCES There are not > enough resources to > > allocate the > > + buffer for the > version string of the > > currently > > + stored firmware > image. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetVersionString ( > > + OUT CHAR16 **VersionString > > + ) > > +{ > > + if (VersionString =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + *VersionString =3D NULL; > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Returns the value used to fill in the Version > field of the > > + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is > returned by the > > GetImageInfo() > > + service of the Firmware Management Protocol. If > EFI_SUCCESS is returned, > > then > > + the firmware device supports a method to report > the Version value from the > > + currently stored firmware image. If the value can > not be reported for the > > + firmware image currently stored in the firmware > device, then > > EFI_UNSUPPORTED > > + must be returned. EFI_DEVICE_ERROR is returned if > an error occurs > > attempting > > + to retrieve the LowestSupportedVersion value for > the currently stored > > firmware > > + image. > > + > > + @note It is recommended that all firmware devices > support a method to > > report > > + the Version value from the currently stored > firmware image. > > + > > + @param[out] Version The version value retrieved > from the currently stored > > + firmware image. > > + > > + @retval EFI_SUCCESS The version of currently > stored firmware image > > was > > + returned in Version. > > + @retval EFI_UNSUPPORTED The firmware device does > not support a > > method to > > + report the version of > the currently stored > > firmware > > + image. > > + @retval EFI_DEVICE_ERROR An error occurred > attempting to retrieve the > > version > > + of the currently stored > firmware image. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetVersion ( > > + OUT UINT32 *Version > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Returns a copy of the firmware image currently > stored in the firmware > > device. > > + > > + @note It is recommended that all firmware devices > support a method to > > retrieve > > + a copy currently stored firmware image. > This can be used to support > > + features such as recovery and rollback. > > + > > + @param[out] Image Pointer to a caller > allocated buffer where the > > + currently stored > firmware image is copied to. > > + @param[in out] ImageSize Pointer the size, in > bytes, of the Image buffer. > > + On return, points to the > size, in bytes, of > > firmware > > + image currently stored > in the firmware device. > > + > > + @retval EFI_SUCCESS Image contains a > copy of the firmware > > image > > + currently stored in > the firmware device, > > and > > + ImageSize contains > the size, in bytes, of > > the > > + firmware image > currently stored in the > > + firmware device. > > + @retval EFI_BUFFER_TOO_SMALL The buffer > specified by ImageSize is > > too small > > + to hold the > firmware image currently > > stored in > > + the firmware > device. The buffer size > > required > > + is returned in > ImageSize. > > + @retval EFI_INVALID_PARAMETER The Image is NULL. > > + @retval EFI_INVALID_PARAMETER The ImageSize is > NULL. > > + @retval EFI_UNSUPPORTED The operation is > not supported. > > + @retval EFI_DEVICE_ERROR An error occurred > attempting to retrieve > > the > > + firmware image > currently stored in the > > firmware > > + device. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceGetImage ( > > + IN OUT VOID *Image, > > + IN IN OUT UINTN *ImageSize > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Checks if a new firmware image is valid for the > firmware device. This > > + function allows firmware update operation to > validate the firmware image > > + before FmpDeviceSetImage() is called. > > + > > + @param[in] Image Points to a new > firmware image. > > + @param[in] ImageSize Size, in bytes, of a > new firmware image. > > + @param[out] ImageUpdatable Indicates if a new > firmware image is valid > > for > > + a firmware update to > the firmware device. > > The > > + following values from > the Firmware > > Management > > + Protocol are > supported: > > + > IMAGE_UPDATABLE_VALID > > + > IMAGE_UPDATABLE_INVALID > > + > IMAGE_UPDATABLE_INVALID_TYPE > > + > IMAGE_UPDATABLE_INVALID_OLD > > + > > IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE > > + > > + @retval EFI_SUCCESS The image was > successfully checked. > > Additional > > + status information > is returned in > > + ImageUpdateable. > > + @retval EFI_INVALID_PARAMETER Image is NULL. > > + @retval EFI_INVALID_PARAMETER ImageUpdateable is > NULL. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceCheckImage ( > > + IN CONST VOID *Image, > > + IN UINTN ImageSize, > > + OUT UINT32 *ImageUpdateable > > + ) > > +{ > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Updates a firmware device with a new firmware > image. This function > > returns > > + EFI_UNSUPPORTED if the firmware image is not > updatable. If the firmware > > image > > + is updatable, the function should perform the > following minimal validations > > + before proceeding to do the firmware image update. > > + - Validate that the image is a supported image > for this firmware device. > > + Return EFI_ABORTED if the image is not > supported. Additional details > > + on why the image is not a supported image may > be returned in > > AbortReason. > > + - Validate the data from VendorCode if is not > NULL. Firmware image > > + validation must be performed before VendorCode > data validation. > > + VendorCode data is ignored or considered > invalid if image validation > > + fails. Return EFI_ABORTED if the VendorCode > data is invalid. > > + > > + VendorCode enables vendor to implement vendor- > specific firmware image > > update > > + policy. Null if the caller did not specify the > policy or use the default > > + policy. As an example, vendor can implement a > policy to allow an option to > > + force a firmware image update when the abort > reason is due to the new > > firmware > > + image version is older than the current firmware > image version or bad image > > + checksum. Sensitive operations such as those > wiping the entire firmware > > image > > + and render the device to be non-functional should > be encoded in the image > > + itself rather than passed with the VendorCode. > AbortReason enables > > vendor to > > + have the option to provide a more detailed > description of the abort reason to > > + the caller. > > + > > + @param[in] Image Points to the new > firmware image. > > + @param[in] ImageSize Size, in bytes, of > the new firmware image. > > + @param[in] VendorCode This enables vendor > to implement > > vendor-specific > > + firmware image > update policy. NULL > > indicates > > + the caller did not > specify the policy or use > > the > > + default policy. > > + @param[in] Progress A function used to > report the progress of > > + updating the > firmware device with the > > new > > + firmware image. > > + @param[in] CapsuleFwVersion The version of the > new firmware image > > from the > > + update capsule that > provided the new > > firmware > > + image. > > + @param[out] AbortReason A pointer to a > pointer to a > > Null-terminated > > + Unicode string > providing more details on > > an > > + aborted operation. > The buffer is allocated > > by > > + this function with > > + > EFI_BOOT_SERVICES.AllocatePool(). It > > is the > > + caller's > responsibility to free this buffer > > with > > + > EFI_BOOT_SERVICES.FreePool(). > > + > > + @retval EFI_SUCCESS The firmware device > was successfully > > updated > > + with the new > firmware image. > > + @retval EFI_ABORTED The operation is > aborted. Additional > > details > > + are provided in > AbortReason. > > + @retval EFI_INVALID_PARAMETER The Image was NULL. > > + @retval EFI_UNSUPPORTED The operation is > not supported. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceSetImage ( > > + IN CONST VOID > *Image, > > + IN UINTN > ImageSize, > > + IN CONST VOID > *VendorCode, > > OPTIONAL > > + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS > > Progress, OPTIONAL > > + IN UINT32 > > CapsuleFwVersion, > > + OUT CHAR16 > **AbortReason > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + Lock the firmware device that contains a firmware > image. Once a firmware > > + device is locked, any attempts to modify the > firmware image contents in the > > + firmware device must fail. > > + > > + @note It is recommended that all firmware devices > support a lock method to > > + prevent modifications to a stored firmware > image. > > + > > + @note A firmware device lock mechanism is > typically only cleared by a full > > + system reset (not just sleep state/low power > mode). > > + > > + @retval EFI_SUCCESS The firmware device was > locked. > > + @retval EFI_UNSUPPORTED The firmware device does > not support > > locking > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +FmpDeviceLock ( > > + VOID > > + ) > > +{ > > + return EFI_UNSUPPORTED; > > +} > > diff --git > a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul > l.inf > > > b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul > l.inf > > new file mode 100644 > > index 0000000000..d51f69d0b9 > > --- /dev/null > > +++ > b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul > l.inf > > @@ -0,0 +1,48 @@ > > +## @file > > +# Provides firmware device specific services to > support updates of a firmware > > +# image stored in a firmware device. > > +# > > +# Copyright (c) 2016, Microsoft Corporation. All > rights reserved.
> > +# Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > +# > > +# Redistribution and use in source and binary > forms, with or without > > +# modification, are permitted provided that the > following conditions are met: > > +# 1. Redistributions of source code must retain the > above copyright notice, > > +# this list of conditions and the following > disclaimer. > > +# 2. Redistributions in binary form must reproduce > the above copyright > > notice, > > +# this list of conditions and the following > disclaimer in the documentation > > +# and/or other materials provided with the > distribution. > > +# > > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT > HOLDERS AND > > CONTRIBUTORS "AS IS" AND > > +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, > > THE IMPLIED > > +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > > PURPOSE ARE DISCLAIMED. > > +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE > > FOR ANY DIRECT, > > +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > > DAMAGES (INCLUDING, > > +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > > LOSS OF USE, > > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > > ON ANY THEORY OF > > +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING > > NEGLIGENCE > > +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > OF THIS SOFTWARE, > > EVEN IF > > +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > +## > > + > > +[Defines] > > + INF_VERSION =3D 0x00010005 > > + BASE_NAME =3D FmpDeviceLibNull > > + MODULE_UNI_FILE =3D FmpDeviceLibNull.uni > > + FILE_GUID =3D 8507642B-AE92-4664-B713- > 807F7774A96D > > + MODULE_TYPE =3D DXE_DRIVER > > + VERSION_STRING =3D 1.0 > > + LIBRARY_CLASS =3D FmpDeviceLib|DXE_DRIVER > > + > > +# > > +# The following information is for reference only > and not required by the build > > tools. > > +# > > +# VALID_ARCHITECTURES =3D IA32 X64 IPF ARM > AARCH64 > > +# > > + > > +[Sources] > > + FmpDeviceLib.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + FmpDevicePkg/FmpDevicePkg.dec > > diff --git > a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul > l.uni > > > b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul > l.uni > > new file mode 100644 > > index 0000000000..bedb38e9cf > > --- /dev/null > > +++ > b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul > l.uni > > @@ -0,0 +1,18 @@ > > +// /** @file > > +// Provides firmware device specific services to > support updates of a firmware > > +// image stored in a firmware device. > > +// > > +// Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > +// > > +// 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 > "Provides firmware > > device specific services to support updates of a > firmware image stored in a > > firmware device." > > + > > +#string STR_MODULE_DESCRIPTION #language en-US > "Provides firmware > > device specific services to support updates of a > firmware image stored in a > > firmware device." > > diff --git > > > a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLib.c > > > b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLib.c > > new file mode 100644 > > index 0000000000..5f08e8b0fd > > --- /dev/null > > +++ > > > b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLib.c > > @@ -0,0 +1,188 @@ > > +/** @file > > + Provides services to retrieve values from Version > 1 of a capsule's FMP > > Payload > > + Header. The FMP Payload Header structure is not > defined in the library class. > > + Instead, services are provided to retrieve > information from the FMP Payload > > + Header. If information is added to the FMP > Payload Header, then new > > services > > + may be added to this library class to retrieve the > new information. > > + > > + Copyright (c) 2016, Microsoft Corporation. All > rights reserved.
> > + Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > + > > + Redistribution and use in source and binary forms, > with or without > > + modification, are permitted provided that the > following conditions are met: > > + 1. Redistributions of source code must retain the > above copyright notice, > > + this list of conditions and the following > disclaimer. > > + 2. Redistributions in binary form must reproduce > the above copyright notice, > > + this list of conditions and the following > disclaimer in the documentation > > + and/or other materials provided with the > distribution. > > + > > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND > > CONTRIBUTORS "AS IS" AND > > + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, > > THE IMPLIED > > + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > > PURPOSE ARE DISCLAIMED. > > + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE > > FOR ANY DIRECT, > > + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > > DAMAGES (INCLUDING, > > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > > LOSS OF USE, > > + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > > ON ANY THEORY OF > > + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING > > NEGLIGENCE > > + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, > > EVEN IF > > + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > + > > +**/ > > + > > +#include > > +#include > > + > > +/// > > +/// Define FMP Payload Header structure here so it > is not public > > +/// > > + > > +#pragma pack(1) > > + > > +typedef struct { > > + UINT32 Signature; > > + UINT32 HeaderSize; > > + UINT32 FwVersion; > > + UINT32 LowestSupportedVersion; > > +} FMP_PAYLOAD_HEADER; > > + > > +#pragma pack() > > + > > +/// > > +/// Identifier is used to make sure the data in the > header is for this structure > > +/// and version. If the structure changes update > the last digit. > > +/// > > +#define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 > ('M', 'S', 'S', '1') > > + > > +/** > > + Returns the FMP Payload Header size in bytes. > > + > > + @param[in] Header FMP Payload Header to > evaluate > > + @param[in] FmpPayloadSize Size of FMP payload > > + @param[out] Size The size, in bytes, of > the FMP Payload > > Header. > > + > > + @retval EFI_SUCCESS The firmware > version was returned. > > + @retval EFI_INVALID_PARAMETER Header is NULL. > > + @retval EFI_INVALID_PARAMETER Size is NULL. > > + @retval EFI_INVALID_PARAMETER Header is not a > valid FMP Payload > > Header. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +GetFmpPayloadHeaderSize ( > > + IN CONST VOID *Header, > > + IN CONST UINTN FmpPayloadSize, > > + OUT UINT32 *Size > > + ) > > +{ > > + FMP_PAYLOAD_HEADER *FmpPayloadHeader; > > + > > + FmpPayloadHeader =3D NULL; > > + > > + if (Header =3D=3D NULL || Size =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + FmpPayloadHeader =3D (FMP_PAYLOAD_HEADER *)Header; > > + if ((UINTN)FmpPayloadHeader + sizeof > (FMP_PAYLOAD_HEADER) < > > (UINTN)FmpPayloadHeader || > > + (UINTN)FmpPayloadHeader + sizeof > (FMP_PAYLOAD_HEADER) >=3D > > (UINTN)FmpPayloadHeader + FmpPayloadSize || > > + FmpPayloadHeader->HeaderSize < sizeof > (FMP_PAYLOAD_HEADER)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (FmpPayloadHeader->Signature !=3D > FMP_PAYLOAD_HEADER_SIGNATURE) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + *Size =3D FmpPayloadHeader->HeaderSize; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Returns the version described in the FMP Payload > Header. > > + > > + @param[in] Header FMP Payload Header to > evaluate > > + @param[in] FmpPayloadSize Size of FMP payload > > + @param[out] Version The firmware version > described in the FMP > > Payload > > + Header. > > + > > + @retval EFI_SUCCESS The firmware > version was returned. > > + @retval EFI_INVALID_PARAMETER Header is NULL. > > + @retval EFI_INVALID_PARAMETER Version is NULL. > > + @retval EFI_INVALID_PARAMETER Header is not a > valid FMP Payload > > Header. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +GetFmpPayloadHeaderVersion ( > > + IN CONST VOID *Header, > > + IN CONST UINTN FmpPayloadSize, > > + OUT UINT32 *Version > > + ) > > +{ > > + FMP_PAYLOAD_HEADER *FmpPayloadHeader; > > + > > + FmpPayloadHeader =3D NULL; > > + > > + if (Header =3D=3D NULL || Version =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + FmpPayloadHeader =3D (FMP_PAYLOAD_HEADER *)Header; > > + if ((UINTN)FmpPayloadHeader + sizeof > (FMP_PAYLOAD_HEADER) < > > (UINTN)FmpPayloadHeader || > > + (UINTN)FmpPayloadHeader + sizeof > (FMP_PAYLOAD_HEADER) >=3D > > (UINTN)FmpPayloadHeader + FmpPayloadSize || > > + FmpPayloadHeader->HeaderSize < sizeof > (FMP_PAYLOAD_HEADER)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (FmpPayloadHeader->Signature !=3D > FMP_PAYLOAD_HEADER_SIGNATURE) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + *Version =3D FmpPayloadHeader->FwVersion; > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Returns the lowest supported version described in > the FMP Payload Header. > > + > > + @param[in] Header FMP Payload > Header to evaluate > > + @param[in] FmpPayloadSize Size of FMP > payload > > + @param[out] LowestSupportedVersion The lowest > supported version > > described in > > + the FMP > Payload Header. > > + > > + @retval EFI_SUCCESS The lowest support > version was > > returned. > > + @retval EFI_INVALID_PARAMETER Header is NULL. > > + @retval EFI_INVALID_PARAMETER > LowestSupportedVersion is NULL. > > + @retval EFI_INVALID_PARAMETER Header is not a > valid FMP Payload > > Header. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +GetFmpPayloadHeaderLowestSupportedVersion ( > > + IN CONST VOID *Header, > > + IN CONST UINTN FmpPayloadSize, > > + IN OUT UINT32 *LowestSupportedVersion > > + ) > > +{ > > + FMP_PAYLOAD_HEADER *FmpPayloadHeader; > > + > > + FmpPayloadHeader =3D NULL; > > + > > + if (Header =3D=3D NULL || LowestSupportedVersion =3D=3D > NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + FmpPayloadHeader =3D (FMP_PAYLOAD_HEADER *)Header; > > + if ((UINTN)FmpPayloadHeader + sizeof > (FMP_PAYLOAD_HEADER) < > > (UINTN)FmpPayloadHeader || > > + (UINTN)FmpPayloadHeader + sizeof > (FMP_PAYLOAD_HEADER) >=3D > > (UINTN)FmpPayloadHeader + FmpPayloadSize || > > + FmpPayloadHeader->HeaderSize < sizeof > (FMP_PAYLOAD_HEADER)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (FmpPayloadHeader->Signature !=3D > FMP_PAYLOAD_HEADER_SIGNATURE) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + *LowestSupportedVersion =3D FmpPayloadHeader- > >LowestSupportedVersion; > > + return EFI_SUCCESS; > > +} > > diff --git > > > a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLibV1.in > > f > > > b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLibV1.in > > f > > new file mode 100644 > > index 0000000000..41ed6e2aca > > --- /dev/null > > +++ > > > b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLibV1.in > > f > > @@ -0,0 +1,48 @@ > > +## @file > > +# Provides services to retrieve values from Version > 1 of a capsule's FMP > > Payload > > +# Header. The FMP Payload Header structure is not > defined in the library > > class. > > +# Instead, services are provided to retrieve > information from the FMP > > Payload > > +# Header. If information is added to the FMP > Payload Header, then new > > services > > +# may be added to this library class to retrieve > the new information. > > +# > > +# Copyright (c) 2016, Microsoft Corporation. All > rights reserved.
> > +# Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > +# > > +# Redistribution and use in source and binary > forms, with or without > > +# modification, are permitted provided that the > following conditions are met: > > +# 1. Redistributions of source code must retain the > above copyright notice, > > +# this list of conditions and the following > disclaimer. > > +# 2. Redistributions in binary form must reproduce > the above copyright > > notice, > > +# this list of conditions and the following > disclaimer in the documentation > > +# and/or other materials provided with the > distribution. > > +# > > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT > HOLDERS AND > > CONTRIBUTORS "AS IS" AND > > +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, > > THE IMPLIED > > +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR > > PURPOSE ARE DISCLAIMED. > > +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE > > FOR ANY DIRECT, > > +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > > DAMAGES (INCLUDING, > > +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > > LOSS OF USE, > > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > > ON ANY THEORY OF > > +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING > > NEGLIGENCE > > +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > OF THIS SOFTWARE, > > EVEN IF > > +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > +## > > + > > +[Defines] > > + INF_VERSION =3D 0x00010005 > > + BASE_NAME =3D > FmpPayloadHeaderLibV1 > > + FILE_GUID =3D > > 98A79A6C-513C-4E72-8375-39C0A7244C4B > > + MODULE_TYPE =3D DXE_DRIVER > > + VERSION_STRING =3D 1.0 > > + LIBRARY_CLASS =3D > FmpPayloadHeaderLib|DXE_DRIVER > > UEFI_APPLICATION > > + > > +# > > +# VALID_ARCHITECTURES =3D IA32 X64 IPF ARM > AARCH64 > > +# > > + > > +[Sources] > > + FmpPayloadHeaderLib.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + FmpDevicePkg/FmpDevicePkg.dec > > diff --git > > > a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLibV1.u > > ni > > > b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLibV1.u > > ni > > new file mode 100644 > > index 0000000000..4eef31753d > > --- /dev/null > > +++ > > > b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload > HeaderLibV1.u > > ni > > @@ -0,0 +1,21 @@ > > +// /** @file > > +// Provides services to retrieve values from Version > 1 of a capsule's FMP > > Payload > > +// Header. The FMP Payload Header structure is not > defined in the library class. > > +// Instead, services are provided to retrieve > information from the FMP Payload > > +// Header. If information is added to the FMP > Payload Header, then new > > services > > +// may be added to this library class to retrieve > the new information. > > +// > > +// Copyright (c) 2018, Intel Corporation. All rights > reserved.
> > +// > > +// 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 > "Provides services to > > retrieve values from Version 1 of a capsule's FMP > Payload Header." > > + > > +#string STR_MODULE_DESCRIPTION #language en-US > "Provides services to > > retrieve values from Version 1 of a capsule's FMP > Payload Header." > > -- > > 2.14.2.windows.3