3 Copyright (c) 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 UefiIfrOpCodeCreation.c
18 Library Routines to create IFR independent of string data - assume tokens already exist
19 Primarily to be used for exporting op-codes at a label in pre-defined forms.
26 #include "UefiIfrLibraryInternal.h"
30 IsValidQuestionFlags (
34 return (BOOLEAN
) ((Flags
& (~QUESTION_FLAGS
)) ? FALSE
: TRUE
);
43 return (BOOLEAN
) ((Type
<= EFI_IFR_TYPE_OTHER
) ? TRUE
: FALSE
);
52 if (Flags
& ~(EFI_IFR_NUMERIC_SIZE
| EFI_IFR_DISPLAY
)) {
56 if ((Flags
& EFI_IFR_DISPLAY
) > EFI_IFR_DISPLAY_UINT_HEX
) {
65 IsValidCheckboxFlags (
69 return (BOOLEAN
) ((Flags
<= EFI_IFR_CHECKBOX_DEFAULT_MFG
) ? TRUE
: FALSE
);
75 IN OUT EFI_HII_UPDATE_DATA
*Data
81 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
83 if (Data
->Offset
+ sizeof (EFI_IFR_END
) > Data
->BufferSize
) {
84 return EFI_BUFFER_TOO_SMALL
;
87 End
.Header
.Length
= sizeof (EFI_IFR_END
);
88 End
.Header
.OpCode
= EFI_IFR_END_OP
;
91 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
92 CopyMem (LocalBuffer
, &End
, sizeof (EFI_IFR_END
));
93 Data
->Offset
+= sizeof (EFI_IFR_END
);
100 CreateDefaultOpCode (
101 IN EFI_IFR_TYPE_VALUE
*Value
,
103 IN OUT EFI_HII_UPDATE_DATA
*Data
106 EFI_IFR_DEFAULT Default
;
109 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
111 if ((Value
== NULL
) || !IsValidValueType (Type
)) {
112 return EFI_INVALID_PARAMETER
;
115 if (Data
->Offset
+ sizeof (EFI_IFR_DEFAULT
) > Data
->BufferSize
) {
116 return EFI_BUFFER_TOO_SMALL
;
119 Default
.Header
.OpCode
= EFI_IFR_DEFAULT_OP
;
120 Default
.Header
.Length
= sizeof (EFI_IFR_DEFAULT
);
121 Default
.Header
.Scope
= 0;
123 Default
.DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
;
124 CopyMem (&Default
.Value
, Value
, sizeof(EFI_IFR_TYPE_VALUE
));
126 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
127 CopyMem (LocalBuffer
, &Default
, sizeof (EFI_IFR_DEFAULT
));
128 Data
->Offset
+= sizeof (EFI_IFR_DEFAULT
);
136 IN EFI_QUESTION_ID QuestionId
,
137 IN EFI_STRING_ID Prompt
,
138 IN EFI_STRING_ID Help
,
139 IN UINT8 QuestionFlags
,
140 IN EFI_STRING_ID QuestionConfig
,
141 IN OUT EFI_HII_UPDATE_DATA
*Data
144 EFI_IFR_ACTION Action
;
147 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
149 if (!IsValidQuestionFlags (QuestionFlags
)) {
150 return EFI_INVALID_PARAMETER
;
153 if (Data
->Offset
+ sizeof (EFI_IFR_ACTION
) > Data
->BufferSize
) {
154 return EFI_BUFFER_TOO_SMALL
;
157 Action
.Header
.OpCode
= EFI_IFR_ACTION_OP
;
158 Action
.Header
.Length
= sizeof (EFI_IFR_ACTION
);
159 Action
.Header
.Scope
= 0;
160 Action
.Question
.QuestionId
= QuestionId
;
161 Action
.Question
.Header
.Prompt
= Prompt
;
162 Action
.Question
.Header
.Help
= Help
;
163 Action
.Question
.VarStoreId
= INVALID_VARSTORE_ID
;
164 Action
.Question
.Flags
= QuestionFlags
;
165 Action
.QuestionConfig
= QuestionConfig
;
167 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
168 CopyMem (LocalBuffer
, &Action
, sizeof (EFI_IFR_ACTION
));
169 Data
->Offset
+= sizeof (EFI_IFR_ACTION
);
176 CreateSubTitleOpCode (
177 IN EFI_STRING_ID Prompt
,
178 IN EFI_STRING_ID Help
,
181 IN OUT EFI_HII_UPDATE_DATA
*Data
184 EFI_IFR_SUBTITLE Subtitle
;
187 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
189 if (Data
->Offset
+ sizeof (EFI_IFR_SUBTITLE
) > Data
->BufferSize
) {
190 return EFI_BUFFER_TOO_SMALL
;
193 Subtitle
.Header
.OpCode
= EFI_IFR_SUBTITLE_OP
;
194 Subtitle
.Header
.Length
= sizeof (EFI_IFR_SUBTITLE
);
195 Subtitle
.Header
.Scope
= Scope
;
196 Subtitle
.Statement
.Prompt
= Prompt
;
197 Subtitle
.Statement
.Help
= Help
;
198 Subtitle
.Flags
= Flags
;
200 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
201 CopyMem (LocalBuffer
, &Subtitle
, sizeof (EFI_IFR_SUBTITLE
));
202 Data
->Offset
+= sizeof (EFI_IFR_SUBTITLE
);
211 IN EFI_STRING_ID Prompt
,
212 IN EFI_STRING_ID Help
,
213 IN EFI_STRING_ID TextTwo
,
214 IN OUT EFI_HII_UPDATE_DATA
*Data
220 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
222 if (Data
->Offset
+ sizeof (EFI_IFR_TEXT
) > Data
->BufferSize
) {
223 return EFI_BUFFER_TOO_SMALL
;
226 Text
.Header
.OpCode
= EFI_IFR_TEXT_OP
;
227 Text
.Header
.Length
= sizeof (EFI_IFR_TEXT
);
228 Text
.Header
.Scope
= 0;
229 Text
.Statement
.Prompt
= Prompt
;
230 Text
.Statement
.Help
= Help
;
231 Text
.TextTwo
= TextTwo
;
233 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
234 CopyMem (LocalBuffer
, &Text
, sizeof (EFI_IFR_TEXT
));
235 Data
->Offset
+= sizeof (EFI_IFR_TEXT
);
243 IN EFI_FORM_ID FormId
,
244 IN EFI_STRING_ID Prompt
,
245 IN EFI_STRING_ID Help
,
246 IN UINT8 QuestionFlags
,
247 IN EFI_QUESTION_ID QuestionId
,
248 IN OUT EFI_HII_UPDATE_DATA
*Data
254 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
256 if (!IsValidQuestionFlags (QuestionFlags
)) {
257 return EFI_INVALID_PARAMETER
;
260 if (Data
->Offset
+ sizeof (EFI_IFR_REF
) > Data
->BufferSize
) {
261 return EFI_BUFFER_TOO_SMALL
;
264 Goto
.Header
.OpCode
= EFI_IFR_REF_OP
;
265 Goto
.Header
.Length
= sizeof (EFI_IFR_REF
);
266 Goto
.Header
.Scope
= 0;
267 Goto
.Question
.Header
.Prompt
= Prompt
;
268 Goto
.Question
.Header
.Help
= Help
;
269 Goto
.Question
.VarStoreId
= INVALID_VARSTORE_ID
;
270 Goto
.Question
.QuestionId
= QuestionId
;
271 Goto
.Question
.Flags
= QuestionFlags
;
272 Goto
.FormId
= FormId
;
274 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
275 CopyMem (LocalBuffer
, &Goto
, sizeof (EFI_IFR_REF
));
276 Data
->Offset
+= sizeof (EFI_IFR_REF
);
283 CreateOneOfOptionOpCode (
284 IN UINTN OptionCount
,
285 IN IFR_OPTION
*OptionsList
,
287 IN OUT EFI_HII_UPDATE_DATA
*Data
292 EFI_IFR_ONE_OF_OPTION OneOfOption
;
294 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
296 if ((OptionCount
!= 0) && (OptionsList
== NULL
)) {
297 return EFI_INVALID_PARAMETER
;
300 if (Data
->Offset
+ OptionCount
* sizeof (EFI_IFR_ONE_OF_OPTION
) > Data
->BufferSize
) {
301 return EFI_BUFFER_TOO_SMALL
;
304 for (Index
= 0; Index
< OptionCount
; Index
++) {
305 OneOfOption
.Header
.OpCode
= EFI_IFR_ONE_OF_OPTION_OP
;
306 OneOfOption
.Header
.Length
= sizeof (EFI_IFR_ONE_OF_OPTION
);
307 OneOfOption
.Header
.Scope
= 0;
309 OneOfOption
.Option
= OptionsList
[Index
].StringToken
;
310 OneOfOption
.Value
= OptionsList
[Index
].Value
;
311 OneOfOption
.Flags
= (UINT8
) (OptionsList
[Index
].Flags
& (EFI_IFR_OPTION_DEFAULT
| EFI_IFR_OPTION_DEFAULT_MFG
));
312 OneOfOption
.Type
= Type
;
314 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
315 CopyMem (LocalBuffer
, &OneOfOption
, sizeof (EFI_IFR_ONE_OF_OPTION
));
316 Data
->Offset
+= sizeof (EFI_IFR_ONE_OF_OPTION
);
325 IN EFI_QUESTION_ID QuestionId
,
326 IN EFI_VARSTORE_ID VarStoreId
,
328 IN EFI_STRING_ID Prompt
,
329 IN EFI_STRING_ID Help
,
330 IN UINT8 QuestionFlags
,
332 IN IFR_OPTION
*OptionsList
,
333 IN UINTN OptionCount
,
334 IN OUT EFI_HII_UPDATE_DATA
*Data
338 EFI_IFR_ONE_OF OneOf
;
341 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
343 if (!IsValidNumricFlags (OneOfFlags
) ||
344 !IsValidQuestionFlags (QuestionFlags
) ||
345 ((OptionCount
!= 0) && (OptionsList
== NULL
))) {
346 return EFI_INVALID_PARAMETER
;
349 Length
= sizeof (EFI_IFR_ONE_OF
) + OptionCount
* sizeof (EFI_IFR_ONE_OF_OPTION
) + sizeof (EFI_IFR_END
);
350 if (Data
->Offset
+ Length
> Data
->BufferSize
) {
351 return EFI_BUFFER_TOO_SMALL
;
354 OneOf
.Header
.OpCode
= EFI_IFR_ONE_OF_OP
;
355 OneOf
.Header
.Length
= sizeof (EFI_IFR_ONE_OF
);
356 OneOf
.Header
.Scope
= 1;
357 OneOf
.Question
.Header
.Prompt
= Prompt
;
358 OneOf
.Question
.Header
.Help
= Help
;
359 OneOf
.Question
.QuestionId
= QuestionId
;
360 OneOf
.Question
.VarStoreId
= VarStoreId
;
361 OneOf
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
362 OneOf
.Question
.Flags
= QuestionFlags
;
363 OneOf
.Flags
= OneOfFlags
;
364 ZeroMem ((VOID
*) &OneOf
.data
, sizeof (MINMAXSTEP_DATA
));
366 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
367 CopyMem (LocalBuffer
, &OneOf
, sizeof (EFI_IFR_ONE_OF
));
368 Data
->Offset
+= sizeof (EFI_IFR_ONE_OF
);
370 CreateOneOfOptionOpCode (OptionCount
, OptionsList
, (UINT8
) (OneOfFlags
& EFI_IFR_NUMERIC_SIZE
), Data
);
372 CreateEndOpCode (Data
);
379 CreateOrderedListOpCode (
380 IN EFI_QUESTION_ID QuestionId
,
381 IN EFI_VARSTORE_ID VarStoreId
,
383 IN EFI_STRING_ID Prompt
,
384 IN EFI_STRING_ID Help
,
385 IN UINT8 QuestionFlags
,
386 IN UINT8 OrderedListFlags
,
388 IN UINT8 MaxContainers
,
389 IN IFR_OPTION
*OptionsList
,
390 IN UINTN OptionCount
,
391 IN OUT EFI_HII_UPDATE_DATA
*Data
395 EFI_IFR_ORDERED_LIST OrderedList
;
398 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
400 if (!IsValidQuestionFlags (QuestionFlags
) ||
401 ((OptionCount
!= 0) && (OptionsList
== NULL
))) {
402 return EFI_INVALID_PARAMETER
;
405 if ((OrderedListFlags
!= 0) &&
406 (OrderedListFlags
!= EFI_IFR_UNIQUE_SET
) &&
407 (OrderedListFlags
!= EFI_IFR_NO_EMPTY_SET
)) {
408 return EFI_INVALID_PARAMETER
;
411 Length
= sizeof (EFI_IFR_ORDERED_LIST
) + OptionCount
* sizeof (EFI_IFR_ONE_OF_OPTION
) + sizeof (EFI_IFR_END
);
412 if (Data
->Offset
+ Length
> Data
->BufferSize
) {
413 return EFI_BUFFER_TOO_SMALL
;
416 OrderedList
.Header
.OpCode
= EFI_IFR_ORDERED_LIST_OP
;
417 OrderedList
.Header
.Length
= sizeof (EFI_IFR_ORDERED_LIST
);
418 OrderedList
.Header
.Scope
= 1;
419 OrderedList
.Question
.Header
.Prompt
= Prompt
;
420 OrderedList
.Question
.Header
.Help
= Help
;
421 OrderedList
.Question
.QuestionId
= QuestionId
;
422 OrderedList
.Question
.VarStoreId
= VarStoreId
;
423 OrderedList
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
424 OrderedList
.Question
.Flags
= QuestionFlags
;
425 OrderedList
.MaxContainers
= MaxContainers
;
426 OrderedList
.Flags
= OrderedListFlags
;
428 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
429 CopyMem (LocalBuffer
, &OrderedList
, sizeof (EFI_IFR_ORDERED_LIST
));
430 Data
->Offset
+= sizeof (EFI_IFR_ORDERED_LIST
);
432 CreateOneOfOptionOpCode (OptionCount
, OptionsList
, DataType
, Data
);
434 CreateEndOpCode (Data
);
441 CreateCheckBoxOpCode (
442 IN EFI_QUESTION_ID QuestionId
,
443 IN EFI_VARSTORE_ID VarStoreId
,
445 IN EFI_STRING_ID Prompt
,
446 IN EFI_STRING_ID Help
,
447 IN UINT8 QuestionFlags
,
448 IN UINT8 CheckBoxFlags
,
449 IN OUT EFI_HII_UPDATE_DATA
*Data
452 EFI_IFR_CHECKBOX CheckBox
;
455 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
457 if (!IsValidQuestionFlags (QuestionFlags
) || !IsValidCheckboxFlags (CheckBoxFlags
)) {
458 return EFI_INVALID_PARAMETER
;
461 if (Data
->Offset
+ sizeof (EFI_IFR_CHECKBOX
) > Data
->BufferSize
) {
462 return EFI_BUFFER_TOO_SMALL
;
465 CheckBox
.Header
.OpCode
= EFI_IFR_CHECKBOX_OP
;
466 CheckBox
.Header
.Length
= sizeof (EFI_IFR_CHECKBOX
);
467 CheckBox
.Header
.Scope
= 0;
468 CheckBox
.Question
.QuestionId
= QuestionId
;
469 CheckBox
.Question
.VarStoreId
= VarStoreId
;
470 CheckBox
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
471 CheckBox
.Question
.Header
.Prompt
= Prompt
;
472 CheckBox
.Question
.Header
.Help
= Help
;
473 CheckBox
.Question
.Flags
= QuestionFlags
;
474 CheckBox
.Flags
= CheckBoxFlags
;
476 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
477 CopyMem (LocalBuffer
, &CheckBox
, sizeof (EFI_IFR_CHECKBOX
));
478 Data
->Offset
+= sizeof (EFI_IFR_CHECKBOX
);
485 CreateNumericOpCode (
486 IN EFI_QUESTION_ID QuestionId
,
487 IN EFI_VARSTORE_ID VarStoreId
,
489 IN EFI_STRING_ID Prompt
,
490 IN EFI_STRING_ID Help
,
491 IN UINT8 QuestionFlags
,
492 IN UINT8 NumericFlags
,
497 IN OUT EFI_HII_UPDATE_DATA
*Data
501 EFI_IFR_NUMERIC Numeric
;
502 MINMAXSTEP_DATA MinMaxStep
;
503 EFI_IFR_TYPE_VALUE DefaultValue
;
506 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
508 if (!IsValidQuestionFlags (QuestionFlags
) || !IsValidNumricFlags (NumericFlags
)) {
509 return EFI_INVALID_PARAMETER
;
512 if (Data
->Offset
+ sizeof (EFI_IFR_CHECKBOX
) > Data
->BufferSize
) {
513 return EFI_BUFFER_TOO_SMALL
;
516 Numeric
.Header
.OpCode
= EFI_IFR_NUMERIC_OP
;
517 Numeric
.Header
.Length
= sizeof (EFI_IFR_NUMERIC
);
518 Numeric
.Header
.Scope
= 1;
519 Numeric
.Question
.QuestionId
= QuestionId
;
520 Numeric
.Question
.VarStoreId
= VarStoreId
;
521 Numeric
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
522 Numeric
.Question
.Header
.Prompt
= Prompt
;
523 Numeric
.Question
.Header
.Help
= Help
;
524 Numeric
.Question
.Flags
= QuestionFlags
;
525 Numeric
.Flags
= NumericFlags
;
527 switch (NumericFlags
& EFI_IFR_NUMERIC_SIZE
) {
528 case EFI_IFR_NUMERIC_SIZE_1
:
529 MinMaxStep
.u8
.MinValue
= (UINT8
) Minimum
;
530 MinMaxStep
.u8
.MaxValue
= (UINT8
) Maximum
;
531 MinMaxStep
.u8
.Step
= (UINT8
) Step
;
534 case EFI_IFR_NUMERIC_SIZE_2
:
535 MinMaxStep
.u16
.MinValue
= (UINT16
) Minimum
;
536 MinMaxStep
.u16
.MaxValue
= (UINT16
) Maximum
;
537 MinMaxStep
.u16
.Step
= (UINT16
) Step
;
540 case EFI_IFR_NUMERIC_SIZE_4
:
541 MinMaxStep
.u32
.MinValue
= (UINT32
) Minimum
;
542 MinMaxStep
.u32
.MaxValue
= (UINT32
) Maximum
;
543 MinMaxStep
.u32
.Step
= (UINT32
) Step
;
546 case EFI_IFR_NUMERIC_SIZE_8
:
547 MinMaxStep
.u64
.MinValue
= Minimum
;
548 MinMaxStep
.u64
.MaxValue
= Maximum
;
549 MinMaxStep
.u64
.Step
= Step
;
553 CopyMem (&Numeric
.data
, &MinMaxStep
, sizeof (MINMAXSTEP_DATA
));
555 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
556 CopyMem (LocalBuffer
, &Numeric
, sizeof (EFI_IFR_NUMERIC
));
557 Data
->Offset
+= sizeof (EFI_IFR_NUMERIC
);
559 DefaultValue
.u64
= Default
;
560 Status
= CreateDefaultOpCode (&DefaultValue
, (UINT8
) (NumericFlags
& EFI_IFR_NUMERIC_SIZE
), Data
);
561 if (EFI_ERROR(Status
)) {
565 CreateEndOpCode (Data
);
573 IN EFI_QUESTION_ID QuestionId
,
574 IN EFI_VARSTORE_ID VarStoreId
,
576 IN EFI_STRING_ID Prompt
,
577 IN EFI_STRING_ID Help
,
578 IN UINT8 QuestionFlags
,
579 IN UINT8 StringFlags
,
582 IN OUT EFI_HII_UPDATE_DATA
*Data
585 EFI_IFR_STRING String
;
588 ASSERT (Data
!= NULL
&& Data
->Data
!= NULL
);
590 if (!IsValidQuestionFlags (QuestionFlags
) || (StringFlags
& (~EFI_IFR_STRING_MULTI_LINE
))) {
591 return EFI_INVALID_PARAMETER
;
594 if (Data
->Offset
+ sizeof (EFI_IFR_STRING
) > Data
->BufferSize
) {
595 return EFI_BUFFER_TOO_SMALL
;
598 String
.Header
.OpCode
= EFI_IFR_STRING_OP
;
599 String
.Header
.Length
= sizeof (EFI_IFR_STRING
);
600 String
.Header
.Scope
= 0;
601 String
.Question
.Header
.Prompt
= Prompt
;
602 String
.Question
.Header
.Help
= Help
;
603 String
.Question
.QuestionId
= QuestionId
;
604 String
.Question
.VarStoreId
= VarStoreId
;
605 String
.Question
.VarStoreInfo
.VarOffset
= VarOffset
;
606 String
.Question
.Flags
= QuestionFlags
;
607 String
.MinSize
= MinSize
;
608 String
.MaxSize
= MaxSize
;
609 String
.Flags
= StringFlags
;
611 LocalBuffer
= (UINT8
*) Data
->Data
+ Data
->Offset
;
612 CopyMem (LocalBuffer
, &String
, sizeof (EFI_IFR_STRING
));
613 Data
->Offset
+= sizeof (EFI_IFR_STRING
);