2 Dynamically update the pages.
4 Copyright (c) 2004 - 2018, 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
,
126 &gBootMaintFormSetGuid
,
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
,
154 &gBootMaintFormSetGuid
,
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
179 BDS_COMMON_OPTION
*Option
;
181 Option
= (BDS_COMMON_OPTION
*) AllocatePool (sizeof (BDS_COMMON_OPTION
));
182 ASSERT (Option
!= NULL
);
183 Option
->Description
= (CHAR16
*) AllocateCopyPool (StrSize (FileContext
->FileName
), FileContext
->FileName
);
184 Option
->DevicePath
= FileContext
->DevicePath
;
185 Option
->LoadOptionsSize
= 0;
186 Option
->LoadOptions
= NULL
;
189 // Since current no boot from removable media directly is allowed */
191 gST
->ConOut
->ClearScreen (gST
->ConOut
);
195 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
202 Create a list of Goto Opcode for all terminal devices logged
203 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
205 @param CallbackData The BMM context data.
209 IN BMM_CALLBACK_DATA
*CallbackData
212 BM_MENU_ENTRY
*NewMenuEntry
;
215 CallbackData
->BmmAskSaveOrNot
= FALSE
;
217 UpdatePageStart (CallbackData
);
220 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
221 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
223 HiiCreateGotoOpCode (
225 FORM_CON_COM_SETUP_ID
,
226 NewMenuEntry
->DisplayStringToken
,
227 STRING_TOKEN (STR_NULL_STRING
),
228 EFI_IFR_FLAG_CALLBACK
,
229 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
233 UpdatePageEnd (CallbackData
);
237 Create a lit 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
) {
265 NewLoadContext
->Deleted
= FALSE
;
267 if (CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.BootOptionDelMark
[Index
]) {
269 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
270 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
271 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
272 // through HiiSetBrowserData function.
274 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = FALSE
;
277 HiiCreateCheckBoxOpCode (
279 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
280 VARSTORE_ID_BOOT_MAINT
,
281 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
282 NewMenuEntry
->DisplayStringToken
,
283 NewMenuEntry
->HelpStringToken
,
284 EFI_IFR_FLAG_CALLBACK
,
290 UpdatePageEnd (CallbackData
);
294 Create a lit of driver option from global DriverMenu.
296 @param CallbackData The BMM context data.
300 UpdateDrvAddHandlePage (
301 IN BMM_CALLBACK_DATA
*CallbackData
304 BM_MENU_ENTRY
*NewMenuEntry
;
307 CallbackData
->BmmAskSaveOrNot
= FALSE
;
309 UpdatePageStart (CallbackData
);
311 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
312 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
314 HiiCreateGotoOpCode (
316 FORM_DRV_ADD_HANDLE_DESC_ID
,
317 NewMenuEntry
->DisplayStringToken
,
318 STRING_TOKEN (STR_NULL_STRING
),
319 EFI_IFR_FLAG_CALLBACK
,
320 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
324 UpdatePageEnd (CallbackData
);
328 Create a lit of driver option from global DriverOptionMenu. It
329 allow user to delete the driver option.
331 @param CallbackData The BMM context data.
336 IN BMM_CALLBACK_DATA
*CallbackData
339 BM_MENU_ENTRY
*NewMenuEntry
;
340 BM_LOAD_CONTEXT
*NewLoadContext
;
343 CallbackData
->BmmAskSaveOrNot
= TRUE
;
345 UpdatePageStart (CallbackData
);
347 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
349 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
350 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
351 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
353 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
354 NewLoadContext
->Deleted
= FALSE
;
356 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
358 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
359 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
360 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
361 // through HiiSetBrowserData function.
363 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
366 HiiCreateCheckBoxOpCode (
368 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
369 VARSTORE_ID_BOOT_MAINT
,
370 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
371 NewMenuEntry
->DisplayStringToken
,
372 NewMenuEntry
->HelpStringToken
,
373 EFI_IFR_FLAG_CALLBACK
,
379 UpdatePageEnd (CallbackData
);
383 Prepare the page to allow user to add description for
386 @param CallbackData The BMM context data.
390 UpdateDriverAddHandleDescPage (
391 IN BMM_CALLBACK_DATA
*CallbackData
394 BM_MENU_ENTRY
*NewMenuEntry
;
396 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
397 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
398 CallbackData
->BmmAskSaveOrNot
= TRUE
;
399 NewMenuEntry
= CallbackData
->MenuEntry
;
401 UpdatePageStart (CallbackData
);
403 HiiCreateSubTitleOpCode (
405 NewMenuEntry
->DisplayStringToken
,
411 HiiCreateStringOpCode (
413 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
414 VARSTORE_ID_BOOT_MAINT
,
415 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
416 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
417 STRING_TOKEN (STR_NULL_STRING
),
425 HiiCreateCheckBoxOpCode (
427 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
428 VARSTORE_ID_BOOT_MAINT
,
429 DRV_ADD_RECON_VAR_OFFSET
,
430 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
431 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
437 HiiCreateStringOpCode (
439 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
440 VARSTORE_ID_BOOT_MAINT
,
441 DRIVER_ADD_OPTION_VAR_OFFSET
,
442 STRING_TOKEN (STR_OPTIONAL_DATA
),
443 STRING_TOKEN (STR_NULL_STRING
),
451 UpdatePageEnd (CallbackData
);
457 @param UpdatePageId The form ID to be updated.
458 @param ConsoleMenu The console menu list.
459 @param CallbackData The BMM context data.
464 IN UINT16 UpdatePageId
,
465 IN BM_MENU_OPTION
*ConsoleMenu
,
466 IN BMM_CALLBACK_DATA
*CallbackData
469 BM_MENU_ENTRY
*NewMenuEntry
;
473 EFI_QUESTION_ID QuestionIdBase
;
474 UINT16 VariableOffsetBase
;
476 UpdatePageStart (CallbackData
);
480 VariableOffsetBase
= 0;
482 switch (UpdatePageId
) {
484 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
485 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
486 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
489 case FORM_CON_OUT_ID
:
490 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
491 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
492 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
495 case FORM_CON_ERR_ID
:
496 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
497 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
498 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
501 ASSERT (ConsoleCheck
!= NULL
);
503 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
504 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
506 if (UpdatePageId
!= FORM_CON_ERR_ID
) {
507 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
509 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
510 HiiCreateCheckBoxOpCode (
512 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
513 VARSTORE_ID_BOOT_MAINT
,
514 (UINT16
) (VariableOffsetBase
+ Index
),
515 NewMenuEntry
->DisplayStringToken
,
516 NewMenuEntry
->HelpStringToken
,
523 UpdatePageEnd (CallbackData
);
527 Update the page's NV Map if user has changed the order
528 a list. This list can be Boot Order or Driver Order.
530 @param UpdatePageId The form ID to be updated.
531 @param OptionMenu The new list.
532 @param CallbackData The BMM context data.
537 IN UINT16 UpdatePageId
,
538 IN BM_MENU_OPTION
*OptionMenu
,
539 IN BMM_CALLBACK_DATA
*CallbackData
542 BM_MENU_ENTRY
*NewMenuEntry
;
545 VOID
*OptionsOpCodeHandle
;
546 BOOLEAN BootOptionFound
;
548 EFI_QUESTION_ID QuestionId
;
552 UpdatePageStart (CallbackData
);
554 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
559 switch (UpdatePageId
) {
561 case FORM_BOOT_CHG_ID
:
563 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
564 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.
565 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,
566 // so we should not get the data from BootOptionMenu to show it.
568 if (CompareMem (CallbackData
->BmmFakeNvData
.BootOptionOrder
, CallbackData
->BmmOldFakeNVData
.BootOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
)) == 0) {
569 GetBootOrder (CallbackData
);
571 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
572 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
573 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
576 case FORM_DRV_CHG_ID
:
578 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
579 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.
580 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,
581 // so we should not get the data from DriverOptionMenu to show it.
583 if (CompareMem (CallbackData
->BmmFakeNvData
.DriverOptionOrder
, CallbackData
->BmmOldFakeNVData
.DriverOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
)) == 0) {
584 GetDriverOrder (CallbackData
);
586 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
587 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
588 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
591 ASSERT (OptionOrder
!= NULL
);
593 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
594 ASSERT (OptionsOpCodeHandle
!= NULL
);
597 for (OptionIndex
= 0; (OptionIndex
< MAX_MENU_NUMBER
&& OptionOrder
[OptionIndex
] != 0); OptionIndex
++) {
598 BootOptionFound
= FALSE
;
599 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
600 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
601 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
602 BootOptionFound
= TRUE
;
606 if (BootOptionFound
) {
607 HiiCreateOneOfOptionOpCode (
609 NewMenuEntry
->DisplayStringToken
,
611 EFI_IFR_TYPE_NUM_SIZE_32
,
612 OptionOrder
[OptionIndex
]
617 if (OptionMenu
->MenuNumber
> 0) {
618 HiiCreateOrderedListOpCode (
619 mStartOpCodeHandle
, // Container for dynamic created opcodes
620 QuestionId
, // Question ID
621 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
622 VarOffset
, // Offset in Buffer Storage
623 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
624 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
626 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
627 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
628 100, // Maximum container
629 OptionsOpCodeHandle
, // Option Opcode list
630 NULL
// Default Opcode is NULL
634 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
636 UpdatePageEnd (CallbackData
);
640 Create the dynamic page to allow user to set
641 the "BootNext" value.
643 @param CallbackData The BMM context data.
648 IN BMM_CALLBACK_DATA
*CallbackData
651 BM_MENU_ENTRY
*NewMenuEntry
;
652 BM_LOAD_CONTEXT
*NewLoadContext
;
653 UINTN NumberOfOptions
;
655 VOID
*OptionsOpCodeHandle
;
657 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
658 CallbackData
->BmmAskSaveOrNot
= TRUE
;
660 UpdatePageStart (CallbackData
);
661 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
663 if (NumberOfOptions
> 0) {
664 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
665 ASSERT (OptionsOpCodeHandle
!= NULL
);
667 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
669 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
670 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
671 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
673 if (NewLoadContext
->IsBootNext
) {
674 HiiCreateOneOfOptionOpCode (
676 NewMenuEntry
->DisplayStringToken
,
677 EFI_IFR_OPTION_DEFAULT
,
678 EFI_IFR_TYPE_NUM_SIZE_16
,
681 //CallbackData->BmmFakeNvData.BootNext = Index;
683 HiiCreateOneOfOptionOpCode (
685 NewMenuEntry
->DisplayStringToken
,
687 EFI_IFR_TYPE_NUM_SIZE_16
,
693 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
694 HiiCreateOneOfOptionOpCode (
696 STRING_TOKEN (STR_NONE
),
697 EFI_IFR_OPTION_DEFAULT
,
698 EFI_IFR_TYPE_NUM_SIZE_16
,
702 HiiCreateOneOfOptionOpCode (
704 STRING_TOKEN (STR_NONE
),
706 EFI_IFR_TYPE_NUM_SIZE_16
,
711 HiiCreateOneOfOpCode (
713 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
714 VARSTORE_ID_BOOT_MAINT
,
715 BOOT_NEXT_VAR_OFFSET
,
716 STRING_TOKEN (STR_BOOT_NEXT
),
717 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
719 EFI_IFR_NUMERIC_SIZE_2
,
724 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
727 UpdatePageEnd (CallbackData
);
731 Create the dynamic page to allow user to set the "TimeOut" value.
733 @param CallbackData The BMM context data.
738 IN BMM_CALLBACK_DATA
*CallbackData
742 VOID
*DefaultOpCodeHandle
;
744 CallbackData
->BmmAskSaveOrNot
= TRUE
;
746 UpdatePageStart (CallbackData
);
748 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
750 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
751 ASSERT (DefaultOpCodeHandle
!= NULL
);
752 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
754 HiiCreateNumericOpCode (
756 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
757 VARSTORE_ID_BOOT_MAINT
,
758 BOOT_TIME_OUT_VAR_OFFSET
,
759 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
760 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
762 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
769 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
771 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
773 UpdatePageEnd (CallbackData
);
777 Refresh the text mode page.
779 @param CallbackData The BMM context data.
784 IN BMM_CALLBACK_DATA
*CallbackData
791 CHAR16 ModeString
[50];
795 EFI_STRING_ID
*ModeToken
;
797 VOID
*OptionsOpCodeHandle
;
798 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
800 ConOut
= gST
->ConOut
;
803 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
805 CallbackData
->BmmAskSaveOrNot
= TRUE
;
807 UpdatePageStart (CallbackData
);
812 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
813 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
814 if (EFI_ERROR (Status
)) {
820 if (ValidMode
== 0) {
824 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
825 ASSERT (OptionsOpCodeHandle
!= NULL
);
827 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
828 ASSERT(ModeToken
!= NULL
);
831 // Determin which mode should be the first entry in menu
833 // GetConsoleOutMode (CallbackData);
836 // Build text mode options
838 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
839 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
840 if (EFI_ERROR (Status
)) {
845 // Build mode string Column x Row
847 UnicodeValueToStringS (ModeString
, sizeof (ModeString
), 0, Col
, 0);
848 PStr
= &ModeString
[0];
849 StrCatS (PStr
, ARRAY_SIZE (ModeString
), L
" x ");
850 PStr
= PStr
+ StrLen (PStr
);
851 UnicodeValueToStringS (
853 sizeof (ModeString
) - ((UINTN
)PStr
- (UINTN
)&ModeString
[0]),
859 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
861 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
862 HiiCreateOneOfOptionOpCode (
865 EFI_IFR_OPTION_DEFAULT
,
866 EFI_IFR_TYPE_NUM_SIZE_16
,
870 HiiCreateOneOfOptionOpCode (
874 EFI_IFR_TYPE_NUM_SIZE_16
,
881 HiiCreateOneOfOpCode (
883 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
884 VARSTORE_ID_BOOT_MAINT
,
886 STRING_TOKEN (STR_CON_MODE_SETUP
),
887 STRING_TOKEN (STR_CON_MODE_SETUP
),
888 EFI_IFR_FLAG_RESET_REQUIRED
,
889 EFI_IFR_NUMERIC_SIZE_2
,
894 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
895 FreePool (ModeToken
);
897 UpdatePageEnd (CallbackData
);
901 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
902 Parity, Stop Bits, Terminal Type.
904 @param CallbackData The BMM context data.
909 IN BMM_CALLBACK_DATA
*CallbackData
914 BM_MENU_ENTRY
*NewMenuEntry
;
915 VOID
*OptionsOpCodeHandle
;
916 UINTN CurrentTerminal
;
918 UpdatePageStart (CallbackData
);
920 CurrentTerminal
= CallbackData
->CurrentTerminal
;
921 NewMenuEntry
= BOpt_GetMenuEntry (
926 if (NewMenuEntry
== NULL
) {
930 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
931 ASSERT (OptionsOpCodeHandle
!= NULL
);
933 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
935 if (BaudRateList
[Index
].Value
== 115200) {
936 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
938 HiiCreateOneOfOptionOpCode (
940 BaudRateList
[Index
].StringToken
,
942 EFI_IFR_TYPE_NUM_SIZE_8
,
947 HiiCreateOneOfOpCode (
949 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
950 VARSTORE_ID_BOOT_MAINT
,
951 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
952 STRING_TOKEN (STR_COM_BAUD_RATE
),
953 STRING_TOKEN (STR_COM_BAUD_RATE
),
955 EFI_IFR_NUMERIC_SIZE_1
,
960 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
961 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
962 ASSERT (OptionsOpCodeHandle
!= NULL
);
964 for (Index
= 0; Index
< ARRAY_SIZE (DataBitsList
); Index
++) {
967 if (DataBitsList
[Index
].Value
== 8) {
968 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
971 HiiCreateOneOfOptionOpCode (
973 DataBitsList
[Index
].StringToken
,
975 EFI_IFR_TYPE_NUM_SIZE_8
,
980 HiiCreateOneOfOpCode (
982 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
983 VARSTORE_ID_BOOT_MAINT
,
984 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
985 STRING_TOKEN (STR_COM_DATA_BITS
),
986 STRING_TOKEN (STR_COM_DATA_BITS
),
988 EFI_IFR_NUMERIC_SIZE_1
,
993 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
994 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
995 ASSERT (OptionsOpCodeHandle
!= NULL
);
997 for (Index
= 0; Index
< ARRAY_SIZE (ParityList
); Index
++) {
999 if (ParityList
[Index
].Value
== NoParity
) {
1000 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1003 HiiCreateOneOfOptionOpCode (
1004 OptionsOpCodeHandle
,
1005 ParityList
[Index
].StringToken
,
1007 EFI_IFR_TYPE_NUM_SIZE_8
,
1012 HiiCreateOneOfOpCode (
1014 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
1015 VARSTORE_ID_BOOT_MAINT
,
1016 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
1017 STRING_TOKEN (STR_COM_PARITY
),
1018 STRING_TOKEN (STR_COM_PARITY
),
1020 EFI_IFR_NUMERIC_SIZE_1
,
1021 OptionsOpCodeHandle
,
1025 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1026 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1027 ASSERT (OptionsOpCodeHandle
!= NULL
);
1029 for (Index
= 0; Index
< ARRAY_SIZE (StopBitsList
); Index
++) {
1031 if (StopBitsList
[Index
].Value
== OneStopBit
) {
1032 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1035 HiiCreateOneOfOptionOpCode (
1036 OptionsOpCodeHandle
,
1037 StopBitsList
[Index
].StringToken
,
1039 EFI_IFR_TYPE_NUM_SIZE_8
,
1044 HiiCreateOneOfOpCode (
1046 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
1047 VARSTORE_ID_BOOT_MAINT
,
1048 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
1049 STRING_TOKEN (STR_COM_STOP_BITS
),
1050 STRING_TOKEN (STR_COM_STOP_BITS
),
1052 EFI_IFR_NUMERIC_SIZE_1
,
1053 OptionsOpCodeHandle
,
1057 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1058 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1059 ASSERT (OptionsOpCodeHandle
!= NULL
);
1061 for (Index
= 0; Index
< 4; Index
++) {
1064 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1067 HiiCreateOneOfOptionOpCode (
1068 OptionsOpCodeHandle
,
1069 (EFI_STRING_ID
) TerminalType
[Index
],
1071 EFI_IFR_TYPE_NUM_SIZE_8
,
1076 HiiCreateOneOfOpCode (
1078 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
1079 VARSTORE_ID_BOOT_MAINT
,
1080 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
1081 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1082 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1084 EFI_IFR_NUMERIC_SIZE_1
,
1085 OptionsOpCodeHandle
,
1089 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1090 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1091 ASSERT (OptionsOpCodeHandle
!= NULL
);
1093 for (Index
= 0; Index
< ARRAY_SIZE (mFlowControlType
); Index
++) {
1096 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1098 HiiCreateOneOfOptionOpCode (
1099 OptionsOpCodeHandle
,
1100 (EFI_STRING_ID
) mFlowControlType
[Index
],
1102 EFI_IFR_TYPE_NUM_SIZE_8
,
1103 mFlowControlValue
[Index
]
1107 HiiCreateOneOfOpCode (
1109 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1110 VARSTORE_ID_BOOT_MAINT
,
1111 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1112 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1113 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1115 EFI_IFR_NUMERIC_SIZE_1
,
1116 OptionsOpCodeHandle
,
1120 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1122 UpdatePageEnd (CallbackData
);
1126 Dispatch the correct update page function to call based on
1129 @param UpdatePageId The form ID.
1130 @param CallbackData The BMM context data.
1135 IN UINT16 UpdatePageId
,
1136 IN BMM_CALLBACK_DATA
*CallbackData
1139 CleanUpPage (UpdatePageId
, CallbackData
);
1140 switch (UpdatePageId
) {
1141 case FORM_CON_IN_ID
:
1142 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1145 case FORM_CON_OUT_ID
:
1146 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1149 case FORM_CON_ERR_ID
:
1150 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1153 case FORM_BOOT_CHG_ID
:
1154 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1157 case FORM_DRV_CHG_ID
:
1158 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1167 Create a dynamic page so that Legacy Device boot order
1168 can be set for specified device type.
1170 @param UpdatePageId The form ID. It also spefies the legacy device type.
1171 @param CallbackData The BMM context data.
1176 UpdateSetLegacyDeviceOrderPage (
1177 IN UINT16 UpdatePageId
,
1178 IN BMM_CALLBACK_DATA
*CallbackData
1181 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
1182 BM_MENU_OPTION
*OptionMenu
;
1183 BM_MENU_ENTRY
*NewMenuEntry
;
1184 EFI_STRING_ID StrRef
;
1185 EFI_STRING_ID StrRefHelp
;
1194 CHAR16
*TypeStrHelp
;
1200 VOID
*OptionsOpCodeHandle
;
1208 BbsType
= BBS_FLOPPY
;
1213 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1214 UpdatePageStart (CallbackData
);
1216 DisMap
= ZeroMem (CallbackData
->BmmOldFakeNVData
.DisableMap
, sizeof (CallbackData
->BmmOldFakeNVData
.DisableMap
));
1219 // Create oneof option list
1221 switch (UpdatePageId
) {
1222 case FORM_SET_FD_ORDER_ID
:
1223 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1224 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1225 TypeStr
= STR_FLOPPY
;
1226 TypeStrHelp
= STR_FLOPPY_HELP
;
1227 BbsType
= BBS_FLOPPY
;
1228 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1229 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1232 case FORM_SET_HD_ORDER_ID
:
1233 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1234 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1235 TypeStr
= STR_HARDDISK
;
1236 TypeStrHelp
= STR_HARDDISK_HELP
;
1237 BbsType
= BBS_HARDDISK
;
1238 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1239 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1242 case FORM_SET_CD_ORDER_ID
:
1243 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1244 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1245 TypeStr
= STR_CDROM
;
1246 TypeStrHelp
= STR_CDROM_HELP
;
1247 BbsType
= BBS_CDROM
;
1248 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1249 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1252 case FORM_SET_NET_ORDER_ID
:
1253 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1254 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1256 TypeStrHelp
= STR_NET_HELP
;
1257 BbsType
= BBS_EMBED_NETWORK
;
1258 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1259 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1262 case FORM_SET_BEV_ORDER_ID
:
1263 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1264 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1266 TypeStrHelp
= STR_BEV_HELP
;
1267 BbsType
= BBS_BEV_DEVICE
;
1268 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1269 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1273 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
1277 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1279 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1280 ASSERT (OptionsOpCodeHandle
!= NULL
);
1282 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1283 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1285 // Create OneOf for each legacy device
1287 HiiCreateOneOfOptionOpCode (
1288 OptionsOpCodeHandle
,
1289 NewMenuEntry
->DisplayStringToken
,
1291 EFI_IFR_TYPE_NUM_SIZE_8
,
1292 (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->BbsIndex
1297 // Create OneOf for item "Disabled"
1299 HiiCreateOneOfOptionOpCode (
1300 OptionsOpCodeHandle
,
1301 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
),
1303 EFI_IFR_TYPE_NUM_SIZE_8
,
1308 // Get Device Order from variable
1310 VarData
= BdsLibGetVariableAndSize (
1311 VAR_LEGACY_DEV_ORDER
,
1312 &gEfiLegacyDevOrderVariableGuid
,
1316 if (NULL
!= VarData
) {
1317 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1318 while (VarData
< VarData
+ VarSize
) {
1319 if (DevOrder
->BbsType
== BbsType
) {
1323 VarData
= (UINT8
*)((UINTN
)VarData
+ sizeof (BBS_TYPE
));
1324 VarData
+= *(UINT16
*) VarData
;
1325 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1328 // Create oneof tag here for FD/HD/CD #1 #2
1330 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1332 // Create the string for oneof tag
1334 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1335 StrRef
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1337 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1338 StrRefHelp
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1340 HiiCreateOneOfOpCode (
1342 (EFI_QUESTION_ID
) (Key
+ Index
),
1343 VARSTORE_ID_BOOT_MAINT
,
1344 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1347 EFI_IFR_FLAG_CALLBACK
,
1348 EFI_IFR_NUMERIC_SIZE_1
,
1349 OptionsOpCodeHandle
,
1353 VarDevOrder
= *(UINT16
*) ((UINTN
) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1355 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1356 LegacyOrder
[Index
] = 0xFF;
1357 Pos
= (VarDevOrder
& 0xFF) / 8;
1358 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1359 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1361 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1366 CopyMem (OldData
, LegacyOrder
, 100);
1368 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1370 UpdatePageEnd (CallbackData
);
1375 Dispatch the display to the next page based on NewPageId.
1377 @param Private The BMM context data.
1378 @param NewPageId The original page ID.
1383 BMM_CALLBACK_DATA
*Private
,
1388 // For the question don't impact the page update, just ignore it.
1390 if (((NewPageId
>= BOOT_OPTION_DEL_QUESTION_ID
) && (NewPageId
< BOOT_OPTION_DEL_QUESTION_ID
+ MAX_MENU_NUMBER
)) ||
1391 ((NewPageId
>= DRIVER_OPTION_DEL_QUESTION_ID
) && (NewPageId
< DRIVER_OPTION_DEL_QUESTION_ID
+ MAX_MENU_NUMBER
))) {
1395 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1397 // If we select a handle to add driver option, advance to the add handle description page.
1399 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1400 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1402 // Return to main page after "Save Changes" or "Discard Changes".
1404 NewPageId
= FORM_MAIN_ID
;
1405 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1406 NewPageId
= FORM_CON_COM_SETUP_ID
;
1409 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1410 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1411 Private
->BmmCurrentPageId
= NewPageId
;