2 Library Routines to create IFR independent of string data - assume tokens already exist
3 Primarily to be used for exporting op-codes at a label in pre-defined forms.
6 Copyright (c) 2007, Intel Corporation
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "UefiIfrLibraryInternal.h"
21 Check if the input question flags is a valid value.
22 The valid combination of question flags includes
23 EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY.
25 @param Flags The question flags to check.
27 @retval TRUE If the question flag is a valid combination.
28 @retval FALSE If the question flag is an invalid combination.
32 IsValidQuestionFlags (
36 return (BOOLEAN
) (((Flags
& QUESTION_FLAGS_MASK
) != 0) ? FALSE
: TRUE
);
40 Check if the input value type is a valid type.
41 The valid value type is smaller or equal than EFI_IFR_TYPE_OTHER.
43 @param Type The value type to check.
45 @retval TRUE If the value type is valid.
46 @retval FALSE If the value type is invalid.
54 return (BOOLEAN
) ((Type
<= EFI_IFR_TYPE_OTHER
) ? TRUE
: FALSE
);
58 Check if the input numeric flags is a valid value.
60 @param Flags The numeric flags to check.
62 @retval TRUE If the numeric flags is valid.
63 @retval FALSE If the numeric flags is invalid.
71 if ((Flags
& ~(EFI_IFR_NUMERIC_SIZE
| EFI_IFR_DISPLAY
)) != 0) {
75 if ((Flags
& EFI_IFR_DISPLAY
) > EFI_IFR_DISPLAY_UINT_HEX
) {
83 Check if the checkbox flags is a valid value.
85 @param Flags The checkbox flags to check.
87 @retval TRUE If the checkbox flags is valid.
88 @retval FALSE If the checkbox flags is invalid.
92 IsValidCheckboxFlags (
96 return (BOOLEAN
) ((Flags
<= EFI_IFR_CHECKBOX_DEFAULT_MFG
) ? TRUE
: FALSE
);
100 Create EFI_IFR_END_OP opcode.
102 If Data is NULL or Data->Data is NULL, then ASSERT.
104 @param Data Destination for the created opcode binary
106 @retval EFI_SUCCESS Opcode is created successfully.
107 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
113 IN OUT EFI_HII_UPDATE_DATA
*Data
119 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
121 if (Data
->Offset
+ sizeof (EFI_IFR_END
) > Data
->BufferSize
) {
122 return EFI_BUFFER_TOO_SMALL
;
125 End
.Header
.Length
= sizeof (EFI_IFR_END
);
126 End
.Header
.OpCode
= EFI_IFR_END_OP
;
127 End
.Header
.Scope
= 0;
129 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
131 // CopyMem is used for EFI_IFR_END to cover the unaligned address access.
133 CopyMem (LocalBuffer
, &End
, sizeof (EFI_IFR_END
));
134 Data
->Offset
+= sizeof (EFI_IFR_END
);
140 Create EFI_IFR_DEFAULT_OP opcode.
142 If Data is NULL or Data->Data is NULL, then ASSERT.
144 @param Value Value for the default
145 @param Type Type for the default
146 @param Data Destination for the created opcode binary
148 @retval EFI_SUCCESS Opcode is created successfully.
149 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
150 @retval EFI_INVALID_PARAMETER The type is not valid.
155 CreateDefaultOpCode (
156 IN EFI_IFR_TYPE_VALUE
*Value
,
158 IN OUT EFI_HII_UPDATE_DATA
*Data
161 EFI_IFR_DEFAULT Default
;
164 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
166 if ((Value
== NULL
) || !IsValidValueType (Type
)) {
167 return EFI_INVALID_PARAMETER
;
170 if (Data
->Offset
+ sizeof (EFI_IFR_DEFAULT
) > Data
->BufferSize
) {
171 return EFI_BUFFER_TOO_SMALL
;
174 Default
.Header
.OpCode
= EFI_IFR_DEFAULT_OP
;
175 Default
.Header
.Length
= sizeof (EFI_IFR_DEFAULT
);
176 Default
.Header
.Scope
= 0;
178 Default
.DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
;
179 CopyMem (&Default
.Value
, Value
, sizeof(EFI_IFR_TYPE_VALUE
));
181 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
183 // CopyMem is used for EFI_IFR_DEFAULT to cover the unaligned address access.
185 CopyMem (LocalBuffer
, &Default
, sizeof (EFI_IFR_DEFAULT
));
186 Data
->Offset
+= sizeof (EFI_IFR_DEFAULT
);
192 Create EFI_IFR_ACTION_OP opcode.
194 If Data is NULL or Data->Data is NULL, then ASSERT.
196 @param QuestionId Question ID
197 @param Prompt String ID for Prompt
198 @param Help String ID for Help
199 @param QuestionFlags Flags in Question Header
200 @param QuestionConfig String ID for configuration
201 @param Data Destination for the created opcode binary
203 @retval EFI_SUCCESS Opcode is created successfully.
204 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
205 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
211 IN EFI_QUESTION_ID QuestionId
,
212 IN EFI_STRING_ID Prompt
,
213 IN EFI_STRING_ID Help
,
214 IN UINT8 QuestionFlags
,
215 IN EFI_STRING_ID QuestionConfig
,
216 IN OUT EFI_HII_UPDATE_DATA
*Data
219 EFI_IFR_ACTION Action
;
222 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
224 if (!IsValidQuestionFlags (QuestionFlags
)) {
225 return EFI_INVALID_PARAMETER
;
228 if (Data
->Offset
+ sizeof (EFI_IFR_ACTION
) > Data
->BufferSize
) {
229 return EFI_BUFFER_TOO_SMALL
;
232 Action
.Header
.OpCode
= EFI_IFR_ACTION_OP
;
233 Action
.Header
.Length
= sizeof (EFI_IFR_ACTION
);
234 Action
.Header
.Scope
= 0;
235 Action
.Question
.QuestionId
= QuestionId
;
236 Action
.Question
.Header
.Prompt
= Prompt
;
237 Action
.Question
.Header
.Help
= Help
;
238 Action
.Question
.VarStoreId
= INVALID_VARSTORE_ID
;
239 Action
.Question
.Flags
= QuestionFlags
;
240 Action
.QuestionConfig
= QuestionConfig
;
242 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
244 // CopyMem is used for EFI_IFR_ACTION to cover the unaligned address access.
246 CopyMem (LocalBuffer
, &Action
, sizeof (EFI_IFR_ACTION
));
247 Data
->Offset
+= sizeof (EFI_IFR_ACTION
);
253 Create EFI_IFR_SUBTITLE_OP opcode.
255 If Data is NULL or Data->Data is NULL, then ASSERT.
257 @param Prompt String ID for Prompt
258 @param Help String ID for Help
259 @param Flags Subtitle opcode flags
260 @param Scope Subtitle Scope bit
261 @param Data Destination for the created opcode binary
263 @retval EFI_SUCCESS Opcode is created successfully.
264 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
269 CreateSubTitleOpCode (
270 IN EFI_STRING_ID Prompt
,
271 IN EFI_STRING_ID Help
,
274 IN OUT EFI_HII_UPDATE_DATA
*Data
277 EFI_IFR_SUBTITLE Subtitle
;
280 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
282 if (Data
->Offset
+ sizeof (EFI_IFR_SUBTITLE
) > Data
->BufferSize
) {
283 return EFI_BUFFER_TOO_SMALL
;
286 Subtitle
.Header
.OpCode
= EFI_IFR_SUBTITLE_OP
;
287 Subtitle
.Header
.Length
= sizeof (EFI_IFR_SUBTITLE
);
288 Subtitle
.Header
.Scope
= Scope
;
289 Subtitle
.Statement
.Prompt
= Prompt
;
290 Subtitle
.Statement
.Help
= Help
;
291 Subtitle
.Flags
= Flags
;
293 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
295 // CopyMem is used for EFI_IFR_SUBTITLE to cover the unaligned address access.
297 CopyMem (LocalBuffer
, &Subtitle
, sizeof (EFI_IFR_SUBTITLE
));
298 Data
->Offset
+= sizeof (EFI_IFR_SUBTITLE
);
305 Create EFI_IFR_TEXT_OP opcode.
307 If Data is NULL or Data->Data is NULL, then ASSERT.
309 @param Prompt String ID for Prompt
310 @param Help String ID for Help
311 @param TextTwo String ID for text two
312 @param Data Destination for the created opcode binary
314 @retval EFI_SUCCESS Opcode is created successfully.
315 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
321 IN EFI_STRING_ID Prompt
,
322 IN EFI_STRING_ID Help
,
323 IN EFI_STRING_ID TextTwo
,
324 IN OUT EFI_HII_UPDATE_DATA
*Data
330 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
332 if (Data
->Offset
+ sizeof (EFI_IFR_TEXT
) > Data
->BufferSize
) {
333 return EFI_BUFFER_TOO_SMALL
;
336 Text
.Header
.OpCode
= EFI_IFR_TEXT_OP
;
337 Text
.Header
.Length
= sizeof (EFI_IFR_TEXT
);
338 Text
.Header
.Scope
= 0;
339 Text
.Statement
.Prompt
= Prompt
;
340 Text
.Statement
.Help
= Help
;
341 Text
.TextTwo
= TextTwo
;
343 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
345 // CopyMem is used for EFI_IFR_TEXT to cover the unaligned address access.
347 CopyMem (LocalBuffer
, &Text
, sizeof (EFI_IFR_TEXT
));
348 Data
->Offset
+= sizeof (EFI_IFR_TEXT
);
354 Create EFI_IFR_REF_OP opcode.
356 If Data is NULL or Data->Data is NULL, then ASSERT.
358 @param FormId Destination Form ID
359 @param Prompt String ID for Prompt
360 @param Help String ID for Help
361 @param QuestionFlags Flags in Question Header
362 @param QuestionId Question ID
363 @param Data Destination for the created opcode binary
365 @retval EFI_SUCCESS Opcode is created successfully.
366 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
367 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
373 IN EFI_FORM_ID FormId
,
374 IN EFI_STRING_ID Prompt
,
375 IN EFI_STRING_ID Help
,
376 IN UINT8 QuestionFlags
,
377 IN EFI_QUESTION_ID QuestionId
,
378 IN OUT EFI_HII_UPDATE_DATA
*Data
384 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
386 if (!IsValidQuestionFlags (QuestionFlags
)) {
387 return EFI_INVALID_PARAMETER
;
390 if (Data
->Offset
+ sizeof (EFI_IFR_REF
) > Data
->BufferSize
) {
391 return EFI_BUFFER_TOO_SMALL
;
394 Goto
.Header
.OpCode
= EFI_IFR_REF_OP
;
395 Goto
.Header
.Length
= sizeof (EFI_IFR_REF
);
396 Goto
.Header
.Scope
= 0;
397 Goto
.Question
.Header
.Prompt
= Prompt
;
398 Goto
.Question
.Header
.Help
= Help
;
399 Goto
.Question
.VarStoreId
= INVALID_VARSTORE_ID
;
400 Goto
.Question
.QuestionId
= QuestionId
;
401 Goto
.Question
.Flags
= QuestionFlags
;
402 Goto
.FormId
= FormId
;
404 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
406 // CopyMem is used for EFI_IFR_REF to cover the unaligned address access.
408 CopyMem (LocalBuffer
, &Goto
, sizeof (EFI_IFR_REF
));
409 Data
->Offset
+= sizeof (EFI_IFR_REF
);
415 Create EFI_IFR_ONE_OF_OPTION_OP opcode.
417 If Data is NULL or Data->Data is NULL, then ASSERT.
419 @param OptionCount The number of options.
420 @param OptionsList The list of Options.
421 @param Type The data type.
422 @param Data Destination for the created opcode binary
424 @retval EFI_SUCCESS Opcode is created successfully.
425 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
426 @retval EFI_INVALID_PARAMETER If OptionCount is not zero but OptionsList is NULL.
431 CreateOneOfOptionOpCode (
432 IN UINTN OptionCount
,
433 IN IFR_OPTION
*OptionsList
,
435 IN OUT EFI_HII_UPDATE_DATA
*Data
440 EFI_IFR_ONE_OF_OPTION OneOfOption
;
442 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
444 if ((OptionCount
!= 0) && (OptionsList
== NULL
)) {
445 return EFI_INVALID_PARAMETER
;
448 if (Data
->Offset
+ OptionCount
* sizeof (EFI_IFR_ONE_OF_OPTION
) > Data
->BufferSize
) {
449 return EFI_BUFFER_TOO_SMALL
;
452 for (Index
= 0; Index
< OptionCount
; Index
++) {
453 OneOfOption
.Header
.OpCode
= EFI_IFR_ONE_OF_OPTION_OP
;
454 OneOfOption
.Header
.Length
= sizeof (EFI_IFR_ONE_OF_OPTION
);
455 OneOfOption
.Header
.Scope
= 0;
457 OneOfOption
.Option
= OptionsList
[Index
].StringToken
;
458 OneOfOption
.Value
= OptionsList
[Index
].Value
;
459 OneOfOption
.Flags
= (UINT8
) (OptionsList
[Index
].Flags
& (EFI_IFR_OPTION_DEFAULT
| EFI_IFR_OPTION_DEFAULT_MFG
));
460 OneOfOption
.Type
= Type
;
462 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
464 // CopyMem is used for EFI_IFR_ONF_OF_OPTION to cover the unaligned address access.
466 CopyMem (LocalBuffer
, &OneOfOption
, sizeof (EFI_IFR_ONE_OF_OPTION
));
467 Data
->Offset
+= sizeof (EFI_IFR_ONE_OF_OPTION
);
474 Create EFI_IFR_ONE_OF_OP opcode.
476 If Data is NULL or Data->Data is NULL, then ASSERT.
478 @param QuestionId Question ID
479 @param VarStoreId Storage ID
480 @param VarOffset Offset in Storage
481 @param Prompt String ID for Prompt
482 @param Help String ID for Help
483 @param QuestionFlags Flags in Question Header
484 @param OneOfFlags Flags for oneof opcode
485 @param OptionsList List of options
486 @param OptionCount Number of options in option list
487 @param Data Destination for the created opcode binary
489 @retval EFI_SUCCESS Opcode is created successfully.
490 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
491 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
497 IN EFI_QUESTION_ID QuestionId
,
498 IN EFI_VARSTORE_ID VarStoreId
,
500 IN EFI_STRING_ID Prompt
,
501 IN EFI_STRING_ID Help
,
502 IN UINT8 QuestionFlags
,
504 IN IFR_OPTION
*OptionsList
,
505 IN UINTN OptionCount
,
506 IN OUT EFI_HII_UPDATE_DATA
*Data
510 EFI_IFR_ONE_OF OneOf
;
513 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
515 if (!IsValidNumricFlags (OneOfFlags
) ||
516 !IsValidQuestionFlags (QuestionFlags
) ||
517 ((OptionCount
!= 0) && (OptionsList
== NULL
))) {
518 return EFI_INVALID_PARAMETER
;
521 Length
= sizeof (EFI_IFR_ONE_OF
) + OptionCount
* sizeof (EFI_IFR_ONE_OF_OPTION
) + sizeof (EFI_IFR_END
);
522 if (Data
->Offset
+ Length
> Data
->BufferSize
) {
523 return EFI_BUFFER_TOO_SMALL
;
526 OneOf
.Header
.OpCode
= EFI_IFR_ONE_OF_OP
;
527 OneOf
.Header
.Length
= sizeof (EFI_IFR_ONE_OF
);
528 OneOf
.Header
.Scope
= 1;
529 OneOf
.Question
.Header
.Prompt
= Prompt
;
530 OneOf
.Question
.Header
.Help
= Help
;
531 OneOf
.Question
.QuestionId
= QuestionId
;
532 OneOf
.Question
.VarStoreId
= VarStoreId
;
533 OneOf
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
534 OneOf
.Question
.Flags
= QuestionFlags
;
535 OneOf
.Flags
= OneOfFlags
;
536 ZeroMem ((VOID
*) &OneOf
.data
, sizeof (MINMAXSTEP_DATA
));
538 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
540 // CopyMem is used for EFI_IFR_ONF_OF to cover the unaligned address access.
542 CopyMem (LocalBuffer
, &OneOf
, sizeof (EFI_IFR_ONE_OF
));
543 Data
->Offset
+= sizeof (EFI_IFR_ONE_OF
);
545 CreateOneOfOptionOpCode (OptionCount
, OptionsList
, (UINT8
) (OneOfFlags
& EFI_IFR_NUMERIC_SIZE
), Data
);
547 CreateEndOpCode (Data
);
553 Create EFI_IFR_ORDERED_LIST_OP opcode.
555 If Data is NULL or Data->Data is NULL, then ASSERT.
557 @param QuestionId Question ID
558 @param VarStoreId Storage ID
559 @param VarOffset Offset in Storage
560 @param Prompt String ID for Prompt
561 @param Help String ID for Help
562 @param QuestionFlags Flags in Question Header
563 @param OrderedListFlags Flags for ordered list opcode
564 @param DataType Type for option value
565 @param MaxContainers Maximum count for options in this ordered list
566 @param OptionsList List of options
567 @param OptionCount Number of options in option list
568 @param Data Destination for the created opcode binary
570 @retval EFI_SUCCESS Opcode is created successfully.
571 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
572 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
577 CreateOrderedListOpCode (
578 IN EFI_QUESTION_ID QuestionId
,
579 IN EFI_VARSTORE_ID VarStoreId
,
581 IN EFI_STRING_ID Prompt
,
582 IN EFI_STRING_ID Help
,
583 IN UINT8 QuestionFlags
,
584 IN UINT8 OrderedListFlags
,
586 IN UINT8 MaxContainers
,
587 IN IFR_OPTION
*OptionsList
,
588 IN UINTN OptionCount
,
589 IN OUT EFI_HII_UPDATE_DATA
*Data
593 EFI_IFR_ORDERED_LIST OrderedList
;
596 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
598 if (!IsValidQuestionFlags (QuestionFlags
) ||
599 ((OptionCount
!= 0) && (OptionsList
== NULL
))) {
600 return EFI_INVALID_PARAMETER
;
603 if ((OrderedListFlags
!= 0) &&
604 (OrderedListFlags
!= EFI_IFR_UNIQUE_SET
) &&
605 (OrderedListFlags
!= EFI_IFR_NO_EMPTY_SET
)) {
606 return EFI_INVALID_PARAMETER
;
609 Length
= sizeof (EFI_IFR_ORDERED_LIST
) + OptionCount
* sizeof (EFI_IFR_ONE_OF_OPTION
) + sizeof (EFI_IFR_END
);
610 if (Data
->Offset
+ Length
> Data
->BufferSize
) {
611 return EFI_BUFFER_TOO_SMALL
;
614 OrderedList
.Header
.OpCode
= EFI_IFR_ORDERED_LIST_OP
;
615 OrderedList
.Header
.Length
= sizeof (EFI_IFR_ORDERED_LIST
);
616 OrderedList
.Header
.Scope
= 1;
617 OrderedList
.Question
.Header
.Prompt
= Prompt
;
618 OrderedList
.Question
.Header
.Help
= Help
;
619 OrderedList
.Question
.QuestionId
= QuestionId
;
620 OrderedList
.Question
.VarStoreId
= VarStoreId
;
621 OrderedList
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
622 OrderedList
.Question
.Flags
= QuestionFlags
;
623 OrderedList
.MaxContainers
= MaxContainers
;
624 OrderedList
.Flags
= OrderedListFlags
;
626 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
628 // CopyMem is used for EFI_IFR_ORDERED_LIST to cover the unaligned address access.
630 CopyMem (LocalBuffer
, &OrderedList
, sizeof (EFI_IFR_ORDERED_LIST
));
631 Data
->Offset
+= sizeof (EFI_IFR_ORDERED_LIST
);
633 CreateOneOfOptionOpCode (OptionCount
, OptionsList
, DataType
, Data
);
635 CreateEndOpCode (Data
);
641 Create EFI_IFR_CHECKBOX_OP opcode.
643 If Data is NULL or Data->Data is NULL, then ASSERT.
645 @param QuestionId Question ID
646 @param VarStoreId Storage ID
647 @param VarOffset Offset in Storage
648 @param Prompt String ID for Prompt
649 @param Help String ID for Help
650 @param QuestionFlags Flags in Question Header
651 @param CheckBoxFlags Flags for checkbox opcode
652 @param Data Destination for the created opcode binary
654 @retval EFI_SUCCESS Opcode is created successfully.
655 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
656 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
661 CreateCheckBoxOpCode (
662 IN EFI_QUESTION_ID QuestionId
,
663 IN EFI_VARSTORE_ID VarStoreId
,
665 IN EFI_STRING_ID Prompt
,
666 IN EFI_STRING_ID Help
,
667 IN UINT8 QuestionFlags
,
668 IN UINT8 CheckBoxFlags
,
669 IN OUT EFI_HII_UPDATE_DATA
*Data
672 EFI_IFR_CHECKBOX CheckBox
;
675 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
677 if (!IsValidQuestionFlags (QuestionFlags
) || !IsValidCheckboxFlags (CheckBoxFlags
)) {
678 return EFI_INVALID_PARAMETER
;
681 if (Data
->Offset
+ sizeof (EFI_IFR_CHECKBOX
) > Data
->BufferSize
) {
682 return EFI_BUFFER_TOO_SMALL
;
685 CheckBox
.Header
.OpCode
= EFI_IFR_CHECKBOX_OP
;
686 CheckBox
.Header
.Length
= sizeof (EFI_IFR_CHECKBOX
);
687 CheckBox
.Header
.Scope
= 0;
688 CheckBox
.Question
.QuestionId
= QuestionId
;
689 CheckBox
.Question
.VarStoreId
= VarStoreId
;
690 CheckBox
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
691 CheckBox
.Question
.Header
.Prompt
= Prompt
;
692 CheckBox
.Question
.Header
.Help
= Help
;
693 CheckBox
.Question
.Flags
= QuestionFlags
;
694 CheckBox
.Flags
= CheckBoxFlags
;
696 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
698 // CopyMem is used for EFI_IFR_CHECKBOX to cover the unaligned address access.
700 CopyMem (LocalBuffer
, &CheckBox
, sizeof (EFI_IFR_CHECKBOX
));
701 Data
->Offset
+= sizeof (EFI_IFR_CHECKBOX
);
707 Create EFI_IFR_NUMERIC_OP opcode.
709 If Data is NULL or Data->Data is NULL, then ASSERT.
711 @param QuestionId Question ID
712 @param VarStoreId Storage ID
713 @param VarOffset Offset in Storage
714 @param Prompt String ID for Prompt
715 @param Help String ID for Help
716 @param QuestionFlags Flags in Question Header
717 @param NumericFlags Flags for numeric opcode
718 @param Minimum Numeric minimum value
719 @param Maximum Numeric maximum value
720 @param Step Numeric step for edit
721 @param Default Numeric default value
722 @param Data Destination for the created opcode binary
724 @retval EFI_SUCCESS Opcode is created successfully.
725 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
726 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
731 CreateNumericOpCode (
732 IN EFI_QUESTION_ID QuestionId
,
733 IN EFI_VARSTORE_ID VarStoreId
,
735 IN EFI_STRING_ID Prompt
,
736 IN EFI_STRING_ID Help
,
737 IN UINT8 QuestionFlags
,
738 IN UINT8 NumericFlags
,
743 IN OUT EFI_HII_UPDATE_DATA
*Data
747 EFI_IFR_NUMERIC Numeric
;
748 MINMAXSTEP_DATA MinMaxStep
;
749 EFI_IFR_TYPE_VALUE DefaultValue
;
752 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
754 if (!IsValidQuestionFlags (QuestionFlags
) || !IsValidNumricFlags (NumericFlags
)) {
755 return EFI_INVALID_PARAMETER
;
758 if (Data
->Offset
+ sizeof (EFI_IFR_CHECKBOX
) > Data
->BufferSize
) {
759 return EFI_BUFFER_TOO_SMALL
;
762 Numeric
.Header
.OpCode
= EFI_IFR_NUMERIC_OP
;
763 Numeric
.Header
.Length
= sizeof (EFI_IFR_NUMERIC
);
764 Numeric
.Header
.Scope
= 1;
765 Numeric
.Question
.QuestionId
= QuestionId
;
766 Numeric
.Question
.VarStoreId
= VarStoreId
;
767 Numeric
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
768 Numeric
.Question
.Header
.Prompt
= Prompt
;
769 Numeric
.Question
.Header
.Help
= Help
;
770 Numeric
.Question
.Flags
= QuestionFlags
;
771 Numeric
.Flags
= NumericFlags
;
773 switch (NumericFlags
& EFI_IFR_NUMERIC_SIZE
) {
774 case EFI_IFR_NUMERIC_SIZE_1
:
775 MinMaxStep
.u8
.MinValue
= (UINT8
) Minimum
;
776 MinMaxStep
.u8
.MaxValue
= (UINT8
) Maximum
;
777 MinMaxStep
.u8
.Step
= (UINT8
) Step
;
780 case EFI_IFR_NUMERIC_SIZE_2
:
781 MinMaxStep
.u16
.MinValue
= (UINT16
) Minimum
;
782 MinMaxStep
.u16
.MaxValue
= (UINT16
) Maximum
;
783 MinMaxStep
.u16
.Step
= (UINT16
) Step
;
786 case EFI_IFR_NUMERIC_SIZE_4
:
787 MinMaxStep
.u32
.MinValue
= (UINT32
) Minimum
;
788 MinMaxStep
.u32
.MaxValue
= (UINT32
) Maximum
;
789 MinMaxStep
.u32
.Step
= (UINT32
) Step
;
792 case EFI_IFR_NUMERIC_SIZE_8
:
793 MinMaxStep
.u64
.MinValue
= Minimum
;
794 MinMaxStep
.u64
.MaxValue
= Maximum
;
795 MinMaxStep
.u64
.Step
= Step
;
799 CopyMem (&Numeric
.data
, &MinMaxStep
, sizeof (MINMAXSTEP_DATA
));
801 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
803 // CopyMem is used for EFI_IFR_NUMERIC to cover the unaligned address access.
805 CopyMem (LocalBuffer
, &Numeric
, sizeof (EFI_IFR_NUMERIC
));
806 Data
->Offset
+= sizeof (EFI_IFR_NUMERIC
);
808 DefaultValue
.u64
= Default
;
809 Status
= CreateDefaultOpCode (&DefaultValue
, (UINT8
) (NumericFlags
& EFI_IFR_NUMERIC_SIZE
), Data
);
810 if (EFI_ERROR(Status
)) {
814 CreateEndOpCode (Data
);
820 Create EFI_IFR_STRING_OP opcode.
822 If Data is NULL or Data->Data is NULL, then ASSERT.
824 @param QuestionId Question ID
825 @param VarStoreId Storage ID
826 @param VarOffset Offset in Storage
827 @param Prompt String ID for Prompt
828 @param Help String ID for Help
829 @param QuestionFlags Flags in Question Header
830 @param StringFlags Flags for string opcode
831 @param MinSize String minimum length
832 @param MaxSize String maximum length
833 @param Data Destination for the created opcode binary
835 @retval EFI_SUCCESS Opcode is created successfully.
836 @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
837 @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
843 IN EFI_QUESTION_ID QuestionId
,
844 IN EFI_VARSTORE_ID VarStoreId
,
846 IN EFI_STRING_ID Prompt
,
847 IN EFI_STRING_ID Help
,
848 IN UINT8 QuestionFlags
,
849 IN UINT8 StringFlags
,
852 IN OUT EFI_HII_UPDATE_DATA
*Data
855 EFI_IFR_STRING String
;
858 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
860 if (!IsValidQuestionFlags (QuestionFlags
) || (StringFlags
& ~EFI_IFR_STRING_MULTI_LINE
) != 0) {
861 return EFI_INVALID_PARAMETER
;
864 if (Data
->Offset
+ sizeof (EFI_IFR_STRING
) > Data
->BufferSize
) {
865 return EFI_BUFFER_TOO_SMALL
;
868 String
.Header
.OpCode
= EFI_IFR_STRING_OP
;
869 String
.Header
.Length
= sizeof (EFI_IFR_STRING
);
870 String
.Header
.Scope
= 0;
871 String
.Question
.Header
.Prompt
= Prompt
;
872 String
.Question
.Header
.Help
= Help
;
873 String
.Question
.QuestionId
= QuestionId
;
874 String
.Question
.VarStoreId
= VarStoreId
;
875 String
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
876 String
.Question
.Flags
= QuestionFlags
;
877 String
.MinSize
= MinSize
;
878 String
.MaxSize
= MaxSize
;
879 String
.Flags
= StringFlags
;
881 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
883 // CopyMem is used for EFI_IFR_STRING to cover the unaligned address access.
885 CopyMem (LocalBuffer
, &String
, sizeof (EFI_IFR_STRING
));
886 Data
->Offset
+= sizeof (EFI_IFR_STRING
);