Fix several bugs in DevicePathLib implementation regarding the device path node and text conversion.

Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14827 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Ruiyu Ni 2013-11-07 02:30:13 +00:00 committed by niruiyu
parent 09363ecafd
commit 9da3888456
2 changed files with 69 additions and 62 deletions

View File

@ -479,7 +479,7 @@ StrToIPv4Addr (
UINTN Index;
for (Index = 0; Index < 4; Index++) {
IPv4Addr->Addr[Index] = (UINT8) StrDecimalToUintn (SplitStr (Str, L'.'));
IPv4Addr->Addr[Index] = (UINT8) Strtoi (SplitStr (Str, L'.'));
}
}
@ -1055,8 +1055,8 @@ DevPathFromTextAcpiAdr (
**/
EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextAta (
IN CHAR16 *TextDeviceNode
)
IN CHAR16 *TextDeviceNode
)
{
CHAR16 *PrimarySecondaryStr;
CHAR16 *SlaveMasterStr;
@ -1073,8 +1073,21 @@ DevPathFromTextAta (
SlaveMasterStr = GetNextParamStr (&TextDeviceNode);
LunStr = GetNextParamStr (&TextDeviceNode);
Atapi->PrimarySecondary = (UINT8) ((StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? 0 : 1);
Atapi->SlaveMaster = (UINT8) ((StrCmp (SlaveMasterStr, L"Master") == 0) ? 0 : 1);
if (StrCmp (PrimarySecondaryStr, L"Primary") == 0) {
Atapi->PrimarySecondary = 0;
} else if (StrCmp (PrimarySecondaryStr, L"Secondary") == 0) {
Atapi->PrimarySecondary = 1;
} else {
Atapi->PrimarySecondary = (UINT8) Strtoi (PrimarySecondaryStr);
}
if (StrCmp (SlaveMasterStr, L"Master") == 0) {
Atapi->SlaveMaster = 0;
} else if (StrCmp (SlaveMasterStr, L"Slave") == 0) {
Atapi->SlaveMaster = 1;
} else {
Atapi->SlaveMaster = (UINT8) Strtoi (SlaveMasterStr);
}
Atapi->Lun = (UINT16) Strtoi (LunStr);
return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;
@ -1880,8 +1893,12 @@ DevPathFromTextUart (
(UINT16) sizeof (UART_DEVICE_PATH)
);
Uart->BaudRate = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : StrDecimalToUintn (BaudStr);
Uart->DataBits = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : StrDecimalToUintn (DataBitsStr));
if (StrCmp (BaudStr, L"DEFAULT") == 0) {
Uart->BaudRate = 115200;
} else {
Strtoi64 (BaudStr, &Uart->BaudRate);
}
Uart->DataBits = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));
switch (*ParityStr) {
case L'D':
Uart->Parity = 0;
@ -1908,7 +1925,8 @@ DevPathFromTextUart (
break;
default:
Uart->Parity = 0xff;
Uart->Parity = (UINT8) Strtoi (ParityStr);
break;
}
if (StrCmp (StopBitsStr, L"D") == 0) {
@ -1920,7 +1938,7 @@ DevPathFromTextUart (
} else if (StrCmp (StopBitsStr, L"2") == 0) {
Uart->StopBits = (UINT8) 3;
} else {
Uart->StopBits = 0xff;
Uart->StopBits = (UINT8) Strtoi (StopBitsStr);
}
return (EFI_DEVICE_PATH_PROTOCOL *) Uart;
@ -2351,21 +2369,30 @@ DevPathFromTextUsbWwid (
CHAR16 *InterfaceNumStr;
CHAR16 *SerialNumberStr;
USB_WWID_DEVICE_PATH *UsbWwid;
UINTN SerialNumberStrLen;
VIDStr = GetNextParamStr (&TextDeviceNode);
PIDStr = GetNextParamStr (&TextDeviceNode);
InterfaceNumStr = GetNextParamStr (&TextDeviceNode);
SerialNumberStr = GetNextParamStr (&TextDeviceNode);
SerialNumberStrLen = StrLen (SerialNumberStr);
if (SerialNumberStrLen >= 2 &&
SerialNumberStr[0] == L'\"' &&
SerialNumberStr[SerialNumberStrLen - 1] == L'\"'
) {
SerialNumberStr[SerialNumberStrLen - 1] = L'\0';
SerialNumberStr++;
SerialNumberStrLen -= 2;
}
UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (
MESSAGING_DEVICE_PATH,
MSG_USB_WWID_DP,
(UINT16) (sizeof (USB_WWID_DEVICE_PATH) + StrSize (SerialNumberStr))
(UINT16) (sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))
);
UsbWwid->VendorId = (UINT16) Strtoi (VIDStr);
UsbWwid->ProductId = (UINT16) Strtoi (PIDStr);
UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);
StrCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr);
StrnCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr, SerialNumberStrLen);
return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;
}
@ -2526,7 +2553,7 @@ DevPathFromTextHD (
(UINT16) sizeof (HARDDRIVE_DEVICE_PATH)
);
Hd->PartitionNumber = (UINT32) StrDecimalToUintn (PartitionStr);
Hd->PartitionNumber = (UINT32) Strtoi (PartitionStr);
ZeroMem (Hd->Signature, 16);
Hd->MBRType = (UINT8) 0;
@ -2596,7 +2623,7 @@ DevPathFromTextCDROM (
**/
EFI_DEVICE_PATH_PROTOCOL *
DevPathFromTextVenMEDIA (
DevPathFromTextVenMedia (
IN CHAR16 *TextDeviceNode
)
{
@ -2818,29 +2845,18 @@ DevPathFromTextSata (
CHAR16 *Param2;
CHAR16 *Param3;
//
// The PMPN is optional.
//
Param1 = GetNextParamStr (&TextDeviceNode);
Param2 = GetNextParamStr (&TextDeviceNode);
Param3 = NULL;
if (!IS_NULL (TextDeviceNode)) {
Param3 = GetNextParamStr (&TextDeviceNode);
}
Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (
MESSAGING_DEVICE_PATH,
MSG_SATA_DP,
(UINT16) sizeof (SATA_DEVICE_PATH)
);
Sata->HBAPortNumber = (UINT16) StrHexToUintn (Param1);
if (Param3 != NULL) {
Sata->PortMultiplierPortNumber = (UINT16) StrHexToUintn (Param2);
Param2 = Param3;
} else {
Sata->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;
}
Sata->Lun = (UINT16) StrHexToUintn (Param2);
Sata->HBAPortNumber = (UINT16) Strtoi (Param1);
Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);
Sata->Lun = (UINT16) Strtoi (Param3);
return (EFI_DEVICE_PATH_PROTOCOL *) Sata;
}
@ -2904,7 +2920,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
{L"Vlan", DevPathFromTextVlan },
{L"HD", DevPathFromTextHD },
{L"CDROM", DevPathFromTextCDROM },
{L"VenMEDIA", DevPathFromTextVenMEDIA },
{L"VenMedia", DevPathFromTextVenMedia },
{L"Media", DevPathFromTextMedia },
{L"Fv", DevPathFromTextFv },
{L"FvFile", DevPathFromTextFvFile },

View File

@ -990,14 +990,6 @@ DevPathToTextSata (
SATA_DEVICE_PATH *Sata;
Sata = DevPath;
if ((Sata->PortMultiplierPortNumber & SATA_HBA_DIRECT_CONNECT_FLAG) != 0) {
UefiDevicePathLibCatPrint (
Str,
L"Sata(0x%x,0x%x)",
Sata->HBAPortNumber,
Sata->Lun
);
} else {
UefiDevicePathLibCatPrint (
Str,
L"Sata(0x%x,0x%x,0x%x)",
@ -1005,7 +997,6 @@ DevPathToTextSata (
Sata->PortMultiplierPortNumber,
Sata->Lun
);
}
}
/**