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.web12.8047.1575972895715601110 for ; Tue, 10 Dec 2019 02:14:55 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: zhichao.gao@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Dec 2019 02:14:54 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,299,1571727600"; d="scan'208";a="203140819" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga007.jf.intel.com with ESMTP; 10 Dec 2019 02:14:54 -0800 Received: from fmsmsx116.amr.corp.intel.com (10.18.116.20) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Dec 2019 02:14:50 -0800 Received: from shsmsx105.ccr.corp.intel.com (10.239.4.158) by fmsmsx116.amr.corp.intel.com (10.18.116.20) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Dec 2019 02:14:50 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.19]) by SHSMSX105.ccr.corp.intel.com ([169.254.11.72]) with mapi id 14.03.0439.000; Tue, 10 Dec 2019 18:14:48 +0800 From: "Gao, Zhichao" To: "Gao, Liming" , "devel@edk2.groups.io" CC: "Kinney, Michael D" , Vitaly Cheptsov 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+fV9ikQTogXKeyn7vAgACZ3mA= Date: Tue, 10 Dec 2019 10:14:47 +0000 Message-ID: <3CE959C139B4C44DBEA1810E3AA6F9000B892271@SHSMSX101.ccr.corp.intel.com> References: <20191128021530.11564-1-zhichao.gao@intel.com> <20191128021530.11564-2-zhichao.gao@intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E5601AE@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E5601AE@SHSMSX104.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiN2VhMWNhYTAtMTQ0Ny00MGU3LWE3MDktM2M4NjZkZjcwZjg5IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoicVVwbENTU3gwanpwR0FEaG83YUJZOWUzbmdrVXhNa0VHa1wvcnp5U29JWDd0SkRqY0oxQjhscGtueW4rZE9QWjQifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhichao.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable The mandatory one is expected to catch the ASSERT. But the Optional one sho= uld return success. I would fix that in the V2 patch set. Thanks, Zhichao > -----Original Message----- > From: Gao, Liming > Sent: Tuesday, December 10, 2019 9:04 AM > 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 pa= th > lib >=20 > Zhichao: > The change is good. New library instance is benefit for image size. >=20 > But, please make sure library constructor always return success. Otherw= ise, > 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 > >lib > > > >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 out 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 > >+ placed 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 > >+protocol, > >+ 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 > >+ structure specified by DevicePath including the end of device path no= de. > >+ 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 > >+ specified by > >DevicePath. > >+ If DevicePath is NULL, then NULL is returned. If the memory is > >+ successfully 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 > >+ duplicate 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 st= ructure. > >+ @param SecondDevicePath A pointer to a device path data st= ructure. > >+ > >+ @retval NULL If there is not enough memory for the newly allocat= ed > >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 > >+ FirstDevicePath 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 > >+ device > >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 > >+ after > >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 st= ructure. > >+ @param DevicePathNode A pointer to a single device path = node. > >+ > >+ @retval NULL If there is not enough memory for the new device pa= th. > >+ @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 NU= LL. > >+ A copy of an end-of-device-path node if both FirstD= evicePath > >+ 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 > >+instance > >to the specified device > >+ path. > >+ > >+ This function creates a new device path by appending a copy of the > >+ device > >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 st= ructure. > >+ @param DevicePathInstance A pointer to a device path instanc= e. > >+ > >+ @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 > >+pointer to > >the next device path > >+ instance. > >+ > >+ This function creates a copy of the current device path instance. It > >+ also > >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 > >+ instance > >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 t= o the current > >+ device path instance. On output, t= his holds > >+ the pointer to the next device pat= h instance > >+ or NULL if there are no more devic= e path > >+ instances in the device path point= er to a > >+ device path data structure. > >+ @param Size On output, this holds the size of = the device > >+ path instance, in bytes or zero, i= f 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 retu= rned. > >+ 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 d= evice > >node. > >+ @param NodeSubType The device node sub-type for the n= ew > >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 is 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 st= ructure. > >+ > >+ @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 tex= t > >representation > >+ of the display node is used, where applicabl= e. 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 > >+ node > >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.= 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 > >+ path > >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 charact= er 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 charact= er and continues > >+ until the first non-device node character. > >+ > >+ @return A pointer to the allocated device path or NULL if > >+ TextDeviceNode > >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 P= rotocol. > >+# 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 UefiDevicePathLibMandatoryDevicePa= thProtocol > >+ MODULE_UNI_FILE =3D > >UefiDevicePathLibMandatoryDevicePathProtocol.uni > >+ FILE_GUID =3D 5A8389AF-DAE4-407E-8FD5-D026948BC5= 79 > >+ 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 P= rotocol. > >+// 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 De= vice > >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 pla= ced > > 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 > >protocol, > >- DevicePathToText protocol and DevicePathFromText protocol. > >+ The constructor function caches the pointer to DevicePathUtilites pro= tocol. > > > > 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