/** @file\r
Main file for support of shell consist mapping.\r
\r
- Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
#include "UefiShellCommandLib.h"\r
#include <Library/DevicePathLib.h>\r
#include <Library/SortLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Protocol/UsbIo.h>\r
+#include <Protocol/BlockIo.h>\r
+#include <Protocol/SimpleFileSystem.h>\r
+\r
+\r
\r
typedef enum {\r
MTDTypeUnknown,\r
CHAR16 *Name;\r
} MTD_NAME;\r
\r
+/**\r
+ Serial Decode function.\r
+\r
+ @param DevPath The Device path info.\r
+ @param MapInfo The map info.\r
+ @param OrigDevPath The original device path protocol.\r
+\r
+**/\r
+typedef \r
+VOID \r
+(EFIAPI *SERIAL_DECODE_FUNCTION) (\r
+ EFI_DEVICE_PATH_PROTOCOL *DevPath, \r
+ DEVICE_CONSIST_MAPPING_INFO *MapInfo,\r
+ EFI_DEVICE_PATH_PROTOCOL *OrigDevPath\r
+ );\r
+\r
typedef struct {\r
UINT8 Type;\r
UINT8 SubType;\r
- VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, DEVICE_CONSIST_MAPPING_INFO *MapInfo);\r
+ SERIAL_DECODE_FUNCTION SerialFun;\r
INTN (EFIAPI *CompareFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, EFI_DEVICE_PATH_PROTOCOL *DevPath2);\r
} DEV_PATH_CONSIST_MAPPING_TABLE;\r
\r
ASSERT (Str->Str != NULL);\r
}\r
\r
- StrCat (Str->Str, AppendStr);\r
+ StrCatS (Str->Str, StringSize/sizeof(CHAR16), AppendStr);\r
Str->Len = StringSize;\r
\r
FreePool (AppendStr);\r
/**\r
Function to append a 64 bit number / 25 onto the string.\r
\r
- @param[in,out] Str The string so append onto.\r
- @param[in] Num The number to divide and append.\r
+ @param[in, out] Str The string so append onto.\r
+ @param[in] Num The number to divide and append.\r
\r
@retval EFI_INVALID_PARAMETER A parameter was NULL.\r
@retval EFI_SUCCESS The appending was successful.\r
/**\r
Function to append a 64 bit number onto the mapping info.\r
\r
- @param[in,out] MappingItem The mapping info object to append onto.\r
- @param[in] Num The info to append.\r
+ @param[in, out] MappingItem The mapping info object to append onto.\r
+ @param[in] Num The info to append.\r
\r
@retval EFI_INVALID_PARAMETER A parameter was NULL.\r
@retval EFI_SUCCESS The appending was successful.\r
/**\r
Function to append string into the mapping info.\r
\r
- @param[in,out] MappingItem The mapping info object to append onto.\r
- @param[in] Str The info to append.\r
+ @param[in, out] MappingItem The mapping info object to append onto.\r
+ @param[in] Str The info to append.\r
\r
@retval EFI_INVALID_PARAMETER A parameter was NULL.\r
@retval EFI_SUCCESS The appending was successful.\r
/**\r
Function to append a Guid to the mapping item.\r
\r
- @param[in,out] MappingItem The item to append onto.\r
- @param[in] Guid The guid to append.\r
+ @param[in, out] MappingItem The item to append onto.\r
+ @param[in] Guid The guid to append.\r
\r
@retval EFI_SUCCESS The appending operation was successful.\r
@retval EFI_INVALID_PARAMETER A parameter was NULL.\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialHardDrive (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
HARDDRIVE_DEVICE_PATH *Hd;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialAtapi (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
ATAPI_DEVICE_PATH *Atapi;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialCdRom (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
CDROM_DEVICE_PATH *Cd;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialFibre (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
FIBRECHANNEL_DEVICE_PATH *Fibre;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialUart (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
UART_DEVICE_PATH *Uart;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialUsb (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
- USB_DEVICE_PATH *Usb;\r
+ USB_DEVICE_PATH *Usb;\r
+ EFI_USB_IO_PROTOCOL *UsbIo;\r
+ EFI_HANDLE TempHandle;\r
+ EFI_STATUS Status;\r
+ USB_INTERFACE_DESCRIPTOR InterfaceDesc;\r
+\r
\r
ASSERT(DevicePathNode != NULL);\r
ASSERT(MappingItem != NULL);\r
Usb = (USB_DEVICE_PATH *) DevicePathNode;\r
AppendCSDNum (MappingItem, Usb->ParentPortNumber);\r
AppendCSDNum (MappingItem, Usb->InterfaceNumber);\r
+\r
+ if (PcdGetBool(PcdUsbExtendedDecode)) {\r
+ Status = gBS->LocateDevicePath( &gEfiUsbIoProtocolGuid, &DevicePath, &TempHandle );\r
+ UsbIo = NULL;\r
+ if (!EFI_ERROR(Status)) {\r
+ Status = gBS->OpenProtocol(TempHandle, &gEfiUsbIoProtocolGuid, (VOID**)&UsbIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+ } \r
+\r
+ if (!EFI_ERROR(Status)) {\r
+ ASSERT(UsbIo != NULL);\r
+ Status = UsbIo->UsbGetInterfaceDescriptor(UsbIo, &InterfaceDesc);\r
+ if (!EFI_ERROR(Status)) {\r
+ if (InterfaceDesc.InterfaceClass == USB_MASS_STORE_CLASS && MappingItem->Mtd == MTDTypeUnknown) {\r
+ switch (InterfaceDesc.InterfaceSubClass){\r
+ case USB_MASS_STORE_SCSI:\r
+ MappingItem->Mtd = MTDTypeHardDisk;\r
+ break;\r
+ case USB_MASS_STORE_8070I:\r
+ case USB_MASS_STORE_UFI:\r
+ MappingItem->Mtd = MTDTypeFloppy;\r
+ break;\r
+ case USB_MASS_STORE_8020I:\r
+ MappingItem->Mtd = MTDTypeCDRom;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ } \r
+ }\r
}\r
\r
/**\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialVendor (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
VENDOR_DEVICE_PATH *Vendor;\r
SAS_DEVICE_PATH *Sas;\r
+ UINTN TargetNameLength;\r
+ UINTN Index;\r
+ CHAR16 *Buffer;\r
\r
if (DevicePathNode == NULL || MappingItem == NULL) {\r
return;\r
AppendCSDNum (MappingItem, Sas->Lun);\r
AppendCSDNum (MappingItem, Sas->DeviceTopology);\r
AppendCSDNum (MappingItem, Sas->RelativeTargetPort);\r
+ } else {\r
+ TargetNameLength = MIN(DevicePathNodeLength (DevicePathNode) - sizeof (VENDOR_DEVICE_PATH), PcdGet32(PcdShellVendorExtendedDecode));\r
+ if (TargetNameLength != 0) {\r
+ //\r
+ // String is 2 chars per data byte, plus NULL terminator\r
+ //\r
+ Buffer = AllocateZeroPool (((TargetNameLength * 2) + 1) * sizeof(CHAR16));\r
+ ASSERT(Buffer != NULL);\r
+ if (Buffer == NULL) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Build the string data\r
+ //\r
+ for (Index = 0; Index < TargetNameLength; Index++) {\r
+ Buffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof (VENDOR_DEVICE_PATH) + Index));\r
+}\r
+\r
+ //\r
+ // Append the new data block\r
+ //\r
+ AppendCSDStr (MappingItem, Buffer);\r
+\r
+ FreePool(Buffer);\r
+ }\r
}\r
}\r
\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialLun (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
DEVICE_LOGICAL_UNIT_DEVICE_PATH *Lun;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialSata (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
SATA_DEVICE_PATH *Sata;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialIScsi (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
-///@todo make this a PCD\r
-//\r
-// As Csd of ISCSI node is quite long, we comment\r
-// the code below to keep the consistent mapping\r
-// short. Uncomment if you really need it.\r
-//\r
-/*\r
ISCSI_DEVICE_PATH *IScsi;\r
UINT8 *IScsiTargetName;\r
CHAR16 *TargetName;\r
ASSERT(DevicePathNode != NULL);\r
ASSERT(MappingItem != NULL);\r
\r
- IScsi = (ISCSI_DEVICE_PATH *) DevicePathNode;\r
- AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
- AppendCSDNum (MappingItem, IScsi->LoginOption);\r
- AppendCSDNum (MappingItem, IScsi->Lun);\r
- AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
- TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
- if (TargetNameLength > 0) {\r
- TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
- if (TargetName != NULL) {\r
- IScsiTargetName = (UINT8 *) (IScsi + 1);\r
- for (Index = 0; Index < TargetNameLength; Index++) {\r
- TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+ if (PcdGetBool(PcdShellDecodeIScsiMapNames)) {\r
+ IScsi = (ISCSI_DEVICE_PATH *) DevicePathNode;\r
+ AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
+ AppendCSDNum (MappingItem, IScsi->LoginOption);\r
+ AppendCSDNum (MappingItem, IScsi->Lun);\r
+ AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
+ TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
+ if (TargetNameLength > 0) {\r
+ TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
+ if (TargetName != NULL) {\r
+ IScsiTargetName = (UINT8 *) (IScsi + 1);\r
+ for (Index = 0; Index < TargetNameLength; Index++) {\r
+ TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+ }\r
+ AppendCSDStr (MappingItem, TargetName);\r
+ FreePool (TargetName);\r
}\r
- AppendCSDStr (MappingItem, TargetName);\r
- FreePool (TargetName);\r
}\r
}\r
- */\r
}\r
\r
/**\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialI2O (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
I2O_DEVICE_PATH *DevicePath_I20;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialMacAddr (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
MAC_ADDR_DEVICE_PATH *Mac;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialInfiniBand (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
INFINIBAND_DEVICE_PATH *InfiniBand;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialIPv4 (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
IPv4_DEVICE_PATH *Ip;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
+\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialIPv6 (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
IPv6_DEVICE_PATH *Ip;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
+\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialScsi (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
SCSI_DEVICE_PATH *Scsi;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerial1394 (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
F1394_DEVICE_PATH *DevicePath_F1394;\r
\r
@param[in] DevicePathNode The node to get info on.\r
@param[in] MappingItem The info item to populate.\r
+ @param[in] DevicePath Ignored.\r
**/\r
VOID\r
EFIAPI\r
DevPathSerialAcpi (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
ACPI_HID_DEVICE_PATH *Acpi;\r
\r
@param[in] DevicePathNode Ignored.\r
@param[in] MappingItem Ignored.\r
+ @param[in] DevicePath Ignored.\r
\r
Does nothing.\r
**/\r
EFIAPI\r
DevPathSerialDefault (\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,\r
- IN DEVICE_CONSIST_MAPPING_INFO *MappingItem\r
+ IN DEVICE_CONSIST_MAPPING_INFO *MappingItem,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
return;\r
}\r
\r
DEV_PATH_CONSIST_MAPPING_TABLE DevPathConsistMappingTable[] = {\r
- HARDWARE_DEVICE_PATH,\r
- HW_PCI_DP,\r
- DevPathSerialDefault,\r
- DevPathComparePci,\r
- ACPI_DEVICE_PATH,\r
- ACPI_DP,\r
- DevPathSerialAcpi,\r
- DevPathCompareAcpi,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_ATAPI_DP,\r
- DevPathSerialAtapi,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_SCSI_DP,\r
- DevPathSerialScsi,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_FIBRECHANNEL_DP,\r
- DevPathSerialFibre,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_1394_DP,\r
- DevPathSerial1394,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_USB_DP,\r
- DevPathSerialUsb,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_I2O_DP,\r
- DevPathSerialI2O,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_MAC_ADDR_DP,\r
- DevPathSerialMacAddr,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_IPv4_DP,\r
- DevPathSerialIPv4,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_IPv6_DP,\r
- DevPathSerialIPv6,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_INFINIBAND_DP,\r
- DevPathSerialInfiniBand,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_UART_DP,\r
- DevPathSerialUart,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_VENDOR_DP,\r
- DevPathSerialVendor,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_DEVICE_LOGICAL_UNIT_DP,\r
- DevPathSerialLun,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_SATA_DP,\r
- DevPathSerialSata,\r
- DevPathCompareDefault,\r
- MESSAGING_DEVICE_PATH,\r
- MSG_ISCSI_DP,\r
- DevPathSerialIScsi,\r
- DevPathCompareDefault,\r
- MEDIA_DEVICE_PATH,\r
- MEDIA_HARDDRIVE_DP,\r
- DevPathSerialHardDrive,\r
- DevPathCompareDefault,\r
- MEDIA_DEVICE_PATH,\r
- MEDIA_CDROM_DP,\r
- DevPathSerialCdRom,\r
- DevPathCompareDefault,\r
- MEDIA_DEVICE_PATH,\r
- MEDIA_VENDOR_DP,\r
- DevPathSerialVendor,\r
- DevPathCompareDefault,\r
- 0,\r
- 0,\r
- NULL,\r
- NULL\r
+ {\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_PCI_DP,\r
+ DevPathSerialDefault,\r
+ DevPathComparePci\r
+ },\r
+ {\r
+ ACPI_DEVICE_PATH,\r
+ ACPI_DP,\r
+ DevPathSerialAcpi,\r
+ DevPathCompareAcpi\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_ATAPI_DP,\r
+ DevPathSerialAtapi,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_SCSI_DP,\r
+ DevPathSerialScsi,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_FIBRECHANNEL_DP,\r
+ DevPathSerialFibre,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_1394_DP,\r
+ DevPathSerial1394,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_USB_DP,\r
+ DevPathSerialUsb,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_I2O_DP,\r
+ DevPathSerialI2O,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_MAC_ADDR_DP,\r
+ DevPathSerialMacAddr,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_IPv4_DP,\r
+ DevPathSerialIPv4,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_IPv6_DP,\r
+ DevPathSerialIPv6,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_INFINIBAND_DP,\r
+ DevPathSerialInfiniBand,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_UART_DP,\r
+ DevPathSerialUart,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ DevPathSerialVendor,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_DEVICE_LOGICAL_UNIT_DP,\r
+ DevPathSerialLun,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_SATA_DP,\r
+ DevPathSerialSata,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_ISCSI_DP,\r
+ DevPathSerialIScsi,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_HARDDRIVE_DP,\r
+ DevPathSerialHardDrive,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_CDROM_DP,\r
+ DevPathSerialCdRom,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_VENDOR_DP,\r
+ DevPathSerialVendor,\r
+ DevPathCompareDefault\r
+ },\r
+ {\r
+ 0,\r
+ 0,\r
+ NULL,\r
+ NULL\r
+ }\r
};\r
\r
/**\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
- VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *, DEVICE_CONSIST_MAPPING_INFO *);\r
-\r
- UINTN Index;\r
+ SERIAL_DECODE_FUNCTION SerialFun;\r
+ UINTN Index;\r
+ EFI_DEVICE_PATH_PROTOCOL *OriginalDevicePath;\r
\r
ASSERT(DevicePath != NULL);\r
ASSERT(MappingItem != NULL);\r
\r
SetMem (&MappingItem->Csd, sizeof (POOL_PRINT), 0);\r
+ OriginalDevicePath = DevicePath;\r
\r
while (!IsDevicePathEnd (DevicePath)) {\r
//\r
- // Find the handler to dump this device path node\r
+ // Find the handler to dump this device path node and\r
+ // initialize with generic function in case nothing is found\r
//\r
- SerialFun = NULL;\r
- for (Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {\r
+ for (SerialFun = DevPathSerialDefault, Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {\r
\r
if (DevicePathType (DevicePath) == DevPathConsistMappingTable[Index].Type &&\r
DevicePathSubType (DevicePath) == DevPathConsistMappingTable[Index].SubType\r
break;\r
}\r
}\r
- //\r
- // If not found, use a generic function\r
- //\r
- if (!SerialFun) {\r
- SerialFun = DevPathSerialDefault;\r
- }\r
\r
- SerialFun (DevicePath, MappingItem);\r
+ SerialFun (DevicePath, MappingItem, OriginalDevicePath);\r
\r
//\r
// Next device path node\r
OUT EFI_DEVICE_PATH_PROTOCOL ***Table\r
)\r
{\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN HandleNum;\r
- UINTN HandleLoop;\r
- EFI_DEVICE_PATH_PROTOCOL **TempTable;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *HIDevicePath;\r
- UINTN Index;\r
- EFI_STATUS Status;\r
+ EFI_HANDLE *HandleBuffer;\r
+ UINTN HandleNum;\r
+ UINTN HandleLoop;\r
+ EFI_DEVICE_PATH_PROTOCOL **TempTable;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *HIDevicePath;\r
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
\r
HandleBuffer = NULL;\r
\r
Status = gBS->LocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
+ ByProtocol,\r
+ &gEfiDevicePathProtocolGuid,\r
NULL,\r
&HandleNum,\r
&HandleBuffer\r
continue;\r
}\r
\r
+ Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], \r
+ &gEfiBlockIoProtocolGuid, \r
+ (VOID **)&BlockIo\r
+ );\r
+ if (EFI_ERROR(Status)) {\r
+ Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], \r
+ &gEfiSimpleFileSystemProtocolGuid, \r
+ (VOID **)&SimpleFileSystem\r
+ );\r
+ if (EFI_ERROR(Status)) {\r
+ continue;\r
+ }\r
+ }\r
+\r
for (Index = 0; TempTable[Index] != NULL; Index++) {\r
if (DevicePathCompare (&TempTable[Index], &HIDevicePath) == 0) {\r
FreePool (HIDevicePath);\r