[edk2-devel] [PATCH 1/2] MdePkg/UefiDevicePathLib: Separate the device path lib

Gao, Zhichao zhichao.gao at intel.com
Tue Dec 10 10:14:47 UTC 2019


The mandatory one is expected to catch the ASSERT. But the Optional one should return success. I would fix that in the V2 patch set.

Thanks,
Zhichao

> -----Original Message-----
> From: Gao, Liming <liming.gao at intel.com>
> Sent: Tuesday, December 10, 2019 9:04 AM
> To: Gao, Zhichao <zhichao.gao at intel.com>; devel at edk2.groups.io
> Cc: Kinney, Michael D <michael.d.kinney at intel.com>; Vitaly Cheptsov
> <vit9696 at protonmail.com>; Gao, Liming <liming.gao at intel.com>
> Subject: RE: [PATCH 1/2] MdePkg/UefiDevicePathLib: Separate the device path
> lib
> 
> Zhichao:
>   The change is good. New library instance is benefit for image size.
> 
>   But, please make sure library constructor always return success. Otherwise,
> error status will assert in autogen code.
> 
> Thanks
> Liming
> >-----Original Message-----
> >From: Gao, Zhichao
> >Sent: Thursday, November 28, 2019 10:15 AM
> >To: devel at edk2.groups.io
> >Cc: Kinney, Michael D <michael.d.kinney at intel.com>; Gao, Liming
> ><liming.gao at intel.com>; Vitaly Cheptsov <vit9696 at protonmail.com>
> >Subject: [PATCH 1/2] MdePkg/UefiDevicePathLib: Separate the device path
> >lib
> >
> >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.kinney at intel.com>
> >Cc: Liming Gao <liming.gao at intel.com>
> >Cc: Vitaly Cheptsov <vit9696 at protonmail.com>
> >Signed-off-by: Zhichao Gao <zhichao.gao at intel.com>
> >---
> > ...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.<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/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 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/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 Protocol.
> >+// 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> // // 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/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 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 @@ -48,8 +47,6 @@
> >UefiDevicePathLibOptionalDevicePathProtocolConstructor (
> >                   NULL,
> >                   (VOID**) &mDevicePathLibDevicePathUtilities
> >                   );
> >-  ASSERT_EFI_ERROR (Status);
> >-  ASSERT (mDevicePathLibDevicePathUtilities != 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.<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
> >-
> >--
> >2.21.0.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#52081): https://edk2.groups.io/g/devel/message/52081
Mute This Topic: https://groups.io/mt/63579361/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list