]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
Correct BlockSize when call ConfigToBlock API.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / UefiIfrParser.c
CommitLineData
59336178 1/** @file\r
2Parser for IFR binary encoding.\r
3\r
4Copyright (c) 2008, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
6d207823 15#include "HiiDatabase.h"\r
59336178 16\r
a9d85320 17#include "UefiIfrParserExpression.h"\r
59336178 18\r
19UINT16 mStatementIndex;\r
59336178 20\r
21BOOLEAN mInScopeSubtitle;\r
22BOOLEAN mInScopeSuppress;\r
23BOOLEAN mInScopeGrayOut;\r
59336178 24\r
a9d85320 25EFI_GUID mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
26extern EFI_GUID mTianoHiiIfrGuid;\r
27\r
28LIST_ENTRY *\r
29GetOneOfOptionMapEntryListHead (\r
30 IN CONST FORM_BROWSER_FORMSET *FormSet,\r
31 IN UINT16 QuestionId\r
32 )\r
33{\r
34 LIST_ENTRY *Link;\r
35 ONE_OF_OPTION_MAP *Map;\r
36\r
37 Link = GetFirstNode (&FormSet->OneOfOptionMapListHead);\r
38\r
39 while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) {\r
40 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
41 if (QuestionId == Map->QuestionId) {\r
42 return &Map->OneOfOptionMapEntryListHead;\r
43 }\r
44 Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link);\r
45 }\r
46 \r
47 return NULL;\r
48}\r
49\r
50VOID\r
51DestoryOneOfOptionMap (\r
52 IN LIST_ENTRY *OneOfOptionMapListHead\r
53 )\r
54{\r
55 ONE_OF_OPTION_MAP *Map;\r
56 ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
57 LIST_ENTRY *Link;\r
58 LIST_ENTRY *Link2;\r
59\r
60 while (!IsListEmpty (OneOfOptionMapListHead)) {\r
61 Link = GetFirstNode (OneOfOptionMapListHead);\r
62 \r
63 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
64\r
65 while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
66 Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
67 \r
68 MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
69\r
70 RemoveEntryList (Link2);\r
71\r
72 FreePool (MapEntry);\r
73 }\r
74\r
75 RemoveEntryList (Link);\r
76 FreePool (Map);\r
77 }\r
78}\r
79\r
59336178 80\r
81/**\r
82 Initialize Statement header members.\r
83\r
84 @param OpCodeData Pointer of the raw OpCode data.\r
85 @param FormSet Pointer of the current FormSe.\r
86 @param Form Pointer of the current Form.\r
87\r
88 @return The Statement.\r
89\r
90**/\r
91FORM_BROWSER_STATEMENT *\r
92CreateStatement (\r
93 IN UINT8 *OpCodeData,\r
94 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
95 IN OUT FORM_BROWSER_FORM *Form\r
96 )\r
97{\r
98 FORM_BROWSER_STATEMENT *Statement;\r
99 EFI_IFR_STATEMENT_HEADER *StatementHdr;\r
100\r
101 if (Form == NULL) {\r
102 //\r
103 // We are currently not in a Form Scope, so just skip this Statement\r
104 //\r
105 return NULL;\r
106 }\r
107\r
108 Statement = &FormSet->StatementBuffer[mStatementIndex];\r
109 mStatementIndex++;\r
110\r
111 InitializeListHead (&Statement->DefaultListHead);\r
112 InitializeListHead (&Statement->OptionListHead);\r
59336178 113\r
114 Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
115\r
116 Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
117\r
118 StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
119 CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
120 CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
121\r
59336178 122 Statement->InSubtitle = mInScopeSubtitle;\r
123\r
124 //\r
125 // Insert this Statement into current Form\r
126 //\r
127 InsertTailList (&Form->StatementListHead, &Statement->Link);\r
128\r
129 return Statement;\r
130}\r
131\r
59336178 132/**\r
133 Initialize Question's members.\r
134\r
135 @param OpCodeData Pointer of the raw OpCode data.\r
136 @param FormSet Pointer of the current FormSet.\r
137 @param Form Pointer of the current Form.\r
138\r
139 @return The Question.\r
140\r
141**/\r
142FORM_BROWSER_STATEMENT *\r
143CreateQuestion (\r
144 IN UINT8 *OpCodeData,\r
145 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
146 IN OUT FORM_BROWSER_FORM *Form\r
147 )\r
148{\r
149 FORM_BROWSER_STATEMENT *Statement;\r
150 EFI_IFR_QUESTION_HEADER *QuestionHdr;\r
151 LIST_ENTRY *Link;\r
152 FORMSET_STORAGE *Storage;\r
59336178 153\r
154 Statement = CreateStatement (OpCodeData, FormSet, Form);\r
155 if (Statement == NULL) {\r
156 return NULL;\r
157 }\r
158\r
159 QuestionHdr = (EFI_IFR_QUESTION_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
160 CopyMem (&Statement->QuestionId, &QuestionHdr->QuestionId, sizeof (EFI_QUESTION_ID));\r
161 CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
162 CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
163\r
a9d85320 164 if (FormSet->MaxQuestionId < QuestionHdr->QuestionId) {\r
165 FormSet->MaxQuestionId = QuestionHdr->QuestionId;\r
166 }\r
167\r
59336178 168 Statement->QuestionFlags = QuestionHdr->Flags;\r
169\r
170 if (Statement->VarStoreId == 0) {\r
171 //\r
172 // VarStoreId of zero indicates no variable storage\r
173 //\r
174 return Statement;\r
175 }\r
176\r
177 //\r
178 // Find Storage for this Question\r
179 //\r
180 Link = GetFirstNode (&FormSet->StorageListHead);\r
181 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
182 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
183\r
184 if (Storage->VarStoreId == Statement->VarStoreId) {\r
185 Statement->Storage = Storage;\r
186 break;\r
187 }\r
188\r
189 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
190 }\r
191 ASSERT (Statement->Storage != NULL);\r
192\r
59336178 193 return Statement;\r
194}\r
195\r
59336178 196/**\r
197 Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
198\r
199 @param FormSet Pointer of the current FormSet\r
200\r
201 @return Pointer to a FORMSET_STORAGE data structure.\r
202\r
203**/\r
204FORMSET_STORAGE *\r
205CreateStorage (\r
206 IN FORM_BROWSER_FORMSET *FormSet\r
207 )\r
208{\r
209 FORMSET_STORAGE *Storage;\r
210\r
211 Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
212 Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
59336178 213 InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
214\r
215 return Storage;\r
216}\r
217\r
59336178 218/**\r
219 Free resources of a storage\r
220\r
221 @param Storage Pointer of the storage\r
222\r
223 @return None.\r
224\r
225**/\r
226VOID\r
227DestroyStorage (\r
228 IN FORMSET_STORAGE *Storage\r
229 )\r
230{\r
59336178 231 if (Storage == NULL) {\r
232 return;\r
233 }\r
234\r
a9d85320 235 if (Storage->Name!= NULL) {\r
236 FreePool (Storage->Name);\r
59336178 237 }\r
238\r
7001eaf8 239 FreePool (Storage);\r
59336178 240}\r
241\r
242\r
243/**\r
244 Free resources of a Statement\r
245\r
246 @param Statement Pointer of the Statement\r
247\r
248 @return None.\r
249\r
250**/\r
251VOID\r
252DestroyStatement (\r
253 IN OUT FORM_BROWSER_STATEMENT *Statement\r
254 )\r
255{\r
256 LIST_ENTRY *Link;\r
257 QUESTION_DEFAULT *Default;\r
258 QUESTION_OPTION *Option;\r
59336178 259\r
260 //\r
261 // Free Default value List\r
262 //\r
263 while (!IsListEmpty (&Statement->DefaultListHead)) {\r
264 Link = GetFirstNode (&Statement->DefaultListHead);\r
265 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
266 RemoveEntryList (&Default->Link);\r
267\r
268 gBS->FreePool (Default);\r
269 }\r
270\r
271 //\r
272 // Free Options List\r
273 //\r
274 while (!IsListEmpty (&Statement->OptionListHead)) {\r
275 Link = GetFirstNode (&Statement->OptionListHead);\r
276 Option = QUESTION_OPTION_FROM_LINK (Link);\r
277 RemoveEntryList (&Option->Link);\r
278\r
279 gBS->FreePool (Option);\r
280 }\r
281\r
59336178 282}\r
283\r
284\r
7001eaf8 285\r
59336178 286/**\r
287 Free resources of a Form\r
288\r
289 @param Form Pointer of the Form\r
290\r
291 @return None.\r
292\r
293**/\r
294VOID\r
295DestroyForm (\r
296 IN OUT FORM_BROWSER_FORM *Form\r
297 )\r
298{\r
299 LIST_ENTRY *Link;\r
59336178 300 FORM_BROWSER_STATEMENT *Statement;\r
301\r
59336178 302 //\r
303 // Free Statements/Questions\r
304 //\r
305 while (!IsListEmpty (&Form->StatementListHead)) {\r
306 Link = GetFirstNode (&Form->StatementListHead);\r
307 Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
308 RemoveEntryList (&Statement->Link);\r
309\r
310 DestroyStatement (Statement);\r
311 }\r
312\r
313 //\r
314 // Free this Form\r
315 //\r
316 gBS->FreePool (Form);\r
317}\r
318\r
319\r
320/**\r
321 Free resources allocated for a FormSet\r
322\r
323 @param FormSet Pointer of the FormSet\r
324\r
325 @return None.\r
326\r
327**/\r
328VOID\r
329DestroyFormSet (\r
330 IN OUT FORM_BROWSER_FORMSET *FormSet\r
331 )\r
332{\r
333 LIST_ENTRY *Link;\r
334 FORMSET_STORAGE *Storage;\r
335 FORMSET_DEFAULTSTORE *DefaultStore;\r
336 FORM_BROWSER_FORM *Form;\r
337\r
338 //\r
339 // Free IFR binary buffer\r
340 //\r
7001eaf8 341 FreePool (FormSet->IfrBinaryData);\r
59336178 342\r
343 //\r
344 // Free FormSet Storage\r
345 //\r
346 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
347 while (!IsListEmpty (&FormSet->StorageListHead)) {\r
348 Link = GetFirstNode (&FormSet->StorageListHead);\r
349 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
350 RemoveEntryList (&Storage->Link);\r
351\r
352 DestroyStorage (Storage);\r
353 }\r
354 }\r
355\r
356 //\r
357 // Free FormSet Default Store\r
358 //\r
359 if (FormSet->DefaultStoreListHead.ForwardLink != NULL) {\r
360 while (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
361 Link = GetFirstNode (&FormSet->DefaultStoreListHead);\r
362 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
363 RemoveEntryList (&DefaultStore->Link);\r
364\r
365 gBS->FreePool (DefaultStore);\r
366 }\r
367 }\r
368\r
369 //\r
370 // Free Forms\r
371 //\r
372 if (FormSet->FormListHead.ForwardLink != NULL) {\r
373 while (!IsListEmpty (&FormSet->FormListHead)) {\r
374 Link = GetFirstNode (&FormSet->FormListHead);\r
375 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
376 RemoveEntryList (&Form->Link);\r
377\r
378 DestroyForm (Form);\r
379 }\r
380 }\r
381\r
7001eaf8 382 if (FormSet->StatementBuffer != NULL) {\r
383 FreePool (FormSet->StatementBuffer);\r
384 }\r
59336178 385\r
a9d85320 386 DestoryOneOfOptionMap (&FormSet->OneOfOptionMapListHead);\r
dee207ee 387\r
388 if (FormSet->OriginalDefaultVarStoreName != NULL) {\r
389 FreePool (FormSet->OriginalDefaultVarStoreName);\r
390 }\r
a9d85320 391 \r
7001eaf8 392 FreePool (FormSet);\r
59336178 393}\r
394\r
395\r
396/**\r
397 Tell whether this Operand is an Expression OpCode or not\r
398\r
399 @param Operand Operand of an IFR OpCode.\r
400\r
401 @retval TRUE This is an Expression OpCode.\r
402 @retval FALSE Not an Expression OpCode.\r
403\r
404**/\r
405BOOLEAN\r
406IsExpressionOpCode (\r
407 IN UINT8 Operand\r
408 )\r
409{\r
410 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
411 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
412 (Operand == EFI_IFR_CATENATE_OP)\r
413 ) {\r
414 return TRUE;\r
415 } else {\r
416 return FALSE;\r
417 }\r
418}\r
419\r
420\r
421/**\r
422 Calculate number of Statemens(Questions) and Expression OpCodes.\r
423\r
424 @param FormSet The FormSet to be counted.\r
425 @param NumberOfStatement Number of Statemens(Questions)\r
426 @param NumberOfExpression Number of Expression OpCodes\r
427\r
428 @return None.\r
429\r
430**/\r
431VOID\r
432CountOpCodes (\r
433 IN FORM_BROWSER_FORMSET *FormSet,\r
434 IN OUT UINT16 *NumberOfStatement,\r
435 IN OUT UINT16 *NumberOfExpression\r
436 )\r
437{\r
438 UINT16 StatementCount;\r
439 UINT16 ExpressionCount;\r
440 UINT8 *OpCodeData;\r
441 UINTN Offset;\r
442 UINTN OpCodeLen;\r
443\r
444 Offset = 0;\r
445 StatementCount = 0;\r
446 ExpressionCount = 0;\r
447\r
448 while (Offset < FormSet->IfrBinaryLength) {\r
449 OpCodeData = FormSet->IfrBinaryData + Offset;\r
450 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
451 Offset += OpCodeLen;\r
452\r
453 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
454 ExpressionCount++;\r
455 } else {\r
456 StatementCount++;\r
457 }\r
458 }\r
459\r
460 *NumberOfStatement = StatementCount;\r
461 *NumberOfExpression = ExpressionCount;\r
462}\r
463\r
464\r
465/**\r
466 Parse opcodes in the formset IFR binary.\r
467\r
468 @param FormSet Pointer of the FormSet data structure.\r
469\r
470 @retval EFI_SUCCESS Opcode parse success.\r
471 @retval Other Opcode parse fail.\r
472\r
473**/\r
474EFI_STATUS\r
475ParseOpCodes (\r
476 IN FORM_BROWSER_FORMSET *FormSet\r
477 )\r
478{\r
479 EFI_STATUS Status;\r
480 UINT16 Index;\r
481 FORM_BROWSER_FORM *CurrentForm;\r
482 FORM_BROWSER_STATEMENT *CurrentStatement;\r
59336178 483 UINT8 Operand;\r
484 UINT8 Scope;\r
485 UINTN OpCodeOffset;\r
486 UINTN OpCodeLength;\r
487 UINT8 *OpCodeData;\r
488 UINT8 ScopeOpCode;\r
489 FORMSET_STORAGE *Storage;\r
490 FORMSET_DEFAULTSTORE *DefaultStore;\r
491 QUESTION_DEFAULT *CurrentDefault;\r
492 QUESTION_OPTION *CurrentOption;\r
493 CHAR8 *AsciiString;\r
494 UINT16 NumberOfStatement;\r
495 UINT16 NumberOfExpression;\r
496 EFI_IMAGE_ID *ImageId;\r
59336178 497 EFI_HII_VALUE *Value;\r
a9d85320 498 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
499 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
500 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
501 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
502 UINT8 OneOfType;\r
503 EFI_IFR_ONE_OF *OneOfOpcode;\r
6d207823 504 HII_THUNK_CONTEXT *ThunkContext;\r
59336178 505\r
6d207823
LG
506 mInScopeSubtitle = FALSE;\r
507 mInScopeSuppress = FALSE;\r
508 mInScopeGrayOut = FALSE;\r
509 CurrentDefault = NULL;\r
510 CurrentOption = NULL;\r
511 ThunkContext = UefiHiiHandleToThunkContext ((CONST HII_THUNK_PRIVATE_DATA*) mHiiThunkPrivateData, FormSet->HiiHandle);\r
a9d85320 512\r
513 //\r
514 // Set to a invalid value.\r
515 //\r
516 OneOfType = (UINT8) -1;\r
59336178 517\r
518 //\r
519 // Get the number of Statements and Expressions\r
520 //\r
521 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
a9d85320 522 FormSet->NumberOfStatement = NumberOfStatement;\r
59336178 523\r
524 mStatementIndex = 0;\r
525 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
526 if (FormSet->StatementBuffer == NULL) {\r
527 return EFI_OUT_OF_RESOURCES;\r
528 }\r
529\r
59336178 530 InitializeListHead (&FormSet->StorageListHead);\r
531 InitializeListHead (&FormSet->DefaultStoreListHead);\r
532 InitializeListHead (&FormSet->FormListHead);\r
a9d85320 533 InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
59336178 534\r
535 CurrentForm = NULL;\r
536 CurrentStatement = NULL;\r
537\r
538 ResetScopeStack ();\r
539\r
540 OpCodeOffset = 0;\r
541 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
542 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
543\r
544 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
545 OpCodeOffset += OpCodeLength;\r
546 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
547 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
548\r
549 //\r
550 // If scope bit set, push onto scope stack\r
551 //\r
552 if (Scope) {\r
553 PushScope (Operand);\r
554 }\r
555\r
59336178 556 if (IsExpressionOpCode (Operand)) {\r
59336178 557 continue;\r
558 }\r
559\r
560 //\r
561 // Parse the Opcode\r
562 //\r
563 switch (Operand) {\r
564\r
565 case EFI_IFR_FORM_SET_OP:\r
566 //\r
567 // check the formset GUID\r
568 //\r
5a58200d 569 if (!CompareGuid ((EFI_GUID *)(VOID *)&FormSet->Guid, (EFI_GUID *)(VOID *)&((EFI_IFR_FORM_SET *) OpCodeData)->Guid)) {\r
59336178 570 return EFI_INVALID_PARAMETER;\r
571 }\r
572\r
573 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
574 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
575 break;\r
576\r
577 case EFI_IFR_FORM_OP:\r
578 //\r
579 // Create a new Form for this FormSet\r
580 //\r
581 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
582 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
a9d85320 583\r
59336178 584 InitializeListHead (&CurrentForm->StatementListHead);\r
585\r
586 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
587 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
588\r
589 //\r
590 // Insert into Form list of this FormSet\r
591 //\r
592 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
593 break;\r
594\r
595 //\r
596 // Storage\r
597 //\r
598 case EFI_IFR_VARSTORE_OP:\r
599 //\r
600 // Create a buffer Storage for this FormSet\r
601 //\r
602 Storage = CreateStorage (FormSet);\r
603 Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
604\r
605 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
606 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
607 CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
608\r
59336178 609 AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
610 Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
611 ASSERT (Storage->Name != NULL);\r
612 for (Index = 0; AsciiString[Index] != 0; Index++) {\r
613 Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
614 }\r
615\r
59336178 616 break;\r
617\r
618 case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
6d207823
LG
619 //\r
620 // Framework IFR doesn't support Name/Value VarStore opcode\r
621 //\r
622 if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
623 ASSERT (FALSE);\r
624 }\r
59336178 625 break;\r
626\r
627 case EFI_IFR_VARSTORE_EFI_OP:\r
628 //\r
629 // Create a EFI variable Storage for this FormSet\r
630 //\r
631 Storage = CreateStorage (FormSet);\r
632 Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
633\r
634 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
635 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
636 CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
637 break;\r
638\r
639 //\r
640 // DefaultStore\r
641 //\r
642 case EFI_IFR_DEFAULTSTORE_OP:\r
643 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
644 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
645\r
646 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
647 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
648\r
649 //\r
650 // Insert to DefaultStore list of this Formset\r
651 //\r
652 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
653 break;\r
654\r
655 //\r
656 // Statements\r
657 //\r
658 case EFI_IFR_SUBTITLE_OP:\r
659 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
660 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
661\r
662 if (Scope) {\r
663 mInScopeSubtitle = TRUE;\r
664 }\r
665 break;\r
666\r
667 case EFI_IFR_TEXT_OP:\r
668 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
669\r
670 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
671 break;\r
672\r
673 //\r
674 // Questions\r
675 //\r
676 case EFI_IFR_ACTION_OP:\r
677 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
678\r
679 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
680 //\r
681 // No QuestionConfig present, so no configuration string will be processed\r
682 //\r
683 CurrentStatement->QuestionConfig = 0;\r
684 } else {\r
685 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
686 }\r
687 break;\r
688\r
689 case EFI_IFR_RESET_BUTTON_OP:\r
3032f549 690 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
59336178 691 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
692 break;\r
693\r
694 case EFI_IFR_REF_OP:\r
695 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
696\r
697 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
698 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
699 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
700\r
701 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
702 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
703\r
704 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
705 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
706 }\r
707 }\r
708 }\r
709 break;\r
710\r
711 case EFI_IFR_ONE_OF_OP:\r
712 case EFI_IFR_NUMERIC_OP:\r
713 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
714\r
715 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
716 Value = &CurrentStatement->HiiValue;\r
717\r
718 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
719 case EFI_IFR_NUMERIC_SIZE_1:\r
720 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
721 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
722 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
723 CurrentStatement->StorageWidth = sizeof (UINT8);\r
724 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
725 break;\r
726\r
727 case EFI_IFR_NUMERIC_SIZE_2:\r
728 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
729 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
730 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
731 CurrentStatement->StorageWidth = sizeof (UINT16);\r
732 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
733 break;\r
734\r
735 case EFI_IFR_NUMERIC_SIZE_4:\r
736 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
737 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
738 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
739 CurrentStatement->StorageWidth = sizeof (UINT32);\r
740 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
741 break;\r
742\r
743 case EFI_IFR_NUMERIC_SIZE_8:\r
744 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
745 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
746 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
747 CurrentStatement->StorageWidth = sizeof (UINT64);\r
748 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
749 break;\r
750\r
751 default:\r
752 break;\r
753 }\r
754\r
a9d85320 755 if (Operand == EFI_IFR_ONE_OF_OP) {\r
756 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
98b16b9d 757 OneOfType = (UINT8) (OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE);\r
a9d85320 758 }\r
59336178 759 break;\r
760\r
761 case EFI_IFR_ORDERED_LIST_OP:\r
762 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
763\r
764 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
765 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
766 CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
59336178 767\r
768 //\r
769 // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
770 // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
771 // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
772 //\r
773 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
774 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
775\r
59336178 776 break;\r
777\r
778 case EFI_IFR_CHECKBOX_OP:\r
779 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
780\r
781 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
782 CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
783 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
784\r
59336178 785 break;\r
786\r
787 case EFI_IFR_STRING_OP:\r
788 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
789\r
790 //\r
791 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
792 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
793 // The characters are stored as Unicode, so the storage width should multiply 2.\r
794 //\r
795 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
796 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
797 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
798 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
799\r
800 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
801 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
802\r
59336178 803 break;\r
804\r
805 case EFI_IFR_PASSWORD_OP:\r
806 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
807\r
808 //\r
809 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
810 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
811 // The characters are stored as Unicode, so the storage width should multiply 2.\r
812 //\r
813 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
814 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
815 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
816\r
817 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
818 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
819\r
59336178 820 break;\r
821\r
822 case EFI_IFR_DATE_OP:\r
823 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
824\r
825 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
826 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
827\r
59336178 828 break;\r
829\r
830 case EFI_IFR_TIME_OP:\r
831 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
832\r
833 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
834 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
835\r
59336178 836 break;\r
837\r
838 //\r
839 // Default\r
840 //\r
841 case EFI_IFR_DEFAULT_OP:\r
842 //\r
843 // EFI_IFR_DEFAULT appear in scope of a Question,\r
844 // It creates a default value for the current question.\r
845 // A Question may have more than one Default value which have different default types.\r
846 //\r
847 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
848 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
849\r
850 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
851 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
852 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
853 ExtendValueToU64 (&CurrentDefault->Value);\r
854\r
855 //\r
856 // Insert to Default Value list of current Question\r
857 //\r
858 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
859\r
59336178 860 break;\r
861\r
862 //\r
863 // Option\r
864 //\r
865 case EFI_IFR_ONE_OF_OPTION_OP:\r
866 //\r
867 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
868 // It create a selection for use in current Question.\r
869 //\r
870 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
871 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
872\r
873 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
874 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
875 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
876 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
877 ExtendValueToU64 (&CurrentOption->Value);\r
878\r
59336178 879 //\r
880 // Insert to Option list of current Question\r
881 //\r
882 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
883 break;\r
884\r
885 //\r
886 // Conditional\r
887 //\r
888 case EFI_IFR_NO_SUBMIT_IF_OP:\r
889 case EFI_IFR_INCONSISTENT_IF_OP:\r
59336178 890 break;\r
891\r
892 case EFI_IFR_SUPPRESS_IF_OP:\r
59336178 893 break;\r
894\r
895 case EFI_IFR_GRAY_OUT_IF_OP:\r
59336178 896 break;\r
897\r
898 case EFI_IFR_DISABLE_IF_OP:\r
6d207823
LG
899 //\r
900 // Framework IFR doesn't support DisableIf opcode\r
901 //\r
902 if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
903 ASSERT (FALSE);\r
904 }\r
59336178 905\r
906 //\r
907 // Expression\r
908 //\r
909 case EFI_IFR_VALUE_OP:\r
59336178 910 break;\r
911\r
912 case EFI_IFR_RULE_OP:\r
59336178 913 break;\r
914\r
915 //\r
916 // Image\r
917 //\r
918 case EFI_IFR_IMAGE_OP:\r
919 //\r
920 // Get ScopeOpcode from top of stack\r
921 //\r
922 PopScope (&ScopeOpCode);\r
923 PushScope (ScopeOpCode);\r
924\r
925 switch (ScopeOpCode) {\r
926 case EFI_IFR_FORM_SET_OP:\r
927 ImageId = &FormSet->ImageId;\r
928 break;\r
929\r
930 case EFI_IFR_FORM_OP:\r
931 ImageId = &CurrentForm->ImageId;\r
932 break;\r
933\r
934 case EFI_IFR_ONE_OF_OPTION_OP:\r
935 ImageId = &CurrentOption->ImageId;\r
936 break;\r
937\r
938 default:\r
939 ImageId = &CurrentStatement->ImageId;\r
940 break;\r
941 }\r
942\r
943 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
944 break;\r
945\r
946 //\r
947 // Refresh\r
948 //\r
949 case EFI_IFR_REFRESH_OP:\r
950 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
951 break;\r
952\r
953 //\r
954 // Vendor specific\r
955 //\r
956 case EFI_IFR_GUID_OP:\r
a9d85320 957 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
958 \r
959 if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
59336178 960 //\r
961 // Tiano specific GUIDed opcodes\r
962 //\r
963 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
964 case EFI_IFR_EXTEND_OP_LABEL:\r
965 //\r
966 // just ignore label\r
967 //\r
968 break;\r
969\r
59336178 970\r
971 case EFI_IFR_EXTEND_OP_CLASS:\r
972 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
973 break;\r
974\r
975 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
976 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
977 break;\r
978\r
979 default:\r
980 break;\r
981 }\r
3032f549 982 } else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
a9d85320 983 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
984 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
985 if (OneOfOptinMapEntryListHead == NULL) {\r
986 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
987 ASSERT (OneOfOptionMap != NULL);\r
988\r
989 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
990 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
991\r
992 //\r
993 // Make sure OneOfType is initialized.\r
994 //\r
995 ASSERT (OneOfType != (UINT8) -1);\r
996 OneOfOptionMap->ValueType = OneOfType;\r
997 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
998 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
999 InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
1000 }\r
1001 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
1002 ASSERT (OneOfOptionMapEntry != NULL);\r
1003\r
1004 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
1005 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
1006 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
1007 \r
1008 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
1009 }\r
1010 }\r
59336178 1011 break;\r
1012\r
1013 //\r
1014 // Scope End\r
1015 //\r
1016 case EFI_IFR_END_OP:\r
1017 Status = PopScope (&ScopeOpCode);\r
1018 if (EFI_ERROR (Status)) {\r
1019 ResetScopeStack ();\r
1020 return Status;\r
1021 }\r
1022\r
1023 switch (ScopeOpCode) {\r
1024 case EFI_IFR_FORM_SET_OP:\r
1025 //\r
1026 // End of FormSet, update FormSet IFR binary length\r
1027 // to stop parsing substantial OpCodes\r
1028 //\r
1029 FormSet->IfrBinaryLength = OpCodeOffset;\r
1030 break;\r
1031\r
1032 case EFI_IFR_FORM_OP:\r
1033 //\r
1034 // End of Form\r
1035 //\r
1036 CurrentForm = NULL;\r
1037 break;\r
1038\r
1039 case EFI_IFR_ONE_OF_OPTION_OP:\r
1040 //\r
1041 // End of Option\r
1042 //\r
1043 CurrentOption = NULL;\r
1044 break;\r
1045\r
1046 case EFI_IFR_SUBTITLE_OP:\r
1047 mInScopeSubtitle = FALSE;\r
1048 break;\r
1049\r
1050 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1051 case EFI_IFR_INCONSISTENT_IF_OP:\r
1052 //\r
1053 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
1054 //\r
1055 break;\r
1056\r
59336178 1057 case EFI_IFR_GRAY_OUT_IF_OP:\r
1058 mInScopeGrayOut = FALSE;\r
1059 break;\r
1060\r
59336178 1061 default:\r
1062 if (IsExpressionOpCode (ScopeOpCode)) {\r
59336178 1063 }\r
1064 break;\r
1065 }\r
1066 break;\r
1067\r
1068 default:\r
1069 break;\r
1070 }\r
1071 }\r
1072\r
1073 return EFI_SUCCESS;\r
1074}\r
1075\r
1076\r
1077\r
1078\r