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 UpdatePageStart (CallbackData
);
219 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
220 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
222 HiiCreateGotoOpCode (
224 FORM_CON_COM_SETUP_ID
,
225 NewMenuEntry
->DisplayStringToken
,
226 STRING_TOKEN (STR_NULL_STRING
),
227 EFI_IFR_FLAG_CALLBACK
,
228 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
232 UpdatePageEnd (CallbackData
);
237 Create a list of boot option from global BootOptionMenu. It
238 allow user to delete the boot option.
240 @param CallbackData The BMM context data.
245 IN BMM_CALLBACK_DATA
*CallbackData
248 BM_MENU_ENTRY
*NewMenuEntry
;
249 BM_LOAD_CONTEXT
*NewLoadContext
;
252 //CallbackData->BmmAskSaveOrNot = TRUE;
254 UpdatePageStart (CallbackData
);
255 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
257 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
258 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
259 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
260 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
261 if (NewLoadContext
->IsLegacy
) {
266 // Check to see if the current boot option devicepath is the ShellDevice
267 // path. If it is keep only UEFI Shell in the delete boot option list
270 //if ((NULL != NewLoadContext->FilePathList) && (TRUE == IsShellNodeDevicePath(NewLoadContext->FilePathList))) {
271 // NewLoadContext->Deleted = FALSE;
272 // CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;
274 HiiCreateCheckBoxOpCode (
276 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
277 VARSTORE_ID_BOOT_MAINT
,
278 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
279 NewMenuEntry
->DisplayStringToken
,
280 NewMenuEntry
->HelpStringToken
,
289 UpdatePageEnd (CallbackData
);
293 Create a lit of driver option from global DriverMenu.
295 @param CallbackData The BMM context data.
299 UpdateDrvAddHandlePage (
300 IN BMM_CALLBACK_DATA
*CallbackData
303 BM_MENU_ENTRY
*NewMenuEntry
;
306 CallbackData
->BmmAskSaveOrNot
= FALSE
;
308 UpdatePageStart (CallbackData
);
310 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
311 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
313 HiiCreateGotoOpCode (
315 FORM_DRV_ADD_HANDLE_DESC_ID
,
316 NewMenuEntry
->DisplayStringToken
,
317 STRING_TOKEN (STR_NULL_STRING
),
318 EFI_IFR_FLAG_CALLBACK
,
319 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
323 UpdatePageEnd (CallbackData
);
327 Create a lit of driver option from global DriverOptionMenu. It
328 allow user to delete the driver option.
330 @param CallbackData The BMM context data.
335 IN BMM_CALLBACK_DATA
*CallbackData
338 BM_MENU_ENTRY
*NewMenuEntry
;
339 BM_LOAD_CONTEXT
*NewLoadContext
;
342 CallbackData
->BmmAskSaveOrNot
= TRUE
;
344 UpdatePageStart (CallbackData
);
346 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
348 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
349 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
350 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
352 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
353 NewLoadContext
->Deleted
= FALSE
;
354 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
356 HiiCreateCheckBoxOpCode (
358 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
359 VARSTORE_ID_BOOT_MAINT
,
360 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
361 NewMenuEntry
->DisplayStringToken
,
362 NewMenuEntry
->HelpStringToken
,
369 UpdatePageEnd (CallbackData
);
373 Prepare the page to allow user to add description for
376 @param CallbackData The BMM context data.
380 UpdateDriverAddHandleDescPage (
381 IN BMM_CALLBACK_DATA
*CallbackData
384 BM_MENU_ENTRY
*NewMenuEntry
;
386 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
387 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
388 CallbackData
->BmmAskSaveOrNot
= TRUE
;
389 NewMenuEntry
= CallbackData
->MenuEntry
;
391 UpdatePageStart (CallbackData
);
393 HiiCreateSubTitleOpCode (
395 NewMenuEntry
->DisplayStringToken
,
401 HiiCreateStringOpCode (
403 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
404 VARSTORE_ID_BOOT_MAINT
,
405 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
406 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
407 STRING_TOKEN (STR_NULL_STRING
),
415 HiiCreateCheckBoxOpCode (
417 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
418 VARSTORE_ID_BOOT_MAINT
,
419 DRV_ADD_RECON_VAR_OFFSET
,
420 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
421 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
427 HiiCreateStringOpCode (
429 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
430 VARSTORE_ID_BOOT_MAINT
,
431 DRIVER_ADD_OPTION_VAR_OFFSET
,
432 STRING_TOKEN (STR_OPTIONAL_DATA
),
433 STRING_TOKEN (STR_NULL_STRING
),
441 UpdatePageEnd (CallbackData
);
447 @param UpdatePageId The form ID to be updated.
448 @param ConsoleMenu The console menu list.
449 @param CallbackData The BMM context data.
454 IN UINT16 UpdatePageId
,
455 IN BM_MENU_OPTION
*ConsoleMenu
,
456 IN BMM_CALLBACK_DATA
*CallbackData
459 BM_MENU_ENTRY
*NewMenuEntry
;
460 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
461 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
466 CallbackData
->BmmAskSaveOrNot
= TRUE
;
468 UpdatePageStart (CallbackData
);
470 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
471 (Index
< (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (UINT8
)))) ; Index
++) {
472 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
473 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
475 if (NewConsoleContext
->IsActive
) {
476 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
477 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
479 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
482 HiiCreateCheckBoxOpCode (
484 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
485 VARSTORE_ID_BOOT_MAINT
,
486 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
487 NewMenuEntry
->DisplayStringToken
,
488 NewMenuEntry
->HelpStringToken
,
495 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
496 (Index2
< (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (UINT8
)))); Index2
++) {
498 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
499 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
501 ASSERT (Index
< MAX_MENU_NUMBER
);
502 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
503 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
504 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
506 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
507 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
509 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
512 HiiCreateCheckBoxOpCode (
514 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
515 VARSTORE_ID_BOOT_MAINT
,
516 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
517 NewMenuEntry
->DisplayStringToken
,
518 NewMenuEntry
->HelpStringToken
,
527 UpdatePageEnd (CallbackData
);
531 Update the page's NV Map if user has changed the order
532 a list. This list can be Boot Order or Driver Order.
534 @param UpdatePageId The form ID to be updated.
535 @param OptionMenu The new list.
536 @param CallbackData The BMM context data.
541 IN UINT16 UpdatePageId
,
542 IN BM_MENU_OPTION
*OptionMenu
,
543 IN BMM_CALLBACK_DATA
*CallbackData
546 BM_MENU_ENTRY
*NewMenuEntry
;
549 VOID
*OptionsOpCodeHandle
;
550 BM_LOAD_CONTEXT
*NewLoadContext
;
551 BOOLEAN BootOptionFound
;
553 EFI_QUESTION_ID QuestionId
;
557 UpdatePageStart (CallbackData
);
559 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
564 switch (UpdatePageId
) {
566 case FORM_BOOT_CHG_ID
:
567 GetBootOrder (CallbackData
);
568 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
569 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
570 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
573 case FORM_DRV_CHG_ID
:
574 GetDriverOrder (CallbackData
);
575 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
576 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
577 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
580 ASSERT (OptionOrder
!= NULL
);
582 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
583 ASSERT (OptionsOpCodeHandle
!= NULL
);
586 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
587 BootOptionFound
= FALSE
;
588 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
589 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
590 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
591 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
592 BootOptionFound
= TRUE
;
596 if (BootOptionFound
) {
597 HiiCreateOneOfOptionOpCode (
599 NewMenuEntry
->DisplayStringToken
,
601 EFI_IFR_TYPE_NUM_SIZE_32
,
602 OptionOrder
[OptionIndex
]
607 if (OptionMenu
->MenuNumber
> 0) {
608 HiiCreateOrderedListOpCode (
609 mStartOpCodeHandle
, // Container for dynamic created opcodes
610 QuestionId
, // Question ID
611 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
612 VarOffset
, // Offset in Buffer Storage
613 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
614 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
616 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
617 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
618 100, // Maximum container
619 OptionsOpCodeHandle
, // Option Opcode list
620 NULL
// Default Opcode is NULL
624 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
626 UpdatePageEnd (CallbackData
);
631 Create the dynamic page to allow user to set
632 the "BootNext" value.
634 @param CallbackData The BMM context data.
639 IN BMM_CALLBACK_DATA
*CallbackData
642 BM_MENU_ENTRY
*NewMenuEntry
;
643 BM_LOAD_CONTEXT
*NewLoadContext
;
644 UINTN NumberOfOptions
;
646 VOID
*OptionsOpCodeHandle
;
648 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
649 CallbackData
->BmmAskSaveOrNot
= TRUE
;
651 UpdatePageStart (CallbackData
);
652 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
654 if (NumberOfOptions
> 0) {
655 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
656 ASSERT (OptionsOpCodeHandle
!= NULL
);
658 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
660 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
661 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
662 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
664 if (NewLoadContext
->IsBootNext
) {
665 HiiCreateOneOfOptionOpCode (
667 NewMenuEntry
->DisplayStringToken
,
668 EFI_IFR_OPTION_DEFAULT
,
669 EFI_IFR_TYPE_NUM_SIZE_16
,
672 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
674 HiiCreateOneOfOptionOpCode (
676 NewMenuEntry
->DisplayStringToken
,
678 EFI_IFR_TYPE_NUM_SIZE_16
,
684 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
685 HiiCreateOneOfOptionOpCode (
687 STRING_TOKEN (STR_NONE
),
688 EFI_IFR_OPTION_DEFAULT
,
689 EFI_IFR_TYPE_NUM_SIZE_16
,
693 HiiCreateOneOfOptionOpCode (
695 STRING_TOKEN (STR_NONE
),
697 EFI_IFR_TYPE_NUM_SIZE_16
,
702 HiiCreateOneOfOpCode (
704 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
705 VARSTORE_ID_BOOT_MAINT
,
706 BOOT_NEXT_VAR_OFFSET
,
707 STRING_TOKEN (STR_BOOT_NEXT
),
708 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
710 EFI_IFR_NUMERIC_SIZE_2
,
715 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
718 UpdatePageEnd (CallbackData
);
722 Create the dynamic page to allow user to set the "TimeOut" value.
724 @param CallbackData The BMM context data.
729 IN BMM_CALLBACK_DATA
*CallbackData
733 VOID
*DefaultOpCodeHandle
;
735 CallbackData
->BmmAskSaveOrNot
= TRUE
;
737 UpdatePageStart (CallbackData
);
739 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
741 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
742 ASSERT (DefaultOpCodeHandle
!= NULL
);
743 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
745 HiiCreateNumericOpCode (
747 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
748 VARSTORE_ID_BOOT_MAINT
,
749 BOOT_TIME_OUT_VAR_OFFSET
,
750 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
751 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
753 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
760 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
762 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
764 UpdatePageEnd (CallbackData
);
769 Refresh the text mode page.
771 @param CallbackData The BMM context data.
776 IN BMM_CALLBACK_DATA
*CallbackData
783 CHAR16 ModeString
[50];
787 EFI_STRING_ID
*ModeToken
;
789 VOID
*OptionsOpCodeHandle
;
790 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
792 ConOut
= gST
->ConOut
;
795 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
797 CallbackData
->BmmAskSaveOrNot
= TRUE
;
799 UpdatePageStart (CallbackData
);
804 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
805 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
806 if (EFI_ERROR (Status
)) {
812 if (ValidMode
== 0) {
816 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
817 ASSERT (OptionsOpCodeHandle
!= NULL
);
819 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
820 ASSERT(ModeToken
!= NULL
);
823 // Determin which mode should be the first entry in menu
825 GetConsoleOutMode (CallbackData
);
828 // Build text mode options
830 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
831 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
832 if (EFI_ERROR (Status
)) {
837 // Build mode string Column x Row
839 UnicodeValueToString (ModeString
, 0, Col
, 0);
840 PStr
= &ModeString
[0];
841 StrnCatS (PStr
, sizeof (ModeString
) / sizeof (ModeString
[0]), L
" x ", StrLen(L
" x ") + 1);
842 PStr
= PStr
+ StrLen (PStr
);
843 UnicodeValueToString (PStr
, 0, Row
, 0);
845 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
847 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
848 HiiCreateOneOfOptionOpCode (
851 EFI_IFR_OPTION_DEFAULT
,
852 EFI_IFR_TYPE_NUM_SIZE_16
,
856 HiiCreateOneOfOptionOpCode (
860 EFI_IFR_TYPE_NUM_SIZE_16
,
867 HiiCreateOneOfOpCode (
869 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
870 VARSTORE_ID_BOOT_MAINT
,
872 STRING_TOKEN (STR_CON_MODE_SETUP
),
873 STRING_TOKEN (STR_CON_MODE_SETUP
),
874 EFI_IFR_FLAG_RESET_REQUIRED
,
875 EFI_IFR_NUMERIC_SIZE_2
,
880 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
881 FreePool (ModeToken
);
883 UpdatePageEnd (CallbackData
);
887 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
888 Parity, Stop Bits, Terminal Type.
890 @param CallbackData The BMM context data.
895 IN BMM_CALLBACK_DATA
*CallbackData
900 BM_MENU_ENTRY
*NewMenuEntry
;
901 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
902 VOID
*OptionsOpCodeHandle
;
904 CallbackData
->BmmAskSaveOrNot
= TRUE
;
906 UpdatePageStart (CallbackData
);
908 NewMenuEntry
= BOpt_GetMenuEntry (
910 CallbackData
->CurrentTerminal
913 if (NewMenuEntry
== NULL
) {
917 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
919 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
920 ASSERT (OptionsOpCodeHandle
!= NULL
);
922 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
924 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
925 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
926 NewTerminalContext
->BaudRateIndex
= Index
;
927 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
930 HiiCreateOneOfOptionOpCode (
932 BaudRateList
[Index
].StringToken
,
934 EFI_IFR_TYPE_NUM_SIZE_8
,
939 HiiCreateOneOfOpCode (
941 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
942 VARSTORE_ID_BOOT_MAINT
,
943 COM_BAUD_RATE_VAR_OFFSET
,
944 STRING_TOKEN (STR_COM_BAUD_RATE
),
945 STRING_TOKEN (STR_COM_BAUD_RATE
),
947 EFI_IFR_NUMERIC_SIZE_1
,
952 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
953 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
954 ASSERT (OptionsOpCodeHandle
!= NULL
);
956 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
959 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
960 NewTerminalContext
->DataBitsIndex
= Index
;
961 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
962 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
965 HiiCreateOneOfOptionOpCode (
967 DataBitsList
[Index
].StringToken
,
969 EFI_IFR_TYPE_NUM_SIZE_8
,
974 HiiCreateOneOfOpCode (
976 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
977 VARSTORE_ID_BOOT_MAINT
,
978 COM_DATA_RATE_VAR_OFFSET
,
979 STRING_TOKEN (STR_COM_DATA_BITS
),
980 STRING_TOKEN (STR_COM_DATA_BITS
),
982 EFI_IFR_NUMERIC_SIZE_1
,
987 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
988 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
989 ASSERT (OptionsOpCodeHandle
!= NULL
);
991 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
993 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
994 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
995 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
996 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
999 HiiCreateOneOfOptionOpCode (
1000 OptionsOpCodeHandle
,
1001 ParityList
[Index
].StringToken
,
1003 EFI_IFR_TYPE_NUM_SIZE_8
,
1008 HiiCreateOneOfOpCode (
1010 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
1011 VARSTORE_ID_BOOT_MAINT
,
1012 COM_PARITY_VAR_OFFSET
,
1013 STRING_TOKEN (STR_COM_PARITY
),
1014 STRING_TOKEN (STR_COM_PARITY
),
1016 EFI_IFR_NUMERIC_SIZE_1
,
1017 OptionsOpCodeHandle
,
1021 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1022 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1023 ASSERT (OptionsOpCodeHandle
!= NULL
);
1025 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
1027 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
1028 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1029 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
1030 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
1033 HiiCreateOneOfOptionOpCode (
1034 OptionsOpCodeHandle
,
1035 StopBitsList
[Index
].StringToken
,
1037 EFI_IFR_TYPE_NUM_SIZE_8
,
1042 HiiCreateOneOfOpCode (
1044 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
1045 VARSTORE_ID_BOOT_MAINT
,
1046 COM_STOP_BITS_VAR_OFFSET
,
1047 STRING_TOKEN (STR_COM_STOP_BITS
),
1048 STRING_TOKEN (STR_COM_STOP_BITS
),
1050 EFI_IFR_NUMERIC_SIZE_1
,
1051 OptionsOpCodeHandle
,
1055 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1056 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1057 ASSERT (OptionsOpCodeHandle
!= NULL
);
1059 for (Index
= 0; Index
< 4; Index
++) {
1061 if (NewTerminalContext
->TerminalType
== Index
) {
1062 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1063 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
1066 HiiCreateOneOfOptionOpCode (
1067 OptionsOpCodeHandle
,
1068 (EFI_STRING_ID
) TerminalType
[Index
],
1070 EFI_IFR_TYPE_NUM_SIZE_8
,
1075 HiiCreateOneOfOpCode (
1077 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
1078 VARSTORE_ID_BOOT_MAINT
,
1079 COM_TERMINAL_VAR_OFFSET
,
1080 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1081 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1083 EFI_IFR_NUMERIC_SIZE_1
,
1084 OptionsOpCodeHandle
,
1088 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1090 UpdatePageEnd (CallbackData
);
1094 Dispatch the correct update page function to call based on
1097 @param UpdatePageId The form ID.
1098 @param CallbackData The BMM context data.
1103 IN UINT16 UpdatePageId
,
1104 IN BMM_CALLBACK_DATA
*CallbackData
1107 CleanUpPage (UpdatePageId
, CallbackData
);
1108 switch (UpdatePageId
) {
1109 case FORM_CON_IN_ID
:
1110 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1113 case FORM_CON_OUT_ID
:
1114 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1117 case FORM_CON_ERR_ID
:
1118 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1121 case FORM_BOOT_CHG_ID
:
1122 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1125 case FORM_DRV_CHG_ID
:
1126 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1135 Dispatch the display to the next page based on NewPageId.
1137 @param Private The BMM context data.
1138 @param NewPageId The original page ID.
1143 BMM_CALLBACK_DATA
*Private
,
1147 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1149 // If we select a handle to add driver option, advance to the add handle description page.
1151 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1152 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1154 // Return to main page after "Save Changes" or "Discard Changes".
1156 NewPageId
= FORM_MAIN_ID
;
1157 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1158 NewPageId
= FORM_CON_COM_SETUP_ID
;
1161 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1162 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1163 Private
->BmmCurrentPageId
= NewPageId
;