From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mx.groups.io with SMTP id smtpd.web09.3778.1575940057127351642 for ; Mon, 09 Dec 2019 17:07:37 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: liming.gao@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Dec 2019 17:07:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,297,1571727600"; d="scan'208";a="207098654" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga008.jf.intel.com with ESMTP; 09 Dec 2019 17:07:36 -0800 Received: from fmsmsx604.amr.corp.intel.com (10.18.126.84) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 9 Dec 2019 17:07:35 -0800 Received: from fmsmsx604.amr.corp.intel.com (10.18.126.84) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Mon, 9 Dec 2019 17:07:34 -0800 Received: from shsmsx153.ccr.corp.intel.com (10.239.6.53) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1713.5 via Frontend Transport; Mon, 9 Dec 2019 17:07:34 -0800 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.90]) by SHSMSX153.ccr.corp.intel.com ([169.254.12.195]) with mapi id 14.03.0439.000; Tue, 10 Dec 2019 09:04:02 +0800 From: "Liming Gao" To: "Gao, Zhichao" , "devel@edk2.groups.io" CC: "Kinney, Michael D" , Vitaly Cheptsov , "Gao, Liming" Subject: Re: [PATCH 1/2] MdePkg/UefiDevicePathLib: Separate the device path lib Thread-Topic: [PATCH 1/2] MdePkg/UefiDevicePathLib: Separate the device path lib Thread-Index: AQHVpZHCA2Q22belDU+fV9ikQTogXKeyn7vA Date: Tue, 10 Dec 2019 01:04:02 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E5601AE@SHSMSX104.ccr.corp.intel.com> References: <20191128021530.11564-1-zhichao.gao@intel.com> <20191128021530.11564-2-zhichao.gao@intel.com> In-Reply-To: <20191128021530.11564-2-zhichao.gao@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: liming.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Zhichao: The change is good. New library instance is benefit for image size.=20 But, please make sure library constructor always return success. Otherwis= e, error status will assert in autogen code.=20 Thanks Liming >-----Original Message----- >From: Gao, Zhichao >Sent: Thursday, November 28, 2019 10:15 AM >To: devel@edk2.groups.io >Cc: Kinney, Michael D ; Gao, Liming >; Vitaly Cheptsov >Subject: [PATCH 1/2] MdePkg/UefiDevicePathLib: Separate the device path li= b > >REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2298 > >UefiDevicePathLibOptionalDevicePathProtocol's implementation isn't >fit its description. It should be implement as blow: >Try to find the DevicePathProtocol, if found then use it to implement >the interface. Else, use the local interface. It should not have the >depex and ASSERT of gEfiDevicePathUtilitiesProtocolGuid when not find >the DevicePathProtocol. > >Add a mandatory one to force using the DevicePathUtilities, >DevicePathToText and DevicePathFromText protocol. > >Cc: Michael D Kinney >Cc: Liming Gao >Cc: Vitaly Cheptsov >Signed-off-by: Zhichao Gao >--- > ...DevicePathLibMandatoryDevicePathProtocol.c | 469 >++++++++++++++++++ > ...vicePathLibMandatoryDevicePathProtocol.inf | 86 ++++ > ...vicePathLibMandatoryDevicePathProtocol.uni | 18 + > ...iDevicePathLibOptionalDevicePathProtocol.c | 7 +- > ...evicePathLibOptionalDevicePathProtocol.inf | 5 +- > 5 files changed, 576 insertions(+), 9 deletions(-) > create mode 100644 >MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePath >Protocol.c > create mode 100644 >MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePath >Protocol.inf > create mode 100644 >MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePath >Protocol.uni > >diff --git >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePat >hProtocol.c >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePa >thProtocol.c >new file mode 100644 >index 0000000000..fa27110fd4 >--- /dev/null >+++ >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePa >thProtocol.c >@@ -0,0 +1,469 @@ >+/** @file >+ Device Path services. The thing to remember is device paths are built o= ut of >+ nodes. The device path is terminated by an end node that is length >+ sizeof(EFI_DEVICE_PATH_PROTOCOL). That would be why there is >sizeof(EFI_DEVICE_PATH_PROTOCOL) >+ all over this file. >+ >+ The only place where multi-instance device paths are supported is in >+ environment varibles. Multi-instance device paths should never be place= d >+ on a Handle. >+ >+ Copyright (c) 2019, Intel Corporation. All rights reserved.
>+ SPDX-License-Identifier: BSD-2-Clause-Patent >+ >+**/ >+ >+ >+#include "UefiDevicePathLib.h" >+ >+GLOBAL_REMOVE_IF_UNREFERENCED >EFI_DEVICE_PATH_UTILITIES_PROTOCOL *mDevicePathLibDevicePathUtilities >=3D NULL; >+GLOBAL_REMOVE_IF_UNREFERENCED >EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathLibDevicePathToText >=3D NULL; >+GLOBAL_REMOVE_IF_UNREFERENCED >EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL >*mDevicePathLibDevicePathFromText =3D NULL; >+ >+/** >+ The constructor function caches the pointer to DevicePathUtilites proto= col, >+ DevicePathToText protocol and DevicePathFromText protocol. >+ >+ The constructor function locates these three protocols from protocol >database. >+ It will caches the pointer to local protocol instance if that 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 >+UefiDevicePathLibMandatoryDevicePathProtocolConstructor ( >+ IN EFI_HANDLE ImageHandle, >+ IN EFI_SYSTEM_TABLE *SystemTable >+ ) >+{ >+ EFI_STATUS Status; >+ >+ Status =3D gBS->LocateProtocol ( >+ &gEfiDevicePathUtilitiesProtocolGuid, >+ NULL, >+ (VOID**) &mDevicePathLibDevicePathUtilities >+ ); >+ ASSERT_EFI_ERROR (Status); >+ ASSERT (mDevicePathLibDevicePathUtilities !=3D NULL); >+ >+ Status =3D gBS->LocateProtocol ( >+ &gEfiDevicePathToTextProtocolGuid, >+ NULL, >+ (VOID**) &mDevicePathLibDevicePathToText >+ ); >+ ASSERT_EFI_ERROR (Status); >+ ASSERT (mDevicePathLibDevicePathToText !=3D NULL); >+ >+ Status =3D gBS->LocateProtocol ( >+ &gEfiDevicePathFromTextProtocolGuid, >+ NULL, >+ (VOID**) &mDevicePathLibDevicePathFromText >+ ); >+ ASSERT_EFI_ERROR (Status); >+ ASSERT (mDevicePathLibDevicePathFromText !=3D NULL); >+ >+ return Status; >+} >+ >+/** >+ Returns the size of a device path in bytes. >+ >+ This function returns the size, in bytes, of the device path data struc= ture >+ specified by DevicePath including the end of device path node. >+ If DevicePath is NULL or invalid, then 0 is returned. >+ >+ @param DevicePath A pointer to a device path data structure. >+ >+ @retval 0 If DevicePath is NULL or invalid. >+ @retval Others The size of a device path in bytes. >+ >+**/ >+UINTN >+EFIAPI >+GetDevicePathSize ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->GetDevicePathSize >(DevicePath); >+ } >+ >+ ASSERT (FALSE); >+ return 0; >+} >+ >+/** >+ Creates a new copy of an existing device path. >+ >+ This function allocates space for a new copy of the device path specifi= ed by >DevicePath. >+ If DevicePath is NULL, then NULL is returned. If the memory is success= fully >+ allocated, then the contents of DevicePath are copied to the newly >allocated >+ buffer, and a pointer to that buffer is returned. Otherwise, NULL is >returned. >+ The memory for the new device path is allocated from EFI boot services >memory. >+ It is the responsibility of the caller to free the memory allocated. >+ >+ @param DevicePath A pointer to a device path data structure. >+ >+ @retval NULL DevicePath is NULL or invalid. >+ @retval Others A pointer to the duplicated device path. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+DuplicateDevicePath ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->DuplicateDevicePath >(DevicePath); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Creates a new device path by appending a second device path to a first >device path. >+ >+ This function creates a new device path by appending a copy of >SecondDevicePath >+ to a copy of FirstDevicePath in a newly allocated buffer. Only the end= -of- >device-path >+ device node from SecondDevicePath is retained. The newly created device >path is >+ returned. If FirstDevicePath is NULL, then it is ignored, and a duplica= te of >+ SecondDevicePath is returned. If SecondDevicePath is NULL, then it is >ignored, >+ and a duplicate of FirstDevicePath is returned. If both FirstDevicePath= and >+ SecondDevicePath are NULL, then a copy of an end-of-device-path is >returned. >+ >+ If there is not enough memory for the newly allocated buffer, then NULL= is >returned. >+ The memory for the new device path is allocated from EFI boot services >memory. >+ It is the responsibility of the caller to free the memory allocated. >+ >+ @param FirstDevicePath A pointer to a device path data stru= cture. >+ @param SecondDevicePath A pointer to a device path data stru= cture. >+ >+ @retval NULL If there is not enough memory for the newly allocated >buffer. >+ @retval NULL If FirstDevicePath or SecondDevicePath is invalid. >+ @retval Others A pointer to the new device path if success. >+ Or a copy an end-of-device-path if both FirstDevicePa= th and >SecondDevicePath are NULL. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+AppendDevicePath ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *FirstDevicePath, OPTIONAL >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath OPTIONAL >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->AppendDevicePath >(FirstDevicePath, SecondDevicePath); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Creates a new path by appending the device node to the device path. >+ >+ This function creates a new device path by appending a copy of the devi= ce >node >+ specified by DevicePathNode to a copy of the device path specified by >DevicePath >+ in an allocated buffer. The end-of-device-path device node is moved aft= er >the >+ end of the appended device node. >+ If DevicePathNode is NULL then a copy of DevicePath is returned. >+ If DevicePath is NULL then a copy of DevicePathNode, followed by an end= - >of-device >+ path device node is returned. >+ If both DevicePathNode and DevicePath are NULL then a copy of an end-of= - >device-path >+ device node is returned. >+ If there is not enough memory to allocate space for the new device path= , >then >+ NULL is returned. >+ The memory is allocated from EFI boot services memory. It is the >responsibility >+ of the caller to free the memory allocated. >+ >+ @param DevicePath A pointer to a device path data stru= cture. >+ @param DevicePathNode A pointer to a single device path no= de. >+ >+ @retval NULL If there is not enough memory for the new device path= . >+ @retval Others A pointer to the new device path if success. >+ A copy of DevicePathNode followed by an end-of-device= -path >node >+ if both FirstDevicePath and SecondDevicePath are NULL= . >+ A copy of an end-of-device-path node if both FirstDev= icePath >+ and SecondDevicePath are NULL. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+AppendDevicePathNode ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, OPTIONAL >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode OPTIONAL >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->AppendDeviceNode >(DevicePath, DevicePathNode); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Creates a new device path by appending the specified device path instan= ce >to the specified device >+ path. >+ >+ This function creates a new device path by appending a copy of the devi= ce >path >+ instance specified by DevicePathInstance to a copy of the device path >specified >+ by DevicePath in a allocated buffer. >+ The end-of-device-path device node is moved after the end of the >appended device >+ path instance and a new end-of-device-path-instance node is inserted >between. >+ If DevicePath is NULL, then a copy if DevicePathInstance is returned. >+ If DevicePathInstance is NULL, then NULL is returned. >+ If DevicePath or DevicePathInstance is invalid, then NULL is returned. >+ If there is not enough memory to allocate space for the new device path= , >then >+ NULL is returned. >+ The memory is allocated from EFI boot services memory. It is the >responsibility >+ of the caller to free the memory allocated. >+ >+ @param DevicePath A pointer to a device path data stru= cture. >+ @param DevicePathInstance A pointer to a device path instance. >+ >+ @return A pointer to the new device path. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+AppendDevicePathInstance ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, OPTIONAL >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance OPTIONAL >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->AppendDevicePathInstance >(DevicePath, DevicePathInstance); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Creates a copy of the current device path instance and returns a pointe= r to >the next device path >+ instance. >+ >+ This function creates a copy of the current device path instance. It al= so >updates >+ DevicePath to point to the next device path instance in the device path= (or >NULL >+ if no more) and updates Size to hold the size of the device path instan= ce >copy. >+ If DevicePath is NULL, then NULL is returned. >+ If DevicePath points to a invalid device path, then NULL is returned. >+ If there is not enough memory to allocate space for the new device path= , >then >+ NULL is returned. >+ The memory is allocated from EFI boot services memory. It is the >responsibility >+ of the caller to free the memory allocated. >+ If Size is NULL, then ASSERT(). >+ >+ @param DevicePath On input, this holds the pointer to = the current >+ device path instance. On output, thi= s holds >+ the pointer to the next device path = instance >+ or NULL if there are no more device = path >+ instances in the device path pointer= to a >+ device path data structure. >+ @param Size On output, this holds the size of th= e device >+ path instance, in bytes or zero, if = DevicePath >+ is NULL. >+ >+ @return A pointer to the current device path instance. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+GetNextDevicePathInstance ( >+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, >+ OUT UINTN *Size >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->GetNextDevicePathInstance >(DevicePath, Size); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Creates a device node. >+ >+ This function creates a new device node in a newly allocated buffer of = size >+ NodeLength and initializes the device path node header with NodeType >and NodeSubType. >+ The new device path node is returned. >+ If NodeLength is smaller than a device path header, then NULL is return= ed. >+ If there is not enough memory to allocate space for the new device path= , >then >+ NULL is returned. >+ The memory is allocated from EFI boot services memory. It is the >responsibility >+ of the caller to free the memory allocated. >+ >+ @param NodeType The device node type for the new dev= ice >node. >+ @param NodeSubType The device node sub-type for the new >device node. >+ @param NodeLength The length of the new device node. >+ >+ @return The new device path. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+CreateDeviceNode ( >+ IN UINT8 NodeType, >+ IN UINT8 NodeSubType, >+ IN UINT16 NodeLength >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->CreateDeviceNode (NodeType, >NodeSubType, NodeLength); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Determines if a device path is single or multi-instance. >+ >+ This function returns TRUE if the device path specified by DevicePath i= s >+ multi-instance. >+ Otherwise, FALSE is returned. >+ If DevicePath is NULL or invalid, then FALSE is returned. >+ >+ @param DevicePath A pointer to a device path data stru= cture. >+ >+ @retval TRUE DevicePath is multi-instance. >+ @retval FALSE DevicePath is not multi-instance, or= DevicePath >+ is NULL or invalid. >+ >+**/ >+BOOLEAN >+EFIAPI >+IsDevicePathMultiInstance ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath >+ ) >+{ >+ if (mDevicePathLibDevicePathUtilities !=3D NULL) { >+ return mDevicePathLibDevicePathUtilities->IsDevicePathMultiInstance >(DevicePath); >+ } >+ >+ ASSERT (FALSE); >+ return FALSE; >+} >+ >+/** >+ Converts a device node to its string representation. >+ >+ @param DeviceNode A Pointer to the device node to be converted. >+ @param DisplayOnly If DisplayOnly is TRUE, then the shorter text >representation >+ of the display node is used, where applicable.= If DisplayOnly >+ is FALSE, then the longer text representation = of the display >node >+ is used. >+ @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut >forms of text >+ representation for a device node can be used, = where >applicable. >+ >+ @return A pointer to the allocated text representation of the device no= de >or NULL if DeviceNode >+ is NULL or there was insufficient memory. >+ >+**/ >+CHAR16 * >+EFIAPI >+ConvertDeviceNodeToText ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode, >+ IN BOOLEAN DisplayOnly, >+ IN BOOLEAN AllowShortcuts >+ ) >+{ >+ if (mDevicePathLibDevicePathToText !=3D NULL) { >+ return mDevicePathLibDevicePathToText->ConvertDeviceNodeToText >(DeviceNode, DisplayOnly, AllowShortcuts); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Converts a device path to its text representation. >+ >+ @param DevicePath A Pointer to the device to be converted. >+ @param DisplayOnly If DisplayOnly is TRUE, then the shorter text >representation >+ of the display node is used, where applicable. I= f DisplayOnly >+ is FALSE, then the longer text representation of= the display node >+ is used. >+ @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut for= ms >of text >+ representation for a device node can be used, wh= ere applicable. >+ >+ @return A pointer to the allocated text representation of the device pa= th >or >+ NULL if DeviceNode is NULL or there was insufficient memory. >+ >+**/ >+CHAR16 * >+EFIAPI >+ConvertDevicePathToText ( >+ IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, >+ IN BOOLEAN DisplayOnly, >+ IN BOOLEAN AllowShortcuts >+ ) >+{ >+ if (mDevicePathLibDevicePathToText !=3D NULL) { >+ return mDevicePathLibDevicePathToText->ConvertDevicePathToText >(DevicePath, DisplayOnly, AllowShortcuts); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Convert text to the binary representation of a device node. >+ >+ @param TextDeviceNode TextDeviceNode points to the text >representation of a device >+ node. Conversion starts with the first character= and continues >+ until the first non-device node character. >+ >+ @return A pointer to the EFI device node or NULL if TextDeviceNode is >NULL or there was >+ insufficient memory or text unsupported. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+ConvertTextToDeviceNode ( >+ IN CONST CHAR16 *TextDeviceNode >+ ) >+{ >+ if (mDevicePathLibDevicePathFromText !=3D NULL) { >+ return mDevicePathLibDevicePathFromText->ConvertTextToDeviceNode >(TextDeviceNode); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >+/** >+ Convert text to the binary representation of a device path. >+ >+ >+ @param TextDevicePath TextDevicePath points to the text representation >of a device >+ path. Conversion starts with the first character= and continues >+ until the first non-device node character. >+ >+ @return A pointer to the allocated device path or NULL if TextDeviceNod= e >is NULL or >+ there was insufficient memory. >+ >+**/ >+EFI_DEVICE_PATH_PROTOCOL * >+EFIAPI >+ConvertTextToDevicePath ( >+ IN CONST CHAR16 *TextDevicePath >+ ) >+{ >+ if (mDevicePathLibDevicePathFromText !=3D NULL) { >+ return mDevicePathLibDevicePathFromText->ConvertTextToDevicePath >(TextDevicePath); >+ } >+ >+ ASSERT (FALSE); >+ return NULL; >+} >+ >diff --git >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePat >hProtocol.inf >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePa >thProtocol.inf >new file mode 100644 >index 0000000000..eb545d4601 >--- /dev/null >+++ >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePa >thProtocol.inf >@@ -0,0 +1,86 @@ >+## @file >+# Instance of Device Path Library based on Device Path Protocol. >+# >+# Device Path Library that layers on top of the UEFI 2.0 Device Path Pro= tocol. >+# If the DevicePathFromText/DevicePathToText protocol doesn't exist, the >library >+# uses its internal conversion logic. >+# >+# Copyright (c) 2019, Intel Corporation. All rights reserved.
>+# >+# SPDX-License-Identifier: BSD-2-Clause-Patent >+# >+# >+## >+ >+[Defines] >+ INF_VERSION =3D 0x00010005 >+ BASE_NAME =3D UefiDevicePathLibMandatoryDevicePath= Protocol >+ MODULE_UNI_FILE =3D >UefiDevicePathLibMandatoryDevicePathProtocol.uni >+ FILE_GUID =3D 5A8389AF-DAE4-407E-8FD5-D026948BC579 >+ MODULE_TYPE =3D UEFI_DRIVER >+ VERSION_STRING =3D 1.0 >+ LIBRARY_CLASS =3D DevicePathLib|DXE_DRIVER >DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER >SMM_CORE >+ >+ CONSTRUCTOR =3D >UefiDevicePathLibMandatoryDevicePathProtocolConstructor >+ >+# >+# VALID_ARCHITECTURES =3D IA32 X64 EBC >+# >+ >+[Sources] >+ DevicePathUtilities.c >+ DevicePathToText.c >+ DevicePathFromText.c >+ UefiDevicePathLibMandatoryDevicePathProtocol.c >+ UefiDevicePathLib.h >+ >+[Packages] >+ MdePkg/MdePkg.dec >+ >+ >+[LibraryClasses] >+ BaseLib >+ UefiBootServicesTableLib >+ MemoryAllocationLib >+ DebugLib >+ BaseMemoryLib >+ PcdLib >+ PrintLib >+ >+[Guids] >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiVTUTF8Guid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiVT100Guid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiVT100PlusGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiPcAnsiGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiUartDevicePathGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiSasDevicePathGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiVirtualDiskGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiVirtualCdGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiPersistentVirtualDiskGuid >+ ## SOMETIMES_CONSUMES ## GUID >+ gEfiPersistentVirtualCdGuid >+ >+[Protocols] >+ gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES >+ gEfiDevicePathUtilitiesProtocolGuid ## CONSUMES >+ gEfiDevicePathToTextProtocolGuid ## SOMETIMES_CONSUMES >+ gEfiDevicePathFromTextProtocolGuid ## SOMETIMES_CONSUMES >+ gEfiDebugPortProtocolGuid ## UNDEFINED >+ >+[Pcd] >+ gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ## >SOMETIMES_CONSUMES >+ >+[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, >Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] >+ gEfiDevicePathUtilitiesProtocolGuid AND >+ gEfiDevicePathToTextProtocolGuid AND >+ gEfiDevicePathFromTextProtocolGuid >+ >diff --git >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePat >hProtocol.uni >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePa >thProtocol.uni >new file mode 100644 >index 0000000000..070f0add9f >--- /dev/null >+++ >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePa >thProtocol.uni >@@ -0,0 +1,18 @@ >+// /** @file >+// Instance of Device Path Library based on Device Path Protocol. >+// >+// Device Path Library that layers on top of the UEFI 2.0 Device Path Pro= tocol. >+// If the DevicePathFromText/DevicePathToText protocol doesn't exist, the >library >+// uses its internal conversion logic. >+// >+// Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
>+// >+// SPDX-License-Identifier: BSD-2-Clause-Patent >+// >+// **/ >+ >+ >+#string STR_MODULE_ABSTRACT #language en-US "Instance of Devi= ce >Path Library based on Device Path Protocol." >+ >+#string STR_MODULE_DESCRIPTION #language en-US "Instance of >Device Path Library based on Device Path Protocol." >+ >diff --git >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathP >rotocol.c >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePath >Protocol.c >index 106ff245cc..68b4abfa2d 100644 >--- >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathP >rotocol.c >+++ >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePath >Protocol.c >@@ -8,7 +8,7 @@ > environment varibles. Multi-instance device paths should never be place= d > on a Handle. > >- Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.
>+ Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ >@@ -21,8 +21,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED >EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathLib > GLOBAL_REMOVE_IF_UNREFERENCED >EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL >*mDevicePathLibDevicePathFromText =3D NULL; > > /** >- The constructor function caches the pointer to DevicePathUtilites proto= col, >- DevicePathToText protocol and DevicePathFromText protocol. >+ The constructor function caches the pointer to DevicePathUtilites proto= col. > > The constructor function locates these three protocols from protocol >database. > It will caches the pointer to local protocol instance if that operation= fails >@@ -48,8 +47,6 @@ >UefiDevicePathLibOptionalDevicePathProtocolConstructor ( > NULL, > (VOID**) &mDevicePathLibDevicePathUtilities > ); >- ASSERT_EFI_ERROR (Status); >- ASSERT (mDevicePathLibDevicePathUtilities !=3D NULL); > return Status; > } > >diff --git >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathP >rotocol.inf >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePath >Protocol.inf >index e812e3e1d4..d194300bde 100644 >--- >a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathP >rotocol.inf >+++ >b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePath >Protocol.inf >@@ -5,7 +5,7 @@ > # If the DevicePathFromText/DevicePathToText protocol doesn't exist, the >library > # uses its internal conversion logic. > # >-# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.
>+# Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.
> # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # >@@ -79,6 +79,3 @@ > [Pcd] > gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ## >SOMETIMES_CONSUMES > >-[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, >Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] >- gEfiDevicePathUtilitiesProtocolGuid >- >-- >2.21.0.windows.1