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