]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Universal/DevicePathDxe/DevicePathFromText.c
Code scrub for the Debug library, PostCode library, Print library, and ExtractGuidedS...
[mirror_edk2.git] / MdeModulePkg / Universal / DevicePathDxe / DevicePathFromText.c
... / ...
CommitLineData
1/** @file\r
2 DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
3\r
4Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
5All rights reserved. This 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 "DevicePath.h"\r
16\r
17STATIC\r
18CHAR16 *\r
19StrDuplicate (\r
20 IN CONST CHAR16 *Src\r
21 )\r
22/*++\r
23\r
24 Routine Description:\r
25 Duplicate a string\r
26\r
27 Arguments:\r
28 Src - Source string\r
29\r
30 Returns:\r
31 Duplicated string\r
32\r
33--*/\r
34{\r
35 UINTN Length;\r
36 CHAR16 *ReturnStr;\r
37\r
38 Length = StrLen ((CHAR16 *) Src);\r
39\r
40 ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);\r
41\r
42 return ReturnStr;\r
43}\r
44\r
45STATIC\r
46CHAR16 *\r
47GetParamByNodeName (\r
48 IN CHAR16 *Str,\r
49 IN CHAR16 *NodeName\r
50 )\r
51/*++\r
52\r
53 Routine Description:\r
54 Get parameter in a pair of parentheses follow the given node name.\r
55 For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
56\r
57 Arguments:\r
58 Str - Device Path Text\r
59 NodeName - Name of the node\r
60\r
61 Returns:\r
62 Parameter text for the node\r
63\r
64--*/\r
65{\r
66 CHAR16 *ParamStr;\r
67 CHAR16 *StrPointer;\r
68 UINTN NodeNameLength;\r
69 UINTN ParameterLength;\r
70\r
71 //\r
72 // Check whether the node name matchs\r
73 //\r
74 NodeNameLength = StrLen (NodeName);\r
75 if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {\r
76 return NULL;\r
77 }\r
78\r
79 ParamStr = Str + NodeNameLength;\r
80 if (!IS_LEFT_PARENTH (*ParamStr)) {\r
81 return NULL;\r
82 }\r
83\r
84 //\r
85 // Skip the found '(' and find first occurrence of ')'\r
86 //\r
87 ParamStr++;\r
88 ParameterLength = 0;\r
89 StrPointer = ParamStr;\r
90 while (!IS_NULL (*StrPointer)) {\r
91 if (IS_RIGHT_PARENTH (*StrPointer)) {\r
92 break;\r
93 }\r
94 StrPointer++;\r
95 ParameterLength++;\r
96 }\r
97 if (IS_NULL (*StrPointer)) {\r
98 //\r
99 // ')' not found\r
100 //\r
101 return NULL;\r
102 }\r
103\r
104 ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);\r
105 if (ParamStr == NULL) {\r
106 return NULL;\r
107 }\r
108 //\r
109 // Terminate the parameter string\r
110 //\r
111 ParamStr[ParameterLength] = L'\0';\r
112\r
113 return ParamStr;\r
114}\r
115\r
116STATIC\r
117CHAR16 *\r
118SplitStr (\r
119 IN OUT CHAR16 **List,\r
120 IN CHAR16 Separator\r
121 )\r
122/*++\r
123\r
124 Routine Description:\r
125 Get current sub-string from a string list, before return\r
126 the list header is moved to next sub-string. The sub-string is separated\r
127 by the specified character. For example, the separator is ',', the string\r
128 list is "2,0,3", it returns "2", the remain list move to "0,3"\r
129\r
130 Arguments:\r
131 List - A string list separated by the specified separator\r
132 Separator - The separator character\r
133\r
134 Returns:\r
135 pointer - The current sub-string\r
136\r
137--*/\r
138{\r
139 CHAR16 *Str;\r
140 CHAR16 *ReturnStr;\r
141\r
142 Str = *List;\r
143 ReturnStr = Str;\r
144\r
145 if (IS_NULL (*Str)) {\r
146 return ReturnStr;\r
147 }\r
148\r
149 //\r
150 // Find first occurrence of the separator\r
151 //\r
152 while (!IS_NULL (*Str)) {\r
153 if (*Str == Separator) {\r
154 break;\r
155 }\r
156 Str++;\r
157 }\r
158\r
159 if (*Str == Separator) {\r
160 //\r
161 // Find a sub-string, terminate it\r
162 //\r
163 *Str = L'\0';\r
164 Str++;\r
165 }\r
166\r
167 //\r
168 // Move to next sub-string\r
169 //\r
170 *List = Str;\r
171\r
172 return ReturnStr;\r
173}\r
174\r
175STATIC\r
176CHAR16 *\r
177GetNextParamStr (\r
178 IN OUT CHAR16 **List\r
179 )\r
180{\r
181 //\r
182 // The separator is comma\r
183 //\r
184 return SplitStr (List, L',');\r
185}\r
186\r
187STATIC\r
188CHAR16 *\r
189GetNextDeviceNodeStr (\r
190 IN OUT CHAR16 **DevicePath,\r
191 OUT BOOLEAN *IsInstanceEnd\r
192 )\r
193/*++\r
194\r
195 Routine Description:\r
196 Get one device node from entire device path text.\r
197\r
198 Arguments:\r
199 Str - The entire device path text string\r
200 IsInstanceEnd - This node is the end of a device path instance\r
201\r
202 Returns:\r
203 a pointer - A device node text\r
204 NULL - No more device node available\r
205\r
206--*/\r
207{\r
208 CHAR16 *Str;\r
209 CHAR16 *ReturnStr;\r
210 UINTN ParenthesesStack;\r
211\r
212 Str = *DevicePath;\r
213 if (IS_NULL (*Str)) {\r
214 return NULL;\r
215 }\r
216\r
217 //\r
218 // Skip the leading '/', '(', ')' and ','\r
219 //\r
220 while (!IS_NULL (*Str)) {\r
221 if (!IS_SLASH (*Str) &&\r
222 !IS_COMMA (*Str) &&\r
223 !IS_LEFT_PARENTH (*Str) &&\r
224 !IS_RIGHT_PARENTH (*Str)) {\r
225 break;\r
226 }\r
227 Str++;\r
228 }\r
229\r
230 ReturnStr = Str;\r
231\r
232 //\r
233 // Scan for the separator of this device node, '/' or ','\r
234 //\r
235 ParenthesesStack = 0;\r
236 while (!IS_NULL (*Str)) {\r
237 if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {\r
238 break;\r
239 }\r
240\r
241 if (IS_LEFT_PARENTH (*Str)) {\r
242 ParenthesesStack++;\r
243 } else if (IS_RIGHT_PARENTH (*Str)) {\r
244 ParenthesesStack--;\r
245 }\r
246\r
247 Str++;\r
248 }\r
249\r
250 if (ParenthesesStack != 0) {\r
251 //\r
252 // The '(' doesn't pair with ')', invalid device path text\r
253 //\r
254 return NULL;\r
255 }\r
256\r
257 if (IS_COMMA (*Str)) {\r
258 *IsInstanceEnd = TRUE;\r
259 *Str = L'\0';\r
260 Str++;\r
261 } else {\r
262 *IsInstanceEnd = FALSE;\r
263 if (!IS_NULL (*Str)) {\r
264 *Str = L'\0';\r
265 Str++;\r
266 }\r
267 }\r
268\r
269 *DevicePath = Str;\r
270\r
271 return ReturnStr;\r
272}\r
273\r
274\r
275STATIC\r
276CHAR16 *\r
277TrimHexStr (\r
278 IN CHAR16 *Str,\r
279 OUT BOOLEAN *IsHex\r
280 )\r
281/*++\r
282\r
283 Routine Description:\r
284 Skip the leading white space and '0x' or '0X' of a integer string\r
285\r
286 Arguments:\r
287 Str - The integer string\r
288 IsHex - 1: Hex string, 0: Decimal string\r
289\r
290 Returns:\r
291\r
292--*/\r
293{\r
294 *IsHex = FALSE;\r
295\r
296 //\r
297 // skip preceeding white space\r
298 //\r
299 while (*Str && *Str == ' ') {\r
300 Str += 1;\r
301 }\r
302 //\r
303 // skip preceeding zeros\r
304 //\r
305 while (*Str && *Str == '0') {\r
306 Str += 1;\r
307 }\r
308 //\r
309 // skip preceeding character 'x' or 'X'\r
310 //\r
311 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
312 Str += 1;\r
313 *IsHex = TRUE;\r
314 }\r
315\r
316 return Str;\r
317}\r
318\r
319STATIC\r
320UINTN\r
321Xtoi (\r
322 IN CHAR16 *Str\r
323 )\r
324/*++\r
325\r
326Routine Description:\r
327\r
328 Convert hex string to uint\r
329\r
330Arguments:\r
331\r
332 Str - The string\r
333 \r
334Returns:\r
335\r
336--*/\r
337{\r
338 UINTN Rvalue;\r
339 UINTN Length;\r
340\r
341 ASSERT (Str != NULL);\r
342\r
343 //\r
344 // convert hex digits\r
345 //\r
346 Rvalue = 0;\r
347 Length = sizeof (UINTN);\r
348 HexStringToBuf ((UINT8 *) &Rvalue, &Length, Str, NULL);\r
349\r
350 return Rvalue;\r
351}\r
352\r
353STATIC\r
354VOID\r
355Xtoi64 (\r
356 IN CHAR16 *Str,\r
357 IN UINT64 *Data\r
358 )\r
359/*++\r
360\r
361Routine Description:\r
362\r
363 Convert hex string to 64 bit data.\r
364\r
365Arguments:\r
366\r
367 Str - The string\r
368 \r
369Returns:\r
370\r
371--*/\r
372{\r
373 UINTN Length;\r
374\r
375 *Data = 0;\r
376 Length = sizeof (UINT64);\r
377 HexStringToBuf ((UINT8 *) Data, &Length, Str, NULL);\r
378}\r
379\r
380STATIC\r
381UINTN\r
382Dtoi (\r
383 IN CHAR16 *str\r
384 )\r
385/*++\r
386\r
387Routine Description:\r
388\r
389 Convert decimal string to uint\r
390\r
391Arguments:\r
392\r
393 Str - The string\r
394 \r
395Returns:\r
396\r
397--*/\r
398{\r
399 UINTN Rvalue;\r
400 CHAR16 Char;\r
401 UINTN High;\r
402 UINTN Low;\r
403\r
404 ASSERT (str != NULL);\r
405\r
406 High = (UINTN) -1 / 10;\r
407 Low = (UINTN) -1 % 10;\r
408 //\r
409 // skip preceeding white space\r
410 //\r
411 while (*str && *str == ' ') {\r
412 str += 1;\r
413 }\r
414 //\r
415 // convert digits\r
416 //\r
417 Rvalue = 0;\r
418 Char = *(str++);\r
419 while (Char) {\r
420 if (Char >= '0' && Char <= '9') {\r
421 if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {\r
422 return (UINTN) -1;\r
423 }\r
424\r
425 Rvalue = (Rvalue * 10) + Char - '0';\r
426 } else {\r
427 break;\r
428 }\r
429\r
430 Char = *(str++);\r
431 }\r
432\r
433 return Rvalue;\r
434}\r
435\r
436STATIC\r
437VOID\r
438Dtoi64 (\r
439 IN CHAR16 *str,\r
440 OUT UINT64 *Data\r
441 )\r
442/*++\r
443\r
444Routine Description:\r
445\r
446 Convert decimal string to uint\r
447\r
448Arguments:\r
449\r
450 Str - The string\r
451\r
452Returns:\r
453\r
454--*/\r
455{\r
456 UINT64 Rvalue;\r
457 CHAR16 Char;\r
458 UINT64 High;\r
459 UINT64 Low;\r
460\r
461 ASSERT (str != NULL);\r
462 ASSERT (Data != NULL);\r
463\r
464 //\r
465 // skip preceeding white space\r
466 //\r
467 while (*str && *str == ' ') {\r
468 str += 1;\r
469 }\r
470 //\r
471 // convert digits\r
472 //\r
473 Rvalue = 0;\r
474 Char = *(str++);\r
475 while (Char) {\r
476 if (Char >= '0' && Char <= '9') {\r
477 High = LShiftU64 (Rvalue, 3);\r
478 Low = LShiftU64 (Rvalue, 1);\r
479 Rvalue = High + Low + Char - '0';\r
480 } else {\r
481 break;\r
482 }\r
483\r
484 Char = *(str++);\r
485 }\r
486\r
487 *Data = Rvalue;\r
488}\r
489\r
490STATIC\r
491UINTN\r
492Strtoi (\r
493 IN CHAR16 *Str\r
494 )\r
495/*++\r
496\r
497Routine Description:\r
498\r
499 Convert integer string to uint.\r
500\r
501Arguments:\r
502\r
503 Str - The integer string. If leading with "0x" or "0X", it's heximal.\r
504\r
505Returns:\r
506\r
507--*/\r
508{\r
509 BOOLEAN IsHex;\r
510\r
511 Str = TrimHexStr (Str, &IsHex);\r
512\r
513 if (IsHex) {\r
514 return Xtoi (Str);\r
515 } else {\r
516 return Dtoi (Str);\r
517 }\r
518}\r
519\r
520STATIC\r
521VOID\r
522Strtoi64 (\r
523 IN CHAR16 *Str,\r
524 IN UINT64 *Data\r
525 )\r
526/*++\r
527\r
528Routine Description:\r
529\r
530 Convert integer string to 64 bit data.\r
531\r
532Arguments:\r
533\r
534 Str - The integer string. If leading with "0x" or "0X", it's heximal.\r
535\r
536Returns:\r
537\r
538--*/\r
539{\r
540 BOOLEAN IsHex;\r
541\r
542 Str = TrimHexStr (Str, &IsHex);\r
543\r
544 if (IsHex) {\r
545 Xtoi64 (Str, Data);\r
546 } else {\r
547 Dtoi64 (Str, Data);\r
548 }\r
549}\r
550\r
551STATIC\r
552EFI_STATUS \r
553StrToBuf (\r
554 OUT UINT8 *Buf,\r
555 IN UINTN BufferLength,\r
556 IN CHAR16 *Str\r
557 )\r
558{\r
559 UINTN Index;\r
560 UINTN StrLength;\r
561 UINT8 Digit;\r
562 UINT8 Byte;\r
563\r
564 Digit = 0;\r
565\r
566 //\r
567 // Two hex char make up one byte\r
568 //\r
569 StrLength = BufferLength * sizeof (CHAR16);\r
570\r
571 for(Index = 0; Index < StrLength; Index++, Str++) {\r
572\r
573 IsHexDigit (&Digit, *Str);\r
574\r
575 //\r
576 // For odd charaters, write the upper nibble for each buffer byte,\r
577 // and for even characters, the lower nibble.\r
578 //\r
579 if ((Index & 1) == 0) {\r
580 Byte = (UINT8) (Digit << 4);\r
581 } else {\r
582 Byte = Buf[Index / 2];\r
583 Byte &= 0xF0;\r
584 Byte = (UINT8) (Byte | Digit);\r
585 }\r
586\r
587 Buf[Index / 2] = Byte;\r
588 }\r
589\r
590 return EFI_SUCCESS;\r
591}\r
592\r
593STATIC\r
594EFI_STATUS\r
595StrToGuid (\r
596 IN CHAR16 *Str,\r
597 OUT EFI_GUID *Guid\r
598 )\r
599{\r
600 UINTN BufferLength;\r
601 UINTN ConvertedStrLen;\r
602 EFI_STATUS Status;\r
603\r
604 BufferLength = sizeof (Guid->Data1);\r
605 Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);\r
606 if (EFI_ERROR (Status)) {\r
607 return Status;\r
608 }\r
609 Str += ConvertedStrLen;\r
610 if (IS_HYPHEN (*Str)) {\r
611 Str++; \r
612 } else {\r
613 return EFI_UNSUPPORTED;\r
614 }\r
615\r
616 BufferLength = sizeof (Guid->Data2);\r
617 Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);\r
618 if (EFI_ERROR (Status)) {\r
619 return Status;\r
620 }\r
621 Str += ConvertedStrLen;\r
622 if (IS_HYPHEN (*Str)) {\r
623 Str++;\r
624 } else {\r
625 return EFI_UNSUPPORTED;\r
626 }\r
627\r
628 BufferLength = sizeof (Guid->Data3);\r
629 Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);\r
630 if (EFI_ERROR (Status)) {\r
631 return Status;\r
632 }\r
633 Str += ConvertedStrLen;\r
634 if (IS_HYPHEN (*Str)) {\r
635 Str++;\r
636 } else {\r
637 return EFI_UNSUPPORTED;\r
638 }\r
639\r
640 StrToBuf (&Guid->Data4[0], 2, Str);\r
641 //\r
642 // Skip 2 byte hex chars\r
643 //\r
644 Str += 2 * 2;\r
645\r
646 if (IS_HYPHEN (*Str)) {\r
647 Str++;\r
648 } else {\r
649 return EFI_UNSUPPORTED;\r
650 }\r
651 StrToBuf (&Guid->Data4[2], 6, Str);\r
652\r
653 return EFI_SUCCESS;\r
654}\r
655\r
656STATIC\r
657VOID\r
658StrToIPv4Addr (\r
659 IN OUT CHAR16 **Str,\r
660 OUT EFI_IPv4_ADDRESS *IPv4Addr\r
661 )\r
662{\r
663 UINTN Index;\r
664\r
665 for (Index = 0; Index < 4; Index++) {\r
666 IPv4Addr->Addr[Index] = (UINT8) Dtoi (SplitStr (Str, L'.'));\r
667 }\r
668}\r
669\r
670STATIC\r
671VOID\r
672StrToIPv6Addr (\r
673 IN OUT CHAR16 **Str,\r
674 OUT EFI_IPv6_ADDRESS *IPv6Addr\r
675 )\r
676{\r
677 UINTN Index;\r
678 UINT16 Data;\r
679\r
680 for (Index = 0; Index < 8; Index++) {\r
681 Data = (UINT16) Xtoi (SplitStr (Str, L':'));\r
682 IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
683 IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
684 }\r
685}\r
686\r
687STATIC\r
688VOID\r
689StrToAscii (\r
690 IN CHAR16 *Str,\r
691 IN OUT CHAR8 **AsciiStr\r
692 )\r
693{\r
694 CHAR8 *Dest;\r
695\r
696 Dest = *AsciiStr;\r
697 while (!IS_NULL (*Str)) {\r
698 *(Dest++) = (CHAR8) *(Str++);\r
699 }\r
700 *Dest = 0;\r
701\r
702 //\r
703 // Return the string next to it\r
704 //\r
705 *AsciiStr = Dest + 1;\r
706}\r
707\r
708STATIC\r
709EFI_DEVICE_PATH_PROTOCOL *\r
710DevPathFromTextPci (\r
711 IN CHAR16 *TextDeviceNode\r
712 )\r
713{\r
714 CHAR16 *FunctionStr;\r
715 CHAR16 *DeviceStr;\r
716 PCI_DEVICE_PATH *Pci;\r
717\r
718 DeviceStr = GetNextParamStr (&TextDeviceNode);\r
719 FunctionStr = GetNextParamStr (&TextDeviceNode);\r
720 Pci = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
721 HARDWARE_DEVICE_PATH,\r
722 HW_PCI_DP,\r
723 sizeof (PCI_DEVICE_PATH)\r
724 );\r
725\r
726 Pci->Function = (UINT8) Strtoi (FunctionStr);\r
727 Pci->Device = (UINT8) Strtoi (DeviceStr);\r
728\r
729 return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
730}\r
731\r
732STATIC\r
733EFI_DEVICE_PATH_PROTOCOL *\r
734DevPathFromTextPcCard (\r
735 IN CHAR16 *TextDeviceNode\r
736 )\r
737{\r
738 CHAR16 *FunctionNumberStr;\r
739 PCCARD_DEVICE_PATH *Pccard;\r
740\r
741 FunctionNumberStr = GetNextParamStr (&TextDeviceNode);\r
742 Pccard = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
743 HARDWARE_DEVICE_PATH,\r
744 HW_PCCARD_DP,\r
745 sizeof (PCCARD_DEVICE_PATH)\r
746 );\r
747\r
748 Pccard->FunctionNumber = (UINT8) Strtoi (FunctionNumberStr);\r
749\r
750 return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
751}\r
752\r
753STATIC\r
754EFI_DEVICE_PATH_PROTOCOL *\r
755DevPathFromTextMemoryMapped (\r
756 IN CHAR16 *TextDeviceNode\r
757 )\r
758{\r
759 CHAR16 *MemoryTypeStr;\r
760 CHAR16 *StartingAddressStr;\r
761 CHAR16 *EndingAddressStr;\r
762 MEMMAP_DEVICE_PATH *MemMap;\r
763\r
764 MemoryTypeStr = GetNextParamStr (&TextDeviceNode);\r
765 StartingAddressStr = GetNextParamStr (&TextDeviceNode);\r
766 EndingAddressStr = GetNextParamStr (&TextDeviceNode);\r
767 MemMap = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
768 HARDWARE_DEVICE_PATH,\r
769 HW_MEMMAP_DP,\r
770 sizeof (MEMMAP_DEVICE_PATH)\r
771 );\r
772\r
773 MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);\r
774 Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);\r
775 Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);\r
776\r
777 return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
778}\r
779\r
780STATIC\r
781EFI_DEVICE_PATH_PROTOCOL *\r
782ConvertFromTextVendor (\r
783 IN CHAR16 *TextDeviceNode,\r
784 IN UINT8 Type,\r
785 IN UINT8 SubType\r
786 )\r
787{\r
788 CHAR16 *GuidStr;\r
789 CHAR16 *DataStr;\r
790 UINTN Length;\r
791 VENDOR_DEVICE_PATH *Vendor;\r
792\r
793 GuidStr = GetNextParamStr (&TextDeviceNode);\r
794\r
795 DataStr = GetNextParamStr (&TextDeviceNode);\r
796 Length = StrLen (DataStr);\r
797 //\r
798 // Two hex characters make up 1 buffer byte\r
799 //\r
800 Length = (Length + 1) / 2;\r
801\r
802 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
803 Type,\r
804 SubType,\r
805 (UINT16) (sizeof (VENDOR_DEVICE_PATH) + Length)\r
806 );\r
807\r
808 StrToGuid (GuidStr, &Vendor->Guid);\r
809 StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
810\r
811 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
812}\r
813\r
814STATIC\r
815EFI_DEVICE_PATH_PROTOCOL *\r
816DevPathFromTextVenHw (\r
817 IN CHAR16 *TextDeviceNode\r
818 )\r
819{\r
820 return ConvertFromTextVendor (\r
821 TextDeviceNode,\r
822 HARDWARE_DEVICE_PATH,\r
823 HW_VENDOR_DP\r
824 );\r
825}\r
826\r
827STATIC\r
828EFI_DEVICE_PATH_PROTOCOL *\r
829DevPathFromTextCtrl (\r
830 IN CHAR16 *TextDeviceNode\r
831 )\r
832{\r
833 CHAR16 *ControllerStr;\r
834 CONTROLLER_DEVICE_PATH *Controller;\r
835\r
836 ControllerStr = GetNextParamStr (&TextDeviceNode);\r
837 Controller = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
838 HARDWARE_DEVICE_PATH,\r
839 HW_CONTROLLER_DP,\r
840 sizeof (CONTROLLER_DEVICE_PATH)\r
841 );\r
842 Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);\r
843\r
844 return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
845}\r
846\r
847STATIC\r
848VOID\r
849EisaIdFromText (\r
850 IN CHAR16 *Text,\r
851 OUT UINT32 *EisaId\r
852 )\r
853{\r
854 UINTN PnpId;\r
855\r
856 PnpId = Xtoi (Text + 3);\r
857 *EisaId = (((Text[0] - '@') & 0x1f) << 10) + \r
858 (((Text[1] - '@') & 0x1f) << 5) + \r
859 ((Text[2] - '@') & 0x1f) +\r
860 (UINT32) (PnpId << 16);\r
861}\r
862\r
863EFI_DEVICE_PATH_PROTOCOL *\r
864DevPathFromTextAcpi (\r
865 IN CHAR16 *TextDeviceNode\r
866 )\r
867{\r
868 CHAR16 *HIDStr;\r
869 CHAR16 *UIDStr;\r
870 ACPI_HID_DEVICE_PATH *Acpi;\r
871\r
872 HIDStr = GetNextParamStr (&TextDeviceNode);\r
873 UIDStr = GetNextParamStr (&TextDeviceNode);\r
874 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
875 ACPI_DEVICE_PATH,\r
876 ACPI_DP,\r
877 sizeof (ACPI_HID_DEVICE_PATH)\r
878 );\r
879\r
880 EisaIdFromText (HIDStr, &Acpi->HID);\r
881 Acpi->UID = (UINT32) Strtoi (UIDStr);\r
882\r
883 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
884}\r
885\r
886STATIC\r
887EFI_DEVICE_PATH_PROTOCOL *\r
888ConvertFromTextAcpi (\r
889 IN CHAR16 *TextDeviceNode,\r
890 IN UINT32 PnPId\r
891 )\r
892{\r
893 CHAR16 *UIDStr;\r
894 ACPI_HID_DEVICE_PATH *Acpi;\r
895\r
896 UIDStr = GetNextParamStr (&TextDeviceNode);\r
897 Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
898 ACPI_DEVICE_PATH,\r
899 ACPI_DP,\r
900 sizeof (ACPI_HID_DEVICE_PATH)\r
901 );\r
902\r
903 Acpi->HID = EFI_PNP_ID (PnPId);\r
904 Acpi->UID = (UINT32) Strtoi (UIDStr);\r
905\r
906 return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
907}\r
908\r
909STATIC\r
910EFI_DEVICE_PATH_PROTOCOL *\r
911DevPathFromTextPciRoot (\r
912 IN CHAR16 *TextDeviceNode\r
913 )\r
914{\r
915 return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);\r
916}\r
917\r
918STATIC\r
919EFI_DEVICE_PATH_PROTOCOL *\r
920DevPathFromTextFloppy (\r
921 IN CHAR16 *TextDeviceNode\r
922 )\r
923{\r
924 return ConvertFromTextAcpi (TextDeviceNode, 0x0604);\r
925}\r
926\r
927STATIC\r
928EFI_DEVICE_PATH_PROTOCOL *\r
929DevPathFromTextKeyboard (\r
930 IN CHAR16 *TextDeviceNode\r
931 )\r
932{\r
933 return ConvertFromTextAcpi (TextDeviceNode, 0x0301);\r
934}\r
935\r
936STATIC\r
937EFI_DEVICE_PATH_PROTOCOL *\r
938DevPathFromTextSerial (\r
939 IN CHAR16 *TextDeviceNode\r
940 )\r
941{\r
942 return ConvertFromTextAcpi (TextDeviceNode, 0x0501);\r
943}\r
944\r
945STATIC\r
946EFI_DEVICE_PATH_PROTOCOL *\r
947DevPathFromTextParallelPort (\r
948 IN CHAR16 *TextDeviceNode\r
949 )\r
950{\r
951 return ConvertFromTextAcpi (TextDeviceNode, 0x0401);\r
952}\r
953\r
954STATIC\r
955EFI_DEVICE_PATH_PROTOCOL *\r
956DevPathFromTextAcpiEx (\r
957 IN CHAR16 *TextDeviceNode\r
958 )\r
959{\r
960 CHAR16 *HIDStr;\r
961 CHAR16 *CIDStr;\r
962 CHAR16 *UIDStr;\r
963 CHAR16 *HIDSTRStr;\r
964 CHAR16 *CIDSTRStr;\r
965 CHAR16 *UIDSTRStr;\r
966 CHAR8 *AsciiStr;\r
967 UINT16 Length;\r
968 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
969\r
970 HIDStr = GetNextParamStr (&TextDeviceNode);\r
971 CIDStr = GetNextParamStr (&TextDeviceNode);\r
972 UIDStr = GetNextParamStr (&TextDeviceNode);\r
973 HIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
974 CIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
975 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
976\r
977 Length = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);\r
978 Length = (UINT16) (Length + StrLen (UIDSTRStr) + 1);\r
979 Length = (UINT16) (Length + StrLen (CIDSTRStr) + 1);\r
980 AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (\r
981 ACPI_DEVICE_PATH,\r
982 ACPI_EXTENDED_DP,\r
983 Length\r
984 );\r
985\r
986 EisaIdFromText (HIDStr, &AcpiEx->HID);\r
987 EisaIdFromText (CIDStr, &AcpiEx->CID);\r
988 AcpiEx->UID = (UINT32) Strtoi (UIDStr);\r
989\r
990 AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
991 StrToAscii (HIDSTRStr, &AsciiStr);\r
992 StrToAscii (UIDSTRStr, &AsciiStr);\r
993 StrToAscii (CIDSTRStr, &AsciiStr);\r
994\r
995 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
996}\r
997\r
998STATIC\r
999EFI_DEVICE_PATH_PROTOCOL *\r
1000DevPathFromTextAcpiExp (\r
1001 IN CHAR16 *TextDeviceNode\r
1002 )\r
1003{\r
1004 CHAR16 *HIDStr;\r
1005 CHAR16 *CIDStr;\r
1006 CHAR16 *UIDSTRStr;\r
1007 CHAR8 *AsciiStr;\r
1008 UINT16 Length;\r
1009 ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;\r
1010\r
1011 HIDStr = GetNextParamStr (&TextDeviceNode);\r
1012 CIDStr = GetNextParamStr (&TextDeviceNode);\r
1013 UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
1014 Length = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);\r
1015 AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (\r
1016 ACPI_DEVICE_PATH,\r
1017 ACPI_EXTENDED_DP,\r
1018 Length\r
1019 );\r
1020\r
1021 EisaIdFromText (HIDStr, &AcpiEx->HID);\r
1022 EisaIdFromText (CIDStr, &AcpiEx->CID);\r
1023 AcpiEx->UID = 0;\r
1024\r
1025 AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
1026 //\r
1027 // HID string is NULL\r
1028 //\r
1029 *AsciiStr = '\0';\r
1030 //\r
1031 // Convert UID string\r
1032 //\r
1033 AsciiStr++;\r
1034 StrToAscii (UIDSTRStr, &AsciiStr);\r
1035 //\r
1036 // CID string is NULL\r
1037 //\r
1038 *AsciiStr = '\0';\r
1039\r
1040 return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
1041}\r
1042\r
1043STATIC\r
1044EFI_DEVICE_PATH_PROTOCOL *\r
1045DevPathFromTextAta (\r
1046 IN CHAR16 *TextDeviceNode\r
1047 )\r
1048{\r
1049 CHAR16 *PrimarySecondaryStr;\r
1050 CHAR16 *SlaveMasterStr;\r
1051 CHAR16 *LunStr;\r
1052 ATAPI_DEVICE_PATH *Atapi;\r
1053\r
1054 Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
1055 MESSAGING_DEVICE_PATH,\r
1056 MSG_ATAPI_DP,\r
1057 sizeof (ATAPI_DEVICE_PATH)\r
1058 );\r
1059\r
1060 PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
1061 SlaveMasterStr = GetNextParamStr (&TextDeviceNode);\r
1062 LunStr = GetNextParamStr (&TextDeviceNode);\r
1063\r
1064 Atapi->PrimarySecondary = (UINT8) ((StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? 0 : 1);\r
1065 Atapi->SlaveMaster = (UINT8) ((StrCmp (SlaveMasterStr, L"Master") == 0) ? 0 : 1);\r
1066 Atapi->Lun = (UINT16) Strtoi (LunStr);\r
1067\r
1068 return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
1069}\r
1070\r
1071STATIC\r
1072EFI_DEVICE_PATH_PROTOCOL *\r
1073DevPathFromTextScsi (\r
1074 IN CHAR16 *TextDeviceNode\r
1075 )\r
1076{\r
1077 CHAR16 *PunStr;\r
1078 CHAR16 *LunStr;\r
1079 SCSI_DEVICE_PATH *Scsi;\r
1080\r
1081 PunStr = GetNextParamStr (&TextDeviceNode);\r
1082 LunStr = GetNextParamStr (&TextDeviceNode);\r
1083 Scsi = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
1084 MESSAGING_DEVICE_PATH,\r
1085 MSG_SCSI_DP,\r
1086 sizeof (SCSI_DEVICE_PATH)\r
1087 );\r
1088\r
1089 Scsi->Pun = (UINT16) Strtoi (PunStr);\r
1090 Scsi->Lun = (UINT16) Strtoi (LunStr);\r
1091\r
1092 return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
1093}\r
1094\r
1095STATIC\r
1096EFI_DEVICE_PATH_PROTOCOL *\r
1097DevPathFromTextFibre (\r
1098 IN CHAR16 *TextDeviceNode\r
1099 )\r
1100{\r
1101 CHAR16 *WWNStr;\r
1102 CHAR16 *LunStr;\r
1103 FIBRECHANNEL_DEVICE_PATH *Fibre;\r
1104\r
1105 WWNStr = GetNextParamStr (&TextDeviceNode);\r
1106 LunStr = GetNextParamStr (&TextDeviceNode);\r
1107 Fibre = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
1108 MESSAGING_DEVICE_PATH,\r
1109 MSG_FIBRECHANNEL_DP,\r
1110 sizeof (FIBRECHANNEL_DEVICE_PATH)\r
1111 );\r
1112\r
1113 Fibre->Reserved = 0;\r
1114 Strtoi64 (WWNStr, &Fibre->WWN);\r
1115 Strtoi64 (LunStr, &Fibre->Lun);\r
1116\r
1117 return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
1118}\r
1119\r
1120STATIC\r
1121EFI_DEVICE_PATH_PROTOCOL *\r
1122DevPathFromText1394 (\r
1123 IN CHAR16 *TextDeviceNode\r
1124 )\r
1125{\r
1126 CHAR16 *GuidStr;\r
1127 F1394_DEVICE_PATH *F1394;\r
1128\r
1129 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1130 F1394 = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
1131 MESSAGING_DEVICE_PATH,\r
1132 MSG_1394_DP,\r
1133 sizeof (F1394_DEVICE_PATH)\r
1134 );\r
1135\r
1136 F1394->Reserved = 0;\r
1137 Xtoi64 (GuidStr, &F1394->Guid);\r
1138\r
1139 return (EFI_DEVICE_PATH_PROTOCOL *) F1394;\r
1140}\r
1141\r
1142STATIC\r
1143EFI_DEVICE_PATH_PROTOCOL *\r
1144DevPathFromTextUsb (\r
1145 IN CHAR16 *TextDeviceNode\r
1146 )\r
1147{\r
1148 CHAR16 *PortStr;\r
1149 CHAR16 *InterfaceStr;\r
1150 USB_DEVICE_PATH *Usb;\r
1151\r
1152 PortStr = GetNextParamStr (&TextDeviceNode);\r
1153 InterfaceStr = GetNextParamStr (&TextDeviceNode);\r
1154 Usb = (USB_DEVICE_PATH *) CreateDeviceNode (\r
1155 MESSAGING_DEVICE_PATH,\r
1156 MSG_USB_DP,\r
1157 sizeof (USB_DEVICE_PATH)\r
1158 );\r
1159\r
1160 Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);\r
1161 Usb->InterfaceNumber = (UINT8) Strtoi (InterfaceStr);\r
1162\r
1163 return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
1164}\r
1165\r
1166STATIC\r
1167EFI_DEVICE_PATH_PROTOCOL *\r
1168DevPathFromTextI2O (\r
1169 IN CHAR16 *TextDeviceNode\r
1170 )\r
1171{\r
1172 CHAR16 *TIDStr;\r
1173 I2O_DEVICE_PATH *I2O;\r
1174\r
1175 TIDStr = GetNextParamStr (&TextDeviceNode);\r
1176 I2O = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
1177 MESSAGING_DEVICE_PATH,\r
1178 MSG_I2O_DP,\r
1179 sizeof (I2O_DEVICE_PATH)\r
1180 );\r
1181\r
1182 I2O->Tid = (UINT32) Strtoi (TIDStr);\r
1183\r
1184 return (EFI_DEVICE_PATH_PROTOCOL *) I2O;\r
1185}\r
1186\r
1187STATIC\r
1188EFI_DEVICE_PATH_PROTOCOL *\r
1189DevPathFromTextInfiniband (\r
1190 IN CHAR16 *TextDeviceNode\r
1191 )\r
1192{\r
1193 CHAR16 *FlagsStr;\r
1194 CHAR16 *GuidStr;\r
1195 CHAR16 *SidStr;\r
1196 CHAR16 *TidStr;\r
1197 CHAR16 *DidStr;\r
1198 EFI_GUID PortGid;\r
1199 INFINIBAND_DEVICE_PATH *InfiniBand;\r
1200\r
1201 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
1202 GuidStr = GetNextParamStr (&TextDeviceNode);\r
1203 SidStr = GetNextParamStr (&TextDeviceNode);\r
1204 TidStr = GetNextParamStr (&TextDeviceNode);\r
1205 DidStr = GetNextParamStr (&TextDeviceNode);\r
1206 InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
1207 MESSAGING_DEVICE_PATH,\r
1208 MSG_INFINIBAND_DP,\r
1209 sizeof (INFINIBAND_DEVICE_PATH)\r
1210 );\r
1211\r
1212 InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
1213 StrToGuid (GuidStr, &PortGid);\r
1214 CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
1215 Strtoi64 (SidStr, &InfiniBand->ServiceId);\r
1216 Strtoi64 (TidStr, &InfiniBand->TargetPortId);\r
1217 Strtoi64 (DidStr, &InfiniBand->DeviceId);\r
1218\r
1219 return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
1220}\r
1221\r
1222STATIC\r
1223EFI_DEVICE_PATH_PROTOCOL *\r
1224DevPathFromTextVenMsg (\r
1225 IN CHAR16 *TextDeviceNode\r
1226 )\r
1227{\r
1228 return ConvertFromTextVendor (\r
1229 TextDeviceNode,\r
1230 MESSAGING_DEVICE_PATH,\r
1231 MSG_VENDOR_DP\r
1232 );\r
1233}\r
1234\r
1235STATIC\r
1236EFI_DEVICE_PATH_PROTOCOL *\r
1237DevPathFromTextVenPcAnsi (\r
1238 IN CHAR16 *TextDeviceNode\r
1239 )\r
1240{\r
1241 VENDOR_DEVICE_PATH *Vendor;\r
1242\r
1243 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1244 MESSAGING_DEVICE_PATH,\r
1245 MSG_VENDOR_DP,\r
1246 sizeof (VENDOR_DEVICE_PATH));\r
1247 CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
1248\r
1249 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1250}\r
1251\r
1252STATIC\r
1253EFI_DEVICE_PATH_PROTOCOL *\r
1254DevPathFromTextVenVt100 (\r
1255 IN CHAR16 *TextDeviceNode\r
1256 )\r
1257{\r
1258 VENDOR_DEVICE_PATH *Vendor;\r
1259\r
1260 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1261 MESSAGING_DEVICE_PATH,\r
1262 MSG_VENDOR_DP,\r
1263 sizeof (VENDOR_DEVICE_PATH));\r
1264 CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
1265\r
1266 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1267}\r
1268\r
1269STATIC\r
1270EFI_DEVICE_PATH_PROTOCOL *\r
1271DevPathFromTextVenVt100Plus (\r
1272 IN CHAR16 *TextDeviceNode\r
1273 )\r
1274{\r
1275 VENDOR_DEVICE_PATH *Vendor;\r
1276\r
1277 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1278 MESSAGING_DEVICE_PATH,\r
1279 MSG_VENDOR_DP,\r
1280 sizeof (VENDOR_DEVICE_PATH));\r
1281 CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
1282\r
1283 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1284}\r
1285\r
1286STATIC\r
1287EFI_DEVICE_PATH_PROTOCOL *\r
1288DevPathFromTextVenUtf8 (\r
1289 IN CHAR16 *TextDeviceNode\r
1290 )\r
1291{\r
1292 VENDOR_DEVICE_PATH *Vendor;\r
1293\r
1294 Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
1295 MESSAGING_DEVICE_PATH,\r
1296 MSG_VENDOR_DP,\r
1297 sizeof (VENDOR_DEVICE_PATH));\r
1298 CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
1299\r
1300 return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
1301}\r
1302\r
1303STATIC\r
1304EFI_DEVICE_PATH_PROTOCOL *\r
1305DevPathFromTextUartFlowCtrl (\r
1306 IN CHAR16 *TextDeviceNode\r
1307 )\r
1308{\r
1309 CHAR16 *ValueStr;\r
1310 UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
1311\r
1312 ValueStr = GetNextParamStr (&TextDeviceNode);\r
1313 UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
1314 MESSAGING_DEVICE_PATH,\r
1315 MSG_VENDOR_DP,\r
1316 sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
1317 );\r
1318\r
1319 CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);\r
1320 if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
1321 UartFlowControl->FlowControlMap = 2;\r
1322 } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
1323 UartFlowControl->FlowControlMap = 1;\r
1324 } else {\r
1325 UartFlowControl->FlowControlMap = 0;\r
1326 }\r
1327\r
1328 return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
1329}\r
1330\r
1331STATIC\r
1332EFI_DEVICE_PATH_PROTOCOL *\r
1333DevPathFromTextSAS (\r
1334 IN CHAR16 *TextDeviceNode\r
1335 )\r
1336{\r
1337 CHAR16 *AddressStr;\r
1338 CHAR16 *LunStr;\r
1339 CHAR16 *RTPStr;\r
1340 CHAR16 *SASSATAStr;\r
1341 CHAR16 *LocationStr;\r
1342 CHAR16 *ConnectStr;\r
1343 CHAR16 *DriveBayStr;\r
1344 CHAR16 *ReservedStr;\r
1345 UINT16 Info;\r
1346 SAS_DEVICE_PATH *Sas;\r
1347\r
1348 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1349 LunStr = GetNextParamStr (&TextDeviceNode);\r
1350 RTPStr = GetNextParamStr (&TextDeviceNode);\r
1351 SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
1352 LocationStr = GetNextParamStr (&TextDeviceNode);\r
1353 ConnectStr = GetNextParamStr (&TextDeviceNode);\r
1354 DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
1355 ReservedStr = GetNextParamStr (&TextDeviceNode);\r
1356 Info = 0x0000;\r
1357 Sas = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
1358 MESSAGING_DEVICE_PATH,\r
1359 MSG_VENDOR_DP,\r
1360 sizeof (SAS_DEVICE_PATH)\r
1361 );\r
1362\r
1363 CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);\r
1364 Strtoi64 (AddressStr, &Sas->SasAddress);\r
1365 Strtoi64 (LunStr, &Sas->Lun);\r
1366 Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
1367 if (StrCmp (SASSATAStr, L"NoTopology") != 0) {\r
1368 if (StrCmp (DriveBayStr, L"0") == 0) {\r
1369 Info |= 0x0001;\r
1370 } else {\r
1371 Info |= 0x0002;\r
1372 Info = (UINT16) (Info | (Strtoi (DriveBayStr) << 8));\r
1373 }\r
1374\r
1375 if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
1376 Info |= 0x0010;\r
1377 }\r
1378\r
1379 if (StrCmp (LocationStr, L"External") == 0) {\r
1380 Info |= 0x0020;\r
1381 }\r
1382\r
1383 if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
1384 Info |= 0x0040;\r
1385 }\r
1386 }\r
1387\r
1388 Sas->DeviceTopology = Info;\r
1389 Sas->Reserved = (UINT32) Strtoi (ReservedStr);\r
1390\r
1391 return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
1392}\r
1393\r
1394STATIC\r
1395EFI_DEVICE_PATH_PROTOCOL *\r
1396DevPathFromTextDebugPort (\r
1397 IN CHAR16 *TextDeviceNode\r
1398 )\r
1399{\r
1400 VENDOR_DEFINED_MESSAGING_DEVICE_PATH *Vend;\r
1401\r
1402 Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
1403 MESSAGING_DEVICE_PATH,\r
1404 MSG_VENDOR_DP,\r
1405 sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
1406 );\r
1407\r
1408 CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
1409\r
1410 return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
1411}\r
1412\r
1413STATIC\r
1414EFI_DEVICE_PATH_PROTOCOL *\r
1415DevPathFromTextMAC (\r
1416 IN CHAR16 *TextDeviceNode\r
1417 )\r
1418{\r
1419 CHAR16 *AddressStr;\r
1420 CHAR16 *IfTypeStr;\r
1421 UINTN Length;\r
1422 MAC_ADDR_DEVICE_PATH *MAC;\r
1423\r
1424 AddressStr = GetNextParamStr (&TextDeviceNode);\r
1425 IfTypeStr = GetNextParamStr (&TextDeviceNode);\r
1426 MAC = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
1427 MESSAGING_DEVICE_PATH,\r
1428 MSG_MAC_ADDR_DP,\r
1429 sizeof (MAC_ADDR_DEVICE_PATH)\r
1430 );\r
1431\r
1432 MAC->IfType = (UINT8) Strtoi (IfTypeStr);\r
1433\r
1434 Length = sizeof (EFI_MAC_ADDRESS);\r
1435 StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);\r
1436\r
1437 return (EFI_DEVICE_PATH_PROTOCOL *) MAC;\r
1438}\r
1439\r
1440STATIC\r
1441EFI_DEVICE_PATH_PROTOCOL *\r
1442DevPathFromTextIPv4 (\r
1443 IN CHAR16 *TextDeviceNode\r
1444 )\r
1445{\r
1446 CHAR16 *RemoteIPStr;\r
1447 CHAR16 *ProtocolStr;\r
1448 CHAR16 *TypeStr;\r
1449 CHAR16 *LocalIPStr;\r
1450 IPv4_DEVICE_PATH *IPv4;\r
1451\r
1452 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1453 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1454 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1455 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1456 IPv4 = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
1457 MESSAGING_DEVICE_PATH,\r
1458 MSG_IPv4_DP,\r
1459 sizeof (IPv4_DEVICE_PATH)\r
1460 );\r
1461\r
1462 StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
1463 IPv4->Protocol = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);\r
1464 if (StrCmp (TypeStr, L"Static") == 0) {\r
1465 IPv4->StaticIpAddress = TRUE;\r
1466 } else {\r
1467 IPv4->StaticIpAddress = FALSE;\r
1468 }\r
1469\r
1470 StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
1471\r
1472 IPv4->LocalPort = 0;\r
1473 IPv4->RemotePort = 0;\r
1474\r
1475 return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
1476}\r
1477\r
1478STATIC\r
1479EFI_DEVICE_PATH_PROTOCOL *\r
1480DevPathFromTextIPv6 (\r
1481 IN CHAR16 *TextDeviceNode\r
1482 )\r
1483{\r
1484 CHAR16 *RemoteIPStr;\r
1485 CHAR16 *ProtocolStr;\r
1486 CHAR16 *TypeStr;\r
1487 CHAR16 *LocalIPStr;\r
1488 IPv6_DEVICE_PATH *IPv6;\r
1489\r
1490 RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
1491 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1492 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1493 LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
1494 IPv6 = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
1495 MESSAGING_DEVICE_PATH,\r
1496 MSG_IPv6_DP,\r
1497 sizeof (IPv6_DEVICE_PATH)\r
1498 );\r
1499\r
1500 StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
1501 IPv6->Protocol = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);\r
1502 if (StrCmp (TypeStr, L"Static") == 0) {\r
1503 IPv6->StaticIpAddress = TRUE;\r
1504 } else {\r
1505 IPv6->StaticIpAddress = FALSE;\r
1506 }\r
1507\r
1508 StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
1509\r
1510 IPv6->LocalPort = 0;\r
1511 IPv6->RemotePort = 0;\r
1512\r
1513 return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
1514}\r
1515\r
1516STATIC\r
1517EFI_DEVICE_PATH_PROTOCOL *\r
1518DevPathFromTextUart (\r
1519 IN CHAR16 *TextDeviceNode\r
1520 )\r
1521{\r
1522 CHAR16 *BaudStr;\r
1523 CHAR16 *DataBitsStr;\r
1524 CHAR16 *ParityStr;\r
1525 CHAR16 *StopBitsStr;\r
1526 UART_DEVICE_PATH *Uart;\r
1527\r
1528 BaudStr = GetNextParamStr (&TextDeviceNode);\r
1529 DataBitsStr = GetNextParamStr (&TextDeviceNode);\r
1530 ParityStr = GetNextParamStr (&TextDeviceNode);\r
1531 StopBitsStr = GetNextParamStr (&TextDeviceNode);\r
1532 Uart = (UART_DEVICE_PATH *) CreateDeviceNode (\r
1533 MESSAGING_DEVICE_PATH,\r
1534 MSG_UART_DP,\r
1535 sizeof (UART_DEVICE_PATH)\r
1536 );\r
1537\r
1538 Uart->BaudRate = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr);\r
1539 Uart->DataBits = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Dtoi (DataBitsStr));\r
1540 switch (*ParityStr) {\r
1541 case L'D':\r
1542 Uart->Parity = 0;\r
1543 break;\r
1544\r
1545 case L'N':\r
1546 Uart->Parity = 1;\r
1547 break;\r
1548\r
1549 case L'E':\r
1550 Uart->Parity = 2;\r
1551 break;\r
1552\r
1553 case L'O':\r
1554 Uart->Parity = 3;\r
1555 break;\r
1556\r
1557 case L'M':\r
1558 Uart->Parity = 4;\r
1559 break;\r
1560\r
1561 case L'S':\r
1562 Uart->Parity = 5;\r
1563\r
1564 default:\r
1565 Uart->Parity = 0xff;\r
1566 }\r
1567\r
1568 if (StrCmp (StopBitsStr, L"D") == 0) {\r
1569 Uart->StopBits = (UINT8) 0;\r
1570 } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
1571 Uart->StopBits = (UINT8) 1;\r
1572 } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
1573 Uart->StopBits = (UINT8) 2;\r
1574 } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
1575 Uart->StopBits = (UINT8) 3;\r
1576 } else {\r
1577 Uart->StopBits = 0xff;\r
1578 }\r
1579\r
1580 return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
1581}\r
1582\r
1583STATIC\r
1584EFI_DEVICE_PATH_PROTOCOL *\r
1585ConvertFromTextUsbClass (\r
1586 IN CHAR16 *TextDeviceNode,\r
1587 IN USB_CLASS_TEXT *UsbClassText\r
1588 )\r
1589{\r
1590 CHAR16 *VIDStr;\r
1591 CHAR16 *PIDStr;\r
1592 CHAR16 *ClassStr;\r
1593 CHAR16 *SubClassStr;\r
1594 CHAR16 *ProtocolStr;\r
1595 USB_CLASS_DEVICE_PATH *UsbClass;\r
1596\r
1597 UsbClass = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
1598 MESSAGING_DEVICE_PATH,\r
1599 MSG_USB_CLASS_DP,\r
1600 sizeof (USB_CLASS_DEVICE_PATH)\r
1601 );\r
1602\r
1603 VIDStr = GetNextParamStr (&TextDeviceNode);\r
1604 PIDStr = GetNextParamStr (&TextDeviceNode);\r
1605 if (UsbClassText->ClassExist) {\r
1606 ClassStr = GetNextParamStr (&TextDeviceNode);\r
1607 UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
1608 } else {\r
1609 UsbClass->DeviceClass = UsbClassText->Class;\r
1610 }\r
1611 if (UsbClassText->SubClassExist) {\r
1612 SubClassStr = GetNextParamStr (&TextDeviceNode);\r
1613 UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
1614 } else {\r
1615 UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
1616 } \r
1617\r
1618 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1619\r
1620 UsbClass->VendorId = (UINT16) Strtoi (VIDStr);\r
1621 UsbClass->ProductId = (UINT16) Strtoi (PIDStr);\r
1622 UsbClass->DeviceProtocol = (UINT8) Strtoi (ProtocolStr);\r
1623\r
1624 return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
1625}\r
1626\r
1627\r
1628STATIC\r
1629EFI_DEVICE_PATH_PROTOCOL *\r
1630DevPathFromTextUsbClass (\r
1631 IN CHAR16 *TextDeviceNode\r
1632 )\r
1633{\r
1634 USB_CLASS_TEXT UsbClassText;\r
1635\r
1636 UsbClassText.ClassExist = TRUE;\r
1637 UsbClassText.SubClassExist = TRUE;\r
1638\r
1639 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1640}\r
1641\r
1642STATIC\r
1643EFI_DEVICE_PATH_PROTOCOL *\r
1644DevPathFromTextUsbAudio (\r
1645 IN CHAR16 *TextDeviceNode\r
1646 )\r
1647{\r
1648 USB_CLASS_TEXT UsbClassText;\r
1649\r
1650 UsbClassText.ClassExist = FALSE;\r
1651 UsbClassText.Class = USB_CLASS_AUDIO;\r
1652 UsbClassText.SubClassExist = TRUE;\r
1653\r
1654 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1655}\r
1656\r
1657STATIC\r
1658EFI_DEVICE_PATH_PROTOCOL *\r
1659DevPathFromTextUsbCDCControl (\r
1660 IN CHAR16 *TextDeviceNode\r
1661 )\r
1662{\r
1663 USB_CLASS_TEXT UsbClassText;\r
1664\r
1665 UsbClassText.ClassExist = FALSE;\r
1666 UsbClassText.Class = USB_CLASS_CDCCONTROL;\r
1667 UsbClassText.SubClassExist = TRUE;\r
1668\r
1669 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1670}\r
1671\r
1672STATIC\r
1673EFI_DEVICE_PATH_PROTOCOL *\r
1674DevPathFromTextUsbHID (\r
1675 IN CHAR16 *TextDeviceNode\r
1676 )\r
1677{\r
1678 USB_CLASS_TEXT UsbClassText;\r
1679\r
1680 UsbClassText.ClassExist = FALSE;\r
1681 UsbClassText.Class = USB_CLASS_HID;\r
1682 UsbClassText.SubClassExist = TRUE;\r
1683\r
1684 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1685}\r
1686\r
1687STATIC\r
1688EFI_DEVICE_PATH_PROTOCOL *\r
1689DevPathFromTextUsbImage (\r
1690 IN CHAR16 *TextDeviceNode\r
1691 )\r
1692{\r
1693 USB_CLASS_TEXT UsbClassText;\r
1694\r
1695 UsbClassText.ClassExist = FALSE;\r
1696 UsbClassText.Class = USB_CLASS_IMAGE;\r
1697 UsbClassText.SubClassExist = TRUE;\r
1698\r
1699 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1700}\r
1701\r
1702STATIC\r
1703EFI_DEVICE_PATH_PROTOCOL *\r
1704DevPathFromTextUsbPrinter (\r
1705 IN CHAR16 *TextDeviceNode\r
1706 )\r
1707{\r
1708 USB_CLASS_TEXT UsbClassText;\r
1709\r
1710 UsbClassText.ClassExist = FALSE;\r
1711 UsbClassText.Class = USB_CLASS_PRINTER;\r
1712 UsbClassText.SubClassExist = TRUE;\r
1713\r
1714 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1715}\r
1716\r
1717STATIC\r
1718EFI_DEVICE_PATH_PROTOCOL *\r
1719DevPathFromTextUsbMassStorage (\r
1720 IN CHAR16 *TextDeviceNode\r
1721 )\r
1722{\r
1723 USB_CLASS_TEXT UsbClassText;\r
1724\r
1725 UsbClassText.ClassExist = FALSE;\r
1726 UsbClassText.Class = USB_CLASS_MASS_STORAGE;\r
1727 UsbClassText.SubClassExist = TRUE;\r
1728\r
1729 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1730}\r
1731\r
1732STATIC\r
1733EFI_DEVICE_PATH_PROTOCOL *\r
1734DevPathFromTextUsbHub (\r
1735 IN CHAR16 *TextDeviceNode\r
1736 )\r
1737{\r
1738 USB_CLASS_TEXT UsbClassText;\r
1739\r
1740 UsbClassText.ClassExist = FALSE;\r
1741 UsbClassText.Class = USB_CLASS_HUB;\r
1742 UsbClassText.SubClassExist = TRUE;\r
1743\r
1744 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1745}\r
1746\r
1747STATIC\r
1748EFI_DEVICE_PATH_PROTOCOL *\r
1749DevPathFromTextUsbCDCData (\r
1750 IN CHAR16 *TextDeviceNode\r
1751 )\r
1752{\r
1753 USB_CLASS_TEXT UsbClassText;\r
1754\r
1755 UsbClassText.ClassExist = FALSE;\r
1756 UsbClassText.Class = USB_CLASS_CDCDATA;\r
1757 UsbClassText.SubClassExist = TRUE;\r
1758\r
1759 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1760}\r
1761\r
1762STATIC\r
1763EFI_DEVICE_PATH_PROTOCOL *\r
1764DevPathFromTextUsbSmartCard (\r
1765 IN CHAR16 *TextDeviceNode\r
1766 )\r
1767{\r
1768 USB_CLASS_TEXT UsbClassText;\r
1769\r
1770 UsbClassText.ClassExist = FALSE;\r
1771 UsbClassText.Class = USB_CLASS_SMART_CARD;\r
1772 UsbClassText.SubClassExist = TRUE;\r
1773\r
1774 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1775}\r
1776\r
1777STATIC\r
1778EFI_DEVICE_PATH_PROTOCOL *\r
1779DevPathFromTextUsbVideo (\r
1780 IN CHAR16 *TextDeviceNode\r
1781 )\r
1782{\r
1783 USB_CLASS_TEXT UsbClassText;\r
1784\r
1785 UsbClassText.ClassExist = FALSE;\r
1786 UsbClassText.Class = USB_CLASS_VIDEO;\r
1787 UsbClassText.SubClassExist = TRUE;\r
1788\r
1789 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1790}\r
1791\r
1792STATIC\r
1793EFI_DEVICE_PATH_PROTOCOL *\r
1794DevPathFromTextUsbDiagnostic (\r
1795 IN CHAR16 *TextDeviceNode\r
1796 )\r
1797{\r
1798 USB_CLASS_TEXT UsbClassText;\r
1799\r
1800 UsbClassText.ClassExist = FALSE;\r
1801 UsbClassText.Class = USB_CLASS_DIAGNOSTIC;\r
1802 UsbClassText.SubClassExist = TRUE;\r
1803\r
1804 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1805}\r
1806\r
1807STATIC\r
1808EFI_DEVICE_PATH_PROTOCOL *\r
1809DevPathFromTextUsbWireless (\r
1810 IN CHAR16 *TextDeviceNode\r
1811 )\r
1812{\r
1813 USB_CLASS_TEXT UsbClassText;\r
1814\r
1815 UsbClassText.ClassExist = FALSE;\r
1816 UsbClassText.Class = USB_CLASS_WIRELESS;\r
1817 UsbClassText.SubClassExist = TRUE;\r
1818\r
1819 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1820}\r
1821\r
1822STATIC\r
1823EFI_DEVICE_PATH_PROTOCOL *\r
1824DevPathFromTextUsbDeviceFirmwareUpdate (\r
1825 IN CHAR16 *TextDeviceNode\r
1826 )\r
1827{\r
1828 USB_CLASS_TEXT UsbClassText;\r
1829\r
1830 UsbClassText.ClassExist = FALSE;\r
1831 UsbClassText.Class = USB_CLASS_RESERVE;\r
1832 UsbClassText.SubClassExist = FALSE;\r
1833 UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;\r
1834\r
1835 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1836}\r
1837\r
1838STATIC\r
1839EFI_DEVICE_PATH_PROTOCOL *\r
1840DevPathFromTextUsbIrdaBridge (\r
1841 IN CHAR16 *TextDeviceNode\r
1842 )\r
1843{\r
1844 USB_CLASS_TEXT UsbClassText;\r
1845\r
1846 UsbClassText.ClassExist = FALSE;\r
1847 UsbClassText.Class = USB_CLASS_RESERVE;\r
1848 UsbClassText.SubClassExist = FALSE;\r
1849 UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;\r
1850\r
1851 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1852}\r
1853\r
1854STATIC\r
1855EFI_DEVICE_PATH_PROTOCOL *\r
1856DevPathFromTextUsbTestAndMeasurement (\r
1857 IN CHAR16 *TextDeviceNode\r
1858 )\r
1859{\r
1860 USB_CLASS_TEXT UsbClassText;\r
1861\r
1862 UsbClassText.ClassExist = FALSE;\r
1863 UsbClassText.Class = USB_CLASS_RESERVE;\r
1864 UsbClassText.SubClassExist = FALSE;\r
1865 UsbClassText.SubClass = USB_SUBCLASS_TEST;\r
1866\r
1867 return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
1868}\r
1869\r
1870STATIC\r
1871EFI_DEVICE_PATH_PROTOCOL *\r
1872DevPathFromTextUsbWwid (\r
1873 IN CHAR16 *TextDeviceNode\r
1874 )\r
1875{\r
1876 CHAR16 *VIDStr;\r
1877 CHAR16 *PIDStr;\r
1878 CHAR16 *InterfaceNumStr;\r
1879 CHAR16 *SerialNumberStr;\r
1880 USB_WWID_DEVICE_PATH *UsbWwid;\r
1881\r
1882 VIDStr = GetNextParamStr (&TextDeviceNode);\r
1883 PIDStr = GetNextParamStr (&TextDeviceNode);\r
1884 InterfaceNumStr = GetNextParamStr (&TextDeviceNode);\r
1885 SerialNumberStr = GetNextParamStr (&TextDeviceNode);\r
1886 UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
1887 MESSAGING_DEVICE_PATH,\r
1888 MSG_USB_WWID_DP,\r
1889 (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + StrSize (SerialNumberStr))\r
1890 );\r
1891\r
1892 UsbWwid->VendorId = (UINT16) Strtoi (VIDStr);\r
1893 UsbWwid->ProductId = (UINT16) Strtoi (PIDStr);\r
1894 UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
1895 StrCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr);\r
1896\r
1897 return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
1898}\r
1899\r
1900STATIC\r
1901EFI_DEVICE_PATH_PROTOCOL *\r
1902DevPathFromTextUnit (\r
1903 IN CHAR16 *TextDeviceNode\r
1904 )\r
1905{\r
1906 CHAR16 *LunStr;\r
1907 DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
1908\r
1909 LunStr = GetNextParamStr (&TextDeviceNode);\r
1910 LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
1911 MESSAGING_DEVICE_PATH,\r
1912 MSG_DEVICE_LOGICAL_UNIT_DP,\r
1913 (UINT16) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
1914 );\r
1915\r
1916 LogicalUnit->Lun = (UINT8) Strtoi (LunStr);\r
1917\r
1918 return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
1919}\r
1920\r
1921STATIC\r
1922EFI_DEVICE_PATH_PROTOCOL *\r
1923DevPathFromTextiSCSI (\r
1924 IN CHAR16 *TextDeviceNode\r
1925 )\r
1926{\r
1927 UINT16 Options;\r
1928 CHAR16 *NameStr;\r
1929 CHAR16 *PortalGroupStr;\r
1930 CHAR16 *LunStr;\r
1931 CHAR16 *HeaderDigestStr;\r
1932 CHAR16 *DataDigestStr;\r
1933 CHAR16 *AuthenticationStr;\r
1934 CHAR16 *ProtocolStr;\r
1935 CHAR8 *AsciiStr;\r
1936 ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;\r
1937\r
1938 NameStr = GetNextParamStr (&TextDeviceNode);\r
1939 PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
1940 LunStr = GetNextParamStr (&TextDeviceNode);\r
1941 HeaderDigestStr = GetNextParamStr (&TextDeviceNode);\r
1942 DataDigestStr = GetNextParamStr (&TextDeviceNode);\r
1943 AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
1944 ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
1945 iSCSI = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
1946 MESSAGING_DEVICE_PATH,\r
1947 MSG_ISCSI_DP,\r
1948 (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))\r
1949 );\r
1950\r
1951 AsciiStr = iSCSI->iSCSITargetName;\r
1952 StrToAscii (NameStr, &AsciiStr);\r
1953\r
1954 iSCSI->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
1955 Strtoi64 (LunStr, &iSCSI->Lun);\r
1956\r
1957 Options = 0x0000;\r
1958 if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
1959 Options |= 0x0002;\r
1960 }\r
1961\r
1962 if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
1963 Options |= 0x0008;\r
1964 }\r
1965\r
1966 if (StrCmp (AuthenticationStr, L"None") == 0) {\r
1967 Options |= 0x0800;\r
1968 }\r
1969\r
1970 if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
1971 Options |= 0x1000;\r
1972 }\r
1973\r
1974 iSCSI->LoginOption = (UINT16) Options;\r
1975\r
1976 iSCSI->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
1977\r
1978 return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;\r
1979}\r
1980\r
1981STATIC\r
1982EFI_DEVICE_PATH_PROTOCOL *\r
1983DevPathFromTextHD (\r
1984 IN CHAR16 *TextDeviceNode\r
1985 )\r
1986{\r
1987 CHAR16 *PartitionStr;\r
1988 CHAR16 *TypeStr;\r
1989 CHAR16 *SignatureStr;\r
1990 CHAR16 *StartStr;\r
1991 CHAR16 *SizeStr;\r
1992 UINT32 Signature32;\r
1993 EFI_GUID SignatureGuid;\r
1994 HARDDRIVE_DEVICE_PATH *Hd;\r
1995\r
1996 PartitionStr = GetNextParamStr (&TextDeviceNode);\r
1997 TypeStr = GetNextParamStr (&TextDeviceNode);\r
1998 SignatureStr = GetNextParamStr (&TextDeviceNode);\r
1999 StartStr = GetNextParamStr (&TextDeviceNode);\r
2000 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2001 Hd = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
2002 MEDIA_DEVICE_PATH,\r
2003 MEDIA_HARDDRIVE_DP,\r
2004 sizeof (HARDDRIVE_DEVICE_PATH)\r
2005 );\r
2006\r
2007 Hd->PartitionNumber = (UINT32) Dtoi (PartitionStr);\r
2008\r
2009 ZeroMem (Hd->Signature, 16);\r
2010 Hd->MBRType = (UINT8) 0;\r
2011\r
2012 if (StrCmp (TypeStr, L"MBR") == 0) {\r
2013 Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
2014 Hd->MBRType = 0x01;\r
2015\r
2016 Signature32 = (UINT32) Strtoi (SignatureStr);\r
2017 CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
2018 } else if (StrCmp (TypeStr, L"GPT") == 0) {\r
2019 Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
2020 Hd->MBRType = 0x02;\r
2021\r
2022 StrToGuid (SignatureStr, &SignatureGuid);\r
2023 CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
2024 } else {\r
2025 Hd->SignatureType = (UINT8) Strtoi (TypeStr);\r
2026 }\r
2027\r
2028 Strtoi64 (StartStr, &Hd->PartitionStart);\r
2029 Strtoi64 (SizeStr, &Hd->PartitionSize);\r
2030\r
2031 return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
2032}\r
2033\r
2034STATIC\r
2035EFI_DEVICE_PATH_PROTOCOL *\r
2036DevPathFromTextCDROM (\r
2037 IN CHAR16 *TextDeviceNode\r
2038 )\r
2039{\r
2040 CHAR16 *EntryStr;\r
2041 CHAR16 *StartStr;\r
2042 CHAR16 *SizeStr;\r
2043 CDROM_DEVICE_PATH *CDROM;\r
2044\r
2045 EntryStr = GetNextParamStr (&TextDeviceNode);\r
2046 StartStr = GetNextParamStr (&TextDeviceNode);\r
2047 SizeStr = GetNextParamStr (&TextDeviceNode);\r
2048 CDROM = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
2049 MEDIA_DEVICE_PATH,\r
2050 MEDIA_CDROM_DP,\r
2051 sizeof (CDROM_DEVICE_PATH)\r
2052 );\r
2053\r
2054 CDROM->BootEntry = (UINT32) Strtoi (EntryStr);\r
2055 Strtoi64 (StartStr, &CDROM->PartitionStart);\r
2056 Strtoi64 (SizeStr, &CDROM->PartitionSize);\r
2057\r
2058 return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;\r
2059}\r
2060\r
2061STATIC\r
2062EFI_DEVICE_PATH_PROTOCOL *\r
2063DevPathFromTextVenMEDIA (\r
2064 IN CHAR16 *TextDeviceNode\r
2065 )\r
2066{\r
2067 return ConvertFromTextVendor (\r
2068 TextDeviceNode,\r
2069 MEDIA_DEVICE_PATH,\r
2070 MEDIA_VENDOR_DP\r
2071 );\r
2072}\r
2073\r
2074STATIC\r
2075EFI_DEVICE_PATH_PROTOCOL *\r
2076DevPathFromTextFilePath (\r
2077 IN CHAR16 *TextDeviceNode\r
2078 )\r
2079{\r
2080 FILEPATH_DEVICE_PATH *File;\r
2081\r
2082 File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2083 MEDIA_DEVICE_PATH,\r
2084 MEDIA_FILEPATH_DP,\r
2085 (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)\r
2086 );\r
2087\r
2088 StrCpy (File->PathName, TextDeviceNode);\r
2089\r
2090 return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
2091}\r
2092\r
2093STATIC\r
2094EFI_DEVICE_PATH_PROTOCOL *\r
2095DevPathFromTextMedia (\r
2096 IN CHAR16 *TextDeviceNode\r
2097 )\r
2098{\r
2099 CHAR16 *GuidStr;\r
2100 MEDIA_PROTOCOL_DEVICE_PATH *Media;\r
2101\r
2102 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2103 Media = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
2104 MEDIA_DEVICE_PATH,\r
2105 MEDIA_PROTOCOL_DP,\r
2106 sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
2107 );\r
2108\r
2109 StrToGuid (GuidStr, &Media->Protocol);\r
2110\r
2111 return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
2112}\r
2113\r
2114STATIC\r
2115EFI_DEVICE_PATH_PROTOCOL *\r
2116DevPathFromTextFv (\r
2117 IN CHAR16 *TextDeviceNode\r
2118 )\r
2119{\r
2120 CHAR16 *GuidStr;\r
2121 MEDIA_FW_VOL_DEVICE_PATH *Fv;\r
2122\r
2123 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2124 Fv = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (\r
2125 MEDIA_DEVICE_PATH,\r
2126 MEDIA_PIWG_FW_VOL_DP,\r
2127 sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
2128 );\r
2129\r
2130 StrToGuid (GuidStr, &Fv->FvName);\r
2131\r
2132 return (EFI_DEVICE_PATH_PROTOCOL *) Fv;\r
2133}\r
2134\r
2135STATIC\r
2136EFI_DEVICE_PATH_PROTOCOL *\r
2137DevPathFromTextFvFile (\r
2138 IN CHAR16 *TextDeviceNode\r
2139 )\r
2140{\r
2141 CHAR16 *GuidStr;\r
2142 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;\r
2143\r
2144 GuidStr = GetNextParamStr (&TextDeviceNode);\r
2145 FvFile = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
2146 MEDIA_DEVICE_PATH,\r
2147 MEDIA_PIWG_FW_FILE_DP,\r
2148 sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
2149 );\r
2150\r
2151 StrToGuid (GuidStr, &FvFile->FvFileName);\r
2152\r
2153 return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;\r
2154}\r
2155\r
2156STATIC\r
2157EFI_DEVICE_PATH_PROTOCOL *\r
2158DevPathFromTextBBS (\r
2159 IN CHAR16 *TextDeviceNode\r
2160 )\r
2161{\r
2162 CHAR16 *TypeStr;\r
2163 CHAR16 *IdStr;\r
2164 CHAR16 *FlagsStr;\r
2165 CHAR8 *AsciiStr;\r
2166 BBS_BBS_DEVICE_PATH *Bbs;\r
2167\r
2168 TypeStr = GetNextParamStr (&TextDeviceNode);\r
2169 IdStr = GetNextParamStr (&TextDeviceNode);\r
2170 FlagsStr = GetNextParamStr (&TextDeviceNode);\r
2171 Bbs = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
2172 BBS_DEVICE_PATH,\r
2173 BBS_BBS_DP,\r
2174 (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))\r
2175 );\r
2176\r
2177 if (StrCmp (TypeStr, L"Floppy") == 0) {\r
2178 Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
2179 } else if (StrCmp (TypeStr, L"HD") == 0) {\r
2180 Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
2181 } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
2182 Bbs->DeviceType = BBS_TYPE_CDROM;\r
2183 } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
2184 Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
2185 } else if (StrCmp (TypeStr, L"USB") == 0) {\r
2186 Bbs->DeviceType = BBS_TYPE_USB;\r
2187 } else if (StrCmp (TypeStr, L"Network") == 0) {\r
2188 Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
2189 } else {\r
2190 Bbs->DeviceType = (UINT16) Strtoi (TypeStr);\r
2191 }\r
2192\r
2193 AsciiStr = Bbs->String;\r
2194 StrToAscii (IdStr, &AsciiStr);\r
2195\r
2196 Bbs->StatusFlag = (UINT16) Strtoi (FlagsStr);\r
2197\r
2198 return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
2199}\r
2200\r
2201STATIC\r
2202EFI_DEVICE_PATH_PROTOCOL *\r
2203DevPathFromTextSata (\r
2204 IN CHAR16 *TextDeviceNode\r
2205 )\r
2206{\r
2207 SATA_DEVICE_PATH *Sata;\r
2208 CHAR16 *Param1;\r
2209 CHAR16 *Param2;\r
2210 CHAR16 *Param3;\r
2211\r
2212 //\r
2213 // The PMPN is optional.\r
2214 //\r
2215 Param1 = GetNextParamStr (&TextDeviceNode);\r
2216 Param2 = GetNextParamStr (&TextDeviceNode);\r
2217 Param3 = NULL;\r
2218 if (!IS_NULL (TextDeviceNode)) {\r
2219 Param3 = GetNextParamStr (&TextDeviceNode);\r
2220 }\r
2221\r
2222 Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
2223 MESSAGING_DEVICE_PATH,\r
2224 MSG_SATA_DP,\r
2225 sizeof (SATA_DEVICE_PATH)\r
2226 );\r
2227 Sata->HBAPortNumber = (UINT16) Xtoi (Param1);\r
2228 if (Param3 != NULL) {\r
2229 Sata->PortMultiplierPortNumber = (UINT16) Xtoi (Param2);\r
2230 Param2 = Param3;\r
2231 } else {\r
2232 Sata->PortMultiplierPortNumber = 0;\r
2233 }\r
2234 Sata->Lun = (UINT16) Xtoi (Param2);\r
2235\r
2236 return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r
2237}\r
2238\r
2239GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {\r
2240 {L"Pci", DevPathFromTextPci},\r
2241 {L"PcCard", DevPathFromTextPcCard},\r
2242 {L"MemoryMapped", DevPathFromTextMemoryMapped},\r
2243 {L"VenHw", DevPathFromTextVenHw},\r
2244 {L"Ctrl", DevPathFromTextCtrl},\r
2245 {L"Acpi", DevPathFromTextAcpi},\r
2246 {L"PciRoot", DevPathFromTextPciRoot},\r
2247 {L"Floppy", DevPathFromTextFloppy},\r
2248 {L"Keyboard", DevPathFromTextKeyboard},\r
2249 {L"Serial", DevPathFromTextSerial},\r
2250 {L"ParallelPort", DevPathFromTextParallelPort},\r
2251 {L"AcpiEx", DevPathFromTextAcpiEx},\r
2252 {L"AcpiExp", DevPathFromTextAcpiExp},\r
2253 {L"Ata", DevPathFromTextAta},\r
2254 {L"Scsi", DevPathFromTextScsi},\r
2255 {L"Fibre", DevPathFromTextFibre},\r
2256 {L"I1394", DevPathFromText1394},\r
2257 {L"USB", DevPathFromTextUsb},\r
2258 {L"I2O", DevPathFromTextI2O},\r
2259 {L"Infiniband", DevPathFromTextInfiniband},\r
2260 {L"VenMsg", DevPathFromTextVenMsg},\r
2261 {L"VenPcAnsi", DevPathFromTextVenPcAnsi},\r
2262 {L"VenVt100", DevPathFromTextVenVt100},\r
2263 {L"VenVt100Plus", DevPathFromTextVenVt100Plus},\r
2264 {L"VenUtf8", DevPathFromTextVenUtf8},\r
2265 {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
2266 {L"SAS", DevPathFromTextSAS},\r
2267 {L"DebugPort", DevPathFromTextDebugPort},\r
2268 {L"MAC", DevPathFromTextMAC},\r
2269 {L"IPv4", DevPathFromTextIPv4},\r
2270 {L"IPv6", DevPathFromTextIPv6},\r
2271 {L"Uart", DevPathFromTextUart},\r
2272 {L"UsbClass", DevPathFromTextUsbClass},\r
2273 {L"UsbAudio", DevPathFromTextUsbAudio},\r
2274 {L"UsbCDCControl", DevPathFromTextUsbCDCControl},\r
2275 {L"UsbHID", DevPathFromTextUsbHID},\r
2276 {L"UsbImage", DevPathFromTextUsbImage},\r
2277 {L"UsbPrinter", DevPathFromTextUsbPrinter},\r
2278 {L"UsbMassStorage", DevPathFromTextUsbMassStorage},\r
2279 {L"UsbHub", DevPathFromTextUsbHub},\r
2280 {L"UsbCDCData", DevPathFromTextUsbCDCData},\r
2281 {L"UsbSmartCard", DevPathFromTextUsbSmartCard},\r
2282 {L"UsbVideo", DevPathFromTextUsbVideo},\r
2283 {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},\r
2284 {L"UsbWireless", DevPathFromTextUsbWireless},\r
2285 {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},\r
2286 {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},\r
2287 {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},\r
2288 {L"UsbWwid", DevPathFromTextUsbWwid},\r
2289 {L"Unit", DevPathFromTextUnit},\r
2290 {L"iSCSI", DevPathFromTextiSCSI},\r
2291 {L"HD", DevPathFromTextHD},\r
2292 {L"CDROM", DevPathFromTextCDROM},\r
2293 {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
2294 {L"Media", DevPathFromTextMedia},\r
2295 {L"Fv", DevPathFromTextFv},\r
2296 {L"FvFile", DevPathFromTextFvFile},\r
2297 {L"BBS", DevPathFromTextBBS},\r
2298 {L"Sata", DevPathFromTextSata},\r
2299 {NULL, NULL}\r
2300};\r
2301\r
2302EFI_DEVICE_PATH_PROTOCOL *\r
2303ConvertTextToDeviceNode (\r
2304 IN CONST CHAR16 *TextDeviceNode\r
2305 )\r
2306/*++\r
2307\r
2308 Routine Description:\r
2309 Convert text to the binary representation of a device node.\r
2310\r
2311 Arguments:\r
2312 TextDeviceNode - TextDeviceNode points to the text representation of a device\r
2313 node. Conversion starts with the first character and continues\r
2314 until the first non-device node character.\r
2315\r
2316 Returns:\r
2317 A pointer - Pointer to the EFI device node.\r
2318 NULL - If TextDeviceNode is NULL or there was insufficient memory or text unsupported.\r
2319\r
2320--*/\r
2321{\r
2322 EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
2323 CHAR16 *ParamStr;\r
2324 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2325 CHAR16 *DeviceNodeStr;\r
2326 UINTN Index;\r
2327\r
2328 if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
2329 return NULL;\r
2330 }\r
2331\r
2332 ParamStr = NULL;\r
2333 DumpNode = NULL;\r
2334 DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
2335\r
2336 for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
2337 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2338 if (ParamStr != NULL) {\r
2339 DumpNode = DevPathFromTextTable[Index].Function;\r
2340 break;\r
2341 }\r
2342 }\r
2343\r
2344 if (DumpNode == NULL) {\r
2345 //\r
2346 // A file path\r
2347 //\r
2348 DumpNode = DevPathFromTextFilePath;\r
2349 DeviceNode = DumpNode (DeviceNodeStr);\r
2350 } else {\r
2351 DeviceNode = DumpNode (ParamStr);\r
2352 FreePool (ParamStr);\r
2353 }\r
2354\r
2355 FreePool (DeviceNodeStr);\r
2356\r
2357 return DeviceNode;\r
2358}\r
2359\r
2360EFI_DEVICE_PATH_PROTOCOL *\r
2361ConvertTextToDevicePath (\r
2362 IN CONST CHAR16 *TextDevicePath\r
2363 )\r
2364/*++\r
2365\r
2366 Routine Description:\r
2367 Convert text to the binary representation of a device path.\r
2368\r
2369 Arguments:\r
2370 TextDevicePath - TextDevicePath points to the text representation of a device\r
2371 path. Conversion starts with the first character and continues\r
2372 until the first non-device node character.\r
2373\r
2374 Returns:\r
2375 A pointer - Pointer to the allocated device path.\r
2376 NULL - If TextDeviceNode is NULL or there was insufficient memory.\r
2377\r
2378--*/\r
2379{\r
2380 EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
2381 CHAR16 *ParamStr;\r
2382 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
2383 UINTN Index;\r
2384 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
2385 CHAR16 *DevicePathStr;\r
2386 CHAR16 *Str;\r
2387 CHAR16 *DeviceNodeStr;\r
2388 UINT8 IsInstanceEnd;\r
2389 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
2390\r
2391 if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
2392 return NULL;\r
2393 }\r
2394\r
2395 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
2396 SetDevicePathEndNode (DevicePath);\r
2397\r
2398 ParamStr = NULL;\r
2399 DeviceNodeStr = NULL;\r
2400 DevicePathStr = StrDuplicate (TextDevicePath);\r
2401\r
2402 Str = DevicePathStr;\r
2403 while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
2404 DumpNode = NULL;\r
2405 for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
2406 ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
2407 if (ParamStr != NULL) {\r
2408 DumpNode = DevPathFromTextTable[Index].Function;\r
2409 break;\r
2410 }\r
2411 }\r
2412\r
2413 if (DumpNode == NULL) {\r
2414 //\r
2415 // A file path\r
2416 //\r
2417 DumpNode = DevPathFromTextFilePath;\r
2418 DeviceNode = DumpNode (DeviceNodeStr);\r
2419 } else {\r
2420 DeviceNode = DumpNode (ParamStr);\r
2421 FreePool (ParamStr);\r
2422 }\r
2423\r
2424 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2425 FreePool (DevicePath);\r
2426 FreePool (DeviceNode);\r
2427 DevicePath = NewDevicePath;\r
2428\r
2429 if (IsInstanceEnd) {\r
2430 DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
2431 SetDevicePathInstanceEndNode (DeviceNode);\r
2432\r
2433 NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
2434 FreePool (DevicePath);\r
2435 FreePool (DeviceNode);\r
2436 DevicePath = NewDevicePath;\r
2437 }\r
2438 }\r
2439\r
2440 FreePool (DevicePathStr);\r
2441 return DevicePath;\r
2442}\r