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
120 @param LabelId It is both the Form ID and Label ID for
122 @param CallbackData The BMM context data.
128 IN BMM_CALLBACK_DATA
*CallbackData
131 RefreshUpdateData ();
134 // Remove all op-codes from dynamic page
137 CallbackData
->BmmHiiHandle
,
147 Boot a file selected by user at File Expoloer of BMM.
149 @param FileContext The file context data, which contains the device path
150 of the file to be boot from.
152 @retval EFI_SUCCESS The function completed successfull.
153 @return Other value if the boot from the file fails.
158 IN BM_FILE_CONTEXT
*FileContext
164 BDS_COMMON_OPTION
*Option
;
166 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), (VOID
**) &Option
);
167 Option
->Description
= FileContext
->FileName
;
168 Option
->DevicePath
= FileContext
->DevicePath
;
169 Option
->LoadOptionsSize
= 0;
170 Option
->LoadOptions
= NULL
;
173 // Since current no boot from removable media directly is allowed */
175 gST
->ConOut
->ClearScreen (gST
->ConOut
);
179 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
186 Create a list of Goto Opcode for all terminal devices logged
187 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
189 @param CallbackData The BMM context data.
193 IN BMM_CALLBACK_DATA
*CallbackData
196 BM_MENU_ENTRY
*NewMenuEntry
;
199 CallbackData
->BmmAskSaveOrNot
= FALSE
;
201 UpdatePageStart (CallbackData
);
204 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
205 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
208 FORM_CON_COM_SETUP_ID
,
209 NewMenuEntry
->DisplayStringToken
,
210 STRING_TOKEN (STR_NULL_STRING
),
211 EFI_IFR_FLAG_CALLBACK
,
212 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
217 UpdatePageEnd (CallbackData
);
221 Create a lit of boot option from global BootOptionMenu. It
222 allow user to delete the boot option.
224 @param CallbackData The BMM context data.
229 IN BMM_CALLBACK_DATA
*CallbackData
232 BM_MENU_ENTRY
*NewMenuEntry
;
233 BM_LOAD_CONTEXT
*NewLoadContext
;
236 CallbackData
->BmmAskSaveOrNot
= TRUE
;
238 UpdatePageStart (CallbackData
);
239 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
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 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
323 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
325 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
326 NewLoadContext
->Deleted
= FALSE
;
327 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
329 CreateCheckBoxOpCode (
330 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
331 VARSTORE_ID_BOOT_MAINT
,
332 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
333 NewMenuEntry
->DisplayStringToken
,
334 NewMenuEntry
->HelpStringToken
,
341 UpdatePageEnd (CallbackData
);
345 Prepare the page to allow user to add description for
348 @param CallbackData The BMM context data.
352 UpdateDriverAddHandleDescPage (
353 IN BMM_CALLBACK_DATA
*CallbackData
356 BM_MENU_ENTRY
*NewMenuEntry
;
358 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
359 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
360 CallbackData
->BmmAskSaveOrNot
= TRUE
;
361 NewMenuEntry
= CallbackData
->MenuEntry
;
363 UpdatePageStart (CallbackData
);
365 CreateSubTitleOpCode (
366 NewMenuEntry
->DisplayStringToken
,
374 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
375 VARSTORE_ID_BOOT_MAINT
,
376 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
377 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
378 STRING_TOKEN (STR_NULL_STRING
),
386 CreateCheckBoxOpCode (
387 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
388 VARSTORE_ID_BOOT_MAINT
,
389 DRV_ADD_RECON_VAR_OFFSET
,
390 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
391 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
398 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
399 VARSTORE_ID_BOOT_MAINT
,
400 DRIVER_ADD_OPTION_VAR_OFFSET
,
401 STRING_TOKEN (STR_OPTIONAL_DATA
),
402 STRING_TOKEN (STR_NULL_STRING
),
410 UpdatePageEnd (CallbackData
);
416 @param UpdatePageId The form ID to be updated.
417 @param ConsoleMenu The console menu list.
418 @param CallbackData The BMM context data.
423 IN UINT16 UpdatePageId
,
424 IN BM_MENU_OPTION
*ConsoleMenu
,
425 IN BMM_CALLBACK_DATA
*CallbackData
428 BM_MENU_ENTRY
*NewMenuEntry
;
429 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
430 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
435 CallbackData
->BmmAskSaveOrNot
= TRUE
;
437 UpdatePageStart (CallbackData
);
439 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
440 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
441 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
443 if (NewConsoleContext
->IsActive
) {
444 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
445 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
447 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
450 CreateCheckBoxOpCode (
451 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
452 VARSTORE_ID_BOOT_MAINT
,
453 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
454 NewMenuEntry
->DisplayStringToken
,
455 NewMenuEntry
->HelpStringToken
,
462 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
464 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
465 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
467 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
468 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
469 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
471 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
472 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
474 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
477 CreateCheckBoxOpCode (
478 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
479 VARSTORE_ID_BOOT_MAINT
,
480 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
481 NewMenuEntry
->DisplayStringToken
,
482 NewMenuEntry
->HelpStringToken
,
491 UpdatePageEnd (CallbackData
);
495 Update the page's NV Map if user has changed the order
496 a list. This list can be Boot Order or Driver Order.
498 @param UpdatePageId The form ID to be updated.
499 @param OptionMenu The new list.
500 @param CallbackData The BMM context data.
505 IN UINT16 UpdatePageId
,
506 IN BM_MENU_OPTION
*OptionMenu
,
507 IN BMM_CALLBACK_DATA
*CallbackData
510 BM_MENU_ENTRY
*NewMenuEntry
;
512 IFR_OPTION
*IfrOptionList
;
514 CallbackData
->BmmAskSaveOrNot
= TRUE
;
516 UpdatePageStart (CallbackData
);
518 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
520 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
522 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
523 if (NULL
== IfrOptionList
) {
527 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
528 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
529 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
530 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
531 IfrOptionList
[Index
].Flags
= 0;
532 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
535 if (OptionMenu
->MenuNumber
> 0) {
536 CreateOrderedListOpCode (
537 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
538 VARSTORE_ID_BOOT_MAINT
,
539 OPTION_ORDER_VAR_OFFSET
,
540 STRING_TOKEN (STR_CHANGE_ORDER
),
541 STRING_TOKEN (STR_CHANGE_ORDER
),
544 EFI_IFR_NUMERIC_SIZE_1
,
547 OptionMenu
->MenuNumber
,
552 FreePool (IfrOptionList
);
554 UpdatePageEnd (CallbackData
);
557 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
558 CallbackData
->BmmFakeNvData
.OptionOrder
,
564 Create the dynamic page to allow user to set
565 the "BootNext" vaule.
567 @param CallbackData The BMM context data.
572 IN BMM_CALLBACK_DATA
*CallbackData
575 BM_MENU_ENTRY
*NewMenuEntry
;
576 BM_LOAD_CONTEXT
*NewLoadContext
;
577 IFR_OPTION
*IfrOptionList
;
578 UINTN NumberOfOptions
;
581 IfrOptionList
= NULL
;
582 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
583 CallbackData
->BmmAskSaveOrNot
= TRUE
;
585 UpdatePageStart (CallbackData
);
586 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
588 if (NumberOfOptions
> 0) {
589 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
591 ASSERT (IfrOptionList
);
593 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
595 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
596 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
597 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
598 if (NewLoadContext
->IsBootNext
) {
599 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
600 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
602 IfrOptionList
[Index
].Flags
= 0;
605 IfrOptionList
[Index
].Value
.u16
= Index
;
606 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
609 IfrOptionList
[Index
].Value
.u16
= Index
;
610 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
611 IfrOptionList
[Index
].Flags
= 0;
612 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
613 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
617 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
618 VARSTORE_ID_BOOT_MAINT
,
619 BOOT_NEXT_VAR_OFFSET
,
620 STRING_TOKEN (STR_BOOT_NEXT
),
621 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
623 EFI_IFR_NUMERIC_SIZE_2
,
625 (UINTN
) (NumberOfOptions
+ 1),
629 FreePool (IfrOptionList
);
632 UpdatePageEnd (CallbackData
);
636 Create the dynamic page to allow user to set
639 @param CallbackData The BMM context data.
644 IN BMM_CALLBACK_DATA
*CallbackData
649 CallbackData
->BmmAskSaveOrNot
= TRUE
;
651 UpdatePageStart (CallbackData
);
653 BootTimeOut
= BdsLibGetTimeout ();
655 CreateNumericOpCode (
656 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
657 VARSTORE_ID_BOOT_MAINT
,
658 BOOT_TIME_OUT_VAR_OFFSET
,
659 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
660 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
662 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
670 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
672 UpdatePageEnd (CallbackData
);
676 Refresh the text mode page
678 @param CallbackData The BMM context data.
683 IN BMM_CALLBACK_DATA
*CallbackData
690 CHAR16 RowString
[50];
691 CHAR16 ModeString
[50];
694 EFI_STRING_ID
*ModeToken
;
695 IFR_OPTION
*IfrOptionList
;
697 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
699 ConOut
= gST
->ConOut
;
702 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
704 CallbackData
->BmmAskSaveOrNot
= TRUE
;
706 UpdatePageStart (CallbackData
);
711 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
712 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
713 if (EFI_ERROR (Status
)) {
719 if (ValidMode
== 0) {
723 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
724 ASSERT(IfrOptionList
!= NULL
);
726 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
727 ASSERT(ModeToken
!= NULL
);
730 // Determin which mode should be the first entry in menu
732 GetConsoleOutMode (CallbackData
);
735 // Build text mode options
737 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
738 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
739 if (EFI_ERROR (Status
)) {
743 // Build mode string Column x Row
745 UnicodeValueToString (ModeString
, 0, Col
, 0);
746 StrCat (ModeString
, L
" x ");
747 UnicodeValueToString (RowString
, 0, Row
, 0);
748 StrCat (ModeString
, RowString
);
750 HiiLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
752 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
753 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
754 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
755 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
757 IfrOptionList
[Index
].Flags
= 0;
763 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
764 VARSTORE_ID_BOOT_MAINT
,
766 STRING_TOKEN (STR_CON_MODE_SETUP
),
767 STRING_TOKEN (STR_CON_MODE_SETUP
),
768 EFI_IFR_FLAG_RESET_REQUIRED
,
769 EFI_IFR_NUMERIC_SIZE_2
,
774 FreePool (IfrOptionList
);
775 FreePool (ModeToken
);
777 UpdatePageEnd (CallbackData
);
781 Create the dynamic page which allows user to
782 set the property such as Baud Rate, Data Bits,
783 Parity, Stop Bits, Terminal Type.
785 @param CallbackData The BMM context data.
790 IN BMM_CALLBACK_DATA
*CallbackData
795 IFR_OPTION
*IfrOptionList
;
796 BM_MENU_ENTRY
*NewMenuEntry
;
797 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
799 CallbackData
->BmmAskSaveOrNot
= TRUE
;
801 UpdatePageStart (CallbackData
);
803 NewMenuEntry
= BOpt_GetMenuEntry (
805 CallbackData
->CurrentTerminal
808 if (NewMenuEntry
== NULL
) {
812 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
814 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
815 if (IfrOptionList
== NULL
) {
819 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
821 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
822 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
823 NewTerminalContext
->BaudRateIndex
= Index
;
824 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
827 IfrOptionList
[Index
].Flags
= CheckFlags
;
828 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
829 IfrOptionList
[Index
].Value
.u8
= Index
;
833 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
834 VARSTORE_ID_BOOT_MAINT
,
835 COM_BAUD_RATE_VAR_OFFSET
,
836 STRING_TOKEN (STR_COM_BAUD_RATE
),
837 STRING_TOKEN (STR_COM_BAUD_RATE
),
839 EFI_IFR_NUMERIC_SIZE_1
,
845 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
848 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
849 NewTerminalContext
->DataBitsIndex
= Index
;
850 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
851 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
854 IfrOptionList
[Index
].Flags
= CheckFlags
;
855 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
856 IfrOptionList
[Index
].Value
.u8
= Index
;
860 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
861 VARSTORE_ID_BOOT_MAINT
,
862 COM_DATA_RATE_VAR_OFFSET
,
863 STRING_TOKEN (STR_COM_DATA_BITS
),
864 STRING_TOKEN (STR_COM_DATA_BITS
),
866 EFI_IFR_NUMERIC_SIZE_1
,
872 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
874 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
875 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
876 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
877 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
880 IfrOptionList
[Index
].Flags
= CheckFlags
;
881 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
882 IfrOptionList
[Index
].Value
.u8
= Index
;
886 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
887 VARSTORE_ID_BOOT_MAINT
,
888 COM_PARITY_VAR_OFFSET
,
889 STRING_TOKEN (STR_COM_PARITY
),
890 STRING_TOKEN (STR_COM_PARITY
),
892 EFI_IFR_NUMERIC_SIZE_1
,
898 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
900 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
901 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
902 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
903 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
906 IfrOptionList
[Index
].Flags
= CheckFlags
;
907 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
908 IfrOptionList
[Index
].Value
.u8
= Index
;
912 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
913 VARSTORE_ID_BOOT_MAINT
,
914 COM_STOP_BITS_VAR_OFFSET
,
915 STRING_TOKEN (STR_COM_STOP_BITS
),
916 STRING_TOKEN (STR_COM_STOP_BITS
),
918 EFI_IFR_NUMERIC_SIZE_1
,
924 for (Index
= 0; Index
< 4; Index
++) {
926 if (NewTerminalContext
->TerminalType
== Index
) {
927 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
928 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
931 IfrOptionList
[Index
].Flags
= CheckFlags
;
932 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
933 IfrOptionList
[Index
].Value
.u8
= Index
;
937 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
938 VARSTORE_ID_BOOT_MAINT
,
939 COM_TERMINAL_VAR_OFFSET
,
940 STRING_TOKEN (STR_COM_TERMI_TYPE
),
941 STRING_TOKEN (STR_COM_TERMI_TYPE
),
943 EFI_IFR_NUMERIC_SIZE_1
,
949 FreePool (IfrOptionList
);
951 UpdatePageEnd (CallbackData
);
955 Dispatch the correct update page function to call based on
958 @param UpdatePageId The form ID.
959 @param CallbackData The BMM context data.
964 IN UINT16 UpdatePageId
,
965 IN BMM_CALLBACK_DATA
*CallbackData
968 CleanUpPage (UpdatePageId
, CallbackData
);
969 switch (UpdatePageId
) {
971 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
974 case FORM_CON_OUT_ID
:
975 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
978 case FORM_CON_ERR_ID
:
979 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
982 case FORM_BOOT_CHG_ID
:
983 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
986 case FORM_DRV_CHG_ID
:
987 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
996 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
997 specified by DeviceType.
999 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1001 @param OptionIndex Returns the index number (#### in Boot####).
1002 @param OptionSize Return the size of the Boot### variable.
1006 GetLegacyBootOptionVar (
1007 IN UINTN DeviceType
,
1008 OUT UINTN
*OptionIndex
,
1009 OUT UINTN
*OptionSize
1012 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
1016 UINT16
*OrderBuffer
;
1017 CHAR16 StrTemp
[100];
1018 UINT16 FilePathSize
;
1020 UINT8
*OptionalData
;
1023 // Get Boot Option number from the size of BootOrder
1025 OrderBuffer
= BdsLibGetVariableAndSize (
1027 &gEfiGlobalVariableGuid
,
1031 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
1032 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
1033 OptionBuffer
= BdsLibGetVariableAndSize (
1035 &gEfiGlobalVariableGuid
,
1038 if (NULL
== OptionBuffer
) {
1042 Ptr
= (UINT8
*) OptionBuffer
;
1043 Ptr
+= sizeof (UINT32
);
1045 FilePathSize
= *(UINT16
*) Ptr
;
1046 Ptr
+= sizeof (UINT16
);
1048 Ptr
+= StrSize ((CHAR16
*) Ptr
);
1051 // Now Ptr point to Device Path
1053 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1054 Ptr
+= FilePathSize
;
1057 // Now Ptr point to Optional Data
1061 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1062 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1063 (BBS_BBS_DP
== DevicePath
->SubType
)
1065 *OptionIndex
= OrderBuffer
[Index
];
1066 FreePool (OrderBuffer
);
1067 return OptionBuffer
;
1069 FreePool (OptionBuffer
);
1073 FreePool (OrderBuffer
);
1078 Create a dynamic page so that Legacy Device boot order
1079 can be set for specified device type.
1081 @param UpdatePageId The form ID. It also spefies the legacy device type.
1082 @param CallbackData The BMM context data.
1087 UpdateSetLegacyDeviceOrderPage (
1088 IN UINT16 UpdatePageId
,
1089 IN BMM_CALLBACK_DATA
*CallbackData
1092 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1093 BM_MENU_OPTION
*OptionMenu
;
1094 BM_MENU_ENTRY
*NewMenuEntry
;
1095 IFR_OPTION
*IfrOptionList
;
1096 EFI_STRING_ID StrRef
;
1097 EFI_STRING_ID StrRefHelp
;
1106 CHAR16
*TypeStrHelp
;
1119 BbsType
= BBS_FLOPPY
;
1124 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1125 UpdatePageStart (CallbackData
);
1127 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1129 SetMem (DisMap
, 32, 0);
1131 // Create oneof option list
1133 switch (UpdatePageId
) {
1134 case FORM_SET_FD_ORDER_ID
:
1135 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1136 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1137 TypeStr
= STR_FLOPPY
;
1138 TypeStrHelp
= STR_FLOPPY_HELP
;
1139 BbsType
= BBS_FLOPPY
;
1140 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1141 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1144 case FORM_SET_HD_ORDER_ID
:
1145 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1146 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1147 TypeStr
= STR_HARDDISK
;
1148 TypeStrHelp
= STR_HARDDISK_HELP
;
1149 BbsType
= BBS_HARDDISK
;
1150 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1151 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1154 case FORM_SET_CD_ORDER_ID
:
1155 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1156 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1157 TypeStr
= STR_CDROM
;
1158 TypeStrHelp
= STR_CDROM_HELP
;
1159 BbsType
= BBS_CDROM
;
1160 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1161 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1164 case FORM_SET_NET_ORDER_ID
:
1165 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1166 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1168 TypeStrHelp
= STR_NET_HELP
;
1169 BbsType
= BBS_EMBED_NETWORK
;
1170 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1171 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1174 case FORM_SET_BEV_ORDER_ID
:
1175 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1176 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1178 TypeStrHelp
= STR_BEV_HELP
;
1179 BbsType
= BBS_BEV_DEVICE
;
1180 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1181 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1186 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1188 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1189 if (NULL
== IfrOptionList
) {
1193 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1194 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1195 IfrOptionList
[Index
].Flags
= 0;
1197 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1200 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1201 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1204 // for item "Disabled"
1206 IfrOptionList
[Index
].Flags
= 0;
1207 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1208 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1211 // Get Device Order from variable
1213 VarData
= BdsLibGetVariableAndSize (
1214 VAR_LEGACY_DEV_ORDER
,
1215 &EfiLegacyDevOrderGuid
,
1219 if (NULL
!= VarData
) {
1220 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1221 while (VarData
< VarData
+ VarSize
) {
1222 if (DevOrder
->BbsType
== BbsType
) {
1226 VarData
+= sizeof (BBS_TYPE
);
1227 VarData
+= *(UINT16
*) VarData
;
1228 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1231 // Create oneof tag here for FD/HD/CD #1 #2
1233 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1235 // Create the string for oneof tag
1237 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1239 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1241 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1243 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1246 (EFI_QUESTION_ID
) (Key
+ Index
),
1247 VARSTORE_ID_BOOT_MAINT
,
1248 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1251 EFI_IFR_FLAG_CALLBACK
,
1252 EFI_IFR_NUMERIC_SIZE_1
,
1254 OptionMenu
->MenuNumber
+ 1,
1258 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1260 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1261 LegacyOrder
[Index
] = 0xFF;
1262 Pos
= (VarDevOrder
& 0xFF) / 8;
1263 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1264 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1266 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1271 CopyMem (OldData
, LegacyOrder
, 100);
1273 if (IfrOptionList
!= NULL
) {
1274 FreePool (IfrOptionList
);
1275 IfrOptionList
= NULL
;
1278 UpdatePageEnd (CallbackData
);
1282 Dispatch the display to the next page based on NewPageId.
1284 @param Private The BMM context data.
1285 @param NewPageId The original page ID.
1290 BMM_CALLBACK_DATA
*Private
,
1294 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1296 // If we select a handle to add driver option, advance to the add handle description page.
1298 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1299 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1301 // Return to main page after "Save Changes" or "Discard Changes".
1303 NewPageId
= FORM_MAIN_ID
;
1304 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1305 NewPageId
= FORM_CON_COM_SETUP_ID
;
1308 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1309 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1310 Private
->BmmCurrentPageId
= NewPageId
;