Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libefivar/efivar-dp-parse.c
103755 views
1
/*-
2
* Copyright (c) 2017 Netflix, Inc.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
6
* are met:
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
12
*
13
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23
* SUCH DAMAGE.
24
*/
25
26
/*
27
* Routines to format EFI_DEVICE_PATHs from the UEFI standard. Much of
28
* this file is taken from EDK2 and rototilled.
29
*/
30
31
#include <ctype.h>
32
#include <efivar.h>
33
#include <stdio.h>
34
#include <string.h>
35
#include <wchar.h>
36
37
#include "efichar.h"
38
#include "efivar-dp.h"
39
#include "uefi-dplib.h"
40
41
/* XXX STUBS -- this stuff doesn't work yet */
42
#define StrToIpv4Address(str, unk, ipv4ptr, unk2) (void)(str)
43
#define StrToIpv6Address(str, unk, ipv6ptr, unk2) (void)(str)
44
45
/*
46
* OK. Now this is evil. Can't typedef it again. Sure beats changing them all.
47
* Since we're doing it all as narrow characters since wchar_t can't be used on
48
* FreeBSD and CHAR16 strings generally aren't a good fit. Since this parsing
49
* doesn't need Unicode for anything, this works out well.
50
*/
51
#define CHAR16 char
52
53
/*
54
* Taken from MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
55
*/
56
57
/** @file
58
DevicePathFromText protocol as defined in the UEFI 2.0 specification.
59
60
Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
61
SPDX-License-Identifier: BSD-2-Clause-Patent
62
63
**/
64
65
// #include "UefiDevicePathLib.h"
66
67
/**
68
69
Duplicates a string.
70
71
@param Src Source string.
72
73
@return The duplicated string.
74
75
**/
76
static
77
CHAR16 *
78
UefiDevicePathLibStrDuplicate (
79
IN CONST CHAR16 *Src
80
)
81
{
82
return AllocateCopyPool (StrSize (Src), Src);
83
}
84
85
/**
86
87
Get parameter in a pair of parentheses follow the given node name.
88
For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
89
90
@param Str Device Path Text.
91
@param NodeName Name of the node.
92
93
@return Parameter text for the node.
94
95
**/
96
static
97
CHAR16 *
98
GetParamByNodeName (
99
IN CHAR16 *Str,
100
IN const CHAR16 *NodeName
101
)
102
{
103
CHAR16 *ParamStr;
104
CHAR16 *StrPointer;
105
UINTN NodeNameLength;
106
UINTN ParameterLength;
107
108
//
109
// Check whether the node name matchs
110
//
111
NodeNameLength = StrLen (NodeName);
112
if (StrnCmp (Str, NodeName, NodeNameLength) != 0) {
113
return NULL;
114
}
115
116
ParamStr = Str + NodeNameLength;
117
if (!IS_LEFT_PARENTH (*ParamStr)) {
118
return NULL;
119
}
120
121
//
122
// Skip the found '(' and find first occurrence of ')'
123
//
124
ParamStr++;
125
ParameterLength = 0;
126
StrPointer = ParamStr;
127
while (!IS_NULL (*StrPointer)) {
128
if (IS_RIGHT_PARENTH (*StrPointer)) {
129
break;
130
}
131
132
StrPointer++;
133
ParameterLength++;
134
}
135
136
if (IS_NULL (*StrPointer)) {
137
//
138
// ')' not found
139
//
140
return NULL;
141
}
142
143
ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
144
if (ParamStr == NULL) {
145
return NULL;
146
}
147
148
//
149
// Terminate the parameter string
150
//
151
ParamStr[ParameterLength] = '\0';
152
153
return ParamStr;
154
}
155
156
/**
157
Gets current sub-string from a string list, before return
158
the list header is moved to next sub-string. The sub-string is separated
159
by the specified character. For example, the separator is ',', the string
160
list is "2,0,3", it returns "2", the remain list move to "0,3"
161
162
@param List A string list separated by the specified separator
163
@param Separator The separator character
164
165
@return A pointer to the current sub-string
166
167
**/
168
static
169
CHAR16 *
170
SplitStr (
171
IN OUT CHAR16 **List,
172
IN CHAR16 Separator
173
)
174
{
175
CHAR16 *Str;
176
CHAR16 *ReturnStr;
177
178
Str = *List;
179
ReturnStr = Str;
180
181
if (IS_NULL (*Str)) {
182
return ReturnStr;
183
}
184
185
//
186
// Find first occurrence of the separator
187
//
188
while (!IS_NULL (*Str)) {
189
if (*Str == Separator) {
190
break;
191
}
192
193
Str++;
194
}
195
196
if (*Str == Separator) {
197
//
198
// Find a sub-string, terminate it
199
//
200
*Str = '\0';
201
Str++;
202
}
203
204
//
205
// Move to next sub-string
206
//
207
*List = Str;
208
209
return ReturnStr;
210
}
211
212
/**
213
Gets the next parameter string from the list.
214
215
@param List A string list separated by the specified separator
216
217
@return A pointer to the current sub-string
218
219
**/
220
static
221
CHAR16 *
222
GetNextParamStr (
223
IN OUT CHAR16 **List
224
)
225
{
226
//
227
// The separator is comma
228
//
229
return SplitStr (List, ',');
230
}
231
232
/**
233
Get one device node from entire device path text.
234
235
@param DevicePath On input, the current Device Path node; on output, the next device path node
236
@param IsInstanceEnd This node is the end of a device path instance
237
238
@return A device node text or NULL if no more device node available
239
240
**/
241
static
242
CHAR16 *
243
GetNextDeviceNodeStr (
244
IN OUT CHAR16 **DevicePath,
245
OUT BOOLEAN *IsInstanceEnd
246
)
247
{
248
CHAR16 *Str;
249
CHAR16 *ReturnStr;
250
UINTN ParenthesesStack;
251
252
Str = *DevicePath;
253
if (IS_NULL (*Str)) {
254
return NULL;
255
}
256
257
//
258
// Skip the leading '/', '(', ')' and ','
259
//
260
while (!IS_NULL (*Str)) {
261
if (!IS_SLASH (*Str) &&
262
!IS_COMMA (*Str) &&
263
!IS_LEFT_PARENTH (*Str) &&
264
!IS_RIGHT_PARENTH (*Str))
265
{
266
break;
267
}
268
269
Str++;
270
}
271
272
ReturnStr = Str;
273
274
//
275
// Scan for the separator of this device node, '/' or ','
276
//
277
ParenthesesStack = 0;
278
while (!IS_NULL (*Str)) {
279
if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
280
break;
281
}
282
283
if (IS_LEFT_PARENTH (*Str)) {
284
ParenthesesStack++;
285
} else if (IS_RIGHT_PARENTH (*Str)) {
286
ParenthesesStack--;
287
}
288
289
Str++;
290
}
291
292
if (ParenthesesStack != 0) {
293
//
294
// The '(' doesn't pair with ')', invalid device path text
295
//
296
return NULL;
297
}
298
299
if (IS_COMMA (*Str)) {
300
*IsInstanceEnd = TRUE;
301
*Str = '\0';
302
Str++;
303
} else {
304
*IsInstanceEnd = FALSE;
305
if (!IS_NULL (*Str)) {
306
*Str = '\0';
307
Str++;
308
}
309
}
310
311
*DevicePath = Str;
312
313
return ReturnStr;
314
}
315
316
#ifndef __FreeBSD__
317
/**
318
Return whether the integer string is a hex string.
319
320
@param Str The integer string
321
322
@retval TRUE Hex string
323
@retval FALSE Decimal string
324
325
**/
326
static
327
BOOLEAN
328
IsHexStr (
329
IN CHAR16 *Str
330
)
331
{
332
//
333
// skip preceeding white space
334
//
335
while (*Str == ' ') {
336
Str++;
337
}
338
339
//
340
// skip preceeding zeros
341
//
342
while (*Str == '0') {
343
Str++;
344
}
345
346
return (BOOLEAN)(*Str == 'x' || *Str == 'X');
347
}
348
349
/**
350
351
Convert integer string to uint.
352
353
@param Str The integer string. If leading with "0x" or "0X", it's hexadecimal.
354
355
@return A UINTN value represented by Str
356
357
**/
358
static
359
UINTN
360
Strtoi (
361
IN CHAR16 *Str
362
)
363
{
364
if (IsHexStr (Str)) {
365
return StrHexToUintn (Str);
366
} else {
367
return StrDecimalToUintn (Str);
368
}
369
}
370
371
/**
372
373
Convert integer string to 64 bit data.
374
375
@param Str The integer string. If leading with "0x" or "0X", it's hexadecimal.
376
@param Data A pointer to the UINT64 value represented by Str
377
378
**/
379
static
380
VOID
381
Strtoi64 (
382
IN CHAR16 *Str,
383
OUT UINT64 *Data
384
)
385
{
386
if (IsHexStr (Str)) {
387
*Data = StrHexToUint64 (Str);
388
} else {
389
*Data = StrDecimalToUint64 (Str);
390
}
391
}
392
#endif
393
394
/**
395
Converts a Unicode string to ASCII string.
396
397
@param Str The equivalent Unicode string
398
@param AsciiStr On input, it points to destination ASCII string buffer; on output, it points
399
to the next ASCII string next to it
400
401
**/
402
static
403
VOID
404
StrToAscii (
405
IN CHAR16 *Str,
406
IN OUT CHAR8 **AsciiStr
407
)
408
{
409
CHAR8 *Dest;
410
411
Dest = *AsciiStr;
412
while (!IS_NULL (*Str)) {
413
*(Dest++) = (CHAR8)*(Str++);
414
}
415
416
*Dest = 0;
417
418
//
419
// Return the string next to it
420
//
421
*AsciiStr = Dest + 1;
422
}
423
424
/**
425
Converts a generic text device path node to device path structure.
426
427
@param Type The type of the device path node.
428
@param TextDeviceNode The input text device path node.
429
430
@return A pointer to device path structure.
431
**/
432
static
433
EFI_DEVICE_PATH_PROTOCOL *
434
DevPathFromTextGenericPath (
435
IN UINT8 Type,
436
IN CHAR16 *TextDeviceNode
437
)
438
{
439
EFI_DEVICE_PATH_PROTOCOL *Node;
440
CHAR16 *SubtypeStr;
441
CHAR16 *DataStr;
442
UINTN DataLength;
443
444
SubtypeStr = GetNextParamStr (&TextDeviceNode);
445
DataStr = GetNextParamStr (&TextDeviceNode);
446
447
if (DataStr == NULL) {
448
DataLength = 0;
449
} else {
450
DataLength = StrLen (DataStr) / 2;
451
}
452
453
Node = CreateDeviceNode (
454
Type,
455
(UINT8)Strtoi (SubtypeStr),
456
(UINT16)(sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)
457
);
458
459
if (Node != NULL) {
460
StrHexToBytes (DataStr, DataLength * 2, (UINT8 *)(Node + 1), DataLength);
461
}
462
463
return Node;
464
}
465
466
/**
467
Converts a generic text device path node to device path structure.
468
469
@param TextDeviceNode The input Text device path node.
470
471
@return A pointer to device path structure.
472
473
**/
474
static
475
EFI_DEVICE_PATH_PROTOCOL *
476
DevPathFromTextPath (
477
IN CHAR16 *TextDeviceNode
478
)
479
{
480
CHAR16 *TypeStr;
481
482
TypeStr = GetNextParamStr (&TextDeviceNode);
483
484
return DevPathFromTextGenericPath ((UINT8)Strtoi (TypeStr), TextDeviceNode);
485
}
486
487
/**
488
Converts a generic hardware text device path node to Hardware device path structure.
489
490
@param TextDeviceNode The input Text device path node.
491
492
@return A pointer to Hardware device path structure.
493
494
**/
495
static
496
EFI_DEVICE_PATH_PROTOCOL *
497
DevPathFromTextHardwarePath (
498
IN CHAR16 *TextDeviceNode
499
)
500
{
501
return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);
502
}
503
504
/**
505
Converts a text device path node to Hardware PCI device path structure.
506
507
@param TextDeviceNode The input Text device path node.
508
509
@return A pointer to Hardware PCI device path structure.
510
511
**/
512
static
513
EFI_DEVICE_PATH_PROTOCOL *
514
DevPathFromTextPci (
515
IN CHAR16 *TextDeviceNode
516
)
517
{
518
CHAR16 *FunctionStr;
519
CHAR16 *DeviceStr;
520
PCI_DEVICE_PATH *Pci;
521
522
DeviceStr = GetNextParamStr (&TextDeviceNode);
523
FunctionStr = GetNextParamStr (&TextDeviceNode);
524
Pci = (PCI_DEVICE_PATH *)CreateDeviceNode (
525
HARDWARE_DEVICE_PATH,
526
HW_PCI_DP,
527
(UINT16)sizeof (PCI_DEVICE_PATH)
528
);
529
530
if (Pci != NULL) {
531
Pci->Function = (UINT8)Strtoi (FunctionStr);
532
Pci->Device = (UINT8)Strtoi (DeviceStr);
533
}
534
535
return (EFI_DEVICE_PATH_PROTOCOL *)Pci;
536
}
537
538
/**
539
Converts a text device path node to Hardware PC card device path structure.
540
541
@param TextDeviceNode The input Text device path node.
542
543
@return A pointer to Hardware PC card device path structure.
544
545
**/
546
static
547
EFI_DEVICE_PATH_PROTOCOL *
548
DevPathFromTextPcCard (
549
IN CHAR16 *TextDeviceNode
550
)
551
{
552
CHAR16 *FunctionNumberStr;
553
PCCARD_DEVICE_PATH *Pccard;
554
555
FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
556
Pccard = (PCCARD_DEVICE_PATH *)CreateDeviceNode (
557
HARDWARE_DEVICE_PATH,
558
HW_PCCARD_DP,
559
(UINT16)sizeof (PCCARD_DEVICE_PATH)
560
);
561
562
if (Pccard != NULL) {
563
Pccard->FunctionNumber = (UINT8)Strtoi (FunctionNumberStr);
564
}
565
566
return (EFI_DEVICE_PATH_PROTOCOL *)Pccard;
567
}
568
569
/**
570
Converts a text device path node to Hardware memory map device path structure.
571
572
@param TextDeviceNode The input Text device path node.
573
574
@return A pointer to Hardware memory map device path structure.
575
576
**/
577
static
578
EFI_DEVICE_PATH_PROTOCOL *
579
DevPathFromTextMemoryMapped (
580
IN CHAR16 *TextDeviceNode
581
)
582
{
583
CHAR16 *MemoryTypeStr;
584
CHAR16 *StartingAddressStr;
585
CHAR16 *EndingAddressStr;
586
MEMMAP_DEVICE_PATH *MemMap;
587
588
MemoryTypeStr = GetNextParamStr (&TextDeviceNode);
589
StartingAddressStr = GetNextParamStr (&TextDeviceNode);
590
EndingAddressStr = GetNextParamStr (&TextDeviceNode);
591
MemMap = (MEMMAP_DEVICE_PATH *)CreateDeviceNode (
592
HARDWARE_DEVICE_PATH,
593
HW_MEMMAP_DP,
594
(UINT16)sizeof (MEMMAP_DEVICE_PATH)
595
);
596
597
if (MemMap != NULL) {
598
MemMap->MemoryType = (UINT32)Strtoi (MemoryTypeStr);
599
Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);
600
Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);
601
}
602
603
return (EFI_DEVICE_PATH_PROTOCOL *)MemMap;
604
}
605
606
/**
607
Converts a text device path node to Vendor device path structure based on the input Type
608
and SubType.
609
610
@param TextDeviceNode The input Text device path node.
611
@param Type The type of device path node.
612
@param SubType The subtype of device path node.
613
614
@return A pointer to the newly-created Vendor device path structure.
615
616
**/
617
static
618
EFI_DEVICE_PATH_PROTOCOL *
619
ConvertFromTextVendor (
620
IN CHAR16 *TextDeviceNode,
621
IN UINT8 Type,
622
IN UINT8 SubType
623
)
624
{
625
CHAR16 *GuidStr;
626
CHAR16 *DataStr;
627
UINTN Length;
628
VENDOR_DEVICE_PATH *Vendor;
629
630
GuidStr = GetNextParamStr (&TextDeviceNode);
631
632
DataStr = GetNextParamStr (&TextDeviceNode);
633
Length = StrLen (DataStr);
634
//
635
// Two hex characters make up 1 buffer byte
636
//
637
Length = (Length + 1) / 2;
638
639
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
640
Type,
641
SubType,
642
(UINT16)(sizeof (VENDOR_DEVICE_PATH) + Length)
643
);
644
645
if (Vendor != NULL) {
646
StrToGuid (GuidStr, &Vendor->Guid);
647
StrHexToBytes (DataStr, Length * 2, (UINT8 *)(Vendor + 1), Length);
648
}
649
650
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
651
}
652
653
/**
654
Converts a text device path node to Vendor Hardware device path structure.
655
656
@param TextDeviceNode The input Text device path node.
657
658
@return A pointer to the newly-created Vendor Hardware device path structure.
659
660
**/
661
static
662
EFI_DEVICE_PATH_PROTOCOL *
663
DevPathFromTextVenHw (
664
IN CHAR16 *TextDeviceNode
665
)
666
{
667
return ConvertFromTextVendor (
668
TextDeviceNode,
669
HARDWARE_DEVICE_PATH,
670
HW_VENDOR_DP
671
);
672
}
673
674
/**
675
Converts a text device path node to Hardware Controller device path structure.
676
677
@param TextDeviceNode The input Text device path node.
678
679
@return A pointer to the newly-created Hardware Controller device path structure.
680
681
**/
682
static
683
EFI_DEVICE_PATH_PROTOCOL *
684
DevPathFromTextCtrl (
685
IN CHAR16 *TextDeviceNode
686
)
687
{
688
CHAR16 *ControllerStr;
689
CONTROLLER_DEVICE_PATH *Controller;
690
691
ControllerStr = GetNextParamStr (&TextDeviceNode);
692
Controller = (CONTROLLER_DEVICE_PATH *)CreateDeviceNode (
693
HARDWARE_DEVICE_PATH,
694
HW_CONTROLLER_DP,
695
(UINT16)sizeof (CONTROLLER_DEVICE_PATH)
696
);
697
698
if (Controller != NULL) {
699
Controller->ControllerNumber = (UINT32)Strtoi (ControllerStr);
700
}
701
702
return (EFI_DEVICE_PATH_PROTOCOL *)Controller;
703
}
704
705
/**
706
Converts a text device path node to BMC device path structure.
707
708
@param TextDeviceNode The input Text device path node.
709
710
@return A pointer to the newly-created BMC device path structure.
711
712
**/
713
static
714
EFI_DEVICE_PATH_PROTOCOL *
715
DevPathFromTextBmc (
716
IN CHAR16 *TextDeviceNode
717
)
718
{
719
CHAR16 *InterfaceTypeStr;
720
CHAR16 *BaseAddressStr;
721
BMC_DEVICE_PATH *BmcDp;
722
723
InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);
724
BaseAddressStr = GetNextParamStr (&TextDeviceNode);
725
BmcDp = (BMC_DEVICE_PATH *)CreateDeviceNode (
726
HARDWARE_DEVICE_PATH,
727
HW_BMC_DP,
728
(UINT16)sizeof (BMC_DEVICE_PATH)
729
);
730
731
if (BmcDp != NULL) {
732
BmcDp->InterfaceType = (UINT8)Strtoi (InterfaceTypeStr);
733
WriteUnaligned64 (
734
(UINT64 *)(&BmcDp->BaseAddress),
735
StrHexToUint64 (BaseAddressStr)
736
);
737
}
738
739
return (EFI_DEVICE_PATH_PROTOCOL *)BmcDp;
740
}
741
742
/**
743
Converts a generic ACPI text device path node to ACPI device path structure.
744
745
@param TextDeviceNode The input Text device path node.
746
747
@return A pointer to ACPI device path structure.
748
749
**/
750
static
751
EFI_DEVICE_PATH_PROTOCOL *
752
DevPathFromTextAcpiPath (
753
IN CHAR16 *TextDeviceNode
754
)
755
{
756
return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);
757
}
758
759
/**
760
Converts a string to EisaId.
761
762
@param Text The input string.
763
764
@return UINT32 EISA ID.
765
**/
766
static
767
UINT32
768
EisaIdFromText (
769
IN CHAR16 *Text
770
)
771
{
772
return (((Text[0] - 'A' + 1) & 0x1f) << 10)
773
+ (((Text[1] - 'A' + 1) & 0x1f) << 5)
774
+ (((Text[2] - 'A' + 1) & 0x1f) << 0)
775
+ (UINT32)(StrHexToUintn (&Text[3]) << 16)
776
;
777
}
778
779
/**
780
Converts a text device path node to ACPI HID device path structure.
781
782
@param TextDeviceNode The input Text device path node.
783
784
@return A pointer to the newly-created ACPI HID device path structure.
785
786
**/
787
static
788
EFI_DEVICE_PATH_PROTOCOL *
789
DevPathFromTextAcpi (
790
IN CHAR16 *TextDeviceNode
791
)
792
{
793
CHAR16 *HIDStr;
794
CHAR16 *UIDStr;
795
ACPI_HID_DEVICE_PATH *Acpi;
796
797
HIDStr = GetNextParamStr (&TextDeviceNode);
798
UIDStr = GetNextParamStr (&TextDeviceNode);
799
Acpi = (ACPI_HID_DEVICE_PATH *)CreateDeviceNode (
800
ACPI_DEVICE_PATH,
801
ACPI_DP,
802
(UINT16)sizeof (ACPI_HID_DEVICE_PATH)
803
);
804
805
if (Acpi != NULL) {
806
Acpi->HID = EisaIdFromText (HIDStr);
807
Acpi->UID = (UINT32)Strtoi (UIDStr);
808
}
809
810
return (EFI_DEVICE_PATH_PROTOCOL *)Acpi;
811
}
812
813
/**
814
Converts a text device path node to ACPI HID device path structure.
815
816
@param TextDeviceNode The input Text device path node.
817
@param PnPId The input plug and play identification.
818
819
@return A pointer to the newly-created ACPI HID device path structure.
820
821
**/
822
static
823
EFI_DEVICE_PATH_PROTOCOL *
824
ConvertFromTextAcpi (
825
IN CHAR16 *TextDeviceNode,
826
IN UINT32 PnPId
827
)
828
{
829
CHAR16 *UIDStr;
830
ACPI_HID_DEVICE_PATH *Acpi;
831
832
UIDStr = GetNextParamStr (&TextDeviceNode);
833
Acpi = (ACPI_HID_DEVICE_PATH *)CreateDeviceNode (
834
ACPI_DEVICE_PATH,
835
ACPI_DP,
836
(UINT16)sizeof (ACPI_HID_DEVICE_PATH)
837
);
838
839
if (Acpi != NULL) {
840
Acpi->HID = EFI_PNP_ID (PnPId);
841
Acpi->UID = (UINT32)Strtoi (UIDStr);
842
}
843
844
return (EFI_DEVICE_PATH_PROTOCOL *)Acpi;
845
}
846
847
/**
848
Converts a text device path node to PCI root device path structure.
849
850
@param TextDeviceNode The input Text device path node.
851
852
@return A pointer to the newly-created PCI root device path structure.
853
854
**/
855
static
856
EFI_DEVICE_PATH_PROTOCOL *
857
DevPathFromTextPciRoot (
858
IN CHAR16 *TextDeviceNode
859
)
860
{
861
return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);
862
}
863
864
/**
865
Converts a text device path node to PCIE root device path structure.
866
867
@param TextDeviceNode The input Text device path node.
868
869
@return A pointer to the newly-created PCIE root device path structure.
870
871
**/
872
static
873
EFI_DEVICE_PATH_PROTOCOL *
874
DevPathFromTextPcieRoot (
875
IN CHAR16 *TextDeviceNode
876
)
877
{
878
return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);
879
}
880
881
/**
882
Converts a text device path node to Floppy device path structure.
883
884
@param TextDeviceNode The input Text device path node.
885
886
@return A pointer to the newly-created Floppy device path structure.
887
888
**/
889
static
890
EFI_DEVICE_PATH_PROTOCOL *
891
DevPathFromTextFloppy (
892
IN CHAR16 *TextDeviceNode
893
)
894
{
895
return ConvertFromTextAcpi (TextDeviceNode, 0x0604);
896
}
897
898
/**
899
Converts a text device path node to Keyboard device path structure.
900
901
@param TextDeviceNode The input Text device path node.
902
903
@return A pointer to the newly-created Keyboard device path structure.
904
905
**/
906
static
907
EFI_DEVICE_PATH_PROTOCOL *
908
DevPathFromTextKeyboard (
909
IN CHAR16 *TextDeviceNode
910
)
911
{
912
return ConvertFromTextAcpi (TextDeviceNode, 0x0301);
913
}
914
915
/**
916
Converts a text device path node to Serial device path structure.
917
918
@param TextDeviceNode The input Text device path node.
919
920
@return A pointer to the newly-created Serial device path structure.
921
922
**/
923
static
924
EFI_DEVICE_PATH_PROTOCOL *
925
DevPathFromTextSerial (
926
IN CHAR16 *TextDeviceNode
927
)
928
{
929
return ConvertFromTextAcpi (TextDeviceNode, 0x0501);
930
}
931
932
/**
933
Converts a text device path node to Parallel Port device path structure.
934
935
@param TextDeviceNode The input Text device path node.
936
937
@return A pointer to the newly-created Parallel Port device path structure.
938
939
**/
940
static
941
EFI_DEVICE_PATH_PROTOCOL *
942
DevPathFromTextParallelPort (
943
IN CHAR16 *TextDeviceNode
944
)
945
{
946
return ConvertFromTextAcpi (TextDeviceNode, 0x0401);
947
}
948
949
/**
950
Converts a text device path node to ACPI extension device path structure.
951
952
@param TextDeviceNode The input Text device path node.
953
954
@return A pointer to the newly-created ACPI extension device path structure.
955
956
**/
957
static
958
EFI_DEVICE_PATH_PROTOCOL *
959
DevPathFromTextAcpiEx (
960
IN CHAR16 *TextDeviceNode
961
)
962
{
963
CHAR16 *HIDStr;
964
CHAR16 *CIDStr;
965
CHAR16 *UIDStr;
966
CHAR16 *HIDSTRStr;
967
CHAR16 *CIDSTRStr;
968
CHAR16 *UIDSTRStr;
969
CHAR8 *AsciiStr;
970
UINT16 Length;
971
ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;
972
973
HIDStr = GetNextParamStr (&TextDeviceNode);
974
CIDStr = GetNextParamStr (&TextDeviceNode);
975
UIDStr = GetNextParamStr (&TextDeviceNode);
976
HIDSTRStr = GetNextParamStr (&TextDeviceNode);
977
CIDSTRStr = GetNextParamStr (&TextDeviceNode);
978
UIDSTRStr = GetNextParamStr (&TextDeviceNode);
979
980
Length = (UINT16)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);
981
Length = (UINT16)(Length + StrLen (UIDSTRStr) + 1);
982
Length = (UINT16)(Length + StrLen (CIDSTRStr) + 1);
983
AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *)CreateDeviceNode (
984
ACPI_DEVICE_PATH,
985
ACPI_EXTENDED_DP,
986
Length
987
);
988
989
if (AcpiEx != NULL) {
990
AcpiEx->HID = EisaIdFromText (HIDStr);
991
AcpiEx->CID = EisaIdFromText (CIDStr);
992
AcpiEx->UID = (UINT32)Strtoi (UIDStr);
993
994
AsciiStr = (CHAR8 *)((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
995
StrToAscii (HIDSTRStr, &AsciiStr);
996
StrToAscii (UIDSTRStr, &AsciiStr);
997
StrToAscii (CIDSTRStr, &AsciiStr);
998
}
999
1000
return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
1001
}
1002
1003
/**
1004
Converts a text device path node to ACPI extension device path structure.
1005
1006
@param TextDeviceNode The input Text device path node.
1007
1008
@return A pointer to the newly-created ACPI extension device path structure.
1009
1010
**/
1011
static
1012
EFI_DEVICE_PATH_PROTOCOL *
1013
DevPathFromTextAcpiExp (
1014
IN CHAR16 *TextDeviceNode
1015
)
1016
{
1017
CHAR16 *HIDStr;
1018
CHAR16 *CIDStr;
1019
CHAR16 *UIDSTRStr;
1020
CHAR8 *AsciiStr;
1021
UINT16 Length;
1022
ACPI_EXTENDED_HID_DEVICE_PATH *AcpiEx;
1023
1024
HIDStr = GetNextParamStr (&TextDeviceNode);
1025
CIDStr = GetNextParamStr (&TextDeviceNode);
1026
UIDSTRStr = GetNextParamStr (&TextDeviceNode);
1027
Length = (UINT16)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);
1028
AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *)CreateDeviceNode (
1029
ACPI_DEVICE_PATH,
1030
ACPI_EXTENDED_DP,
1031
Length
1032
);
1033
1034
if (AcpiEx == NULL) {
1035
return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
1036
}
1037
1038
AcpiEx->HID = EisaIdFromText (HIDStr);
1039
//
1040
// According to UEFI spec, the CID parameter is optional and has a default value of 0.
1041
// So when the CID parameter is not specified or specified as 0 in the text device node.
1042
// Set the CID to 0 in the ACPI extension device path structure.
1043
//
1044
if ((*CIDStr == '\0') || (*CIDStr == '0')) {
1045
AcpiEx->CID = 0;
1046
} else {
1047
AcpiEx->CID = EisaIdFromText (CIDStr);
1048
}
1049
1050
AcpiEx->UID = 0;
1051
1052
AsciiStr = (CHAR8 *)((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
1053
//
1054
// HID string is NULL
1055
//
1056
*AsciiStr = '\0';
1057
//
1058
// Convert UID string
1059
//
1060
AsciiStr++;
1061
StrToAscii (UIDSTRStr, &AsciiStr);
1062
//
1063
// CID string is NULL
1064
//
1065
*AsciiStr = '\0';
1066
1067
return (EFI_DEVICE_PATH_PROTOCOL *)AcpiEx;
1068
}
1069
1070
/**
1071
Converts a text device path node to ACPI _ADR device path structure.
1072
1073
@param TextDeviceNode The input Text device path node.
1074
1075
@return A pointer to the newly-created ACPI _ADR device path structure.
1076
1077
**/
1078
static
1079
EFI_DEVICE_PATH_PROTOCOL *
1080
DevPathFromTextAcpiAdr (
1081
IN CHAR16 *TextDeviceNode
1082
)
1083
{
1084
CHAR16 *DisplayDeviceStr;
1085
ACPI_ADR_DEVICE_PATH *AcpiAdr;
1086
UINTN Index;
1087
UINTN Length;
1088
1089
AcpiAdr = (ACPI_ADR_DEVICE_PATH *)CreateDeviceNode (
1090
ACPI_DEVICE_PATH,
1091
ACPI_ADR_DP,
1092
(UINT16)sizeof (ACPI_ADR_DEVICE_PATH)
1093
);
1094
if (AcpiAdr == NULL) {
1095
ASSERT (AcpiAdr != NULL);
1096
return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
1097
}
1098
1099
for (Index = 0; ; Index++) {
1100
DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);
1101
if (IS_NULL (*DisplayDeviceStr)) {
1102
break;
1103
}
1104
1105
if (Index > 0) {
1106
Length = DevicePathNodeLength (AcpiAdr);
1107
AcpiAdr = ReallocatePool (
1108
Length,
1109
Length + sizeof (UINT32),
1110
AcpiAdr
1111
);
1112
1113
if (AcpiAdr == NULL) {
1114
ASSERT (AcpiAdr != NULL);
1115
return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
1116
}
1117
1118
SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));
1119
}
1120
1121
(&AcpiAdr->ADR)[Index] = (UINT32)Strtoi (DisplayDeviceStr);
1122
}
1123
1124
return (EFI_DEVICE_PATH_PROTOCOL *)AcpiAdr;
1125
}
1126
1127
/**
1128
Converts a generic messaging text device path node to messaging device path structure.
1129
1130
@param TextDeviceNode The input Text device path node.
1131
1132
@return A pointer to messaging device path structure.
1133
1134
**/
1135
static
1136
EFI_DEVICE_PATH_PROTOCOL *
1137
DevPathFromTextMsg (
1138
IN CHAR16 *TextDeviceNode
1139
)
1140
{
1141
return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);
1142
}
1143
1144
/**
1145
Converts a text device path node to Parallel Port device path structure.
1146
1147
@param TextDeviceNode The input Text device path node.
1148
1149
@return A pointer to the newly-created Parallel Port device path structure.
1150
1151
**/
1152
static
1153
EFI_DEVICE_PATH_PROTOCOL *
1154
DevPathFromTextAta (
1155
IN CHAR16 *TextDeviceNode
1156
)
1157
{
1158
CHAR16 *PrimarySecondaryStr;
1159
CHAR16 *SlaveMasterStr;
1160
CHAR16 *LunStr;
1161
ATAPI_DEVICE_PATH *Atapi;
1162
1163
Atapi = (ATAPI_DEVICE_PATH *)CreateDeviceNode (
1164
MESSAGING_DEVICE_PATH,
1165
MSG_ATAPI_DP,
1166
(UINT16)sizeof (ATAPI_DEVICE_PATH)
1167
);
1168
1169
if (Atapi == NULL) {
1170
return (EFI_DEVICE_PATH_PROTOCOL *)Atapi;
1171
}
1172
1173
PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);
1174
SlaveMasterStr = GetNextParamStr (&TextDeviceNode);
1175
LunStr = GetNextParamStr (&TextDeviceNode);
1176
1177
if (StrCmp (PrimarySecondaryStr, "Primary") == 0) {
1178
Atapi->PrimarySecondary = 0;
1179
} else if (StrCmp (PrimarySecondaryStr, "Secondary") == 0) {
1180
Atapi->PrimarySecondary = 1;
1181
} else {
1182
Atapi->PrimarySecondary = (UINT8)Strtoi (PrimarySecondaryStr);
1183
}
1184
1185
if (StrCmp (SlaveMasterStr, "Master") == 0) {
1186
Atapi->SlaveMaster = 0;
1187
} else if (StrCmp (SlaveMasterStr, "Slave") == 0) {
1188
Atapi->SlaveMaster = 1;
1189
} else {
1190
Atapi->SlaveMaster = (UINT8)Strtoi (SlaveMasterStr);
1191
}
1192
1193
Atapi->Lun = (UINT16)Strtoi (LunStr);
1194
1195
return (EFI_DEVICE_PATH_PROTOCOL *)Atapi;
1196
}
1197
1198
/**
1199
Converts a text device path node to SCSI device path structure.
1200
1201
@param TextDeviceNode The input Text device path node.
1202
1203
@return A pointer to the newly-created SCSI device path structure.
1204
1205
**/
1206
static
1207
EFI_DEVICE_PATH_PROTOCOL *
1208
DevPathFromTextScsi (
1209
IN CHAR16 *TextDeviceNode
1210
)
1211
{
1212
CHAR16 *PunStr;
1213
CHAR16 *LunStr;
1214
SCSI_DEVICE_PATH *Scsi;
1215
1216
PunStr = GetNextParamStr (&TextDeviceNode);
1217
LunStr = GetNextParamStr (&TextDeviceNode);
1218
Scsi = (SCSI_DEVICE_PATH *)CreateDeviceNode (
1219
MESSAGING_DEVICE_PATH,
1220
MSG_SCSI_DP,
1221
(UINT16)sizeof (SCSI_DEVICE_PATH)
1222
);
1223
1224
if (Scsi != NULL) {
1225
Scsi->Pun = (UINT16)Strtoi (PunStr);
1226
Scsi->Lun = (UINT16)Strtoi (LunStr);
1227
}
1228
1229
return (EFI_DEVICE_PATH_PROTOCOL *)Scsi;
1230
}
1231
1232
/**
1233
Converts a text device path node to Fibre device path structure.
1234
1235
@param TextDeviceNode The input Text device path node.
1236
1237
@return A pointer to the newly-created Fibre device path structure.
1238
1239
**/
1240
static
1241
EFI_DEVICE_PATH_PROTOCOL *
1242
DevPathFromTextFibre (
1243
IN CHAR16 *TextDeviceNode
1244
)
1245
{
1246
CHAR16 *WWNStr;
1247
CHAR16 *LunStr;
1248
FIBRECHANNEL_DEVICE_PATH *Fibre;
1249
1250
WWNStr = GetNextParamStr (&TextDeviceNode);
1251
LunStr = GetNextParamStr (&TextDeviceNode);
1252
Fibre = (FIBRECHANNEL_DEVICE_PATH *)CreateDeviceNode (
1253
MESSAGING_DEVICE_PATH,
1254
MSG_FIBRECHANNEL_DP,
1255
(UINT16)sizeof (FIBRECHANNEL_DEVICE_PATH)
1256
);
1257
1258
if (Fibre != NULL) {
1259
Fibre->Reserved = 0;
1260
Strtoi64 (WWNStr, &Fibre->WWN);
1261
Strtoi64 (LunStr, &Fibre->Lun);
1262
}
1263
1264
return (EFI_DEVICE_PATH_PROTOCOL *)Fibre;
1265
}
1266
1267
/**
1268
Converts a text device path node to FibreEx device path structure.
1269
1270
@param TextDeviceNode The input Text device path node.
1271
1272
@return A pointer to the newly-created FibreEx device path structure.
1273
1274
**/
1275
static
1276
EFI_DEVICE_PATH_PROTOCOL *
1277
DevPathFromTextFibreEx (
1278
IN CHAR16 *TextDeviceNode
1279
)
1280
{
1281
CHAR16 *WWNStr;
1282
CHAR16 *LunStr;
1283
FIBRECHANNELEX_DEVICE_PATH *FibreEx;
1284
1285
WWNStr = GetNextParamStr (&TextDeviceNode);
1286
LunStr = GetNextParamStr (&TextDeviceNode);
1287
FibreEx = (FIBRECHANNELEX_DEVICE_PATH *)CreateDeviceNode (
1288
MESSAGING_DEVICE_PATH,
1289
MSG_FIBRECHANNELEX_DP,
1290
(UINT16)sizeof (FIBRECHANNELEX_DEVICE_PATH)
1291
);
1292
1293
if (FibreEx != NULL) {
1294
FibreEx->Reserved = 0;
1295
Strtoi64 (WWNStr, (UINT64 *)(&FibreEx->WWN));
1296
Strtoi64 (LunStr, (UINT64 *)(&FibreEx->Lun));
1297
1298
*(UINT64 *)(&FibreEx->WWN) = SwapBytes64 (*(UINT64 *)(&FibreEx->WWN));
1299
*(UINT64 *)(&FibreEx->Lun) = SwapBytes64 (*(UINT64 *)(&FibreEx->Lun));
1300
}
1301
1302
return (EFI_DEVICE_PATH_PROTOCOL *)FibreEx;
1303
}
1304
1305
/**
1306
Converts a text device path node to 1394 device path structure.
1307
1308
@param TextDeviceNode The input Text device path node.
1309
1310
@return A pointer to the newly-created 1394 device path structure.
1311
1312
**/
1313
static
1314
EFI_DEVICE_PATH_PROTOCOL *
1315
DevPathFromText1394 (
1316
IN CHAR16 *TextDeviceNode
1317
)
1318
{
1319
CHAR16 *GuidStr;
1320
F1394_DEVICE_PATH *F1394DevPath;
1321
1322
GuidStr = GetNextParamStr (&TextDeviceNode);
1323
F1394DevPath = (F1394_DEVICE_PATH *)CreateDeviceNode (
1324
MESSAGING_DEVICE_PATH,
1325
MSG_1394_DP,
1326
(UINT16)sizeof (F1394_DEVICE_PATH)
1327
);
1328
1329
if (F1394DevPath != NULL) {
1330
F1394DevPath->Reserved = 0;
1331
F1394DevPath->Guid = StrHexToUint64 (GuidStr);
1332
}
1333
1334
return (EFI_DEVICE_PATH_PROTOCOL *)F1394DevPath;
1335
}
1336
1337
/**
1338
Converts a text device path node to USB device path structure.
1339
1340
@param TextDeviceNode The input Text device path node.
1341
1342
@return A pointer to the newly-created USB device path structure.
1343
1344
**/
1345
static
1346
EFI_DEVICE_PATH_PROTOCOL *
1347
DevPathFromTextUsb (
1348
IN CHAR16 *TextDeviceNode
1349
)
1350
{
1351
CHAR16 *PortStr;
1352
CHAR16 *InterfaceStr;
1353
USB_DEVICE_PATH *Usb;
1354
1355
PortStr = GetNextParamStr (&TextDeviceNode);
1356
InterfaceStr = GetNextParamStr (&TextDeviceNode);
1357
Usb = (USB_DEVICE_PATH *)CreateDeviceNode (
1358
MESSAGING_DEVICE_PATH,
1359
MSG_USB_DP,
1360
(UINT16)sizeof (USB_DEVICE_PATH)
1361
);
1362
1363
if (Usb != NULL) {
1364
Usb->ParentPortNumber = (UINT8)Strtoi (PortStr);
1365
Usb->InterfaceNumber = (UINT8)Strtoi (InterfaceStr);
1366
}
1367
1368
return (EFI_DEVICE_PATH_PROTOCOL *)Usb;
1369
}
1370
1371
/**
1372
Converts a text device path node to I20 device path structure.
1373
1374
@param TextDeviceNode The input Text device path node.
1375
1376
@return A pointer to the newly-created I20 device path structure.
1377
1378
**/
1379
static
1380
EFI_DEVICE_PATH_PROTOCOL *
1381
DevPathFromTextI2O (
1382
IN CHAR16 *TextDeviceNode
1383
)
1384
{
1385
CHAR16 *TIDStr;
1386
I2O_DEVICE_PATH *I2ODevPath;
1387
1388
TIDStr = GetNextParamStr (&TextDeviceNode);
1389
I2ODevPath = (I2O_DEVICE_PATH *)CreateDeviceNode (
1390
MESSAGING_DEVICE_PATH,
1391
MSG_I2O_DP,
1392
(UINT16)sizeof (I2O_DEVICE_PATH)
1393
);
1394
1395
if (I2ODevPath != NULL) {
1396
I2ODevPath->Tid = (UINT32)Strtoi (TIDStr);
1397
}
1398
1399
return (EFI_DEVICE_PATH_PROTOCOL *)I2ODevPath;
1400
}
1401
1402
/**
1403
Converts a text device path node to Infini Band device path structure.
1404
1405
@param TextDeviceNode The input Text device path node.
1406
1407
@return A pointer to the newly-created Infini Band device path structure.
1408
1409
**/
1410
static
1411
EFI_DEVICE_PATH_PROTOCOL *
1412
DevPathFromTextInfiniband (
1413
IN CHAR16 *TextDeviceNode
1414
)
1415
{
1416
CHAR16 *FlagsStr;
1417
CHAR16 *GuidStr;
1418
CHAR16 *SidStr;
1419
CHAR16 *TidStr;
1420
CHAR16 *DidStr;
1421
INFINIBAND_DEVICE_PATH *InfiniBand;
1422
1423
FlagsStr = GetNextParamStr (&TextDeviceNode);
1424
GuidStr = GetNextParamStr (&TextDeviceNode);
1425
SidStr = GetNextParamStr (&TextDeviceNode);
1426
TidStr = GetNextParamStr (&TextDeviceNode);
1427
DidStr = GetNextParamStr (&TextDeviceNode);
1428
InfiniBand = (INFINIBAND_DEVICE_PATH *)CreateDeviceNode (
1429
MESSAGING_DEVICE_PATH,
1430
MSG_INFINIBAND_DP,
1431
(UINT16)sizeof (INFINIBAND_DEVICE_PATH)
1432
);
1433
1434
if (InfiniBand != NULL) {
1435
InfiniBand->ResourceFlags = (UINT32)Strtoi (FlagsStr);
1436
StrToGuid (GuidStr, (EFI_GUID *)InfiniBand->PortGid);
1437
Strtoi64 (SidStr, &InfiniBand->ServiceId);
1438
Strtoi64 (TidStr, &InfiniBand->TargetPortId);
1439
Strtoi64 (DidStr, &InfiniBand->DeviceId);
1440
}
1441
1442
return (EFI_DEVICE_PATH_PROTOCOL *)InfiniBand;
1443
}
1444
1445
/**
1446
Converts a text device path node to Vendor-Defined Messaging device path structure.
1447
1448
@param TextDeviceNode The input Text device path node.
1449
1450
@return A pointer to the newly-created Vendor-Defined Messaging device path structure.
1451
1452
**/
1453
static
1454
EFI_DEVICE_PATH_PROTOCOL *
1455
DevPathFromTextVenMsg (
1456
IN CHAR16 *TextDeviceNode
1457
)
1458
{
1459
return ConvertFromTextVendor (
1460
TextDeviceNode,
1461
MESSAGING_DEVICE_PATH,
1462
MSG_VENDOR_DP
1463
);
1464
}
1465
1466
/**
1467
Converts a text device path node to Vendor defined PC-ANSI device path structure.
1468
1469
@param TextDeviceNode The input Text device path node.
1470
1471
@return A pointer to the newly-created Vendor defined PC-ANSI device path structure.
1472
1473
**/
1474
static
1475
EFI_DEVICE_PATH_PROTOCOL *
1476
DevPathFromTextVenPcAnsi (
1477
IN CHAR16 *TextDeviceNode
1478
)
1479
{
1480
VENDOR_DEVICE_PATH *Vendor;
1481
1482
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
1483
MESSAGING_DEVICE_PATH,
1484
MSG_VENDOR_DP,
1485
(UINT16)sizeof (VENDOR_DEVICE_PATH)
1486
);
1487
1488
if (Vendor != NULL) {
1489
CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
1490
}
1491
1492
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
1493
}
1494
1495
/**
1496
Converts a text device path node to Vendor defined VT100 device path structure.
1497
1498
@param TextDeviceNode The input Text device path node.
1499
1500
@return A pointer to the newly-created Vendor defined VT100 device path structure.
1501
1502
**/
1503
static
1504
EFI_DEVICE_PATH_PROTOCOL *
1505
DevPathFromTextVenVt100 (
1506
IN CHAR16 *TextDeviceNode
1507
)
1508
{
1509
VENDOR_DEVICE_PATH *Vendor;
1510
1511
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
1512
MESSAGING_DEVICE_PATH,
1513
MSG_VENDOR_DP,
1514
(UINT16)sizeof (VENDOR_DEVICE_PATH)
1515
);
1516
1517
if (Vendor != NULL) {
1518
CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
1519
}
1520
1521
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
1522
}
1523
1524
/**
1525
Converts a text device path node to Vendor defined VT100 Plus device path structure.
1526
1527
@param TextDeviceNode The input Text device path node.
1528
1529
@return A pointer to the newly-created Vendor defined VT100 Plus device path structure.
1530
1531
**/
1532
static
1533
EFI_DEVICE_PATH_PROTOCOL *
1534
DevPathFromTextVenVt100Plus (
1535
IN CHAR16 *TextDeviceNode
1536
)
1537
{
1538
VENDOR_DEVICE_PATH *Vendor;
1539
1540
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
1541
MESSAGING_DEVICE_PATH,
1542
MSG_VENDOR_DP,
1543
(UINT16)sizeof (VENDOR_DEVICE_PATH)
1544
);
1545
1546
if (Vendor != NULL) {
1547
CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
1548
}
1549
1550
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
1551
}
1552
1553
/**
1554
Converts a text device path node to Vendor defined UTF8 device path structure.
1555
1556
@param TextDeviceNode The input Text device path node.
1557
1558
@return A pointer to the newly-created Vendor defined UTF8 device path structure.
1559
1560
**/
1561
static
1562
EFI_DEVICE_PATH_PROTOCOL *
1563
DevPathFromTextVenUtf8 (
1564
IN CHAR16 *TextDeviceNode
1565
)
1566
{
1567
VENDOR_DEVICE_PATH *Vendor;
1568
1569
Vendor = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
1570
MESSAGING_DEVICE_PATH,
1571
MSG_VENDOR_DP,
1572
(UINT16)sizeof (VENDOR_DEVICE_PATH)
1573
);
1574
1575
if (Vendor != NULL) {
1576
CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
1577
}
1578
1579
return (EFI_DEVICE_PATH_PROTOCOL *)Vendor;
1580
}
1581
1582
/**
1583
Converts a text device path node to UART Flow Control device path structure.
1584
1585
@param TextDeviceNode The input Text device path node.
1586
1587
@return A pointer to the newly-created UART Flow Control device path structure.
1588
1589
**/
1590
static
1591
EFI_DEVICE_PATH_PROTOCOL *
1592
DevPathFromTextUartFlowCtrl (
1593
IN CHAR16 *TextDeviceNode
1594
)
1595
{
1596
CHAR16 *ValueStr;
1597
UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;
1598
1599
ValueStr = GetNextParamStr (&TextDeviceNode);
1600
UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *)CreateDeviceNode (
1601
MESSAGING_DEVICE_PATH,
1602
MSG_VENDOR_DP,
1603
(UINT16)sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
1604
);
1605
1606
if (UartFlowControl != NULL) {
1607
CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);
1608
if (StrCmp (ValueStr, "XonXoff") == 0) {
1609
UartFlowControl->FlowControlMap = 2;
1610
} else if (StrCmp (ValueStr, "Hardware") == 0) {
1611
UartFlowControl->FlowControlMap = 1;
1612
} else {
1613
UartFlowControl->FlowControlMap = 0;
1614
}
1615
}
1616
1617
return (EFI_DEVICE_PATH_PROTOCOL *)UartFlowControl;
1618
}
1619
1620
/**
1621
Converts a text device path node to Serial Attached SCSI device path structure.
1622
1623
@param TextDeviceNode The input Text device path node.
1624
1625
@return A pointer to the newly-created Serial Attached SCSI device path structure.
1626
1627
**/
1628
static
1629
EFI_DEVICE_PATH_PROTOCOL *
1630
DevPathFromTextSAS (
1631
IN CHAR16 *TextDeviceNode
1632
)
1633
{
1634
CHAR16 *AddressStr;
1635
CHAR16 *LunStr;
1636
CHAR16 *RTPStr;
1637
CHAR16 *SASSATAStr;
1638
CHAR16 *LocationStr;
1639
CHAR16 *ConnectStr;
1640
CHAR16 *DriveBayStr;
1641
CHAR16 *ReservedStr;
1642
UINT16 Info;
1643
UINT16 Uint16;
1644
SAS_DEVICE_PATH *Sas;
1645
1646
AddressStr = GetNextParamStr (&TextDeviceNode);
1647
LunStr = GetNextParamStr (&TextDeviceNode);
1648
RTPStr = GetNextParamStr (&TextDeviceNode);
1649
SASSATAStr = GetNextParamStr (&TextDeviceNode);
1650
LocationStr = GetNextParamStr (&TextDeviceNode);
1651
ConnectStr = GetNextParamStr (&TextDeviceNode);
1652
DriveBayStr = GetNextParamStr (&TextDeviceNode);
1653
ReservedStr = GetNextParamStr (&TextDeviceNode);
1654
Sas = (SAS_DEVICE_PATH *)CreateDeviceNode (
1655
MESSAGING_DEVICE_PATH,
1656
MSG_VENDOR_DP,
1657
(UINT16)sizeof (SAS_DEVICE_PATH)
1658
);
1659
1660
if (Sas == NULL) {
1661
return (EFI_DEVICE_PATH_PROTOCOL *)Sas;
1662
}
1663
1664
CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);
1665
Strtoi64 (AddressStr, &Sas->SasAddress);
1666
Strtoi64 (LunStr, &Sas->Lun);
1667
Sas->RelativeTargetPort = (UINT16)Strtoi (RTPStr);
1668
1669
if (StrCmp (SASSATAStr, "NoTopology") == 0) {
1670
Info = 0x0;
1671
} else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
1672
Uint16 = (UINT16)Strtoi (DriveBayStr);
1673
if (Uint16 == 0) {
1674
Info = 0x1;
1675
} else {
1676
Info = (UINT16)(0x2 | ((Uint16 - 1) << 8));
1677
}
1678
1679
if (StrCmp (SASSATAStr, "SATA") == 0) {
1680
Info |= BIT4;
1681
}
1682
1683
//
1684
// Location is an integer between 0 and 1 or else
1685
// the keyword Internal (0) or External (1).
1686
//
1687
if (StrCmp (LocationStr, "External") == 0) {
1688
Uint16 = 1;
1689
} else if (StrCmp (LocationStr, "Internal") == 0) {
1690
Uint16 = 0;
1691
} else {
1692
Uint16 = ((UINT16)Strtoi (LocationStr) & BIT0);
1693
}
1694
1695
Info |= (Uint16 << 5);
1696
1697
//
1698
// Connect is an integer between 0 and 3 or else
1699
// the keyword Direct (0) or Expanded (1).
1700
//
1701
if (StrCmp (ConnectStr, "Expanded") == 0) {
1702
Uint16 = 1;
1703
} else if (StrCmp (ConnectStr, "Direct") == 0) {
1704
Uint16 = 0;
1705
} else {
1706
Uint16 = ((UINT16)Strtoi (ConnectStr) & (BIT0 | BIT1));
1707
}
1708
1709
Info |= (Uint16 << 6);
1710
} else {
1711
Info = (UINT16)Strtoi (SASSATAStr);
1712
}
1713
1714
Sas->DeviceTopology = Info;
1715
Sas->Reserved = (UINT32)Strtoi (ReservedStr);
1716
1717
return (EFI_DEVICE_PATH_PROTOCOL *)Sas;
1718
}
1719
1720
/**
1721
Converts a text device path node to Serial Attached SCSI Ex device path structure.
1722
1723
@param TextDeviceNode The input Text device path node.
1724
1725
@return A pointer to the newly-created Serial Attached SCSI Ex device path structure.
1726
1727
**/
1728
static
1729
EFI_DEVICE_PATH_PROTOCOL *
1730
DevPathFromTextSasEx (
1731
IN CHAR16 *TextDeviceNode
1732
)
1733
{
1734
CHAR16 *AddressStr;
1735
CHAR16 *LunStr;
1736
CHAR16 *RTPStr;
1737
CHAR16 *SASSATAStr;
1738
CHAR16 *LocationStr;
1739
CHAR16 *ConnectStr;
1740
CHAR16 *DriveBayStr;
1741
UINT16 Info;
1742
UINT16 Uint16;
1743
UINT64 SasAddress;
1744
UINT64 Lun;
1745
SASEX_DEVICE_PATH *SasEx;
1746
1747
AddressStr = GetNextParamStr (&TextDeviceNode);
1748
LunStr = GetNextParamStr (&TextDeviceNode);
1749
RTPStr = GetNextParamStr (&TextDeviceNode);
1750
SASSATAStr = GetNextParamStr (&TextDeviceNode);
1751
LocationStr = GetNextParamStr (&TextDeviceNode);
1752
ConnectStr = GetNextParamStr (&TextDeviceNode);
1753
DriveBayStr = GetNextParamStr (&TextDeviceNode);
1754
SasEx = (SASEX_DEVICE_PATH *)CreateDeviceNode (
1755
MESSAGING_DEVICE_PATH,
1756
MSG_SASEX_DP,
1757
(UINT16)sizeof (SASEX_DEVICE_PATH)
1758
);
1759
1760
if (SasEx == NULL) {
1761
return (EFI_DEVICE_PATH_PROTOCOL *)SasEx;
1762
}
1763
1764
Strtoi64 (AddressStr, &SasAddress);
1765
Strtoi64 (LunStr, &Lun);
1766
WriteUnaligned64 ((UINT64 *)&SasEx->SasAddress, SwapBytes64 (SasAddress));
1767
WriteUnaligned64 ((UINT64 *)&SasEx->Lun, SwapBytes64 (Lun));
1768
SasEx->RelativeTargetPort = (UINT16)Strtoi (RTPStr);
1769
1770
if (StrCmp (SASSATAStr, "NoTopology") == 0) {
1771
Info = 0x0;
1772
} else if ((StrCmp (SASSATAStr, "SATA") == 0) || (StrCmp (SASSATAStr, "SAS") == 0)) {
1773
Uint16 = (UINT16)Strtoi (DriveBayStr);
1774
if (Uint16 == 0) {
1775
Info = 0x1;
1776
} else {
1777
Info = (UINT16)(0x2 | ((Uint16 - 1) << 8));
1778
}
1779
1780
if (StrCmp (SASSATAStr, "SATA") == 0) {
1781
Info |= BIT4;
1782
}
1783
1784
//
1785
// Location is an integer between 0 and 1 or else
1786
// the keyword Internal (0) or External (1).
1787
//
1788
if (StrCmp (LocationStr, "External") == 0) {
1789
Uint16 = 1;
1790
} else if (StrCmp (LocationStr, "Internal") == 0) {
1791
Uint16 = 0;
1792
} else {
1793
Uint16 = ((UINT16)Strtoi (LocationStr) & BIT0);
1794
}
1795
1796
Info |= (Uint16 << 5);
1797
1798
//
1799
// Connect is an integer between 0 and 3 or else
1800
// the keyword Direct (0) or Expanded (1).
1801
//
1802
if (StrCmp (ConnectStr, "Expanded") == 0) {
1803
Uint16 = 1;
1804
} else if (StrCmp (ConnectStr, "Direct") == 0) {
1805
Uint16 = 0;
1806
} else {
1807
Uint16 = ((UINT16)Strtoi (ConnectStr) & (BIT0 | BIT1));
1808
}
1809
1810
Info |= (Uint16 << 6);
1811
} else {
1812
Info = (UINT16)Strtoi (SASSATAStr);
1813
}
1814
1815
SasEx->DeviceTopology = Info;
1816
1817
return (EFI_DEVICE_PATH_PROTOCOL *)SasEx;
1818
}
1819
1820
/**
1821
Converts a text device path node to NVM Express Namespace device path structure.
1822
1823
@param TextDeviceNode The input Text device path node.
1824
1825
@return A pointer to the newly-created NVM Express Namespace device path structure.
1826
1827
**/
1828
static
1829
EFI_DEVICE_PATH_PROTOCOL *
1830
DevPathFromTextNVMe (
1831
IN CHAR16 *TextDeviceNode
1832
)
1833
{
1834
CHAR16 *NamespaceIdStr;
1835
CHAR16 *NamespaceUuidStr;
1836
NVME_NAMESPACE_DEVICE_PATH *Nvme;
1837
UINT8 *Uuid;
1838
UINTN Index;
1839
1840
NamespaceIdStr = GetNextParamStr (&TextDeviceNode);
1841
NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);
1842
Nvme = (NVME_NAMESPACE_DEVICE_PATH *)CreateDeviceNode (
1843
MESSAGING_DEVICE_PATH,
1844
MSG_NVME_NAMESPACE_DP,
1845
(UINT16)sizeof (NVME_NAMESPACE_DEVICE_PATH)
1846
);
1847
1848
if (Nvme != NULL) {
1849
Nvme->NamespaceId = (UINT32)Strtoi (NamespaceIdStr);
1850
Uuid = (UINT8 *)&Nvme->NamespaceUuid;
1851
1852
Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);
1853
while (Index-- != 0) {
1854
Uuid[Index] = (UINT8)StrHexToUintn (SplitStr (&NamespaceUuidStr, '-'));
1855
}
1856
}
1857
1858
return (EFI_DEVICE_PATH_PROTOCOL *)Nvme;
1859
}
1860
1861
/**
1862
Converts a text device path node to UFS device path structure.
1863
1864
@param TextDeviceNode The input Text device path node.
1865
1866
@return A pointer to the newly-created UFS device path structure.
1867
1868
**/
1869
static
1870
EFI_DEVICE_PATH_PROTOCOL *
1871
DevPathFromTextUfs (
1872
IN CHAR16 *TextDeviceNode
1873
)
1874
{
1875
CHAR16 *PunStr;
1876
CHAR16 *LunStr;
1877
UFS_DEVICE_PATH *Ufs;
1878
1879
PunStr = GetNextParamStr (&TextDeviceNode);
1880
LunStr = GetNextParamStr (&TextDeviceNode);
1881
Ufs = (UFS_DEVICE_PATH *)CreateDeviceNode (
1882
MESSAGING_DEVICE_PATH,
1883
MSG_UFS_DP,
1884
(UINT16)sizeof (UFS_DEVICE_PATH)
1885
);
1886
1887
if (Ufs != NULL) {
1888
Ufs->Pun = (UINT8)Strtoi (PunStr);
1889
Ufs->Lun = (UINT8)Strtoi (LunStr);
1890
}
1891
1892
return (EFI_DEVICE_PATH_PROTOCOL *)Ufs;
1893
}
1894
1895
/**
1896
Converts a text device path node to SD (Secure Digital) device path structure.
1897
1898
@param TextDeviceNode The input Text device path node.
1899
1900
@return A pointer to the newly-created SD device path structure.
1901
1902
**/
1903
static
1904
EFI_DEVICE_PATH_PROTOCOL *
1905
DevPathFromTextSd (
1906
IN CHAR16 *TextDeviceNode
1907
)
1908
{
1909
CHAR16 *SlotNumberStr;
1910
SD_DEVICE_PATH *Sd;
1911
1912
SlotNumberStr = GetNextParamStr (&TextDeviceNode);
1913
Sd = (SD_DEVICE_PATH *)CreateDeviceNode (
1914
MESSAGING_DEVICE_PATH,
1915
MSG_SD_DP,
1916
(UINT16)sizeof (SD_DEVICE_PATH)
1917
);
1918
1919
if (Sd != NULL) {
1920
Sd->SlotNumber = (UINT8)Strtoi (SlotNumberStr);
1921
}
1922
1923
return (EFI_DEVICE_PATH_PROTOCOL *)Sd;
1924
}
1925
1926
/**
1927
Converts a text device path node to EMMC (Embedded MMC) device path structure.
1928
1929
@param TextDeviceNode The input Text device path node.
1930
1931
@return A pointer to the newly-created EMMC device path structure.
1932
1933
**/
1934
static
1935
EFI_DEVICE_PATH_PROTOCOL *
1936
DevPathFromTextEmmc (
1937
IN CHAR16 *TextDeviceNode
1938
)
1939
{
1940
CHAR16 *SlotNumberStr;
1941
EMMC_DEVICE_PATH *Emmc;
1942
1943
SlotNumberStr = GetNextParamStr (&TextDeviceNode);
1944
Emmc = (EMMC_DEVICE_PATH *)CreateDeviceNode (
1945
MESSAGING_DEVICE_PATH,
1946
MSG_EMMC_DP,
1947
(UINT16)sizeof (EMMC_DEVICE_PATH)
1948
);
1949
1950
if (Emmc != NULL) {
1951
Emmc->SlotNumber = (UINT8)Strtoi (SlotNumberStr);
1952
}
1953
1954
return (EFI_DEVICE_PATH_PROTOCOL *)Emmc;
1955
}
1956
1957
/**
1958
Converts a text device path node to Debug Port device path structure.
1959
1960
@param TextDeviceNode The input Text device path node.
1961
1962
@return A pointer to the newly-created Debug Port device path structure.
1963
1964
**/
1965
static
1966
EFI_DEVICE_PATH_PROTOCOL *
1967
DevPathFromTextDebugPort (
1968
IN CHAR16 *TextDeviceNode
1969
)
1970
{
1971
VENDOR_DEVICE_PATH *Vend;
1972
1973
Vend = (VENDOR_DEVICE_PATH *)CreateDeviceNode (
1974
MESSAGING_DEVICE_PATH,
1975
MSG_VENDOR_DP,
1976
(UINT16)sizeof (VENDOR_DEVICE_PATH)
1977
);
1978
1979
if (Vend != NULL) {
1980
CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
1981
}
1982
1983
return (EFI_DEVICE_PATH_PROTOCOL *)Vend;
1984
}
1985
1986
/**
1987
Converts a text device path node to MAC device path structure.
1988
1989
@param TextDeviceNode The input Text device path node.
1990
1991
@return A pointer to the newly-created MAC device path structure.
1992
1993
**/
1994
static
1995
EFI_DEVICE_PATH_PROTOCOL *
1996
DevPathFromTextMAC (
1997
IN CHAR16 *TextDeviceNode
1998
)
1999
{
2000
CHAR16 *AddressStr;
2001
CHAR16 *IfTypeStr;
2002
UINTN Length;
2003
MAC_ADDR_DEVICE_PATH *MACDevPath;
2004
2005
AddressStr = GetNextParamStr (&TextDeviceNode);
2006
IfTypeStr = GetNextParamStr (&TextDeviceNode);
2007
MACDevPath = (MAC_ADDR_DEVICE_PATH *)CreateDeviceNode (
2008
MESSAGING_DEVICE_PATH,
2009
MSG_MAC_ADDR_DP,
2010
(UINT16)sizeof (MAC_ADDR_DEVICE_PATH)
2011
);
2012
2013
if (MACDevPath != NULL) {
2014
MACDevPath->IfType = (UINT8)Strtoi (IfTypeStr);
2015
2016
Length = sizeof (EFI_MAC_ADDRESS);
2017
if ((MACDevPath->IfType == 0x01) || (MACDevPath->IfType == 0x00)) {
2018
Length = 6;
2019
}
2020
2021
StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);
2022
}
2023
2024
return (EFI_DEVICE_PATH_PROTOCOL *)MACDevPath;
2025
}
2026
2027
/**
2028
Converts a text format to the network protocol ID.
2029
2030
@param Text String of protocol field.
2031
2032
@return Network protocol ID .
2033
2034
**/
2035
static
2036
UINTN
2037
NetworkProtocolFromText (
2038
IN CHAR16 *Text
2039
)
2040
{
2041
if (StrCmp (Text, "UDP") == 0) {
2042
return RFC_1700_UDP_PROTOCOL;
2043
}
2044
2045
if (StrCmp (Text, "TCP") == 0) {
2046
return RFC_1700_TCP_PROTOCOL;
2047
}
2048
2049
return Strtoi (Text);
2050
}
2051
2052
/**
2053
Converts a text device path node to IPV4 device path structure.
2054
2055
@param TextDeviceNode The input Text device path node.
2056
2057
@return A pointer to the newly-created IPV4 device path structure.
2058
2059
**/
2060
static
2061
EFI_DEVICE_PATH_PROTOCOL *
2062
DevPathFromTextIPv4 (
2063
IN CHAR16 *TextDeviceNode
2064
)
2065
{
2066
CHAR16 *RemoteIPStr;
2067
CHAR16 *ProtocolStr;
2068
CHAR16 *TypeStr;
2069
CHAR16 *LocalIPStr;
2070
CHAR16 *GatewayIPStr;
2071
CHAR16 *SubnetMaskStr;
2072
IPv4_DEVICE_PATH *IPv4;
2073
2074
RemoteIPStr = GetNextParamStr (&TextDeviceNode);
2075
ProtocolStr = GetNextParamStr (&TextDeviceNode);
2076
TypeStr = GetNextParamStr (&TextDeviceNode);
2077
LocalIPStr = GetNextParamStr (&TextDeviceNode);
2078
GatewayIPStr = GetNextParamStr (&TextDeviceNode);
2079
SubnetMaskStr = GetNextParamStr (&TextDeviceNode);
2080
IPv4 = (IPv4_DEVICE_PATH *)CreateDeviceNode (
2081
MESSAGING_DEVICE_PATH,
2082
MSG_IPv4_DP,
2083
(UINT16)sizeof (IPv4_DEVICE_PATH)
2084
);
2085
2086
if (IPv4 == NULL) {
2087
return (EFI_DEVICE_PATH_PROTOCOL *)IPv4;
2088
}
2089
2090
StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);
2091
IPv4->Protocol = (UINT16)NetworkProtocolFromText (ProtocolStr);
2092
if (StrCmp (TypeStr, "Static") == 0) {
2093
IPv4->StaticIpAddress = TRUE;
2094
} else {
2095
IPv4->StaticIpAddress = FALSE;
2096
}
2097
2098
StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);
2099
if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {
2100
StrToIpv4Address (GatewayIPStr, NULL, &IPv4->GatewayIpAddress, NULL);
2101
StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask, NULL);
2102
} else {
2103
ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));
2104
ZeroMem (&IPv4->SubnetMask, sizeof (IPv4->SubnetMask));
2105
}
2106
2107
IPv4->LocalPort = 0;
2108
IPv4->RemotePort = 0;
2109
2110
return (EFI_DEVICE_PATH_PROTOCOL *)IPv4;
2111
}
2112
2113
/**
2114
Converts a text device path node to IPV6 device path structure.
2115
2116
@param TextDeviceNode The input Text device path node.
2117
2118
@return A pointer to the newly-created IPV6 device path structure.
2119
2120
**/
2121
static
2122
EFI_DEVICE_PATH_PROTOCOL *
2123
DevPathFromTextIPv6 (
2124
IN CHAR16 *TextDeviceNode
2125
)
2126
{
2127
CHAR16 *RemoteIPStr;
2128
CHAR16 *ProtocolStr;
2129
CHAR16 *TypeStr;
2130
CHAR16 *LocalIPStr;
2131
CHAR16 *GatewayIPStr;
2132
CHAR16 *PrefixLengthStr;
2133
IPv6_DEVICE_PATH *IPv6;
2134
2135
RemoteIPStr = GetNextParamStr (&TextDeviceNode);
2136
ProtocolStr = GetNextParamStr (&TextDeviceNode);
2137
TypeStr = GetNextParamStr (&TextDeviceNode);
2138
LocalIPStr = GetNextParamStr (&TextDeviceNode);
2139
PrefixLengthStr = GetNextParamStr (&TextDeviceNode);
2140
GatewayIPStr = GetNextParamStr (&TextDeviceNode);
2141
IPv6 = (IPv6_DEVICE_PATH *)CreateDeviceNode (
2142
MESSAGING_DEVICE_PATH,
2143
MSG_IPv6_DP,
2144
(UINT16)sizeof (IPv6_DEVICE_PATH)
2145
);
2146
2147
if (IPv6 == NULL) {
2148
return (EFI_DEVICE_PATH_PROTOCOL *)IPv6;
2149
}
2150
2151
StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);
2152
IPv6->Protocol = (UINT16)NetworkProtocolFromText (ProtocolStr);
2153
if (StrCmp (TypeStr, "Static") == 0) {
2154
IPv6->IpAddressOrigin = 0;
2155
} else if (StrCmp (TypeStr, "StatelessAutoConfigure") == 0) {
2156
IPv6->IpAddressOrigin = 1;
2157
} else {
2158
IPv6->IpAddressOrigin = 2;
2159
}
2160
2161
StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);
2162
if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {
2163
StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);
2164
IPv6->PrefixLength = (UINT8)Strtoi (PrefixLengthStr);
2165
} else {
2166
ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));
2167
IPv6->PrefixLength = 0;
2168
}
2169
2170
IPv6->LocalPort = 0;
2171
IPv6->RemotePort = 0;
2172
2173
return (EFI_DEVICE_PATH_PROTOCOL *)IPv6;
2174
}
2175
2176
/**
2177
Converts a text device path node to UART device path structure.
2178
2179
@param TextDeviceNode The input Text device path node.
2180
2181
@return A pointer to the newly-created UART device path structure.
2182
2183
**/
2184
static
2185
EFI_DEVICE_PATH_PROTOCOL *
2186
DevPathFromTextUart (
2187
IN CHAR16 *TextDeviceNode
2188
)
2189
{
2190
CHAR16 *BaudStr;
2191
CHAR16 *DataBitsStr;
2192
CHAR16 *ParityStr;
2193
CHAR16 *StopBitsStr;
2194
UART_DEVICE_PATH *Uart;
2195
2196
BaudStr = GetNextParamStr (&TextDeviceNode);
2197
DataBitsStr = GetNextParamStr (&TextDeviceNode);
2198
ParityStr = GetNextParamStr (&TextDeviceNode);
2199
StopBitsStr = GetNextParamStr (&TextDeviceNode);
2200
Uart = (UART_DEVICE_PATH *)CreateDeviceNode (
2201
MESSAGING_DEVICE_PATH,
2202
MSG_UART_DP,
2203
(UINT16)sizeof (UART_DEVICE_PATH)
2204
);
2205
2206
if (Uart == NULL) {
2207
return (EFI_DEVICE_PATH_PROTOCOL *)Uart;
2208
}
2209
2210
if (StrCmp (BaudStr, "DEFAULT") == 0) {
2211
Uart->BaudRate = 115200;
2212
} else {
2213
Strtoi64 (BaudStr, &Uart->BaudRate);
2214
}
2215
2216
Uart->DataBits = (UINT8)((StrCmp (DataBitsStr, "DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));
2217
switch (*ParityStr) {
2218
case 'D':
2219
Uart->Parity = 0;
2220
break;
2221
2222
case 'N':
2223
Uart->Parity = 1;
2224
break;
2225
2226
case 'E':
2227
Uart->Parity = 2;
2228
break;
2229
2230
case 'O':
2231
Uart->Parity = 3;
2232
break;
2233
2234
case 'M':
2235
Uart->Parity = 4;
2236
break;
2237
2238
case 'S':
2239
Uart->Parity = 5;
2240
break;
2241
2242
default:
2243
Uart->Parity = (UINT8)Strtoi (ParityStr);
2244
break;
2245
}
2246
2247
if (StrCmp (StopBitsStr, "D") == 0) {
2248
Uart->StopBits = (UINT8)0;
2249
} else if (StrCmp (StopBitsStr, "1") == 0) {
2250
Uart->StopBits = (UINT8)1;
2251
} else if (StrCmp (StopBitsStr, "1.5") == 0) {
2252
Uart->StopBits = (UINT8)2;
2253
} else if (StrCmp (StopBitsStr, "2") == 0) {
2254
Uart->StopBits = (UINT8)3;
2255
} else {
2256
Uart->StopBits = (UINT8)Strtoi (StopBitsStr);
2257
}
2258
2259
return (EFI_DEVICE_PATH_PROTOCOL *)Uart;
2260
}
2261
2262
/**
2263
Converts a text device path node to USB class device path structure.
2264
2265
@param TextDeviceNode The input Text device path node.
2266
@param UsbClassText A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.
2267
2268
@return A pointer to the newly-created USB class device path structure.
2269
2270
**/
2271
static
2272
EFI_DEVICE_PATH_PROTOCOL *
2273
ConvertFromTextUsbClass (
2274
IN CHAR16 *TextDeviceNode,
2275
IN USB_CLASS_TEXT *UsbClassText
2276
)
2277
{
2278
CHAR16 *VIDStr;
2279
CHAR16 *PIDStr;
2280
CHAR16 *ClassStr;
2281
CHAR16 *SubClassStr;
2282
CHAR16 *ProtocolStr;
2283
USB_CLASS_DEVICE_PATH *UsbClass;
2284
2285
UsbClass = (USB_CLASS_DEVICE_PATH *)CreateDeviceNode (
2286
MESSAGING_DEVICE_PATH,
2287
MSG_USB_CLASS_DP,
2288
(UINT16)sizeof (USB_CLASS_DEVICE_PATH)
2289
);
2290
2291
if (UsbClass == NULL) {
2292
return (EFI_DEVICE_PATH_PROTOCOL *)UsbClass;
2293
}
2294
2295
VIDStr = GetNextParamStr (&TextDeviceNode);
2296
PIDStr = GetNextParamStr (&TextDeviceNode);
2297
if (UsbClassText->ClassExist) {
2298
ClassStr = GetNextParamStr (&TextDeviceNode);
2299
if (*ClassStr == '\0') {
2300
UsbClass->DeviceClass = 0xFF;
2301
} else {
2302
UsbClass->DeviceClass = (UINT8)Strtoi (ClassStr);
2303
}
2304
} else {
2305
UsbClass->DeviceClass = UsbClassText->Class;
2306
}
2307
2308
if (UsbClassText->SubClassExist) {
2309
SubClassStr = GetNextParamStr (&TextDeviceNode);
2310
if (*SubClassStr == '\0') {
2311
UsbClass->DeviceSubClass = 0xFF;
2312
} else {
2313
UsbClass->DeviceSubClass = (UINT8)Strtoi (SubClassStr);
2314
}
2315
} else {
2316
UsbClass->DeviceSubClass = UsbClassText->SubClass;
2317
}
2318
2319
ProtocolStr = GetNextParamStr (&TextDeviceNode);
2320
2321
if (*VIDStr == '\0') {
2322
UsbClass->VendorId = 0xFFFF;
2323
} else {
2324
UsbClass->VendorId = (UINT16)Strtoi (VIDStr);
2325
}
2326
2327
if (*PIDStr == '\0') {
2328
UsbClass->ProductId = 0xFFFF;
2329
} else {
2330
UsbClass->ProductId = (UINT16)Strtoi (PIDStr);
2331
}
2332
2333
if (*ProtocolStr == '\0') {
2334
UsbClass->DeviceProtocol = 0xFF;
2335
} else {
2336
UsbClass->DeviceProtocol = (UINT8)Strtoi (ProtocolStr);
2337
}
2338
2339
return (EFI_DEVICE_PATH_PROTOCOL *)UsbClass;
2340
}
2341
2342
/**
2343
Converts a text device path node to USB class device path structure.
2344
2345
@param TextDeviceNode The input Text device path node.
2346
2347
@return A pointer to the newly-created USB class device path structure.
2348
2349
**/
2350
static
2351
EFI_DEVICE_PATH_PROTOCOL *
2352
DevPathFromTextUsbClass (
2353
IN CHAR16 *TextDeviceNode
2354
)
2355
{
2356
USB_CLASS_TEXT UsbClassText;
2357
2358
UsbClassText.ClassExist = TRUE;
2359
UsbClassText.SubClassExist = TRUE;
2360
2361
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2362
}
2363
2364
/**
2365
Converts a text device path node to USB audio device path structure.
2366
2367
@param TextDeviceNode The input Text device path node.
2368
2369
@return A pointer to the newly-created USB audio device path structure.
2370
2371
**/
2372
static
2373
EFI_DEVICE_PATH_PROTOCOL *
2374
DevPathFromTextUsbAudio (
2375
IN CHAR16 *TextDeviceNode
2376
)
2377
{
2378
USB_CLASS_TEXT UsbClassText;
2379
2380
UsbClassText.ClassExist = FALSE;
2381
UsbClassText.Class = USB_CLASS_AUDIO;
2382
UsbClassText.SubClassExist = TRUE;
2383
2384
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2385
}
2386
2387
/**
2388
Converts a text device path node to USB CDC Control device path structure.
2389
2390
@param TextDeviceNode The input Text device path node.
2391
2392
@return A pointer to the newly-created USB CDC Control device path structure.
2393
2394
**/
2395
static
2396
EFI_DEVICE_PATH_PROTOCOL *
2397
DevPathFromTextUsbCDCControl (
2398
IN CHAR16 *TextDeviceNode
2399
)
2400
{
2401
USB_CLASS_TEXT UsbClassText;
2402
2403
UsbClassText.ClassExist = FALSE;
2404
UsbClassText.Class = USB_CLASS_CDCCONTROL;
2405
UsbClassText.SubClassExist = TRUE;
2406
2407
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2408
}
2409
2410
/**
2411
Converts a text device path node to USB HID device path structure.
2412
2413
@param TextDeviceNode The input Text device path node.
2414
2415
@return A pointer to the newly-created USB HID device path structure.
2416
2417
**/
2418
static
2419
EFI_DEVICE_PATH_PROTOCOL *
2420
DevPathFromTextUsbHID (
2421
IN CHAR16 *TextDeviceNode
2422
)
2423
{
2424
USB_CLASS_TEXT UsbClassText;
2425
2426
UsbClassText.ClassExist = FALSE;
2427
UsbClassText.Class = USB_CLASS_HID;
2428
UsbClassText.SubClassExist = TRUE;
2429
2430
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2431
}
2432
2433
/**
2434
Converts a text device path node to USB Image device path structure.
2435
2436
@param TextDeviceNode The input Text device path node.
2437
2438
@return A pointer to the newly-created USB Image device path structure.
2439
2440
**/
2441
static
2442
EFI_DEVICE_PATH_PROTOCOL *
2443
DevPathFromTextUsbImage (
2444
IN CHAR16 *TextDeviceNode
2445
)
2446
{
2447
USB_CLASS_TEXT UsbClassText;
2448
2449
UsbClassText.ClassExist = FALSE;
2450
UsbClassText.Class = USB_CLASS_IMAGE;
2451
UsbClassText.SubClassExist = TRUE;
2452
2453
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2454
}
2455
2456
/**
2457
Converts a text device path node to USB Print device path structure.
2458
2459
@param TextDeviceNode The input Text device path node.
2460
2461
@return A pointer to the newly-created USB Print device path structure.
2462
2463
**/
2464
static
2465
EFI_DEVICE_PATH_PROTOCOL *
2466
DevPathFromTextUsbPrinter (
2467
IN CHAR16 *TextDeviceNode
2468
)
2469
{
2470
USB_CLASS_TEXT UsbClassText;
2471
2472
UsbClassText.ClassExist = FALSE;
2473
UsbClassText.Class = USB_CLASS_PRINTER;
2474
UsbClassText.SubClassExist = TRUE;
2475
2476
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2477
}
2478
2479
/**
2480
Converts a text device path node to USB mass storage device path structure.
2481
2482
@param TextDeviceNode The input Text device path node.
2483
2484
@return A pointer to the newly-created USB mass storage device path structure.
2485
2486
**/
2487
static
2488
EFI_DEVICE_PATH_PROTOCOL *
2489
DevPathFromTextUsbMassStorage (
2490
IN CHAR16 *TextDeviceNode
2491
)
2492
{
2493
USB_CLASS_TEXT UsbClassText;
2494
2495
UsbClassText.ClassExist = FALSE;
2496
UsbClassText.Class = USB_CLASS_MASS_STORAGE;
2497
UsbClassText.SubClassExist = TRUE;
2498
2499
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2500
}
2501
2502
/**
2503
Converts a text device path node to USB HUB device path structure.
2504
2505
@param TextDeviceNode The input Text device path node.
2506
2507
@return A pointer to the newly-created USB HUB device path structure.
2508
2509
**/
2510
static
2511
EFI_DEVICE_PATH_PROTOCOL *
2512
DevPathFromTextUsbHub (
2513
IN CHAR16 *TextDeviceNode
2514
)
2515
{
2516
USB_CLASS_TEXT UsbClassText;
2517
2518
UsbClassText.ClassExist = FALSE;
2519
UsbClassText.Class = USB_CLASS_HUB;
2520
UsbClassText.SubClassExist = TRUE;
2521
2522
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2523
}
2524
2525
/**
2526
Converts a text device path node to USB CDC data device path structure.
2527
2528
@param TextDeviceNode The input Text device path node.
2529
2530
@return A pointer to the newly-created USB CDC data device path structure.
2531
2532
**/
2533
static
2534
EFI_DEVICE_PATH_PROTOCOL *
2535
DevPathFromTextUsbCDCData (
2536
IN CHAR16 *TextDeviceNode
2537
)
2538
{
2539
USB_CLASS_TEXT UsbClassText;
2540
2541
UsbClassText.ClassExist = FALSE;
2542
UsbClassText.Class = USB_CLASS_CDCDATA;
2543
UsbClassText.SubClassExist = TRUE;
2544
2545
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2546
}
2547
2548
/**
2549
Converts a text device path node to USB smart card device path structure.
2550
2551
@param TextDeviceNode The input Text device path node.
2552
2553
@return A pointer to the newly-created USB smart card device path structure.
2554
2555
**/
2556
static
2557
EFI_DEVICE_PATH_PROTOCOL *
2558
DevPathFromTextUsbSmartCard (
2559
IN CHAR16 *TextDeviceNode
2560
)
2561
{
2562
USB_CLASS_TEXT UsbClassText;
2563
2564
UsbClassText.ClassExist = FALSE;
2565
UsbClassText.Class = USB_CLASS_SMART_CARD;
2566
UsbClassText.SubClassExist = TRUE;
2567
2568
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2569
}
2570
2571
/**
2572
Converts a text device path node to USB video device path structure.
2573
2574
@param TextDeviceNode The input Text device path node.
2575
2576
@return A pointer to the newly-created USB video device path structure.
2577
2578
**/
2579
static
2580
EFI_DEVICE_PATH_PROTOCOL *
2581
DevPathFromTextUsbVideo (
2582
IN CHAR16 *TextDeviceNode
2583
)
2584
{
2585
USB_CLASS_TEXT UsbClassText;
2586
2587
UsbClassText.ClassExist = FALSE;
2588
UsbClassText.Class = USB_CLASS_VIDEO;
2589
UsbClassText.SubClassExist = TRUE;
2590
2591
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2592
}
2593
2594
/**
2595
Converts a text device path node to USB diagnostic device path structure.
2596
2597
@param TextDeviceNode The input Text device path node.
2598
2599
@return A pointer to the newly-created USB diagnostic device path structure.
2600
2601
**/
2602
static
2603
EFI_DEVICE_PATH_PROTOCOL *
2604
DevPathFromTextUsbDiagnostic (
2605
IN CHAR16 *TextDeviceNode
2606
)
2607
{
2608
USB_CLASS_TEXT UsbClassText;
2609
2610
UsbClassText.ClassExist = FALSE;
2611
UsbClassText.Class = USB_CLASS_DIAGNOSTIC;
2612
UsbClassText.SubClassExist = TRUE;
2613
2614
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2615
}
2616
2617
/**
2618
Converts a text device path node to USB wireless device path structure.
2619
2620
@param TextDeviceNode The input Text device path node.
2621
2622
@return A pointer to the newly-created USB wireless device path structure.
2623
2624
**/
2625
static
2626
EFI_DEVICE_PATH_PROTOCOL *
2627
DevPathFromTextUsbWireless (
2628
IN CHAR16 *TextDeviceNode
2629
)
2630
{
2631
USB_CLASS_TEXT UsbClassText;
2632
2633
UsbClassText.ClassExist = FALSE;
2634
UsbClassText.Class = USB_CLASS_WIRELESS;
2635
UsbClassText.SubClassExist = TRUE;
2636
2637
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2638
}
2639
2640
/**
2641
Converts a text device path node to USB device firmware update device path structure.
2642
2643
@param TextDeviceNode The input Text device path node.
2644
2645
@return A pointer to the newly-created USB device firmware update device path structure.
2646
2647
**/
2648
static
2649
EFI_DEVICE_PATH_PROTOCOL *
2650
DevPathFromTextUsbDeviceFirmwareUpdate (
2651
IN CHAR16 *TextDeviceNode
2652
)
2653
{
2654
USB_CLASS_TEXT UsbClassText;
2655
2656
UsbClassText.ClassExist = FALSE;
2657
UsbClassText.Class = USB_CLASS_RESERVE;
2658
UsbClassText.SubClassExist = FALSE;
2659
UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;
2660
2661
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2662
}
2663
2664
/**
2665
Converts a text device path node to USB IRDA bridge device path structure.
2666
2667
@param TextDeviceNode The input Text device path node.
2668
2669
@return A pointer to the newly-created USB IRDA bridge device path structure.
2670
2671
**/
2672
static
2673
EFI_DEVICE_PATH_PROTOCOL *
2674
DevPathFromTextUsbIrdaBridge (
2675
IN CHAR16 *TextDeviceNode
2676
)
2677
{
2678
USB_CLASS_TEXT UsbClassText;
2679
2680
UsbClassText.ClassExist = FALSE;
2681
UsbClassText.Class = USB_CLASS_RESERVE;
2682
UsbClassText.SubClassExist = FALSE;
2683
UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;
2684
2685
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2686
}
2687
2688
/**
2689
Converts a text device path node to USB text and measurement device path structure.
2690
2691
@param TextDeviceNode The input Text device path node.
2692
2693
@return A pointer to the newly-created USB text and measurement device path structure.
2694
2695
**/
2696
static
2697
EFI_DEVICE_PATH_PROTOCOL *
2698
DevPathFromTextUsbTestAndMeasurement (
2699
IN CHAR16 *TextDeviceNode
2700
)
2701
{
2702
USB_CLASS_TEXT UsbClassText;
2703
2704
UsbClassText.ClassExist = FALSE;
2705
UsbClassText.Class = USB_CLASS_RESERVE;
2706
UsbClassText.SubClassExist = FALSE;
2707
UsbClassText.SubClass = USB_SUBCLASS_TEST;
2708
2709
return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
2710
}
2711
2712
/**
2713
Converts a text device path node to USB WWID device path structure.
2714
2715
@param TextDeviceNode The input Text device path node.
2716
2717
@return A pointer to the newly-created USB WWID device path structure.
2718
2719
**/
2720
static
2721
EFI_DEVICE_PATH_PROTOCOL *
2722
DevPathFromTextUsbWwid (
2723
IN CHAR16 *TextDeviceNode
2724
)
2725
{
2726
CHAR16 *VIDStr;
2727
CHAR16 *PIDStr;
2728
CHAR16 *InterfaceNumStr;
2729
CHAR16 *SerialNumberStr;
2730
USB_WWID_DEVICE_PATH *UsbWwid;
2731
UINTN SerialNumberStrLen;
2732
2733
VIDStr = GetNextParamStr (&TextDeviceNode);
2734
PIDStr = GetNextParamStr (&TextDeviceNode);
2735
InterfaceNumStr = GetNextParamStr (&TextDeviceNode);
2736
SerialNumberStr = GetNextParamStr (&TextDeviceNode);
2737
SerialNumberStrLen = StrLen (SerialNumberStr);
2738
if ((SerialNumberStrLen >= 2) &&
2739
(SerialNumberStr[0] == '\"') &&
2740
(SerialNumberStr[SerialNumberStrLen - 1] == '\"')
2741
)
2742
{
2743
SerialNumberStr[SerialNumberStrLen - 1] = '\0';
2744
SerialNumberStr++;
2745
SerialNumberStrLen -= 2;
2746
}
2747
2748
UsbWwid = (USB_WWID_DEVICE_PATH *)CreateDeviceNode (
2749
MESSAGING_DEVICE_PATH,
2750
MSG_USB_WWID_DP,
2751
(UINT16)(sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))
2752
);
2753
2754
if (UsbWwid != NULL) {
2755
UsbWwid->VendorId = (UINT16)Strtoi (VIDStr);
2756
UsbWwid->ProductId = (UINT16)Strtoi (PIDStr);
2757
UsbWwid->InterfaceNumber = (UINT16)Strtoi (InterfaceNumStr);
2758
2759
//
2760
// There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.
2761
// Therefore, the '\0' will not be copied.
2762
//
2763
CopyMem (
2764
(UINT8 *)UsbWwid + sizeof (USB_WWID_DEVICE_PATH),
2765
SerialNumberStr,
2766
SerialNumberStrLen * sizeof (CHAR16)
2767
);
2768
}
2769
2770
return (EFI_DEVICE_PATH_PROTOCOL *)UsbWwid;
2771
}
2772
2773
/**
2774
Converts a text device path node to Logic Unit device path structure.
2775
2776
@param TextDeviceNode The input Text device path node.
2777
2778
@return A pointer to the newly-created Logic Unit device path structure.
2779
2780
**/
2781
static
2782
EFI_DEVICE_PATH_PROTOCOL *
2783
DevPathFromTextUnit (
2784
IN CHAR16 *TextDeviceNode
2785
)
2786
{
2787
CHAR16 *LunStr;
2788
DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
2789
2790
LunStr = GetNextParamStr (&TextDeviceNode);
2791
LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *)CreateDeviceNode (
2792
MESSAGING_DEVICE_PATH,
2793
MSG_DEVICE_LOGICAL_UNIT_DP,
2794
(UINT16)sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
2795
);
2796
2797
if (LogicalUnit != NULL) {
2798
LogicalUnit->Lun = (UINT8)Strtoi (LunStr);
2799
}
2800
2801
return (EFI_DEVICE_PATH_PROTOCOL *)LogicalUnit;
2802
}
2803
2804
/**
2805
Converts a text device path node to iSCSI device path structure.
2806
2807
@param TextDeviceNode The input Text device path node.
2808
2809
@return A pointer to the newly-created iSCSI device path structure.
2810
2811
**/
2812
static
2813
EFI_DEVICE_PATH_PROTOCOL *
2814
DevPathFromTextiSCSI (
2815
IN CHAR16 *TextDeviceNode
2816
)
2817
{
2818
UINT16 Options;
2819
CHAR16 *NameStr;
2820
CHAR16 *PortalGroupStr;
2821
CHAR16 *LunStr;
2822
CHAR16 *HeaderDigestStr;
2823
CHAR16 *DataDigestStr;
2824
CHAR16 *AuthenticationStr;
2825
CHAR16 *ProtocolStr;
2826
CHAR8 *AsciiStr;
2827
ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;
2828
UINT64 Lun;
2829
2830
NameStr = GetNextParamStr (&TextDeviceNode);
2831
PortalGroupStr = GetNextParamStr (&TextDeviceNode);
2832
LunStr = GetNextParamStr (&TextDeviceNode);
2833
HeaderDigestStr = GetNextParamStr (&TextDeviceNode);
2834
DataDigestStr = GetNextParamStr (&TextDeviceNode);
2835
AuthenticationStr = GetNextParamStr (&TextDeviceNode);
2836
ProtocolStr = GetNextParamStr (&TextDeviceNode);
2837
ISCSIDevPath = (ISCSI_DEVICE_PATH_WITH_NAME *)CreateDeviceNode (
2838
MESSAGING_DEVICE_PATH,
2839
MSG_ISCSI_DP,
2840
(UINT16)(sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))
2841
);
2842
2843
if (ISCSIDevPath == NULL) {
2844
return (EFI_DEVICE_PATH_PROTOCOL *)ISCSIDevPath;
2845
}
2846
2847
AsciiStr = ISCSIDevPath->TargetName;
2848
StrToAscii (NameStr, &AsciiStr);
2849
2850
ISCSIDevPath->TargetPortalGroupTag = (UINT16)Strtoi (PortalGroupStr);
2851
Strtoi64 (LunStr, &Lun);
2852
WriteUnaligned64 ((UINT64 *)&ISCSIDevPath->Lun, SwapBytes64 (Lun));
2853
2854
Options = 0x0000;
2855
if (StrCmp (HeaderDigestStr, "CRC32C") == 0) {
2856
Options |= 0x0002;
2857
}
2858
2859
if (StrCmp (DataDigestStr, "CRC32C") == 0) {
2860
Options |= 0x0008;
2861
}
2862
2863
if (StrCmp (AuthenticationStr, "None") == 0) {
2864
Options |= 0x0800;
2865
}
2866
2867
if (StrCmp (AuthenticationStr, "CHAP_UNI") == 0) {
2868
Options |= 0x1000;
2869
}
2870
2871
ISCSIDevPath->LoginOption = (UINT16)Options;
2872
2873
if (IS_NULL (*ProtocolStr) || (StrCmp (ProtocolStr, "TCP") == 0)) {
2874
ISCSIDevPath->NetworkProtocol = 0;
2875
} else {
2876
//
2877
// Undefined and reserved.
2878
//
2879
ISCSIDevPath->NetworkProtocol = 1;
2880
}
2881
2882
return (EFI_DEVICE_PATH_PROTOCOL *)ISCSIDevPath;
2883
}
2884
2885
/**
2886
Converts a text device path node to VLAN device path structure.
2887
2888
@param TextDeviceNode The input Text device path node.
2889
2890
@return A pointer to the newly-created VLAN device path structure.
2891
2892
**/
2893
static
2894
EFI_DEVICE_PATH_PROTOCOL *
2895
DevPathFromTextVlan (
2896
IN CHAR16 *TextDeviceNode
2897
)
2898
{
2899
CHAR16 *VlanStr;
2900
VLAN_DEVICE_PATH *Vlan;
2901
2902
VlanStr = GetNextParamStr (&TextDeviceNode);
2903
Vlan = (VLAN_DEVICE_PATH *)CreateDeviceNode (
2904
MESSAGING_DEVICE_PATH,
2905
MSG_VLAN_DP,
2906
(UINT16)sizeof (VLAN_DEVICE_PATH)
2907
);
2908
2909
if (Vlan != NULL) {
2910
Vlan->VlanId = (UINT16)Strtoi (VlanStr);
2911
}
2912
2913
return (EFI_DEVICE_PATH_PROTOCOL *)Vlan;
2914
}
2915
2916
/**
2917
Converts a text device path node to Bluetooth device path structure.
2918
2919
@param TextDeviceNode The input Text device path node.
2920
2921
@return A pointer to the newly-created Bluetooth device path structure.
2922
2923
**/
2924
static
2925
EFI_DEVICE_PATH_PROTOCOL *
2926
DevPathFromTextBluetooth (
2927
IN CHAR16 *TextDeviceNode
2928
)
2929
{
2930
CHAR16 *BluetoothStr;
2931
BLUETOOTH_DEVICE_PATH *BluetoothDp;
2932
2933
BluetoothStr = GetNextParamStr (&TextDeviceNode);
2934
BluetoothDp = (BLUETOOTH_DEVICE_PATH *)CreateDeviceNode (
2935
MESSAGING_DEVICE_PATH,
2936
MSG_BLUETOOTH_DP,
2937
(UINT16)sizeof (BLUETOOTH_DEVICE_PATH)
2938
);
2939
2940
if (BluetoothDp != NULL) {
2941
StrHexToBytes (
2942
BluetoothStr,
2943
sizeof (BLUETOOTH_ADDRESS) * 2,
2944
BluetoothDp->BD_ADDR.Address,
2945
sizeof (BLUETOOTH_ADDRESS)
2946
);
2947
}
2948
2949
return (EFI_DEVICE_PATH_PROTOCOL *)BluetoothDp;
2950
}
2951
2952
/**
2953
Converts a text device path node to Wi-Fi device path structure.
2954
2955
@param TextDeviceNode The input Text device path node.
2956
2957
@return A pointer to the newly-created Wi-Fi device path structure.
2958
2959
**/
2960
static
2961
EFI_DEVICE_PATH_PROTOCOL *
2962
DevPathFromTextWiFi (
2963
IN CHAR16 *TextDeviceNode
2964
)
2965
{
2966
CHAR16 *SSIdStr;
2967
CHAR8 AsciiStr[33];
2968
UINTN DataLen;
2969
WIFI_DEVICE_PATH *WiFiDp;
2970
2971
SSIdStr = GetNextParamStr (&TextDeviceNode);
2972
WiFiDp = (WIFI_DEVICE_PATH *)CreateDeviceNode (
2973
MESSAGING_DEVICE_PATH,
2974
MSG_WIFI_DP,
2975
(UINT16)sizeof (WIFI_DEVICE_PATH)
2976
);
2977
2978
if ((NULL != SSIdStr) && (NULL != WiFiDp)) {
2979
DataLen = StrLen (SSIdStr);
2980
if (StrLen (SSIdStr) > 32) {
2981
SSIdStr[32] = '\0';
2982
DataLen = 32;
2983
}
2984
2985
UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));
2986
CopyMem (WiFiDp->SSId, AsciiStr, DataLen);
2987
}
2988
2989
return (EFI_DEVICE_PATH_PROTOCOL *)WiFiDp;
2990
}
2991
2992
/**
2993
Converts a text device path node to Bluetooth LE device path structure.
2994
2995
@param TextDeviceNode The input Text device path node.
2996
2997
@return A pointer to the newly-created Bluetooth LE device path structure.
2998
2999
**/
3000
static
3001
EFI_DEVICE_PATH_PROTOCOL *
3002
DevPathFromTextBluetoothLE (
3003
IN CHAR16 *TextDeviceNode
3004
)
3005
{
3006
CHAR16 *BluetoothLeAddrStr;
3007
CHAR16 *BluetoothLeAddrTypeStr;
3008
BLUETOOTH_LE_DEVICE_PATH *BluetoothLeDp;
3009
3010
BluetoothLeAddrStr = GetNextParamStr (&TextDeviceNode);
3011
BluetoothLeAddrTypeStr = GetNextParamStr (&TextDeviceNode);
3012
BluetoothLeDp = (BLUETOOTH_LE_DEVICE_PATH *)CreateDeviceNode (
3013
MESSAGING_DEVICE_PATH,
3014
MSG_BLUETOOTH_LE_DP,
3015
(UINT16)sizeof (BLUETOOTH_LE_DEVICE_PATH)
3016
);
3017
3018
if (BluetoothLeDp != NULL) {
3019
BluetoothLeDp->Address.Type = (UINT8)Strtoi (BluetoothLeAddrTypeStr);
3020
StrHexToBytes (
3021
BluetoothLeAddrStr,
3022
sizeof (BluetoothLeDp->Address.Address) * 2,
3023
BluetoothLeDp->Address.Address,
3024
sizeof (BluetoothLeDp->Address.Address)
3025
);
3026
}
3027
3028
return (EFI_DEVICE_PATH_PROTOCOL *)BluetoothLeDp;
3029
}
3030
3031
/**
3032
Converts a text device path node to DNS device path structure.
3033
3034
@param TextDeviceNode The input Text device path node.
3035
3036
@return A pointer to the newly-created DNS device path structure.
3037
3038
**/
3039
static
3040
EFI_DEVICE_PATH_PROTOCOL *
3041
DevPathFromTextDns (
3042
IN CHAR16 *TextDeviceNode
3043
)
3044
{
3045
CHAR16 *DeviceNodeStr;
3046
CHAR16 *DeviceNodeStrPtr;
3047
UINT32 DnsServerIpCount;
3048
UINT16 DnsDeviceNodeLength;
3049
DNS_DEVICE_PATH *DnsDeviceNode;
3050
UINT32 DnsServerIpIndex;
3051
CHAR16 *DnsServerIp;
3052
3053
//
3054
// Count the DNS server address number.
3055
//
3056
DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
3057
if (DeviceNodeStr == NULL) {
3058
return NULL;
3059
}
3060
3061
DeviceNodeStrPtr = DeviceNodeStr;
3062
3063
DnsServerIpCount = 0;
3064
while (DeviceNodeStrPtr != NULL && *DeviceNodeStrPtr != '\0') {
3065
GetNextParamStr (&DeviceNodeStrPtr);
3066
DnsServerIpCount++;
3067
}
3068
3069
FreePool (DeviceNodeStr);
3070
DeviceNodeStr = NULL;
3071
3072
//
3073
// One or more instances of the DNS server address in EFI_IP_ADDRESS,
3074
// otherwise, NULL will be returned.
3075
//
3076
if (DnsServerIpCount == 0) {
3077
return NULL;
3078
}
3079
3080
//
3081
// Create the DNS DeviceNode.
3082
//
3083
DnsDeviceNodeLength = (UINT16)(sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
3084
DnsDeviceNode = (DNS_DEVICE_PATH *)CreateDeviceNode (
3085
MESSAGING_DEVICE_PATH,
3086
MSG_DNS_DP,
3087
DnsDeviceNodeLength
3088
);
3089
if (DnsDeviceNode == NULL) {
3090
return NULL;
3091
}
3092
3093
//
3094
// Confirm the DNS server address is IPv4 or IPv6 type.
3095
//
3096
DeviceNodeStrPtr = TextDeviceNode;
3097
while (!IS_NULL (*DeviceNodeStrPtr)) {
3098
if (*DeviceNodeStrPtr == '.') {
3099
DnsDeviceNode->IsIPv6 = 0x00;
3100
break;
3101
}
3102
3103
if (*DeviceNodeStrPtr == ':') {
3104
DnsDeviceNode->IsIPv6 = 0x01;
3105
break;
3106
}
3107
3108
DeviceNodeStrPtr++;
3109
}
3110
3111
for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
3112
DnsServerIp = GetNextParamStr (&TextDeviceNode);
3113
if (DnsDeviceNode->IsIPv6 == 0x00) {
3114
StrToIpv4Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);
3115
} else {
3116
StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);
3117
}
3118
}
3119
3120
return (EFI_DEVICE_PATH_PROTOCOL *)DnsDeviceNode;
3121
}
3122
3123
/**
3124
Converts a text device path node to URI device path structure.
3125
3126
@param TextDeviceNode The input Text device path node.
3127
3128
@return A pointer to the newly-created URI device path structure.
3129
3130
**/
3131
static
3132
EFI_DEVICE_PATH_PROTOCOL *
3133
DevPathFromTextUri (
3134
IN CHAR16 *TextDeviceNode
3135
)
3136
{
3137
CHAR16 *UriStr;
3138
UINTN UriLength;
3139
URI_DEVICE_PATH *Uri;
3140
3141
UriStr = GetNextParamStr (&TextDeviceNode);
3142
UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));
3143
Uri = (URI_DEVICE_PATH *)CreateDeviceNode (
3144
MESSAGING_DEVICE_PATH,
3145
MSG_URI_DP,
3146
(UINT16)(sizeof (URI_DEVICE_PATH) + UriLength)
3147
);
3148
3149
while (Uri != NULL && UriLength-- != 0) {
3150
Uri->Uri[UriLength] = (CHAR8)UriStr[UriLength];
3151
}
3152
3153
return (EFI_DEVICE_PATH_PROTOCOL *)Uri;
3154
}
3155
3156
/**
3157
Converts a media text device path node to media device path structure.
3158
3159
@param TextDeviceNode The input Text device path node.
3160
3161
@return A pointer to media device path structure.
3162
3163
**/
3164
static
3165
EFI_DEVICE_PATH_PROTOCOL *
3166
DevPathFromTextMediaPath (
3167
IN CHAR16 *TextDeviceNode
3168
)
3169
{
3170
return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);
3171
}
3172
3173
/**
3174
Converts a text device path node to HD device path structure.
3175
3176
@param TextDeviceNode The input Text device path node.
3177
3178
@return A pointer to the newly-created HD device path structure.
3179
3180
**/
3181
static
3182
EFI_DEVICE_PATH_PROTOCOL *
3183
DevPathFromTextHD (
3184
IN CHAR16 *TextDeviceNode
3185
)
3186
{
3187
CHAR16 *PartitionStr;
3188
CHAR16 *TypeStr;
3189
CHAR16 *SignatureStr;
3190
CHAR16 *StartStr;
3191
CHAR16 *SizeStr;
3192
UINT32 Signature32;
3193
HARDDRIVE_DEVICE_PATH *Hd;
3194
3195
PartitionStr = GetNextParamStr (&TextDeviceNode);
3196
TypeStr = GetNextParamStr (&TextDeviceNode);
3197
SignatureStr = GetNextParamStr (&TextDeviceNode);
3198
StartStr = GetNextParamStr (&TextDeviceNode);
3199
SizeStr = GetNextParamStr (&TextDeviceNode);
3200
Hd = (HARDDRIVE_DEVICE_PATH *)CreateDeviceNode (
3201
MEDIA_DEVICE_PATH,
3202
MEDIA_HARDDRIVE_DP,
3203
(UINT16)sizeof (HARDDRIVE_DEVICE_PATH)
3204
);
3205
3206
if (Hd == NULL) {
3207
return (EFI_DEVICE_PATH_PROTOCOL *)Hd;
3208
}
3209
3210
Hd->PartitionNumber = (UINT32)Strtoi (PartitionStr);
3211
3212
ZeroMem (Hd->Signature, 16);
3213
Hd->MBRType = (UINT8)0;
3214
3215
if (StrCmp (TypeStr, "MBR") == 0) {
3216
Hd->SignatureType = SIGNATURE_TYPE_MBR;
3217
Hd->MBRType = 0x01;
3218
3219
Signature32 = (UINT32)Strtoi (SignatureStr);
3220
CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
3221
} else if (StrCmp (TypeStr, "GPT") == 0) {
3222
Hd->SignatureType = SIGNATURE_TYPE_GUID;
3223
Hd->MBRType = 0x02;
3224
3225
StrToGuid (SignatureStr, (EFI_GUID *)Hd->Signature);
3226
} else {
3227
Hd->SignatureType = (UINT8)Strtoi (TypeStr);
3228
}
3229
3230
Strtoi64 (StartStr, &Hd->PartitionStart);
3231
Strtoi64 (SizeStr, &Hd->PartitionSize);
3232
3233
return (EFI_DEVICE_PATH_PROTOCOL *)Hd;
3234
}
3235
3236
/**
3237
Converts a text device path node to CDROM device path structure.
3238
3239
@param TextDeviceNode The input Text device path node.
3240
3241
@return A pointer to the newly-created CDROM device path structure.
3242
3243
**/
3244
static
3245
EFI_DEVICE_PATH_PROTOCOL *
3246
DevPathFromTextCDROM (
3247
IN CHAR16 *TextDeviceNode
3248
)
3249
{
3250
CHAR16 *EntryStr;
3251
CHAR16 *StartStr;
3252
CHAR16 *SizeStr;
3253
CDROM_DEVICE_PATH *CDROMDevPath;
3254
3255
EntryStr = GetNextParamStr (&TextDeviceNode);
3256
StartStr = GetNextParamStr (&TextDeviceNode);
3257
SizeStr = GetNextParamStr (&TextDeviceNode);
3258
CDROMDevPath = (CDROM_DEVICE_PATH *)CreateDeviceNode (
3259
MEDIA_DEVICE_PATH,
3260
MEDIA_CDROM_DP,
3261
(UINT16)sizeof (CDROM_DEVICE_PATH)
3262
);
3263
3264
if (CDROMDevPath != NULL) {
3265
CDROMDevPath->BootEntry = (UINT32)Strtoi (EntryStr);
3266
Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);
3267
Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);
3268
}
3269
3270
return (EFI_DEVICE_PATH_PROTOCOL *)CDROMDevPath;
3271
}
3272
3273
/**
3274
Converts a text device path node to Vendor-defined media device path structure.
3275
3276
@param TextDeviceNode The input Text device path node.
3277
3278
@return A pointer to the newly-created Vendor-defined media device path structure.
3279
3280
**/
3281
static
3282
EFI_DEVICE_PATH_PROTOCOL *
3283
DevPathFromTextVenMedia (
3284
IN CHAR16 *TextDeviceNode
3285
)
3286
{
3287
return ConvertFromTextVendor (
3288
TextDeviceNode,
3289
MEDIA_DEVICE_PATH,
3290
MEDIA_VENDOR_DP
3291
);
3292
}
3293
3294
/**
3295
Converts a text device path node to File device path structure.
3296
3297
@param TextDeviceNode The input Text device path node.
3298
3299
@return A pointer to the newly-created File device path structure.
3300
3301
**/
3302
static
3303
EFI_DEVICE_PATH_PROTOCOL *
3304
DevPathFromTextFilePath (
3305
IN CHAR16 *TextDeviceNode
3306
)
3307
{
3308
FILEPATH_DEVICE_PATH *File;
3309
3310
#ifndef __FreeBSD__
3311
File = (FILEPATH_DEVICE_PATH *)CreateDeviceNode (
3312
MEDIA_DEVICE_PATH,
3313
MEDIA_FILEPATH_DP,
3314
(UINT16)(sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)
3315
);
3316
3317
if (File != NULL) {
3318
StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);
3319
}
3320
#else
3321
size_t len = (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2);
3322
efi_char *v;
3323
File = (FILEPATH_DEVICE_PATH *)CreateDeviceNode (
3324
MEDIA_DEVICE_PATH,
3325
MEDIA_FILEPATH_DP,
3326
(UINT16)len
3327
);
3328
if (File != NULL) {
3329
v = File->PathName;
3330
utf8_to_ucs2(TextDeviceNode, &v, &len);
3331
}
3332
#endif
3333
3334
return (EFI_DEVICE_PATH_PROTOCOL *)File;
3335
}
3336
3337
/**
3338
Converts a text device path node to Media protocol device path structure.
3339
3340
@param TextDeviceNode The input Text device path node.
3341
3342
@return A pointer to the newly-created Media protocol device path structure.
3343
3344
**/
3345
static
3346
EFI_DEVICE_PATH_PROTOCOL *
3347
DevPathFromTextMedia (
3348
IN CHAR16 *TextDeviceNode
3349
)
3350
{
3351
CHAR16 *GuidStr;
3352
MEDIA_PROTOCOL_DEVICE_PATH *Media;
3353
3354
GuidStr = GetNextParamStr (&TextDeviceNode);
3355
Media = (MEDIA_PROTOCOL_DEVICE_PATH *)CreateDeviceNode (
3356
MEDIA_DEVICE_PATH,
3357
MEDIA_PROTOCOL_DP,
3358
(UINT16)sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
3359
);
3360
3361
if (Media != NULL) {
3362
StrToGuid (GuidStr, &Media->Protocol);
3363
}
3364
3365
return (EFI_DEVICE_PATH_PROTOCOL *)Media;
3366
}
3367
3368
/**
3369
Converts a text device path node to firmware volume device path structure.
3370
3371
@param TextDeviceNode The input Text device path node.
3372
3373
@return A pointer to the newly-created firmware volume device path structure.
3374
3375
**/
3376
static
3377
EFI_DEVICE_PATH_PROTOCOL *
3378
DevPathFromTextFv (
3379
IN CHAR16 *TextDeviceNode
3380
)
3381
{
3382
CHAR16 *GuidStr;
3383
MEDIA_FW_VOL_DEVICE_PATH *Fv;
3384
3385
GuidStr = GetNextParamStr (&TextDeviceNode);
3386
Fv = (MEDIA_FW_VOL_DEVICE_PATH *)CreateDeviceNode (
3387
MEDIA_DEVICE_PATH,
3388
MEDIA_PIWG_FW_VOL_DP,
3389
(UINT16)sizeof (MEDIA_FW_VOL_DEVICE_PATH)
3390
);
3391
3392
if (Fv != NULL) {
3393
StrToGuid (GuidStr, &Fv->FvName);
3394
}
3395
3396
return (EFI_DEVICE_PATH_PROTOCOL *)Fv;
3397
}
3398
3399
/**
3400
Converts a text device path node to firmware file device path structure.
3401
3402
@param TextDeviceNode The input Text device path node.
3403
3404
@return A pointer to the newly-created firmware file device path structure.
3405
3406
**/
3407
static
3408
EFI_DEVICE_PATH_PROTOCOL *
3409
DevPathFromTextFvFile (
3410
IN CHAR16 *TextDeviceNode
3411
)
3412
{
3413
CHAR16 *GuidStr;
3414
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFile;
3415
3416
GuidStr = GetNextParamStr (&TextDeviceNode);
3417
FvFile = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)CreateDeviceNode (
3418
MEDIA_DEVICE_PATH,
3419
MEDIA_PIWG_FW_FILE_DP,
3420
(UINT16)sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)
3421
);
3422
3423
if (FvFile != NULL) {
3424
StrToGuid (GuidStr, &FvFile->FvFileName);
3425
}
3426
3427
return (EFI_DEVICE_PATH_PROTOCOL *)FvFile;
3428
}
3429
3430
/**
3431
Converts a text device path node to text relative offset device path structure.
3432
3433
@param TextDeviceNode The input Text device path node.
3434
3435
@return A pointer to the newly-created Text device path structure.
3436
3437
**/
3438
static
3439
EFI_DEVICE_PATH_PROTOCOL *
3440
DevPathFromTextRelativeOffsetRange (
3441
IN CHAR16 *TextDeviceNode
3442
)
3443
{
3444
CHAR16 *StartingOffsetStr;
3445
CHAR16 *EndingOffsetStr;
3446
MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
3447
3448
StartingOffsetStr = GetNextParamStr (&TextDeviceNode);
3449
EndingOffsetStr = GetNextParamStr (&TextDeviceNode);
3450
Offset = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *)CreateDeviceNode (
3451
MEDIA_DEVICE_PATH,
3452
MEDIA_RELATIVE_OFFSET_RANGE_DP,
3453
(UINT16)sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)
3454
);
3455
3456
if (Offset != NULL) {
3457
Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);
3458
Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);
3459
}
3460
3461
return (EFI_DEVICE_PATH_PROTOCOL *)Offset;
3462
}
3463
3464
/**
3465
Converts a text device path node to text ram disk device path structure.
3466
3467
@param TextDeviceNode The input Text device path node.
3468
3469
@return A pointer to the newly-created Text device path structure.
3470
3471
**/
3472
static
3473
EFI_DEVICE_PATH_PROTOCOL *
3474
DevPathFromTextRamDisk (
3475
IN CHAR16 *TextDeviceNode
3476
)
3477
{
3478
CHAR16 *StartingAddrStr;
3479
CHAR16 *EndingAddrStr;
3480
CHAR16 *TypeGuidStr;
3481
CHAR16 *InstanceStr;
3482
MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
3483
UINT64 StartingAddr;
3484
UINT64 EndingAddr;
3485
3486
StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3487
EndingAddrStr = GetNextParamStr (&TextDeviceNode);
3488
InstanceStr = GetNextParamStr (&TextDeviceNode);
3489
TypeGuidStr = GetNextParamStr (&TextDeviceNode);
3490
RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
3491
MEDIA_DEVICE_PATH,
3492
MEDIA_RAM_DISK_DP,
3493
(UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3494
);
3495
3496
if (RamDisk != NULL) {
3497
Strtoi64 (StartingAddrStr, &StartingAddr);
3498
WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
3499
Strtoi64 (EndingAddrStr, &EndingAddr);
3500
WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
3501
RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
3502
StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);
3503
}
3504
3505
return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
3506
}
3507
3508
/**
3509
Converts a text device path node to text virtual disk device path structure.
3510
3511
@param TextDeviceNode The input Text device path node.
3512
3513
@return A pointer to the newly-created Text device path structure.
3514
3515
**/
3516
static
3517
EFI_DEVICE_PATH_PROTOCOL *
3518
DevPathFromTextVirtualDisk (
3519
IN CHAR16 *TextDeviceNode
3520
)
3521
{
3522
CHAR16 *StartingAddrStr;
3523
CHAR16 *EndingAddrStr;
3524
CHAR16 *InstanceStr;
3525
MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
3526
UINT64 StartingAddr;
3527
UINT64 EndingAddr;
3528
3529
StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3530
EndingAddrStr = GetNextParamStr (&TextDeviceNode);
3531
InstanceStr = GetNextParamStr (&TextDeviceNode);
3532
3533
RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
3534
MEDIA_DEVICE_PATH,
3535
MEDIA_RAM_DISK_DP,
3536
(UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3537
);
3538
3539
if (RamDisk != NULL) {
3540
Strtoi64 (StartingAddrStr, &StartingAddr);
3541
WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
3542
Strtoi64 (EndingAddrStr, &EndingAddr);
3543
WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
3544
RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
3545
CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);
3546
}
3547
3548
return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
3549
}
3550
3551
/**
3552
Converts a text device path node to text virtual cd device path structure.
3553
3554
@param TextDeviceNode The input Text device path node.
3555
3556
@return A pointer to the newly-created Text device path structure.
3557
3558
**/
3559
static
3560
EFI_DEVICE_PATH_PROTOCOL *
3561
DevPathFromTextVirtualCd (
3562
IN CHAR16 *TextDeviceNode
3563
)
3564
{
3565
CHAR16 *StartingAddrStr;
3566
CHAR16 *EndingAddrStr;
3567
CHAR16 *InstanceStr;
3568
MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
3569
UINT64 StartingAddr;
3570
UINT64 EndingAddr;
3571
3572
StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3573
EndingAddrStr = GetNextParamStr (&TextDeviceNode);
3574
InstanceStr = GetNextParamStr (&TextDeviceNode);
3575
3576
RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
3577
MEDIA_DEVICE_PATH,
3578
MEDIA_RAM_DISK_DP,
3579
(UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3580
);
3581
3582
if (RamDisk != NULL) {
3583
Strtoi64 (StartingAddrStr, &StartingAddr);
3584
WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
3585
Strtoi64 (EndingAddrStr, &EndingAddr);
3586
WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
3587
RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
3588
CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);
3589
}
3590
3591
return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
3592
}
3593
3594
/**
3595
Converts a text device path node to text persistent virtual disk device path structure.
3596
3597
@param TextDeviceNode The input Text device path node.
3598
3599
@return A pointer to the newly-created Text device path structure.
3600
3601
**/
3602
static
3603
EFI_DEVICE_PATH_PROTOCOL *
3604
DevPathFromTextPersistentVirtualDisk (
3605
IN CHAR16 *TextDeviceNode
3606
)
3607
{
3608
CHAR16 *StartingAddrStr;
3609
CHAR16 *EndingAddrStr;
3610
CHAR16 *InstanceStr;
3611
MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
3612
UINT64 StartingAddr;
3613
UINT64 EndingAddr;
3614
3615
StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3616
EndingAddrStr = GetNextParamStr (&TextDeviceNode);
3617
InstanceStr = GetNextParamStr (&TextDeviceNode);
3618
3619
RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
3620
MEDIA_DEVICE_PATH,
3621
MEDIA_RAM_DISK_DP,
3622
(UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3623
);
3624
3625
if (RamDisk != NULL) {
3626
Strtoi64 (StartingAddrStr, &StartingAddr);
3627
WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
3628
Strtoi64 (EndingAddrStr, &EndingAddr);
3629
WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
3630
RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
3631
CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);
3632
}
3633
3634
return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
3635
}
3636
3637
/**
3638
Converts a text device path node to text persistent virtual cd device path structure.
3639
3640
@param TextDeviceNode The input Text device path node.
3641
3642
@return A pointer to the newly-created Text device path structure.
3643
3644
**/
3645
static
3646
EFI_DEVICE_PATH_PROTOCOL *
3647
DevPathFromTextPersistentVirtualCd (
3648
IN CHAR16 *TextDeviceNode
3649
)
3650
{
3651
CHAR16 *StartingAddrStr;
3652
CHAR16 *EndingAddrStr;
3653
CHAR16 *InstanceStr;
3654
MEDIA_RAM_DISK_DEVICE_PATH *RamDisk;
3655
UINT64 StartingAddr;
3656
UINT64 EndingAddr;
3657
3658
StartingAddrStr = GetNextParamStr (&TextDeviceNode);
3659
EndingAddrStr = GetNextParamStr (&TextDeviceNode);
3660
InstanceStr = GetNextParamStr (&TextDeviceNode);
3661
3662
RamDisk = (MEDIA_RAM_DISK_DEVICE_PATH *)CreateDeviceNode (
3663
MEDIA_DEVICE_PATH,
3664
MEDIA_RAM_DISK_DP,
3665
(UINT16)sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
3666
);
3667
3668
if (RamDisk != NULL) {
3669
Strtoi64 (StartingAddrStr, &StartingAddr);
3670
WriteUnaligned64 ((UINT64 *)&(RamDisk->StartingAddr[0]), StartingAddr);
3671
Strtoi64 (EndingAddrStr, &EndingAddr);
3672
WriteUnaligned64 ((UINT64 *)&(RamDisk->EndingAddr[0]), EndingAddr);
3673
RamDisk->Instance = (UINT16)Strtoi (InstanceStr);
3674
CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);
3675
}
3676
3677
return (EFI_DEVICE_PATH_PROTOCOL *)RamDisk;
3678
}
3679
3680
/**
3681
Converts a BBS text device path node to BBS device path structure.
3682
3683
@param TextDeviceNode The input Text device path node.
3684
3685
@return A pointer to BBS device path structure.
3686
3687
**/
3688
static
3689
EFI_DEVICE_PATH_PROTOCOL *
3690
DevPathFromTextBbsPath (
3691
IN CHAR16 *TextDeviceNode
3692
)
3693
{
3694
return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);
3695
}
3696
3697
/**
3698
Converts a text device path node to BIOS Boot Specification device path structure.
3699
3700
@param TextDeviceNode The input Text device path node.
3701
3702
@return A pointer to the newly-created BIOS Boot Specification device path structure.
3703
3704
**/
3705
static
3706
EFI_DEVICE_PATH_PROTOCOL *
3707
DevPathFromTextBBS (
3708
IN CHAR16 *TextDeviceNode
3709
)
3710
{
3711
CHAR16 *TypeStr;
3712
CHAR16 *IdStr;
3713
CHAR16 *FlagsStr;
3714
CHAR8 *AsciiStr;
3715
BBS_BBS_DEVICE_PATH *Bbs;
3716
3717
TypeStr = GetNextParamStr (&TextDeviceNode);
3718
IdStr = GetNextParamStr (&TextDeviceNode);
3719
FlagsStr = GetNextParamStr (&TextDeviceNode);
3720
Bbs = (BBS_BBS_DEVICE_PATH *)CreateDeviceNode (
3721
BBS_DEVICE_PATH,
3722
BBS_BBS_DP,
3723
(UINT16)(sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))
3724
);
3725
3726
if (Bbs == NULL) {
3727
return (EFI_DEVICE_PATH_PROTOCOL *)Bbs;
3728
}
3729
3730
if (StrCmp (TypeStr, "Floppy") == 0) {
3731
Bbs->DeviceType = BBS_TYPE_FLOPPY;
3732
} else if (StrCmp (TypeStr, "HD") == 0) {
3733
Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
3734
} else if (StrCmp (TypeStr, "CDROM") == 0) {
3735
Bbs->DeviceType = BBS_TYPE_CDROM;
3736
} else if (StrCmp (TypeStr, "PCMCIA") == 0) {
3737
Bbs->DeviceType = BBS_TYPE_PCMCIA;
3738
} else if (StrCmp (TypeStr, "USB") == 0) {
3739
Bbs->DeviceType = BBS_TYPE_USB;
3740
} else if (StrCmp (TypeStr, "Network") == 0) {
3741
Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
3742
} else {
3743
Bbs->DeviceType = (UINT16)Strtoi (TypeStr);
3744
}
3745
3746
AsciiStr = Bbs->String;
3747
StrToAscii (IdStr, &AsciiStr);
3748
3749
Bbs->StatusFlag = (UINT16)Strtoi (FlagsStr);
3750
3751
return (EFI_DEVICE_PATH_PROTOCOL *)Bbs;
3752
}
3753
3754
/**
3755
Converts a text device path node to SATA device path structure.
3756
3757
@param TextDeviceNode The input Text device path node.
3758
3759
@return A pointer to the newly-created SATA device path structure.
3760
3761
**/
3762
static
3763
EFI_DEVICE_PATH_PROTOCOL *
3764
DevPathFromTextSata (
3765
IN CHAR16 *TextDeviceNode
3766
)
3767
{
3768
SATA_DEVICE_PATH *Sata;
3769
CHAR16 *Param1;
3770
CHAR16 *Param2;
3771
CHAR16 *Param3;
3772
3773
Param1 = GetNextParamStr (&TextDeviceNode);
3774
Param2 = GetNextParamStr (&TextDeviceNode);
3775
Param3 = GetNextParamStr (&TextDeviceNode);
3776
3777
Sata = (SATA_DEVICE_PATH *)CreateDeviceNode (
3778
MESSAGING_DEVICE_PATH,
3779
MSG_SATA_DP,
3780
(UINT16)sizeof (SATA_DEVICE_PATH)
3781
);
3782
3783
if (Sata == NULL) {
3784
return (EFI_DEVICE_PATH_PROTOCOL *)Sata;
3785
}
3786
3787
Sata->HBAPortNumber = (UINT16)Strtoi (Param1);
3788
3789
//
3790
// According to UEFI spec, if PMPN is not provided, the default is 0xFFFF
3791
//
3792
if (*Param2 == '\0' ) {
3793
Sata->PortMultiplierPortNumber = 0xFFFF;
3794
} else {
3795
Sata->PortMultiplierPortNumber = (UINT16)Strtoi (Param2);
3796
}
3797
3798
Sata->Lun = (UINT16)Strtoi (Param3);
3799
3800
return (EFI_DEVICE_PATH_PROTOCOL *)Sata;
3801
}
3802
3803
GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevPathFromTextTable[] = {
3804
{ "Path", DevPathFromTextPath },
3805
3806
{ "HardwarePath", DevPathFromTextHardwarePath },
3807
{ "Pci", DevPathFromTextPci },
3808
{ "PcCard", DevPathFromTextPcCard },
3809
{ "MemoryMapped", DevPathFromTextMemoryMapped },
3810
{ "VenHw", DevPathFromTextVenHw },
3811
{ "Ctrl", DevPathFromTextCtrl },
3812
{ "BMC", DevPathFromTextBmc },
3813
3814
{ "AcpiPath", DevPathFromTextAcpiPath },
3815
{ "Acpi", DevPathFromTextAcpi },
3816
{ "PciRoot", DevPathFromTextPciRoot },
3817
{ "PcieRoot", DevPathFromTextPcieRoot },
3818
{ "Floppy", DevPathFromTextFloppy },
3819
{ "Keyboard", DevPathFromTextKeyboard },
3820
{ "Serial", DevPathFromTextSerial },
3821
{ "ParallelPort", DevPathFromTextParallelPort },
3822
{ "AcpiEx", DevPathFromTextAcpiEx },
3823
{ "AcpiExp", DevPathFromTextAcpiExp },
3824
{ "AcpiAdr", DevPathFromTextAcpiAdr },
3825
3826
{ "Msg", DevPathFromTextMsg },
3827
{ "Ata", DevPathFromTextAta },
3828
{ "Scsi", DevPathFromTextScsi },
3829
{ "Fibre", DevPathFromTextFibre },
3830
{ "FibreEx", DevPathFromTextFibreEx },
3831
{ "I1394", DevPathFromText1394 },
3832
{ "USB", DevPathFromTextUsb },
3833
{ "I2O", DevPathFromTextI2O },
3834
{ "Infiniband", DevPathFromTextInfiniband },
3835
{ "VenMsg", DevPathFromTextVenMsg },
3836
{ "VenPcAnsi", DevPathFromTextVenPcAnsi },
3837
{ "VenVt100", DevPathFromTextVenVt100 },
3838
{ "VenVt100Plus", DevPathFromTextVenVt100Plus },
3839
{ "VenUtf8", DevPathFromTextVenUtf8 },
3840
{ "UartFlowCtrl", DevPathFromTextUartFlowCtrl },
3841
{ "SAS", DevPathFromTextSAS },
3842
{ "SasEx", DevPathFromTextSasEx },
3843
{ "NVMe", DevPathFromTextNVMe },
3844
{ "UFS", DevPathFromTextUfs },
3845
{ "SD", DevPathFromTextSd },
3846
{ "eMMC", DevPathFromTextEmmc },
3847
{ "DebugPort", DevPathFromTextDebugPort },
3848
{ "MAC", DevPathFromTextMAC },
3849
{ "IPv4", DevPathFromTextIPv4 },
3850
{ "IPv6", DevPathFromTextIPv6 },
3851
{ "Uart", DevPathFromTextUart },
3852
{ "UsbClass", DevPathFromTextUsbClass },
3853
{ "UsbAudio", DevPathFromTextUsbAudio },
3854
{ "UsbCDCControl", DevPathFromTextUsbCDCControl },
3855
{ "UsbHID", DevPathFromTextUsbHID },
3856
{ "UsbImage", DevPathFromTextUsbImage },
3857
{ "UsbPrinter", DevPathFromTextUsbPrinter },
3858
{ "UsbMassStorage", DevPathFromTextUsbMassStorage },
3859
{ "UsbHub", DevPathFromTextUsbHub },
3860
{ "UsbCDCData", DevPathFromTextUsbCDCData },
3861
{ "UsbSmartCard", DevPathFromTextUsbSmartCard },
3862
{ "UsbVideo", DevPathFromTextUsbVideo },
3863
{ "UsbDiagnostic", DevPathFromTextUsbDiagnostic },
3864
{ "UsbWireless", DevPathFromTextUsbWireless },
3865
{ "UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate },
3866
{ "UsbIrdaBridge", DevPathFromTextUsbIrdaBridge },
3867
{ "UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement },
3868
{ "UsbWwid", DevPathFromTextUsbWwid },
3869
{ "Unit", DevPathFromTextUnit },
3870
{ "iSCSI", DevPathFromTextiSCSI },
3871
{ "Vlan", DevPathFromTextVlan },
3872
{ "Dns", DevPathFromTextDns },
3873
{ "Uri", DevPathFromTextUri },
3874
{ "Bluetooth", DevPathFromTextBluetooth },
3875
{ "Wi-Fi", DevPathFromTextWiFi },
3876
{ "BluetoothLE", DevPathFromTextBluetoothLE },
3877
{ "MediaPath", DevPathFromTextMediaPath },
3878
{ "HD", DevPathFromTextHD },
3879
{ "CDROM", DevPathFromTextCDROM },
3880
{ "VenMedia", DevPathFromTextVenMedia },
3881
{ "Media", DevPathFromTextMedia },
3882
{ "Fv", DevPathFromTextFv },
3883
{ "FvFile", DevPathFromTextFvFile },
3884
{ "File", DevPathFromTextFilePath },
3885
{ "Offset", DevPathFromTextRelativeOffsetRange },
3886
{ "RamDisk", DevPathFromTextRamDisk },
3887
{ "VirtualDisk", DevPathFromTextVirtualDisk },
3888
{ "VirtualCD", DevPathFromTextVirtualCd },
3889
{ "PersistentVirtualDisk", DevPathFromTextPersistentVirtualDisk },
3890
{ "PersistentVirtualCD", DevPathFromTextPersistentVirtualCd },
3891
3892
{ "BbsPath", DevPathFromTextBbsPath },
3893
{ "BBS", DevPathFromTextBBS },
3894
{ "Sata", DevPathFromTextSata },
3895
{ NULL, NULL }
3896
};
3897
3898
/**
3899
Convert text to the binary representation of a device node.
3900
3901
@param TextDeviceNode TextDeviceNode points to the text representation of a device
3902
node. Conversion starts with the first character and continues
3903
until the first non-device node character.
3904
3905
@return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was
3906
insufficient memory or text unsupported.
3907
3908
**/
3909
static
3910
EFI_DEVICE_PATH_PROTOCOL *
3911
EFIAPI
3912
UefiDevicePathLibConvertTextToDeviceNode (
3913
IN CONST CHAR16 *TextDeviceNode
3914
)
3915
{
3916
DEVICE_PATH_FROM_TEXT FromText;
3917
CHAR16 *ParamStr;
3918
EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
3919
CHAR16 *DeviceNodeStr;
3920
UINTN Index;
3921
3922
if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
3923
return NULL;
3924
}
3925
3926
ParamStr = NULL;
3927
FromText = NULL;
3928
DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
3929
ASSERT (DeviceNodeStr != NULL);
3930
3931
for (Index = 0; mUefiDevicePathLibDevPathFromTextTable[Index].Function != NULL; Index++) {
3932
ParamStr = GetParamByNodeName (DeviceNodeStr, mUefiDevicePathLibDevPathFromTextTable[Index].DevicePathNodeText);
3933
if (ParamStr != NULL) {
3934
FromText = mUefiDevicePathLibDevPathFromTextTable[Index].Function;
3935
break;
3936
}
3937
}
3938
3939
if (FromText == NULL) {
3940
//
3941
// A file path
3942
//
3943
FromText = DevPathFromTextFilePath;
3944
DeviceNode = FromText (DeviceNodeStr);
3945
} else {
3946
DeviceNode = FromText (ParamStr);
3947
FreePool (ParamStr);
3948
}
3949
3950
FreePool (DeviceNodeStr);
3951
3952
return DeviceNode;
3953
}
3954
3955
/**
3956
Convert text to the binary representation of a device path.
3957
3958
3959
@param TextDevicePath TextDevicePath points to the text representation of a device
3960
path. Conversion starts with the first character and continues
3961
until the first non-device node character.
3962
3963
@return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or
3964
there was insufficient memory.
3965
3966
**/
3967
static
3968
EFI_DEVICE_PATH_PROTOCOL *
3969
EFIAPI
3970
UefiDevicePathLibConvertTextToDevicePath (
3971
IN CONST CHAR16 *TextDevicePath
3972
)
3973
{
3974
EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
3975
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
3976
CHAR16 *DevicePathStr;
3977
CHAR16 *Str;
3978
CHAR16 *DeviceNodeStr;
3979
BOOLEAN IsInstanceEnd;
3980
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
3981
3982
if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
3983
return NULL;
3984
}
3985
3986
DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
3987
3988
if (DevicePath == NULL) {
3989
ASSERT (DevicePath != NULL);
3990
return NULL;
3991
}
3992
3993
SetDevicePathEndNode (DevicePath);
3994
3995
DevicePathStr = UefiDevicePathLibStrDuplicate (TextDevicePath);
3996
3997
if (DevicePathStr == NULL) {
3998
return NULL;
3999
}
4000
4001
Str = DevicePathStr;
4002
while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
4003
DeviceNode = UefiDevicePathLibConvertTextToDeviceNode (DeviceNodeStr);
4004
4005
NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
4006
if (DevicePath != NULL) {
4007
FreePool (DevicePath);
4008
}
4009
4010
if (DeviceNode != NULL) {
4011
FreePool (DeviceNode);
4012
}
4013
4014
DevicePath = NewDevicePath;
4015
4016
if (IsInstanceEnd) {
4017
DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
4018
if (DeviceNode == NULL) {
4019
ASSERT (DeviceNode != NULL);
4020
return NULL;
4021
}
4022
4023
SetDevicePathEndNode (DeviceNode);
4024
DeviceNode->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
4025
4026
NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
4027
if (DevicePath != NULL) {
4028
FreePool (DevicePath);
4029
}
4030
4031
if (DeviceNode != NULL) {
4032
FreePool (DeviceNode);
4033
}
4034
4035
DevicePath = NewDevicePath;
4036
}
4037
}
4038
4039
FreePool (DevicePathStr);
4040
return DevicePath;
4041
}
4042
4043
ssize_t
4044
efidp_parse_device_path(char *path, efidp out, size_t max)
4045
{
4046
EFI_DEVICE_PATH_PROTOCOL *dp;
4047
UINTN len;
4048
4049
dp = UefiDevicePathLibConvertTextToDevicePath (path);
4050
if (dp == NULL)
4051
return -1;
4052
len = GetDevicePathSize(dp);
4053
if (len > max) {
4054
free(dp);
4055
return -1;
4056
}
4057
memcpy(out, dp, len);
4058
free(dp);
4059
4060
return len;
4061
}
4062
4063