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