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