2 Dynamically update the pages.
4 Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "BootMaint.h"
18 Refresh the global UpdateData structure.
27 // Free current updated date
29 if (mStartOpCodeHandle
!= NULL
) {
30 HiiFreeOpCodeHandle (mStartOpCodeHandle
);
34 // Create new OpCode Handle
36 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
39 // Create Hii Extend Label OpCode as the start opcode
41 mStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
42 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
47 Add a "Go back to main page" tag in front of the form when there are no
48 "Apply changes" and "Discard changes" tags in the end of the form.
50 @param CallbackData The BMM context data.
55 IN BMM_CALLBACK_DATA
*CallbackData
59 mStartLabel
->Number
= CallbackData
->BmmCurrentPageId
;
61 if (!(CallbackData
->BmmAskSaveOrNot
)) {
63 // Add a "Go back to main page" tag in front of the form when there are no
64 // "Apply changes" and "Discard changes" tags in the end of the form.
69 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
70 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
79 Create the "Apply changes" and "Discard changes" tags. And
80 ensure user can return to the main page.
82 @param CallbackData The BMM context data.
87 IN BMM_CALLBACK_DATA
*CallbackData
91 // Create the "Apply changes" and "Discard changes" tags.
93 if (CallbackData
->BmmAskSaveOrNot
) {
94 HiiCreateSubTitleOpCode (
96 STRING_TOKEN (STR_NULL_STRING
),
102 HiiCreateActionOpCode (
104 KEY_VALUE_SAVE_AND_EXIT
,
105 STRING_TOKEN (STR_SAVE_AND_EXIT
),
106 STRING_TOKEN (STR_NULL_STRING
),
107 EFI_IFR_FLAG_CALLBACK
,
113 // Ensure user can return to the main page.
115 HiiCreateActionOpCode (
117 KEY_VALUE_NO_SAVE_AND_EXIT
,
118 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
119 STRING_TOKEN (STR_NULL_STRING
),
120 EFI_IFR_FLAG_CALLBACK
,
125 CallbackData
->BmmHiiHandle
,
127 CallbackData
->BmmCurrentPageId
,
128 mStartOpCodeHandle
, // Label CallbackData->BmmCurrentPageId
129 mEndOpCodeHandle
// LABEL_END
134 Clean up the dynamic opcode at label and form specified by both LabelId.
136 @param LabelId It is both the Form ID and Label ID for opcode deletion.
137 @param CallbackData The BMM context data.
143 IN BMM_CALLBACK_DATA
*CallbackData
146 RefreshUpdateData ();
149 // Remove all op-codes from dynamic page
151 mStartLabel
->Number
= LabelId
;
153 CallbackData
->BmmHiiHandle
,
156 mStartOpCodeHandle
, // Label LabelId
157 mEndOpCodeHandle
// LABEL_END
162 Boot a file selected by user at File Expoloer of BMM.
164 @param FileContext The file context data, which contains the device path
165 of the file to be boot from.
167 @retval EFI_SUCCESS The function completed successfull.
168 @return Other value if the boot from the file fails.
173 IN BM_FILE_CONTEXT
*FileContext
176 EFI_BOOT_MANAGER_LOAD_OPTION BootOption
;
178 EfiBootManagerInitializeLoadOption (
183 FileContext
->FileName
,
184 FileContext
->DevicePath
,
189 // Since current no boot from removable media directly is allowed */
191 gST
->ConOut
->ClearScreen (gST
->ConOut
);
193 BdsSetConsoleMode (FALSE
);
194 EfiBootManagerBoot (&BootOption
);
195 BdsSetConsoleMode (TRUE
);
197 EfiBootManagerFreeLoadOption (&BootOption
);
199 return BootOption
.Status
;
204 Create a list of Goto Opcode for all terminal devices logged
205 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
207 @param CallbackData The BMM context data.
211 IN BMM_CALLBACK_DATA
*CallbackData
214 BM_MENU_ENTRY
*NewMenuEntry
;
217 CallbackData
->BmmAskSaveOrNot
= TRUE
;
219 UpdatePageStart (CallbackData
);
221 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
222 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
224 HiiCreateGotoOpCode (
226 FORM_CON_COM_SETUP_ID
,
227 NewMenuEntry
->DisplayStringToken
,
228 STRING_TOKEN (STR_NULL_STRING
),
229 EFI_IFR_FLAG_CALLBACK
,
230 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
234 UpdatePageEnd (CallbackData
);
239 Create a list of boot option from global BootOptionMenu. It
240 allow user to delete the boot option.
242 @param CallbackData The BMM context data.
247 IN BMM_CALLBACK_DATA
*CallbackData
250 BM_MENU_ENTRY
*NewMenuEntry
;
251 BM_LOAD_CONTEXT
*NewLoadContext
;
254 CallbackData
->BmmAskSaveOrNot
= TRUE
;
256 UpdatePageStart (CallbackData
);
257 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
259 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
260 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
261 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
262 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
263 if (NewLoadContext
->IsLegacy
) {
267 NewLoadContext
->Deleted
= FALSE
;
269 if (CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.BootOptionDelMark
[Index
]) {
271 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
272 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
273 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
274 // through HiiSetBrowserData function.
276 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = FALSE
;
280 // Check to see if the current boot option devicepath is the ShellDevice
281 // path. If it is keep only UEFI Shell in the delete boot option list
284 //if ((NULL != NewLoadContext->FilePathList) && (TRUE == IsShellNodeDevicePath(NewLoadContext->FilePathList))) {
285 // NewLoadContext->Deleted = FALSE;
286 // CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;
288 HiiCreateCheckBoxOpCode (
290 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
291 VARSTORE_ID_BOOT_MAINT
,
292 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
293 NewMenuEntry
->DisplayStringToken
,
294 NewMenuEntry
->HelpStringToken
,
295 EFI_IFR_FLAG_CALLBACK
,
303 UpdatePageEnd (CallbackData
);
307 Create a lit of driver option from global DriverMenu.
309 @param CallbackData The BMM context data.
313 UpdateDrvAddHandlePage (
314 IN BMM_CALLBACK_DATA
*CallbackData
317 BM_MENU_ENTRY
*NewMenuEntry
;
320 CallbackData
->BmmAskSaveOrNot
= FALSE
;
322 UpdatePageStart (CallbackData
);
324 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
325 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
327 HiiCreateGotoOpCode (
329 FORM_DRV_ADD_HANDLE_DESC_ID
,
330 NewMenuEntry
->DisplayStringToken
,
331 STRING_TOKEN (STR_NULL_STRING
),
332 EFI_IFR_FLAG_CALLBACK
,
333 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
337 UpdatePageEnd (CallbackData
);
341 Create a lit of driver option from global DriverOptionMenu. It
342 allow user to delete the driver option.
344 @param CallbackData The BMM context data.
349 IN BMM_CALLBACK_DATA
*CallbackData
352 BM_MENU_ENTRY
*NewMenuEntry
;
353 BM_LOAD_CONTEXT
*NewLoadContext
;
356 CallbackData
->BmmAskSaveOrNot
= TRUE
;
358 UpdatePageStart (CallbackData
);
360 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
362 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
363 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
364 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
366 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
367 NewLoadContext
->Deleted
= FALSE
;
369 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
371 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
372 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
373 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
374 // through HiiSetBrowserData function.
376 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
378 HiiCreateCheckBoxOpCode (
380 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
381 VARSTORE_ID_BOOT_MAINT
,
382 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
383 NewMenuEntry
->DisplayStringToken
,
384 NewMenuEntry
->HelpStringToken
,
385 EFI_IFR_FLAG_CALLBACK
,
391 UpdatePageEnd (CallbackData
);
395 Prepare the page to allow user to add description for
398 @param CallbackData The BMM context data.
402 UpdateDriverAddHandleDescPage (
403 IN BMM_CALLBACK_DATA
*CallbackData
406 BM_MENU_ENTRY
*NewMenuEntry
;
408 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
409 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
410 CallbackData
->BmmAskSaveOrNot
= TRUE
;
411 NewMenuEntry
= CallbackData
->MenuEntry
;
413 UpdatePageStart (CallbackData
);
415 HiiCreateSubTitleOpCode (
417 NewMenuEntry
->DisplayStringToken
,
423 HiiCreateStringOpCode (
425 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
426 VARSTORE_ID_BOOT_MAINT
,
427 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
428 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
429 STRING_TOKEN (STR_NULL_STRING
),
437 HiiCreateCheckBoxOpCode (
439 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
440 VARSTORE_ID_BOOT_MAINT
,
441 DRV_ADD_RECON_VAR_OFFSET
,
442 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
443 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
449 HiiCreateStringOpCode (
451 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
452 VARSTORE_ID_BOOT_MAINT
,
453 DRIVER_ADD_OPTION_VAR_OFFSET
,
454 STRING_TOKEN (STR_OPTIONAL_DATA
),
455 STRING_TOKEN (STR_NULL_STRING
),
463 UpdatePageEnd (CallbackData
);
469 @param UpdatePageId The form ID to be updated.
470 @param ConsoleMenu The console menu list.
471 @param CallbackData The BMM context data.
476 IN UINT16 UpdatePageId
,
477 IN BM_MENU_OPTION
*ConsoleMenu
,
478 IN BMM_CALLBACK_DATA
*CallbackData
481 BM_MENU_ENTRY
*NewMenuEntry
;
482 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
483 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
488 UINT8
*OldConsoleCheck
;
489 UINTN ConsoleCheckSize
;
490 EFI_QUESTION_ID QuestionIdBase
;
491 UINT16 VariableOffsetBase
;
493 CallbackData
->BmmAskSaveOrNot
= TRUE
;
495 UpdatePageStart (CallbackData
);
498 OldConsoleCheck
= NULL
;
500 VariableOffsetBase
= 0;
501 ConsoleCheckSize
= 0;
503 switch (UpdatePageId
) {
505 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
506 OldConsoleCheck
= &CallbackData
->BmmOldFakeNVData
.ConsoleInCheck
[0];
507 ConsoleCheckSize
= sizeof (CallbackData
->BmmFakeNvData
.ConsoleInCheck
);
508 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
509 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
512 case FORM_CON_OUT_ID
:
513 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
514 OldConsoleCheck
= &CallbackData
->BmmOldFakeNVData
.ConsoleOutCheck
[0];
515 ConsoleCheckSize
= sizeof (CallbackData
->BmmFakeNvData
.ConsoleOutCheck
);
516 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
517 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
520 case FORM_CON_ERR_ID
:
521 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
522 OldConsoleCheck
= &CallbackData
->BmmOldFakeNVData
.ConsoleErrCheck
[0];
523 ConsoleCheckSize
= sizeof (CallbackData
->BmmFakeNvData
.ConsoleErrCheck
);
524 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
525 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
528 ASSERT (ConsoleCheck
!= NULL
);
530 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
531 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
533 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
534 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
535 if (NewConsoleContext
->IsActive
) {
536 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
537 ConsoleCheck
[Index
] = TRUE
;
539 ConsoleCheck
[Index
] = FALSE
;
541 HiiCreateCheckBoxOpCode (
543 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
544 VARSTORE_ID_BOOT_MAINT
,
545 (UINT16
) (VariableOffsetBase
+ Index
),
546 NewMenuEntry
->DisplayStringToken
,
547 NewMenuEntry
->HelpStringToken
,
554 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
555 (Index2
< MAX_MENU_NUMBER
)); Index2
++) {
557 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
558 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
560 ASSERT (Index
< MAX_MENU_NUMBER
);
561 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
562 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
563 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
565 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
566 ConsoleCheck
[Index
] = TRUE
;
568 ConsoleCheck
[Index
] = FALSE
;
570 HiiCreateCheckBoxOpCode (
572 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
573 VARSTORE_ID_BOOT_MAINT
,
574 (UINT16
) (VariableOffsetBase
+ Index
),
575 NewMenuEntry
->DisplayStringToken
,
576 NewMenuEntry
->HelpStringToken
,
585 CopyMem (OldConsoleCheck
, ConsoleCheck
, ConsoleCheckSize
);
587 UpdatePageEnd (CallbackData
);
591 Update the page's NV Map if user has changed the order
592 a list. This list can be Boot Order or Driver Order.
594 @param UpdatePageId The form ID to be updated.
595 @param OptionMenu The new list.
596 @param CallbackData The BMM context data.
601 IN UINT16 UpdatePageId
,
602 IN BM_MENU_OPTION
*OptionMenu
,
603 IN BMM_CALLBACK_DATA
*CallbackData
606 BM_MENU_ENTRY
*NewMenuEntry
;
609 VOID
*OptionsOpCodeHandle
;
610 BM_LOAD_CONTEXT
*NewLoadContext
;
611 BOOLEAN BootOptionFound
;
613 EFI_QUESTION_ID QuestionId
;
617 UpdatePageStart (CallbackData
);
619 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
624 switch (UpdatePageId
) {
626 case FORM_BOOT_CHG_ID
:
627 GetBootOrder (CallbackData
);
628 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
629 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
630 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
633 case FORM_DRV_CHG_ID
:
634 GetDriverOrder (CallbackData
);
635 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
636 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
637 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
640 ASSERT (OptionOrder
!= NULL
);
642 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
643 ASSERT (OptionsOpCodeHandle
!= NULL
);
646 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
647 BootOptionFound
= FALSE
;
648 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
649 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
650 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
651 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
652 BootOptionFound
= TRUE
;
656 if (BootOptionFound
) {
657 HiiCreateOneOfOptionOpCode (
659 NewMenuEntry
->DisplayStringToken
,
661 EFI_IFR_TYPE_NUM_SIZE_32
,
662 OptionOrder
[OptionIndex
]
667 if (OptionMenu
->MenuNumber
> 0) {
668 HiiCreateOrderedListOpCode (
669 mStartOpCodeHandle
, // Container for dynamic created opcodes
670 QuestionId
, // Question ID
671 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
672 VarOffset
, // Offset in Buffer Storage
673 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
674 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
676 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
677 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
678 100, // Maximum container
679 OptionsOpCodeHandle
, // Option Opcode list
680 NULL
// Default Opcode is NULL
684 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
686 UpdatePageEnd (CallbackData
);
691 Create the dynamic page to allow user to set
692 the "BootNext" value.
694 @param CallbackData The BMM context data.
699 IN BMM_CALLBACK_DATA
*CallbackData
702 BM_MENU_ENTRY
*NewMenuEntry
;
703 BM_LOAD_CONTEXT
*NewLoadContext
;
704 UINTN NumberOfOptions
;
706 VOID
*OptionsOpCodeHandle
;
708 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
709 CallbackData
->BmmAskSaveOrNot
= TRUE
;
711 UpdatePageStart (CallbackData
);
712 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
714 if (NumberOfOptions
> 0) {
715 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
716 ASSERT (OptionsOpCodeHandle
!= NULL
);
718 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
720 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
721 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
722 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
724 if (NewLoadContext
->IsBootNext
) {
725 HiiCreateOneOfOptionOpCode (
727 NewMenuEntry
->DisplayStringToken
,
728 EFI_IFR_OPTION_DEFAULT
,
729 EFI_IFR_TYPE_NUM_SIZE_16
,
732 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
734 HiiCreateOneOfOptionOpCode (
736 NewMenuEntry
->DisplayStringToken
,
738 EFI_IFR_TYPE_NUM_SIZE_16
,
744 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
745 HiiCreateOneOfOptionOpCode (
747 STRING_TOKEN (STR_NONE
),
748 EFI_IFR_OPTION_DEFAULT
,
749 EFI_IFR_TYPE_NUM_SIZE_16
,
753 HiiCreateOneOfOptionOpCode (
755 STRING_TOKEN (STR_NONE
),
757 EFI_IFR_TYPE_NUM_SIZE_16
,
762 HiiCreateOneOfOpCode (
764 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
765 VARSTORE_ID_BOOT_MAINT
,
766 BOOT_NEXT_VAR_OFFSET
,
767 STRING_TOKEN (STR_BOOT_NEXT
),
768 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
770 EFI_IFR_NUMERIC_SIZE_2
,
775 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
778 UpdatePageEnd (CallbackData
);
782 Create the dynamic page to allow user to set the "TimeOut" value.
784 @param CallbackData The BMM context data.
789 IN BMM_CALLBACK_DATA
*CallbackData
793 VOID
*DefaultOpCodeHandle
;
795 CallbackData
->BmmAskSaveOrNot
= TRUE
;
797 UpdatePageStart (CallbackData
);
799 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
801 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
802 ASSERT (DefaultOpCodeHandle
!= NULL
);
803 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
805 HiiCreateNumericOpCode (
807 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
808 VARSTORE_ID_BOOT_MAINT
,
809 BOOT_TIME_OUT_VAR_OFFSET
,
810 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
811 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
813 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
820 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
822 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
824 UpdatePageEnd (CallbackData
);
829 Refresh the text mode page.
831 @param CallbackData The BMM context data.
836 IN BMM_CALLBACK_DATA
*CallbackData
843 CHAR16 ModeString
[50];
847 EFI_STRING_ID
*ModeToken
;
849 VOID
*OptionsOpCodeHandle
;
850 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
852 ConOut
= gST
->ConOut
;
855 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
857 CallbackData
->BmmAskSaveOrNot
= TRUE
;
859 UpdatePageStart (CallbackData
);
864 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
865 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
866 if (EFI_ERROR (Status
)) {
872 if (ValidMode
== 0) {
876 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
877 ASSERT (OptionsOpCodeHandle
!= NULL
);
879 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
880 ASSERT(ModeToken
!= NULL
);
883 // Determin which mode should be the first entry in menu
885 GetConsoleOutMode (CallbackData
);
888 // Build text mode options
890 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
891 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
892 if (EFI_ERROR (Status
)) {
897 // Build mode string Column x Row
899 UnicodeValueToString (ModeString
, 0, Col
, 0);
900 PStr
= &ModeString
[0];
901 StrnCatS (PStr
, sizeof (ModeString
) / sizeof (ModeString
[0]), L
" x ", StrLen(L
" x ") + 1);
902 PStr
= PStr
+ StrLen (PStr
);
903 UnicodeValueToString (PStr
, 0, Row
, 0);
905 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
907 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
908 HiiCreateOneOfOptionOpCode (
911 EFI_IFR_OPTION_DEFAULT
,
912 EFI_IFR_TYPE_NUM_SIZE_16
,
916 HiiCreateOneOfOptionOpCode (
920 EFI_IFR_TYPE_NUM_SIZE_16
,
927 HiiCreateOneOfOpCode (
929 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
930 VARSTORE_ID_BOOT_MAINT
,
932 STRING_TOKEN (STR_CON_MODE_SETUP
),
933 STRING_TOKEN (STR_CON_MODE_SETUP
),
934 EFI_IFR_FLAG_RESET_REQUIRED
,
935 EFI_IFR_NUMERIC_SIZE_2
,
940 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
941 FreePool (ModeToken
);
943 UpdatePageEnd (CallbackData
);
947 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
948 Parity, Stop Bits, Terminal Type.
950 @param CallbackData The BMM context data.
955 IN BMM_CALLBACK_DATA
*CallbackData
960 BM_MENU_ENTRY
*NewMenuEntry
;
961 VOID
*OptionsOpCodeHandle
;
962 UINTN CurrentTerminal
;
964 CallbackData
->BmmAskSaveOrNot
= TRUE
;
966 UpdatePageStart (CallbackData
);
968 CurrentTerminal
= CallbackData
->CurrentTerminal
;
969 NewMenuEntry
= BOpt_GetMenuEntry (
974 if (NewMenuEntry
== NULL
) {
978 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
979 ASSERT (OptionsOpCodeHandle
!= NULL
);
981 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
983 if (BaudRateList
[Index
].Value
== 115200) {
984 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
986 HiiCreateOneOfOptionOpCode (
988 BaudRateList
[Index
].StringToken
,
990 EFI_IFR_TYPE_NUM_SIZE_8
,
995 HiiCreateOneOfOpCode (
997 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
998 VARSTORE_ID_BOOT_MAINT
,
999 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
1000 STRING_TOKEN (STR_COM_BAUD_RATE
),
1001 STRING_TOKEN (STR_COM_BAUD_RATE
),
1003 EFI_IFR_NUMERIC_SIZE_1
,
1004 OptionsOpCodeHandle
,
1008 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1009 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1010 ASSERT (OptionsOpCodeHandle
!= NULL
);
1012 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
1015 if (DataBitsList
[Index
].Value
== 8) {
1016 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1019 HiiCreateOneOfOptionOpCode (
1020 OptionsOpCodeHandle
,
1021 DataBitsList
[Index
].StringToken
,
1023 EFI_IFR_TYPE_NUM_SIZE_8
,
1028 HiiCreateOneOfOpCode (
1030 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
1031 VARSTORE_ID_BOOT_MAINT
,
1032 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
1033 STRING_TOKEN (STR_COM_DATA_BITS
),
1034 STRING_TOKEN (STR_COM_DATA_BITS
),
1036 EFI_IFR_NUMERIC_SIZE_1
,
1037 OptionsOpCodeHandle
,
1041 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1042 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1043 ASSERT (OptionsOpCodeHandle
!= NULL
);
1045 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
1047 if (ParityList
[Index
].Value
== NoParity
) {
1048 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1051 HiiCreateOneOfOptionOpCode (
1052 OptionsOpCodeHandle
,
1053 ParityList
[Index
].StringToken
,
1055 EFI_IFR_TYPE_NUM_SIZE_8
,
1060 HiiCreateOneOfOpCode (
1062 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
1063 VARSTORE_ID_BOOT_MAINT
,
1064 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
1065 STRING_TOKEN (STR_COM_PARITY
),
1066 STRING_TOKEN (STR_COM_PARITY
),
1068 EFI_IFR_NUMERIC_SIZE_1
,
1069 OptionsOpCodeHandle
,
1073 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1074 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1075 ASSERT (OptionsOpCodeHandle
!= NULL
);
1077 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
1079 if (StopBitsList
[Index
].Value
== OneStopBit
) {
1080 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1083 HiiCreateOneOfOptionOpCode (
1084 OptionsOpCodeHandle
,
1085 StopBitsList
[Index
].StringToken
,
1087 EFI_IFR_TYPE_NUM_SIZE_8
,
1092 HiiCreateOneOfOpCode (
1094 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
1095 VARSTORE_ID_BOOT_MAINT
,
1096 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
1097 STRING_TOKEN (STR_COM_STOP_BITS
),
1098 STRING_TOKEN (STR_COM_STOP_BITS
),
1100 EFI_IFR_NUMERIC_SIZE_1
,
1101 OptionsOpCodeHandle
,
1105 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1106 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1107 ASSERT (OptionsOpCodeHandle
!= NULL
);
1109 for (Index
= 0; Index
< sizeof (TerminalType
) / sizeof (TerminalType
[0]); Index
++) {
1112 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1115 HiiCreateOneOfOptionOpCode (
1116 OptionsOpCodeHandle
,
1117 (EFI_STRING_ID
) TerminalType
[Index
],
1119 EFI_IFR_TYPE_NUM_SIZE_8
,
1124 HiiCreateOneOfOpCode (
1126 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
1127 VARSTORE_ID_BOOT_MAINT
,
1128 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
1129 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1130 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1132 EFI_IFR_NUMERIC_SIZE_1
,
1133 OptionsOpCodeHandle
,
1137 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1138 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1139 ASSERT (OptionsOpCodeHandle
!= NULL
);
1141 for (Index
= 0; Index
< sizeof (mFlowControlType
) / sizeof (mFlowControlType
[0]); Index
++) {
1144 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1146 HiiCreateOneOfOptionOpCode (
1147 OptionsOpCodeHandle
,
1148 (EFI_STRING_ID
) mFlowControlType
[Index
],
1150 EFI_IFR_TYPE_NUM_SIZE_8
,
1151 mFlowControlValue
[Index
]
1155 HiiCreateOneOfOpCode (
1157 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1158 VARSTORE_ID_BOOT_MAINT
,
1159 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1160 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1161 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1163 EFI_IFR_NUMERIC_SIZE_1
,
1164 OptionsOpCodeHandle
,
1168 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1170 UpdatePageEnd (CallbackData
);
1174 Dispatch the correct update page function to call based on
1177 @param UpdatePageId The form ID.
1178 @param CallbackData The BMM context data.
1183 IN UINT16 UpdatePageId
,
1184 IN BMM_CALLBACK_DATA
*CallbackData
1187 CleanUpPage (UpdatePageId
, CallbackData
);
1188 switch (UpdatePageId
) {
1189 case FORM_CON_IN_ID
:
1190 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1193 case FORM_CON_OUT_ID
:
1194 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1197 case FORM_CON_ERR_ID
:
1198 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1201 case FORM_BOOT_CHG_ID
:
1202 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1205 case FORM_DRV_CHG_ID
:
1206 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1215 Dispatch the display to the next page based on NewPageId.
1217 @param Private The BMM context data.
1218 @param NewPageId The original page ID.
1223 BMM_CALLBACK_DATA
*Private
,
1227 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1229 // If we select a handle to add driver option, advance to the add handle description page.
1231 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1232 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1234 // Return to main page after "Save Changes" or "Discard Changes".
1236 NewPageId
= FORM_MAIN_ID
;
1237 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1238 NewPageId
= FORM_CON_COM_SETUP_ID
;
1241 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1242 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1243 Private
->BmmCurrentPageId
= NewPageId
;