]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / UefiEfiIfrSupportLib / UefiIfrOpCodeCreation.c
CommitLineData
c7f33ca4 1/*++\r
2\r
3e99020d 3Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
4ea9375a 4This program and the accompanying materials\r
c7f33ca4 5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 UefiIfrOpCodeCreation.c\r
15\r
16Abstract:\r
17\r
18 Library Routines to create IFR independent of string data - assume tokens already exist\r
19 Primarily to be used for exporting op-codes at a label in pre-defined forms.\r
20\r
21Revision History:\r
22\r
23--*/\r
24\r
25#include "UefiIfrLibrary.h"\r
26\r
27EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID;\r
28\r
29STATIC\r
30BOOLEAN\r
31IsValidQuestionFlags (\r
32 IN UINT8 Flags\r
33 )\r
34{\r
4cb43192 35 return (BOOLEAN)((Flags & (~QUESTION_FLAGS)) ? FALSE : TRUE);\r
c7f33ca4 36}\r
37\r
38STATIC\r
39BOOLEAN\r
40IsValidValueType (\r
41 IN UINT8 Type\r
42 )\r
43{\r
4cb43192 44 return (BOOLEAN)((Type <= EFI_IFR_TYPE_OTHER) ? TRUE : FALSE);\r
c7f33ca4 45}\r
46\r
47STATIC\r
48BOOLEAN\r
49IsValidNumricFlags (\r
50 IN UINT8 Flags\r
51 )\r
52{\r
53 if (Flags & ~(EFI_IFR_NUMERIC_SIZE | EFI_IFR_DISPLAY)) {\r
54 return FALSE;\r
55 }\r
56\r
57 if ((Flags & EFI_IFR_DISPLAY) > EFI_IFR_DISPLAY_UINT_HEX) {\r
58 return FALSE;\r
59 }\r
60\r
61 return TRUE;\r
62}\r
63\r
64STATIC\r
65BOOLEAN\r
66IsValidCheckboxFlags (\r
67 IN UINT8 Flags\r
68 )\r
69{\r
4cb43192 70 return (BOOLEAN)((Flags <= EFI_IFR_CHECKBOX_DEFAULT_MFG) ? TRUE : FALSE);\r
c7f33ca4 71}\r
72\r
73EFI_STATUS\r
74CreateEndOpCode (\r
75 IN OUT EFI_HII_UPDATE_DATA *Data\r
76 )\r
77{\r
78 EFI_IFR_END End;\r
79 UINT8 *LocalBuffer;\r
80\r
81 ASSERT (Data != NULL && Data->Data != NULL);\r
82\r
83 if (Data->Offset + sizeof (EFI_IFR_END) > Data->BufferSize) {\r
84 return EFI_BUFFER_TOO_SMALL;\r
85 }\r
86\r
e0096099 87 End.Header.Length = (UINT8) sizeof (EFI_IFR_END);\r
c7f33ca4 88 End.Header.OpCode = EFI_IFR_END_OP;\r
89 End.Header.Scope = 0;\r
90\r
91 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
92 EfiCopyMem (LocalBuffer, &End, sizeof (EFI_IFR_END));\r
93 Data->Offset += sizeof (EFI_IFR_END);\r
94\r
95 return EFI_SUCCESS;\r
96}\r
97\r
98EFI_STATUS\r
99CreateDefaultOpCode (\r
100 IN EFI_IFR_TYPE_VALUE *Value,\r
101 IN UINT8 Type,\r
102 IN OUT EFI_HII_UPDATE_DATA *Data\r
103 )\r
104{\r
105 EFI_IFR_DEFAULT Default;\r
106 UINT8 *LocalBuffer;\r
107\r
108 ASSERT (Data != NULL && Data->Data != NULL);\r
109\r
110 if ((Value == NULL) || !IsValidValueType (Type)) {\r
111 return EFI_INVALID_PARAMETER;\r
112 }\r
113\r
114 if (Data->Offset + sizeof (EFI_IFR_DEFAULT) > Data->BufferSize) {\r
115 return EFI_BUFFER_TOO_SMALL;\r
116 }\r
117\r
118 Default.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
e0096099 119 Default.Header.Length = (UINT8) sizeof (EFI_IFR_DEFAULT);\r
c7f33ca4 120 Default.Header.Scope = 0;\r
121 Default.Type = Type;\r
122 Default.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
123 EfiCopyMem (&Default.Value, Value, sizeof(EFI_IFR_TYPE_VALUE));\r
124\r
125 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
126 EfiCopyMem (LocalBuffer, &Default, sizeof (EFI_IFR_DEFAULT));\r
127 Data->Offset += sizeof (EFI_IFR_DEFAULT);\r
128\r
129 return EFI_SUCCESS;\r
130}\r
131\r
132EFI_STATUS\r
133CreateActionOpCode (\r
134 IN EFI_QUESTION_ID QuestionId,\r
135 IN EFI_STRING_ID Prompt,\r
136 IN EFI_STRING_ID Help,\r
137 IN UINT8 QuestionFlags,\r
138 IN EFI_STRING_ID QuestionConfig,\r
139 IN OUT EFI_HII_UPDATE_DATA *Data\r
140 )\r
141{\r
142 EFI_IFR_ACTION Action;\r
143 UINT8 *LocalBuffer;\r
144\r
145 ASSERT (Data != NULL && Data->Data != NULL);\r
146\r
147 if (!IsValidQuestionFlags (QuestionFlags)) {\r
148 return EFI_INVALID_PARAMETER;\r
149 }\r
150\r
151 if (Data->Offset + sizeof (EFI_IFR_ACTION) > Data->BufferSize) {\r
152 return EFI_BUFFER_TOO_SMALL;\r
153 }\r
154\r
155 Action.Header.OpCode = EFI_IFR_ACTION_OP;\r
e0096099 156 Action.Header.Length = (UINT8) sizeof (EFI_IFR_ACTION);\r
c7f33ca4 157 Action.Header.Scope = 0;\r
158 Action.Question.QuestionId = QuestionId;\r
159 Action.Question.Header.Prompt = Prompt;\r
160 Action.Question.Header.Help = Help;\r
161 Action.Question.VarStoreId = INVALID_VARSTORE_ID;\r
162 Action.Question.Flags = QuestionFlags;\r
163 Action.QuestionConfig = QuestionConfig;\r
164\r
165 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
166 EfiCopyMem (LocalBuffer, &Action, sizeof (EFI_IFR_ACTION));\r
167 Data->Offset += sizeof (EFI_IFR_ACTION);\r
168\r
169 return EFI_SUCCESS;\r
170}\r
171\r
172EFI_STATUS\r
173CreateSubTitleOpCode (\r
174 IN EFI_STRING_ID Prompt,\r
175 IN EFI_STRING_ID Help,\r
176 IN UINT8 Flags,\r
177 IN UINT8 Scope,\r
178 IN OUT EFI_HII_UPDATE_DATA *Data\r
179 )\r
180{\r
181 EFI_IFR_SUBTITLE Subtitle;\r
182 UINT8 *LocalBuffer;\r
183\r
184 ASSERT (Data != NULL && Data->Data != NULL);\r
185\r
186 if (Data->Offset + sizeof (EFI_IFR_SUBTITLE) > Data->BufferSize) {\r
187 return EFI_BUFFER_TOO_SMALL;\r
188 }\r
189\r
190 Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
e0096099 191 Subtitle.Header.Length = (UINT8) sizeof (EFI_IFR_SUBTITLE);\r
c7f33ca4 192 Subtitle.Header.Scope = Scope;\r
193 Subtitle.Statement.Prompt = Prompt;\r
194 Subtitle.Statement.Help = Help;\r
195 Subtitle.Flags = Flags;\r
196\r
197 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
198 EfiCopyMem (LocalBuffer, &Subtitle, sizeof (EFI_IFR_SUBTITLE));\r
199 Data->Offset += sizeof (EFI_IFR_SUBTITLE);\r
200\r
201 return EFI_SUCCESS;\r
202}\r
203\r
204\r
205EFI_STATUS\r
206CreateTextOpCode (\r
207 IN EFI_STRING_ID Prompt,\r
208 IN EFI_STRING_ID Help,\r
209 IN EFI_STRING_ID TextTwo,\r
210 IN OUT EFI_HII_UPDATE_DATA *Data\r
211 )\r
212{\r
213 EFI_IFR_TEXT Text;\r
214 UINT8 *LocalBuffer;\r
215\r
216 ASSERT (Data != NULL && Data->Data != NULL);\r
217\r
218 if (Data->Offset + sizeof (EFI_IFR_TEXT) > Data->BufferSize) {\r
219 return EFI_BUFFER_TOO_SMALL;\r
220 }\r
221\r
222 Text.Header.OpCode = EFI_IFR_TEXT_OP;\r
e0096099 223 Text.Header.Length = (UINT8) sizeof (EFI_IFR_TEXT);\r
c7f33ca4 224 Text.Header.Scope = 0;\r
225 Text.Statement.Prompt = Prompt;\r
226 Text.Statement.Help = Help;\r
227 Text.TextTwo = TextTwo;\r
228\r
229 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
230 EfiCopyMem (LocalBuffer, &Text, sizeof (EFI_IFR_TEXT));\r
231 Data->Offset += sizeof (EFI_IFR_TEXT);\r
232\r
233 return EFI_SUCCESS;\r
234}\r
235\r
236EFI_STATUS\r
237CreateGotoOpCode (\r
238 IN EFI_FORM_ID FormId,\r
239 IN EFI_STRING_ID Prompt,\r
240 IN EFI_STRING_ID Help,\r
241 IN UINT8 QuestionFlags,\r
242 IN EFI_QUESTION_ID QuestionId,\r
243 IN OUT EFI_HII_UPDATE_DATA *Data\r
244 )\r
245{\r
246 EFI_IFR_REF Goto;\r
247 UINT8 *LocalBuffer;\r
248\r
249 ASSERT (Data != NULL && Data->Data != NULL);\r
250\r
251 if (!IsValidQuestionFlags (QuestionFlags)) {\r
252 return EFI_INVALID_PARAMETER;\r
253 }\r
254\r
255 if (Data->Offset + sizeof (EFI_IFR_REF) > Data->BufferSize) {\r
256 return EFI_BUFFER_TOO_SMALL;\r
257 }\r
258\r
259 Goto.Header.OpCode = EFI_IFR_REF_OP;\r
e0096099 260 Goto.Header.Length = (UINT8) sizeof (EFI_IFR_REF);\r
c7f33ca4 261 Goto.Header.Scope = 0;\r
262 Goto.Question.Header.Prompt = Prompt;\r
263 Goto.Question.Header.Help = Help;\r
264 Goto.Question.VarStoreId = INVALID_VARSTORE_ID;\r
265 Goto.Question.QuestionId = QuestionId;\r
266 Goto.Question.Flags = QuestionFlags;\r
267 Goto.FormId = FormId;\r
268\r
269 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
270 EfiCopyMem (LocalBuffer, &Goto, sizeof (EFI_IFR_REF));\r
271 Data->Offset += sizeof (EFI_IFR_REF);\r
272\r
273 return EFI_SUCCESS;\r
274}\r
275\r
276EFI_STATUS\r
277CreateOneOfOptionOpCode (\r
278 IN UINTN OptionCount,\r
279 IN IFR_OPTION *OptionsList,\r
280 IN UINT8 Type,\r
281 IN OUT EFI_HII_UPDATE_DATA *Data\r
282 )\r
283{\r
284 UINTN Index;\r
285 UINT8 *LocalBuffer;\r
286 EFI_IFR_ONE_OF_OPTION OneOfOption;\r
287\r
288 ASSERT (Data != NULL && Data->Data != NULL);\r
289\r
290 if ((OptionCount != 0) && (OptionsList == NULL)) {\r
291 return EFI_INVALID_PARAMETER;\r
292 }\r
293\r
294 if (Data->Offset + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) > Data->BufferSize) {\r
295 return EFI_BUFFER_TOO_SMALL;\r
296 }\r
297\r
298 for (Index = 0; Index < OptionCount; Index++) {\r
299 OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;\r
e0096099 300 OneOfOption.Header.Length = (UINT8) sizeof (EFI_IFR_ONE_OF_OPTION);\r
c7f33ca4 301 OneOfOption.Header.Scope = 0;\r
302\r
303 OneOfOption.Option = OptionsList[Index].StringToken;\r
304 OneOfOption.Value = OptionsList[Index].Value;\r
4cb43192 305 OneOfOption.Flags = (UINT8)(OptionsList[Index].Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
c7f33ca4 306 OneOfOption.Type = Type;\r
307\r
308 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
309 EfiCopyMem (LocalBuffer, &OneOfOption, sizeof (EFI_IFR_ONE_OF_OPTION));\r
310 Data->Offset += sizeof (EFI_IFR_ONE_OF_OPTION);\r
311 }\r
312\r
313 return EFI_SUCCESS;\r
314}\r
315\r
316EFI_STATUS\r
317CreateOneOfOpCode (\r
318 IN EFI_QUESTION_ID QuestionId,\r
319 IN EFI_VARSTORE_ID VarStoreId,\r
320 IN UINT16 VarOffset,\r
321 IN EFI_STRING_ID Prompt,\r
322 IN EFI_STRING_ID Help,\r
323 IN UINT8 QuestionFlags,\r
324 IN UINT8 OneOfFlags,\r
325 IN IFR_OPTION *OptionsList,\r
326 IN UINTN OptionCount,\r
327 IN OUT EFI_HII_UPDATE_DATA *Data\r
328 )\r
329{\r
330 UINTN Length;\r
331 EFI_IFR_ONE_OF OneOf;\r
332 UINT8 *LocalBuffer;\r
333\r
334 ASSERT (Data != NULL && Data->Data != NULL);\r
335\r
336 if (!IsValidNumricFlags (OneOfFlags) ||\r
337 !IsValidQuestionFlags (QuestionFlags) ||\r
338 ((OptionCount != 0) && (OptionsList == NULL))) {\r
339 return EFI_INVALID_PARAMETER;\r
340 }\r
341\r
342 Length = sizeof (EFI_IFR_ONE_OF) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);\r
343 if (Data->Offset + Length > Data->BufferSize) {\r
344 return EFI_BUFFER_TOO_SMALL;\r
345 }\r
346\r
347 OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
e0096099 348 OneOf.Header.Length = (UINT8) sizeof (EFI_IFR_ONE_OF);\r
c7f33ca4 349 OneOf.Header.Scope = 1;\r
350 OneOf.Question.Header.Prompt = Prompt;\r
351 OneOf.Question.Header.Help = Help;\r
352 OneOf.Question.QuestionId = QuestionId;\r
353 OneOf.Question.VarStoreId = VarStoreId;\r
354 OneOf.Question.VarStoreInfo.VarOffset = VarOffset;\r
355 OneOf.Question.Flags = QuestionFlags;\r
356 OneOf.Flags = OneOfFlags;\r
357 EfiZeroMem ((VOID *) &OneOf.data, sizeof (MINMAXSTEP_DATA));\r
358\r
359 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
360 EfiCopyMem (LocalBuffer, &OneOf, sizeof (EFI_IFR_ONE_OF));\r
361 Data->Offset += sizeof (EFI_IFR_ONE_OF);\r
362\r
4cb43192 363 CreateOneOfOptionOpCode (OptionCount, OptionsList, (UINT8)(OneOfFlags & EFI_IFR_NUMERIC_SIZE), Data);\r
c7f33ca4 364\r
365 CreateEndOpCode (Data);\r
366\r
367 return EFI_SUCCESS;\r
368}\r
369\r
370EFI_STATUS\r
371CreateOrderedListOpCode (\r
372 IN EFI_QUESTION_ID QuestionId,\r
373 IN EFI_VARSTORE_ID VarStoreId,\r
374 IN UINT16 VarOffset,\r
375 IN EFI_STRING_ID Prompt,\r
376 IN EFI_STRING_ID Help,\r
377 IN UINT8 QuestionFlags,\r
378 IN UINT8 OrderedListFlags,\r
379 IN UINT8 DataType,\r
380 IN UINT8 MaxContainers,\r
381 IN IFR_OPTION *OptionsList,\r
382 IN UINTN OptionCount,\r
383 IN OUT EFI_HII_UPDATE_DATA *Data\r
384 )\r
385{\r
386 UINTN Length;\r
387 EFI_IFR_ORDERED_LIST OrderedList;\r
388 UINT8 *LocalBuffer;\r
389\r
390 ASSERT (Data != NULL && Data->Data != NULL);\r
391\r
392 if (!IsValidQuestionFlags (QuestionFlags) ||\r
393 ((OptionCount != 0) && (OptionsList == NULL))) {\r
394 return EFI_INVALID_PARAMETER;\r
395 }\r
396\r
3e99020d 397 if ((OrderedListFlags & (~(EFI_IFR_UNIQUE_SET | EFI_IFR_NO_EMPTY_SET))) != 0) {\r
c7f33ca4 398 return EFI_INVALID_PARAMETER;\r
399 }\r
400\r
401 Length = sizeof (EFI_IFR_ORDERED_LIST) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);\r
402 if (Data->Offset + Length > Data->BufferSize) {\r
403 return EFI_BUFFER_TOO_SMALL;\r
404 }\r
405\r
406 OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
e0096099 407 OrderedList.Header.Length = (UINT8) sizeof (EFI_IFR_ORDERED_LIST);\r
c7f33ca4 408 OrderedList.Header.Scope = 1;\r
409 OrderedList.Question.Header.Prompt = Prompt;\r
410 OrderedList.Question.Header.Help = Help;\r
411 OrderedList.Question.QuestionId = QuestionId;\r
412 OrderedList.Question.VarStoreId = VarStoreId;\r
413 OrderedList.Question.VarStoreInfo.VarOffset = VarOffset;\r
414 OrderedList.Question.Flags = QuestionFlags;\r
415 OrderedList.MaxContainers = MaxContainers;\r
416 OrderedList.Flags = OrderedListFlags;\r
417\r
418 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
419 EfiCopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST));\r
420 Data->Offset += sizeof (EFI_IFR_ORDERED_LIST);\r
421\r
422 CreateOneOfOptionOpCode (OptionCount, OptionsList, DataType, Data);\r
423\r
424 CreateEndOpCode (Data);\r
425\r
426 return EFI_SUCCESS;\r
427}\r
428\r
429EFI_STATUS\r
430CreateCheckBoxOpCode (\r
431 IN EFI_QUESTION_ID QuestionId,\r
432 IN EFI_VARSTORE_ID VarStoreId,\r
433 IN UINT16 VarOffset,\r
434 IN EFI_STRING_ID Prompt,\r
435 IN EFI_STRING_ID Help,\r
436 IN UINT8 QuestionFlags,\r
437 IN UINT8 CheckBoxFlags,\r
438 IN OUT EFI_HII_UPDATE_DATA *Data\r
439 )\r
440{\r
441 EFI_IFR_CHECKBOX CheckBox;\r
442 UINT8 *LocalBuffer;\r
443\r
444 ASSERT (Data != NULL && Data->Data != NULL);\r
445\r
446 if (!IsValidQuestionFlags (QuestionFlags) || !IsValidCheckboxFlags (CheckBoxFlags)) {\r
447 return EFI_INVALID_PARAMETER;\r
448 }\r
449\r
450 if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {\r
451 return EFI_BUFFER_TOO_SMALL;\r
452 }\r
453\r
454 CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
e0096099 455 CheckBox.Header.Length = (UINT8) sizeof (EFI_IFR_CHECKBOX);\r
c7f33ca4 456 CheckBox.Header.Scope = 0;\r
457 CheckBox.Question.QuestionId = QuestionId;\r
458 CheckBox.Question.VarStoreId = VarStoreId;\r
459 CheckBox.Question.VarStoreInfo.VarOffset = VarOffset;\r
460 CheckBox.Question.Header.Prompt = Prompt;\r
461 CheckBox.Question.Header.Help = Help;\r
462 CheckBox.Question.Flags = QuestionFlags;\r
463 CheckBox.Flags = CheckBoxFlags;\r
464\r
465 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
466 EfiCopyMem (LocalBuffer, &CheckBox, sizeof (EFI_IFR_CHECKBOX));\r
467 Data->Offset += sizeof (EFI_IFR_CHECKBOX);\r
468\r
469 return EFI_SUCCESS;\r
470}\r
471\r
472EFI_STATUS\r
473CreateNumericOpCode (\r
474 IN EFI_QUESTION_ID QuestionId,\r
475 IN EFI_VARSTORE_ID VarStoreId,\r
476 IN UINT16 VarOffset,\r
477 IN EFI_STRING_ID Prompt,\r
478 IN EFI_STRING_ID Help,\r
479 IN UINT8 QuestionFlags,\r
480 IN UINT8 NumericFlags,\r
481 IN UINT64 Minimum,\r
482 IN UINT64 Maximum,\r
483 IN UINT64 Step,\r
484 IN UINT64 Default,\r
485 IN OUT EFI_HII_UPDATE_DATA *Data\r
486 )\r
487{\r
488 UINTN Length;\r
489 EFI_STATUS Status;\r
490 EFI_IFR_NUMERIC Numeric;\r
491 MINMAXSTEP_DATA MinMaxStep;\r
492 EFI_IFR_TYPE_VALUE DefaultValue;\r
493 UINT8 *LocalBuffer;\r
494\r
495 ASSERT (Data != NULL && Data->Data != NULL);\r
496\r
497 if (!IsValidQuestionFlags (QuestionFlags) || !IsValidNumricFlags (NumericFlags)) {\r
498 return EFI_INVALID_PARAMETER;\r
499 }\r
500\r
501 Length = sizeof (EFI_IFR_NUMERIC) + sizeof (EFI_IFR_DEFAULT) + sizeof (EFI_IFR_END);\r
502 if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {\r
503 return EFI_BUFFER_TOO_SMALL;\r
504 }\r
505\r
506 Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
e0096099 507 Numeric.Header.Length = (UINT8) sizeof (EFI_IFR_NUMERIC);\r
c7f33ca4 508 Numeric.Header.Scope = 1;\r
509 Numeric.Question.QuestionId = QuestionId;\r
510 Numeric.Question.VarStoreId = VarStoreId;\r
511 Numeric.Question.VarStoreInfo.VarOffset = VarOffset;\r
512 Numeric.Question.Header.Prompt = Prompt;\r
513 Numeric.Question.Header.Help = Help;\r
514 Numeric.Question.Flags = QuestionFlags;\r
515 Numeric.Flags = NumericFlags;\r
516\r
517 switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) {\r
518 case EFI_IFR_NUMERIC_SIZE_1:\r
519 MinMaxStep.u8.MinValue = (UINT8) Minimum;\r
520 MinMaxStep.u8.MaxValue = (UINT8) Maximum;\r
521 MinMaxStep.u8.Step = (UINT8) Step;\r
522 break;\r
523\r
524 case EFI_IFR_NUMERIC_SIZE_2:\r
525 MinMaxStep.u16.MinValue = (UINT16) Minimum;\r
526 MinMaxStep.u16.MaxValue = (UINT16) Maximum;\r
527 MinMaxStep.u16.Step = (UINT16) Step;\r
528 break;\r
529\r
530 case EFI_IFR_NUMERIC_SIZE_4:\r
531 MinMaxStep.u32.MinValue = (UINT32) Minimum;\r
532 MinMaxStep.u32.MaxValue = (UINT32) Maximum;\r
533 MinMaxStep.u32.Step = (UINT32) Step;\r
534 break;\r
535\r
536 case EFI_IFR_NUMERIC_SIZE_8:\r
537 MinMaxStep.u64.MinValue = Minimum;\r
538 MinMaxStep.u64.MaxValue = Maximum;\r
539 MinMaxStep.u64.Step = Step;\r
540 break;\r
541 }\r
542\r
543 EfiCopyMem (&Numeric.data, &MinMaxStep, sizeof (MINMAXSTEP_DATA));\r
544\r
545 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
546 EfiCopyMem (LocalBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC));\r
547 Data->Offset += sizeof (EFI_IFR_NUMERIC);\r
548\r
549 DefaultValue.u64 = Default;\r
4cb43192 550 Status = CreateDefaultOpCode (&DefaultValue, (UINT8)(NumericFlags & EFI_IFR_NUMERIC_SIZE), Data);\r
c7f33ca4 551 if (EFI_ERROR(Status)) {\r
552 return Status;\r
553 }\r
554\r
555 CreateEndOpCode (Data);\r
556\r
557 return EFI_SUCCESS;\r
558}\r
559\r
560EFI_STATUS\r
561CreateStringOpCode (\r
562 IN EFI_QUESTION_ID QuestionId,\r
563 IN EFI_VARSTORE_ID VarStoreId,\r
564 IN UINT16 VarOffset,\r
565 IN EFI_STRING_ID Prompt,\r
566 IN EFI_STRING_ID Help,\r
567 IN UINT8 QuestionFlags,\r
568 IN UINT8 StringFlags,\r
569 IN UINT8 MinSize,\r
570 IN UINT8 MaxSize,\r
571 IN OUT EFI_HII_UPDATE_DATA *Data\r
572 )\r
573{\r
574 EFI_IFR_STRING String;\r
575 UINT8 *LocalBuffer;\r
576\r
577 ASSERT (Data != NULL && Data->Data != NULL);\r
578\r
579 if (!IsValidQuestionFlags (QuestionFlags) || (StringFlags & (~EFI_IFR_STRING_MULTI_LINE))) {\r
580 return EFI_INVALID_PARAMETER;\r
581 }\r
582\r
583 if (Data->Offset + sizeof (EFI_IFR_STRING) > Data->BufferSize) {\r
584 return EFI_BUFFER_TOO_SMALL;\r
585 }\r
586\r
587 String.Header.OpCode = EFI_IFR_STRING_OP;\r
e0096099 588 String.Header.Length = (UINT8) sizeof (EFI_IFR_STRING);\r
c7f33ca4 589 String.Header.Scope = 0;\r
590 String.Question.Header.Prompt = Prompt;\r
591 String.Question.Header.Help = Help;\r
592 String.Question.QuestionId = QuestionId;\r
593 String.Question.VarStoreId = VarStoreId;\r
594 String.Question.VarStoreInfo.VarOffset = VarOffset;\r
595 String.Question.Flags = QuestionFlags;\r
596 String.MinSize = MinSize;\r
597 String.MaxSize = MaxSize;\r
598 String.Flags = StringFlags;\r
599\r
600 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
601 EfiCopyMem (LocalBuffer, &String, sizeof (EFI_IFR_STRING));\r
602 Data->Offset += sizeof (EFI_IFR_STRING);\r
603\r
604 return EFI_SUCCESS;\r
605}\r
606\r
607EFI_STATUS\r
608CreateBannerOpCode (\r
609 IN EFI_STRING_ID Title,\r
610 IN UINT16 LineNumber,\r
611 IN UINT8 Alignment,\r
612 IN OUT EFI_HII_UPDATE_DATA *Data\r
613 )\r
614{\r
615 EFI_IFR_GUID_BANNER Banner;\r
616 UINT8 *LocalBuffer;\r
617\r
618 ASSERT (Data != NULL && Data->Data != NULL);\r
619\r
620 if (Data->Offset + sizeof (EFI_IFR_GUID_BANNER) > Data->BufferSize) {\r
621 return EFI_BUFFER_TOO_SMALL;\r
622 }\r
623\r
624 Banner.Header.OpCode = EFI_IFR_GUID_OP;\r
e0096099 625 Banner.Header.Length = (UINT8) sizeof (EFI_IFR_GUID_BANNER);\r
c7f33ca4 626 Banner.Header.Scope = 0;\r
627 EfiCopyMem (&Banner.Guid, &mIfrVendorGuid, sizeof (EFI_IFR_GUID));\r
628 Banner.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
629 Banner.Title = Title;\r
630 Banner.LineNumber = LineNumber;\r
631 Banner.Alignment = Alignment;\r
632\r
633 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
634 EfiCopyMem (LocalBuffer, &Banner, sizeof (EFI_IFR_GUID_BANNER));\r
635 Data->Offset += sizeof (EFI_IFR_GUID_BANNER);\r
636\r
637 return EFI_SUCCESS;\r
638}\r