2 Dynamically update the pages.
4 Copyright (c) 2004 - 2014, 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
;
266 //CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;
268 HiiCreateCheckBoxOpCode (
270 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
271 VARSTORE_ID_BOOT_MAINT
,
272 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
273 NewMenuEntry
->DisplayStringToken
,
274 NewMenuEntry
->HelpStringToken
,
281 UpdatePageEnd (CallbackData
);
285 Create a lit of driver option from global DriverMenu.
287 @param CallbackData The BMM context data.
291 UpdateDrvAddHandlePage (
292 IN BMM_CALLBACK_DATA
*CallbackData
295 BM_MENU_ENTRY
*NewMenuEntry
;
298 CallbackData
->BmmAskSaveOrNot
= FALSE
;
300 UpdatePageStart (CallbackData
);
302 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
303 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
305 HiiCreateGotoOpCode (
307 FORM_DRV_ADD_HANDLE_DESC_ID
,
308 NewMenuEntry
->DisplayStringToken
,
309 STRING_TOKEN (STR_NULL_STRING
),
310 EFI_IFR_FLAG_CALLBACK
,
311 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
315 UpdatePageEnd (CallbackData
);
319 Create a lit of driver option from global DriverOptionMenu. It
320 allow user to delete the driver option.
322 @param CallbackData The BMM context data.
327 IN BMM_CALLBACK_DATA
*CallbackData
330 BM_MENU_ENTRY
*NewMenuEntry
;
331 BM_LOAD_CONTEXT
*NewLoadContext
;
334 CallbackData
->BmmAskSaveOrNot
= TRUE
;
336 UpdatePageStart (CallbackData
);
338 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
340 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
341 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
342 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
344 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
345 NewLoadContext
->Deleted
= FALSE
;
346 //CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;
348 HiiCreateCheckBoxOpCode (
350 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
351 VARSTORE_ID_BOOT_MAINT
,
352 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
353 NewMenuEntry
->DisplayStringToken
,
354 NewMenuEntry
->HelpStringToken
,
361 UpdatePageEnd (CallbackData
);
365 Prepare the page to allow user to add description for
368 @param CallbackData The BMM context data.
372 UpdateDriverAddHandleDescPage (
373 IN BMM_CALLBACK_DATA
*CallbackData
376 BM_MENU_ENTRY
*NewMenuEntry
;
378 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
379 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
380 CallbackData
->BmmAskSaveOrNot
= TRUE
;
381 NewMenuEntry
= CallbackData
->MenuEntry
;
383 UpdatePageStart (CallbackData
);
385 HiiCreateSubTitleOpCode (
387 NewMenuEntry
->DisplayStringToken
,
393 HiiCreateStringOpCode (
395 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
396 VARSTORE_ID_BOOT_MAINT
,
397 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
398 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
399 STRING_TOKEN (STR_NULL_STRING
),
407 HiiCreateCheckBoxOpCode (
409 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
410 VARSTORE_ID_BOOT_MAINT
,
411 DRV_ADD_RECON_VAR_OFFSET
,
412 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
413 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
419 HiiCreateStringOpCode (
421 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
422 VARSTORE_ID_BOOT_MAINT
,
423 DRIVER_ADD_OPTION_VAR_OFFSET
,
424 STRING_TOKEN (STR_OPTIONAL_DATA
),
425 STRING_TOKEN (STR_NULL_STRING
),
433 UpdatePageEnd (CallbackData
);
439 @param UpdatePageId The form ID to be updated.
440 @param ConsoleMenu The console menu list.
441 @param CallbackData The BMM context data.
446 IN UINT16 UpdatePageId
,
447 IN BM_MENU_OPTION
*ConsoleMenu
,
448 IN BMM_CALLBACK_DATA
*CallbackData
451 BM_MENU_ENTRY
*NewMenuEntry
;
455 EFI_QUESTION_ID QuestionIdBase
;
456 UINT16 VariableOffsetBase
;
458 UpdatePageStart (CallbackData
);
462 VariableOffsetBase
= 0;
464 switch (UpdatePageId
) {
466 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
467 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
468 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
471 case FORM_CON_OUT_ID
:
472 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
473 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
474 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
477 case FORM_CON_ERR_ID
:
478 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
479 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
480 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
483 ASSERT (ConsoleCheck
!= NULL
);
485 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
486 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
488 if (UpdatePageId
!= FORM_CON_ERR_ID
) {
489 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
491 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
492 HiiCreateCheckBoxOpCode (
494 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
495 VARSTORE_ID_BOOT_MAINT
,
496 (UINT16
) (VariableOffsetBase
+ Index
),
497 NewMenuEntry
->DisplayStringToken
,
498 NewMenuEntry
->HelpStringToken
,
505 UpdatePageEnd (CallbackData
);
509 Update the page's NV Map if user has changed the order
510 a list. This list can be Boot Order or Driver Order.
512 @param UpdatePageId The form ID to be updated.
513 @param OptionMenu The new list.
514 @param CallbackData The BMM context data.
519 IN UINT16 UpdatePageId
,
520 IN BM_MENU_OPTION
*OptionMenu
,
521 IN BMM_CALLBACK_DATA
*CallbackData
524 BM_MENU_ENTRY
*NewMenuEntry
;
527 VOID
*OptionsOpCodeHandle
;
528 BM_LOAD_CONTEXT
*NewLoadContext
;
529 BOOLEAN BootOptionFound
;
531 EFI_QUESTION_ID QuestionId
;
535 UpdatePageStart (CallbackData
);
537 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
542 switch (UpdatePageId
) {
544 case FORM_BOOT_CHG_ID
:
545 //GetBootOrder (CallbackData);
546 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
547 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
548 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
551 case FORM_DRV_CHG_ID
:
552 //GetDriverOrder (CallbackData);
553 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
554 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
555 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
558 ASSERT (OptionOrder
!= NULL
);
560 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
561 ASSERT (OptionsOpCodeHandle
!= NULL
);
564 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
565 BootOptionFound
= FALSE
;
566 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
567 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
568 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
569 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
570 BootOptionFound
= TRUE
;
574 if (BootOptionFound
) {
575 HiiCreateOneOfOptionOpCode (
577 NewMenuEntry
->DisplayStringToken
,
579 EFI_IFR_TYPE_NUM_SIZE_32
,
580 OptionOrder
[OptionIndex
]
585 if (OptionMenu
->MenuNumber
> 0) {
586 HiiCreateOrderedListOpCode (
587 mStartOpCodeHandle
, // Container for dynamic created opcodes
588 QuestionId
, // Question ID
589 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
590 VarOffset
, // Offset in Buffer Storage
591 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
592 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
594 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
595 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
596 100, // Maximum container
597 OptionsOpCodeHandle
, // Option Opcode list
598 NULL
// Default Opcode is NULL
602 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
604 UpdatePageEnd (CallbackData
);
608 Create the dynamic page to allow user to set
609 the "BootNext" value.
611 @param CallbackData The BMM context data.
616 IN BMM_CALLBACK_DATA
*CallbackData
619 BM_MENU_ENTRY
*NewMenuEntry
;
620 BM_LOAD_CONTEXT
*NewLoadContext
;
621 UINTN NumberOfOptions
;
623 VOID
*OptionsOpCodeHandle
;
625 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
626 CallbackData
->BmmAskSaveOrNot
= TRUE
;
628 UpdatePageStart (CallbackData
);
629 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
631 if (NumberOfOptions
> 0) {
632 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
633 ASSERT (OptionsOpCodeHandle
!= NULL
);
635 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
637 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
638 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
639 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
641 if (NewLoadContext
->IsBootNext
) {
642 HiiCreateOneOfOptionOpCode (
644 NewMenuEntry
->DisplayStringToken
,
645 EFI_IFR_OPTION_DEFAULT
,
646 EFI_IFR_TYPE_NUM_SIZE_16
,
649 //CallbackData->BmmFakeNvData.BootNext = Index;
651 HiiCreateOneOfOptionOpCode (
653 NewMenuEntry
->DisplayStringToken
,
655 EFI_IFR_TYPE_NUM_SIZE_16
,
661 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
662 HiiCreateOneOfOptionOpCode (
664 STRING_TOKEN (STR_NONE
),
665 EFI_IFR_OPTION_DEFAULT
,
666 EFI_IFR_TYPE_NUM_SIZE_16
,
670 HiiCreateOneOfOptionOpCode (
672 STRING_TOKEN (STR_NONE
),
674 EFI_IFR_TYPE_NUM_SIZE_16
,
679 HiiCreateOneOfOpCode (
681 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
682 VARSTORE_ID_BOOT_MAINT
,
683 BOOT_NEXT_VAR_OFFSET
,
684 STRING_TOKEN (STR_BOOT_NEXT
),
685 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
687 EFI_IFR_NUMERIC_SIZE_2
,
692 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
695 UpdatePageEnd (CallbackData
);
699 Create the dynamic page to allow user to set the "TimeOut" value.
701 @param CallbackData The BMM context data.
706 IN BMM_CALLBACK_DATA
*CallbackData
710 VOID
*DefaultOpCodeHandle
;
712 CallbackData
->BmmAskSaveOrNot
= TRUE
;
714 UpdatePageStart (CallbackData
);
716 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
718 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
719 ASSERT (DefaultOpCodeHandle
!= NULL
);
720 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
722 HiiCreateNumericOpCode (
724 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
725 VARSTORE_ID_BOOT_MAINT
,
726 BOOT_TIME_OUT_VAR_OFFSET
,
727 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
728 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
730 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
737 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
739 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
741 UpdatePageEnd (CallbackData
);
745 Refresh the text mode page.
747 @param CallbackData The BMM context data.
752 IN BMM_CALLBACK_DATA
*CallbackData
759 CHAR16 ModeString
[50];
763 EFI_STRING_ID
*ModeToken
;
765 VOID
*OptionsOpCodeHandle
;
766 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
768 ConOut
= gST
->ConOut
;
771 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
773 CallbackData
->BmmAskSaveOrNot
= TRUE
;
775 UpdatePageStart (CallbackData
);
780 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
781 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
782 if (EFI_ERROR (Status
)) {
788 if (ValidMode
== 0) {
792 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
793 ASSERT (OptionsOpCodeHandle
!= NULL
);
795 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
796 ASSERT(ModeToken
!= NULL
);
799 // Determin which mode should be the first entry in menu
801 // GetConsoleOutMode (CallbackData);
804 // Build text mode options
806 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
807 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
808 if (EFI_ERROR (Status
)) {
813 // Build mode string Column x Row
815 UnicodeValueToString (ModeString
, 0, Col
, 0);
816 PStr
= &ModeString
[0];
817 StrnCat (PStr
, L
" x ", StrLen(L
" x ") + 1);
818 PStr
= PStr
+ StrLen (PStr
);
819 UnicodeValueToString (PStr
, 0, Row
, 0);
821 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
823 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
824 HiiCreateOneOfOptionOpCode (
827 EFI_IFR_OPTION_DEFAULT
,
828 EFI_IFR_TYPE_NUM_SIZE_16
,
832 HiiCreateOneOfOptionOpCode (
836 EFI_IFR_TYPE_NUM_SIZE_16
,
843 HiiCreateOneOfOpCode (
845 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
846 VARSTORE_ID_BOOT_MAINT
,
848 STRING_TOKEN (STR_CON_MODE_SETUP
),
849 STRING_TOKEN (STR_CON_MODE_SETUP
),
850 EFI_IFR_FLAG_RESET_REQUIRED
,
851 EFI_IFR_NUMERIC_SIZE_2
,
856 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
857 FreePool (ModeToken
);
859 UpdatePageEnd (CallbackData
);
863 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
864 Parity, Stop Bits, Terminal Type.
866 @param CallbackData The BMM context data.
871 IN BMM_CALLBACK_DATA
*CallbackData
876 BM_MENU_ENTRY
*NewMenuEntry
;
877 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
878 VOID
*OptionsOpCodeHandle
;
879 UINTN CurrentTerminal
;
881 UpdatePageStart (CallbackData
);
883 CurrentTerminal
= CallbackData
->CurrentTerminal
;
884 NewMenuEntry
= BOpt_GetMenuEntry (
889 if (NewMenuEntry
== NULL
) {
893 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
895 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
896 ASSERT (OptionsOpCodeHandle
!= NULL
);
898 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
900 if (BaudRateList
[Index
].Value
== 115200) {
901 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
903 HiiCreateOneOfOptionOpCode (
905 BaudRateList
[Index
].StringToken
,
907 EFI_IFR_TYPE_NUM_SIZE_8
,
912 HiiCreateOneOfOpCode (
914 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
915 VARSTORE_ID_BOOT_MAINT
,
916 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
917 STRING_TOKEN (STR_COM_BAUD_RATE
),
918 STRING_TOKEN (STR_COM_BAUD_RATE
),
920 EFI_IFR_NUMERIC_SIZE_1
,
925 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
926 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
927 ASSERT (OptionsOpCodeHandle
!= NULL
);
929 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
932 if (DataBitsList
[Index
].Value
== 8) {
933 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
936 HiiCreateOneOfOptionOpCode (
938 DataBitsList
[Index
].StringToken
,
940 EFI_IFR_TYPE_NUM_SIZE_8
,
945 HiiCreateOneOfOpCode (
947 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
948 VARSTORE_ID_BOOT_MAINT
,
949 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
950 STRING_TOKEN (STR_COM_DATA_BITS
),
951 STRING_TOKEN (STR_COM_DATA_BITS
),
953 EFI_IFR_NUMERIC_SIZE_1
,
958 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
959 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
960 ASSERT (OptionsOpCodeHandle
!= NULL
);
962 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
964 if (ParityList
[Index
].Value
== NoParity
) {
965 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
968 HiiCreateOneOfOptionOpCode (
970 ParityList
[Index
].StringToken
,
972 EFI_IFR_TYPE_NUM_SIZE_8
,
977 HiiCreateOneOfOpCode (
979 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
980 VARSTORE_ID_BOOT_MAINT
,
981 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
982 STRING_TOKEN (STR_COM_PARITY
),
983 STRING_TOKEN (STR_COM_PARITY
),
985 EFI_IFR_NUMERIC_SIZE_1
,
990 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
991 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
992 ASSERT (OptionsOpCodeHandle
!= NULL
);
994 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
996 if (StopBitsList
[Index
].Value
== OneStopBit
) {
997 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1000 HiiCreateOneOfOptionOpCode (
1001 OptionsOpCodeHandle
,
1002 StopBitsList
[Index
].StringToken
,
1004 EFI_IFR_TYPE_NUM_SIZE_8
,
1009 HiiCreateOneOfOpCode (
1011 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
1012 VARSTORE_ID_BOOT_MAINT
,
1013 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
1014 STRING_TOKEN (STR_COM_STOP_BITS
),
1015 STRING_TOKEN (STR_COM_STOP_BITS
),
1017 EFI_IFR_NUMERIC_SIZE_1
,
1018 OptionsOpCodeHandle
,
1022 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1023 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1024 ASSERT (OptionsOpCodeHandle
!= NULL
);
1026 for (Index
= 0; Index
< 4; Index
++) {
1029 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1032 HiiCreateOneOfOptionOpCode (
1033 OptionsOpCodeHandle
,
1034 (EFI_STRING_ID
) TerminalType
[Index
],
1036 EFI_IFR_TYPE_NUM_SIZE_8
,
1041 HiiCreateOneOfOpCode (
1043 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
1044 VARSTORE_ID_BOOT_MAINT
,
1045 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
1046 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1047 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1049 EFI_IFR_NUMERIC_SIZE_1
,
1050 OptionsOpCodeHandle
,
1054 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1055 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1056 ASSERT (OptionsOpCodeHandle
!= NULL
);
1058 for (Index
= 0; Index
< sizeof (mFlowControlType
) / sizeof (mFlowControlType
[0]); Index
++) {
1061 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1063 HiiCreateOneOfOptionOpCode (
1064 OptionsOpCodeHandle
,
1065 (EFI_STRING_ID
) mFlowControlType
[Index
],
1067 EFI_IFR_TYPE_NUM_SIZE_8
,
1068 mFlowControlValue
[Index
]
1072 HiiCreateOneOfOpCode (
1074 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1075 VARSTORE_ID_BOOT_MAINT
,
1076 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1077 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1078 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1080 EFI_IFR_NUMERIC_SIZE_1
,
1081 OptionsOpCodeHandle
,
1085 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1087 UpdatePageEnd (CallbackData
);
1091 Dispatch the correct update page function to call based on
1094 @param UpdatePageId The form ID.
1095 @param CallbackData The BMM context data.
1100 IN UINT16 UpdatePageId
,
1101 IN BMM_CALLBACK_DATA
*CallbackData
1104 CleanUpPage (UpdatePageId
, CallbackData
);
1105 switch (UpdatePageId
) {
1106 case FORM_CON_IN_ID
:
1107 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1110 case FORM_CON_OUT_ID
:
1111 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1114 case FORM_CON_ERR_ID
:
1115 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1118 case FORM_BOOT_CHG_ID
:
1119 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1122 case FORM_DRV_CHG_ID
:
1123 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1132 Create a dynamic page so that Legacy Device boot order
1133 can be set for specified device type.
1135 @param UpdatePageId The form ID. It also spefies the legacy device type.
1136 @param CallbackData The BMM context data.
1141 UpdateSetLegacyDeviceOrderPage (
1142 IN UINT16 UpdatePageId
,
1143 IN BMM_CALLBACK_DATA
*CallbackData
1146 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
1147 BM_MENU_OPTION
*OptionMenu
;
1148 BM_MENU_ENTRY
*NewMenuEntry
;
1149 EFI_STRING_ID StrRef
;
1150 EFI_STRING_ID StrRefHelp
;
1159 CHAR16
*TypeStrHelp
;
1165 VOID
*OptionsOpCodeHandle
;
1173 BbsType
= BBS_FLOPPY
;
1178 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1179 UpdatePageStart (CallbackData
);
1181 DisMap
= ZeroMem (CallbackData
->BmmOldFakeNVData
.DisableMap
, sizeof (CallbackData
->BmmOldFakeNVData
.DisableMap
));
1184 // Create oneof option list
1186 switch (UpdatePageId
) {
1187 case FORM_SET_FD_ORDER_ID
:
1188 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1189 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1190 TypeStr
= STR_FLOPPY
;
1191 TypeStrHelp
= STR_FLOPPY_HELP
;
1192 BbsType
= BBS_FLOPPY
;
1193 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1194 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1197 case FORM_SET_HD_ORDER_ID
:
1198 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1199 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1200 TypeStr
= STR_HARDDISK
;
1201 TypeStrHelp
= STR_HARDDISK_HELP
;
1202 BbsType
= BBS_HARDDISK
;
1203 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1204 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1207 case FORM_SET_CD_ORDER_ID
:
1208 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1209 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1210 TypeStr
= STR_CDROM
;
1211 TypeStrHelp
= STR_CDROM_HELP
;
1212 BbsType
= BBS_CDROM
;
1213 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1214 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1217 case FORM_SET_NET_ORDER_ID
:
1218 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1219 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1221 TypeStrHelp
= STR_NET_HELP
;
1222 BbsType
= BBS_EMBED_NETWORK
;
1223 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1224 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1227 case FORM_SET_BEV_ORDER_ID
:
1228 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1229 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1231 TypeStrHelp
= STR_BEV_HELP
;
1232 BbsType
= BBS_BEV_DEVICE
;
1233 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1234 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1238 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
1242 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1244 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1245 ASSERT (OptionsOpCodeHandle
!= NULL
);
1247 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1248 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1250 // Create OneOf for each legacy device
1252 HiiCreateOneOfOptionOpCode (
1253 OptionsOpCodeHandle
,
1254 NewMenuEntry
->DisplayStringToken
,
1256 EFI_IFR_TYPE_NUM_SIZE_8
,
1257 (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->BbsIndex
1262 // Create OneOf for item "Disabled"
1264 HiiCreateOneOfOptionOpCode (
1265 OptionsOpCodeHandle
,
1266 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
),
1268 EFI_IFR_TYPE_NUM_SIZE_8
,
1273 // Get Device Order from variable
1275 VarData
= BdsLibGetVariableAndSize (
1276 VAR_LEGACY_DEV_ORDER
,
1277 &gEfiLegacyDevOrderVariableGuid
,
1281 if (NULL
!= VarData
) {
1282 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1283 while (VarData
< VarData
+ VarSize
) {
1284 if (DevOrder
->BbsType
== BbsType
) {
1288 VarData
+= sizeof (BBS_TYPE
);
1289 VarData
+= *(UINT16
*) VarData
;
1290 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1293 // Create oneof tag here for FD/HD/CD #1 #2
1295 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1297 // Create the string for oneof tag
1299 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1300 StrRef
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1302 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1303 StrRefHelp
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1305 HiiCreateOneOfOpCode (
1307 (EFI_QUESTION_ID
) (Key
+ Index
),
1308 VARSTORE_ID_BOOT_MAINT
,
1309 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1312 EFI_IFR_FLAG_CALLBACK
,
1313 EFI_IFR_NUMERIC_SIZE_1
,
1314 OptionsOpCodeHandle
,
1318 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1320 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1321 LegacyOrder
[Index
] = 0xFF;
1322 Pos
= (VarDevOrder
& 0xFF) / 8;
1323 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1324 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1326 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1331 CopyMem (OldData
, LegacyOrder
, 100);
1333 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1335 UpdatePageEnd (CallbackData
);
1340 Dispatch the display to the next page based on NewPageId.
1342 @param Private The BMM context data.
1343 @param NewPageId The original page ID.
1348 BMM_CALLBACK_DATA
*Private
,
1352 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1354 // If we select a handle to add driver option, advance to the add handle description page.
1356 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1357 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1359 // Return to main page after "Save Changes" or "Discard Changes".
1361 NewPageId
= FORM_MAIN_ID
;
1362 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1363 NewPageId
= FORM_CON_COM_SETUP_ID
;
1366 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1367 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1368 Private
->BmmCurrentPageId
= NewPageId
;