2 Dynamically update the pages.
4 Copyright (c) 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 IsShellNodeDevicePath checks for the Shell device path.
238 If it's the shell device path then return TRUE otherwise
241 @param DevicePath The DevicePath to check
243 @retval TRUE DevicePath is Shell
244 @retval FALSE DevicePath is not Shell
248 IsShellNodeDevicePath(
249 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
253 EFI_DEVICE_PATH_PROTOCOL
*Node
;
255 for (Node
= FilePath
; !IsDevicePathEnd(Node
); Node
= NextDevicePathNode(Node
))
257 if ((DevicePathType (Node
) == MEDIA_DEVICE_PATH
) && (DevicePathSubType (Node
) == MEDIA_PIWG_FW_FILE_DP
)) {
258 if (!CompareMem(PcdGetPtr(PcdShellFile
), &(((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*)Node
)->FvFileName
), sizeof(EFI_GUID
)))
266 Create a list of boot option from global BootOptionMenu. It
267 allow user to delete the boot option.
269 @param CallbackData The BMM context data.
274 IN BMM_CALLBACK_DATA
*CallbackData
277 BM_MENU_ENTRY
*NewMenuEntry
;
278 BM_LOAD_CONTEXT
*NewLoadContext
;
281 //CallbackData->BmmAskSaveOrNot = TRUE;
283 UpdatePageStart (CallbackData
);
284 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
286 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
287 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
288 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
289 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
290 if (NewLoadContext
->IsLegacy
) {
295 // Check to see if the current boot option devicepath is the ShellDevice
296 // path. If it is keep only UEFI Shell in the delete boot option list
299 //if ((NULL != NewLoadContext->FilePathList) && (TRUE == IsShellNodeDevicePath(NewLoadContext->FilePathList))) {
300 // NewLoadContext->Deleted = FALSE;
301 // CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;
303 HiiCreateCheckBoxOpCode (
305 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
306 VARSTORE_ID_BOOT_MAINT
,
307 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
308 NewMenuEntry
->DisplayStringToken
,
309 NewMenuEntry
->HelpStringToken
,
318 UpdatePageEnd (CallbackData
);
322 Create a lit of driver option from global DriverMenu.
324 @param CallbackData The BMM context data.
328 UpdateDrvAddHandlePage (
329 IN BMM_CALLBACK_DATA
*CallbackData
332 BM_MENU_ENTRY
*NewMenuEntry
;
335 CallbackData
->BmmAskSaveOrNot
= FALSE
;
337 UpdatePageStart (CallbackData
);
339 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
340 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
342 HiiCreateGotoOpCode (
344 FORM_DRV_ADD_HANDLE_DESC_ID
,
345 NewMenuEntry
->DisplayStringToken
,
346 STRING_TOKEN (STR_NULL_STRING
),
347 EFI_IFR_FLAG_CALLBACK
,
348 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
352 UpdatePageEnd (CallbackData
);
356 Create a lit of driver option from global DriverOptionMenu. It
357 allow user to delete the driver option.
359 @param CallbackData The BMM context data.
364 IN BMM_CALLBACK_DATA
*CallbackData
367 BM_MENU_ENTRY
*NewMenuEntry
;
368 BM_LOAD_CONTEXT
*NewLoadContext
;
371 CallbackData
->BmmAskSaveOrNot
= TRUE
;
373 UpdatePageStart (CallbackData
);
375 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
377 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
378 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
379 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
381 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
382 NewLoadContext
->Deleted
= FALSE
;
383 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
385 HiiCreateCheckBoxOpCode (
387 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
388 VARSTORE_ID_BOOT_MAINT
,
389 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
390 NewMenuEntry
->DisplayStringToken
,
391 NewMenuEntry
->HelpStringToken
,
398 UpdatePageEnd (CallbackData
);
402 Prepare the page to allow user to add description for
405 @param CallbackData The BMM context data.
409 UpdateDriverAddHandleDescPage (
410 IN BMM_CALLBACK_DATA
*CallbackData
413 BM_MENU_ENTRY
*NewMenuEntry
;
415 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
416 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
417 CallbackData
->BmmAskSaveOrNot
= TRUE
;
418 NewMenuEntry
= CallbackData
->MenuEntry
;
420 UpdatePageStart (CallbackData
);
422 HiiCreateSubTitleOpCode (
424 NewMenuEntry
->DisplayStringToken
,
430 HiiCreateStringOpCode (
432 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
433 VARSTORE_ID_BOOT_MAINT
,
434 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
435 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
436 STRING_TOKEN (STR_NULL_STRING
),
444 HiiCreateCheckBoxOpCode (
446 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
447 VARSTORE_ID_BOOT_MAINT
,
448 DRV_ADD_RECON_VAR_OFFSET
,
449 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
450 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
456 HiiCreateStringOpCode (
458 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
459 VARSTORE_ID_BOOT_MAINT
,
460 DRIVER_ADD_OPTION_VAR_OFFSET
,
461 STRING_TOKEN (STR_OPTIONAL_DATA
),
462 STRING_TOKEN (STR_NULL_STRING
),
470 UpdatePageEnd (CallbackData
);
476 @param UpdatePageId The form ID to be updated.
477 @param ConsoleMenu The console menu list.
478 @param CallbackData The BMM context data.
483 IN UINT16 UpdatePageId
,
484 IN BM_MENU_OPTION
*ConsoleMenu
,
485 IN BMM_CALLBACK_DATA
*CallbackData
488 BM_MENU_ENTRY
*NewMenuEntry
;
489 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
490 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
495 CallbackData
->BmmAskSaveOrNot
= TRUE
;
497 UpdatePageStart (CallbackData
);
499 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
500 (Index
< (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (UINT8
)))) ; Index
++) {
501 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
502 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
504 if (NewConsoleContext
->IsActive
) {
505 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
506 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
508 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
511 HiiCreateCheckBoxOpCode (
513 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
514 VARSTORE_ID_BOOT_MAINT
,
515 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
516 NewMenuEntry
->DisplayStringToken
,
517 NewMenuEntry
->HelpStringToken
,
524 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
525 (Index2
< (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (UINT8
)))); Index2
++) {
527 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
528 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
530 ASSERT (Index
< MAX_MENU_NUMBER
);
531 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
532 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
533 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
535 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
536 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
538 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
541 HiiCreateCheckBoxOpCode (
543 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
544 VARSTORE_ID_BOOT_MAINT
,
545 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
546 NewMenuEntry
->DisplayStringToken
,
547 NewMenuEntry
->HelpStringToken
,
556 UpdatePageEnd (CallbackData
);
560 Update the page's NV Map if user has changed the order
561 a list. This list can be Boot Order or Driver Order.
563 @param UpdatePageId The form ID to be updated.
564 @param OptionMenu The new list.
565 @param CallbackData The BMM context data.
570 IN UINT16 UpdatePageId
,
571 IN BM_MENU_OPTION
*OptionMenu
,
572 IN BMM_CALLBACK_DATA
*CallbackData
575 BM_MENU_ENTRY
*NewMenuEntry
;
578 VOID
*OptionsOpCodeHandle
;
579 BM_LOAD_CONTEXT
*NewLoadContext
;
580 BOOLEAN BootOptionFound
;
582 EFI_QUESTION_ID QuestionId
;
586 UpdatePageStart (CallbackData
);
588 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
593 switch (UpdatePageId
) {
595 case FORM_BOOT_CHG_ID
:
596 GetBootOrder (CallbackData
);
597 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
598 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
599 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
602 case FORM_DRV_CHG_ID
:
603 GetDriverOrder (CallbackData
);
604 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
605 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
606 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
609 ASSERT (OptionOrder
!= NULL
);
611 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
612 ASSERT (OptionsOpCodeHandle
!= NULL
);
615 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
616 BootOptionFound
= FALSE
;
617 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
618 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
619 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
620 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
621 BootOptionFound
= TRUE
;
625 if (BootOptionFound
) {
626 HiiCreateOneOfOptionOpCode (
628 NewMenuEntry
->DisplayStringToken
,
630 EFI_IFR_TYPE_NUM_SIZE_32
,
631 OptionOrder
[OptionIndex
]
636 if (OptionMenu
->MenuNumber
> 0) {
637 HiiCreateOrderedListOpCode (
638 mStartOpCodeHandle
, // Container for dynamic created opcodes
639 QuestionId
, // Question ID
640 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
641 VarOffset
, // Offset in Buffer Storage
642 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
643 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
645 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
646 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
647 100, // Maximum container
648 OptionsOpCodeHandle
, // Option Opcode list
649 NULL
// Default Opcode is NULL
653 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
655 UpdatePageEnd (CallbackData
);
660 Create the dynamic page to allow user to set
661 the "BootNext" value.
663 @param CallbackData The BMM context data.
668 IN BMM_CALLBACK_DATA
*CallbackData
671 BM_MENU_ENTRY
*NewMenuEntry
;
672 BM_LOAD_CONTEXT
*NewLoadContext
;
673 UINTN NumberOfOptions
;
675 VOID
*OptionsOpCodeHandle
;
677 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
678 CallbackData
->BmmAskSaveOrNot
= TRUE
;
680 UpdatePageStart (CallbackData
);
681 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
683 if (NumberOfOptions
> 0) {
684 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
685 ASSERT (OptionsOpCodeHandle
!= NULL
);
687 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
689 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
690 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
691 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
693 if (NewLoadContext
->IsBootNext
) {
694 HiiCreateOneOfOptionOpCode (
696 NewMenuEntry
->DisplayStringToken
,
697 EFI_IFR_OPTION_DEFAULT
,
698 EFI_IFR_TYPE_NUM_SIZE_16
,
701 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
703 HiiCreateOneOfOptionOpCode (
705 NewMenuEntry
->DisplayStringToken
,
707 EFI_IFR_TYPE_NUM_SIZE_16
,
713 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
714 HiiCreateOneOfOptionOpCode (
716 STRING_TOKEN (STR_NONE
),
717 EFI_IFR_OPTION_DEFAULT
,
718 EFI_IFR_TYPE_NUM_SIZE_16
,
722 HiiCreateOneOfOptionOpCode (
724 STRING_TOKEN (STR_NONE
),
726 EFI_IFR_TYPE_NUM_SIZE_16
,
731 HiiCreateOneOfOpCode (
733 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
734 VARSTORE_ID_BOOT_MAINT
,
735 BOOT_NEXT_VAR_OFFSET
,
736 STRING_TOKEN (STR_BOOT_NEXT
),
737 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
739 EFI_IFR_NUMERIC_SIZE_2
,
744 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
747 UpdatePageEnd (CallbackData
);
751 Create the dynamic page to allow user to set the "TimeOut" value.
753 @param CallbackData The BMM context data.
758 IN BMM_CALLBACK_DATA
*CallbackData
762 VOID
*DefaultOpCodeHandle
;
764 CallbackData
->BmmAskSaveOrNot
= TRUE
;
766 UpdatePageStart (CallbackData
);
768 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
770 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
771 ASSERT (DefaultOpCodeHandle
!= NULL
);
772 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
774 HiiCreateNumericOpCode (
776 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
777 VARSTORE_ID_BOOT_MAINT
,
778 BOOT_TIME_OUT_VAR_OFFSET
,
779 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
780 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
782 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
789 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
791 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
793 UpdatePageEnd (CallbackData
);
798 Refresh the text mode page.
800 @param CallbackData The BMM context data.
805 IN BMM_CALLBACK_DATA
*CallbackData
812 CHAR16 ModeString
[50];
816 EFI_STRING_ID
*ModeToken
;
818 VOID
*OptionsOpCodeHandle
;
819 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
821 ConOut
= gST
->ConOut
;
824 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
826 CallbackData
->BmmAskSaveOrNot
= TRUE
;
828 UpdatePageStart (CallbackData
);
833 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
834 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
835 if (EFI_ERROR (Status
)) {
841 if (ValidMode
== 0) {
845 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
846 ASSERT (OptionsOpCodeHandle
!= NULL
);
848 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
849 ASSERT(ModeToken
!= NULL
);
852 // Determin which mode should be the first entry in menu
854 GetConsoleOutMode (CallbackData
);
857 // Build text mode options
859 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
860 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
861 if (EFI_ERROR (Status
)) {
866 // Build mode string Column x Row
868 UnicodeValueToString (ModeString
, 0, Col
, 0);
869 PStr
= &ModeString
[0];
870 StrnCat (PStr
, L
" x ", StrLen(L
" x ") + 1);
871 PStr
= PStr
+ StrLen (PStr
);
872 UnicodeValueToString (PStr
, 0, Row
, 0);
874 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
876 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
877 HiiCreateOneOfOptionOpCode (
880 EFI_IFR_OPTION_DEFAULT
,
881 EFI_IFR_TYPE_NUM_SIZE_16
,
885 HiiCreateOneOfOptionOpCode (
889 EFI_IFR_TYPE_NUM_SIZE_16
,
896 HiiCreateOneOfOpCode (
898 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
899 VARSTORE_ID_BOOT_MAINT
,
901 STRING_TOKEN (STR_CON_MODE_SETUP
),
902 STRING_TOKEN (STR_CON_MODE_SETUP
),
903 EFI_IFR_FLAG_RESET_REQUIRED
,
904 EFI_IFR_NUMERIC_SIZE_2
,
909 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
910 FreePool (ModeToken
);
912 UpdatePageEnd (CallbackData
);
916 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
917 Parity, Stop Bits, Terminal Type.
919 @param CallbackData The BMM context data.
924 IN BMM_CALLBACK_DATA
*CallbackData
929 BM_MENU_ENTRY
*NewMenuEntry
;
930 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
931 VOID
*OptionsOpCodeHandle
;
933 CallbackData
->BmmAskSaveOrNot
= TRUE
;
935 UpdatePageStart (CallbackData
);
937 NewMenuEntry
= BOpt_GetMenuEntry (
939 CallbackData
->CurrentTerminal
942 if (NewMenuEntry
== NULL
) {
946 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
948 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
949 ASSERT (OptionsOpCodeHandle
!= NULL
);
951 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
953 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
954 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
955 NewTerminalContext
->BaudRateIndex
= Index
;
956 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
959 HiiCreateOneOfOptionOpCode (
961 BaudRateList
[Index
].StringToken
,
963 EFI_IFR_TYPE_NUM_SIZE_8
,
968 HiiCreateOneOfOpCode (
970 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
971 VARSTORE_ID_BOOT_MAINT
,
972 COM_BAUD_RATE_VAR_OFFSET
,
973 STRING_TOKEN (STR_COM_BAUD_RATE
),
974 STRING_TOKEN (STR_COM_BAUD_RATE
),
976 EFI_IFR_NUMERIC_SIZE_1
,
981 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
982 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
983 ASSERT (OptionsOpCodeHandle
!= NULL
);
985 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
988 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
989 NewTerminalContext
->DataBitsIndex
= Index
;
990 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
991 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
994 HiiCreateOneOfOptionOpCode (
996 DataBitsList
[Index
].StringToken
,
998 EFI_IFR_TYPE_NUM_SIZE_8
,
1003 HiiCreateOneOfOpCode (
1005 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
1006 VARSTORE_ID_BOOT_MAINT
,
1007 COM_DATA_RATE_VAR_OFFSET
,
1008 STRING_TOKEN (STR_COM_DATA_BITS
),
1009 STRING_TOKEN (STR_COM_DATA_BITS
),
1011 EFI_IFR_NUMERIC_SIZE_1
,
1012 OptionsOpCodeHandle
,
1016 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1017 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1018 ASSERT (OptionsOpCodeHandle
!= NULL
);
1020 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
1022 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
1023 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1024 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
1025 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
1028 HiiCreateOneOfOptionOpCode (
1029 OptionsOpCodeHandle
,
1030 ParityList
[Index
].StringToken
,
1032 EFI_IFR_TYPE_NUM_SIZE_8
,
1037 HiiCreateOneOfOpCode (
1039 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
1040 VARSTORE_ID_BOOT_MAINT
,
1041 COM_PARITY_VAR_OFFSET
,
1042 STRING_TOKEN (STR_COM_PARITY
),
1043 STRING_TOKEN (STR_COM_PARITY
),
1045 EFI_IFR_NUMERIC_SIZE_1
,
1046 OptionsOpCodeHandle
,
1050 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1051 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1052 ASSERT (OptionsOpCodeHandle
!= NULL
);
1054 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
1056 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
1057 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1058 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
1059 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
1062 HiiCreateOneOfOptionOpCode (
1063 OptionsOpCodeHandle
,
1064 StopBitsList
[Index
].StringToken
,
1066 EFI_IFR_TYPE_NUM_SIZE_8
,
1071 HiiCreateOneOfOpCode (
1073 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
1074 VARSTORE_ID_BOOT_MAINT
,
1075 COM_STOP_BITS_VAR_OFFSET
,
1076 STRING_TOKEN (STR_COM_STOP_BITS
),
1077 STRING_TOKEN (STR_COM_STOP_BITS
),
1079 EFI_IFR_NUMERIC_SIZE_1
,
1080 OptionsOpCodeHandle
,
1084 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1085 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1086 ASSERT (OptionsOpCodeHandle
!= NULL
);
1088 for (Index
= 0; Index
< 4; Index
++) {
1090 if (NewTerminalContext
->TerminalType
== Index
) {
1091 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1092 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
1095 HiiCreateOneOfOptionOpCode (
1096 OptionsOpCodeHandle
,
1097 (EFI_STRING_ID
) TerminalType
[Index
],
1099 EFI_IFR_TYPE_NUM_SIZE_8
,
1104 HiiCreateOneOfOpCode (
1106 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
1107 VARSTORE_ID_BOOT_MAINT
,
1108 COM_TERMINAL_VAR_OFFSET
,
1109 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1110 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1112 EFI_IFR_NUMERIC_SIZE_1
,
1113 OptionsOpCodeHandle
,
1117 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1119 UpdatePageEnd (CallbackData
);
1123 Dispatch the correct update page function to call based on
1126 @param UpdatePageId The form ID.
1127 @param CallbackData The BMM context data.
1132 IN UINT16 UpdatePageId
,
1133 IN BMM_CALLBACK_DATA
*CallbackData
1136 CleanUpPage (UpdatePageId
, CallbackData
);
1137 switch (UpdatePageId
) {
1138 case FORM_CON_IN_ID
:
1139 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1142 case FORM_CON_OUT_ID
:
1143 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1146 case FORM_CON_ERR_ID
:
1147 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1150 case FORM_BOOT_CHG_ID
:
1151 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1154 case FORM_DRV_CHG_ID
:
1155 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1164 Dispatch the display to the next page based on NewPageId.
1166 @param Private The BMM context data.
1167 @param NewPageId The original page ID.
1172 BMM_CALLBACK_DATA
*Private
,
1176 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1178 // If we select a handle to add driver option, advance to the add handle description page.
1180 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1181 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1183 // Return to main page after "Save Changes" or "Discard Changes".
1185 NewPageId
= FORM_MAIN_ID
;
1186 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1187 NewPageId
= FORM_CON_COM_SETUP_ID
;
1190 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1191 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1192 Private
->BmmCurrentPageId
= NewPageId
;