2 Dynamically update the pages.
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. 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.
26 gUpdateData
.Offset
= 0;
30 Add a "Go back to main page" tag in front of the form when there are no
31 "Apply changes" and "Discard changes" tags in the end of the form.
33 @param CallbackData The BMM context data.
38 IN BMM_CALLBACK_DATA
*CallbackData
43 if (!(CallbackData
->BmmAskSaveOrNot
)) {
45 // Add a "Go back to main page" tag in front of the form when there are no
46 // "Apply changes" and "Discard changes" tags in the end of the form.
50 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
51 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
61 Create the "Apply changes" and "Discard changes" tags. And
62 ensure user can return to the main page.
64 @param CallbackData The BMM context data.
69 IN BMM_CALLBACK_DATA
*CallbackData
73 // Create the "Apply changes" and "Discard changes" tags.
75 if (CallbackData
->BmmAskSaveOrNot
) {
76 CreateSubTitleOpCode (
77 STRING_TOKEN (STR_NULL_STRING
),
86 STRING_TOKEN (STR_SAVE_AND_EXIT
),
87 STRING_TOKEN (STR_NULL_STRING
),
88 EFI_IFR_FLAG_CALLBACK
,
89 KEY_VALUE_SAVE_AND_EXIT
,
95 // Ensure user can return to the main page.
99 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
100 STRING_TOKEN (STR_NULL_STRING
),
101 EFI_IFR_FLAG_CALLBACK
,
102 KEY_VALUE_NO_SAVE_AND_EXIT
,
107 CallbackData
->BmmHiiHandle
,
109 CallbackData
->BmmCurrentPageId
,
110 CallbackData
->BmmCurrentPageId
,
117 Clean up the dynamic opcode at label and form specified by both LabelId.
119 @param LabelId It is both the Form ID and Label ID for opcode deletion.
120 @param CallbackData The BMM context data.
126 IN BMM_CALLBACK_DATA
*CallbackData
129 RefreshUpdateData ();
132 // Remove all op-codes from dynamic page
135 CallbackData
->BmmHiiHandle
,
145 Boot a file selected by user at File Expoloer of BMM.
147 @param FileContext The file context data, which contains the device path
148 of the file to be boot from.
150 @retval EFI_SUCCESS The function completed successfull.
151 @return Other value if the boot from the file fails.
156 IN BM_FILE_CONTEXT
*FileContext
162 BDS_COMMON_OPTION
*Option
;
164 Option
= (BDS_COMMON_OPTION
*) AllocatePool (sizeof (BDS_COMMON_OPTION
));
165 ASSERT (Option
!= NULL
);
166 Option
->Description
= FileContext
->FileName
;
167 Option
->DevicePath
= FileContext
->DevicePath
;
168 Option
->LoadOptionsSize
= 0;
169 Option
->LoadOptions
= NULL
;
172 // Since current no boot from removable media directly is allowed */
174 gST
->ConOut
->ClearScreen (gST
->ConOut
);
178 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
185 Create a list of Goto Opcode for all terminal devices logged
186 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
188 @param CallbackData The BMM context data.
192 IN BMM_CALLBACK_DATA
*CallbackData
195 BM_MENU_ENTRY
*NewMenuEntry
;
198 CallbackData
->BmmAskSaveOrNot
= FALSE
;
200 UpdatePageStart (CallbackData
);
203 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
204 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
207 FORM_CON_COM_SETUP_ID
,
208 NewMenuEntry
->DisplayStringToken
,
209 STRING_TOKEN (STR_NULL_STRING
),
210 EFI_IFR_FLAG_CALLBACK
,
211 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
216 UpdatePageEnd (CallbackData
);
220 Create a lit of boot option from global BootOptionMenu. It
221 allow user to delete the boot option.
223 @param CallbackData The BMM context data.
228 IN BMM_CALLBACK_DATA
*CallbackData
231 BM_MENU_ENTRY
*NewMenuEntry
;
232 BM_LOAD_CONTEXT
*NewLoadContext
;
235 CallbackData
->BmmAskSaveOrNot
= TRUE
;
237 UpdatePageStart (CallbackData
);
238 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
240 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
241 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
242 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
243 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
244 if (NewLoadContext
->IsLegacy
) {
248 NewLoadContext
->Deleted
= FALSE
;
249 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = 0x00;
251 CreateCheckBoxOpCode (
252 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
253 VARSTORE_ID_BOOT_MAINT
,
254 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
255 NewMenuEntry
->DisplayStringToken
,
256 NewMenuEntry
->HelpStringToken
,
263 UpdatePageEnd (CallbackData
);
267 Create a lit of driver option from global DriverMenu.
269 @param CallbackData The BMM context data.
273 UpdateDrvAddHandlePage (
274 IN BMM_CALLBACK_DATA
*CallbackData
277 BM_MENU_ENTRY
*NewMenuEntry
;
280 CallbackData
->BmmAskSaveOrNot
= FALSE
;
282 UpdatePageStart (CallbackData
);
284 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
285 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
288 FORM_DRV_ADD_HANDLE_DESC_ID
,
289 NewMenuEntry
->DisplayStringToken
,
290 STRING_TOKEN (STR_NULL_STRING
),
291 EFI_IFR_FLAG_CALLBACK
,
292 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
297 UpdatePageEnd (CallbackData
);
301 Create a lit of driver option from global DriverOptionMenu. It
302 allow user to delete the driver option.
304 @param CallbackData The BMM context data.
309 IN BMM_CALLBACK_DATA
*CallbackData
312 BM_MENU_ENTRY
*NewMenuEntry
;
313 BM_LOAD_CONTEXT
*NewLoadContext
;
316 CallbackData
->BmmAskSaveOrNot
= TRUE
;
318 UpdatePageStart (CallbackData
);
320 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
322 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
323 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
324 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
326 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
327 NewLoadContext
->Deleted
= FALSE
;
328 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
330 CreateCheckBoxOpCode (
331 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
332 VARSTORE_ID_BOOT_MAINT
,
333 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
334 NewMenuEntry
->DisplayStringToken
,
335 NewMenuEntry
->HelpStringToken
,
342 UpdatePageEnd (CallbackData
);
346 Prepare the page to allow user to add description for
349 @param CallbackData The BMM context data.
353 UpdateDriverAddHandleDescPage (
354 IN BMM_CALLBACK_DATA
*CallbackData
357 BM_MENU_ENTRY
*NewMenuEntry
;
359 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
360 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
361 CallbackData
->BmmAskSaveOrNot
= TRUE
;
362 NewMenuEntry
= CallbackData
->MenuEntry
;
364 UpdatePageStart (CallbackData
);
366 CreateSubTitleOpCode (
367 NewMenuEntry
->DisplayStringToken
,
375 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
376 VARSTORE_ID_BOOT_MAINT
,
377 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
378 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
379 STRING_TOKEN (STR_NULL_STRING
),
387 CreateCheckBoxOpCode (
388 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
389 VARSTORE_ID_BOOT_MAINT
,
390 DRV_ADD_RECON_VAR_OFFSET
,
391 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
392 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
399 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
400 VARSTORE_ID_BOOT_MAINT
,
401 DRIVER_ADD_OPTION_VAR_OFFSET
,
402 STRING_TOKEN (STR_OPTIONAL_DATA
),
403 STRING_TOKEN (STR_NULL_STRING
),
411 UpdatePageEnd (CallbackData
);
417 @param UpdatePageId The form ID to be updated.
418 @param ConsoleMenu The console menu list.
419 @param CallbackData The BMM context data.
424 IN UINT16 UpdatePageId
,
425 IN BM_MENU_OPTION
*ConsoleMenu
,
426 IN BMM_CALLBACK_DATA
*CallbackData
429 BM_MENU_ENTRY
*NewMenuEntry
;
430 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
431 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
436 CallbackData
->BmmAskSaveOrNot
= TRUE
;
438 UpdatePageStart (CallbackData
);
440 ASSERT (ConsoleMenu
->MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
[0])));
441 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
442 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
443 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
445 if (NewConsoleContext
->IsActive
) {
446 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
447 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
449 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
452 CreateCheckBoxOpCode (
453 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
454 VARSTORE_ID_BOOT_MAINT
,
455 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
456 NewMenuEntry
->DisplayStringToken
,
457 NewMenuEntry
->HelpStringToken
,
464 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
466 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
467 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
469 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
470 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
471 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
473 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
474 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
476 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
479 CreateCheckBoxOpCode (
480 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
481 VARSTORE_ID_BOOT_MAINT
,
482 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
483 NewMenuEntry
->DisplayStringToken
,
484 NewMenuEntry
->HelpStringToken
,
493 UpdatePageEnd (CallbackData
);
497 Update the page's NV Map if user has changed the order
498 a list. This list can be Boot Order or Driver Order.
500 @param UpdatePageId The form ID to be updated.
501 @param OptionMenu The new list.
502 @param CallbackData The BMM context data.
507 IN UINT16 UpdatePageId
,
508 IN BM_MENU_OPTION
*OptionMenu
,
509 IN BMM_CALLBACK_DATA
*CallbackData
512 BM_MENU_ENTRY
*NewMenuEntry
;
514 IFR_OPTION
*IfrOptionList
;
516 CallbackData
->BmmAskSaveOrNot
= TRUE
;
518 UpdatePageStart (CallbackData
);
520 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
522 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
524 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
525 if (IfrOptionList
== NULL
) {
529 ASSERT (OptionMenu
->MenuNumber
<= (sizeof (IfrOptionList
) / sizeof (IfrOptionList
[0])));
530 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
531 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
532 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
533 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
534 IfrOptionList
[Index
].Flags
= 0;
535 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
538 if (OptionMenu
->MenuNumber
> 0) {
539 CreateOrderedListOpCode (
540 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
541 VARSTORE_ID_BOOT_MAINT
,
542 OPTION_ORDER_VAR_OFFSET
,
543 STRING_TOKEN (STR_CHANGE_ORDER
),
544 STRING_TOKEN (STR_CHANGE_ORDER
),
547 EFI_IFR_NUMERIC_SIZE_1
,
550 OptionMenu
->MenuNumber
,
555 FreePool (IfrOptionList
);
557 UpdatePageEnd (CallbackData
);
560 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
561 CallbackData
->BmmFakeNvData
.OptionOrder
,
567 Create the dynamic page to allow user to set
568 the "BootNext" value.
570 @param CallbackData The BMM context data.
575 IN BMM_CALLBACK_DATA
*CallbackData
578 BM_MENU_ENTRY
*NewMenuEntry
;
579 BM_LOAD_CONTEXT
*NewLoadContext
;
580 IFR_OPTION
*IfrOptionList
;
581 UINTN NumberOfOptions
;
584 IfrOptionList
= NULL
;
585 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
586 CallbackData
->BmmAskSaveOrNot
= TRUE
;
588 UpdatePageStart (CallbackData
);
589 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
591 if (NumberOfOptions
> 0) {
592 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
594 ASSERT (IfrOptionList
);
596 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
598 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
599 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
600 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
601 if (NewLoadContext
->IsBootNext
) {
602 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
603 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
605 IfrOptionList
[Index
].Flags
= 0;
608 IfrOptionList
[Index
].Value
.u16
= Index
;
609 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
612 IfrOptionList
[Index
].Value
.u16
= Index
;
613 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
614 IfrOptionList
[Index
].Flags
= 0;
615 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
616 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
620 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
621 VARSTORE_ID_BOOT_MAINT
,
622 BOOT_NEXT_VAR_OFFSET
,
623 STRING_TOKEN (STR_BOOT_NEXT
),
624 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
626 EFI_IFR_NUMERIC_SIZE_2
,
628 (UINTN
) (NumberOfOptions
+ 1),
632 FreePool (IfrOptionList
);
635 UpdatePageEnd (CallbackData
);
639 Create the dynamic page to allow user to set the "TimeOut" value.
641 @param CallbackData The BMM context data.
646 IN BMM_CALLBACK_DATA
*CallbackData
651 CallbackData
->BmmAskSaveOrNot
= TRUE
;
653 UpdatePageStart (CallbackData
);
655 BootTimeOut
= BdsLibGetTimeout ();
657 CreateNumericOpCode (
658 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
659 VARSTORE_ID_BOOT_MAINT
,
660 BOOT_TIME_OUT_VAR_OFFSET
,
661 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
662 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
664 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
672 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
674 UpdatePageEnd (CallbackData
);
678 Refresh the text mode page.
680 @param CallbackData The BMM context data.
685 IN BMM_CALLBACK_DATA
*CallbackData
692 CHAR16 RowString
[50];
693 CHAR16 ModeString
[50];
696 EFI_STRING_ID
*ModeToken
;
697 IFR_OPTION
*IfrOptionList
;
699 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
701 ConOut
= gST
->ConOut
;
704 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
706 CallbackData
->BmmAskSaveOrNot
= TRUE
;
708 UpdatePageStart (CallbackData
);
713 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
714 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
715 if (EFI_ERROR (Status
)) {
721 if (ValidMode
== 0) {
725 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
726 ASSERT(IfrOptionList
!= NULL
);
728 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
729 ASSERT(ModeToken
!= NULL
);
732 // Determin which mode should be the first entry in menu
734 GetConsoleOutMode (CallbackData
);
737 // Build text mode options
739 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
740 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
741 if (EFI_ERROR (Status
)) {
746 // Build mode string Column x Row
748 UnicodeValueToString (ModeString
, 0, Col
, 0);
749 ASSERT ((StrLen (ModeString
) + 1) < (sizeof (ModeString
) / sizeof (ModeString
[0])));
750 StrCat (ModeString
, L
" x ");
751 UnicodeValueToString (RowString
, 0, Row
, 0);
752 ASSERT ((StrLen (ModeString
) + StrLen(RowString
)) < (sizeof (ModeString
) / sizeof (ModeString
[0])));
753 StrCat (ModeString
, RowString
);
755 HiiLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
757 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
758 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
759 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
760 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
762 IfrOptionList
[Index
].Flags
= 0;
768 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
769 VARSTORE_ID_BOOT_MAINT
,
771 STRING_TOKEN (STR_CON_MODE_SETUP
),
772 STRING_TOKEN (STR_CON_MODE_SETUP
),
773 EFI_IFR_FLAG_RESET_REQUIRED
,
774 EFI_IFR_NUMERIC_SIZE_2
,
779 FreePool (IfrOptionList
);
780 FreePool (ModeToken
);
782 UpdatePageEnd (CallbackData
);
786 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
787 Parity, Stop Bits, Terminal Type.
789 @param CallbackData The BMM context data.
794 IN BMM_CALLBACK_DATA
*CallbackData
799 IFR_OPTION
*IfrOptionList
;
800 BM_MENU_ENTRY
*NewMenuEntry
;
801 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
803 CallbackData
->BmmAskSaveOrNot
= TRUE
;
805 UpdatePageStart (CallbackData
);
807 NewMenuEntry
= BOpt_GetMenuEntry (
809 CallbackData
->CurrentTerminal
812 if (NewMenuEntry
== NULL
) {
816 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
818 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
819 if (IfrOptionList
== NULL
) {
823 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
825 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
826 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
827 NewTerminalContext
->BaudRateIndex
= Index
;
828 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
831 IfrOptionList
[Index
].Flags
= CheckFlags
;
832 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
833 IfrOptionList
[Index
].Value
.u8
= Index
;
837 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
838 VARSTORE_ID_BOOT_MAINT
,
839 COM_BAUD_RATE_VAR_OFFSET
,
840 STRING_TOKEN (STR_COM_BAUD_RATE
),
841 STRING_TOKEN (STR_COM_BAUD_RATE
),
843 EFI_IFR_NUMERIC_SIZE_1
,
849 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
852 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
853 NewTerminalContext
->DataBitsIndex
= Index
;
854 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
855 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
858 IfrOptionList
[Index
].Flags
= CheckFlags
;
859 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
860 IfrOptionList
[Index
].Value
.u8
= Index
;
864 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
865 VARSTORE_ID_BOOT_MAINT
,
866 COM_DATA_RATE_VAR_OFFSET
,
867 STRING_TOKEN (STR_COM_DATA_BITS
),
868 STRING_TOKEN (STR_COM_DATA_BITS
),
870 EFI_IFR_NUMERIC_SIZE_1
,
876 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
878 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
879 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
880 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
881 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
884 IfrOptionList
[Index
].Flags
= CheckFlags
;
885 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
886 IfrOptionList
[Index
].Value
.u8
= Index
;
890 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
891 VARSTORE_ID_BOOT_MAINT
,
892 COM_PARITY_VAR_OFFSET
,
893 STRING_TOKEN (STR_COM_PARITY
),
894 STRING_TOKEN (STR_COM_PARITY
),
896 EFI_IFR_NUMERIC_SIZE_1
,
902 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
904 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
905 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
906 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
907 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
910 IfrOptionList
[Index
].Flags
= CheckFlags
;
911 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
912 IfrOptionList
[Index
].Value
.u8
= Index
;
916 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
917 VARSTORE_ID_BOOT_MAINT
,
918 COM_STOP_BITS_VAR_OFFSET
,
919 STRING_TOKEN (STR_COM_STOP_BITS
),
920 STRING_TOKEN (STR_COM_STOP_BITS
),
922 EFI_IFR_NUMERIC_SIZE_1
,
928 for (Index
= 0; Index
< 4; Index
++) {
930 if (NewTerminalContext
->TerminalType
== Index
) {
931 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
932 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
935 IfrOptionList
[Index
].Flags
= CheckFlags
;
936 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
937 IfrOptionList
[Index
].Value
.u8
= Index
;
941 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
942 VARSTORE_ID_BOOT_MAINT
,
943 COM_TERMINAL_VAR_OFFSET
,
944 STRING_TOKEN (STR_COM_TERMI_TYPE
),
945 STRING_TOKEN (STR_COM_TERMI_TYPE
),
947 EFI_IFR_NUMERIC_SIZE_1
,
953 FreePool (IfrOptionList
);
955 UpdatePageEnd (CallbackData
);
959 Dispatch the correct update page function to call based on
962 @param UpdatePageId The form ID.
963 @param CallbackData The BMM context data.
968 IN UINT16 UpdatePageId
,
969 IN BMM_CALLBACK_DATA
*CallbackData
972 CleanUpPage (UpdatePageId
, CallbackData
);
973 switch (UpdatePageId
) {
975 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
978 case FORM_CON_OUT_ID
:
979 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
982 case FORM_CON_ERR_ID
:
983 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
986 case FORM_BOOT_CHG_ID
:
987 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
990 case FORM_DRV_CHG_ID
:
991 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1000 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
1001 specified by DeviceType.
1003 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1005 @param OptionIndex Returns the index number (#### in Boot####).
1006 @param OptionSize Return the size of the Boot### variable.
1010 GetLegacyBootOptionVar (
1011 IN UINTN DeviceType
,
1012 OUT UINTN
*OptionIndex
,
1013 OUT UINTN
*OptionSize
1016 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
1020 UINT16
*OrderBuffer
;
1021 CHAR16 StrTemp
[100];
1022 UINT16 FilePathSize
;
1024 UINT8
*OptionalData
;
1027 // Get Boot Option number from the size of BootOrder
1029 OrderBuffer
= BdsLibGetVariableAndSize (
1031 &gEfiGlobalVariableGuid
,
1035 if (OrderBuffer
== NULL
) {
1039 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
1040 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
1041 OptionBuffer
= BdsLibGetVariableAndSize (
1043 &gEfiGlobalVariableGuid
,
1046 if (NULL
== OptionBuffer
) {
1050 Ptr
= (UINT8
*) OptionBuffer
;
1051 Ptr
+= sizeof (UINT32
);
1053 FilePathSize
= *(UINT16
*) Ptr
;
1054 Ptr
+= sizeof (UINT16
);
1056 Ptr
+= StrSize ((CHAR16
*) Ptr
);
1059 // Now Ptr point to Device Path
1061 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1062 Ptr
+= FilePathSize
;
1065 // Now Ptr point to Optional Data
1069 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1070 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1071 (BBS_BBS_DP
== DevicePath
->SubType
)
1073 *OptionIndex
= OrderBuffer
[Index
];
1074 FreePool (OrderBuffer
);
1075 return OptionBuffer
;
1077 FreePool (OptionBuffer
);
1081 FreePool (OrderBuffer
);
1086 Create a dynamic page so that Legacy Device boot order
1087 can be set for specified device type.
1089 @param UpdatePageId The form ID. It also spefies the legacy device type.
1090 @param CallbackData The BMM context data.
1095 UpdateSetLegacyDeviceOrderPage (
1096 IN UINT16 UpdatePageId
,
1097 IN BMM_CALLBACK_DATA
*CallbackData
1100 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1101 BM_MENU_OPTION
*OptionMenu
;
1102 BM_MENU_ENTRY
*NewMenuEntry
;
1103 IFR_OPTION
*IfrOptionList
;
1104 EFI_STRING_ID StrRef
;
1105 EFI_STRING_ID StrRefHelp
;
1114 CHAR16
*TypeStrHelp
;
1127 BbsType
= BBS_FLOPPY
;
1132 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1133 UpdatePageStart (CallbackData
);
1135 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1137 SetMem (DisMap
, 32, 0);
1139 // Create oneof option list
1141 switch (UpdatePageId
) {
1142 case FORM_SET_FD_ORDER_ID
:
1143 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1144 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1145 TypeStr
= STR_FLOPPY
;
1146 TypeStrHelp
= STR_FLOPPY_HELP
;
1147 BbsType
= BBS_FLOPPY
;
1148 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1149 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1152 case FORM_SET_HD_ORDER_ID
:
1153 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1154 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1155 TypeStr
= STR_HARDDISK
;
1156 TypeStrHelp
= STR_HARDDISK_HELP
;
1157 BbsType
= BBS_HARDDISK
;
1158 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1159 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1162 case FORM_SET_CD_ORDER_ID
:
1163 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1164 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1165 TypeStr
= STR_CDROM
;
1166 TypeStrHelp
= STR_CDROM_HELP
;
1167 BbsType
= BBS_CDROM
;
1168 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1169 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1172 case FORM_SET_NET_ORDER_ID
:
1173 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1174 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1176 TypeStrHelp
= STR_NET_HELP
;
1177 BbsType
= BBS_EMBED_NETWORK
;
1178 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1179 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1182 case FORM_SET_BEV_ORDER_ID
:
1183 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1184 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1186 TypeStrHelp
= STR_BEV_HELP
;
1187 BbsType
= BBS_BEV_DEVICE
;
1188 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1189 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1193 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
1197 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1199 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1200 if (NULL
== IfrOptionList
) {
1204 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1205 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1206 IfrOptionList
[Index
].Flags
= 0;
1208 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1211 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1212 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1215 // for item "Disabled"
1217 IfrOptionList
[Index
].Flags
= 0;
1218 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1219 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1222 // Get Device Order from variable
1224 VarData
= BdsLibGetVariableAndSize (
1225 VAR_LEGACY_DEV_ORDER
,
1226 &EfiLegacyDevOrderGuid
,
1230 if (NULL
!= VarData
) {
1231 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1232 while (VarData
< VarData
+ VarSize
) {
1233 if (DevOrder
->BbsType
== BbsType
) {
1237 VarData
+= sizeof (BBS_TYPE
);
1238 VarData
+= *(UINT16
*) VarData
;
1239 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1242 // Create oneof tag here for FD/HD/CD #1 #2
1244 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1246 // Create the string for oneof tag
1248 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1250 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1252 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1254 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1257 (EFI_QUESTION_ID
) (Key
+ Index
),
1258 VARSTORE_ID_BOOT_MAINT
,
1259 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1262 EFI_IFR_FLAG_CALLBACK
,
1263 EFI_IFR_NUMERIC_SIZE_1
,
1265 OptionMenu
->MenuNumber
+ 1,
1269 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1271 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1272 LegacyOrder
[Index
] = 0xFF;
1273 Pos
= (VarDevOrder
& 0xFF) / 8;
1274 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1275 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1277 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1282 CopyMem (OldData
, LegacyOrder
, 100);
1284 if (IfrOptionList
!= NULL
) {
1285 FreePool (IfrOptionList
);
1286 IfrOptionList
= NULL
;
1289 UpdatePageEnd (CallbackData
);
1293 Dispatch the display to the next page based on NewPageId.
1295 @param Private The BMM context data.
1296 @param NewPageId The original page ID.
1301 BMM_CALLBACK_DATA
*Private
,
1305 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1307 // If we select a handle to add driver option, advance to the add handle description page.
1309 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1310 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1312 // Return to main page after "Save Changes" or "Discard Changes".
1314 NewPageId
= FORM_MAIN_ID
;
1315 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1316 NewPageId
= FORM_CON_COM_SETUP_ID
;
1319 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1320 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1321 Private
->BmmCurrentPageId
= NewPageId
;