]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
MdePkg: Refine the device path text format for Bluetooth to follow spec.
[mirror_edk2.git] / MdePkg / Library / UefiDevicePathLib / DevicePathFromText.c
index e3ab6e1e3da90bd485039963ff626d639fe20109..e5f6a1f0621ade9b4145fb82b14ce0d3062c9030 100644 (file)
@@ -793,6 +793,40 @@ DevPathFromTextCtrl (
   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
@@ -1840,6 +1874,34 @@ DevPathFromTextUfs (
   return (EFI_DEVICE_PATH_PROTOCOL *) Ufs;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to SD (Secure Digital) device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created SD device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSd (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *SlotNumberStr;\r
+  SD_DEVICE_PATH    *Sd;\r
+\r
+  SlotNumberStr = GetNextParamStr (&TextDeviceNode);\r
+  Sd            = (SD_DEVICE_PATH *) CreateDeviceNode (\r
+                                       MESSAGING_DEVICE_PATH,\r
+                                       MSG_SD_DP,\r
+                                       (UINT16) sizeof (SD_DEVICE_PATH)\r
+                                       );\r
+\r
+  Sd->SlotNumber = (UINT8) Strtoi (SlotNumberStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Sd;\r
+}\r
+\r
 /**\r
   Converts a text device path node to Debug Port device path structure.\r
 \r
@@ -2568,7 +2630,16 @@ DevPathFromTextUsbWwid (
   UsbWwid->VendorId        = (UINT16) Strtoi (VIDStr);\r
   UsbWwid->ProductId       = (UINT16) Strtoi (PIDStr);\r
   UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
-  StrnCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr, SerialNumberStrLen);\r
+\r
+  //\r
+  // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.\r
+  // Therefore, the '\0' will not be copied.\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH),\r
+    SerialNumberStr,\r
+    SerialNumberStrLen * sizeof (CHAR16)\r
+    );\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
 }\r
@@ -2724,23 +2795,54 @@ DevPathFromTextBluetooth (
                                    );\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
-    StrnCpy (TempNumBuffer, L"0x", TempBufferSize / sizeof (CHAR16));\r
-    StrnCat (TempNumBuffer + StrLen (L"0x"), Walker, TempBufferSize / sizeof (CHAR16) - StrLen (L"0x") );\r
+    StrCpyS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), L"0x");\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
   return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothDp;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to Wi-Fi device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Wi-Fi device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextWiFi (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *SSIdStr;\r
+  CHAR8                 *AsciiStr;\r
+  WIFI_DEVICE_PATH      *WiFiDp;\r
+\r
+  SSIdStr = GetNextParamStr (&TextDeviceNode);\r
+  WiFiDp  = (WIFI_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_WIFI_DP,\r
+                                   (UINT16) sizeof (WIFI_DEVICE_PATH)\r
+                                   );\r
+\r
+  AsciiStr = (CHAR8 *) WiFiDp->SSId;\r
+  StrToAscii (SSIdStr, &AsciiStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;\r
+}\r
+\r
 /**\r
   Converts a text device path node to URI device path structure.\r
 \r
@@ -2924,7 +3026,7 @@ DevPathFromTextFilePath (
                                     (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)\r
                                     );\r
 \r
-  StrCpy (File->PathName, TextDeviceNode);\r
+  StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
 }\r
@@ -3044,6 +3146,206 @@ DevPathFromTextRelativeOffsetRange (
   return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to text ram disk device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextRamDisk (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *TypeGuidStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+  TypeGuidStr     = GetNextParamStr (&TextDeviceNode);\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text virtual disk device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVirtualDisk (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text virtual cd device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVirtualCd (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text persistent virtual disk device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPersistentVirtualDisk (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text persistent virtual cd device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPersistentVirtualCd (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
 \r
 /**\r
   Converts a BBS text device path node to BBS device path structure.\r
@@ -3156,6 +3458,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {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
@@ -3188,6 +3491,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"SasEx",                   DevPathFromTextSasEx                   },\r
   {L"NVMe",                    DevPathFromTextNVMe                    },\r
   {L"UFS",                     DevPathFromTextUfs                     },\r
+  {L"SD",                      DevPathFromTextSd                      },\r
   {L"DebugPort",               DevPathFromTextDebugPort               },\r
   {L"MAC",                     DevPathFromTextMAC                     },\r
   {L"IPv4",                    DevPathFromTextIPv4                    },\r
@@ -3215,6 +3519,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"Vlan",                    DevPathFromTextVlan                    },\r
   {L"Uri",                     DevPathFromTextUri                     },\r
   {L"Bluetooth",               DevPathFromTextBluetooth               },\r
+  {L"WiFi",                    DevPathFromTextWiFi                    },\r
   {L"MediaPath",               DevPathFromTextMediaPath               },\r
   {L"HD",                      DevPathFromTextHD                      },\r
   {L"CDROM",                   DevPathFromTextCDROM                   },\r
@@ -3223,6 +3528,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"Fv",                      DevPathFromTextFv                      },\r
   {L"FvFile",                  DevPathFromTextFvFile                  },\r
   {L"Offset",                  DevPathFromTextRelativeOffsetRange     },\r
+  {L"RamDisk",                 DevPathFromTextRamDisk                 },\r
+  {L"VirtualDisk",             DevPathFromTextVirtualDisk             },\r
+  {L"VirtualCD",               DevPathFromTextVirtualCd               },\r
+  {L"PersistentVirtualDisk",   DevPathFromTextPersistentVirtualDisk   },\r
+  {L"PersistentVirtualCD",     DevPathFromTextPersistentVirtualCd     },\r
 \r
   {L"BbsPath",                 DevPathFromTextBbsPath                 },\r
   {L"BBS",                     DevPathFromTextBBS                     },\r