]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrOpCodeCreation.c
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / UefiEfiIfrSupportLib / UefiIfrOpCodeCreation.c
CommitLineData
c7f33ca4 1/*++\r
2\r
4ea9375a
HT
3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
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
87 End.Header.Length = sizeof (EFI_IFR_END);\r
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
119 Default.Header.Length = sizeof (EFI_IFR_DEFAULT);\r
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
156 Action.Header.Length = sizeof (EFI_IFR_ACTION);\r
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
191 Subtitle.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
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
223 Text.Header.Length = sizeof (EFI_IFR_TEXT);\r
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
260 Goto.Header.Length = sizeof (EFI_IFR_REF);\r
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
300 OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);\r
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
348 OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF);\r
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
397 if ((OrderedListFlags != 0) &&\r
398 (OrderedListFlags != EFI_IFR_UNIQUE_SET) &&\r
399 (OrderedListFlags != EFI_IFR_NO_EMPTY_SET)) {\r
400 return EFI_INVALID_PARAMETER;\r
401 }\r
402\r
403 Length = sizeof (EFI_IFR_ORDERED_LIST) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);\r
404 if (Data->Offset + Length > Data->BufferSize) {\r
405 return EFI_BUFFER_TOO_SMALL;\r
406 }\r
407\r
408 OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
409 OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST);\r
410 OrderedList.Header.Scope = 1;\r
411 OrderedList.Question.Header.Prompt = Prompt;\r
412 OrderedList.Question.Header.Help = Help;\r
413 OrderedList.Question.QuestionId = QuestionId;\r
414 OrderedList.Question.VarStoreId = VarStoreId;\r
415 OrderedList.Question.VarStoreInfo.VarOffset = VarOffset;\r
416 OrderedList.Question.Flags = QuestionFlags;\r
417 OrderedList.MaxContainers = MaxContainers;\r
418 OrderedList.Flags = OrderedListFlags;\r
419\r
420 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
421 EfiCopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST));\r
422 Data->Offset += sizeof (EFI_IFR_ORDERED_LIST);\r
423\r
424 CreateOneOfOptionOpCode (OptionCount, OptionsList, DataType, Data);\r
425\r
426 CreateEndOpCode (Data);\r
427\r
428 return EFI_SUCCESS;\r
429}\r
430\r
431EFI_STATUS\r
432CreateCheckBoxOpCode (\r
433 IN EFI_QUESTION_ID QuestionId,\r
434 IN EFI_VARSTORE_ID VarStoreId,\r
435 IN UINT16 VarOffset,\r
436 IN EFI_STRING_ID Prompt,\r
437 IN EFI_STRING_ID Help,\r
438 IN UINT8 QuestionFlags,\r
439 IN UINT8 CheckBoxFlags,\r
440 IN OUT EFI_HII_UPDATE_DATA *Data\r
441 )\r
442{\r
443 EFI_IFR_CHECKBOX CheckBox;\r
444 UINT8 *LocalBuffer;\r
445\r
446 ASSERT (Data != NULL && Data->Data != NULL);\r
447\r
448 if (!IsValidQuestionFlags (QuestionFlags) || !IsValidCheckboxFlags (CheckBoxFlags)) {\r
449 return EFI_INVALID_PARAMETER;\r
450 }\r
451\r
452 if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {\r
453 return EFI_BUFFER_TOO_SMALL;\r
454 }\r
455\r
456 CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
457 CheckBox.Header.Length = sizeof (EFI_IFR_CHECKBOX);\r
458 CheckBox.Header.Scope = 0;\r
459 CheckBox.Question.QuestionId = QuestionId;\r
460 CheckBox.Question.VarStoreId = VarStoreId;\r
461 CheckBox.Question.VarStoreInfo.VarOffset = VarOffset;\r
462 CheckBox.Question.Header.Prompt = Prompt;\r
463 CheckBox.Question.Header.Help = Help;\r
464 CheckBox.Question.Flags = QuestionFlags;\r
465 CheckBox.Flags = CheckBoxFlags;\r
466\r
467 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
468 EfiCopyMem (LocalBuffer, &CheckBox, sizeof (EFI_IFR_CHECKBOX));\r
469 Data->Offset += sizeof (EFI_IFR_CHECKBOX);\r
470\r
471 return EFI_SUCCESS;\r
472}\r
473\r
474EFI_STATUS\r
475CreateNumericOpCode (\r
476 IN EFI_QUESTION_ID QuestionId,\r
477 IN EFI_VARSTORE_ID VarStoreId,\r
478 IN UINT16 VarOffset,\r
479 IN EFI_STRING_ID Prompt,\r
480 IN EFI_STRING_ID Help,\r
481 IN UINT8 QuestionFlags,\r
482 IN UINT8 NumericFlags,\r
483 IN UINT64 Minimum,\r
484 IN UINT64 Maximum,\r
485 IN UINT64 Step,\r
486 IN UINT64 Default,\r
487 IN OUT EFI_HII_UPDATE_DATA *Data\r
488 )\r
489{\r
490 UINTN Length;\r
491 EFI_STATUS Status;\r
492 EFI_IFR_NUMERIC Numeric;\r
493 MINMAXSTEP_DATA MinMaxStep;\r
494 EFI_IFR_TYPE_VALUE DefaultValue;\r
495 UINT8 *LocalBuffer;\r
496\r
497 ASSERT (Data != NULL && Data->Data != NULL);\r
498\r
499 if (!IsValidQuestionFlags (QuestionFlags) || !IsValidNumricFlags (NumericFlags)) {\r
500 return EFI_INVALID_PARAMETER;\r
501 }\r
502\r
503 Length = sizeof (EFI_IFR_NUMERIC) + sizeof (EFI_IFR_DEFAULT) + sizeof (EFI_IFR_END);\r
504 if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {\r
505 return EFI_BUFFER_TOO_SMALL;\r
506 }\r
507\r
508 Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
509 Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC);\r
510 Numeric.Header.Scope = 1;\r
511 Numeric.Question.QuestionId = QuestionId;\r
512 Numeric.Question.VarStoreId = VarStoreId;\r
513 Numeric.Question.VarStoreInfo.VarOffset = VarOffset;\r
514 Numeric.Question.Header.Prompt = Prompt;\r
515 Numeric.Question.Header.Help = Help;\r
516 Numeric.Question.Flags = QuestionFlags;\r
517 Numeric.Flags = NumericFlags;\r
518\r
519 switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) {\r
520 case EFI_IFR_NUMERIC_SIZE_1:\r
521 MinMaxStep.u8.MinValue = (UINT8) Minimum;\r
522 MinMaxStep.u8.MaxValue = (UINT8) Maximum;\r
523 MinMaxStep.u8.Step = (UINT8) Step;\r
524 break;\r
525\r
526 case EFI_IFR_NUMERIC_SIZE_2:\r
527 MinMaxStep.u16.MinValue = (UINT16) Minimum;\r
528 MinMaxStep.u16.MaxValue = (UINT16) Maximum;\r
529 MinMaxStep.u16.Step = (UINT16) Step;\r
530 break;\r
531\r
532 case EFI_IFR_NUMERIC_SIZE_4:\r
533 MinMaxStep.u32.MinValue = (UINT32) Minimum;\r
534 MinMaxStep.u32.MaxValue = (UINT32) Maximum;\r
535 MinMaxStep.u32.Step = (UINT32) Step;\r
536 break;\r
537\r
538 case EFI_IFR_NUMERIC_SIZE_8:\r
539 MinMaxStep.u64.MinValue = Minimum;\r
540 MinMaxStep.u64.MaxValue = Maximum;\r
541 MinMaxStep.u64.Step = Step;\r
542 break;\r
543 }\r
544\r
545 EfiCopyMem (&Numeric.data, &MinMaxStep, sizeof (MINMAXSTEP_DATA));\r
546\r
547 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
548 EfiCopyMem (LocalBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC));\r
549 Data->Offset += sizeof (EFI_IFR_NUMERIC);\r
550\r
551 DefaultValue.u64 = Default;\r
4cb43192 552 Status = CreateDefaultOpCode (&DefaultValue, (UINT8)(NumericFlags & EFI_IFR_NUMERIC_SIZE), Data);\r
c7f33ca4 553 if (EFI_ERROR(Status)) {\r
554 return Status;\r
555 }\r
556\r
557 CreateEndOpCode (Data);\r
558\r
559 return EFI_SUCCESS;\r
560}\r
561\r
562EFI_STATUS\r
563CreateStringOpCode (\r
564 IN EFI_QUESTION_ID QuestionId,\r
565 IN EFI_VARSTORE_ID VarStoreId,\r
566 IN UINT16 VarOffset,\r
567 IN EFI_STRING_ID Prompt,\r
568 IN EFI_STRING_ID Help,\r
569 IN UINT8 QuestionFlags,\r
570 IN UINT8 StringFlags,\r
571 IN UINT8 MinSize,\r
572 IN UINT8 MaxSize,\r
573 IN OUT EFI_HII_UPDATE_DATA *Data\r
574 )\r
575{\r
576 EFI_IFR_STRING String;\r
577 UINT8 *LocalBuffer;\r
578\r
579 ASSERT (Data != NULL && Data->Data != NULL);\r
580\r
581 if (!IsValidQuestionFlags (QuestionFlags) || (StringFlags & (~EFI_IFR_STRING_MULTI_LINE))) {\r
582 return EFI_INVALID_PARAMETER;\r
583 }\r
584\r
585 if (Data->Offset + sizeof (EFI_IFR_STRING) > Data->BufferSize) {\r
586 return EFI_BUFFER_TOO_SMALL;\r
587 }\r
588\r
589 String.Header.OpCode = EFI_IFR_STRING_OP;\r
590 String.Header.Length = sizeof (EFI_IFR_STRING);\r
591 String.Header.Scope = 0;\r
592 String.Question.Header.Prompt = Prompt;\r
593 String.Question.Header.Help = Help;\r
594 String.Question.QuestionId = QuestionId;\r
595 String.Question.VarStoreId = VarStoreId;\r
596 String.Question.VarStoreInfo.VarOffset = VarOffset;\r
597 String.Question.Flags = QuestionFlags;\r
598 String.MinSize = MinSize;\r
599 String.MaxSize = MaxSize;\r
600 String.Flags = StringFlags;\r
601\r
602 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
603 EfiCopyMem (LocalBuffer, &String, sizeof (EFI_IFR_STRING));\r
604 Data->Offset += sizeof (EFI_IFR_STRING);\r
605\r
606 return EFI_SUCCESS;\r
607}\r
608\r
609EFI_STATUS\r
610CreateBannerOpCode (\r
611 IN EFI_STRING_ID Title,\r
612 IN UINT16 LineNumber,\r
613 IN UINT8 Alignment,\r
614 IN OUT EFI_HII_UPDATE_DATA *Data\r
615 )\r
616{\r
617 EFI_IFR_GUID_BANNER Banner;\r
618 UINT8 *LocalBuffer;\r
619\r
620 ASSERT (Data != NULL && Data->Data != NULL);\r
621\r
622 if (Data->Offset + sizeof (EFI_IFR_GUID_BANNER) > Data->BufferSize) {\r
623 return EFI_BUFFER_TOO_SMALL;\r
624 }\r
625\r
626 Banner.Header.OpCode = EFI_IFR_GUID_OP;\r
627 Banner.Header.Length = sizeof (EFI_IFR_GUID_BANNER);\r
628 Banner.Header.Scope = 0;\r
629 EfiCopyMem (&Banner.Guid, &mIfrVendorGuid, sizeof (EFI_IFR_GUID));\r
630 Banner.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
631 Banner.Title = Title;\r
632 Banner.LineNumber = LineNumber;\r
633 Banner.Alignment = Alignment;\r
634\r
635 LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
636 EfiCopyMem (LocalBuffer, &Banner, sizeof (EFI_IFR_GUID_BANNER));\r
637 Data->Offset += sizeof (EFI_IFR_GUID_BANNER);\r
638\r
639 return EFI_SUCCESS;\r
640}\r