]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
Update FrameworkHiiToUefiHiiThunk to produce Framework HII Protocol and Framework...
[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
133a9dfb 354 UOpcode.Question.VarStoreId = VarStoreId;\r
355 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
356 \r
5391c4f1 357 //\r
358 // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
359 //\r
5391c4f1 360 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
361 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
362 ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
363 \r
364 FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
0368663f 365 if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
366 UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
367 \r
368 if (UOpcode.Question.QuestionId == 0) {\r
369 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
370 if (EFI_ERROR (Status)) {\r
371 UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
372 }\r
373\r
374 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
375 ASSERT (OneOfOptionMap != NULL);\r
376 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
377 OneOfOptionMap->QuestionId = UOpcode.Question.QuestionId;\r
378 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
379 switch (FwOpcode->Width) {\r
380 case 1:\r
381 OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
382 break;\r
383 case 2:\r
384 OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
385 default:\r
386 ASSERT (FALSE);\r
387 break;\r
388 }\r
389\r
390 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
133a9dfb 391 }\r
392 \r
393 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
394 ASSERT (OneOfOptionMapEntry != NULL);\r
0368663f 395\r
133a9dfb 396 OneOfOptionMapEntry->FwKey = FwOneOfOp->Key;\r
397 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
398 \r
399 CopyMem (&OneOfOptionMapEntry->Value, &FwOneOfOp->Value, FwOpcode->Width);\r
0368663f 400\r
133a9dfb 401 ASSERT (OneOfOptionMap != NULL);\r
402 InsertTailList (&OneOfOptionMap->OneOfOptionMapEntryListHead, &OneOfOptionMapEntry->Link);\r
0368663f 403 }\r
404\r
405 if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
406 UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
5391c4f1 407 }\r
408\r
409 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
410 }\r
411\r
0368663f 412\r
413 if (UOpcode.Question.QuestionId == 0) {\r
414 //\r
415 // Assign QuestionId if still not assigned.\r
416 //\r
417 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
418 if (EFI_ERROR (Status)) {\r
419 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
420 }\r
421 }\r
422 \r
423 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiData);\r
424 if (EFI_ERROR (Status)) {\r
425 return Status;\r
426 }\r
427 *DataCount += 1;\r
428\r
5391c4f1 429 //\r
430 // Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.\r
431 //\r
432 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
433 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
434 Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiData);\r
435 if (EFI_ERROR (Status)) {\r
436 return Status;\r
437 }\r
c64feb92 438 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
439 *DataCount += 1;\r
5391c4f1 440 }\r
441\r
442 Status = UCreateEndOfOpcode (UefiData);\r
443 if (!EFI_ERROR (Status)) {\r
444 *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
c64feb92 445 *DataCount += 1;\r
5391c4f1 446 }\r
447\r
448 return Status;\r
449}\r
450\r
451/*\r
452typedef struct _EFI_IFR_QUESTION_HEADER {\r
453 EFI_IFR_STATEMENT_HEADER Header;\r
454 EFI_QUESTION_ID QuestionId;\r
455 EFI_VARSTORE_ID VarStoreId;\r
456 union {\r
457 EFI_STRING_ID VarName;\r
458 UINT16 VarOffset;\r
459 } VarStoreInfo;\r
460 UINT8 Flags;\r
461} EFI_IFR_QUESTION_HEADER;\r
462\r
463typedef struct _EFI_IFR_ORDERED_LIST {\r
464 EFI_IFR_OP_HEADER Header;\r
465 EFI_IFR_QUESTION_HEADER Question;\r
466 UINT8 MaxContainers;\r
467 UINT8 Flags;\r
468} EFI_IFR_ORDERED_LIST;\r
469\r
470typedef struct {\r
471 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
472 UINT16 QuestionId; // The offset in NV for storage of the data\r
473 UINT8 MaxEntries; // The maximum number of options in the ordered list (=size of NVStore)\r
474 STRING_REF Prompt; // The string token for the prompt\r
475 STRING_REF Help; // The string token for the context-help\r
476} FRAMEWORK_EFI_IFR_ORDERED_LIST;\r
477\r
478*/\r
479EFI_STATUS\r
480F2UCreateOrderedListOpCode (\r
0368663f 481 IN HII_THUNK_CONTEXT *ThunkContext,\r
482 IN UINT16 VarStoreId,\r
5391c4f1 483 IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
484 OUT EFI_HII_UPDATE_DATA *UefiData,\r
c64feb92 485 OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
486 OUT UINTN *DataCount\r
5391c4f1 487 )\r
488{\r
489 EFI_IFR_ORDERED_LIST UOpcode;\r
490 EFI_STATUS Status;\r
491 FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
0368663f 492 FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
5391c4f1 493\r
494 ZeroMem (&UOpcode, sizeof(UOpcode));\r
c64feb92 495 *DataCount = 0;\r
5391c4f1 496\r
497 UOpcode.Header.Length = sizeof(UOpcode);\r
498 UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
499 UOpcode.Header.Scope = 1;\r
500\r
501 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
502 UOpcode.Question.Header.Help = FwOpcode->Help;\r
0368663f 503 UOpcode.Question.VarStoreId = VarStoreId;\r
133a9dfb 504 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
5391c4f1 505\r
506 UOpcode.MaxContainers = FwOpcode->MaxEntries;\r
0368663f 507\r
508 //\r
509 // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
510 //\r
511 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
512 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
513 ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
514 \r
515 FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
516 if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
517 UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
518 \r
519 if (UOpcode.Question.QuestionId == 0) {\r
520 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
521 if (EFI_ERROR (Status)) {\r
522 UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
523 }\r
524\r
525 }\r
526 }\r
527\r
528 if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
529 UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
530 }\r
531\r
532 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
533 }\r
534\r
535 if (UOpcode.Question.QuestionId == 0) {\r
536 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
537 if (EFI_ERROR (Status)) {\r
538 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
539 }\r
540 }\r
5391c4f1 541 \r
542 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
543 if (EFI_ERROR (Status)) {\r
544 return Status;\r
545 }\r
c64feb92 546 *DataCount += 1;\r
5391c4f1 547\r
548 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
549 while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
0368663f 550 //\r
551 // Each entry of Order List in Framework HII is always 1 byte in size\r
552 //\r
553 Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiData);\r
5391c4f1 554 if (EFI_ERROR (Status)) {\r
555 return Status;\r
556 }\r
c64feb92 557 FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
558 *DataCount += 1;\r
5391c4f1 559 }\r
560\r
561 Status = UCreateEndOfOpcode (UefiData);\r
562 if (!EFI_ERROR (Status)) {\r
563 *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
c64feb92 564 *DataCount += 1;\r
5391c4f1 565 }\r
566\r
c64feb92 567 return Status;\r
5391c4f1 568}\r
569\r
570/*\r
571typedef struct _EFI_IFR_QUESTION_HEADER {\r
572 EFI_IFR_STATEMENT_HEADER Header;\r
573 EFI_QUESTION_ID QuestionId;\r
574 EFI_VARSTORE_ID VarStoreId;\r
575 union {\r
576 EFI_STRING_ID VarName;\r
577 UINT16 VarOffset;\r
578 } VarStoreInfo;\r
579 UINT8 Flags;\r
580} EFI_IFR_QUESTION_HEADER;\r
581*/\r
582\r
583/*\r
584typedef struct _EFI_IFR_CHECKBOX {\r
585 EFI_IFR_OP_HEADER Header;\r
586 EFI_IFR_QUESTION_HEADER Question;\r
587 UINT8 Flags;\r
588} EFI_IFR_CHECKBOX;\r
589*/\r
590\r
591/*\r
592typedef struct {\r
593 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
594 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
595 UINT8 Width; // The Size of the Data being saved\r
596 STRING_REF Prompt; // The String Token for the Prompt\r
597 STRING_REF Help; // The string Token for the context-help\r
598 UINT8 Flags; // For now, if non-zero, means that it is the default option, - further definition likely\r
599 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
600} FRAMEWORK_EFI_IFR_CHECKBOX, FRAMEWORK_EFI_IFR_CHECK_BOX;\r
601*/\r
602\r
603\r
604EFI_STATUS\r
605F2UCreateCheckBoxOpCode (\r
0368663f 606 IN HII_THUNK_CONTEXT *ThunkContext,\r
607 IN UINT16 VarStoreId,\r
5391c4f1 608 IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode,\r
609 OUT EFI_HII_UPDATE_DATA *UefiData\r
610 )\r
611{\r
0368663f 612 EFI_STATUS Status;\r
5391c4f1 613 EFI_IFR_CHECKBOX UOpcode;\r
614\r
615 ZeroMem (&UOpcode, sizeof(UOpcode));\r
616\r
617 UOpcode.Header.Length = sizeof(UOpcode);\r
618 UOpcode.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
619\r
620 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
621 UOpcode.Question.Header.Help = FwOpcode->Help;\r
622\r
0368663f 623 if (FwOpcode->Key == 0) {\r
624 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
625 if (EFI_ERROR (Status)) {\r
626 //\r
627 // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
628 //\r
629 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
630 }\r
631 } else {\r
632 UOpcode.Question.QuestionId = FwOpcode->Key;\r
633 }\r
634\r
5391c4f1 635 UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
636 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
637\r
638 //\r
639 // We only map 2 flags:\r
640 // FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, \r
641 // FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
642 // to UEFI IFR Opcode Question flags. The rest flags are obsolete.\r
643 //\r
644 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
645\r
646 //\r
647 // We also map 2 flags:\r
0368663f 648 // FRAMEWORK_EFI_IFR_FLAG_DEFAULT, \r
649 // FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING,\r
5391c4f1 650 // to UEFI IFR CheckBox Opcode default flags.\r
651 //\r
652 UOpcode.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
653\r
654 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
655}\r
656\r
657\r
658/*\r
659typedef struct _EFI_IFR_QUESTION_HEADER {\r
660 EFI_IFR_STATEMENT_HEADER Header;\r
661 EFI_QUESTION_ID QuestionId;\r
662 EFI_VARSTORE_ID VarStoreId;\r
663 union {\r
664 EFI_STRING_ID VarName;\r
665 UINT16 VarOffset;\r
666 } VarStoreInfo;\r
667 UINT8 Flags;\r
668} EFI_IFR_QUESTION_HEADER;\r
669\r
670typedef union {\r
671 struct {\r
672 UINT8 MinValue;\r
673 UINT8 MaxValue;\r
674 UINT8 Step;\r
675 } u8;\r
676 struct {\r
677 UINT16 MinValue;\r
678 UINT16 MaxValue;\r
679 UINT16 Step;\r
680 } u16;\r
681 struct {\r
682 UINT32 MinValue;\r
683 UINT32 MaxValue;\r
684 UINT32 Step;\r
685 } u32;\r
686 struct {\r
687 UINT64 MinValue;\r
688 UINT64 MaxValue;\r
689 UINT64 Step;\r
690 } u64;\r
691} MINMAXSTEP_DATA;\r
692\r
693typedef struct _EFI_IFR_NUMERIC {\r
694 EFI_IFR_OP_HEADER Header;\r
695 EFI_IFR_QUESTION_HEADER Question;\r
696 UINT8 Flags;\r
697 MINMAXSTEP_DATA data;\r
698} EFI_IFR_NUMERIC;\r
699\r
700\r
701typedef struct {\r
702 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
703 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
704 UINT8 Width; // The Size of the Data being saved\r
705 STRING_REF Prompt; // The String Token for the Prompt\r
706 STRING_REF Help; // The string Token for the context-help\r
707 UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
708 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
709 UINT16 Minimum;\r
710 UINT16 Maximum;\r
711 UINT16 Step; // If step is 0, then manual input is specified, otherwise, left/right arrow selection is called for\r
712 UINT16 Default;\r
713} FRAMEWORK_EFI_IFR_NUMERIC;\r
714\r
715*/\r
716\r
717\r
718EFI_STATUS\r
719F2UCreateNumericOpCode (\r
a3318eaf 720 IN HII_THUNK_CONTEXT *ThunkContext,\r
0368663f 721 IN UINT16 VarStoreId,\r
5391c4f1 722 IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode,\r
723 OUT EFI_HII_UPDATE_DATA *UefiData\r
724 )\r
725{\r
726 EFI_STATUS Status;\r
727 EFI_IFR_NUMERIC UOpcode;\r
728 EFI_IFR_DEFAULT UOpcodeDefault;\r
729\r
730 ZeroMem (&UOpcode, sizeof(UOpcode));\r
731\r
0368663f 732 if (FwOpcode->Key == 0) {\r
733 Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
734 if (EFI_ERROR (Status)) {\r
735 //\r
736 // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
737 //\r
738 UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
739 }\r
740 } else {\r
741 UOpcode.Question.QuestionId = FwOpcode->Key;\r
742 }\r
743\r
5391c4f1 744 UOpcode.Header.Length = sizeof(UOpcode);\r
745 UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
746 //\r
747 // We need to create a nested default value for the UEFI Numeric Opcode.\r
748 // So turn on the scope.\r
749 //\r
750 if (FwOpcode->Default != 0) {\r
751 UOpcode.Header.Scope = 1;\r
752 }\r
753\r
754 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
755 UOpcode.Question.Header.Help = FwOpcode->Help;\r
756\r
757 UOpcode.Question.QuestionId = FwOpcode->Key;\r
a3318eaf 758 UOpcode.Question.VarStoreId = VarStoreId;\r
5391c4f1 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