]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
1) Add in code to sync Browser Data with the NvMapOverride that may be updated by...
[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
0368663f 720 IN HII_THUNK_CONTEXT *ThunkContext,\r
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
0368663f 758 //\r
759 // BUGBUG RESERVED_VARSTORE_ID should be passed in.\r
760 //\r
5391c4f1 761 UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
762 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
763\r
764 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
765\r
766 //\r
767 // Framework Numeric values are all in UINT16 and displayed as decimal.\r
768 //\r
769 UOpcode.data.u16.MinValue = FwOpcode->Minimum;\r
770 UOpcode.data.u16.MaxValue = FwOpcode->Maximum;\r
771 UOpcode.data.u16.Step = FwOpcode->Step;\r
772\r
773 switch (FwOpcode->Width) {\r
774 case 1: \r
775 {\r
776 UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
777 break;\r
778 } \r
779 case 2: \r
780 {\r
781 UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
782 break;\r
783 }\r
784 default: \r
785 {\r
786 ASSERT (FALSE);\r
787 return EFI_INVALID_PARAMETER;\r
788 }\r
789 }\r
790 \r
791 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
792 if (EFI_ERROR (Status)) {\r
793 return Status;\r
794 }\r
795\r
796 //\r
f274810c 797 // We need to create a default value.\r
5391c4f1 798 //\r
799 if (FwOpcode->Default != 0) {\r
800 ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
801 UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
802 UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
803\r
804 UOpcodeDefault.DefaultId = 0;\r
805\r
806 switch (FwOpcode->Width) {\r
807 case 1: \r
808 {\r
809 UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
810 break;\r
811 } \r
812 case 2: \r
813 {\r
814 UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
815 break;\r
816 }\r
817 }\r
818\r
819 CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
820\r
821 Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
822 if (EFI_ERROR (Status)) {\r
823 return Status;\r
824 }\r
825 Status = UCreateEndOfOpcode (UefiData);\r
826 }\r
827\r
828 return Status;\r
829}\r
830\r
831\r
832/*\r
833\r
834typedef struct _EFI_IFR_QUESTION_HEADER {\r
835 EFI_IFR_STATEMENT_HEADER Header;\r
836 EFI_QUESTION_ID QuestionId;\r
837 EFI_VARSTORE_ID VarStoreId;\r
838 union {\r
839 EFI_STRING_ID VarName;\r
840 UINT16 VarOffset;\r
841 } VarStoreInfo;\r
842 UINT8 Flags;\r
843} EFI_IFR_QUESTION_HEADER;\r
844\r
845typedef struct _EFI_IFR_STRING {\r
846 EFI_IFR_OP_HEADER Header;\r
847 EFI_IFR_QUESTION_HEADER Question;\r
848 UINT8 MinSize;\r
849 UINT8 MaxSize;\r
850 UINT8 Flags;\r
851} EFI_IFR_STRING;\r
852\r
853\r
854typedef struct {\r
855 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
856 UINT16 QuestionId; // The ID designating what the question is about...sucked in from a #define, likely in the form of a variable name\r
857 UINT8 Width; // The Size of the Data being saved -- BUGBUG -- remove someday\r
858 STRING_REF Prompt; // The String Token for the Prompt\r
859 STRING_REF Help; // The string Token for the context-help\r
860 UINT8 Flags; // This is included solely for purposes of interactive/dynamic support.\r
861 UINT16 Key; // Value to be passed to caller to identify this particular op-code\r
862 UINT8 MinSize; // Minimum allowable sized password\r
863 UINT8 MaxSize; // Maximum allowable sized password\r
864} FRAMEWORK_EFI_IFR_STRING;\r
865\r
866\r
867*/\r
868\r
869EFI_STATUS\r
870F2UCreateStringOpCode (\r
0368663f 871 IN HII_THUNK_CONTEXT *ThunkContext,\r
872 IN UINT16 VarStoreId,\r
5391c4f1 873 IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode,\r
874 OUT EFI_HII_UPDATE_DATA *UefiData\r
875 )\r
876{\r
877 EFI_IFR_STRING UOpcode;\r
878\r
879 ZeroMem (&UOpcode, sizeof(UOpcode));\r
880\r
0368663f 881 if (FwOpcode->Key == 0) {\r
882 FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
883 } else {\r
884 UOpcode.Question.QuestionId = FwOpcode->Key;\r
885 }\r
886\r
5391c4f1 887 UOpcode.Header.Length = sizeof(UOpcode);\r
888 UOpcode.Header.OpCode = EFI_IFR_STRING_OP;\r
889\r
890 UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
891 UOpcode.Question.Header.Help = FwOpcode->Help;\r
892\r
893 UOpcode.Question.QuestionId = FwOpcode->Key;\r
894 UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
895 UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
896\r
897 UOpcode.Question.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
898\r
899 UOpcode.MinSize = FwOpcode->MinSize;\r
900 UOpcode.MaxSize = FwOpcode->MaxSize;\r
901 UOpcode.Flags = EFI_IFR_STRING_MULTI_LINE;\r
902\r
903 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
904}\r
905\r
906/*\r
907typedef struct _EFI_IFR_GUID_BANNER {\r
908 EFI_IFR_OP_HEADER Header;\r
909 EFI_GUID Guid;\r
910 UINT8 ExtendOpCode; // Extended opcode is EFI_IFR_EXTEND_OP_BANNER\r
911 EFI_STRING_ID Title; // The string token for the banner title\r
912 UINT16 LineNumber; // 1-based line number\r
913 UINT8 Alignment; // left, center, or right-aligned\r
914} EFI_IFR_GUID_BANNER;\r
915\r
916typedef struct {\r
917 FRAMEWORK_EFI_IFR_OP_HEADER Header;\r
918 STRING_REF Title; // The string token for the banner title\r
919 UINT16 LineNumber; // 1-based line number\r
920 UINT8 Alignment; // left, center, or right-aligned\r
921} FRAMEWORK_EFI_IFR_BANNER;\r
922\r
923*/\r
924\r
925EFI_STATUS\r
926F2UCreateBannerOpCode (\r
927 IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode,\r
928 OUT EFI_HII_UPDATE_DATA *UefiData\r
929 )\r
930{\r
931 EFI_IFR_GUID_BANNER UOpcode;\r
932\r
933 ZeroMem (&UOpcode, sizeof(UOpcode));\r
934\r
935 UOpcode.Header.Length = sizeof(UOpcode);\r
936 UOpcode.Header.OpCode = EFI_IFR_GUID_OP;\r
937\r
938 CopyMem (&UOpcode.Guid, &mTianoExtendedOpcodeGuid, sizeof (EFI_GUID));\r
939 UOpcode.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
940 UOpcode.Title = FwOpcode->Title;\r
941 UOpcode.LineNumber = FwOpcode->LineNumber;\r
942 UOpcode.Alignment = FwOpcode->Alignment;\r
943\r
944 return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
945}\r
946\r
947\r
5391c4f1 948EFI_STATUS\r
0368663f 949FwUpdateDataToUefiUpdateData (\r
950 IN HII_THUNK_CONTEXT *ThunkContext,\r
5391c4f1 951 IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data,\r
952 IN BOOLEAN AddData,\r
953 OUT EFI_HII_UPDATE_DATA **UefiData\r
954 )\r
955{\r
0368663f 956 FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode;\r
957 FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode;\r
958 EFI_HII_UPDATE_DATA *UefiOpCode;\r
5391c4f1 959 UINTN Index;\r
960 EFI_STATUS Status;\r
c64feb92 961 UINTN DataCount;\r
0368663f 962 UINT16 VarStoreId;\r
5391c4f1 963\r
0368663f 964 //\r
965 // Assume all dynamic opcode created is using active variable with VarStoreId of 1.\r
966 //\r
967 VarStoreId = 1;\r
5391c4f1 968\r
0368663f 969 UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
970 if (UefiOpCode == NULL) {\r
5391c4f1 971 return EFI_OUT_OF_RESOURCES;\r
972 }\r
973 \r
0368663f 974 UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
975 if (UefiOpCode->Data == NULL) {\r
5391c4f1 976 return EFI_OUT_OF_RESOURCES;\r
977 }\r
978\r
0368663f 979 UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
980 UefiOpCode->Offset = 0;\r
5391c4f1 981\r
0368663f 982 FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
5391c4f1 983\r
c64feb92 984 for (Index = 0; Index < Data->DataCount; Index += DataCount) {\r
0368663f 985 switch (FwOpCode->OpCode) {\r
5391c4f1 986 case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
0368663f 987 Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode, UefiOpCode);\r
988 DataCount = 1;\r
5391c4f1 989 break;\r
990 \r
991 case FRAMEWORK_EFI_IFR_TEXT_OP:\r
0368663f 992 Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FwOpCode, UefiOpCode); \r
993 DataCount = 1;\r
5391c4f1 994 break;\r
995\r
996 case FRAMEWORK_EFI_IFR_REF_OP:\r
0368663f 997 Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode); \r
998 DataCount = 1;\r
5391c4f1 999 break;\r
1000 \r
1001 case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
0368663f 1002 Status = F2UCreateOneOfOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
5391c4f1 1003 if (!EFI_ERROR (Status)) {\r
0368663f 1004 FwOpCode = NextFwOpCode;\r
5391c4f1 1005 //\r
0368663f 1006 // FwOpCode is already updated to point to the next opcode.\r
5391c4f1 1007 //\r
1008 continue;\r
1009 }\r
1010 break;\r
1011\r
1012 case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
0368663f 1013 Status = F2UCreateOrderedListOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
5391c4f1 1014 if (!EFI_ERROR (Status)) {\r
0368663f 1015 FwOpCode = NextFwOpCode;\r
5391c4f1 1016 //\r
0368663f 1017 // FwOpCode is already updated to point to the next opcode.\r
5391c4f1 1018 //\r
1019 continue;\r
1020 }\r
1021 break;\r
1022 \r
1023 case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
0368663f 1024 Status = F2UCreateCheckBoxOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode); \r
1025 DataCount = 1;\r
5391c4f1 1026 break;\r
1027\r
1028 case FRAMEWORK_EFI_IFR_STRING_OP:\r
0368663f 1029 Status = F2UCreateStringOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode); \r
1030 DataCount = 1;\r
5391c4f1 1031 break;\r
1032\r
1033 case FRAMEWORK_EFI_IFR_BANNER_OP:\r
0368663f 1034 Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode); \r
1035 DataCount = 1;\r
5391c4f1 1036 break;\r
1037\r
1038 case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
0368663f 1039 Status = UCreateEndOfOpcode (UefiOpCode);\r
1040 DataCount = 1;\r
5391c4f1 1041 break;\r
0368663f 1042\r
5391c4f1 1043 default:\r
1044 ASSERT (FALSE);\r
1045 return EFI_UNSUPPORTED;\r
1046 }\r
1047\r
1048 if (EFI_ERROR (Status)) {\r
0368663f 1049 FreePool (UefiOpCode->Data);\r
1050 FreePool (UefiOpCode);\r
5391c4f1 1051 return Status;\r
1052 }\r
1053\r
0368663f 1054 FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
5391c4f1 1055 }\r
1056\r
0368663f 1057 *UefiData = UefiOpCode;\r
5391c4f1 1058 \r
1059 return EFI_SUCCESS;\r
1060}\r
1061\r