]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
Fix wrong parameter usage in GenericBdsLibConstructor
[mirror_edk2.git] / MdePkg / Library / UefiDevicePathLib / DevicePathToText.c
... / ...
CommitLineData
1/** @file\r
2 DevicePathToText protocol as defined in the UEFI 2.0 specification.\r
3\r
4Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiDevicePathLib.h"\r
16\r
17/**\r
18 Concatenates a formatted unicode string to allocated pool. The caller must\r
19 free the resulting buffer.\r
20\r
21 @param Str Tracks the allocated pool, size in use, and\r
22 amount of pool allocated.\r
23 @param Fmt The format string\r
24 @param ... Variable arguments based on the format string.\r
25\r
26 @return Allocated buffer with the formatted string printed in it.\r
27 The caller must free the allocated buffer. The buffer\r
28 allocation is not packed.\r
29\r
30**/\r
31CHAR16 *\r
32EFIAPI\r
33UefiDevicePathLibCatPrint (\r
34 IN OUT POOL_PRINT *Str,\r
35 IN CHAR16 *Fmt,\r
36 ...\r
37 )\r
38{\r
39 UINTN Count;\r
40 VA_LIST Args;\r
41\r
42 VA_START (Args, Fmt);\r
43 Count = SPrintLength (Fmt, Args);\r
44\r
45 if ((Str->Count + (Count + 1)) * sizeof (CHAR16) > Str->Capacity) {\r
46 Str->Capacity = (Str->Count + (Count + 1) * 2) * sizeof (CHAR16);\r
47 Str->Str = ReallocatePool (\r
48 Str->Count * sizeof (CHAR16),\r
49 Str->Capacity,\r
50 Str->Str\r
51 );\r
52 ASSERT (Str->Str != NULL);\r
53 }\r
54 UnicodeVSPrint (&Str->Str[Str->Count], Str->Capacity - Str->Count * sizeof (CHAR16), Fmt, Args);\r
55 Str->Count += Count;\r
56 \r
57 VA_END (Args);\r
58 return Str->Str;\r
59}\r
60\r
61/**\r
62 Converts a PCI device path structure to its string representative.\r
63\r
64 @param Str The string representative of input device.\r
65 @param DevPath The input device path structure.\r
66 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
67 of the display node is used, where applicable. If DisplayOnly\r
68 is FALSE, then the longer text representation of the display node\r
69 is used.\r
70 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
71 representation for a device node can be used, where applicable.\r
72\r
73**/\r
74VOID\r
75DevPathToTextPci (\r
76 IN OUT POOL_PRINT *Str,\r
77 IN VOID *DevPath,\r
78 IN BOOLEAN DisplayOnly,\r
79 IN BOOLEAN AllowShortcuts\r
80 )\r
81{\r
82 PCI_DEVICE_PATH *Pci;\r
83\r
84 Pci = DevPath;\r
85 UefiDevicePathLibCatPrint (Str, L"Pci(0x%x,0x%x)", Pci->Device, Pci->Function);\r
86}\r
87\r
88/**\r
89 Converts a PC Card device path structure to its string representative.\r
90\r
91 @param Str The string representative of input device.\r
92 @param DevPath The input device path structure.\r
93 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
94 of the display node is used, where applicable. If DisplayOnly\r
95 is FALSE, then the longer text representation of the display node\r
96 is used.\r
97 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
98 representation for a device node can be used, where applicable.\r
99\r
100**/\r
101VOID\r
102DevPathToTextPccard (\r
103 IN OUT POOL_PRINT *Str,\r
104 IN VOID *DevPath,\r
105 IN BOOLEAN DisplayOnly,\r
106 IN BOOLEAN AllowShortcuts\r
107 )\r
108{\r
109 PCCARD_DEVICE_PATH *Pccard;\r
110\r
111 Pccard = DevPath;\r
112 UefiDevicePathLibCatPrint (Str, L"PcCard(0x%x)", Pccard->FunctionNumber);\r
113}\r
114\r
115/**\r
116 Converts a Memory Map device path structure to its string representative.\r
117\r
118 @param Str The string representative of input device.\r
119 @param DevPath The input device path structure.\r
120 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
121 of the display node is used, where applicable. If DisplayOnly\r
122 is FALSE, then the longer text representation of the display node\r
123 is used.\r
124 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
125 representation for a device node can be used, where applicable.\r
126\r
127**/\r
128VOID\r
129DevPathToTextMemMap (\r
130 IN OUT POOL_PRINT *Str,\r
131 IN VOID *DevPath,\r
132 IN BOOLEAN DisplayOnly,\r
133 IN BOOLEAN AllowShortcuts\r
134 )\r
135{\r
136 MEMMAP_DEVICE_PATH *MemMap;\r
137\r
138 MemMap = DevPath;\r
139 UefiDevicePathLibCatPrint (\r
140 Str,\r
141 L"MemoryMapped(0x%x,0x%lx,0x%lx)",\r
142 MemMap->MemoryType,\r
143 MemMap->StartingAddress,\r
144 MemMap->EndingAddress\r
145 );\r
146}\r
147\r
148/**\r
149 Converts a Vendor device path structure to its string representative.\r
150\r
151 @param Str The string representative of input device.\r
152 @param DevPath The input device path structure.\r
153 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
154 of the display node is used, where applicable. If DisplayOnly\r
155 is FALSE, then the longer text representation of the display node\r
156 is used.\r
157 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
158 representation for a device node can be used, where applicable.\r
159\r
160**/\r
161VOID\r
162DevPathToTextVendor (\r
163 IN OUT POOL_PRINT *Str,\r
164 IN VOID *DevPath,\r
165 IN BOOLEAN DisplayOnly,\r
166 IN BOOLEAN AllowShortcuts\r
167 )\r
168{\r
169 VENDOR_DEVICE_PATH *Vendor;\r
170 CHAR16 *Type;\r
171 UINTN Index;\r
172 UINTN DataLength;\r
173 UINT32 FlowControlMap;\r
174 UINT16 Info;\r
175\r
176 Vendor = (VENDOR_DEVICE_PATH *) DevPath;\r
177 switch (DevicePathType (&Vendor->Header)) {\r
178 case HARDWARE_DEVICE_PATH:\r
179 Type = L"Hw";\r
180 break;\r
181\r
182 case MESSAGING_DEVICE_PATH:\r
183 Type = L"Msg";\r
184 if (AllowShortcuts) {\r
185 if (CompareGuid (&Vendor->Guid, &gEfiPcAnsiGuid)) {\r
186 UefiDevicePathLibCatPrint (Str, L"VenPcAnsi()");\r
187 return ;\r
188 } else if (CompareGuid (&Vendor->Guid, &gEfiVT100Guid)) {\r
189 UefiDevicePathLibCatPrint (Str, L"VenVt100()");\r
190 return ;\r
191 } else if (CompareGuid (&Vendor->Guid, &gEfiVT100PlusGuid)) {\r
192 UefiDevicePathLibCatPrint (Str, L"VenVt100Plus()");\r
193 return ;\r
194 } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) {\r
195 UefiDevicePathLibCatPrint (Str, L"VenUft8()");\r
196 return ;\r
197 } else if (CompareGuid (&Vendor->Guid, &gEfiUartDevicePathGuid)) {\r
198 FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *) Vendor)->FlowControlMap);\r
199 switch (FlowControlMap & 0x00000003) {\r
200 case 0:\r
201 UefiDevicePathLibCatPrint (Str, L"UartFlowCtrl(%s)", L"None");\r
202 break;\r
203\r
204 case 1:\r
205 UefiDevicePathLibCatPrint (Str, L"UartFlowCtrl(%s)", L"Hardware");\r
206 break;\r
207\r
208 case 2:\r
209 UefiDevicePathLibCatPrint (Str, L"UartFlowCtrl(%s)", L"XonXoff");\r
210 break;\r
211\r
212 default:\r
213 break;\r
214 }\r
215\r
216 return ;\r
217 } else if (CompareGuid (&Vendor->Guid, &gEfiSasDevicePathGuid)) {\r
218 UefiDevicePathLibCatPrint (\r
219 Str,\r
220 L"SAS(0x%lx,0x%lx,0x%x,",\r
221 ((SAS_DEVICE_PATH *) Vendor)->SasAddress,\r
222 ((SAS_DEVICE_PATH *) Vendor)->Lun,\r
223 ((SAS_DEVICE_PATH *) Vendor)->RelativeTargetPort\r
224 );\r
225 Info = (((SAS_DEVICE_PATH *) Vendor)->DeviceTopology);\r
226 if (((Info & 0x0f) == 0) && ((Info & BIT7) == 0)) {\r
227 UefiDevicePathLibCatPrint (Str, L"NoTopology,0,0,0,");\r
228 } else if (((Info & 0x0f) <= 2) && ((Info & BIT7) == 0)) {\r
229 UefiDevicePathLibCatPrint (\r
230 Str,\r
231 L"%s,%s,%s,",\r
232 ((Info & BIT4) != 0) ? L"SATA" : L"SAS",\r
233 ((Info & BIT5) != 0) ? L"External" : L"Internal",\r
234 ((Info & BIT6) != 0) ? L"Expanded" : L"Direct"\r
235 );\r
236 if ((Info & 0x0f) == 1) {\r
237 UefiDevicePathLibCatPrint (Str, L"0,");\r
238 } else {\r
239 //\r
240 // Value 0x0 thru 0xFF -> Drive 1 thru Drive 256\r
241 //\r
242 UefiDevicePathLibCatPrint (Str, L"0x%x,", ((Info >> 8) & 0xff) + 1);\r
243 }\r
244 } else {\r
245 UefiDevicePathLibCatPrint (Str, L"0x%x,0,0,0,", Info);\r
246 }\r
247\r
248 UefiDevicePathLibCatPrint (Str, L"0x%x)", ((SAS_DEVICE_PATH *) Vendor)->Reserved);\r
249 return ;\r
250 } else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) {\r
251 UefiDevicePathLibCatPrint (Str, L"DebugPort()");\r
252 return ;\r
253 }\r
254 }\r
255 break;\r
256\r
257 case MEDIA_DEVICE_PATH:\r
258 Type = L"Media";\r
259 break;\r
260\r
261 default:\r
262 Type = L"?";\r
263 break;\r
264 }\r
265\r
266 DataLength = DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH);\r
267 UefiDevicePathLibCatPrint (Str, L"Ven%s(%g", Type, &Vendor->Guid);\r
268 if (DataLength != 0) {\r
269 UefiDevicePathLibCatPrint (Str, L",");\r
270 for (Index = 0; Index < DataLength; Index++) {\r
271 UefiDevicePathLibCatPrint (Str, L"%02x", ((VENDOR_DEVICE_PATH_WITH_DATA *) Vendor)->VendorDefinedData[Index]);\r
272 }\r
273 }\r
274\r
275 UefiDevicePathLibCatPrint (Str, L")");\r
276}\r
277\r
278/**\r
279 Converts a Controller device path structure to its string representative.\r
280\r
281 @param Str The string representative of input device.\r
282 @param DevPath The input device path structure.\r
283 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
284 of the display node is used, where applicable. If DisplayOnly\r
285 is FALSE, then the longer text representation of the display node\r
286 is used.\r
287 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
288 representation for a device node can be used, where applicable.\r
289\r
290**/\r
291VOID\r
292DevPathToTextController (\r
293 IN OUT POOL_PRINT *Str,\r
294 IN VOID *DevPath,\r
295 IN BOOLEAN DisplayOnly,\r
296 IN BOOLEAN AllowShortcuts\r
297 )\r
298{\r
299 CONTROLLER_DEVICE_PATH *Controller;\r
300\r
301 Controller = DevPath;\r
302 UefiDevicePathLibCatPrint (\r
303 Str,\r
304 L"Ctrl(0x%x)",\r
305 Controller->ControllerNumber\r
306 );\r
307}\r
308\r
309/**\r
310 Converts a ACPI device path structure to its string representative.\r
311\r
312 @param Str The string representative of input device.\r
313 @param DevPath The input device path structure.\r
314 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
315 of the display node is used, where applicable. If DisplayOnly\r
316 is FALSE, then the longer text representation of the display node\r
317 is used.\r
318 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
319 representation for a device node can be used, where applicable.\r
320\r
321**/\r
322VOID\r
323DevPathToTextAcpi (\r
324 IN OUT POOL_PRINT *Str,\r
325 IN VOID *DevPath,\r
326 IN BOOLEAN DisplayOnly,\r
327 IN BOOLEAN AllowShortcuts\r
328 )\r
329{\r
330 ACPI_HID_DEVICE_PATH *Acpi;\r
331\r
332 Acpi = DevPath;\r
333 if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {\r
334 switch (EISA_ID_TO_NUM (Acpi->HID)) {\r
335 case 0x0a03:\r
336 UefiDevicePathLibCatPrint (Str, L"PciRoot(0x%x)", Acpi->UID);\r
337 break;\r
338\r
339 case 0x0a08:\r
340 UefiDevicePathLibCatPrint (Str, L"PcieRoot(0x%x)", Acpi->UID);\r
341 break;\r
342\r
343 case 0x0604:\r
344 UefiDevicePathLibCatPrint (Str, L"Floppy(0x%x)", Acpi->UID);\r
345 break;\r
346\r
347 case 0x0301:\r
348 UefiDevicePathLibCatPrint (Str, L"Keyboard(0x%x)", Acpi->UID);\r
349 break;\r
350\r
351 case 0x0501:\r
352 UefiDevicePathLibCatPrint (Str, L"Serial(0x%x)", Acpi->UID);\r
353 break;\r
354\r
355 case 0x0401:\r
356 UefiDevicePathLibCatPrint (Str, L"ParallelPort(0x%x)", Acpi->UID);\r
357 break;\r
358\r
359 default:\r
360 UefiDevicePathLibCatPrint (Str, L"Acpi(PNP%04x,0x%x)", EISA_ID_TO_NUM (Acpi->HID), Acpi->UID);\r
361 break;\r
362 }\r
363 } else {\r
364 UefiDevicePathLibCatPrint (Str, L"Acpi(0x%08x,0x%x)", Acpi->HID, Acpi->UID);\r
365 }\r
366}\r
367\r
368/**\r
369 Converts a ACPI extended HID device path structure to its string representative.\r
370\r
371 @param Str The string representative of input device.\r
372 @param DevPath The input device path structure.\r
373 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
374 of the display node is used, where applicable. If DisplayOnly\r
375 is FALSE, then the longer text representation of the display node\r
376 is used.\r
377 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
378 representation for a device node can be used, where applicable.\r
379\r
380**/\r
381VOID\r
382DevPathToTextAcpiEx (\r
383 IN OUT POOL_PRINT *Str,\r
384 IN VOID *DevPath,\r
385 IN BOOLEAN DisplayOnly,\r
386 IN BOOLEAN AllowShortcuts\r
387 )\r
388{\r
389 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
390 CHAR8 *HIDStr;\r
391 CHAR8 *UIDStr;\r
392 CHAR8 *CIDStr;\r
393 CHAR16 HIDText[11];\r
394 CHAR16 CIDText[11];\r
395\r
396 AcpiEx = DevPath;\r
397 HIDStr = (CHAR8 *) (((UINT8 *) AcpiEx) + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
398 UIDStr = HIDStr + AsciiStrLen (HIDStr) + 1;\r
399 CIDStr = UIDStr + AsciiStrLen (UIDStr) + 1;\r
400\r
401 //\r
402 // Converts EISA identification to string.\r
403 // \r
404 UnicodeSPrint (\r
405 HIDText,\r
406 sizeof (HIDText),\r
407 L"%c%c%c%04X",\r
408 ((AcpiEx->HID >> 10) & 0x1f) + 'A' - 1,\r
409 ((AcpiEx->HID >> 5) & 0x1f) + 'A' - 1,\r
410 ((AcpiEx->HID >> 0) & 0x1f) + 'A' - 1,\r
411 (AcpiEx->HID >> 16) & 0xFFFF\r
412 );\r
413 UnicodeSPrint (\r
414 CIDText,\r
415 sizeof (CIDText),\r
416 L"%c%c%c%04X",\r
417 ((AcpiEx->CID >> 10) & 0x1f) + 'A' - 1,\r
418 ((AcpiEx->CID >> 5) & 0x1f) + 'A' - 1,\r
419 ((AcpiEx->CID >> 0) & 0x1f) + 'A' - 1,\r
420 (AcpiEx->CID >> 16) & 0xFFFF\r
421 );\r
422\r
423 if ((*HIDStr == '\0') && (*CIDStr == '\0') && (AcpiEx->UID == 0)) {\r
424 //\r
425 // use AcpiExp()\r
426 //\r
427 UefiDevicePathLibCatPrint (\r
428 Str,\r
429 L"AcpiExp(%s,%s,%a)",\r
430 HIDText,\r
431 CIDText,\r
432 UIDStr\r
433 );\r
434 } else {\r
435 if (AllowShortcuts) {\r
436 //\r
437 // display only\r
438 //\r
439 if (AcpiEx->HID == 0) {\r
440 UefiDevicePathLibCatPrint (Str, L"AcpiEx(%a,", HIDStr);\r
441 } else {\r
442 UefiDevicePathLibCatPrint (Str, L"AcpiEx(%s,", HIDText);\r
443 }\r
444\r
445 if (AcpiEx->UID == 0) {\r
446 UefiDevicePathLibCatPrint (Str, L"%a,", UIDStr);\r
447 } else {\r
448 UefiDevicePathLibCatPrint (Str, L"0x%x,", AcpiEx->UID);\r
449 }\r
450\r
451 if (AcpiEx->CID == 0) {\r
452 UefiDevicePathLibCatPrint (Str, L"%a)", CIDStr);\r
453 } else {\r
454 UefiDevicePathLibCatPrint (Str, L"%s)", CIDText);\r
455 }\r
456 } else {\r
457 UefiDevicePathLibCatPrint (\r
458 Str,\r
459 L"AcpiEx(%s,%s,0x%x,%a,%a,%a)",\r
460 HIDText,\r
461 CIDText,\r
462 AcpiEx->UID,\r
463 HIDStr,\r
464 CIDStr,\r
465 UIDStr\r
466 );\r
467 }\r
468 }\r
469}\r
470\r
471/**\r
472 Converts a ACPI address device path structure to its string representative.\r
473\r
474 @param Str The string representative of input device.\r
475 @param DevPath The input device path structure.\r
476 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
477 of the display node is used, where applicable. If DisplayOnly\r
478 is FALSE, then the longer text representation of the display node\r
479 is used.\r
480 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
481 representation for a device node can be used, where applicable.\r
482\r
483**/\r
484VOID\r
485DevPathToTextAcpiAdr (\r
486 IN OUT POOL_PRINT *Str,\r
487 IN VOID *DevPath,\r
488 IN BOOLEAN DisplayOnly,\r
489 IN BOOLEAN AllowShortcuts\r
490 )\r
491{\r
492 ACPI_ADR_DEVICE_PATH *AcpiAdr;\r
493 UINT16 Index;\r
494 UINT16 Length;\r
495 UINT16 AdditionalAdrCount;\r
496\r
497 AcpiAdr = DevPath;\r
498 Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr);\r
499 AdditionalAdrCount = (UINT16) ((Length - 8) / 4);\r
500\r
501 UefiDevicePathLibCatPrint (Str, L"AcpiAdr(0x%x", AcpiAdr->ADR);\r
502 for (Index = 0; Index < AdditionalAdrCount; Index++) {\r
503 UefiDevicePathLibCatPrint (Str, L",0x%x", *(UINT32 *) ((UINT8 *) AcpiAdr + 8 + Index * 4));\r
504 }\r
505 UefiDevicePathLibCatPrint (Str, L")");\r
506}\r
507\r
508/**\r
509 Converts a ATAPI device path structure to its string representative.\r
510\r
511 @param Str The string representative of input device.\r
512 @param DevPath The input device path structure.\r
513 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
514 of the display node is used, where applicable. If DisplayOnly\r
515 is FALSE, then the longer text representation of the display node\r
516 is used.\r
517 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
518 representation for a device node can be used, where applicable.\r
519\r
520**/\r
521VOID\r
522DevPathToTextAtapi (\r
523 IN OUT POOL_PRINT *Str,\r
524 IN VOID *DevPath,\r
525 IN BOOLEAN DisplayOnly,\r
526 IN BOOLEAN AllowShortcuts\r
527 )\r
528{\r
529 ATAPI_DEVICE_PATH *Atapi;\r
530\r
531 Atapi = DevPath;\r
532\r
533 if (DisplayOnly) {\r
534 UefiDevicePathLibCatPrint (Str, L"Ata(0x%x)", Atapi->Lun);\r
535 } else {\r
536 UefiDevicePathLibCatPrint (\r
537 Str,\r
538 L"Ata(%s,%s,0x%x)",\r
539 (Atapi->PrimarySecondary == 1) ? L"Secondary" : L"Primary",\r
540 (Atapi->SlaveMaster == 1) ? L"Slave" : L"Master",\r
541 Atapi->Lun\r
542 );\r
543 }\r
544}\r
545\r
546/**\r
547 Converts a SCSI device path structure to its string representative.\r
548\r
549 @param Str The string representative of input device.\r
550 @param DevPath The input device path structure.\r
551 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
552 of the display node is used, where applicable. If DisplayOnly\r
553 is FALSE, then the longer text representation of the display node\r
554 is used.\r
555 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
556 representation for a device node can be used, where applicable.\r
557\r
558**/\r
559VOID\r
560DevPathToTextScsi (\r
561 IN OUT POOL_PRINT *Str,\r
562 IN VOID *DevPath,\r
563 IN BOOLEAN DisplayOnly,\r
564 IN BOOLEAN AllowShortcuts\r
565 )\r
566{\r
567 SCSI_DEVICE_PATH *Scsi;\r
568\r
569 Scsi = DevPath;\r
570 UefiDevicePathLibCatPrint (Str, L"Scsi(0x%x,0x%x)", Scsi->Pun, Scsi->Lun);\r
571}\r
572\r
573/**\r
574 Converts a Fibre device path structure to its string representative.\r
575\r
576 @param Str The string representative of input device.\r
577 @param DevPath The input device path structure.\r
578 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
579 of the display node is used, where applicable. If DisplayOnly\r
580 is FALSE, then the longer text representation of the display node\r
581 is used.\r
582 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
583 representation for a device node can be used, where applicable.\r
584\r
585**/\r
586VOID\r
587DevPathToTextFibre (\r
588 IN OUT POOL_PRINT *Str,\r
589 IN VOID *DevPath,\r
590 IN BOOLEAN DisplayOnly,\r
591 IN BOOLEAN AllowShortcuts\r
592 )\r
593{\r
594 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
595\r
596 Fibre = DevPath;\r
597 UefiDevicePathLibCatPrint (Str, L"Fibre(0x%lx,0x%lx)", Fibre->WWN, Fibre->Lun);\r
598}\r
599\r
600/**\r
601 Converts a FibreEx device path structure to its string representative.\r
602\r
603 @param Str The string representative of input device.\r
604 @param DevPath The input device path structure.\r
605 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
606 of the display node is used, where applicable. If DisplayOnly\r
607 is FALSE, then the longer text representation of the display node\r
608 is used.\r
609 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
610 representation for a device node can be used, where applicable.\r
611\r
612**/\r
613VOID\r
614DevPathToTextFibreEx (\r
615 IN OUT POOL_PRINT *Str,\r
616 IN VOID *DevPath,\r
617 IN BOOLEAN DisplayOnly,\r
618 IN BOOLEAN AllowShortcuts\r
619 )\r
620{\r
621 FIBRECHANNELEX_DEVICE_PATH *FibreEx;\r
622 UINTN Index;\r
623\r
624 FibreEx = DevPath;\r
625 UefiDevicePathLibCatPrint (Str, L"FibreEx(0x");\r
626 for (Index = 0; Index < sizeof (FibreEx->WWN) / sizeof (FibreEx->WWN[0]); Index++) {\r
627 UefiDevicePathLibCatPrint (Str, L"%02x", FibreEx->WWN[Index]);\r
628 }\r
629 UefiDevicePathLibCatPrint (Str, L",0x");\r
630 for (Index = 0; Index < sizeof (FibreEx->Lun) / sizeof (FibreEx->Lun[0]); Index++) {\r
631 UefiDevicePathLibCatPrint (Str, L"%02x", FibreEx->Lun[Index]);\r
632 }\r
633 UefiDevicePathLibCatPrint (Str, L")");\r
634}\r
635\r
636/**\r
637 Converts a Sas Ex device path structure to its string representative.\r
638\r
639 @param Str The string representative of input device.\r
640 @param DevPath The input device path structure.\r
641 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
642 of the display node is used, where applicable. If DisplayOnly\r
643 is FALSE, then the longer text representation of the display node\r
644 is used.\r
645 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
646 representation for a device node can be used, where applicable.\r
647\r
648**/\r
649VOID\r
650DevPathToTextSasEx (\r
651 IN OUT POOL_PRINT *Str,\r
652 IN VOID *DevPath,\r
653 IN BOOLEAN DisplayOnly,\r
654 IN BOOLEAN AllowShortcuts\r
655 )\r
656{\r
657 SASEX_DEVICE_PATH *SasEx;\r
658 UINTN Index;\r
659\r
660 SasEx = DevPath;\r
661 UefiDevicePathLibCatPrint (Str, L"SasEx(0x");\r
662\r
663 for (Index = 0; Index < sizeof (SasEx->SasAddress) / sizeof (SasEx->SasAddress[0]); Index++) {\r
664 UefiDevicePathLibCatPrint (Str, L"%02x", SasEx->SasAddress[Index]);\r
665 }\r
666 UefiDevicePathLibCatPrint (Str, L",0x");\r
667 for (Index = 0; Index < sizeof (SasEx->Lun) / sizeof (SasEx->Lun[0]); Index++) {\r
668 UefiDevicePathLibCatPrint (Str, L"%02x", SasEx->Lun[Index]);\r
669 }\r
670 UefiDevicePathLibCatPrint (Str, L",0x%x,", SasEx->RelativeTargetPort);\r
671\r
672 if (((SasEx->DeviceTopology & 0x0f) == 0) && ((SasEx->DeviceTopology & BIT7) == 0)) {\r
673 UefiDevicePathLibCatPrint (Str, L"NoTopology,0,0,0");\r
674 } else if (((SasEx->DeviceTopology & 0x0f) <= 2) && ((SasEx->DeviceTopology & BIT7) == 0)) {\r
675 UefiDevicePathLibCatPrint (\r
676 Str,\r
677 L"%s,%s,%s,",\r
678 ((SasEx->DeviceTopology & BIT4) != 0) ? L"SATA" : L"SAS",\r
679 ((SasEx->DeviceTopology & BIT5) != 0) ? L"External" : L"Internal",\r
680 ((SasEx->DeviceTopology & BIT6) != 0) ? L"Expanded" : L"Direct"\r
681 );\r
682 if ((SasEx->DeviceTopology & 0x0f) == 1) {\r
683 UefiDevicePathLibCatPrint (Str, L"0");\r
684 } else {\r
685 //\r
686 // Value 0x0 thru 0xFF -> Drive 1 thru Drive 256\r
687 //\r
688 UefiDevicePathLibCatPrint (Str, L"0x%x", ((SasEx->DeviceTopology >> 8) & 0xff) + 1);\r
689 }\r
690 } else {\r
691 UefiDevicePathLibCatPrint (Str, L"0x%x,0,0,0", SasEx->DeviceTopology);\r
692 }\r
693\r
694 UefiDevicePathLibCatPrint (Str, L")");\r
695 return ;\r
696\r
697}\r
698\r
699/**\r
700 Converts a 1394 device path structure to its string representative.\r
701\r
702 @param Str The string representative of input device.\r
703 @param DevPath The input device path structure.\r
704 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
705 of the display node is used, where applicable. If DisplayOnly\r
706 is FALSE, then the longer text representation of the display node\r
707 is used.\r
708 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
709 representation for a device node can be used, where applicable.\r
710\r
711**/\r
712VOID\r
713DevPathToText1394 (\r
714 IN OUT POOL_PRINT *Str,\r
715 IN VOID *DevPath,\r
716 IN BOOLEAN DisplayOnly,\r
717 IN BOOLEAN AllowShortcuts\r
718 )\r
719{\r
720 F1394_DEVICE_PATH *F1394DevPath;\r
721\r
722 F1394DevPath = DevPath;\r
723 //\r
724 // Guid has format of IEEE-EUI64\r
725 //\r
726 UefiDevicePathLibCatPrint (Str, L"I1394(%016lx)", F1394DevPath->Guid);\r
727}\r
728\r
729/**\r
730 Converts a USB device path structure to its string representative.\r
731\r
732 @param Str The string representative of input device.\r
733 @param DevPath The input device path structure.\r
734 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
735 of the display node is used, where applicable. If DisplayOnly\r
736 is FALSE, then the longer text representation of the display node\r
737 is used.\r
738 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
739 representation for a device node can be used, where applicable.\r
740\r
741**/\r
742VOID\r
743DevPathToTextUsb (\r
744 IN OUT POOL_PRINT *Str,\r
745 IN VOID *DevPath,\r
746 IN BOOLEAN DisplayOnly,\r
747 IN BOOLEAN AllowShortcuts\r
748 )\r
749{\r
750 USB_DEVICE_PATH *Usb;\r
751\r
752 Usb = DevPath;\r
753 UefiDevicePathLibCatPrint (Str, L"USB(0x%x,0x%x)", Usb->ParentPortNumber, Usb->InterfaceNumber);\r
754}\r
755\r
756/**\r
757 Converts a USB WWID device path structure to its string representative.\r
758\r
759 @param Str The string representative of input device.\r
760 @param DevPath The input device path structure.\r
761 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
762 of the display node is used, where applicable. If DisplayOnly\r
763 is FALSE, then the longer text representation of the display node\r
764 is used.\r
765 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
766 representation for a device node can be used, where applicable.\r
767\r
768**/\r
769VOID\r
770DevPathToTextUsbWWID (\r
771 IN OUT POOL_PRINT *Str,\r
772 IN VOID *DevPath,\r
773 IN BOOLEAN DisplayOnly,\r
774 IN BOOLEAN AllowShortcuts\r
775 )\r
776{\r
777 USB_WWID_DEVICE_PATH *UsbWWId;\r
778 CHAR16 *SerialNumberStr;\r
779 CHAR16 *NewStr;\r
780 UINT16 Length;\r
781\r
782 UsbWWId = DevPath;\r
783\r
784 SerialNumberStr = (CHAR16 *) ((UINT8 *) UsbWWId + sizeof (USB_WWID_DEVICE_PATH));\r
785 Length = (UINT16) ((DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) UsbWWId) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16));\r
786 if (SerialNumberStr [Length - 1] != 0) {\r
787 //\r
788 // In case no NULL terminator in SerialNumber, create a new one with NULL terminator\r
789 //\r
790 NewStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), SerialNumberStr);\r
791 ASSERT (NewStr != NULL);\r
792 NewStr [Length] = 0;\r
793 SerialNumberStr = NewStr;\r
794 }\r
795\r
796 UefiDevicePathLibCatPrint (\r
797 Str,\r
798 L"UsbWwid(0x%x,0x%x,0x%x,\"%s\")",\r
799 UsbWWId->VendorId,\r
800 UsbWWId->ProductId,\r
801 UsbWWId->InterfaceNumber,\r
802 SerialNumberStr\r
803 );\r
804}\r
805\r
806/**\r
807 Converts a Logic Unit device path structure to its string representative.\r
808\r
809 @param Str The string representative of input device.\r
810 @param DevPath The input device path structure.\r
811 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
812 of the display node is used, where applicable. If DisplayOnly\r
813 is FALSE, then the longer text representation of the display node\r
814 is used.\r
815 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
816 representation for a device node can be used, where applicable.\r
817\r
818**/\r
819VOID\r
820DevPathToTextLogicalUnit (\r
821 IN OUT POOL_PRINT *Str,\r
822 IN VOID *DevPath,\r
823 IN BOOLEAN DisplayOnly,\r
824 IN BOOLEAN AllowShortcuts\r
825 )\r
826{\r
827 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
828\r
829 LogicalUnit = DevPath;\r
830 UefiDevicePathLibCatPrint (Str, L"Unit(0x%x)", LogicalUnit->Lun);\r
831}\r
832\r
833/**\r
834 Converts a USB class device path structure to its string representative.\r
835\r
836 @param Str The string representative of input device.\r
837 @param DevPath The input device path structure.\r
838 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
839 of the display node is used, where applicable. If DisplayOnly\r
840 is FALSE, then the longer text representation of the display node\r
841 is used.\r
842 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
843 representation for a device node can be used, where applicable.\r
844\r
845**/\r
846VOID\r
847DevPathToTextUsbClass (\r
848 IN OUT POOL_PRINT *Str,\r
849 IN VOID *DevPath,\r
850 IN BOOLEAN DisplayOnly,\r
851 IN BOOLEAN AllowShortcuts\r
852 )\r
853{\r
854 USB_CLASS_DEVICE_PATH *UsbClass;\r
855 BOOLEAN IsKnownSubClass;\r
856\r
857\r
858 UsbClass = DevPath;\r
859\r
860 IsKnownSubClass = TRUE;\r
861 switch (UsbClass->DeviceClass) {\r
862 case USB_CLASS_AUDIO:\r
863 UefiDevicePathLibCatPrint (Str, L"UsbAudio");\r
864 break;\r
865\r
866 case USB_CLASS_CDCCONTROL:\r
867 UefiDevicePathLibCatPrint (Str, L"UsbCDCControl");\r
868 break;\r
869\r
870 case USB_CLASS_HID:\r
871 UefiDevicePathLibCatPrint (Str, L"UsbHID");\r
872 break;\r
873\r
874 case USB_CLASS_IMAGE:\r
875 UefiDevicePathLibCatPrint (Str, L"UsbImage");\r
876 break;\r
877\r
878 case USB_CLASS_PRINTER:\r
879 UefiDevicePathLibCatPrint (Str, L"UsbPrinter");\r
880 break;\r
881\r
882 case USB_CLASS_MASS_STORAGE:\r
883 UefiDevicePathLibCatPrint (Str, L"UsbMassStorage");\r
884 break;\r
885\r
886 case USB_CLASS_HUB:\r
887 UefiDevicePathLibCatPrint (Str, L"UsbHub");\r
888 break;\r
889\r
890 case USB_CLASS_CDCDATA:\r
891 UefiDevicePathLibCatPrint (Str, L"UsbCDCData");\r
892 break;\r
893\r
894 case USB_CLASS_SMART_CARD:\r
895 UefiDevicePathLibCatPrint (Str, L"UsbSmartCard");\r
896 break;\r
897\r
898 case USB_CLASS_VIDEO:\r
899 UefiDevicePathLibCatPrint (Str, L"UsbVideo");\r
900 break;\r
901\r
902 case USB_CLASS_DIAGNOSTIC:\r
903 UefiDevicePathLibCatPrint (Str, L"UsbDiagnostic");\r
904 break;\r
905\r
906 case USB_CLASS_WIRELESS:\r
907 UefiDevicePathLibCatPrint (Str, L"UsbWireless");\r
908 break;\r
909\r
910 default:\r
911 IsKnownSubClass = FALSE;\r
912 break;\r
913 }\r
914\r
915 if (IsKnownSubClass) {\r
916 UefiDevicePathLibCatPrint (\r
917 Str,\r
918 L"(0x%x,0x%x,0x%x,0x%x)",\r
919 UsbClass->VendorId,\r
920 UsbClass->ProductId,\r
921 UsbClass->DeviceSubClass,\r
922 UsbClass->DeviceProtocol\r
923 );\r
924 return;\r
925 }\r
926\r
927 if (UsbClass->DeviceClass == USB_CLASS_RESERVE) {\r
928 if (UsbClass->DeviceSubClass == USB_SUBCLASS_FW_UPDATE) {\r
929 UefiDevicePathLibCatPrint (\r
930 Str,\r
931 L"UsbDeviceFirmwareUpdate(0x%x,0x%x,0x%x)",\r
932 UsbClass->VendorId,\r
933 UsbClass->ProductId,\r
934 UsbClass->DeviceProtocol\r
935 );\r
936 return;\r
937 } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_IRDA_BRIDGE) {\r
938 UefiDevicePathLibCatPrint (\r
939 Str,\r
940 L"UsbIrdaBridge(0x%x,0x%x,0x%x)",\r
941 UsbClass->VendorId,\r
942 UsbClass->ProductId,\r
943 UsbClass->DeviceProtocol\r
944 );\r
945 return;\r
946 } else if (UsbClass->DeviceSubClass == USB_SUBCLASS_TEST) {\r
947 UefiDevicePathLibCatPrint (\r
948 Str,\r
949 L"UsbTestAndMeasurement(0x%x,0x%x,0x%x)",\r
950 UsbClass->VendorId,\r
951 UsbClass->ProductId,\r
952 UsbClass->DeviceProtocol\r
953 );\r
954 return;\r
955 }\r
956 }\r
957\r
958 UefiDevicePathLibCatPrint (\r
959 Str,\r
960 L"UsbClass(0x%x,0x%x,0x%x,0x%x,0x%x)",\r
961 UsbClass->VendorId,\r
962 UsbClass->ProductId,\r
963 UsbClass->DeviceClass,\r
964 UsbClass->DeviceSubClass,\r
965 UsbClass->DeviceProtocol\r
966 );\r
967}\r
968\r
969/**\r
970 Converts a SATA device path structure to its string representative.\r
971\r
972 @param Str The string representative of input device.\r
973 @param DevPath The input device path structure.\r
974 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
975 of the display node is used, where applicable. If DisplayOnly\r
976 is FALSE, then the longer text representation of the display node\r
977 is used.\r
978 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
979 representation for a device node can be used, where applicable.\r
980\r
981**/\r
982VOID\r
983DevPathToTextSata (\r
984 IN OUT POOL_PRINT *Str,\r
985 IN VOID *DevPath,\r
986 IN BOOLEAN DisplayOnly,\r
987 IN BOOLEAN AllowShortcuts\r
988 )\r
989{\r
990 SATA_DEVICE_PATH *Sata;\r
991\r
992 Sata = DevPath;\r
993 if ((Sata->PortMultiplierPortNumber & SATA_HBA_DIRECT_CONNECT_FLAG) != 0) {\r
994 UefiDevicePathLibCatPrint (\r
995 Str,\r
996 L"Sata(0x%x,0x%x)",\r
997 Sata->HBAPortNumber,\r
998 Sata->Lun\r
999 );\r
1000 } else {\r
1001 UefiDevicePathLibCatPrint (\r
1002 Str,\r
1003 L"Sata(0x%x,0x%x,0x%x)",\r
1004 Sata->HBAPortNumber,\r
1005 Sata->PortMultiplierPortNumber,\r
1006 Sata->Lun\r
1007 );\r
1008 }\r
1009}\r
1010\r
1011/**\r
1012 Converts a I20 device path structure to its string representative.\r
1013\r
1014 @param Str The string representative of input device.\r
1015 @param DevPath The input device path structure.\r
1016 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1017 of the display node is used, where applicable. If DisplayOnly\r
1018 is FALSE, then the longer text representation of the display node\r
1019 is used.\r
1020 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1021 representation for a device node can be used, where applicable.\r
1022\r
1023**/\r
1024VOID\r
1025DevPathToTextI2O (\r
1026 IN OUT POOL_PRINT *Str,\r
1027 IN VOID *DevPath,\r
1028 IN BOOLEAN DisplayOnly,\r
1029 IN BOOLEAN AllowShortcuts\r
1030 )\r
1031{\r
1032 I2O_DEVICE_PATH *I2ODevPath;\r
1033\r
1034 I2ODevPath = DevPath;\r
1035 UefiDevicePathLibCatPrint (Str, L"I2O(0x%x)", I2ODevPath->Tid);\r
1036}\r
1037\r
1038/**\r
1039 Converts a MAC address device path structure to its string representative.\r
1040\r
1041 @param Str The string representative of input device.\r
1042 @param DevPath The input device path structure.\r
1043 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1044 of the display node is used, where applicable. If DisplayOnly\r
1045 is FALSE, then the longer text representation of the display node\r
1046 is used.\r
1047 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1048 representation for a device node can be used, where applicable.\r
1049\r
1050**/\r
1051VOID\r
1052DevPathToTextMacAddr (\r
1053 IN OUT POOL_PRINT *Str,\r
1054 IN VOID *DevPath,\r
1055 IN BOOLEAN DisplayOnly,\r
1056 IN BOOLEAN AllowShortcuts\r
1057 )\r
1058{\r
1059 MAC_ADDR_DEVICE_PATH *MacDevPath;\r
1060 UINTN HwAddressSize;\r
1061 UINTN Index;\r
1062\r
1063 MacDevPath = DevPath;\r
1064\r
1065 HwAddressSize = sizeof (EFI_MAC_ADDRESS);\r
1066 if (MacDevPath->IfType == 0x01 || MacDevPath->IfType == 0x00) {\r
1067 HwAddressSize = 6;\r
1068 }\r
1069\r
1070 UefiDevicePathLibCatPrint (Str, L"MAC(");\r
1071\r
1072 for (Index = 0; Index < HwAddressSize; Index++) {\r
1073 UefiDevicePathLibCatPrint (Str, L"%02x", MacDevPath->MacAddress.Addr[Index]);\r
1074 }\r
1075\r
1076 UefiDevicePathLibCatPrint (Str, L",0x%x)", MacDevPath->IfType);\r
1077}\r
1078\r
1079/**\r
1080 Converts network protocol string to its text representation.\r
1081\r
1082 @param Str The string representative of input device.\r
1083 @param Protocol The network protocol ID.\r
1084\r
1085**/\r
1086VOID\r
1087CatNetworkProtocol (\r
1088 IN OUT POOL_PRINT *Str,\r
1089 IN UINT16 Protocol\r
1090 )\r
1091{\r
1092 if (Protocol == RFC_1700_TCP_PROTOCOL) {\r
1093 UefiDevicePathLibCatPrint (Str, L"TCP");\r
1094 } else if (Protocol == RFC_1700_UDP_PROTOCOL) {\r
1095 UefiDevicePathLibCatPrint (Str, L"UDP");\r
1096 } else {\r
1097 UefiDevicePathLibCatPrint (Str, L"0x%x", Protocol);\r
1098 }\r
1099}\r
1100\r
1101/**\r
1102 Converts IP v4 address to its text representation.\r
1103\r
1104 @param Str The string representative of input device.\r
1105 @param Address The IP v4 address.\r
1106**/\r
1107VOID\r
1108CatIPv4Address (\r
1109 IN OUT POOL_PRINT *Str,\r
1110 IN EFI_IPv4_ADDRESS *Address\r
1111 )\r
1112{\r
1113 UefiDevicePathLibCatPrint (Str, L"%d.%d.%d.%d", Address->Addr[0], Address->Addr[1], Address->Addr[2], Address->Addr[3]);\r
1114}\r
1115\r
1116/**\r
1117 Converts IP v6 address to its text representation.\r
1118\r
1119 @param Str The string representative of input device.\r
1120 @param Address The IP v6 address.\r
1121**/\r
1122VOID\r
1123CatIPv6Address (\r
1124 IN OUT POOL_PRINT *Str,\r
1125 IN EFI_IPv6_ADDRESS *Address\r
1126 )\r
1127{\r
1128 UefiDevicePathLibCatPrint (\r
1129 Str, L"%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",\r
1130 Address->Addr[0], Address->Addr[1],\r
1131 Address->Addr[2], Address->Addr[3],\r
1132 Address->Addr[4], Address->Addr[5],\r
1133 Address->Addr[6], Address->Addr[7],\r
1134 Address->Addr[8], Address->Addr[9],\r
1135 Address->Addr[10], Address->Addr[11],\r
1136 Address->Addr[12], Address->Addr[13],\r
1137 Address->Addr[14], Address->Addr[15]\r
1138 );\r
1139}\r
1140\r
1141/**\r
1142 Converts a IPv4 device path structure to its string representative.\r
1143\r
1144 @param Str The string representative of input device.\r
1145 @param DevPath The input device path structure.\r
1146 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1147 of the display node is used, where applicable. If DisplayOnly\r
1148 is FALSE, then the longer text representation of the display node\r
1149 is used.\r
1150 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1151 representation for a device node can be used, where applicable.\r
1152\r
1153**/\r
1154VOID\r
1155DevPathToTextIPv4 (\r
1156 IN OUT POOL_PRINT *Str,\r
1157 IN VOID *DevPath,\r
1158 IN BOOLEAN DisplayOnly,\r
1159 IN BOOLEAN AllowShortcuts\r
1160 )\r
1161{\r
1162 IPv4_DEVICE_PATH *IPDevPath;\r
1163\r
1164 IPDevPath = DevPath;\r
1165 UefiDevicePathLibCatPrint (Str, L"IPv4(");\r
1166 CatIPv4Address (Str, &IPDevPath->RemoteIpAddress);\r
1167\r
1168 if (DisplayOnly) {\r
1169 UefiDevicePathLibCatPrint (Str, L")");\r
1170 return ;\r
1171 }\r
1172\r
1173 UefiDevicePathLibCatPrint (Str, L",");\r
1174 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
1175\r
1176 UefiDevicePathLibCatPrint (Str, L",%s,", IPDevPath->StaticIpAddress ? L"Static" : L"DHCP");\r
1177 CatIPv4Address (Str, &IPDevPath->LocalIpAddress);\r
1178 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv4_DEVICE_PATH)) {\r
1179 UefiDevicePathLibCatPrint (Str, L",");\r
1180 CatIPv4Address (Str, &IPDevPath->GatewayIpAddress);\r
1181 UefiDevicePathLibCatPrint (Str, L",");\r
1182 CatIPv4Address (Str, &IPDevPath->SubnetMask);\r
1183 }\r
1184 UefiDevicePathLibCatPrint (Str, L")");\r
1185}\r
1186\r
1187/**\r
1188 Converts a IPv6 device path structure to its string representative.\r
1189\r
1190 @param Str The string representative of input device.\r
1191 @param DevPath The input device path structure.\r
1192 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1193 of the display node is used, where applicable. If DisplayOnly\r
1194 is FALSE, then the longer text representation of the display node\r
1195 is used.\r
1196 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1197 representation for a device node can be used, where applicable.\r
1198\r
1199**/\r
1200VOID\r
1201DevPathToTextIPv6 (\r
1202 IN OUT POOL_PRINT *Str,\r
1203 IN VOID *DevPath,\r
1204 IN BOOLEAN DisplayOnly,\r
1205 IN BOOLEAN AllowShortcuts\r
1206 )\r
1207{\r
1208 IPv6_DEVICE_PATH *IPDevPath;\r
1209\r
1210 IPDevPath = DevPath;\r
1211 UefiDevicePathLibCatPrint (Str, L"IPv6(");\r
1212 CatIPv6Address (Str, &IPDevPath->RemoteIpAddress);\r
1213 if (DisplayOnly) {\r
1214 UefiDevicePathLibCatPrint (Str, L")");\r
1215 return ;\r
1216 }\r
1217 \r
1218 UefiDevicePathLibCatPrint (Str, L",");\r
1219 CatNetworkProtocol (Str, IPDevPath->Protocol);\r
1220\r
1221 switch (IPDevPath->IpAddressOrigin) {\r
1222 case 0:\r
1223 UefiDevicePathLibCatPrint (Str, L",Static,");\r
1224 break;\r
1225 case 1:\r
1226 UefiDevicePathLibCatPrint (Str, L",StatelessAutoConfigure,");\r
1227 break;\r
1228 default:\r
1229 UefiDevicePathLibCatPrint (Str, L",StatefulAutoConfigure,");\r
1230 break;\r
1231 }\r
1232\r
1233 CatIPv6Address (Str, &IPDevPath->LocalIpAddress);\r
1234\r
1235 if (DevicePathNodeLength (IPDevPath) == sizeof (IPv6_DEVICE_PATH)) {\r
1236 UefiDevicePathLibCatPrint (Str, L",0x%x,", IPDevPath->PrefixLength);\r
1237 CatIPv6Address (Str, &IPDevPath->GatewayIpAddress);\r
1238 }\r
1239 UefiDevicePathLibCatPrint (Str, L")");\r
1240}\r
1241\r
1242/**\r
1243 Converts an Infini Band device path structure to its string representative.\r
1244\r
1245 @param Str The string representative of input device.\r
1246 @param DevPath The input device path structure.\r
1247 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1248 of the display node is used, where applicable. If DisplayOnly\r
1249 is FALSE, then the longer text representation of the display node\r
1250 is used.\r
1251 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1252 representation for a device node can be used, where applicable.\r
1253\r
1254**/\r
1255VOID\r
1256DevPathToTextInfiniBand (\r
1257 IN OUT POOL_PRINT *Str,\r
1258 IN VOID *DevPath,\r
1259 IN BOOLEAN DisplayOnly,\r
1260 IN BOOLEAN AllowShortcuts\r
1261 )\r
1262{\r
1263 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1264\r
1265 InfiniBand = DevPath;\r
1266 UefiDevicePathLibCatPrint (\r
1267 Str,\r
1268 L"Infiniband(0x%x,%g,0x%lx,0x%lx,0x%lx)",\r
1269 InfiniBand->ResourceFlags,\r
1270 InfiniBand->PortGid,\r
1271 InfiniBand->ServiceId,\r
1272 InfiniBand->TargetPortId,\r
1273 InfiniBand->DeviceId\r
1274 );\r
1275}\r
1276\r
1277/**\r
1278 Converts a UART device path structure to its string representative.\r
1279\r
1280 @param Str The string representative of input device.\r
1281 @param DevPath The input device path structure.\r
1282 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1283 of the display node is used, where applicable. If DisplayOnly\r
1284 is FALSE, then the longer text representation of the display node\r
1285 is used.\r
1286 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1287 representation for a device node can be used, where applicable.\r
1288\r
1289**/\r
1290VOID\r
1291DevPathToTextUart (\r
1292 IN OUT POOL_PRINT *Str,\r
1293 IN VOID *DevPath,\r
1294 IN BOOLEAN DisplayOnly,\r
1295 IN BOOLEAN AllowShortcuts\r
1296 )\r
1297{\r
1298 UART_DEVICE_PATH *Uart;\r
1299 CHAR8 Parity;\r
1300\r
1301 Uart = DevPath;\r
1302 switch (Uart->Parity) {\r
1303 case 0:\r
1304 Parity = 'D';\r
1305 break;\r
1306\r
1307 case 1:\r
1308 Parity = 'N';\r
1309 break;\r
1310\r
1311 case 2:\r
1312 Parity = 'E';\r
1313 break;\r
1314\r
1315 case 3:\r
1316 Parity = 'O';\r
1317 break;\r
1318\r
1319 case 4:\r
1320 Parity = 'M';\r
1321 break;\r
1322\r
1323 case 5:\r
1324 Parity = 'S';\r
1325 break;\r
1326\r
1327 default:\r
1328 Parity = 'x';\r
1329 break;\r
1330 }\r
1331\r
1332 if (Uart->BaudRate == 0) {\r
1333 UefiDevicePathLibCatPrint (Str, L"Uart(DEFAULT,");\r
1334 } else {\r
1335 UefiDevicePathLibCatPrint (Str, L"Uart(%ld,", Uart->BaudRate);\r
1336 }\r
1337\r
1338 if (Uart->DataBits == 0) {\r
1339 UefiDevicePathLibCatPrint (Str, L"DEFAULT,");\r
1340 } else {\r
1341 UefiDevicePathLibCatPrint (Str, L"%d,", Uart->DataBits);\r
1342 }\r
1343\r
1344 UefiDevicePathLibCatPrint (Str, L"%c,", Parity);\r
1345\r
1346 switch (Uart->StopBits) {\r
1347 case 0:\r
1348 UefiDevicePathLibCatPrint (Str, L"D)");\r
1349 break;\r
1350\r
1351 case 1:\r
1352 UefiDevicePathLibCatPrint (Str, L"1)");\r
1353 break;\r
1354\r
1355 case 2:\r
1356 UefiDevicePathLibCatPrint (Str, L"1.5)");\r
1357 break;\r
1358\r
1359 case 3:\r
1360 UefiDevicePathLibCatPrint (Str, L"2)");\r
1361 break;\r
1362\r
1363 default:\r
1364 UefiDevicePathLibCatPrint (Str, L"x)");\r
1365 break;\r
1366 }\r
1367}\r
1368\r
1369/**\r
1370 Converts an iSCSI device path structure to its string representative.\r
1371\r
1372 @param Str The string representative of input device.\r
1373 @param DevPath The input device path structure.\r
1374 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1375 of the display node is used, where applicable. If DisplayOnly\r
1376 is FALSE, then the longer text representation of the display node\r
1377 is used.\r
1378 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1379 representation for a device node can be used, where applicable.\r
1380\r
1381**/\r
1382VOID\r
1383DevPathToTextiSCSI (\r
1384 IN OUT POOL_PRINT *Str,\r
1385 IN VOID *DevPath,\r
1386 IN BOOLEAN DisplayOnly,\r
1387 IN BOOLEAN AllowShortcuts\r
1388 )\r
1389{\r
1390 ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
1391 UINT16 Options;\r
1392\r
1393 ISCSIDevPath = DevPath;\r
1394 UefiDevicePathLibCatPrint (\r
1395 Str,\r
1396 L"iSCSI(%a,0x%x,0x%lx,",\r
1397 ISCSIDevPath->TargetName,\r
1398 ISCSIDevPath->TargetPortalGroupTag,\r
1399 ISCSIDevPath->Lun\r
1400 );\r
1401\r
1402 Options = ISCSIDevPath->LoginOption;\r
1403 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
1404 UefiDevicePathLibCatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");\r
1405 if (((Options >> 11) & 0x0001) != 0) {\r
1406 UefiDevicePathLibCatPrint (Str, L"%s,", L"None");\r
1407 } else if (((Options >> 12) & 0x0001) != 0) {\r
1408 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_UNI");\r
1409 } else {\r
1410 UefiDevicePathLibCatPrint (Str, L"%s,", L"CHAP_BI");\r
1411\r
1412 }\r
1413\r
1414 UefiDevicePathLibCatPrint (Str, L"%s)", (ISCSIDevPath->NetworkProtocol == 0) ? L"TCP" : L"reserved");\r
1415}\r
1416\r
1417/**\r
1418 Converts a VLAN device path structure to its string representative.\r
1419\r
1420 @param Str The string representative of input device.\r
1421 @param DevPath The input device path structure.\r
1422 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1423 of the display node is used, where applicable. If DisplayOnly\r
1424 is FALSE, then the longer text representation of the display node\r
1425 is used.\r
1426 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1427 representation for a device node can be used, where applicable.\r
1428\r
1429**/\r
1430VOID\r
1431DevPathToTextVlan (\r
1432 IN OUT POOL_PRINT *Str,\r
1433 IN VOID *DevPath,\r
1434 IN BOOLEAN DisplayOnly,\r
1435 IN BOOLEAN AllowShortcuts\r
1436 )\r
1437{\r
1438 VLAN_DEVICE_PATH *Vlan;\r
1439\r
1440 Vlan = DevPath;\r
1441 UefiDevicePathLibCatPrint (Str, L"Vlan(%d)", Vlan->VlanId);\r
1442}\r
1443\r
1444/**\r
1445 Converts a Hard drive device path structure to its string representative.\r
1446\r
1447 @param Str The string representative of input device.\r
1448 @param DevPath The input device path structure.\r
1449 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1450 of the display node is used, where applicable. If DisplayOnly\r
1451 is FALSE, then the longer text representation of the display node\r
1452 is used.\r
1453 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1454 representation for a device node can be used, where applicable.\r
1455\r
1456**/\r
1457VOID\r
1458DevPathToTextHardDrive (\r
1459 IN OUT POOL_PRINT *Str,\r
1460 IN VOID *DevPath,\r
1461 IN BOOLEAN DisplayOnly,\r
1462 IN BOOLEAN AllowShortcuts\r
1463 )\r
1464{\r
1465 HARDDRIVE_DEVICE_PATH *Hd;\r
1466\r
1467 Hd = DevPath;\r
1468 switch (Hd->SignatureType) {\r
1469 case SIGNATURE_TYPE_MBR:\r
1470 UefiDevicePathLibCatPrint (\r
1471 Str,\r
1472 L"HD(%d,%s,0x%08x,",\r
1473 Hd->PartitionNumber,\r
1474 L"MBR",\r
1475 *((UINT32 *) (&(Hd->Signature[0])))\r
1476 );\r
1477 break;\r
1478\r
1479 case SIGNATURE_TYPE_GUID:\r
1480 UefiDevicePathLibCatPrint (\r
1481 Str,\r
1482 L"HD(%d,%s,%g,",\r
1483 Hd->PartitionNumber,\r
1484 L"GPT",\r
1485 (EFI_GUID *) &(Hd->Signature[0])\r
1486 );\r
1487 break;\r
1488\r
1489 default:\r
1490 UefiDevicePathLibCatPrint (\r
1491 Str,\r
1492 L"HD(%d,%d,0,",\r
1493 Hd->PartitionNumber,\r
1494 Hd->SignatureType\r
1495 );\r
1496 break;\r
1497 }\r
1498\r
1499 UefiDevicePathLibCatPrint (Str, L"0x%lx,0x%lx)", Hd->PartitionStart, Hd->PartitionSize);\r
1500}\r
1501\r
1502/**\r
1503 Converts a CDROM device path structure to its string representative.\r
1504\r
1505 @param Str The string representative of input device.\r
1506 @param DevPath The input device path structure.\r
1507 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1508 of the display node is used, where applicable. If DisplayOnly\r
1509 is FALSE, then the longer text representation of the display node\r
1510 is used.\r
1511 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1512 representation for a device node can be used, where applicable.\r
1513\r
1514**/\r
1515VOID\r
1516DevPathToTextCDROM (\r
1517 IN OUT POOL_PRINT *Str,\r
1518 IN VOID *DevPath,\r
1519 IN BOOLEAN DisplayOnly,\r
1520 IN BOOLEAN AllowShortcuts\r
1521 )\r
1522{\r
1523 CDROM_DEVICE_PATH *Cd;\r
1524\r
1525 Cd = DevPath;\r
1526 if (DisplayOnly) {\r
1527 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x)", Cd->BootEntry);\r
1528 return ;\r
1529 }\r
1530\r
1531 UefiDevicePathLibCatPrint (Str, L"CDROM(0x%x,0x%lx,0x%lx)", Cd->BootEntry, Cd->PartitionStart, Cd->PartitionSize);\r
1532}\r
1533\r
1534/**\r
1535 Converts a File device path structure to its string representative.\r
1536\r
1537 @param Str The string representative of input device.\r
1538 @param DevPath The input device path structure.\r
1539 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1540 of the display node is used, where applicable. If DisplayOnly\r
1541 is FALSE, then the longer text representation of the display node\r
1542 is used.\r
1543 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1544 representation for a device node can be used, where applicable.\r
1545\r
1546**/\r
1547VOID\r
1548DevPathToTextFilePath (\r
1549 IN OUT POOL_PRINT *Str,\r
1550 IN VOID *DevPath,\r
1551 IN BOOLEAN DisplayOnly,\r
1552 IN BOOLEAN AllowShortcuts\r
1553 )\r
1554{\r
1555 FILEPATH_DEVICE_PATH *Fp;\r
1556\r
1557 Fp = DevPath;\r
1558 UefiDevicePathLibCatPrint (Str, L"%s", Fp->PathName);\r
1559}\r
1560\r
1561/**\r
1562 Converts a Media protocol device path structure to its string representative.\r
1563\r
1564 @param Str The string representative of input device.\r
1565 @param DevPath The input device path structure.\r
1566 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1567 of the display node is used, where applicable. If DisplayOnly\r
1568 is FALSE, then the longer text representation of the display node\r
1569 is used.\r
1570 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1571 representation for a device node can be used, where applicable.\r
1572\r
1573**/\r
1574VOID\r
1575DevPathToTextMediaProtocol (\r
1576 IN OUT POOL_PRINT *Str,\r
1577 IN VOID *DevPath,\r
1578 IN BOOLEAN DisplayOnly,\r
1579 IN BOOLEAN AllowShortcuts\r
1580 )\r
1581{\r
1582 MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;\r
1583\r
1584 MediaProt = DevPath;\r
1585 UefiDevicePathLibCatPrint (Str, L"Media(%g)", &MediaProt->Protocol);\r
1586}\r
1587\r
1588/**\r
1589 Converts a Firmware Volume device path structure to its string representative.\r
1590\r
1591 @param Str The string representative of input device.\r
1592 @param DevPath The input device path structure.\r
1593 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1594 of the display node is used, where applicable. If DisplayOnly\r
1595 is FALSE, then the longer text representation of the display node\r
1596 is used.\r
1597 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1598 representation for a device node can be used, where applicable.\r
1599\r
1600**/\r
1601VOID\r
1602DevPathToTextFv (\r
1603 IN OUT POOL_PRINT *Str,\r
1604 IN VOID *DevPath,\r
1605 IN BOOLEAN DisplayOnly,\r
1606 IN BOOLEAN AllowShortcuts\r
1607 )\r
1608{\r
1609 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
1610\r
1611 Fv = DevPath;\r
1612 UefiDevicePathLibCatPrint (Str, L"Fv(%g)", &Fv->FvName);\r
1613}\r
1614\r
1615/**\r
1616 Converts a Firmware Volume File device path structure to its string representative.\r
1617\r
1618 @param Str The string representative of input device.\r
1619 @param DevPath The input device path structure.\r
1620 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1621 of the display node is used, where applicable. If DisplayOnly\r
1622 is FALSE, then the longer text representation of the display node\r
1623 is used.\r
1624 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1625 representation for a device node can be used, where applicable.\r
1626\r
1627**/\r
1628VOID\r
1629DevPathToTextFvFile (\r
1630 IN OUT POOL_PRINT *Str,\r
1631 IN VOID *DevPath,\r
1632 IN BOOLEAN DisplayOnly,\r
1633 IN BOOLEAN AllowShortcuts\r
1634 )\r
1635{\r
1636 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
1637\r
1638 FvFile = DevPath;\r
1639 UefiDevicePathLibCatPrint (Str, L"FvFile(%g)", &FvFile->FvFileName);\r
1640}\r
1641\r
1642/**\r
1643 Converts a Relative Offset device path structure to its string representative.\r
1644\r
1645 @param Str The string representative of input device.\r
1646 @param DevPath The input device path structure.\r
1647 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1648 of the display node is used, where applicable. If DisplayOnly\r
1649 is FALSE, then the longer text representation of the display node\r
1650 is used.\r
1651 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1652 representation for a device node can be used, where applicable.\r
1653\r
1654**/\r
1655VOID\r
1656DevPathRelativeOffsetRange (\r
1657 IN OUT POOL_PRINT *Str,\r
1658 IN VOID *DevPath,\r
1659 IN BOOLEAN DisplayOnly,\r
1660 IN BOOLEAN AllowShortcuts\r
1661 )\r
1662{\r
1663 MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
1664\r
1665 Offset = DevPath;\r
1666 UefiDevicePathLibCatPrint (\r
1667 Str,\r
1668 L"Offset(0x%lx,0x%lx)",\r
1669 Offset->StartingOffset,\r
1670 Offset->EndingOffset\r
1671 );\r
1672}\r
1673\r
1674/**\r
1675 Converts a BIOS Boot Specification device path structure to its string representative.\r
1676\r
1677 @param Str The string representative of input device.\r
1678 @param DevPath The input device path structure.\r
1679 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1680 of the display node is used, where applicable. If DisplayOnly\r
1681 is FALSE, then the longer text representation of the display node\r
1682 is used.\r
1683 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1684 representation for a device node can be used, where applicable.\r
1685\r
1686**/\r
1687VOID\r
1688DevPathToTextBBS (\r
1689 IN OUT POOL_PRINT *Str,\r
1690 IN VOID *DevPath,\r
1691 IN BOOLEAN DisplayOnly,\r
1692 IN BOOLEAN AllowShortcuts\r
1693 )\r
1694{\r
1695 BBS_BBS_DEVICE_PATH *Bbs;\r
1696 CHAR16 *Type;\r
1697\r
1698 Bbs = DevPath;\r
1699 switch (Bbs->DeviceType) {\r
1700 case BBS_TYPE_FLOPPY:\r
1701 Type = L"Floppy";\r
1702 break;\r
1703\r
1704 case BBS_TYPE_HARDDRIVE:\r
1705 Type = L"HD";\r
1706 break;\r
1707\r
1708 case BBS_TYPE_CDROM:\r
1709 Type = L"CDROM";\r
1710 break;\r
1711\r
1712 case BBS_TYPE_PCMCIA:\r
1713 Type = L"PCMCIA";\r
1714 break;\r
1715\r
1716 case BBS_TYPE_USB:\r
1717 Type = L"USB";\r
1718 break;\r
1719\r
1720 case BBS_TYPE_EMBEDDED_NETWORK:\r
1721 Type = L"Network";\r
1722 break;\r
1723\r
1724 default:\r
1725 Type = NULL;\r
1726 break;\r
1727 }\r
1728\r
1729 if (Type != NULL) {\r
1730 UefiDevicePathLibCatPrint (Str, L"BBS(%s,%a", Type, Bbs->String);\r
1731 } else {\r
1732 UefiDevicePathLibCatPrint (Str, L"BBS(0x%x,%a", Bbs->DeviceType, Bbs->String);\r
1733 }\r
1734\r
1735 if (DisplayOnly) {\r
1736 UefiDevicePathLibCatPrint (Str, L")");\r
1737 return ;\r
1738 }\r
1739\r
1740 UefiDevicePathLibCatPrint (Str, L",0x%x)", Bbs->StatusFlag);\r
1741}\r
1742\r
1743/**\r
1744 Converts an End-of-Device-Path structure to its string representative.\r
1745\r
1746 @param Str The string representative of input device.\r
1747 @param DevPath The input device path structure.\r
1748 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1749 of the display node is used, where applicable. If DisplayOnly\r
1750 is FALSE, then the longer text representation of the display node\r
1751 is used.\r
1752 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1753 representation for a device node can be used, where applicable.\r
1754\r
1755**/\r
1756VOID\r
1757DevPathToTextEndInstance (\r
1758 IN OUT POOL_PRINT *Str,\r
1759 IN VOID *DevPath,\r
1760 IN BOOLEAN DisplayOnly,\r
1761 IN BOOLEAN AllowShortcuts\r
1762 )\r
1763{\r
1764 UefiDevicePathLibCatPrint (Str, L",");\r
1765}\r
1766\r
1767/**\r
1768 Converts an unknown device path structure to its string representative.\r
1769\r
1770 @param Str The string representative of input device.\r
1771 @param DevPath The input device path structure.\r
1772 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1773 of the display node is used, where applicable. If DisplayOnly\r
1774 is FALSE, then the longer text representation of the display node\r
1775 is used.\r
1776 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1777 representation for a device node can be used, where applicable.\r
1778\r
1779**/\r
1780VOID\r
1781DevPathToTextNodeUnknown (\r
1782 IN OUT POOL_PRINT *Str,\r
1783 IN VOID *DevPath,\r
1784 IN BOOLEAN DisplayOnly,\r
1785 IN BOOLEAN AllowShortcuts\r
1786 )\r
1787{\r
1788 UefiDevicePathLibCatPrint (Str, L"?");\r
1789}\r
1790\r
1791GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLibDevPathToTextTable[] = {\r
1792 {HARDWARE_DEVICE_PATH, HW_PCI_DP, DevPathToTextPci },\r
1793 {HARDWARE_DEVICE_PATH, HW_PCCARD_DP, DevPathToTextPccard },\r
1794 {HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, DevPathToTextMemMap },\r
1795 {HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DevPathToTextVendor },\r
1796 {HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, DevPathToTextController },\r
1797 {ACPI_DEVICE_PATH, ACPI_DP, DevPathToTextAcpi },\r
1798 {ACPI_DEVICE_PATH, ACPI_EXTENDED_DP, DevPathToTextAcpiEx },\r
1799 {ACPI_DEVICE_PATH, ACPI_ADR_DP, DevPathToTextAcpiAdr },\r
1800 {MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, DevPathToTextAtapi },\r
1801 {MESSAGING_DEVICE_PATH, MSG_SCSI_DP, DevPathToTextScsi },\r
1802 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, DevPathToTextFibre },\r
1803 {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNELEX_DP, DevPathToTextFibreEx },\r
1804 {MESSAGING_DEVICE_PATH, MSG_SASEX_DP, DevPathToTextSasEx },\r
1805 {MESSAGING_DEVICE_PATH, MSG_1394_DP, DevPathToText1394 },\r
1806 {MESSAGING_DEVICE_PATH, MSG_USB_DP, DevPathToTextUsb },\r
1807 {MESSAGING_DEVICE_PATH, MSG_USB_WWID_DP, DevPathToTextUsbWWID },\r
1808 {MESSAGING_DEVICE_PATH, MSG_DEVICE_LOGICAL_UNIT_DP, DevPathToTextLogicalUnit },\r
1809 {MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, DevPathToTextUsbClass },\r
1810 {MESSAGING_DEVICE_PATH, MSG_SATA_DP, DevPathToTextSata },\r
1811 {MESSAGING_DEVICE_PATH, MSG_I2O_DP, DevPathToTextI2O },\r
1812 {MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, DevPathToTextMacAddr },\r
1813 {MESSAGING_DEVICE_PATH, MSG_IPv4_DP, DevPathToTextIPv4 },\r
1814 {MESSAGING_DEVICE_PATH, MSG_IPv6_DP, DevPathToTextIPv6 },\r
1815 {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, DevPathToTextInfiniBand },\r
1816 {MESSAGING_DEVICE_PATH, MSG_UART_DP, DevPathToTextUart },\r
1817 {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, DevPathToTextVendor },\r
1818 {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, DevPathToTextiSCSI },\r
1819 {MESSAGING_DEVICE_PATH, MSG_VLAN_DP, DevPathToTextVlan },\r
1820 {MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, DevPathToTextHardDrive },\r
1821 {MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, DevPathToTextCDROM },\r
1822 {MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, DevPathToTextVendor },\r
1823 {MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, DevPathToTextMediaProtocol },\r
1824 {MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath },\r
1825 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_VOL_DP, DevPathToTextFv },\r
1826 {MEDIA_DEVICE_PATH, MEDIA_PIWG_FW_FILE_DP, DevPathToTextFvFile },\r
1827 {MEDIA_DEVICE_PATH, MEDIA_RELATIVE_OFFSET_RANGE_DP, DevPathRelativeOffsetRange },\r
1828 {BBS_DEVICE_PATH, BBS_BBS_DP, DevPathToTextBBS },\r
1829 {END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, DevPathToTextEndInstance },\r
1830 {0, 0, NULL}\r
1831};\r
1832\r
1833/**\r
1834 Converts a device node to its string representation.\r
1835\r
1836 @param DeviceNode A Pointer to the device node to be converted.\r
1837 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1838 of the display node is used, where applicable. If DisplayOnly\r
1839 is FALSE, then the longer text representation of the display node\r
1840 is used.\r
1841 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1842 representation for a device node can be used, where applicable.\r
1843\r
1844 @return A pointer to the allocated text representation of the device node or NULL if DeviceNode\r
1845 is NULL or there was insufficient memory.\r
1846\r
1847**/\r
1848CHAR16 *\r
1849EFIAPI\r
1850UefiDevicePathLibConvertDeviceNodeToText (\r
1851 IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,\r
1852 IN BOOLEAN DisplayOnly,\r
1853 IN BOOLEAN AllowShortcuts\r
1854 )\r
1855{\r
1856 POOL_PRINT Str;\r
1857 UINTN Index;\r
1858 DEVICE_PATH_TO_TEXT ToText;\r
1859\r
1860 if (DeviceNode == NULL) {\r
1861 return NULL;\r
1862 }\r
1863\r
1864 ZeroMem (&Str, sizeof (Str));\r
1865\r
1866 //\r
1867 // Process the device path node\r
1868 // If not found, use a generic function\r
1869 //\r
1870 ToText = DevPathToTextNodeUnknown;\r
1871 for (Index = 0; mUefiDevicePathLibDevPathToTextTable[Index].Function != NULL; Index++) {\r
1872 if (DevicePathType (DeviceNode) == mUefiDevicePathLibDevPathToTextTable[Index].Type &&\r
1873 DevicePathSubType (DeviceNode) == mUefiDevicePathLibDevPathToTextTable[Index].SubType\r
1874 ) {\r
1875 ToText = mUefiDevicePathLibDevPathToTextTable[Index].Function;\r
1876 break;\r
1877 }\r
1878 }\r
1879\r
1880 //\r
1881 // Print this node\r
1882 //\r
1883 ToText (&Str, (VOID *) DeviceNode, DisplayOnly, AllowShortcuts);\r
1884\r
1885 ASSERT (Str.Str != NULL);\r
1886 return Str.Str;\r
1887}\r
1888\r
1889/**\r
1890 Converts a device path to its text representation.\r
1891\r
1892 @param DevicePath A Pointer to the device to be converted.\r
1893 @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation\r
1894 of the display node is used, where applicable. If DisplayOnly\r
1895 is FALSE, then the longer text representation of the display node\r
1896 is used.\r
1897 @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text\r
1898 representation for a device node can be used, where applicable.\r
1899\r
1900 @return A pointer to the allocated text representation of the device path or\r
1901 NULL if DeviceNode is NULL or there was insufficient memory.\r
1902\r
1903**/\r
1904CHAR16 *\r
1905EFIAPI\r
1906UefiDevicePathLibConvertDevicePathToText (\r
1907 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
1908 IN BOOLEAN DisplayOnly,\r
1909 IN BOOLEAN AllowShortcuts\r
1910 )\r
1911{\r
1912 POOL_PRINT Str;\r
1913 EFI_DEVICE_PATH_PROTOCOL *Node;\r
1914 EFI_DEVICE_PATH_PROTOCOL *AlignedNode;\r
1915 UINTN Index;\r
1916 DEVICE_PATH_TO_TEXT ToText;\r
1917\r
1918 if (DevicePath == NULL) {\r
1919 return NULL;\r
1920 }\r
1921\r
1922 ZeroMem (&Str, sizeof (Str));\r
1923\r
1924 //\r
1925 // Process each device path node\r
1926 //\r
1927 Node = (EFI_DEVICE_PATH_PROTOCOL *) DevicePath;\r
1928 while (!IsDevicePathEnd (Node)) {\r
1929 //\r
1930 // Find the handler to dump this device path node\r
1931 // If not found, use a generic function\r
1932 //\r
1933 ToText = DevPathToTextNodeUnknown;\r
1934 for (Index = 0; mUefiDevicePathLibDevPathToTextTable[Index].Function != NULL; Index += 1) {\r
1935\r
1936 if (DevicePathType (Node) == mUefiDevicePathLibDevPathToTextTable[Index].Type &&\r
1937 DevicePathSubType (Node) == mUefiDevicePathLibDevPathToTextTable[Index].SubType\r
1938 ) {\r
1939 ToText = mUefiDevicePathLibDevPathToTextTable[Index].Function;\r
1940 break;\r
1941 }\r
1942 }\r
1943 //\r
1944 // Put a path separator in if needed\r
1945 //\r
1946 if ((Str.Count != 0) && (ToText != DevPathToTextEndInstance)) {\r
1947 if (Str.Str[Str.Count] != L',') {\r
1948 UefiDevicePathLibCatPrint (&Str, L"/");\r
1949 }\r
1950 }\r
1951 \r
1952 AlignedNode = AllocateCopyPool (DevicePathNodeLength (Node), Node);\r
1953 //\r
1954 // Print this node of the device path\r
1955 //\r
1956 ToText (&Str, AlignedNode, DisplayOnly, AllowShortcuts);\r
1957 FreePool (AlignedNode);\r
1958 \r
1959 //\r
1960 // Next device path node\r
1961 //\r
1962 Node = NextDevicePathNode (Node);\r
1963 }\r
1964\r
1965 if (Str.Str == NULL) {\r
1966 return AllocateZeroPool (sizeof (CHAR16));\r
1967 } else {\r
1968 return Str.Str;\r
1969 }\r
1970}\r