]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/IfrParse.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / HiiPack / IfrParse.c
CommitLineData
3e99020d
LG
1/*++\r
2\r
3Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 IfrParse.c \r
15\r
16Abstract:\r
17\r
18 Routines for parsing and managing HII IFR packs.\r
19\r
20--*/\r
21\r
22#include <stdio.h>\r
23#include <string.h>\r
24#include <stdlib.h>\r
25\r
26#include "Tiano.h"\r
27#include "EfiUtilityMsgs.h"\r
28#include "EfiInternalFormRepresentation.h"\r
29#include "Hii.h"\r
30#include "IfrParse.h"\r
31#include "HiiPack.h"\r
32\r
33typedef struct _VARIABLE_STORE_ENTRY {\r
34 struct _VARIABLE_STORE_ENTRY *Next;\r
35 CHAR8 VarName[MAX_VARIABLE_NAME];\r
36 char *VarBuffer;\r
37 int VarBufferSize;\r
38 EFI_HII_VARIABLE_PACK *VarPack;\r
39 int VarPackSize;\r
40} VARIABLE_STORE_ENTRY;\r
41\r
42typedef STATUS (*IFR_PARSE_FUNCTION) (IFR_PARSE_CONTEXT * Context);\r
43\r
44typedef struct {\r
45 INT8 *Name;\r
46 INT32 Size;\r
47 IFR_PARSE_FUNCTION Parse;\r
48} IFR_PARSE_TABLE_ENTRY;\r
49\r
50static\r
51STATUS\r
52IfrParse01 (\r
53 IFR_PARSE_CONTEXT *Context\r
54 );\r
55static\r
56STATUS\r
57IfrParse02 (\r
58 IFR_PARSE_CONTEXT *Context\r
59 );\r
60static\r
61STATUS\r
62IfrParse03 (\r
63 IFR_PARSE_CONTEXT *Context\r
64 );\r
65static\r
66STATUS\r
67IfrParse05 (\r
68 IFR_PARSE_CONTEXT *Context\r
69 );\r
70static\r
71STATUS\r
72IfrParse06 (\r
73 IFR_PARSE_CONTEXT *Context\r
74 );\r
75static\r
76STATUS\r
77IfrParse07 (\r
78 IFR_PARSE_CONTEXT *Context\r
79 );\r
80static\r
81STATUS\r
82IfrParse08 (\r
83 IFR_PARSE_CONTEXT *Context\r
84 );\r
85static\r
86STATUS\r
87IfrParse09 (\r
88 IFR_PARSE_CONTEXT *Context\r
89 );\r
90static\r
91STATUS\r
92IfrParse0A (\r
93 IFR_PARSE_CONTEXT *Context\r
94 );\r
95static\r
96STATUS\r
97IfrParse0B (\r
98 IFR_PARSE_CONTEXT *Context\r
99 );\r
100static\r
101STATUS\r
102IfrParse0C (\r
103 IFR_PARSE_CONTEXT *Context\r
104 );\r
105static\r
106STATUS\r
107IfrParse0D (\r
108 IFR_PARSE_CONTEXT *Context\r
109 );\r
110static\r
111STATUS\r
112IfrParse0E (\r
113 IFR_PARSE_CONTEXT *Context\r
114 );\r
115static\r
116STATUS\r
117IfrParse0F (\r
118 IFR_PARSE_CONTEXT *Context\r
119 );\r
120static\r
121STATUS\r
122IfrParse10 (\r
123 IFR_PARSE_CONTEXT *Context\r
124 );\r
125static\r
126STATUS\r
127IfrParse11 (\r
128 IFR_PARSE_CONTEXT *Context\r
129 );\r
130static\r
131STATUS\r
132IfrParse12 (\r
133 IFR_PARSE_CONTEXT *Context\r
134 );\r
135static\r
136STATUS\r
137IfrParse13 (\r
138 IFR_PARSE_CONTEXT *Context\r
139 );\r
140static\r
141STATUS\r
142IfrParse14 (\r
143 IFR_PARSE_CONTEXT *Context\r
144 );\r
145static\r
146STATUS\r
147IfrParse15 (\r
148 IFR_PARSE_CONTEXT *Context\r
149 );\r
150static\r
151STATUS\r
152IfrParse16 (\r
153 IFR_PARSE_CONTEXT *Context\r
154 );\r
155static\r
156STATUS\r
157IfrParse17 (\r
158 IFR_PARSE_CONTEXT *Context\r
159 );\r
160static\r
161STATUS\r
162IfrParse18 (\r
163 IFR_PARSE_CONTEXT *Context\r
164 );\r
165static\r
166STATUS\r
167IfrParse19 (\r
168 IFR_PARSE_CONTEXT *Context\r
169 );\r
170static\r
171STATUS\r
172IfrParse1A (\r
173 IFR_PARSE_CONTEXT *Context\r
174 );\r
175static\r
176STATUS\r
177IfrParse1B (\r
178 IFR_PARSE_CONTEXT *Context\r
179 );\r
180static\r
181STATUS\r
182IfrParse1C (\r
183 IFR_PARSE_CONTEXT *Context\r
184 );\r
185static\r
186STATUS\r
187IfrParse1D (\r
188 IFR_PARSE_CONTEXT *Context\r
189 );\r
190static\r
191STATUS\r
192IfrParse1E (\r
193 IFR_PARSE_CONTEXT *Context\r
194 );\r
195static\r
196STATUS\r
197IfrParse1F (\r
198 IFR_PARSE_CONTEXT *Context\r
199 );\r
200static\r
201STATUS\r
202IfrParse20 (\r
203 IFR_PARSE_CONTEXT *Context\r
204 );\r
205static\r
206STATUS\r
207IfrParse21 (\r
208 IFR_PARSE_CONTEXT *Context\r
209 );\r
210static\r
211STATUS\r
212IfrParse22 (\r
213 IFR_PARSE_CONTEXT *Context\r
214 );\r
215static\r
216STATUS\r
217IfrParse23 (\r
218 IFR_PARSE_CONTEXT *Context\r
219 );\r
220static\r
221STATUS\r
222IfrParse24 (\r
223 IFR_PARSE_CONTEXT *Context\r
224 );\r
225static\r
226STATUS\r
227IfrParse25 (\r
228 IFR_PARSE_CONTEXT *Context\r
229 );\r
230static\r
231STATUS\r
232IfrParse26 (\r
233 IFR_PARSE_CONTEXT *Context\r
234 );\r
235static\r
236STATUS\r
237IfrParse27 (\r
238 IFR_PARSE_CONTEXT *Context\r
239 );\r
240static\r
241STATUS\r
242IfrParse28 (\r
243 IFR_PARSE_CONTEXT *Context\r
244 );\r
245static\r
246STATUS\r
247IfrParse29 (\r
248 IFR_PARSE_CONTEXT *Context\r
249 );\r
250static\r
251STATUS\r
252IfrParse2A (\r
253 IFR_PARSE_CONTEXT *Context\r
254 );\r
255\r
256static const IFR_PARSE_TABLE_ENTRY mIfrParseTable[] = {\r
257 {\r
258 0,\r
259 0,\r
260 NULL\r
261 }, // invalid\r
262 {\r
263 "EFI_IFR_FORM",\r
264 sizeof (EFI_IFR_FORM),\r
265 IfrParse01\r
266 },\r
267 {\r
268 "EFI_IFR_SUBTITLE",\r
269 sizeof (EFI_IFR_SUBTITLE),\r
270 IfrParse02\r
271 },\r
272 {\r
273 "EFI_IFR_TEXT",\r
274 -6,\r
275 IfrParse03\r
276 }, // sizeof (EFI_IFR_TEXT) },\r
277 {\r
278 "unused 0x04 opcode",\r
279 0,\r
280 NULL\r
281 }, // EFI_IFR_GRAPHIC_OP\r
282 {\r
283 "EFI_IFR_ONE_OF",\r
284 sizeof (EFI_IFR_ONE_OF),\r
285 IfrParse05\r
286 },\r
287 {\r
288 "EFI_IFR_CHECK_BOX",\r
289 sizeof (EFI_IFR_CHECK_BOX),\r
290 IfrParse06\r
291 },\r
292 {\r
293 "EFI_IFR_NUMERIC",\r
294 sizeof (EFI_IFR_NUMERIC),\r
295 IfrParse07\r
296 },\r
297 {\r
298 "EFI_IFR_PASSWORD",\r
299 sizeof (EFI_IFR_PASSWORD),\r
300 IfrParse08\r
301 },\r
302 {\r
303 "EFI_IFR_ONE_OF_OPTION",\r
304 sizeof (EFI_IFR_ONE_OF_OPTION),\r
305 IfrParse09\r
306 },\r
307 {\r
308 "EFI_IFR_SUPPRESS",\r
309 sizeof (EFI_IFR_SUPPRESS),\r
310 IfrParse0A\r
311 },\r
312 {\r
313 "EFI_IFR_END_FORM",\r
314 sizeof (EFI_IFR_END_FORM),\r
315 IfrParse0B\r
316 },\r
317 {\r
318 "EFI_IFR_HIDDEN",\r
319 sizeof (EFI_IFR_HIDDEN),\r
320 IfrParse0C\r
321 },\r
322 {\r
323 "EFI_IFR_END_FORM_SET",\r
324 sizeof (EFI_IFR_END_FORM_SET),\r
325 IfrParse0D\r
326 },\r
327 {\r
328 "EFI_IFR_FORM_SET",\r
329 sizeof (EFI_IFR_FORM_SET),\r
330 IfrParse0E\r
331 },\r
332 {\r
333 "EFI_IFR_REF",\r
334 sizeof (EFI_IFR_REF),\r
335 IfrParse0F\r
336 },\r
337 {\r
338 "EFI_IFR_END_ONE_OF",\r
339 sizeof (EFI_IFR_END_ONE_OF),\r
340 IfrParse10\r
341 },\r
342 {\r
343 "EFI_IFR_INCONSISTENT",\r
344 sizeof (EFI_IFR_INCONSISTENT),\r
345 IfrParse11\r
346 },\r
347 {\r
348 "EFI_IFR_EQ_ID_VAL",\r
349 sizeof (EFI_IFR_EQ_ID_VAL),\r
350 IfrParse12\r
351 },\r
352 {\r
353 "EFI_IFR_EQ_ID_ID",\r
354 sizeof (EFI_IFR_EQ_ID_ID),\r
355 IfrParse13\r
356 },\r
357 {\r
358 "EFI_IFR_EQ_ID_LIST",\r
359 -(int) (sizeof (EFI_IFR_EQ_ID_LIST)),\r
360 IfrParse14\r
361 },\r
362 {\r
363 "EFI_IFR_AND",\r
364 sizeof (EFI_IFR_AND),\r
365 IfrParse15\r
366 },\r
367 {\r
368 "EFI_IFR_OR",\r
369 sizeof (EFI_IFR_OR),\r
370 IfrParse16\r
371 },\r
372 {\r
373 "EFI_IFR_NOT",\r
374 sizeof (EFI_IFR_NOT),\r
375 IfrParse17\r
376 },\r
377 {\r
378 "EFI_IFR_END_IF",\r
379 sizeof (EFI_IFR_END_IF),\r
380 IfrParse18\r
381 },\r
382 {\r
383 "EFI_IFR_GRAYOUT",\r
384 sizeof (EFI_IFR_GRAYOUT),\r
385 IfrParse19\r
386 },\r
387 {\r
388 "EFI_IFR_DATE",\r
389 sizeof (EFI_IFR_DATE) / 3,\r
390 IfrParse1A\r
391 },\r
392 {\r
393 "EFI_IFR_TIME",\r
394 sizeof (EFI_IFR_TIME) / 3,\r
395 IfrParse1B\r
396 },\r
397 {\r
398 "EFI_IFR_STRING",\r
399 sizeof (EFI_IFR_STRING),\r
400 IfrParse1C\r
401 },\r
402 {\r
403 "EFI_IFR_LABEL",\r
404 sizeof (EFI_IFR_LABEL),\r
405 IfrParse1D\r
406 },\r
407 {\r
408 "EFI_IFR_SAVE_DEFAULTS",\r
409 sizeof (EFI_IFR_SAVE_DEFAULTS),\r
410 IfrParse1E\r
411 },\r
412 {\r
413 "EFI_IFR_RESTORE_DEFAULTS",\r
414 sizeof (EFI_IFR_RESTORE_DEFAULTS),\r
415 IfrParse1F\r
416 },\r
417 {\r
418 "EFI_IFR_BANNER",\r
419 sizeof (EFI_IFR_BANNER),\r
420 IfrParse20\r
421 },\r
422 {\r
423 "EFI_IFR_INVENTORY",\r
424 sizeof (EFI_IFR_INVENTORY),\r
425 IfrParse21\r
426 },\r
427 {\r
428 "EFI_IFR_EQ_VAR_VAL_OP",\r
429 sizeof (EFI_IFR_EQ_VAR_VAL),\r
430 IfrParse22\r
431 },\r
432 {\r
433 "EFI_IFR_ORDERED_LIST_OP",\r
434 sizeof (EFI_IFR_ORDERED_LIST),\r
435 IfrParse23\r
436 },\r
437 {\r
438 "EFI_IFR_VARSTORE_OP",\r
439 -(int) (sizeof (EFI_IFR_VARSTORE)),\r
440 IfrParse24\r
441 },\r
442 {\r
443 "EFI_IFR_VARSTORE_SELECT_OP",\r
444 sizeof (EFI_IFR_VARSTORE_SELECT),\r
445 IfrParse25\r
446 },\r
447 {\r
448 "EFI_IFR_VARSTORE_SELECT_PAIR_OP",\r
449 sizeof (EFI_IFR_VARSTORE_SELECT_PAIR),\r
450 IfrParse26\r
451 },\r
452 {\r
453 "EFI_IFR_TRUE",\r
454 sizeof (EFI_IFR_TRUE),\r
455 IfrParse27\r
456 },\r
457 {\r
458 "EFI_IFR_FALSE",\r
459 sizeof (EFI_IFR_FALSE),\r
460 IfrParse28\r
461 },\r
462 {\r
463 "EFI_IFR_GT",\r
464 sizeof (EFI_IFR_GT),\r
465 IfrParse29\r
466 },\r
467 {\r
468 "EFI_IFR_GE",\r
469 sizeof (EFI_IFR_GE),\r
470 IfrParse2A\r
471 },\r
472};\r
473#define PARSE_TABLE_ENTRIES (sizeof (mIfrParseTable) / sizeof (mIfrParseTable[0]))\r
474\r
475static\r
476STATUS\r
477GetVarStoreInfo (\r
478 IFR_PARSE_CONTEXT *Context,\r
479 UINT16 VarId,\r
480 EFI_GUID **VarStoreGuid,\r
481 char **VarStoreName\r
482 );\r
483\r
484static\r
485void\r
486FreeVarStores (\r
487 VOID\r
488 );\r
489\r
490static\r
491STATUS\r
492CreateVarStore (\r
493 EFI_GUID *VarGuid,\r
494 CHAR8 *VarName,\r
495 int VarStoreSize\r
496 );\r
497\r
498static\r
499STATUS\r
500SetDefaults (\r
501 IFR_PARSE_CONTEXT *Context,\r
502 UINT32 MfgDefaults\r
503 );\r
504\r
505//\r
506// Globals\r
507//\r
508static IFR_PARSE_CONTEXT *mParseContext = NULL;\r
509static VARIABLE_STORE_ENTRY *mVariableStores = NULL;\r
510static int BreakOnOpcodeTag = 0;\r
511static int OpcodeTag = 1;\r
512\r
513/*****************************************************************************/\r
514STATUS\r
515IfrParseCheck (\r
516 char *Buffer,\r
517 long BufferSize\r
518 )\r
519/*++\r
520\r
521Routine Description:\r
522\r
523 Check a buffer to ensure that is is parseable IFR\r
524 \r
525Arguments:\r
526\r
527 Buffer - pointer to raw IFR bytes\r
528 BufferSize - size of IFR pointed to by Buffer\r
529\r
530Returns:\r
531\r
532 STATUS_SUCCESS if successful\r
533 STATUS_ERROR otherwise\r
534 \r
535--*/\r
536{\r
537 char *Start;\r
538\r
539 char *End;\r
540\r
541 char *Pos;\r
542 EFI_IFR_OP_HEADER *OpHeader;\r
543 char *FileName;\r
544 FileName = "";\r
545 //\r
546 // Walk the list of IFR statements in the IFR pack\r
547 //\r
548 Start = Buffer;\r
549 Pos = Buffer;\r
550 End = Start + BufferSize;\r
551 while ((Pos >= Start) && (Pos < End)) {\r
552 OpHeader = (EFI_IFR_OP_HEADER *) Pos;\r
553 //\r
554 // Check range on size\r
555 //\r
556 if (Pos + OpHeader->Length > End) {\r
557 Error (NULL, 0, 0, FileName, "invalid IFR opcode size at offset 0x%X", (int) Pos - (int) Start);\r
558 return STATUS_ERROR;\r
559 }\r
560\r
561 if (OpHeader->Length == 0) {\r
562 Error (NULL, 0, 0, FileName, "IFR opcode size=0 at offset 0x%X", (int) Pos - (int) Start);\r
563 return STATUS_ERROR;\r
564 }\r
565 //\r
566 // See if it's the END_FORMSET opcode\r
567 //\r
568 if (OpHeader->OpCode == EFI_IFR_END_FORM_SET_OP) {\r
569 break;\r
570 }\r
571 //\r
572 // Advance to next IFR statement/opcode\r
573 //\r
574 Pos += OpHeader->Length;\r
575 }\r
576\r
577 return STATUS_SUCCESS;\r
578}\r
579\r
580STATUS\r
581IfrParseInit (\r
582 VOID\r
583 )\r
584/*++\r
585\r
586Routine Description:\r
587\r
588 Initialize this module for IFR pack parsing\r
589 \r
590Arguments:\r
591\r
592Returns:\r
593\r
594 STATUS_SUCCESS always\r
595 \r
596--*/\r
597{\r
598 return STATUS_SUCCESS;\r
599}\r
600\r
601STATUS\r
602IfrParseEnd (\r
603 VOID\r
604 )\r
605/*++\r
606\r
607Routine Description:\r
608\r
609 Free up memory allocated during IFR pack parsing done by this module\r
610 \r
611Arguments:\r
612 None\r
613\r
614Returns:\r
615\r
616 STATUS_SUCCESS always\r
617 \r
618--*/\r
619{\r
620 IFR_PARSE_CONTEXT *NextContext;\r
621 IFR_PARSE_ENTRY *NextEntry;\r
622 //\r
623 // Free up the memory from our parse contexts\r
624 //\r
625 while (mParseContext != NULL) {\r
626 while (mParseContext->Ifr != NULL) {\r
627 NextEntry = mParseContext->Ifr->Next;\r
628 //\r
629 // We pointed directly into the user buffer, rather than make\r
630 // a copy, so don't free up the bytes.\r
631 //\r
632 free (mParseContext->Ifr);\r
633 mParseContext->Ifr = NextEntry;\r
634 }\r
635\r
636 NextContext = mParseContext->Next;\r
637 free (mParseContext->PackHeader);\r
638 free (mParseContext);\r
639 mParseContext = NextContext;\r
640 }\r
641\r
642 return STATUS_SUCCESS;\r
643}\r
644\r
645static\r
646void\r
647FreeVarStores (\r
648 VOID\r
649 )\r
650/*++\r
651\r
652Routine Description:\r
653\r
654 GC_TODO: Add function description\r
655\r
656Arguments:\r
657\r
658 None\r
659\r
660Returns:\r
661\r
662 GC_TODO: add return values\r
663\r
664--*/\r
665{\r
666 VARIABLE_STORE_ENTRY *NextVarStore;\r
667 //\r
668 // Free up memory from our variable stores\r
669 //\r
670 while (mVariableStores != NULL) {\r
671 if (mVariableStores->VarPack != NULL) {\r
672 free (mVariableStores->VarPack);\r
673 }\r
674\r
675 NextVarStore = mVariableStores->Next;\r
676 free (mVariableStores);\r
677 mVariableStores = NextVarStore;\r
678 }\r
679}\r
680\r
681/******************************************************************************\r
682 FUNCTION: IfrParsePack() \r
683 \r
684 DESCRIPTION: Given a pointer to an IFR pack, parse it to create a linked\r
685 list of opcodes and relevant data required for later dumping.\r
686\r
687\r
688*******************************************************************************/\r
689STATUS\r
690IfrParsePack (\r
691 int Handle,\r
692 EFI_HII_IFR_PACK *PackHeader,\r
693 EFI_GUID *PackageGuid\r
694 )\r
695/*++\r
696\r
697Routine Description:\r
698\r
699 Given a pointer to an IFR pack, parse it to create a linked\r
700 list of opcodes and relevant data required for later dumping.\r
701 \r
702Arguments:\r
703\r
704 Handle - the handle number associated with this IFR pack. It\r
705 can be used later to retrieve more info on the particular\r
706 pack\r
707 PackHeader - pointer to IFR pack to parse\r
708 PackageGuid - on input, it comes from the HII data table entry for this pack. \r
709 On output, we'll return the IFR formset GUID.\r
710\r
711Returns:\r
712\r
713 STATUS_SUCCESS always\r
714\r
715--*/\r
716{\r
717 EFI_IFR_OP_HEADER *OpHeader;\r
718 IFR_PARSE_CONTEXT *Context;\r
719 IFR_PARSE_CONTEXT *TempContext;\r
720 IFR_PARSE_ENTRY *IfrEntry;\r
721 //\r
722 // Initialize our context\r
723 //\r
724 Context = (IFR_PARSE_CONTEXT *) malloc (sizeof (IFR_PARSE_CONTEXT));\r
725 if (Context == NULL) {\r
726 Error (NULL, 0, 0, "memory allocation failure", NULL);\r
727 return STATUS_ERROR;\r
728 }\r
729\r
730 memset ((void *) Context, 0, sizeof (IFR_PARSE_CONTEXT));\r
731 //\r
732 // Cache a copy of the input pack so the caller can free their copy\r
733 //\r
734 Context->PackHeader = (EFI_HII_IFR_PACK *) malloc (PackHeader->Header.Length);\r
735 if (Context->PackHeader == NULL) {\r
736 Error (NULL, 0, 0, "memory allocation failure", NULL);\r
737 free (Context);\r
738 return STATUS_ERROR;\r
739 }\r
740\r
741 memcpy (Context->PackHeader, PackHeader, PackHeader->Header.Length);\r
742 Context->IfrBufferStart = (char *) (Context->PackHeader + 1);\r
743 Context->CurrentPos = Context->IfrBufferStart;\r
744 Context->IfrBufferLen = PackHeader->Header.Length - sizeof (EFI_HII_IFR_PACK);\r
745 Context->Handle = Handle;\r
746 Context->FormsetGuid = &Context->NullGuid;\r
747 Context->PackageGuid = *PackageGuid;\r
748 //\r
749 // Add it to the end of our list\r
750 //\r
751 if (mParseContext == NULL) {\r
752 mParseContext = Context;\r
753 } else {\r
754 TempContext = mParseContext;\r
755 while (TempContext->Next != NULL) {\r
756 TempContext = TempContext->Next;\r
757 }\r
758\r
759 TempContext->Next = Context;\r
760 }\r
761 //\r
762 // Walk the opcodes in the pack\r
763 //\r
764 while\r
765 (\r
766 (Context->CurrentPos >= Context->IfrBufferStart) &&\r
767 (Context->CurrentPos < Context->IfrBufferStart + Context->IfrBufferLen)\r
768 ) {\r
769 OpHeader = (EFI_IFR_OP_HEADER *) Context->CurrentPos;\r
770 //\r
771 // Allocate a new IFR entry to put in our linked list, then\r
772 // point directly to the caller's raw data.\r
773 //\r
774 IfrEntry = (IFR_PARSE_ENTRY *) malloc (sizeof (IFR_PARSE_ENTRY));\r
775 if (IfrEntry == NULL) {\r
776 Error (NULL, 0, 0, "memory allocation failure", NULL);\r
777 free (Context->PackHeader);\r
778 free (Context);\r
779 return STATUS_ERROR;\r
780 }\r
781\r
782 memset ((void *) IfrEntry, 0, sizeof (IFR_PARSE_ENTRY));\r
783 IfrEntry->Tag = ++OpcodeTag;\r
784 if (OpcodeTag == BreakOnOpcodeTag) {\r
785 EFI_BREAKPOINT ();\r
786 }\r
787\r
788 IfrEntry->RawIfrHeader = (EFI_IFR_OP_HEADER *) (Context->CurrentPos);\r
789 //\r
790 // Add this entry to our linked list. If it's not the first, then\r
791 // forward the variable store settings from the previous entry.\r
792 //\r
793 if (Context->LastIfr != NULL) {\r
794 IfrEntry->VarStoreGuid1 = Context->LastIfr->VarStoreGuid1;\r
795 IfrEntry->VarStoreName1 = Context->LastIfr->VarStoreName1;\r
796 IfrEntry->VarStoreGuid2 = Context->LastIfr->VarStoreGuid2;\r
797 IfrEntry->VarStoreName2 = Context->LastIfr->VarStoreName2;\r
798 Context->LastIfr->Next = IfrEntry;\r
799 } else {\r
800 Context->Ifr = IfrEntry;\r
801 }\r
802\r
803 Context->LastIfr = IfrEntry;\r
804 //\r
805 // Switch on the opcode to parse it\r
806 //\r
807 if (OpHeader->OpCode < PARSE_TABLE_ENTRIES) {\r
808 if (mIfrParseTable[OpHeader->OpCode].Parse != NULL) {\r
809 mIfrParseTable[OpHeader->OpCode].Parse (Context);\r
810 }\r
811 } else {\r
812 Error (\r
813 NULL,\r
814 0,\r
815 0,\r
816 "invalid opcode found in IFR",\r
817 "offset=0x%X opcode=0x%02X",\r
818 (int) OpHeader - (int) Context->PackHeader,\r
819 (int) OpHeader->OpCode\r
820 );\r
821 free (IfrEntry);\r
822 free (Context->PackHeader);\r
823 free (Context);\r
824 return STATUS_ERROR;\r
825 }\r
826 //\r
827 // If it's the END_FORMSET opcode, then we're done\r
828 //\r
829 if (OpHeader->OpCode == EFI_IFR_END_FORM_SET_OP) {\r
830 break;\r
831 }\r
832 //\r
833 // Advance to next IFR statement/opcode\r
834 //\r
835 if (OpHeader->Length == 0) {\r
836 Error (NULL, 0, 0, "0-length IFR opcode encountered", NULL);\r
837 free (IfrEntry);\r
838 free (Context->PackHeader);\r
839 free (Context);\r
840 return STATUS_ERROR;\r
841 }\r
842\r
843 Context->CurrentPos += OpHeader->Length;\r
844 }\r
845 //\r
846 // Return the form GUID.\r
847 //\r
848 *PackageGuid = *Context->FormsetGuid; \r
849 return STATUS_SUCCESS;\r
850}\r
851\r
852/******************************************************************************\r
853 FUNCTION: GetVarStoreInfo()\r
854 \r
855 DESCRIPTION: IFR contains VARSTORE opcodes to specify where variable data \r
856 for following opcodes is supposed to be stored. One VARSTORE statement\r
857 allows you to specify the variable store GUID and a key, and another\r
858 VARSTORE (select) allows you to specify the key of a VARSTORE statement. \r
859 Given the key from a VARSTORE_SELECT statement, go find the corresponding\r
860 VARSTORE statement with a matching key and return the varstore GUID and \r
861 name. If key == 0, then the variable store is FormsetGuid."Setup"\r
862*******************************************************************************/\r
863static\r
864STATUS\r
865GetVarStoreInfo (\r
866 IFR_PARSE_CONTEXT *Context,\r
867 UINT16 VarId,\r
868 EFI_GUID **VarStoreGuid,\r
869 char **VarStoreName\r
870 )\r
871/*++\r
872\r
873Routine Description:\r
874\r
875 Get variable store information from an IFR pack for a given variable store ID.\r
876 \r
877Arguments:\r
878\r
879 Context - pointer to IFR parse context\r
880 VarId - variable store ID referenced by IFR being parsed\r
881 VarStoreGuid - outgoing GUID of the variable store corresponding to VarId\r
882 VarStoreName - outgoing variable name of variable store corresponding to VarId\r
883\r
884Returns:\r
885\r
886 STATUS_SUCCESS - variable store with matching VarId found, and outoing GUID/Name are valid\r
887 STATUS_ERROR - otherwise\r
888\r
889--*/\r
890{\r
891 IFR_PARSE_ENTRY *Ptr;\r
892 EFI_IFR_VARSTORE *VarStore;\r
893 if (Context == NULL) {\r
894 return STATUS_ERROR;\r
895 }\r
896\r
897 //\r
898 // Walk the entire IFR form and find a variable store opcode that\r
899 // has a matching variable store ID.\r
900 //\r
901 for (Ptr = Context->Ifr; Ptr != NULL; Ptr = Ptr->Next) {\r
902 if (Ptr->RawIfrHeader->OpCode == EFI_IFR_FORM_SET_OP) {\r
903 if (VarId == 0) {\r
904 *VarStoreGuid = &((EFI_IFR_FORM_SET *) (Ptr->RawIfrHeader))->Guid;\r
905 *VarStoreName = DEFAULT_VARIABLE_NAME;\r
906 return STATUS_SUCCESS;\r
907 }\r
908 } else if (Ptr->RawIfrHeader->OpCode == EFI_IFR_VARSTORE_OP) {\r
909 //\r
910 // See if it's a variable ID match\r
911 //\r
912 VarStore = (EFI_IFR_VARSTORE *) Ptr->RawIfrHeader;\r
913 if (VarStore->VarId == VarId) {\r
914 *VarStoreGuid = &VarStore->Guid;\r
915 *VarStoreName = (char *) (VarStore + 1);\r
916 return STATUS_SUCCESS;\r
917 }\r
918 }\r
919 }\r
920\r
921 return STATUS_ERROR;\r
922}\r
923\r
924STATUS\r
925IfrSetDefaults (\r
926 int MfgDefaults\r
927 )\r
928/*++\r
929\r
930Routine Description:\r
931\r
932 Go through all the IFR forms we've parsed so far and create and set variable\r
933 defaults.\r
934 \r
935Arguments:\r
936\r
937 MfgDefaults - non-zero if manufacturing defaults are desired\r
938\r
939Returns:\r
940\r
941 STATUS_SUCCESS - always\r
942\r
943--*/\r
944{\r
945 IFR_PARSE_CONTEXT *Context;\r
946 //\r
947 // First free up any variable stores we've created so far.\r
948 //\r
949 FreeVarStores ();\r
950 for (Context = mParseContext; Context != NULL; Context = Context->Next) {\r
951 //\r
952 // Call our internal function to handle it\r
953 //\r
954 SetDefaults (Context, MfgDefaults);\r
955 }\r
956\r
957 return STATUS_SUCCESS;\r
958\r
959}\r
960\r
961/******************************************************************************/\r
962STATUS\r
963IfrGetIfrPack (\r
964 int Handle,\r
965 EFI_HII_IFR_PACK **PackHeader,\r
966 EFI_GUID *FormsetGuid\r
967 )\r
968/*++\r
969\r
970Routine Description:\r
971\r
972 GC_TODO: Add function description\r
973\r
974Arguments:\r
975\r
976 Handle - GC_TODO: add argument description\r
977 PackHeader - GC_TODO: add argument description\r
978 FormsetGuid - GC_TODO: add argument description\r
979\r
980Returns:\r
981\r
982 GC_TODO: add return values\r
983\r
984--*/\r
985{\r
986 IFR_PARSE_CONTEXT *Context;\r
987\r
988 for (Context = mParseContext; Context != NULL; Context = Context->Next) {\r
989 if (Context->Handle == Handle) {\r
990 *PackHeader = Context->PackHeader;\r
991 memcpy (FormsetGuid, Context->FormsetGuid, sizeof (EFI_GUID));\r
992 return STATUS_SUCCESS;\r
993 }\r
994 }\r
995\r
996 return STATUS_ERROR;\r
997}\r
998\r
999STATUS\r
1000IfrReferencesVarPack (\r
1001 int IfrHandle,\r
1002 EFI_HII_VARIABLE_PACK *VarPack\r
1003 )\r
1004/*++\r
1005\r
1006Routine Description:\r
1007\r
1008 Given an HII handle number (which corrresponds to a handle number passed \r
1009 in to IfrParsePack()), see if the IFR references the specified variable\r
1010 pack.\r
1011 \r
1012Arguments:\r
1013\r
1014 IfrHandle - handle number for the IFR pack to check (passed to IfrParsePack())\r
1015 VarPack - variable pack to check to see if the IFR references\r
1016\r
1017Returns:\r
1018\r
1019 STATUS_SUCCESS if the IFR on the given handle references the variable pack\r
1020 STATUS_WARNING the IFR does not reference the variable pack\r
1021 STATUS_ERROR invalid IFR handle\r
1022 \r
1023--*/\r
1024{\r
1025 IFR_PARSE_CONTEXT *Context;\r
1026 char VarName[MAX_VARIABLE_NAME];\r
1027 IFR_PARSE_ENTRY *ParseEntry;\r
1028\r
1029 for (Context = mParseContext; Context != NULL; Context = Context->Next) {\r
1030 if (Context->Handle == IfrHandle) {\r
1031 //\r
1032 // Create an ASCII version of the variable name, since that's what is\r
1033 // referenced in IFR.\r
1034 //\r
1035 sprintf (VarName, "%S", (CHAR16 *) (VarPack + 1));\r
1036 //\r
1037 // Walk all the opcodes and see if the IFR references this variable pack\r
1038 //\r
1039 for (ParseEntry = Context->Ifr; ParseEntry != NULL; ParseEntry = ParseEntry->Next) {\r
1040 //\r
1041 // Check for Name.Guid match for primary IFR variable store\r
1042 //\r
1043 if ((strcmp (VarName, ParseEntry->VarStoreName1) == 0) &&\r
1044 (memcmp (&VarPack->VariableGuid, ParseEntry->VarStoreGuid1, sizeof (EFI_GUID)) == 0)\r
1045 ) {\r
1046 return STATUS_SUCCESS;\r
1047 }\r
1048 //\r
1049 // Check for Name.Guid match for secondary IFR variable store\r
1050 //\r
1051 if ((ParseEntry->VarStoreName2 != NULL) &&\r
1052 (strcmp (VarName, ParseEntry->VarStoreName2) == 0) &&\r
1053 (memcmp (&VarPack->VariableGuid, ParseEntry->VarStoreGuid2, sizeof (EFI_GUID)) == 0)\r
1054 ) {\r
1055 return STATUS_SUCCESS;\r
1056 }\r
1057 }\r
1058\r
1059 return STATUS_WARNING;\r
1060 }\r
1061 }\r
1062\r
1063 return STATUS_ERROR;\r
1064}\r
1065\r
1066STATUS\r
1067IfrGetVarPack (\r
1068 int VarIndex,\r
1069 EFI_HII_VARIABLE_PACK **VarPack\r
1070 )\r
1071/*++\r
1072\r
1073Routine Description:\r
1074\r
1075 Get the variable defaults. It is expected that the caller\r
1076 called IfrSetDefaults() previously to walk all the IFR forms we know about\r
1077 and create and initialize default values.\r
1078 \r
1079Arguments:\r
1080\r
1081 VarIndex - a 0-based index into all the variable stores we know about\r
1082 VarPack - outgoing pointer to a variable pack\r
1083\r
1084Returns:\r
1085\r
1086 STATUS_ERROR - VarIndex exceeds the number of variable packs we know of\r
1087 STATUS_SUCCESS - otherwise\r
1088 \r
1089--*/\r
1090{\r
1091 VARIABLE_STORE_ENTRY *Entry;\r
1092 //\r
1093 // Initialize outgoing parameters\r
1094 //\r
1095 *VarPack = NULL;\r
1096 for (Entry = mVariableStores; Entry != NULL; Entry = Entry->Next) {\r
1097 if (VarIndex == 0) {\r
1098 *VarPack = Entry->VarPack;\r
1099 return STATUS_SUCCESS;\r
1100 }\r
1101\r
1102 VarIndex--;\r
1103 }\r
1104\r
1105 return STATUS_ERROR;\r
1106}\r
1107\r
1108static\r
1109STATUS\r
1110SetVariableValue (\r
1111 EFI_GUID *VarGuid,\r
1112 char *VarName,\r
1113 int VarOffset,\r
1114 int VarSize,\r
1115 void *VarValue\r
1116 )\r
1117/*++\r
1118\r
1119Routine Description:\r
1120\r
1121 Given a variable GUID.Name, offset, size, and value, set the bytes in\r
1122 the variable to the provided value.\r
1123 \r
1124Arguments:\r
1125 VarGuid - GUID of variable to set\r
1126 VarName - name of variable to set\r
1127 VarOffset - byte offset into the variable store \r
1128 VarSize - size of the value in the variable store (in bytes)\r
1129 VarValue - pointer to buffer containing the value to set\r
1130\r
1131Returns:\r
1132\r
1133 \r
1134--*/\r
1135{\r
1136 VARIABLE_STORE_ENTRY *Entry;\r
1137 char *Src;\r
1138 char *Dest;\r
1139 //\r
1140 // Go through our list of variable stores to find the match\r
1141 //\r
1142 for (Entry = mVariableStores; Entry != NULL; Entry = Entry->Next) {\r
1143 if (memcmp (VarGuid, &Entry->VarPack->VariableGuid, sizeof (EFI_GUID)) == 0) {\r
1144 if (strcmp (VarName, Entry->VarName) == 0) {\r
1145 //\r
1146 // Found match -- check offset. If it's beyond the size of the variable store\r
1147 // buffer, then return a warning. Note that date-time can be beyond the\r
1148 // end of the varstore, which is ok.\r
1149 //\r
1150 if (VarOffset + VarSize <= Entry->VarBufferSize) {\r
1151 //\r
1152 // Stuff the data\r
1153 //\r
1154 Dest = Entry->VarBuffer + VarOffset;\r
1155 Src = (char *) VarValue;\r
1156 while (VarSize > 0) {\r
1157 *Dest = *Src;\r
1158 Src++;\r
1159 Dest++;\r
1160 VarSize--;\r
1161 }\r
1162\r
1163 return STATUS_SUCCESS;\r
1164 }\r
1165\r
1166 return STATUS_WARNING;\r
1167 }\r
1168 }\r
1169 }\r
1170\r
1171 return STATUS_ERROR;\r
1172}\r
1173\r
1174static\r
1175STATUS\r
1176SetDefaults (\r
1177 IFR_PARSE_CONTEXT *Context,\r
1178 UINT32 MfgDefaults\r
1179 )\r
1180/*++\r
1181\r
1182Routine Description:\r
1183\r
1184 Set variable defaults by walking a single IFR form.\r
1185 \r
1186Arguments:\r
1187 \r
1188 Context - Pointer to the IFR context.\r
1189 MfgDefaults - Number of Mfg defaults\r
1190\r
1191Returns:\r
1192\r
1193 EFI_INVALID_PARAMETER - arguments to function are invalid\r
1194 STATUS_SUCCESS - function executed successfully\r
1195 \r
1196--*/\r
1197{\r
1198 int Size;\r
1199 int CachedVarOffset;\r
1200 int CachedVarSize;\r
1201 int OrderedList;\r
1202 IFR_PARSE_ENTRY *SavedParseEntry;\r
1203 EFI_IFR_CHECK_BOX *IfrCheckBox;\r
1204 EFI_IFR_ONE_OF_OPTION *IfrOneOfOption;\r
1205 EFI_IFR_NUMERIC *IfrNumeric;\r
1206 STATUS Status;\r
1207 char ZeroByte;\r
1208\r
1209 //\r
1210 // Walk the opcodes to set default values and stuff them into the variable stores\r
1211 //\r
1212\r
1213 if (Context == NULL) {\r
1214 return EFI_INVALID_PARAMETER;\r
1215 }\r
1216 Status = STATUS_SUCCESS;\r
1217 Context->CurrentIfr = Context->Ifr;\r
1218 SavedParseEntry = NULL;\r
1219 OrderedList = 0;\r
1220 CachedVarOffset = 0;\r
1221 CachedVarSize = 0;\r
1222 ZeroByte = 0;\r
1223\r
1224 while (Context->CurrentIfr != NULL) {\r
1225 if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_FORM_SET_OP) {\r
1226 //\r
1227 // Formset opcode -- create a variable pack\r
1228 //\r
1229 Status = CreateVarStore (\r
1230 &((EFI_IFR_FORM_SET *) (Context->CurrentIfr->RawIfrHeader))->Guid,\r
1231 DEFAULT_VARIABLE_NAME,\r
1232 ((EFI_IFR_FORM_SET *) (Context->CurrentIfr->RawIfrHeader))->NvDataSize\r
1233 );\r
1234 } else if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_VARSTORE_OP) {\r
1235 //\r
1236 // Variable store opcode -- create a variable pack\r
1237 //\r
1238 Status = CreateVarStore (\r
1239 &((EFI_IFR_VARSTORE *) (Context->CurrentIfr->RawIfrHeader))->Guid,\r
1240 (char *) Context->CurrentIfr->RawIfrHeader + sizeof (EFI_IFR_VARSTORE),\r
1241 ((EFI_IFR_VARSTORE *) (Context->CurrentIfr->RawIfrHeader))->Size\r
1242 );\r
1243 } else if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_ONE_OF_OP) {\r
1244 //\r
1245 // Need this parse context later when we find the default ONE_OF_OPTION.\r
1246 // Clear out the variable store first, so that we're covered if someone\r
1247 // has two one-of opcode that operate on the same data.\r
1248 // So "last one wins" is the behavior.\r
1249 //\r
1250 OrderedList = 0;\r
1251 SavedParseEntry = Context->CurrentIfr;\r
1252 CachedVarOffset = ((EFI_IFR_ONE_OF *) Context->CurrentIfr->RawIfrHeader)->QuestionId;\r
1253 CachedVarSize = ((EFI_IFR_ONE_OF *) Context->CurrentIfr->RawIfrHeader)->Width;\r
1254 } else if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
1255 //\r
1256 // Need this parse context later as we parse the ONE_OF_OP's in the ordered list\r
1257 //\r
1258 OrderedList = 1;\r
1259 SavedParseEntry = Context->CurrentIfr;\r
1260 CachedVarOffset = ((EFI_IFR_ORDERED_LIST *) Context->CurrentIfr->RawIfrHeader)->QuestionId;\r
1261 CachedVarSize = ((EFI_IFR_ORDERED_LIST *) Context->CurrentIfr->RawIfrHeader)->MaxEntries;\r
1262\r
1263 while (CachedVarSize > 0) {\r
1264 Status = SetVariableValue (\r
1265 SavedParseEntry->VarStoreGuid1, // GUID of variable store to write\r
1266 SavedParseEntry->VarStoreName1, // name of variable store to write\r
1267 CachedVarOffset, // offset into variable store\r
1268 1, // variable data size\r
1269 (void *) &ZeroByte\r
1270 );\r
1271 //\r
1272 // variable value\r
1273 //\r
1274 CachedVarSize--;\r
1275 CachedVarOffset++;\r
1276 }\r
1277\r
1278 CachedVarOffset = ((EFI_IFR_ORDERED_LIST *) Context->CurrentIfr->RawIfrHeader)->QuestionId;\r
1279 CachedVarSize = 1;\r
1280 //\r
1281 // ((EFI_IFR_ORDERED_LIST *)Context->CurrentIfr->RawIfrHeader)->Width;\r
1282 //\r
1283 } else if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_ONE_OF_OPTION_OP) {\r
1284 IfrOneOfOption = (EFI_IFR_ONE_OF_OPTION *) Context->CurrentIfr->RawIfrHeader;\r
1285 //\r
1286 // If we're in an ordered list, then copy the value to the data store\r
1287 //\r
1288 if (OrderedList) {\r
1289 Status = SetVariableValue (\r
1290 SavedParseEntry->VarStoreGuid1, // GUID of variable store to write\r
1291 SavedParseEntry->VarStoreName1, // name of variable store to write\r
1292 CachedVarOffset, // offset into variable store\r
1293 1, // variable data size\r
1294 (void *) &IfrOneOfOption->Value\r
1295 );\r
1296 //\r
1297 // variable value\r
1298 //\r
1299 // Advance the offset for the next ordered list item\r
1300 //\r
1301 CachedVarOffset += CachedVarSize;\r
1302 } else {\r
1303 //\r
1304 // ONE-OF list. See if the default flag is set (provided we're not doing mfg defaults)\r
1305 //\r
1306 if (!MfgDefaults) {\r
1307 if (IfrOneOfOption->Flags & EFI_IFR_FLAG_DEFAULT) {\r
1308 Status = SetVariableValue (\r
1309 SavedParseEntry->VarStoreGuid1, // GUID of variable store to write\r
1310 SavedParseEntry->VarStoreName1, // name of variable store to write\r
1311 CachedVarOffset, // offset into variable store\r
1312 CachedVarSize, // variable data size\r
1313 &IfrOneOfOption->Value\r
1314 );\r
1315 //\r
1316 // variable value\r
1317 //\r
1318 }\r
1319 } else {\r
1320 if (IfrOneOfOption->Flags & EFI_IFR_FLAG_MANUFACTURING) {\r
1321 Status = SetVariableValue (\r
1322 SavedParseEntry->VarStoreGuid1, // GUID of variable store to write\r
1323 SavedParseEntry->VarStoreName1, // name of variable store to write\r
1324 CachedVarOffset, // offset into variable store\r
1325 CachedVarSize, // variable data size\r
1326 &IfrOneOfOption->Value\r
1327 );\r
1328 //\r
1329 // variable value\r
1330 //\r
1331 }\r
1332 }\r
1333 }\r
1334 } else if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_CHECKBOX_OP) {\r
1335 //\r
1336 // If we're saving defaults, and the default flag is set, or we're saving\r
1337 // manufacturing defaults and the manufacturing flag is set, then save a 1.\r
1338 // By default the varstore buffer is cleared, so we don't need to save a 0 ever.\r
1339 //\r
1340 IfrCheckBox = (EFI_IFR_CHECK_BOX *) Context->CurrentIfr->RawIfrHeader;\r
1341 if (((MfgDefaults == 0) && (IfrCheckBox->Flags & EFI_IFR_FLAG_DEFAULT)) ||\r
1342 ((MfgDefaults != 0) && (IfrCheckBox->Flags & EFI_IFR_FLAG_MANUFACTURING))\r
1343 ) {\r
1344 Size = 1;\r
1345 Status = SetVariableValue (\r
1346 Context->CurrentIfr->VarStoreGuid1, // GUID of variable store to write\r
1347 Context->CurrentIfr->VarStoreName1, // name of variable store to write\r
1348 IfrCheckBox->QuestionId, // offset into variable store\r
1349 IfrCheckBox->Width, // variable data size\r
1350 (void *) &Size\r
1351 );\r
1352 //\r
1353 // variable value\r
1354 //\r
1355 }\r
1356 } else if (Context->CurrentIfr->RawIfrHeader->OpCode == EFI_IFR_NUMERIC_OP) {\r
1357 IfrNumeric = (EFI_IFR_NUMERIC *) Context->CurrentIfr->RawIfrHeader;\r
1358 Status = SetVariableValue (\r
1359 Context->CurrentIfr->VarStoreGuid1, // GUID of variable store to write\r
1360 Context->CurrentIfr->VarStoreName1, // name of variable store to write\r
1361 IfrNumeric->QuestionId, // offset into variable store\r
1362 IfrNumeric->Width, // variable data size\r
1363 (void *) &IfrNumeric->Default\r
1364 );\r
1365 //\r
1366 // variable value\r
1367 //\r
1368 }\r
1369\r
1370 Context->CurrentIfr = Context->CurrentIfr->Next;\r
1371 }\r
1372\r
1373 return STATUS_SUCCESS;\r
1374}\r
1375\r
1376static\r
1377STATUS\r
1378CreateVarStore (\r
1379 EFI_GUID *VarGuid,\r
1380 CHAR8 *VarName,\r
1381 int VarStoreSize\r
1382 )\r
1383/*++\r
1384\r
1385Routine Description:\r
1386\r
1387 Given a variable GUID.Name and the size of the variable store, allocate\r
1388 storage for maintaining the variable value.\r
1389 \r
1390Arguments:\r
1391\r
1392 VarGuid - GUID for a variable\r
1393 VarName - Name of the variable\r
1394 VarStoreSize - size of the variable store\r
1395\r
1396Returns:\r
1397\r
1398 STATUS_ERROR - problem with storage allocation \r
1399 STATUS_SUCCESS - function executed successfully\r
1400 \r
1401--*/\r
1402{\r
1403 VARIABLE_STORE_ENTRY *Entry;\r
1404\r
1405 VARIABLE_STORE_ENTRY *TempEntry;\r
1406 int PackSize;\r
1407 int VarNameLen;\r
1408 //\r
1409 // If the variable store size is zero, then do nothing. This could be valid\r
1410 // if variable steering is used in the IFR such that FormsetGUID."Setup" variable\r
1411 // store is never used.\r
1412 //\r
1413 // OPEN: What about a form that only has a time/date question? Then if some other\r
1414 // function called SetDefaults(), attempting to set time/date would result in an\r
1415 // error in the SetVarValue() function.\r
1416 //\r
1417 if (VarStoreSize == 0) {\r
1418 return STATUS_SUCCESS;\r
1419 }\r
1420 //\r
1421 // Go through our list of variable stores and see if we've already created one\r
1422 // for this Guid.Name. If so, check the size and return. Otherwise create\r
1423 // one and add it to the list.\r
1424 //\r
1425 for (Entry = mVariableStores; Entry != NULL; Entry = Entry->Next) {\r
1426 if (memcmp (VarGuid, &Entry->VarPack->VariableGuid, sizeof (EFI_GUID)) == 0) {\r
1427 if (strcmp (VarName, Entry->VarName) == 0) {\r
1428 //\r
1429 // Already have one. Check size.\r
1430 //\r
1431 if (Entry->VarBufferSize != VarStoreSize) {\r
1432 Error (NULL, 0, 0, "mismatched variable store size between two formsets", VarName);\r
1433 return STATUS_ERROR;\r
1434 }\r
1435\r
1436 return STATUS_SUCCESS;\r
1437 }\r
1438 }\r
1439 }\r
1440 //\r
1441 // Create a new one.\r
1442 //\r
1443 Entry = (VARIABLE_STORE_ENTRY *) malloc (sizeof (VARIABLE_STORE_ENTRY));\r
1444 if (Entry == NULL) {\r
1445 Error (NULL, 0, 0, "memory allocation failure", NULL);\r
1446 return STATUS_ERROR;\r
1447 }\r
1448\r
1449 memset ((void *) Entry, 0, sizeof (VARIABLE_STORE_ENTRY));\r
1450 //\r
1451 // Compute size of the varpack\r
1452 //\r
1453 VarNameLen = strlen (VarName) + 1;\r
1454 PackSize = sizeof (EFI_HII_VARIABLE_PACK) + VarNameLen * sizeof (CHAR16) + VarStoreSize;\r
1455 Entry->VarPack = (EFI_HII_VARIABLE_PACK *) malloc (PackSize);\r
1456 if (Entry->VarPack == NULL) {\r
1457 Error (NULL, 0, 0, "memory allocation failure", NULL);\r
1458 free (Entry);\r
1459 return STATUS_ERROR;\r
1460 }\r
1461\r
1462 Entry->VarPack->Header.Length = PackSize;\r
1463 Entry->VarPack->Header.Type = EFI_HII_VARIABLE;\r
1464 Entry->VarPack->VariableNameLength = VarNameLen * sizeof (CHAR16);\r
1465 Entry->VarName[MAX_VARIABLE_NAME - 1] = 0;\r
1466 strncpy (Entry->VarName, VarName, MAX_VARIABLE_NAME - 1);\r
1467#ifdef USE_VC8\r
1468 swprintf ((CHAR16 *) (Entry->VarPack + 1), (strlen (VarName) + 1) * sizeof (CHAR16), L"%S", VarName);\r
1469#else\r
1470 swprintf ((CHAR16 *) (Entry->VarPack + 1), L"%S", VarName);\r
1471#endif\r
1472 memcpy (&Entry->VarPack->VariableGuid, VarGuid, sizeof (EFI_GUID));\r
1473 //\r
1474 // Point VarBuffer into the allocated buffer (for convenience)\r
1475 //\r
1476 Entry->VarBuffer = (char *) Entry->VarPack + sizeof (EFI_HII_VARIABLE_PACK) + VarNameLen * sizeof (CHAR16);\r
1477 memset ((void *) Entry->VarBuffer, 0, VarStoreSize);\r
1478 Entry->VarBufferSize = VarStoreSize;\r
1479 //\r
1480 // Add this new varstore to our list\r
1481 //\r
1482 if (mVariableStores == NULL) {\r
1483 mVariableStores = Entry;\r
1484 } else {\r
1485 for (TempEntry = mVariableStores; TempEntry->Next != NULL; TempEntry = TempEntry->Next)\r
1486 ;\r
1487 TempEntry->Next = Entry;\r
1488 }\r
1489 return STATUS_SUCCESS;\r
1490}\r
1491\r
1492/******************************************************************************/\r
1493\r
1494/*++\r
1495\r
1496Routine Description:\r
1497\r
1498 The following IfrParseXX() functions are used to parse an IFR opcode numbered\r
1499 XX via a dispatch table. \r
1500 \r
1501Arguments:\r
1502\r
1503 Context - IFR parsing context into which pertinent data for the \r
1504 current opcode can be saved. Context->LastIfr->RawIfrHeader points to \r
1505 the raw IFR bytes currently being parsed.\r
1506\r
1507Returns:\r
1508\r
1509 STATUS_SUCCESS - always\r
1510 \r
1511--*/\r
1512\r
1513/*******************************************************************************/\r
1514static\r
1515STATUS\r
1516IfrParse01 (\r
1517 IFR_PARSE_CONTEXT *Context\r
1518 )\r
1519/*++\r
1520\r
1521Routine Description:\r
1522\r
1523 GC_TODO: Add function description\r
1524\r
1525Arguments:\r
1526\r
1527 Context - GC_TODO: add argument description\r
1528\r
1529Returns:\r
1530\r
1531 GC_TODO: add return values\r
1532\r
1533--*/\r
1534{\r
1535 return STATUS_SUCCESS;\r
1536}\r
1537\r
1538static\r
1539STATUS\r
1540IfrParse02 (\r
1541 IFR_PARSE_CONTEXT *Context\r
1542 )\r
1543/*++\r
1544\r
1545Routine Description:\r
1546\r
1547 GC_TODO: Add function description\r
1548\r
1549Arguments:\r
1550\r
1551 Context - GC_TODO: add argument description\r
1552\r
1553Returns:\r
1554\r
1555 GC_TODO: add return values\r
1556\r
1557--*/\r
1558{\r
1559 return STATUS_SUCCESS;\r
1560}\r
1561\r
1562static\r
1563STATUS\r
1564IfrParse03 (\r
1565 IFR_PARSE_CONTEXT *Context\r
1566 )\r
1567/*++\r
1568\r
1569Routine Description:\r
1570\r
1571 GC_TODO: Add function description\r
1572\r
1573Arguments:\r
1574\r
1575 Context - GC_TODO: add argument description\r
1576\r
1577Returns:\r
1578\r
1579 GC_TODO: add return values\r
1580\r
1581--*/\r
1582{\r
1583 return STATUS_SUCCESS;\r
1584}\r
1585//\r
1586// Parse the IFR EFI_IFR_ONE_OF opcode.\r
1587//\r
1588static\r
1589STATUS\r
1590IfrParse05 (\r
1591 IFR_PARSE_CONTEXT *Context\r
1592 )\r
1593/*++\r
1594\r
1595Routine Description:\r
1596\r
1597 GC_TODO: Add function description\r
1598\r
1599Arguments:\r
1600\r
1601 Context - GC_TODO: add argument description\r
1602\r
1603Returns:\r
1604\r
1605 GC_TODO: add return values\r
1606\r
1607--*/\r
1608{\r
1609 return STATUS_SUCCESS;\r
1610}\r
1611\r
1612static\r
1613STATUS\r
1614IfrParse06 (\r
1615 IFR_PARSE_CONTEXT *Context\r
1616 )\r
1617/*++\r
1618\r
1619Routine Description:\r
1620\r
1621 GC_TODO: Add function description\r
1622\r
1623Arguments:\r
1624\r
1625 Context - GC_TODO: add argument description\r
1626\r
1627Returns:\r
1628\r
1629 GC_TODO: add return values\r
1630\r
1631--*/\r
1632{\r
1633 return STATUS_SUCCESS;\r
1634}\r
1635\r
1636static\r
1637STATUS\r
1638IfrParse07 (\r
1639 IFR_PARSE_CONTEXT *Context\r
1640 )\r
1641/*++\r
1642\r
1643Routine Description:\r
1644\r
1645 GC_TODO: Add function description\r
1646\r
1647Arguments:\r
1648\r
1649 Context - GC_TODO: add argument description\r
1650\r
1651Returns:\r
1652\r
1653 GC_TODO: add return values\r
1654\r
1655--*/\r
1656{\r
1657 return STATUS_SUCCESS;\r
1658}\r
1659\r
1660static\r
1661STATUS\r
1662IfrParse08 (\r
1663 IFR_PARSE_CONTEXT *Context\r
1664 )\r
1665/*++\r
1666\r
1667Routine Description:\r
1668\r
1669 GC_TODO: Add function description\r
1670\r
1671Arguments:\r
1672\r
1673 Context - GC_TODO: add argument description\r
1674\r
1675Returns:\r
1676\r
1677 GC_TODO: add return values\r
1678\r
1679--*/\r
1680{\r
1681 return STATUS_SUCCESS;\r
1682}\r
1683\r
1684static\r
1685STATUS\r
1686IfrParse09 (\r
1687 IFR_PARSE_CONTEXT *Context\r
1688 )\r
1689/*++\r
1690\r
1691Routine Description:\r
1692\r
1693 GC_TODO: Add function description\r
1694\r
1695Arguments:\r
1696\r
1697 Context - GC_TODO: add argument description\r
1698\r
1699Returns:\r
1700\r
1701 GC_TODO: add return values\r
1702\r
1703--*/\r
1704{\r
1705 return STATUS_SUCCESS;\r
1706}\r
1707\r
1708static\r
1709STATUS\r
1710IfrParse0A (\r
1711 IFR_PARSE_CONTEXT *Context\r
1712 )\r
1713/*++\r
1714\r
1715Routine Description:\r
1716\r
1717 GC_TODO: Add function description\r
1718\r
1719Arguments:\r
1720\r
1721 Context - GC_TODO: add argument description\r
1722\r
1723Returns:\r
1724\r
1725 GC_TODO: add return values\r
1726\r
1727--*/\r
1728{\r
1729 return STATUS_SUCCESS;\r
1730}\r
1731\r
1732static\r
1733STATUS\r
1734IfrParse0B (\r
1735 IFR_PARSE_CONTEXT *Context\r
1736 )\r
1737/*++\r
1738\r
1739Routine Description:\r
1740\r
1741 GC_TODO: Add function description\r
1742\r
1743Arguments:\r
1744\r
1745 Context - GC_TODO: add argument description\r
1746\r
1747Returns:\r
1748\r
1749 GC_TODO: add return values\r
1750\r
1751--*/\r
1752{\r
1753 return STATUS_SUCCESS;\r
1754}\r
1755\r
1756static\r
1757STATUS\r
1758IfrParse0C (\r
1759 IFR_PARSE_CONTEXT *Context\r
1760 )\r
1761/*++\r
1762\r
1763Routine Description:\r
1764\r
1765 GC_TODO: Add function description\r
1766\r
1767Arguments:\r
1768\r
1769 Context - GC_TODO: add argument description\r
1770\r
1771Returns:\r
1772\r
1773 GC_TODO: add return values\r
1774\r
1775--*/\r
1776{\r
1777 return STATUS_SUCCESS;\r
1778}\r
1779\r
1780static\r
1781STATUS\r
1782IfrParse0D (\r
1783 IFR_PARSE_CONTEXT *Context\r
1784 )\r
1785/*++\r
1786\r
1787Routine Description:\r
1788\r
1789 GC_TODO: Add function description\r
1790\r
1791Arguments:\r
1792\r
1793 Context - GC_TODO: add argument description\r
1794\r
1795Returns:\r
1796\r
1797 GC_TODO: add return values\r
1798\r
1799--*/\r
1800{\r
1801 return STATUS_SUCCESS;\r
1802}\r
1803\r
1804static\r
1805STATUS\r
1806IfrParse0E (\r
1807 IFR_PARSE_CONTEXT *Context\r
1808 )\r
1809/*++\r
1810\r
1811Routine Description:\r
1812\r
1813 GC_TODO: Add function description\r
1814\r
1815Arguments:\r
1816\r
1817 Context - GC_TODO: add argument description\r
1818\r
1819Returns:\r
1820\r
1821 GC_TODO: add return values\r
1822\r
1823--*/\r
1824{\r
1825 EFI_IFR_FORM_SET *Op;\r
1826 Op = (EFI_IFR_FORM_SET *) Context->LastIfr->RawIfrHeader;\r
1827 Context->LastIfr->VarStoreGuid1 = &Op->Guid;\r
1828 Context->LastIfr->VarStoreName1 = "Setup";\r
1829 Context->FormsetGuid = &Op->Guid;\r
1830 return STATUS_SUCCESS;\r
1831}\r
1832\r
1833static\r
1834STATUS\r
1835IfrParse0F (\r
1836 IFR_PARSE_CONTEXT *Context\r
1837 )\r
1838/*++\r
1839\r
1840Routine Description:\r
1841\r
1842 GC_TODO: Add function description\r
1843\r
1844Arguments:\r
1845\r
1846 Context - GC_TODO: add argument description\r
1847\r
1848Returns:\r
1849\r
1850 GC_TODO: add return values\r
1851\r
1852--*/\r
1853{\r
1854 return STATUS_SUCCESS;\r
1855}\r
1856\r
1857static\r
1858STATUS\r
1859IfrParse10 (\r
1860 IFR_PARSE_CONTEXT *Context\r
1861 )\r
1862/*++\r
1863\r
1864Routine Description:\r
1865\r
1866 GC_TODO: Add function description\r
1867\r
1868Arguments:\r
1869\r
1870 Context - GC_TODO: add argument description\r
1871\r
1872Returns:\r
1873\r
1874 GC_TODO: add return values\r
1875\r
1876--*/\r
1877{\r
1878 return STATUS_SUCCESS;\r
1879}\r
1880\r
1881static\r
1882STATUS\r
1883IfrParse11 (\r
1884 IFR_PARSE_CONTEXT *Context\r
1885 )\r
1886/*++\r
1887\r
1888Routine Description:\r
1889\r
1890 GC_TODO: Add function description\r
1891\r
1892Arguments:\r
1893\r
1894 Context - GC_TODO: add argument description\r
1895\r
1896Returns:\r
1897\r
1898 GC_TODO: add return values\r
1899\r
1900--*/\r
1901{\r
1902 return STATUS_SUCCESS;\r
1903}\r
1904\r
1905static\r
1906STATUS\r
1907IfrParse12 (\r
1908 IFR_PARSE_CONTEXT *Context\r
1909 )\r
1910/*++\r
1911\r
1912Routine Description:\r
1913\r
1914 GC_TODO: Add function description\r
1915\r
1916Arguments:\r
1917\r
1918 Context - GC_TODO: add argument description\r
1919\r
1920Returns:\r
1921\r
1922 GC_TODO: add return values\r
1923\r
1924--*/\r
1925{\r
1926 return STATUS_SUCCESS;\r
1927}\r
1928\r
1929static\r
1930STATUS\r
1931IfrParse13 (\r
1932 IFR_PARSE_CONTEXT *Context\r
1933 )\r
1934/*++\r
1935\r
1936Routine Description:\r
1937\r
1938 GC_TODO: Add function description\r
1939\r
1940Arguments:\r
1941\r
1942 Context - GC_TODO: add argument description\r
1943\r
1944Returns:\r
1945\r
1946 GC_TODO: add return values\r
1947\r
1948--*/\r
1949{\r
1950 return STATUS_SUCCESS;\r
1951}\r
1952\r
1953static\r
1954STATUS\r
1955IfrParse14 (\r
1956 IFR_PARSE_CONTEXT *Context\r
1957 )\r
1958/*++\r
1959\r
1960Routine Description:\r
1961\r
1962 GC_TODO: Add function description\r
1963\r
1964Arguments:\r
1965\r
1966 Context - GC_TODO: add argument description\r
1967\r
1968Returns:\r
1969\r
1970 GC_TODO: add return values\r
1971\r
1972--*/\r
1973{\r
1974 return STATUS_SUCCESS;\r
1975}\r
1976\r
1977static\r
1978STATUS\r
1979IfrParse15 (\r
1980 IFR_PARSE_CONTEXT *Context\r
1981 )\r
1982/*++\r
1983\r
1984Routine Description:\r
1985\r
1986 GC_TODO: Add function description\r
1987\r
1988Arguments:\r
1989\r
1990 Context - GC_TODO: add argument description\r
1991\r
1992Returns:\r
1993\r
1994 GC_TODO: add return values\r
1995\r
1996--*/\r
1997{\r
1998 return STATUS_SUCCESS;\r
1999}\r
2000\r
2001static\r
2002STATUS\r
2003IfrParse16 (\r
2004 IFR_PARSE_CONTEXT *Context\r
2005 )\r
2006/*++\r
2007\r
2008Routine Description:\r
2009\r
2010 GC_TODO: Add function description\r
2011\r
2012Arguments:\r
2013\r
2014 Context - GC_TODO: add argument description\r
2015\r
2016Returns:\r
2017\r
2018 GC_TODO: add return values\r
2019\r
2020--*/\r
2021{\r
2022 return STATUS_SUCCESS;\r
2023}\r
2024\r
2025static\r
2026STATUS\r
2027IfrParse17 (\r
2028 IFR_PARSE_CONTEXT *Context\r
2029 )\r
2030/*++\r
2031\r
2032Routine Description:\r
2033\r
2034 GC_TODO: Add function description\r
2035\r
2036Arguments:\r
2037\r
2038 Context - GC_TODO: add argument description\r
2039\r
2040Returns:\r
2041\r
2042 GC_TODO: add return values\r
2043\r
2044--*/\r
2045{\r
2046 return STATUS_SUCCESS;\r
2047}\r
2048\r
2049static\r
2050STATUS\r
2051IfrParse18 (\r
2052 IFR_PARSE_CONTEXT *Context\r
2053 )\r
2054/*++\r
2055\r
2056Routine Description:\r
2057\r
2058 GC_TODO: Add function description\r
2059\r
2060Arguments:\r
2061\r
2062 Context - GC_TODO: add argument description\r
2063\r
2064Returns:\r
2065\r
2066 GC_TODO: add return values\r
2067\r
2068--*/\r
2069{\r
2070 return STATUS_SUCCESS;\r
2071}\r
2072\r
2073static\r
2074STATUS\r
2075IfrParse19 (\r
2076 IFR_PARSE_CONTEXT *Context\r
2077 )\r
2078/*++\r
2079\r
2080Routine Description:\r
2081\r
2082 GC_TODO: Add function description\r
2083\r
2084Arguments:\r
2085\r
2086 Context - GC_TODO: add argument description\r
2087\r
2088Returns:\r
2089\r
2090 GC_TODO: add return values\r
2091\r
2092--*/\r
2093{\r
2094 return STATUS_SUCCESS;\r
2095}\r
2096\r
2097static\r
2098STATUS\r
2099IfrParse1A (\r
2100 IFR_PARSE_CONTEXT *Context\r
2101 )\r
2102/*++\r
2103\r
2104Routine Description:\r
2105\r
2106 GC_TODO: Add function description\r
2107\r
2108Arguments:\r
2109\r
2110 Context - GC_TODO: add argument description\r
2111\r
2112Returns:\r
2113\r
2114 GC_TODO: add return values\r
2115\r
2116--*/\r
2117{\r
2118 return STATUS_SUCCESS;\r
2119}\r
2120\r
2121static\r
2122STATUS\r
2123IfrParse1B (\r
2124 IFR_PARSE_CONTEXT *Context\r
2125 )\r
2126/*++\r
2127\r
2128Routine Description:\r
2129\r
2130 GC_TODO: Add function description\r
2131\r
2132Arguments:\r
2133\r
2134 Context - GC_TODO: add argument description\r
2135\r
2136Returns:\r
2137\r
2138 GC_TODO: add return values\r
2139\r
2140--*/\r
2141{\r
2142 return STATUS_SUCCESS;\r
2143}\r
2144\r
2145static\r
2146STATUS\r
2147IfrParse1C (\r
2148 IFR_PARSE_CONTEXT *Context\r
2149 )\r
2150/*++\r
2151\r
2152Routine Description:\r
2153\r
2154 GC_TODO: Add function description\r
2155\r
2156Arguments:\r
2157\r
2158 Context - GC_TODO: add argument description\r
2159\r
2160Returns:\r
2161\r
2162 GC_TODO: add return values\r
2163\r
2164--*/\r
2165{\r
2166 return STATUS_SUCCESS;\r
2167}\r
2168\r
2169static\r
2170STATUS\r
2171IfrParse1D (\r
2172 IFR_PARSE_CONTEXT *Context\r
2173 )\r
2174/*++\r
2175\r
2176Routine Description:\r
2177\r
2178 GC_TODO: Add function description\r
2179\r
2180Arguments:\r
2181\r
2182 Context - GC_TODO: add argument description\r
2183\r
2184Returns:\r
2185\r
2186 GC_TODO: add return values\r
2187\r
2188--*/\r
2189{\r
2190 return STATUS_SUCCESS;\r
2191}\r
2192\r
2193static\r
2194STATUS\r
2195IfrParse1E (\r
2196 IFR_PARSE_CONTEXT *Context\r
2197 )\r
2198/*++\r
2199\r
2200Routine Description:\r
2201\r
2202 GC_TODO: Add function description\r
2203\r
2204Arguments:\r
2205\r
2206 Context - GC_TODO: add argument description\r
2207\r
2208Returns:\r
2209\r
2210 GC_TODO: add return values\r
2211\r
2212--*/\r
2213{\r
2214 return STATUS_SUCCESS;\r
2215}\r
2216\r
2217static\r
2218STATUS\r
2219IfrParse1F (\r
2220 IFR_PARSE_CONTEXT *Context\r
2221 )\r
2222/*++\r
2223\r
2224Routine Description:\r
2225\r
2226 GC_TODO: Add function description\r
2227\r
2228Arguments:\r
2229\r
2230 Context - GC_TODO: add argument description\r
2231\r
2232Returns:\r
2233\r
2234 GC_TODO: add return values\r
2235\r
2236--*/\r
2237{\r
2238 return STATUS_SUCCESS;\r
2239}\r
2240\r
2241static\r
2242STATUS\r
2243IfrParse20 (\r
2244 IFR_PARSE_CONTEXT *Context\r
2245 )\r
2246/*++\r
2247\r
2248Routine Description:\r
2249\r
2250 GC_TODO: Add function description\r
2251\r
2252Arguments:\r
2253\r
2254 Context - GC_TODO: add argument description\r
2255\r
2256Returns:\r
2257\r
2258 GC_TODO: add return values\r
2259\r
2260--*/\r
2261{\r
2262 return STATUS_SUCCESS;\r
2263}\r
2264\r
2265static\r
2266STATUS\r
2267IfrParse21 (\r
2268 IFR_PARSE_CONTEXT *Context\r
2269 )\r
2270/*++\r
2271\r
2272Routine Description:\r
2273\r
2274 GC_TODO: Add function description\r
2275\r
2276Arguments:\r
2277\r
2278 Context - GC_TODO: add argument description\r
2279\r
2280Returns:\r
2281\r
2282 GC_TODO: add return values\r
2283\r
2284--*/\r
2285{\r
2286 return STATUS_SUCCESS;\r
2287}\r
2288\r
2289static\r
2290STATUS\r
2291IfrParse22 (\r
2292 IFR_PARSE_CONTEXT *Context\r
2293 )\r
2294/*++\r
2295\r
2296Routine Description:\r
2297\r
2298 GC_TODO: Add function description\r
2299\r
2300Arguments:\r
2301\r
2302 Context - GC_TODO: add argument description\r
2303\r
2304Returns:\r
2305\r
2306 GC_TODO: add return values\r
2307\r
2308--*/\r
2309{\r
2310 return STATUS_SUCCESS;\r
2311}\r
2312\r
2313static\r
2314STATUS\r
2315IfrParse23 (\r
2316 IFR_PARSE_CONTEXT *Context\r
2317 )\r
2318/*++\r
2319\r
2320Routine Description:\r
2321\r
2322 GC_TODO: Add function description\r
2323\r
2324Arguments:\r
2325\r
2326 Context - GC_TODO: add argument description\r
2327\r
2328Returns:\r
2329\r
2330 GC_TODO: add return values\r
2331\r
2332--*/\r
2333{\r
2334 return STATUS_SUCCESS;\r
2335}\r
2336//\r
2337// EFI_IFR_VARSTORE\r
2338//\r
2339static\r
2340STATUS\r
2341IfrParse24 (\r
2342 IFR_PARSE_CONTEXT *Context\r
2343 )\r
2344/*++\r
2345\r
2346Routine Description:\r
2347\r
2348 GC_TODO: Add function description\r
2349\r
2350Arguments:\r
2351\r
2352 Context - GC_TODO: add argument description\r
2353\r
2354Returns:\r
2355\r
2356 GC_TODO: add return values\r
2357\r
2358--*/\r
2359{\r
2360 EFI_IFR_VARSTORE *Op;\r
2361 Op = (EFI_IFR_VARSTORE *) Context->LastIfr->RawIfrHeader;\r
2362 return STATUS_SUCCESS;\r
2363}\r
2364//\r
2365// VARSTORE_SELECT\r
2366//\r
2367static\r
2368STATUS\r
2369IfrParse25 (\r
2370 IFR_PARSE_CONTEXT *Context\r
2371 )\r
2372/*++\r
2373\r
2374Routine Description:\r
2375\r
2376 GC_TODO: Add function description\r
2377\r
2378Arguments:\r
2379\r
2380 Context - GC_TODO: add argument description\r
2381\r
2382Returns:\r
2383\r
2384 GC_TODO: add return values\r
2385\r
2386--*/\r
2387{\r
2388 STATUS Status;\r
2389 EFI_IFR_VARSTORE_SELECT *Op;\r
2390 Op = (EFI_IFR_VARSTORE_SELECT *) Context->LastIfr->RawIfrHeader;\r
2391 Status = GetVarStoreInfo (Context, Op->VarId, &Context->LastIfr->VarStoreGuid1, &Context->LastIfr->VarStoreName1);\r
2392 //\r
2393 // VARSTORE_SELECT sets both\r
2394 //\r
2395 Context->LastIfr->VarStoreGuid2 = Context->LastIfr->VarStoreGuid1;\r
2396 Context->LastIfr->VarStoreName2 = Context->LastIfr->VarStoreName1;\r
2397 return Status;\r
2398}\r
2399//\r
2400// VARSTORE_SELECT_PAIR\r
2401//\r
2402static\r
2403STATUS\r
2404IfrParse26 (\r
2405 IFR_PARSE_CONTEXT *Context\r
2406 )\r
2407/*++\r
2408\r
2409Routine Description:\r
2410\r
2411 GC_TODO: Add function description\r
2412\r
2413Arguments:\r
2414\r
2415 Context - GC_TODO: add argument description\r
2416\r
2417Returns:\r
2418\r
2419 GC_TODO: add return values\r
2420\r
2421--*/\r
2422{\r
2423 STATUS Status;\r
2424 EFI_IFR_VARSTORE_SELECT_PAIR *Op;\r
2425\r
2426 Op = (EFI_IFR_VARSTORE_SELECT_PAIR *) Context->LastIfr->RawIfrHeader;\r
2427 Status = GetVarStoreInfo (Context, Op->VarId, &Context->LastIfr->VarStoreGuid1, &Context->LastIfr->VarStoreName1);\r
2428 Status = GetVarStoreInfo (\r
2429 Context,\r
2430 Op->SecondaryVarId,\r
2431 &Context->LastIfr->VarStoreGuid2,\r
2432 &Context->LastIfr->VarStoreName2\r
2433 );\r
2434 return Status;\r
2435}\r
2436//\r
2437// TRUE\r
2438//\r
2439static\r
2440STATUS\r
2441IfrParse27 (\r
2442 IFR_PARSE_CONTEXT *Context\r
2443 )\r
2444/*++\r
2445\r
2446Routine Description:\r
2447\r
2448 GC_TODO: Add function description\r
2449\r
2450Arguments:\r
2451\r
2452 Context - GC_TODO: add argument description\r
2453\r
2454Returns:\r
2455\r
2456 GC_TODO: add return values\r
2457\r
2458--*/\r
2459{\r
2460 return STATUS_SUCCESS;\r
2461}\r
2462//\r
2463// FALSe\r
2464//\r
2465static\r
2466STATUS\r
2467IfrParse28 (\r
2468 IFR_PARSE_CONTEXT *Context\r
2469 )\r
2470/*++\r
2471\r
2472Routine Description:\r
2473\r
2474 GC_TODO: Add function description\r
2475\r
2476Arguments:\r
2477\r
2478 Context - GC_TODO: add argument description\r
2479\r
2480Returns:\r
2481\r
2482 GC_TODO: add return values\r
2483\r
2484--*/\r
2485{\r
2486 return STATUS_SUCCESS;\r
2487}\r
2488static\r
2489STATUS\r
2490IfrParse29 (\r
2491 IFR_PARSE_CONTEXT *Context\r
2492 )\r
2493/*++\r
2494\r
2495Routine Description:\r
2496\r
2497 GC_TODO: Add function description\r
2498\r
2499Arguments:\r
2500\r
2501 Context - GC_TODO: add argument description\r
2502\r
2503Returns:\r
2504\r
2505 GC_TODO: add return values\r
2506\r
2507--*/\r
2508{\r
2509 return STATUS_SUCCESS;\r
2510}\r
2511static\r
2512STATUS\r
2513IfrParse2A (\r
2514 IFR_PARSE_CONTEXT *Context\r
2515 )\r
2516/*++\r
2517\r
2518Routine Description:\r
2519\r
2520 GC_TODO: Add function description\r
2521\r
2522Arguments:\r
2523\r
2524 Context - GC_TODO: add argument description\r
2525\r
2526Returns:\r
2527\r
2528 GC_TODO: add return values\r
2529\r
2530--*/\r
2531{\r
2532 return STATUS_SUCCESS;\r
2533}\r