/** @file\r
DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
\r
-Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2017, 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
}\r
}\r
\r
-/**\r
- Converts a list of string to a specified buffer.\r
-\r
- @param Buf The output buffer that contains the string.\r
- @param BufferLength The length of the buffer\r
- @param Str The input string that contains the hex number\r
-\r
- @retval EFI_SUCCESS The string was successfully converted to the buffer.\r
-\r
-**/\r
-EFI_STATUS\r
-StrToBuf (\r
- OUT UINT8 *Buf,\r
- IN UINTN BufferLength,\r
- IN CHAR16 *Str\r
- )\r
-{\r
- UINTN Index;\r
- UINTN StrLength;\r
- UINT8 Digit;\r
- UINT8 Byte;\r
-\r
- Digit = 0;\r
-\r
- //\r
- // Two hex char make up one byte\r
- //\r
- StrLength = BufferLength * sizeof (CHAR16);\r
-\r
- for(Index = 0; Index < StrLength; Index++, Str++) {\r
-\r
- if ((*Str >= L'a') && (*Str <= L'f')) {\r
- Digit = (UINT8) (*Str - L'a' + 0x0A);\r
- } else if ((*Str >= L'A') && (*Str <= L'F')) {\r
- Digit = (UINT8) (*Str - L'A' + 0x0A);\r
- } else if ((*Str >= L'0') && (*Str <= L'9')) {\r
- Digit = (UINT8) (*Str - L'0');\r
- } else {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // For odd characters, write the upper nibble for each buffer byte,\r
- // and for even characters, the lower nibble.\r
- //\r
- if ((Index & 1) == 0) {\r
- Byte = (UINT8) (Digit << 4);\r
- } else {\r
- Byte = Buf[Index / 2];\r
- Byte &= 0xF0;\r
- Byte = (UINT8) (Byte | Digit);\r
- }\r
-\r
- Buf[Index / 2] = Byte;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Converts a string to GUID value.\r
- Guid Format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r
-\r
- @param Str The registry format GUID string that contains the GUID value.\r
- @param Guid A pointer to the converted GUID value.\r
-\r
- @retval EFI_SUCCESS The GUID string was successfully converted to the GUID value.\r
- @retval EFI_UNSUPPORTED The input string is not in registry format.\r
- @return others Some error occurred when converting part of GUID value.\r
-\r
-**/\r
-EFI_STATUS\r
-StrToGuid (\r
- IN CHAR16 *Str,\r
- OUT EFI_GUID *Guid\r
- )\r
-{\r
- //\r
- // Get the first UINT32 data\r
- //\r
- Guid->Data1 = (UINT32) StrHexToUint64 (Str);\r
- while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
- Str ++;\r
- }\r
- \r
- if (IS_HYPHEN (*Str)) {\r
- Str++;\r
- } else {\r
- return EFI_UNSUPPORTED;\r
- }\r
- \r
- //\r
- // Get the second UINT16 data\r
- //\r
- Guid->Data2 = (UINT16) StrHexToUint64 (Str);\r
- while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
- Str ++;\r
- }\r
-\r
- if (IS_HYPHEN (*Str)) {\r
- Str++;\r
- } else {\r
- return EFI_UNSUPPORTED;\r
- }\r
- \r
- //\r
- // Get the third UINT16 data\r
- //\r
- Guid->Data3 = (UINT16) StrHexToUint64 (Str);\r
- while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
- Str ++;\r
- }\r
-\r
- if (IS_HYPHEN (*Str)) {\r
- Str++;\r
- } else {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- //\r
- // Get the following 8 bytes data\r
- // \r
- StrToBuf (&Guid->Data4[0], 2, Str);\r
- //\r
- // Skip 2 byte hex chars\r
- //\r
- Str += 2 * 2;\r
-\r
- if (IS_HYPHEN (*Str)) {\r
- Str++;\r
- } else {\r
- return EFI_UNSUPPORTED;\r
- }\r
- StrToBuf (&Guid->Data4[2], 6, Str);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Converts a string to IPv4 address\r
-\r
- @param Str A string representation of IPv4 address.\r
- @param IPv4Addr A pointer to the converted IPv4 address.\r
-\r
-**/\r
-VOID\r
-StrToIPv4Addr (\r
- IN OUT CHAR16 **Str,\r
- OUT EFI_IPv4_ADDRESS *IPv4Addr\r
- )\r
-{\r
- UINTN Index;\r
-\r
- for (Index = 0; Index < 4; Index++) {\r
- IPv4Addr->Addr[Index] = (UINT8) Strtoi (SplitStr (Str, L'.'));\r
- }\r
-}\r
-\r
-/**\r
- Converts a string to IPv4 address\r
-\r
- @param Str A string representation of IPv6 address.\r
- @param IPv6Addr A pointer to the converted IPv6 address.\r
-\r
-**/\r
-VOID\r
-StrToIPv6Addr (\r
- IN OUT CHAR16 **Str,\r
- OUT EFI_IPv6_ADDRESS *IPv6Addr\r
- )\r
-{\r
- UINTN Index;\r
- UINT16 Data;\r
-\r
- for (Index = 0; Index < 8; Index++) {\r
- Data = (UINT16) StrHexToUintn (SplitStr (Str, L':'));\r
- IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
- IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
- }\r
-}\r
-\r
/**\r
Converts a Unicode string to ASCII string.\r
\r
(UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)\r
);\r
\r
- if (DataLength != 0) {\r
- StrToBuf ((UINT8 *) (Node + 1), DataLength, DataStr);\r
- }\r
+ StrHexToBytes (DataStr, DataLength * 2, (UINT8 *) (Node + 1), DataLength);\r
return Node;\r
}\r
\r
);\r
\r
StrToGuid (GuidStr, &Vendor->Guid);\r
- StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
+ StrHexToBytes (DataStr, Length * 2, (UINT8 *) (Vendor + 1), Length);\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
}\r
return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
}\r
\r
+/**\r
+ Converts a text device path node to BMC device path structure.\r
+\r
+ @param TextDeviceNode The input Text device path node.\r
+\r
+ @return A pointer to the newly-created BMC device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBmc (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *InterfaceTypeStr;\r
+ CHAR16 *BaseAddressStr;\r
+ BMC_DEVICE_PATH *BmcDp;\r
+\r
+ InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);\r
+ BaseAddressStr = GetNextParamStr (&TextDeviceNode);\r
+ BmcDp = (BMC_DEVICE_PATH *) CreateDeviceNode (\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_BMC_DP,\r
+ (UINT16) sizeof (BMC_DEVICE_PATH)\r
+ );\r
+\r
+ BmcDp->InterfaceType = (UINT8) Strtoi (InterfaceTypeStr);\r
+ WriteUnaligned64 (\r
+ (UINT64 *) (&BmcDp->BaseAddress),\r
+ StrHexToUint64 (BaseAddressStr)\r
+ );\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) BmcDp;\r
+}\r
+\r
/**\r
Converts a generic ACPI text device path node to ACPI device path structure.\r
\r
CHAR16 *SidStr;\r
CHAR16 *TidStr;\r
CHAR16 *DidStr;\r
- EFI_GUID PortGid;\r
INFINIBAND_DEVICE_PATH *InfiniBand;\r
\r
FlagsStr = GetNextParamStr (&TextDeviceNode);\r
);\r
\r
InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
- StrToGuid (GuidStr, &PortGid);\r
- CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
+ StrToGuid (GuidStr, (EFI_GUID *) InfiniBand->PortGid);\r
Strtoi64 (SidStr, &InfiniBand->ServiceId);\r
Strtoi64 (TidStr, &InfiniBand->TargetPortId);\r
Strtoi64 (DidStr, &InfiniBand->DeviceId);\r
return (EFI_DEVICE_PATH_PROTOCOL *) Sd;\r
}\r
\r
+/**\r
+ Converts a text device path node to EMMC (Embedded MMC) device path structure.\r
+\r
+ @param TextDeviceNode The input Text device path node.\r
+\r
+ @return A pointer to the newly-created EMMC device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextEmmc (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *SlotNumberStr;\r
+ EMMC_DEVICE_PATH *Emmc;\r
+\r
+ SlotNumberStr = GetNextParamStr (&TextDeviceNode);\r
+ Emmc = (EMMC_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_EMMC_DP,\r
+ (UINT16) sizeof (EMMC_DEVICE_PATH)\r
+ );\r
+\r
+ Emmc->SlotNumber = (UINT8) Strtoi (SlotNumberStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Emmc;\r
+}\r
+\r
/**\r
Converts a text device path node to Debug Port device path structure.\r
\r
MACDevPath->IfType = (UINT8) Strtoi (IfTypeStr);\r
\r
Length = sizeof (EFI_MAC_ADDRESS);\r
- StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);\r
+ StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
}\r
(UINT16) sizeof (IPv4_DEVICE_PATH)\r
);\r
\r
- StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
+ StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);\r
IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
if (StrCmp (TypeStr, L"Static") == 0) {\r
IPv4->StaticIpAddress = TRUE;\r
IPv4->StaticIpAddress = FALSE;\r
}\r
\r
- StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
+ StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);\r
if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {\r
- StrToIPv4Addr (&GatewayIPStr, &IPv4->GatewayIpAddress);\r
- StrToIPv4Addr (&SubnetMaskStr, &IPv4->SubnetMask);\r
+ StrToIpv4Address (GatewayIPStr, NULL, &IPv4->GatewayIpAddress, NULL);\r
+ StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask, NULL);\r
} else {\r
ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));\r
ZeroMem (&IPv4->SubnetMask, sizeof (IPv4->SubnetMask));\r
(UINT16) sizeof (IPv6_DEVICE_PATH)\r
);\r
\r
- StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
+ StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);\r
IPv6->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
if (StrCmp (TypeStr, L"Static") == 0) {\r
IPv6->IpAddressOrigin = 0;\r
IPv6->IpAddressOrigin = 2;\r
}\r
\r
- StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
+ StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);\r
if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {\r
- StrToIPv6Addr (&GatewayIPStr, &IPv6->GatewayIpAddress);\r
+ StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);\r
IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);\r
} else {\r
ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));\r
);\r
\r
Index = sizeof (BLUETOOTH_ADDRESS) - 1;\r
- while (!IS_NULL(BluetoothStr) && Index >= 0) {\r
- Walker = SplitStr (&BluetoothStr, L':');\r
- TempBufferSize = StrSize (Walker) + StrLen (L"0x") * sizeof (CHAR16);\r
+ Walker = BluetoothStr;\r
+ while (!IS_NULL(*Walker) && Index >= 0) {\r
+ TempBufferSize = 2 * sizeof(CHAR16) + StrSize(L"0x");\r
TempNumBuffer = AllocateZeroPool (TempBufferSize);\r
if (TempNumBuffer == NULL) {\r
break;\r
}\r
StrCpyS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), L"0x");\r
- StrCatS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), Walker);\r
+ StrnCatS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), Walker, 2);\r
BluetoothDp->BD_ADDR.Address[Index] = (UINT8)Strtoi (TempNumBuffer);\r
FreePool (TempNumBuffer);\r
+ Walker += 2;\r
Index--;\r
}\r
\r
)\r
{\r
CHAR16 *SSIdStr;\r
- CHAR8 *AsciiStr;\r
+ CHAR8 AsciiStr[33];\r
+ UINTN DataLen;\r
WIFI_DEVICE_PATH *WiFiDp;\r
\r
SSIdStr = GetNextParamStr (&TextDeviceNode);\r
(UINT16) sizeof (WIFI_DEVICE_PATH)\r
);\r
\r
- AsciiStr = (CHAR8 *) WiFiDp->SSId;\r
- StrToAscii (SSIdStr, &AsciiStr);\r
+ if (NULL != SSIdStr) {\r
+ DataLen = StrLen (SSIdStr);\r
+ if (StrLen (SSIdStr) > 32) {\r
+ SSIdStr[32] = L'\0';\r
+ DataLen = 32;\r
+ }\r
+\r
+ UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));\r
+ CopyMem (WiFiDp->SSId, AsciiStr, DataLen);\r
+ }\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;\r
}\r
CHAR16 *StartStr;\r
CHAR16 *SizeStr;\r
UINT32 Signature32;\r
- EFI_GUID SignatureGuid;\r
HARDDRIVE_DEVICE_PATH *Hd;\r
\r
PartitionStr = GetNextParamStr (&TextDeviceNode);\r
Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
Hd->MBRType = 0x02;\r
\r
- StrToGuid (SignatureStr, &SignatureGuid);\r
- CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
+ StrToGuid (SignatureStr, (EFI_GUID *) Hd->Signature);\r
} else {\r
Hd->SignatureType = (UINT8) Strtoi (TypeStr);\r
}\r
{L"MemoryMapped", DevPathFromTextMemoryMapped },\r
{L"VenHw", DevPathFromTextVenHw },\r
{L"Ctrl", DevPathFromTextCtrl },\r
+ {L"BMC", DevPathFromTextBmc },\r
\r
{L"AcpiPath", DevPathFromTextAcpiPath },\r
{L"Acpi", DevPathFromTextAcpi },\r
{L"NVMe", DevPathFromTextNVMe },\r
{L"UFS", DevPathFromTextUfs },\r
{L"SD", DevPathFromTextSd },\r
+ {L"eMMC", DevPathFromTextEmmc },\r
{L"DebugPort", DevPathFromTextDebugPort },\r
{L"MAC", DevPathFromTextMAC },\r
{L"IPv4", DevPathFromTextIPv4 },\r
{L"Vlan", DevPathFromTextVlan },\r
{L"Uri", DevPathFromTextUri },\r
{L"Bluetooth", DevPathFromTextBluetooth },\r
- {L"WiFi", DevPathFromTextWiFi },\r
+ {L"Wi-Fi", DevPathFromTextWiFi },\r
{L"MediaPath", DevPathFromTextMediaPath },\r
{L"HD", DevPathFromTextHD },\r
{L"CDROM", DevPathFromTextCDROM },\r