Reviewed-by: Vitaly Cheptsov <vit9...@protonmail.com>

On Wed, Dec 18, 2019 at 05:10, Zhichao Gao <zhichao....@intel.com> wrote:

> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2298
>
> 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 <michael.d.kin...@intel.com>
> Cc: Liming Gao <liming....@intel.com>
> Cc: Vitaly Cheptsov <vit9...@protonmail.com>
> Tested-by: Zhichao Gao <zhichao....@intel.com>
> Signed-off-by: Zhichao Gao <zhichao....@intel.com>
> ---
>
> V2:
> Optional one should always return EFI_SUCCESS in its constructor.
> Change the description of optional one's uni file.
> Fix the copyright date of mandatory one's uni file.
>
> V3:
> Remove the Status variable in
> UefiDevicePathLibOptionalDevicePathProtocolConstructor.
> The Status would cause GCC build fail because the variable is
> initialized but not used. Since it is useless for the constructor,
> directly remove it.
>
> ...DevicePathLibMandatoryDevicePathProtocol.c | 469 ++++++++++++++++++
> ...vicePathLibMandatoryDevicePathProtocol.inf | 86 ++++
> ...vicePathLibMandatoryDevicePathProtocol.uni | 18 +
> ...iDevicePathLibOptionalDevicePathProtocol.c | 21 +-
> ...evicePathLibOptionalDevicePathProtocol.inf | 5 +-
> ...evicePathLibOptionalDevicePathProtocol.uni | 6 +-
> 6 files changed, 585 insertions(+), 20 deletions(-)
> create mode 100644 
> MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.c
> create mode 100644 
> MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.inf
> create mode 100644 
> MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.uni
>
> diff --git 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.c
>  
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.c
> new file mode 100644
> index 0000000000..fa27110fd4
> --- /dev/null
> +++ 
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.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.<BR>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +
> +#include "UefiDevicePathLib.h"
> +
> +GLOBAL_REMOVE_IF_UNREFERENCED EFI_DEVICE_PATH_UTILITIES_PROTOCOL 
> *mDevicePathLibDevicePathUtilities = NULL;
> +GLOBAL_REMOVE_IF_UNREFERENCED EFI_DEVICE_PATH_TO_TEXT_PROTOCOL 
> *mDevicePathLibDevicePathToText = NULL;
> +GLOBAL_REMOVE_IF_UNREFERENCED EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL 
> *mDevicePathLibDevicePathFromText = 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 = gBS->LocateProtocol (
> + &gEfiDevicePathUtilitiesProtocolGuid,
> + NULL,
> + (VOID**) &mDevicePathLibDevicePathUtilities
> + );
> + ASSERT_EFI_ERROR (Status);
> + ASSERT (mDevicePathLibDevicePathUtilities != NULL);
> +
> + Status = gBS->LocateProtocol (
> + &gEfiDevicePathToTextProtocolGuid,
> + NULL,
> + (VOID**) &mDevicePathLibDevicePathToText
> + );
> + ASSERT_EFI_ERROR (Status);
> + ASSERT (mDevicePathLibDevicePathToText != NULL);
> +
> + Status = gBS->LocateProtocol (
> + &gEfiDevicePathFromTextProtocolGuid,
> + NULL,
> + (VOID**) &mDevicePathLibDevicePathFromText
> + );
> + ASSERT_EFI_ERROR (Status);
> + ASSERT (mDevicePathLibDevicePathFromText != 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 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 != 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 != 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 structure.
> + @param SecondDevicePath A pointer to a device path data structure.
> +
> + @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 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 != 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 structure.
> + @param DevicePathNode A pointer to a single device path node.
> +
> + @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 FirstDevicePath
> + 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 != 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 structure.
> + @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 != 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 to the current
> + device path instance. On output, this 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 the 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 != 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 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 NodeType The device node type for the new device 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 != 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 structure.
> +
> + @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 != 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 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 != 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 != 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 != 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 TextDeviceNode is 
> NULL or
> + there was insufficient memory.
> +
> +**/
> +EFI_DEVICE_PATH_PROTOCOL *
> +EFIAPI
> +ConvertTextToDevicePath (
> + IN CONST CHAR16 *TextDevicePath
> + )
> +{
> + if (mDevicePathLibDevicePathFromText != NULL) {
> + return mDevicePathLibDevicePathFromText->ConvertTextToDevicePath 
> (TextDevicePath);
> + }
> +
> + ASSERT (FALSE);
> + return NULL;
> +}
> +
> diff --git 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.inf
>  
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.inf
> new file mode 100644
> index 0000000000..eb545d4601
> --- /dev/null
> +++ 
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.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 
> Protocol.
> +# If the DevicePathFromText/DevicePathToText protocol doesn't exist, the 
> library
> +# uses its internal conversion logic.
> +#
> +# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = UefiDevicePathLibMandatoryDevicePathProtocol
> + MODULE_UNI_FILE = UefiDevicePathLibMandatoryDevicePathProtocol.uni
> + FILE_GUID = 5A8389AF-DAE4-407E-8FD5-D026948BC579
> + MODULE_TYPE = UEFI_DRIVER
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = DevicePathLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER 
> UEFI_APPLICATION UEFI_DRIVER SMM_CORE
> +
> + CONSTRUCTOR = UefiDevicePathLibMandatoryDevicePathProtocolConstructor
> +
> +#
> +# VALID_ARCHITECTURES = 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/UefiDevicePathLibMandatoryDevicePathProtocol.uni
>  
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.uni
> new file mode 100644
> index 0000000000..1b8a556698
> --- /dev/null
> +++ 
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibMandatoryDevicePathProtocol.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 
> Protocol.
> +// If the DevicePathFromText/DevicePathToText protocol doesn't exist, the 
> library
> +// uses its internal conversion logic.
> +//
> +// Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +//
> +// SPDX-License-Identifier: BSD-2-Clause-Patent
> +//
> +// **/
> +
> +
> +#string STR_MODULE_ABSTRACT #language en-US "Instance of Device 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/UefiDevicePathLibOptionalDevicePathProtocol.c
>  
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.c
> index 106ff245cc..ddef75da18 100644
> --- 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.c
> +++ 
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.c
> @@ -8,7 +8,7 @@
> environment varibles. Multi-instance device paths should never be placed
> on a Handle.
>
> - Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
> 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 = NULL;
>
> /**
> - The constructor function caches the pointer to DevicePathUtilites protocol,
> - DevicePathToText protocol and DevicePathFromText protocol.
> + The constructor function caches the pointer to DevicePathUtilites protocol.
>
> The constructor function locates these three protocols from protocol database.
> It will caches the pointer to local protocol instance if that operation fails
> @@ -41,16 +40,12 @@ UefiDevicePathLibOptionalDevicePathProtocolConstructor (
> IN EFI_SYSTEM_TABLE *SystemTable
> )
> {
> - EFI_STATUS Status;
> -
> - Status = gBS->LocateProtocol (
> - &gEfiDevicePathUtilitiesProtocolGuid,
> - NULL,
> - (VOID**) &mDevicePathLibDevicePathUtilities
> - );
> - ASSERT_EFI_ERROR (Status);
> - ASSERT (mDevicePathLibDevicePathUtilities != NULL);
> - return Status;
> + gBS->LocateProtocol (
> + &gEfiDevicePathUtilitiesProtocolGuid,
> + NULL,
> + (VOID**) &mDevicePathLibDevicePathUtilities
> + );
> + return EFI_SUCCESS;
> }
>
> /**
> diff --git 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
>  
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
> index e812e3e1d4..d194300bde 100644
> --- 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
> +++ 
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.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.<BR>
> +# Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
> #
> # 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
> -
> diff --git 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.uni
>  
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.uni
> index 070f0add9f..7a7ebaaf1e 100644
> --- 
> a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.uni
> +++ 
> b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.uni
> @@ -5,14 +5,14 @@
> // If the DevicePathFromText/DevicePathToText protocol doesn't exist, the 
> library
> // uses its internal conversion logic.
> //
> -// Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
> +// Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.<BR>
> //
> // SPDX-License-Identifier: BSD-2-Clause-Patent
> //
> // **/
>
> -#string STR_MODULE_ABSTRACT #language en-US "Instance of Device Path Library 
> based on Device Path Protocol."
> +#string STR_MODULE_ABSTRACT #language en-US "Instance of Device Path Library 
> based on Device Path Protocol or Memory Allocation Library."
>
> -#string STR_MODULE_DESCRIPTION #language en-US "Instance of Device Path 
> Library based on Device Path Protocol."
> +#string STR_MODULE_DESCRIPTION #language en-US "Instance of Device Path 
> Library based on Device Path Protocol or Memory Allocation Library."
>
> --
> 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#52335): https://edk2.groups.io/g/devel/message/52335
Mute This Topic: https://groups.io/mt/68779978/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to