Add DevicePathUtilities DevicePathToText DevciePathFromText USB2HostController protocols
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1037 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
107
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.c
Normal file
107
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
DevicePathDriver.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Device Path Driver to produce DevPathUtilities Protocol, DevPathFromText Protocol
|
||||
and DevPathToText Protocol.
|
||||
|
||||
--*/
|
||||
|
||||
#include <Uefi/UefiSpec.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include "DevicePath.h"
|
||||
|
||||
DEVICE_PATH_DRIVER_PRIVATE_DATA mPrivateData;
|
||||
|
||||
EFI_GUID mEfiDevicePathMessagingUartFlowControlGuid = DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL;
|
||||
EFI_GUID mEfiDevicePathMessagingSASGuid = DEVICE_PATH_MESSAGING_SAS;
|
||||
|
||||
STATIC EFI_DEVICE_PATH_UTILITIES_PROTOCOL mDevicePathUtilitiesProtocol = {
|
||||
GetDevicePathSize,
|
||||
DuplicateDevicePath,
|
||||
AppendDevicePath,
|
||||
AppendDeviceNode,
|
||||
AppendDevicePathInstance,
|
||||
GetNextDevicePathInstance,
|
||||
IsDevicePathMultiInstance,
|
||||
CreateDeviceNode
|
||||
};
|
||||
|
||||
STATIC EFI_DEVICE_PATH_TO_TEXT_PROTOCOL mDevicePathToTextProtocol = {
|
||||
ConvertDeviceNodeToText,
|
||||
ConvertDevicePathToText
|
||||
};
|
||||
|
||||
STATIC EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL mDevicePathFromTextProtocol = {
|
||||
ConvertTextToDeviceNode,
|
||||
ConvertTextToDevicePath
|
||||
};
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
DevicePathEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Entry point for EFI drivers.
|
||||
|
||||
Arguments:
|
||||
ImageHandle - EFI_HANDLE
|
||||
SystemTable - EFI_SYSTEM_TABLE
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS
|
||||
others
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
mPrivateData.Signature = DEVICE_PATH_DRIVER_SIGNATURE;
|
||||
|
||||
mPrivateData.DevicePathUtilities.GetDevicePathSize = GetDevicePathSize;
|
||||
mPrivateData.DevicePathUtilities.DuplicateDevicePath = DuplicateDevicePath;
|
||||
mPrivateData.DevicePathUtilities.AppendDevicePath = AppendDevicePath;
|
||||
mPrivateData.DevicePathUtilities.AppendDeviceNode = AppendDeviceNode;
|
||||
mPrivateData.DevicePathUtilities.AppendDevicePathInstance = AppendDevicePathInstance;
|
||||
mPrivateData.DevicePathUtilities.GetNextDevicePathInstance = GetNextDevicePathInstance;
|
||||
mPrivateData.DevicePathUtilities.IsDevicePathMultiInstance = IsDevicePathMultiInstance;
|
||||
mPrivateData.DevicePathUtilities.CreateDeviceNode = CreateDeviceNode;
|
||||
|
||||
mPrivateData.DevicePathToText.ConvertDeviceNodeToText = ConvertDeviceNodeToText;
|
||||
mPrivateData.DevicePathToText.ConvertDevicePathToText = ConvertDevicePathToText;
|
||||
|
||||
mPrivateData.DevicePathFromText.ConvertTextToDeviceNode = ConvertTextToDeviceNode;
|
||||
mPrivateData.DevicePathFromText.ConvertTextToDevicePath = ConvertTextToDevicePath;
|
||||
|
||||
mPrivateData.Handle = NULL;
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&mPrivateData.Handle,
|
||||
&gEfiDevicePathUtilitiesProtocolGuid,
|
||||
&mPrivateData.DevicePathUtilities,
|
||||
&gEfiDevicePathToTextProtocolGuid,
|
||||
&mPrivateData.DevicePathToText,
|
||||
&gEfiDevicePathFromTextProtocolGuid,
|
||||
&mPrivateData.DevicePathFromText,
|
||||
NULL
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
422
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.h
Normal file
422
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.h
Normal file
@@ -0,0 +1,422 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
DevicePathDriver.h
|
||||
|
||||
Abstract:
|
||||
Definition for Device Path Utilities driver
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _DEVICE_PATH_DRIVER_H
|
||||
#define _DEVICE_PATH_DRIVER_H
|
||||
|
||||
extern EFI_GUID mEfiDevicePathMessagingUartFlowControlGuid;
|
||||
extern EFI_GUID mEfiDevicePathMessagingSASGuid;
|
||||
|
||||
#define DEVICE_PATH_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('D', 'P', 'D', 'V')
|
||||
|
||||
typedef struct {
|
||||
|
||||
UINT32 Signature;
|
||||
EFI_HANDLE Handle;
|
||||
//
|
||||
// Produced protocols
|
||||
//
|
||||
EFI_DEVICE_PATH_UTILITIES_PROTOCOL DevicePathUtilities;
|
||||
EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL DevicePathFromText;
|
||||
EFI_DEVICE_PATH_TO_TEXT_PROTOCOL DevicePathToText;
|
||||
|
||||
} DEVICE_PATH_DRIVER_PRIVATE_DATA;
|
||||
|
||||
#define MAX_CHAR 480
|
||||
|
||||
#define MIN_ALIGNMENT_SIZE sizeof(UINTN)
|
||||
#define ALIGN_SIZE(a) ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0)
|
||||
|
||||
#define IS_COMMA(a) ((a) == L',')
|
||||
#define IS_HYPHEN(a) ((a) == L'-')
|
||||
#define IS_DOT(a) ((a) == L'.')
|
||||
#define IS_LEFT_PARENTH(a) ((a) == L'(')
|
||||
#define IS_RIGHT_PARENTH(a) ((a) == L')')
|
||||
#define IS_SLASH(a) ((a) == L'/')
|
||||
#define IS_NULL(a) ((a) == L'\0')
|
||||
|
||||
#define DEVICE_NODE_END 1
|
||||
#define DEVICE_PATH_INSTANCE_END 2
|
||||
#define DEVICE_PATH_END 3
|
||||
|
||||
#define SetDevicePathInstanceEndNode(a) { \
|
||||
(a)->Type = END_DEVICE_PATH_TYPE; \
|
||||
(a)->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE; \
|
||||
(a)->Length[0] = sizeof (EFI_DEVICE_PATH_PROTOCOL); \
|
||||
(a)->Length[1] = 0; \
|
||||
}
|
||||
|
||||
//
|
||||
// Private Data structure
|
||||
//
|
||||
typedef struct {
|
||||
CHAR16 *Str;
|
||||
UINTN Len;
|
||||
UINTN MaxLen;
|
||||
} POOL_PRINT;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Type;
|
||||
UINT8 SubType;
|
||||
VOID (*Function) (POOL_PRINT *, VOID *, BOOLEAN, BOOLEAN);
|
||||
} DEVICE_PATH_TO_TEXT_TABLE;
|
||||
|
||||
typedef struct {
|
||||
CHAR16 *DevicePathNodeText;
|
||||
EFI_DEVICE_PATH_PROTOCOL * (*Function) (CHAR16 *);
|
||||
} DEVICE_PATH_FROM_TEXT_TABLE;
|
||||
|
||||
typedef struct {
|
||||
BOOLEAN ClassExist;
|
||||
UINT8 Class;
|
||||
BOOLEAN SubClassExist;
|
||||
UINT8 SubClass;
|
||||
} USB_CLASS_TEXT;
|
||||
|
||||
#define USB_CLASS_AUDIO 1
|
||||
#define USB_CLASS_CDCCONTROL 2
|
||||
#define USB_CLASS_HID 3
|
||||
#define USB_CLASS_IMAGE 6
|
||||
#define USB_CLASS_PRINTER 7
|
||||
#define USB_CLASS_MASS_STORAGE 8
|
||||
#define USB_CLASS_HUB 9
|
||||
#define USB_CLASS_CDCDATA 10
|
||||
#define USB_CLASS_SMART_CARD 11
|
||||
#define USB_CLASS_VIDEO 14
|
||||
#define USB_CLASS_DIAGNOSTIC 220
|
||||
#define USB_CLASS_WIRELESS 224
|
||||
|
||||
#define USB_CLASS_RESERVE 254
|
||||
#define USB_SUBCLASS_FW_UPDATE 1
|
||||
#define USB_SUBCLASS_IRDA_BRIDGE 2
|
||||
#define USB_SUBCLASS_TEST 3
|
||||
|
||||
typedef struct {
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
EFI_GUID Guid;
|
||||
UINT8 VendorDefinedData[1];
|
||||
} VENDOR_DEFINED_HARDWARE_DEVICE_PATH;
|
||||
|
||||
typedef struct {
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
EFI_GUID Guid;
|
||||
UINT8 VendorDefinedData[1];
|
||||
} VENDOR_DEFINED_MESSAGING_DEVICE_PATH;
|
||||
|
||||
typedef struct {
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
EFI_GUID Guid;
|
||||
UINT8 VendorDefinedData[1];
|
||||
} VENDOR_DEFINED_MEDIA_DEVICE_PATH;
|
||||
|
||||
typedef struct {
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
UINT32 HID;
|
||||
UINT32 UID;
|
||||
UINT32 CID;
|
||||
CHAR8 HidUidCidStr[3];
|
||||
} ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR;
|
||||
|
||||
typedef struct {
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
UINT16 NetworkProtocol;
|
||||
UINT16 LoginOption;
|
||||
UINT16 Reserved;
|
||||
UINT16 TargetPortalGroupTag;
|
||||
UINT64 Lun;
|
||||
CHAR16 iSCSITargetName[1];
|
||||
} ISCSI_DEVICE_PATH_WITH_NAME;
|
||||
|
||||
typedef struct {
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
EFI_GUID Guid;
|
||||
UINT8 VendorDefinedData[1];
|
||||
} VENDOR_DEVICE_PATH_WITH_DATA;
|
||||
|
||||
CHAR16 *
|
||||
ConvertDeviceNodeToText (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,
|
||||
IN BOOLEAN DisplayOnly,
|
||||
IN BOOLEAN AllowShortcuts
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Convert a device node to its text representation.
|
||||
|
||||
Arguments:
|
||||
DeviceNode - Points to the device node to be converted.
|
||||
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.
|
||||
AllowShortcuts - If AllowShortcuts is TRUE, then the shortcut forms of text
|
||||
representation for a device node can be used, where applicable.
|
||||
|
||||
Returns:
|
||||
A pointer - a pointer to the allocated text representation of the device node.
|
||||
NULL - if DeviceNode is NULL or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
CHAR16 *
|
||||
ConvertDevicePathToText (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,
|
||||
IN BOOLEAN DisplayOnly,
|
||||
IN BOOLEAN AllowShortcuts
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Convert a device path to its text representation.
|
||||
|
||||
Arguments:
|
||||
DeviceNode - Points to the device path to be converted.
|
||||
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.
|
||||
AllowShortcuts - If AllowShortcuts is TRUE, then the shortcut forms of text
|
||||
representation for a device node can be used, where applicable.
|
||||
|
||||
Returns:
|
||||
A pointer - a pointer to the allocated text representation of the device path.
|
||||
NULL - if DeviceNode is NULL or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
ConvertTextToDeviceNode (
|
||||
IN CONST CHAR16 *TextDeviceNode
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Convert text to the binary representation of a device node.
|
||||
|
||||
Arguments:
|
||||
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.
|
||||
|
||||
Returns:
|
||||
A pointer - Pointer to the EFI device node.
|
||||
NULL - if TextDeviceNode is NULL or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
ConvertTextToDevicePath (
|
||||
IN CONST CHAR16 *TextDevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Convert text to the binary representation of a device path.
|
||||
|
||||
Arguments:
|
||||
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.
|
||||
|
||||
Returns:
|
||||
A pointer - Pointer to the allocated device path.
|
||||
NULL - if TextDeviceNode is NULL or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
UINTN
|
||||
GetDevicePathSize (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Returns the size of the device path, in bytes.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the start of the EFI device path.
|
||||
|
||||
Returns:
|
||||
Size - Size of the specified device path, in bytes, including the end-of-path tag.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
DuplicateDevicePath (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Create a duplicate of the specified path.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the source EFI device path.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the duplicate device path.
|
||||
NULL - Insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
AppendDevicePath (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *Src1,
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *Src2
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Create a new path by appending the second device path to the first.
|
||||
|
||||
Arguments:
|
||||
Src1 - Points to the first device path. If NULL, then it is ignored.
|
||||
Src2 - Points to the second device path. If NULL, then it is ignored.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the newly created device path.
|
||||
NULL - Memory could not be allocated
|
||||
or either DevicePath or DeviceNode is NULL.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
AppendDeviceNode (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a new path by appending the device node to the device path.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the device path.
|
||||
DeviceNode - Points to the device node.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the allocated device node.
|
||||
NULL - Memory could not be allocated
|
||||
or either DevicePath or DeviceNode is NULL.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
AppendDevicePathInstance (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a new path by appending the specified device path instance to the specified device path.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the device path. If NULL, then ignored.
|
||||
DevicePathInstance - Points to the device path instance.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the newly created device path
|
||||
NULL - Memory could not be allocated or DevicePathInstance is NULL.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
GetNextDevicePathInstance (
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathInstance,
|
||||
OUT UINTN *DevicePathInstanceSize
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a copy of the current device path instance and returns a pointer to the next device path instance.
|
||||
|
||||
Arguments:
|
||||
DevicePathInstance - 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.
|
||||
DevicePathInstanceSize - On output, this holds the size of the device path instance,
|
||||
in bytes or zero, if DevicePathInstance is zero.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the copy of the current device path instance.
|
||||
NULL - DevicePathInstace was NULL on entry or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
BOOLEAN
|
||||
IsDevicePathMultiInstance (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Returns whether a device path is multi-instance.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the device path. If NULL, then ignored.
|
||||
|
||||
Returns:
|
||||
TRUE - The device path has more than one instance
|
||||
FALSE - The device path is empty or contains only a single instance.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
CreateDeviceNode (
|
||||
IN UINT8 NodeType,
|
||||
IN UINT8 NodeSubType,
|
||||
IN UINT16 NodeLength
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a device node
|
||||
|
||||
Arguments:
|
||||
NodeType - NodeType is the device node type (EFI_DEVICE_PATH.Type) for
|
||||
the new device node.
|
||||
NodeSubType - NodeSubType is the device node sub-type
|
||||
EFI_DEVICE_PATH.SubType) for the new device node.
|
||||
NodeLength - NodeLength is the length of the device node
|
||||
(EFI_DEVICE_PATH.Length) for the new device node.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the newly created device node.
|
||||
NULL - NodeLength is less than
|
||||
the size of the header or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#endif
|
109
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.msa
Normal file
109
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.msa
Normal file
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
|
||||
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">
|
||||
|
||||
<MsaHeader>
|
||||
<ModuleName>DevicePath</ModuleName>
|
||||
<ModuleType>DXE_DRIVER</ModuleType>
|
||||
<GuidValue>9B680FCE-AD6B-4F3A-B60B-F59899003443</GuidValue>
|
||||
<Version>1.0</Version>
|
||||
<Abstract>Component description file for Device Path Driver.</Abstract>
|
||||
<Description>This driver is for DevicePathUtilities, DevicePahtToText and DevicePathFromText</Description>
|
||||
<Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
|
||||
<License>All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
|
||||
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
|
||||
</MsaHeader>
|
||||
<ModuleDefinitions>
|
||||
<SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>
|
||||
<BinaryModule>false</BinaryModule>
|
||||
<OutputFileBasename>DevicePath</OutputFileBasename>
|
||||
</ModuleDefinitions>
|
||||
<LibraryClassDefinitions>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>DebugLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>PrintLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiDriverEntryPoint</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>BaseMemoryLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>MemoryAllocationLib</Keyword>
|
||||
</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||
<Keyword>UefiBootServicesTableLib</Keyword>
|
||||
</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>DevicePath.c</Filename>
|
||||
<Filename>DevicePath.h</Filename>
|
||||
<Filename>DevicePathFromText.c</Filename>
|
||||
<Filename>DevicePathToText.c</Filename>
|
||||
<Filename>DevicePathUtilities.c</Filename>
|
||||
</SourceFiles>
|
||||
<PackageDependencies>
|
||||
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||
<Package PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
|
||||
</PackageDependencies>
|
||||
<Protocols>
|
||||
<Protocol Usage="ALWAYS_CONSUMED">
|
||||
<ProtocolCName>gEfiDebugPortProtocolGuid</ProtocolCName>
|
||||
</Protocol>
|
||||
<Protocol Usage="ALWAYS_CONSUMED">
|
||||
<ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName>
|
||||
</Protocol>
|
||||
<Protocol Usage="ALWAYS_PRODUCED">
|
||||
<ProtocolCName>gEfiDevicePathUtilitiesProtocolGuid</ProtocolCName>
|
||||
</Protocol>
|
||||
<Protocol Usage="ALWAYS_PRODUCED">
|
||||
<ProtocolCName>gEfiDevicePathFromTextProtocolGuid</ProtocolCName>
|
||||
</Protocol>
|
||||
<Protocol Usage="ALWAYS_PRODUCED">
|
||||
<ProtocolCName>gEfiDevicePathToTextProtocolGuid</ProtocolCName>
|
||||
</Protocol>
|
||||
</Protocols>
|
||||
<Guids>
|
||||
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||
<GuidCName>gEfiPcAnsiGuid</GuidCName>
|
||||
</GuidCNames>
|
||||
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||
<GuidCName>gEfiVT100PlusGuid</GuidCName>
|
||||
</GuidCNames>
|
||||
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||
<GuidCName>gEfiVT100Guid</GuidCName>
|
||||
</GuidCNames>
|
||||
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||
<GuidCName>gEfiVTUTF8Guid</GuidCName>
|
||||
</GuidCNames>
|
||||
</Guids>
|
||||
<Externs>
|
||||
<Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
|
||||
<Specification>EDK_RELEASE_VERSION 0x00090000</Specification>
|
||||
<Extern>
|
||||
<ModuleEntryPoint>DevicePathEntryPoint</ModuleEntryPoint>
|
||||
</Extern>
|
||||
</Externs>
|
||||
</ModuleSurfaceArea>
|
2434
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathFromText.c
Normal file
2434
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathFromText.c
Normal file
File diff suppressed because it is too large
Load Diff
1526
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathToText.c
Normal file
1526
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathToText.c
Normal file
File diff suppressed because it is too large
Load Diff
421
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathUtilities.c
Normal file
421
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathUtilities.c
Normal file
@@ -0,0 +1,421 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
DevicePathUtilities.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Implementation file for Device Path Utilities Protocol
|
||||
|
||||
--*/
|
||||
|
||||
#include <protocol/DevicePathUtilities.h>
|
||||
#include <protocol/DevicePath.h>
|
||||
#include "DevicePath.h"
|
||||
|
||||
UINTN
|
||||
GetDevicePathSize (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Returns the size of the device path, in bytes.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the start of the EFI device path.
|
||||
|
||||
Returns:
|
||||
Size - Size of the specified device path, in bytes, including the end-of-path tag.
|
||||
|
||||
--*/
|
||||
{
|
||||
CONST EFI_DEVICE_PATH_PROTOCOL *Start;
|
||||
|
||||
if (DevicePath == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Search for the end of the device path structure
|
||||
//
|
||||
Start = (EFI_DEVICE_PATH_PROTOCOL *) DevicePath;
|
||||
while (!IsDevicePathEnd (DevicePath)) {
|
||||
DevicePath = NextDevicePathNode (DevicePath);
|
||||
}
|
||||
|
||||
//
|
||||
// Compute the size and add back in the size of the end device path structure
|
||||
//
|
||||
return ((UINTN) DevicePath - (UINTN) Start) + sizeof (EFI_DEVICE_PATH_PROTOCOL);
|
||||
}
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
DuplicateDevicePath (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Create a duplicate of the specified path.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the source EFI device path.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the duplicate device path.
|
||||
NULL - Insufficient memory.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
UINTN Size;
|
||||
|
||||
if (DevicePath == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Compute the size
|
||||
//
|
||||
Size = GetDevicePathSize (DevicePath);
|
||||
if (Size == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for duplicate device path
|
||||
//
|
||||
NewDevicePath = AllocateCopyPool (Size, (VOID *) DevicePath);
|
||||
|
||||
return NewDevicePath;
|
||||
}
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
AppendDevicePath (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *Src1,
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *Src2
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Create a new path by appending the second device path to the first.
|
||||
|
||||
Arguments:
|
||||
Src1 - Points to the first device path. If NULL, then it is ignored.
|
||||
Src2 - Points to the second device path. If NULL, then it is ignored.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the newly created device path.
|
||||
NULL - Memory could not be allocated
|
||||
or either DevicePath or DeviceNode is NULL.
|
||||
|
||||
--*/
|
||||
{
|
||||
UINTN Size;
|
||||
UINTN Size1;
|
||||
UINTN Size2;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath;
|
||||
|
||||
//
|
||||
// If there's only 1 path, just duplicate it
|
||||
//
|
||||
if (Src1 == NULL) {
|
||||
ASSERT (!IsDevicePathUnpacked (Src2));
|
||||
return DuplicateDevicePath (Src2);
|
||||
}
|
||||
|
||||
if (Src2 == NULL) {
|
||||
ASSERT (!IsDevicePathUnpacked (Src1));
|
||||
return DuplicateDevicePath (Src1);
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for the combined device path. It only has one end node of
|
||||
// length EFI_DEVICE_PATH_PROTOCOL
|
||||
//
|
||||
Size1 = GetDevicePathSize (Src1);
|
||||
Size2 = GetDevicePathSize (Src2);
|
||||
Size = Size1 + Size2 - sizeof (EFI_DEVICE_PATH_PROTOCOL);
|
||||
|
||||
NewDevicePath = AllocateCopyPool (Size, (VOID *) Src1);
|
||||
|
||||
if (NewDevicePath != NULL) {
|
||||
//
|
||||
// Over write Src1 EndNode and do the copy
|
||||
//
|
||||
SecondDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) ((CHAR8 *) NewDevicePath + (Size1 - sizeof (EFI_DEVICE_PATH_PROTOCOL)));
|
||||
CopyMem (SecondDevicePath, (VOID *) Src2, Size2);
|
||||
}
|
||||
|
||||
return NewDevicePath;
|
||||
}
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
AppendDeviceNode (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a new path by appending the device node to the device path.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the device path.
|
||||
DeviceNode - Points to the device node.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the allocated device node.
|
||||
NULL - Memory could not be allocated
|
||||
or either DevicePath or DeviceNode is NULL.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *Temp;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NextNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
UINTN NodeLength;
|
||||
|
||||
if ((DevicePath == NULL) || (DeviceNode == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Build a Node that has a terminator on it
|
||||
//
|
||||
NodeLength = DevicePathNodeLength (DeviceNode);
|
||||
|
||||
Temp = AllocateCopyPool (NodeLength + sizeof (EFI_DEVICE_PATH_PROTOCOL), (VOID *) DeviceNode);
|
||||
if (Temp == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Add and end device path node to convert Node to device path
|
||||
//
|
||||
NextNode = NextDevicePathNode (Temp);
|
||||
SetDevicePathEndNode (NextNode);
|
||||
|
||||
//
|
||||
// Append device paths
|
||||
//
|
||||
NewDevicePath = AppendDevicePath (DevicePath, Temp);
|
||||
gBS->FreePool (Temp);
|
||||
return NewDevicePath;
|
||||
}
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
AppendDevicePathInstance (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a new path by appending the specified device path instance to the specified device path.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the device path. If NULL, then ignored.
|
||||
DevicePathInstance - Points to the device path instance.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the newly created device path
|
||||
NULL - Memory could not be allocated or DevicePathInstance is NULL.
|
||||
|
||||
--*/
|
||||
{
|
||||
UINT8 *Ptr;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevPath;
|
||||
UINTN SrcSize;
|
||||
UINTN InstanceSize;
|
||||
|
||||
if (DevicePathInstance == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (DevicePath == NULL) {
|
||||
return DuplicateDevicePath (DevicePathInstance);
|
||||
}
|
||||
|
||||
SrcSize = GetDevicePathSize (DevicePath);
|
||||
InstanceSize = GetDevicePathSize (DevicePathInstance);
|
||||
|
||||
Ptr = AllocateCopyPool (SrcSize + InstanceSize, (VOID *) DevicePath);
|
||||
if (Ptr != NULL) {
|
||||
|
||||
DevPath = (EFI_DEVICE_PATH_PROTOCOL *) (Ptr + (SrcSize - sizeof (EFI_DEVICE_PATH_PROTOCOL)));
|
||||
//
|
||||
// Convert the End to an End Instance, since we are
|
||||
// appending another instacne after this one its a good
|
||||
// idea.
|
||||
//
|
||||
DevPath->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
|
||||
|
||||
DevPath = NextDevicePathNode (DevPath);
|
||||
CopyMem (DevPath, (VOID *) DevicePathInstance, InstanceSize);
|
||||
}
|
||||
|
||||
return (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
|
||||
}
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
GetNextDevicePathInstance (
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathInstance,
|
||||
OUT UINTN *DevicePathInstanceSize
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a copy of the current device path instance and returns a pointer to the next device path instance.
|
||||
|
||||
Arguments:
|
||||
DevicePathInstance - 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.
|
||||
DevicePathInstanceSize - On output, this holds the size of the device path instance,
|
||||
in bytes or zero, if DevicePathInstance is zero.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the copy of the current device path instance.
|
||||
NULL - DevicePathInstace was NULL on entry or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ReturnValue;
|
||||
UINT8 Temp;
|
||||
|
||||
if (*DevicePathInstance == NULL) {
|
||||
if (DevicePathInstanceSize != NULL) {
|
||||
*DevicePathInstanceSize = 0;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Find the end of the device path instance
|
||||
//
|
||||
DevPath = *DevicePathInstance;
|
||||
while (!IsDevicePathEndType (DevPath)) {
|
||||
DevPath = NextDevicePathNode (DevPath);
|
||||
}
|
||||
|
||||
//
|
||||
// Compute the size of the device path instance
|
||||
//
|
||||
if (DevicePathInstanceSize != NULL) {
|
||||
*DevicePathInstanceSize = ((UINTN) DevPath - (UINTN) (*DevicePathInstance)) + sizeof (EFI_DEVICE_PATH_PROTOCOL);
|
||||
}
|
||||
|
||||
//
|
||||
// Make a copy and return the device path instance
|
||||
//
|
||||
Temp = DevPath->SubType;
|
||||
DevPath->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||
ReturnValue = DuplicateDevicePath (*DevicePathInstance);
|
||||
DevPath->SubType = Temp;
|
||||
|
||||
//
|
||||
// If DevPath is the end of an entire device path, then another instance
|
||||
// does not follow, so *DevicePath is set to NULL.
|
||||
//
|
||||
if (DevicePathSubType (DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE) {
|
||||
*DevicePathInstance = NULL;
|
||||
} else {
|
||||
*DevicePathInstance = NextDevicePathNode (DevPath);
|
||||
}
|
||||
|
||||
return ReturnValue;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
IsDevicePathMultiInstance (
|
||||
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Returns whether a device path is multi-instance.
|
||||
|
||||
Arguments:
|
||||
DevicePath - Points to the device path. If NULL, then ignored.
|
||||
|
||||
Returns:
|
||||
TRUE - The device path has more than one instance
|
||||
FALSE - The device path is empty or contains only a single instance.
|
||||
|
||||
--*/
|
||||
{
|
||||
CONST EFI_DEVICE_PATH_PROTOCOL *Node;
|
||||
|
||||
if (DevicePath == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Node = DevicePath;
|
||||
while (!IsDevicePathEnd (Node)) {
|
||||
if (EfiIsDevicePathEndInstance (Node)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Node = NextDevicePathNode (Node);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *
|
||||
CreateDeviceNode (
|
||||
IN UINT8 NodeType,
|
||||
IN UINT8 NodeSubType,
|
||||
IN UINT16 NodeLength
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Creates a device node
|
||||
|
||||
Arguments:
|
||||
NodeType - NodeType is the device node type (EFI_DEVICE_PATH.Type) for
|
||||
the new device node.
|
||||
NodeSubType - NodeSubType is the device node sub-type
|
||||
EFI_DEVICE_PATH.SubType) for the new device node.
|
||||
NodeLength - NodeLength is the length of the device node
|
||||
(EFI_DEVICE_PATH.Length) for the new device node.
|
||||
|
||||
Returns:
|
||||
Pointer - A pointer to the newly created device node.
|
||||
NULL - NodeLength is less than
|
||||
the size of the header or there was insufficient memory.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *Node;
|
||||
|
||||
if (NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Node = (EFI_DEVICE_PATH_PROTOCOL *) AllocateZeroPool ((UINTN) NodeLength);
|
||||
if (Node != NULL) {
|
||||
Node->Type = NodeType;
|
||||
Node->SubType = NodeSubType;
|
||||
SetDevicePathNodeLength (Node, NodeLength);
|
||||
}
|
||||
|
||||
return Node;
|
||||
}
|
Reference in New Issue
Block a user