MdePkg: UefiDevicePathLib: Support UefiDevicePathLib under StandaloneMm

This change added an instance of UefiDevicePathLib for StandaloneMm. It
abstracts DevicePathFromHandle function into different files for
Standalone MM and other instances to avoid linking gBS into MM_STANDALONE
drivers.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>

Signed-off-by: Kun Qin <kun.q@outlook.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
Kun Qin 2020-12-17 14:35:38 -08:00
parent 1f0fa9187b
commit 14a746bb6a
7 changed files with 169 additions and 33 deletions

View File

@ -806,39 +806,6 @@ UefiDevicePathLibIsDevicePathMultiInstance (
}
/**
Retrieves the device path protocol from a handle.
This function returns the device path protocol from the handle specified by Handle.
If Handle is NULL or Handle does not contain a device path protocol, then NULL
is returned.
@param Handle The handle from which to retrieve the device
path protocol.
@return The device path protocol from the handle specified by Handle.
**/
EFI_DEVICE_PATH_PROTOCOL *
EFIAPI
DevicePathFromHandle (
IN EFI_HANDLE Handle
)
{
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_STATUS Status;
Status = gBS->HandleProtocol (
Handle,
&gEfiDevicePathProtocolGuid,
(VOID *) &DevicePath
);
if (EFI_ERROR (Status)) {
DevicePath = NULL;
}
return DevicePath;
}
/**
Allocates a device path for a file and appends it to an existing device path.

View File

@ -0,0 +1,51 @@
/** @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) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "UefiDevicePathLib.h"
/**
Retrieves the device path protocol from a handle.
This function returns the device path protocol from the handle specified by Handle.
If Handle is NULL or Handle does not contain a device path protocol, then NULL
is returned.
@param Handle The handle from which to retrieve the device
path protocol.
@return The device path protocol from the handle specified by Handle.
**/
EFI_DEVICE_PATH_PROTOCOL *
EFIAPI
DevicePathFromHandle (
IN EFI_HANDLE Handle
)
{
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_STATUS Status;
Status = gBS->HandleProtocol (
Handle,
&gEfiDevicePathProtocolGuid,
(VOID *) &DevicePath
);
if (EFI_ERROR (Status)) {
DevicePath = NULL;
}
return DevicePath;
}

View File

@ -0,0 +1,40 @@
/** @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) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "UefiDevicePathLib.h"
/**
Retrieves the device path protocol from a handle.
This function returns the device path protocol from the handle specified by Handle.
If Handle is NULL or Handle does not contain a device path protocol, then NULL
is returned.
@param Handle The handle from which to retrieve the device
path protocol.
@return The device path protocol from the handle specified by Handle.
**/
EFI_DEVICE_PATH_PROTOCOL *
EFIAPI
DevicePathFromHandle (
IN EFI_HANDLE Handle
)
{
return NULL;
}

View File

@ -26,6 +26,7 @@
[Sources]
DevicePathUtilities.c
DevicePathUtilitiesDxeSmm.c
DevicePathToText.c
DevicePathFromText.c
UefiDevicePathLib.c

View File

@ -29,6 +29,7 @@
[Sources]
DevicePathUtilities.c
DevicePathUtilitiesDxeSmm.c
DevicePathToText.c
DevicePathFromText.c
UefiDevicePathLibOptionalDevicePathProtocol.c

View File

@ -0,0 +1,75 @@
## @file
# Instance of Device Path Library based on Memory Allocation Library.
#
# Device Path Library that layers on top of the Memory Allocation Library.
#
# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
# Copyright (c) Microsoft Corporation.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = UefiDevicePathLib
MODULE_UNI_FILE = UefiDevicePathLib.uni
FILE_GUID = D8E58437-44D3-4154-B7A7-EB794923EF12
MODULE_TYPE = MM_STANDALONE
PI_SPECIFICATION_VERSION = 0x00010032
VERSION_STRING = 1.0
LIBRARY_CLASS = DevicePathLib | MM_STANDALONE MM_CORE_STANDALONE
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
[Sources]
DevicePathUtilities.c
DevicePathUtilitiesStandaloneMm.c
DevicePathToText.c
DevicePathFromText.c
UefiDevicePathLib.c
UefiDevicePathLib.h
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
BaseLib
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
gEfiDebugPortProtocolGuid ## UNDEFINED
[Pcd]
gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ## SOMETIMES_CONSUMES

View File

@ -109,6 +109,7 @@
MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.inf
MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf
MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf
MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf