]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
Bug fixes for FrameworkHiiToUefiHiiThunk;
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / OpcodeCreation.c
CommitLineData
5391c4f1 1/** @file\r
2Implement Functions to convert IFR Opcode in format defined in Framework HII specification to\r
3format defined in UEFI HII Specification.\r
4\r
5Copyright (c) 2007, Intel Corporation\r
6All rights reserved. This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15#include "HiiDatabase.h"\r
16#include "OpcodeCreation.h"\r
17#include "UefiIfrDefault.h"\r
18\r
19EFI_GUID mTianoExtendedOpcodeGuid = EFI_IFR_TIANO_GUID;\r
20\r
21#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000\r
22EFI_STATUS\r
23AppendToUpdateBuffer (\r
24 IN CONST UINT8 *OpCodeBuf,\r
25 IN UINTN BufSize,\r
26 OUT EFI_HII_UPDATE_DATA *UefiData\r
27 )\r
28{\r
29 UINT8 * NewBuff;\r
30 \r
31 if (UefiData->Offset + BufSize > UefiData->BufferSize) {\r
32 NewBuff = AllocateCopyPool (UefiData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiData->Data);\r
33 if (NewBuff == NULL) {\r
34 return EFI_OUT_OF_RESOURCES;\r
35 }\r
36 UefiData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
37 FreePool (UefiData->Data);\r
38 UefiData->Data = NewBuff;\r
39 }\r
40 \r
41 CopyMem (UefiData->Data + UefiData->Offset, OpCodeBuf, BufSize);\r
42 UefiData->Offset += (UINT32) BufSize;\r
43\r
44 return EFI_SUCCESS;\r
45}\r
46\r
0368663f 47\r
48\r
49EFI_STATUS\r
50FwQuestionIdToUefiQuestionId (\r
51 IN HII_THUNK_CONTEXT *ThunkContext,\r
52 IN UINT16 VarStoreId,\r
53 IN UINT16 FwId,\r
54 OUT EFI_QUESTION_ID *UefiQId\r
55 )\r
56{\r
57 LIST_ENTRY *MapEntryListHead;\r
58 LIST_ENTRY *Link;\r
59 QUESTION_ID_MAP_ENTRY *MapEntry;\r
60\r
61 MapEntryListHead = GetMapEntryListHead (ThunkContext, VarStoreId);\r
62 ASSERT (MapEntryListHead != NULL);\r
63\r
64 Link = GetFirstNode (MapEntryListHead);\r
65\r
66 while (!IsNull (MapEntryListHead, Link)) {\r
67 MapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
68\r
69 if (MapEntry->FwQId == FwId) {\r
70 *UefiQId = MapEntry->UefiQid;\r
71 return EFI_SUCCESS;\r
72 }\r
73\r
74 Link = GetNextNode (MapEntryListHead, Link);\r
75 }\r
76\r
77 return EFI_NOT_FOUND;\r
78}\r
79\r
80\r
81\r
5391c4f1 82EFI_STATUS\r
83UCreateEndOfOpcode (\r
84 OUT EFI_HII_UPDATE_DATA *UefiData\r
85 )\r
86{\r
87 EFI_IFR_END UOpcode;\r
88\r
89 ZeroMem (&UOpcode, sizeof (UOpcode));\r
90\r
91 UOpcode.Header.OpCode = EFI_IFR_END_OP;\r
92 UOpcode.Header.Length = sizeof (UOpcode);\r
93\r
94 return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiData);\r
95}\r
96\r
97EFI_STATUS\r
98F2UCreateSubtitleOpCode (\r
99 IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwSubTitle,\r
100 OUT EFI_HII_UPDATE_DATA *UefiData\r
101 )\r
102{\r
103 EFI_IFR_SUBTITLE UOpcode;\r
104\r
105 ZeroMem (&UOpcode, sizeof(UOpcode));\r
106\r
107 UOpcode.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
108 UOpcode.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
109\r
110 UOpcode.Statement.Prompt = FwSubTitle->SubTitle;\r
111\r
112 return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiData);\r
113}\r
114\r
115EFI_STATUS\r
116F2UCreateTextOpCode (\r
117 IN CONST FRAMEWORK_EFI_IFR_TEXT *FwText,\r
118 OUT EFI_HII_UPDATE_DATA *UefiData\r
119 )\r
120{\r
0368663f 121 EFI_IFR_TEXT UTextOpCode;\r
122 EFI_IFR_ACTION UActionOpCode;\r
5391c4f1 123\r
0368663f 124 if ((FwText->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
125 ZeroMem (&UTextOpCode, sizeof(UTextOpCode));\r
126 \r
127 UTextOpCode.Header.OpCode = EFI_IFR_TEXT_OP;\r
128 UTextOpCode.Header.Length = sizeof (EFI_IFR_TEXT);\r
5391c4f1 129\r
0368663f 130 UTextOpCode.Statement.Help = FwText->Help;\r
5391c4f1 131\r
0368663f 132 UTextOpCode.Statement.Prompt = FwText->Text;\r
133 UTextOpCode.TextTwo = FwText->TextTwo;\r
134 \r
135 return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiData);\r
136 } else {\r
137 //\r
138 // Iteractive Text Opcode is EFI_IFR_ACTION\r
139 //\r
140\r
141 ZeroMem (&UActionOpCode, sizeof (UActionOpCode));\r
142\r
143 UActionOpCode.Header.OpCode = EFI_IFR_ACTION_OP;\r
144 UActionOpCode.Header.Length = sizeof (EFI_IFR_ACTION);\r
145\r
146 UActionOpCode.Question.Header.Prompt = FwText->Text;\r
147 UActionOpCode.Question.Header.Help = FwText->Help;\r
148 UActionOpCode.Question.Flags = EFI_IFR_FLAG_CALLBACK;\r
149 UActionOpCode.Question.QuestionId = FwText->Key;\r
150\r
151 return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiData);\r
152 \r
153 }\r
5391c4f1 154}\r
155\r
156/*\r
157typedef struct {\r
158 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
159 UINT16 FormId;\r
160 STRING_REF Prompt;\r
161 STRING_REF Help; // The string Token for the context-help\r
162 UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
163 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
164} FRAMEWORK_EFI_IFR_REF;\r
165\r
166*/\r
167EFI_STATUS\r
168F2UCreateGotoOpCode (\r
169 IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode,\r
170 OUT EFI_HII_UPDATE_DATA *UefiData\r
171 )\r
172{\r
173 EFI_IFR_REF UOpcode;\r
174\r
175 ZeroMem (&UOpcode, sizeof(UOpcode));\r
176\r
177 UOpcode.Header.Length = sizeof(UOpcode);\r
178 UOpcode.Header.OpCode = EFI_IFR_REF_OP;\r
179\r
180 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
181 UOpcode.Question.Header.Help = FwOpcode->Help;\r
182 UOpcode.Question.QuestionId = FwOpcode->Key;\r
183\r
184 UOpcode.FormId = FwOpcode->FormId;\r
185\r
186 //\r
187 // We only map FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE and FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED to \r
188 // UEFI IFR Opcode flags. The rest flags are obsolete.\r
189 //\r
190 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
191 \r
192\r
193 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
194}\r
195\r
196\r
197/*\r
198typedef struct {\r
199 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
200 STRING_REF Option; // The string token describing the option\r
201 UINT16 Value; // The value associated with this option that is stored in the NVRAM if chosen\r
202 UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely above\r
203 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
204} FRAMEWORK_EFI_IFR_ONE_OF_OPTION;\r
205\r
206typedef union {\r
207 UINT8 u8;\r
208 UINT16 u16;\r
209 UINT32 u32;\r
210 UINT64 u64;\r
211 BOOLEAN b;\r
212 EFI_HII_TIME time;\r
213 EFI_HII_DATE date;\r
214 EFI_STRING_ID string;\r
215} EFI_IFR_TYPE_VALUE;\r
216\r
217typedef struct _EFI_IFR_ONE_OF_OPTION {\r
218 EFI_IFR_OP_HEADER Header;\r
219 EFI_STRING_ID Option;\r
220 UINT8 Flags;\r
221 UINT8 Type;\r
222 EFI_IFR_TYPE_VALUE Value;\r
223} EFI_IFR_ONE_OF_OPTION;\r
224\r
225*/\r
226EFI_STATUS\r
227F2UCreateOneOfOptionOpCode (\r
228 IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOpcode,\r
229 IN UINTN Width,\r
230 OUT EFI_HII_UPDATE_DATA *UefiData\r
231 )\r
232{\r
233 EFI_IFR_ONE_OF_OPTION UOpcode;\r
234\r
235 ZeroMem (&UOpcode, sizeof(UOpcode));\r
236\r
237 UOpcode.Header.Length = sizeof(UOpcode);\r
238 UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;\r
239\r
240 UOpcode.Option = FwOpcode->Option;\r
241 CopyMem (&UOpcode.Value.u8, &FwOpcode->Value, Width);\r
242\r
243 //\r
244 \r
245 // #define FRAMEWORK_EFI_IFR_FLAG_DEFAULT 0x01\r
246 // #define FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING 0x02\r
247 // #define EFI_IFR_OPTION_DEFAULT 0x10\r
248 // #define EFI_IFR_OPTION_DEFAULT_MFG 0x20\r
249 //\r
250 UOpcode.Flags |= (UINT8) ((FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING)) << 4);\r
251\r
252 switch (Width) {\r
253 case 1:\r
254 UOpcode.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
255 break;\r
256 \r
257 case 2:\r
258 UOpcode.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
259 break;\r
260 \r
261 default:\r
262 ASSERT (FALSE);\r
263 return EFI_UNSUPPORTED;\r
264 }\r
265\r
266 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
267}\r
268\r
269\r
270/*\r
271typedef struct _EFI_IFR_QUESTION_HEADER {\r
272 EFI_IFR_STATEMENT_HEADER Header;\r
273 EFI_QUESTION_ID QuestionId;\r
274 EFI_VARSTORE_ID VarStoreId;\r
275 union {\r
276 EFI_STRING_ID VarName;\r
277 UINT16 VarOffset;\r
278 } VarStoreInfo;\r
279 UINT8 Flags;\r
280} EFI_IFR_QUESTION_HEADER;\r
281\r
282typedef union {\r
283 struct {\r
284 UINT8 MinValue;\r
285 UINT8 MaxValue;\r
286 UINT8 Step;\r
287 } u8;\r
288 struct {\r
289 UINT16 MinValue;\r
290 UINT16 MaxValue;\r
291 UINT16 Step;\r
292 } u16;\r
293 struct {\r
294 UINT32 MinValue;\r
295 UINT32 MaxValue;\r
296 UINT32 Step;\r
297 } u32;\r
298 struct {\r
299 UINT64 MinValue;\r
300 UINT64 MaxValue;\r
301 UINT64 Step;\r
302 } u64;\r
303} MINMAXSTEP_DATA;\r
304\r
305typedef struct _EFI_IFR_ONE_OF {\r
306 EFI_IFR_OP_HEADER Header;\r
307 EFI_IFR_QUESTION_HEADER Question;\r
308 UINT8 Flags;\r
309 MINMAXSTEP_DATA data;\r
310} EFI_IFR_ONE_OF;\r
311\r
312typedef struct {\r
313 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
314 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
315 UINT8 Width; // The Size of the Data being saved\r
316 STRING_REF Prompt; // The String Token for the Prompt\r
317 STRING_REF Help; // The string Token for the context-help\r
318} FRAMEWORK_EFI_IFR_ONE_OF;\r
319\r
320\r
321*/\r
322\r
323EFI_STATUS\r
324F2UCreateOneOfOpCode (\r
0368663f 325 IN HII_THUNK_CONTEXT *ThunkContext,\r
326 IN UINT16 VarStoreId,\r
5391c4f1 327 IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode,\r
328 OUT EFI_HII_UPDATE_DATA *UefiData,\r
c64feb92 329 OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
330 OUT UINTN *DataCount\r
5391c4f1 331 )\r
332{\r
0368663f 333 EFI_STATUS Status;\r
334 EFI_IFR_ONE_OF UOpcode;\r
335 FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
336 FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
337 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
338 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
5391c4f1 339\r
c64feb92 340 ASSERT (NextFwOpcode != NULL);\r
341 ASSERT (DataCount != NULL);\r
342\r
0368663f 343 OneOfOptionMap = NULL;\r
344\r
5391c4f1 345 ZeroMem (&UOpcode, sizeof(UOpcode));\r
c64feb92 346 *DataCount = 0;\r
5391c4f1 347\r
348 UOpcode.Header.Length = sizeof(UOpcode);\r
349 UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
350 UOpcode.Header.Scope = 1;\r
351\r
352 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
353 UOpcode.Question.Header.Help = FwOpcode->Help;\r
354 \r
5391c4f1 355 //\r
356 // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
357 //\r
5391c4f1 358 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
359 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
360 ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
361 \r
362 FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
0368663f 363 if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
364 UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
365 \r
366 if (UOpcode.Question.QuestionId == 0) {\r
367 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
368 if (EFI_ERROR (Status)) {\r
369 UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
370 }\r
371\r
372 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
373 ASSERT (OneOfOptionMap != NULL);\r
374 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
375 OneOfOptionMap->QuestionId = UOpcode.Question.QuestionId;\r
376 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
377 switch (FwOpcode->Width) {\r
378 case 1:\r
379 OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
380 break;\r
381 case 2:\r
382 OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
383 default:\r
384 ASSERT (FALSE);\r
385 break;\r
386 }\r
387\r
388 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
389 } else { \r
390 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
391 ASSERT (OneOfOptionMapEntry != NULL);\r
392\r
393 OneOfOptionMapEntry->FwKey = FwOneOfOp->Key;\r
394 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
395 \r
396 CopyMem (&OneOfOptionMapEntry->Value, &FwOneOfOp->Value, FwOpcode->Width);\r
397\r
398 ASSERT (OneOfOptionMap != NULL);\r
399 InsertTailList (&OneOfOptionMap->OneOfOptionMapEntryListHead, &OneOfOptionMapEntry->Link);\r
400 }\r
401 }\r
402\r
403 if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
404 UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
5391c4f1 405 }\r
406\r
407 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
408 }\r
409\r
0368663f 410\r
411 if (UOpcode.Question.QuestionId == 0) {\r
412 //\r
413 // Assign QuestionId if still not assigned.\r
414 //\r
415 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
416 if (EFI_ERROR (Status)) {\r
417 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
418 }\r
419 }\r
420 \r
421 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiData);\r
422 if (EFI_ERROR (Status)) {\r
423 return Status;\r
424 }\r
425 *DataCount += 1;\r
426\r
5391c4f1 427 //\r
428 // Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.\r
429 //\r
430 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
431 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
432 Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiData);\r
433 if (EFI_ERROR (Status)) {\r
434 return Status;\r
435 }\r
c64feb92 436 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
437 *DataCount += 1;\r
5391c4f1 438 }\r
439\r
440 Status = UCreateEndOfOpcode (UefiData);\r
441 if (!EFI_ERROR (Status)) {\r
442 *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
c64feb92 443 *DataCount += 1;\r
5391c4f1 444 }\r
445\r
446 return Status;\r
447}\r
448\r
449/*\r
450typedef struct _EFI_IFR_QUESTION_HEADER {\r
451 EFI_IFR_STATEMENT_HEADER Header;\r
452 EFI_QUESTION_ID QuestionId;\r
453 EFI_VARSTORE_ID VarStoreId;\r
454 union {\r
455 EFI_STRING_ID VarName;\r
456 UINT16 VarOffset;\r
457 } VarStoreInfo;\r
458 UINT8 Flags;\r
459} EFI_IFR_QUESTION_HEADER;\r
460\r
461typedef struct _EFI_IFR_ORDERED_LIST {\r
462 EFI_IFR_OP_HEADER Header;\r
463 EFI_IFR_QUESTION_HEADER Question;\r
464 UINT8 MaxContainers;\r
465 UINT8 Flags;\r
466} EFI_IFR_ORDERED_LIST;\r
467\r
468typedef struct {\r
469 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
470 UINT16 QuestionId; // The offset in NV for storage of the data\r
471 UINT8 MaxEntries; // The maximum number of options in the ordered list (=size of NVStore)\r
472 STRING_REF Prompt; // The string token for the prompt\r
473 STRING_REF Help; // The string token for the context-help\r
474} FRAMEWORK_EFI_IFR_ORDERED_LIST;\r
475\r
476*/\r
477EFI_STATUS\r
478F2UCreateOrderedListOpCode (\r
0368663f 479 IN HII_THUNK_CONTEXT *ThunkContext,\r
480 IN UINT16 VarStoreId,\r
5391c4f1 481 IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
482 OUT EFI_HII_UPDATE_DATA *UefiData,\r
c64feb92 483 OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
484 OUT UINTN *DataCount\r
5391c4f1 485 )\r
486{\r
487 EFI_IFR_ORDERED_LIST UOpcode;\r
488 EFI_STATUS Status;\r
489 FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
0368663f 490 FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
5391c4f1 491\r
492 ZeroMem (&UOpcode, sizeof(UOpcode));\r
c64feb92 493 *DataCount = 0;\r
5391c4f1 494\r
495 UOpcode.Header.Length = sizeof(UOpcode);\r
496 UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
497 UOpcode.Header.Scope = 1;\r
498\r
499 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
500 UOpcode.Question.Header.Help = FwOpcode->Help;\r
0368663f 501 UOpcode.Question.VarStoreId = VarStoreId;\r
5391c4f1 502\r
503 UOpcode.MaxContainers = FwOpcode->MaxEntries;\r
0368663f 504\r
505 //\r
506 // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
507 //\r
508 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
509 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
510 ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
511 \r
512 FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
513 if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
514 UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
515 \r
516 if (UOpcode.Question.QuestionId == 0) {\r
517 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
518 if (EFI_ERROR (Status)) {\r
519 UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
520 }\r
521\r
522 }\r
523 }\r
524\r
525 if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
526 UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
527 }\r
528\r
529 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
530 }\r
531\r
532 if (UOpcode.Question.QuestionId == 0) {\r
533 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
534 if (EFI_ERROR (Status)) {\r
535 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
536 }\r
537 }\r
5391c4f1 538 \r
539 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
540 if (EFI_ERROR (Status)) {\r
541 return Status;\r
542 }\r
c64feb92 543 *DataCount += 1;\r
5391c4f1 544\r
545 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
546 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
0368663f 547 //\r
548 // Each entry of Order List in Framework HII is always 1 byte in size\r
549 //\r
550 Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiData);\r
5391c4f1 551 if (EFI_ERROR (Status)) {\r
552 return Status;\r
553 }\r
c64feb92 554 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
555 *DataCount += 1;\r
5391c4f1 556 }\r
557\r
558 Status = UCreateEndOfOpcode (UefiData);\r
559 if (!EFI_ERROR (Status)) {\r
560 *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
c64feb92 561 *DataCount += 1;\r
5391c4f1 562 }\r
563\r
c64feb92 564 return Status;\r
5391c4f1 565}\r
566\r
567/*\r
568typedef struct _EFI_IFR_QUESTION_HEADER {\r
569 EFI_IFR_STATEMENT_HEADER Header;\r
570 EFI_QUESTION_ID QuestionId;\r
571 EFI_VARSTORE_ID VarStoreId;\r
572 union {\r
573 EFI_STRING_ID VarName;\r
574 UINT16 VarOffset;\r
575 } VarStoreInfo;\r
576 UINT8 Flags;\r
577} EFI_IFR_QUESTION_HEADER;\r
578*/\r
579\r
580/*\r
581typedef struct _EFI_IFR_CHECKBOX {\r
582 EFI_IFR_OP_HEADER Header;\r
583 EFI_IFR_QUESTION_HEADER Question;\r
584 UINT8 Flags;\r
585} EFI_IFR_CHECKBOX;\r
586*/\r
587\r
588/*\r
589typedef struct {\r
590 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
591 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
592 UINT8 Width; // The Size of the Data being saved\r
593 STRING_REF Prompt; // The String Token for the Prompt\r
594 STRING_REF Help; // The string Token for the context-help\r
595 UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely\r
596 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
597} FRAMEWORK_EFI_IFR_CHECKBOX, FRAMEWORK_EFI_IFR_CHECK_BOX;\r
598*/\r
599\r
600\r
601EFI_STATUS\r
602F2UCreateCheckBoxOpCode (\r
0368663f 603 IN HII_THUNK_CONTEXT *ThunkContext,\r
604 IN UINT16 VarStoreId,\r
5391c4f1 605 IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode,\r
606 OUT EFI_HII_UPDATE_DATA *UefiData\r
607 )\r
608{\r
0368663f 609 EFI_STATUS Status;\r
5391c4f1 610 EFI_IFR_CHECKBOX UOpcode;\r
611\r
612 ZeroMem (&UOpcode, sizeof(UOpcode));\r
613\r
614 UOpcode.Header.Length = sizeof(UOpcode);\r
615 UOpcode.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
616\r
617 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
618 UOpcode.Question.Header.Help = FwOpcode->Help;\r
619\r
0368663f 620 if (FwOpcode->Key == 0) {\r
621 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
622 if (EFI_ERROR (Status)) {\r
623 //\r
624 // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
625 //\r
626 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
627 }\r
628 } else {\r
629 UOpcode.Question.QuestionId = FwOpcode->Key;\r
630 }\r
631\r
5391c4f1 632 UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
633 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
634\r
635 //\r
636 // We only map 2 flags:\r
637 // FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, \r
638 // FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
639 // to UEFI IFR Opcode Question flags. The rest flags are obsolete.\r
640 //\r
641 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
642\r
643 //\r
644 // We also map 2 flags:\r
0368663f 645 // FRAMEWORK_EFI_IFR_FLAG_DEFAULT, \r
646 // FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING,\r
5391c4f1 647 // to UEFI IFR CheckBox Opcode default flags.\r
648 //\r
649 UOpcode.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
650\r
651 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
652}\r
653\r
654\r
655/*\r
656typedef struct _EFI_IFR_QUESTION_HEADER {\r
657 EFI_IFR_STATEMENT_HEADER Header;\r
658 EFI_QUESTION_ID QuestionId;\r
659 EFI_VARSTORE_ID VarStoreId;\r
660 union {\r
661 EFI_STRING_ID VarName;\r
662 UINT16 VarOffset;\r
663 } VarStoreInfo;\r
664 UINT8 Flags;\r
665} EFI_IFR_QUESTION_HEADER;\r
666\r
667typedef union {\r
668 struct {\r
669 UINT8 MinValue;\r
670 UINT8 MaxValue;\r
671 UINT8 Step;\r
672 } u8;\r
673 struct {\r
674 UINT16 MinValue;\r
675 UINT16 MaxValue;\r
676 UINT16 Step;\r
677 } u16;\r
678 struct {\r
679 UINT32 MinValue;\r
680 UINT32 MaxValue;\r
681 UINT32 Step;\r
682 } u32;\r
683 struct {\r
684 UINT64 MinValue;\r
685 UINT64 MaxValue;\r
686 UINT64 Step;\r
687 } u64;\r
688} MINMAXSTEP_DATA;\r
689\r
690typedef struct _EFI_IFR_NUMERIC {\r
691 EFI_IFR_OP_HEADER Header;\r
692 EFI_IFR_QUESTION_HEADER Question;\r
693 UINT8 Flags;\r
694 MINMAXSTEP_DATA data;\r
695} EFI_IFR_NUMERIC;\r
696\r
697\r
698typedef struct {\r
699 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
700 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
701 UINT8 Width; // The Size of the Data being saved\r
702 STRING_REF Prompt; // The String Token for the Prompt\r
703 STRING_REF Help; // The string Token for the context-help\r
704 UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
705 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
706 UINT16 Minimum;\r
707 UINT16 Maximum;\r
708 UINT16 Step; // If step is 0, then manual input is specified, otherwise, left/right arrow selection is called for\r
709 UINT16 Default;\r
710} FRAMEWORK_EFI_IFR_NUMERIC;\r
711\r
712*/\r
713\r
714\r
715EFI_STATUS\r
716F2UCreateNumericOpCode (\r
0368663f 717 IN HII_THUNK_CONTEXT *ThunkContext,\r
718 IN UINT16 VarStoreId,\r
5391c4f1 719 IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode,\r
720 OUT EFI_HII_UPDATE_DATA *UefiData\r
721 )\r
722{\r
723 EFI_STATUS Status;\r
724 EFI_IFR_NUMERIC UOpcode;\r
725 EFI_IFR_DEFAULT UOpcodeDefault;\r
726\r
727 ZeroMem (&UOpcode, sizeof(UOpcode));\r
728\r
0368663f 729 if (FwOpcode->Key == 0) {\r
730 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
731 if (EFI_ERROR (Status)) {\r
732 //\r
733 // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
734 //\r
735 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
736 }\r
737 } else {\r
738 UOpcode.Question.QuestionId = FwOpcode->Key;\r
739 }\r
740\r
5391c4f1 741 UOpcode.Header.Length = sizeof(UOpcode);\r
742 UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
743 //\r
744 // We need to create a nested default value for the UEFI Numeric Opcode.\r
745 // So turn on the scope.\r
746 //\r
747 if (FwOpcode->Default != 0) {\r
748 UOpcode.Header.Scope = 1;\r
749 }\r
750\r
751 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
752 UOpcode.Question.Header.Help = FwOpcode->Help;\r
753\r
754 UOpcode.Question.QuestionId = FwOpcode->Key;\r
0368663f 755 //\r
756 // BUGBUG RESERVED_VARSTORE_ID should be passed in.\r
757 //\r
5391c4f1 758 UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
759 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
760\r
761 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
762\r
763 //\r
764 // Framework Numeric values are all in UINT16 and displayed as decimal.\r
765 //\r
766 UOpcode.data.u16.MinValue = FwOpcode->Minimum;\r
767 UOpcode.data.u16.MaxValue = FwOpcode->Maximum;\r
768 UOpcode.data.u16.Step = FwOpcode->Step;\r
769\r
770 switch (FwOpcode->Width) {\r
771 case 1: \r
772 {\r
773 UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
774 break;\r
775 } \r
776 case 2: \r
777 {\r
778 UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
779 break;\r
780 }\r
781 default: \r
782 {\r
783 ASSERT (FALSE);\r
784 return EFI_INVALID_PARAMETER;\r
785 }\r
786 }\r
787 \r
788 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
789 if (EFI_ERROR (Status)) {\r
790 return Status;\r
791 }\r
792\r
793 //\r
f274810c 794 // We need to create a default value.\r
5391c4f1 795 //\r
796 if (FwOpcode->Default != 0) {\r
797 ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
798 UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
799 UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
800\r
801 UOpcodeDefault.DefaultId = 0;\r
802\r
803 switch (FwOpcode->Width) {\r
804 case 1: \r
805 {\r
806 UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
807 break;\r
808 } \r
809 case 2: \r
810 {\r
811 UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
812 break;\r
813 }\r
814 }\r
815\r
816 CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
817\r
818 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
819 if (EFI_ERROR (Status)) {\r
820 return Status;\r
821 }\r
822 Status = UCreateEndOfOpcode (UefiData);\r
823 }\r
824\r
825 return Status;\r
826}\r
827\r
828\r
829/*\r
830\r
831typedef struct _EFI_IFR_QUESTION_HEADER {\r
832 EFI_IFR_STATEMENT_HEADER Header;\r
833 EFI_QUESTION_ID QuestionId;\r
834 EFI_VARSTORE_ID VarStoreId;\r
835 union {\r
836 EFI_STRING_ID VarName;\r
837 UINT16 VarOffset;\r
838 } VarStoreInfo;\r
839 UINT8 Flags;\r
840} EFI_IFR_QUESTION_HEADER;\r
841\r
842typedef struct _EFI_IFR_STRING {\r
843 EFI_IFR_OP_HEADER Header;\r
844 EFI_IFR_QUESTION_HEADER Question;\r
845 UINT8 MinSize;\r
846 UINT8 MaxSize;\r
847 UINT8 Flags;\r
848} EFI_IFR_STRING;\r
849\r
850\r
851typedef struct {\r
852 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
853 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
854 UINT8 Width; // The Size of the Data being saved -- BUGBUG -- remove someday\r
855 STRING_REF Prompt; // The String Token for the Prompt\r
856 STRING_REF Help; // The string Token for the context-help\r
857 UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
858 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
859 UINT8 MinSize; // Minimum allowable sized password\r
860 UINT8 MaxSize; // Maximum allowable sized password\r
861} FRAMEWORK_EFI_IFR_STRING;\r
862\r
863\r
864*/\r
865\r
866EFI_STATUS\r
867F2UCreateStringOpCode (\r
0368663f 868 IN HII_THUNK_CONTEXT *ThunkContext,\r
869 IN UINT16 VarStoreId,\r
5391c4f1 870 IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode,\r
871 OUT EFI_HII_UPDATE_DATA *UefiData\r
872 )\r
873{\r
874 EFI_IFR_STRING UOpcode;\r
875\r
876 ZeroMem (&UOpcode, sizeof(UOpcode));\r
877\r
0368663f 878 if (FwOpcode->Key == 0) {\r
879 FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
880 } else {\r
881 UOpcode.Question.QuestionId = FwOpcode->Key;\r
882 }\r
883\r
5391c4f1 884 UOpcode.Header.Length = sizeof(UOpcode);\r
885 UOpcode.Header.OpCode = EFI_IFR_STRING_OP;\r
886\r
887 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
888 UOpcode.Question.Header.Help = FwOpcode->Help;\r
889\r
890 UOpcode.Question.QuestionId = FwOpcode->Key;\r
891 UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
892 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
893\r
894 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
895\r
896 UOpcode.MinSize = FwOpcode->MinSize;\r
897 UOpcode.MaxSize = FwOpcode->MaxSize;\r
898 UOpcode.Flags = EFI_IFR_STRING_MULTI_LINE;\r
899\r
900 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
901}\r
902\r
903/*\r
904typedef struct _EFI_IFR_GUID_BANNER {\r
905 EFI_IFR_OP_HEADER Header;\r
906 EFI_GUID Guid;\r
907 UINT8 ExtendOpCode; // Extended opcode is EFI_IFR_EXTEND_OP_BANNER\r
908 EFI_STRING_ID Title; // The string token for the banner title\r
909 UINT16 LineNumber; // 1-based line number\r
910 UINT8 Alignment; // left, center, or right-aligned\r
911} EFI_IFR_GUID_BANNER;\r
912\r
913typedef struct {\r
914 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
915 STRING_REF Title; // The string token for the banner title\r
916 UINT16 LineNumber; // 1-based line number\r
917 UINT8 Alignment; // left, center, or right-aligned\r
918} FRAMEWORK_EFI_IFR_BANNER;\r
919\r
920*/\r
921\r
922EFI_STATUS\r
923F2UCreateBannerOpCode (\r
924 IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode,\r
925 OUT EFI_HII_UPDATE_DATA *UefiData\r
926 )\r
927{\r
928 EFI_IFR_GUID_BANNER UOpcode;\r
929\r
930 ZeroMem (&UOpcode, sizeof(UOpcode));\r
931\r
932 UOpcode.Header.Length = sizeof(UOpcode);\r
933 UOpcode.Header.OpCode = EFI_IFR_GUID_OP;\r
934\r
935 CopyMem (&UOpcode.Guid, &mTianoExtendedOpcodeGuid, sizeof (EFI_GUID));\r
936 UOpcode.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
937 UOpcode.Title = FwOpcode->Title;\r
938 UOpcode.LineNumber = FwOpcode->LineNumber;\r
939 UOpcode.Alignment = FwOpcode->Alignment;\r
940\r
941 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
942}\r
943\r
944\r
5391c4f1 945EFI_STATUS\r
0368663f 946FwUpdateDataToUefiUpdateData (\r
947 IN HII_THUNK_CONTEXT *ThunkContext,\r
5391c4f1 948 IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data,\r
949 IN BOOLEAN AddData,\r
950 OUT EFI_HII_UPDATE_DATA **UefiData\r
951 )\r
952{\r
0368663f 953 FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode;\r
954 FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode;\r
955 EFI_HII_UPDATE_DATA *UefiOpCode;\r
5391c4f1 956 UINTN Index;\r
957 EFI_STATUS Status;\r
c64feb92 958 UINTN DataCount;\r
0368663f 959 UINT16 VarStoreId;\r
5391c4f1 960\r
0368663f 961 //\r
962 // Assume all dynamic opcode created is using active variable with VarStoreId of 1.\r
963 //\r
964 VarStoreId = 1;\r
5391c4f1 965\r
0368663f 966 UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
967 if (UefiOpCode == NULL) {\r
5391c4f1 968 return EFI_OUT_OF_RESOURCES;\r
969 }\r
970 \r
0368663f 971 UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
972 if (UefiOpCode->Data == NULL) {\r
5391c4f1 973 return EFI_OUT_OF_RESOURCES;\r
974 }\r
975\r
0368663f 976 UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
977 UefiOpCode->Offset = 0;\r
5391c4f1 978\r
0368663f 979 FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
5391c4f1 980\r
c64feb92 981 for (Index = 0; Index < Data->DataCount; Index += DataCount) {\r
0368663f 982 switch (FwOpCode->OpCode) {\r
5391c4f1 983 case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
0368663f 984 Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode, UefiOpCode);\r
985 DataCount = 1;\r
5391c4f1 986 break;\r
987 \r
988 case FRAMEWORK_EFI_IFR_TEXT_OP:\r
0368663f 989 Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FwOpCode, UefiOpCode); \r
990 DataCount = 1;\r
5391c4f1 991 break;\r
992\r
993 case FRAMEWORK_EFI_IFR_REF_OP:\r
0368663f 994 Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode); \r
995 DataCount = 1;\r
5391c4f1 996 break;\r
997 \r
998 case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
0368663f 999 Status = F2UCreateOneOfOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
5391c4f1 1000 if (!EFI_ERROR (Status)) {\r
0368663f 1001 FwOpCode = NextFwOpCode;\r
5391c4f1 1002 //\r
0368663f 1003 // FwOpCode is already updated to point to the next opcode.\r
5391c4f1 1004 //\r
1005 continue;\r
1006 }\r
1007 break;\r
1008\r
1009 case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
0368663f 1010 Status = F2UCreateOrderedListOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
5391c4f1 1011 if (!EFI_ERROR (Status)) {\r
0368663f 1012 FwOpCode = NextFwOpCode;\r
5391c4f1 1013 //\r
0368663f 1014 // FwOpCode is already updated to point to the next opcode.\r
5391c4f1 1015 //\r
1016 continue;\r
1017 }\r
1018 break;\r
1019 \r
1020 case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
0368663f 1021 Status = F2UCreateCheckBoxOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode); \r
1022 DataCount = 1;\r
5391c4f1 1023 break;\r
1024\r
1025 case FRAMEWORK_EFI_IFR_STRING_OP:\r
0368663f 1026 Status = F2UCreateStringOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode); \r
1027 DataCount = 1;\r
5391c4f1 1028 break;\r
1029\r
1030 case FRAMEWORK_EFI_IFR_BANNER_OP:\r
0368663f 1031 Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode); \r
1032 DataCount = 1;\r
5391c4f1 1033 break;\r
1034\r
1035 case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
0368663f 1036 Status = UCreateEndOfOpcode (UefiOpCode);\r
1037 DataCount = 1;\r
5391c4f1 1038 break;\r
0368663f 1039\r
5391c4f1 1040 default:\r
1041 ASSERT (FALSE);\r
1042 return EFI_UNSUPPORTED;\r
1043 }\r
1044\r
1045 if (EFI_ERROR (Status)) {\r
0368663f 1046 FreePool (UefiOpCode->Data);\r
1047 FreePool (UefiOpCode);\r
5391c4f1 1048 return Status;\r
1049 }\r
1050\r
0368663f 1051 FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
5391c4f1 1052 }\r
1053\r
0368663f 1054 *UefiData = UefiOpCode;\r
5391c4f1 1055 \r
1056 return EFI_SUCCESS;\r
1057}\r
1058\r