3 Copyright (c) 2004 - 2008, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Dynamically Update the pages
22 #include "BootMaint.h"
31 Refresh the global UpdateData structure.
41 gUpdateData
.Offset
= 0;
46 IN BMM_CALLBACK_DATA
*CallbackData
51 if (!(CallbackData
->BmmAskSaveOrNot
)) {
53 // Add a "Go back to main page" tag in front of the form when there are no
54 // "Apply changes" and "Discard changes" tags in the end of the form.
58 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
59 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
70 IN BMM_CALLBACK_DATA
*CallbackData
74 // Create the "Apply changes" and "Discard changes" tags.
76 if (CallbackData
->BmmAskSaveOrNot
) {
77 CreateSubTitleOpCode (
78 STRING_TOKEN (STR_NULL_STRING
),
87 STRING_TOKEN (STR_SAVE_AND_EXIT
),
88 STRING_TOKEN (STR_NULL_STRING
),
89 EFI_IFR_FLAG_CALLBACK
,
90 KEY_VALUE_SAVE_AND_EXIT
,
96 // Ensure user can return to the main page.
100 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
101 STRING_TOKEN (STR_NULL_STRING
),
102 EFI_IFR_FLAG_CALLBACK
,
103 KEY_VALUE_NO_SAVE_AND_EXIT
,
108 CallbackData
->BmmHiiHandle
,
110 CallbackData
->BmmCurrentPageId
,
111 CallbackData
->BmmCurrentPageId
,
120 IN BMM_CALLBACK_DATA
*CallbackData
123 RefreshUpdateData ();
126 // Remove all op-codes from dynamic page
129 CallbackData
->BmmHiiHandle
,
140 IN BM_FILE_CONTEXT
*FileContext
146 BDS_COMMON_OPTION
*Option
;
148 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), (VOID
**) &Option
);
149 Option
->Description
= FileContext
->FileName
;
150 Option
->DevicePath
= FileContext
->DevicePath
;
151 Option
->LoadOptionsSize
= 0;
152 Option
->LoadOptions
= NULL
;
155 // Since current no boot from removable media directly is allowed */
157 gST
->ConOut
->ClearScreen (gST
->ConOut
);
159 gBS
->RaiseTPL (TPL_APPLICATION
);
163 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
165 gBS
->RestoreTPL (TPL_APPLICATION
);
173 IN BMM_CALLBACK_DATA
*CallbackData
176 BM_MENU_ENTRY
*NewMenuEntry
;
179 CallbackData
->BmmAskSaveOrNot
= FALSE
;
181 UpdatePageStart (CallbackData
);
184 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
185 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
188 FORM_CON_COM_SETUP_ID
,
189 NewMenuEntry
->DisplayStringToken
,
190 STRING_TOKEN (STR_NULL_STRING
),
191 EFI_IFR_FLAG_CALLBACK
,
192 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
197 UpdatePageEnd (CallbackData
);
202 IN BMM_CALLBACK_DATA
*CallbackData
205 BM_MENU_ENTRY
*NewMenuEntry
;
206 BM_LOAD_CONTEXT
*NewLoadContext
;
209 CallbackData
->BmmAskSaveOrNot
= TRUE
;
211 UpdatePageStart (CallbackData
);
212 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
214 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
215 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
216 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
217 if (NewLoadContext
->IsLegacy
) {
221 NewLoadContext
->Deleted
= FALSE
;
222 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = 0x00;
224 CreateCheckBoxOpCode (
225 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
226 VARSTORE_ID_BOOT_MAINT
,
227 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
228 NewMenuEntry
->DisplayStringToken
,
229 NewMenuEntry
->HelpStringToken
,
236 UpdatePageEnd (CallbackData
);
240 UpdateDrvAddHandlePage (
241 IN BMM_CALLBACK_DATA
*CallbackData
244 BM_MENU_ENTRY
*NewMenuEntry
;
247 CallbackData
->BmmAskSaveOrNot
= FALSE
;
249 UpdatePageStart (CallbackData
);
251 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
252 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
255 FORM_DRV_ADD_HANDLE_DESC_ID
,
256 NewMenuEntry
->DisplayStringToken
,
257 STRING_TOKEN (STR_NULL_STRING
),
258 EFI_IFR_FLAG_CALLBACK
,
259 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
264 UpdatePageEnd (CallbackData
);
269 IN BMM_CALLBACK_DATA
*CallbackData
272 BM_MENU_ENTRY
*NewMenuEntry
;
273 BM_LOAD_CONTEXT
*NewLoadContext
;
276 CallbackData
->BmmAskSaveOrNot
= TRUE
;
278 UpdatePageStart (CallbackData
);
280 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
282 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
283 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
285 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
286 NewLoadContext
->Deleted
= FALSE
;
287 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
289 CreateCheckBoxOpCode (
290 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
291 VARSTORE_ID_BOOT_MAINT
,
292 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
293 NewMenuEntry
->DisplayStringToken
,
294 NewMenuEntry
->HelpStringToken
,
301 UpdatePageEnd (CallbackData
);
305 UpdateDriverAddHandleDescPage (
306 IN BMM_CALLBACK_DATA
*CallbackData
309 BM_MENU_ENTRY
*NewMenuEntry
;
311 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
312 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
313 CallbackData
->BmmAskSaveOrNot
= TRUE
;
314 NewMenuEntry
= CallbackData
->MenuEntry
;
316 UpdatePageStart (CallbackData
);
318 CreateSubTitleOpCode (
319 NewMenuEntry
->DisplayStringToken
,
327 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
328 VARSTORE_ID_BOOT_MAINT
,
329 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
330 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
331 STRING_TOKEN (STR_NULL_STRING
),
339 CreateCheckBoxOpCode (
340 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
341 VARSTORE_ID_BOOT_MAINT
,
342 DRV_ADD_RECON_VAR_OFFSET
,
343 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
344 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
351 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
352 VARSTORE_ID_BOOT_MAINT
,
353 DRIVER_ADD_OPTION_VAR_OFFSET
,
354 STRING_TOKEN (STR_OPTIONAL_DATA
),
355 STRING_TOKEN (STR_NULL_STRING
),
363 UpdatePageEnd (CallbackData
);
368 IN UINT16 UpdatePageId
,
369 IN BM_MENU_OPTION
*ConsoleMenu
,
370 IN BMM_CALLBACK_DATA
*CallbackData
373 BM_MENU_ENTRY
*NewMenuEntry
;
374 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
375 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
380 CallbackData
->BmmAskSaveOrNot
= TRUE
;
382 UpdatePageStart (CallbackData
);
384 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
385 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
386 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
388 if (NewConsoleContext
->IsActive
) {
389 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
390 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
392 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
395 CreateCheckBoxOpCode (
396 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
397 VARSTORE_ID_BOOT_MAINT
,
398 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
399 NewMenuEntry
->DisplayStringToken
,
400 NewMenuEntry
->HelpStringToken
,
407 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
409 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
410 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
412 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
413 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
414 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
416 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
417 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
419 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
422 CreateCheckBoxOpCode (
423 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
424 VARSTORE_ID_BOOT_MAINT
,
425 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
426 NewMenuEntry
->DisplayStringToken
,
427 NewMenuEntry
->HelpStringToken
,
436 UpdatePageEnd (CallbackData
);
441 IN UINT16 UpdatePageId
,
442 IN BM_MENU_OPTION
*OptionMenu
,
443 IN BMM_CALLBACK_DATA
*CallbackData
446 BM_MENU_ENTRY
*NewMenuEntry
;
448 IFR_OPTION
*IfrOptionList
;
450 CallbackData
->BmmAskSaveOrNot
= TRUE
;
452 UpdatePageStart (CallbackData
);
454 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
456 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
458 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
459 if (NULL
== IfrOptionList
) {
463 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
464 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
465 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
466 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
467 IfrOptionList
[Index
].Flags
= 0;
468 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
471 if (OptionMenu
->MenuNumber
> 0) {
472 CreateOrderedListOpCode (
473 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
474 VARSTORE_ID_BOOT_MAINT
,
475 OPTION_ORDER_VAR_OFFSET
,
476 STRING_TOKEN (STR_CHANGE_ORDER
),
477 STRING_TOKEN (STR_CHANGE_ORDER
),
480 EFI_IFR_NUMERIC_SIZE_1
,
483 OptionMenu
->MenuNumber
,
488 SafeFreePool (IfrOptionList
);
490 UpdatePageEnd (CallbackData
);
493 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
494 CallbackData
->BmmFakeNvData
.OptionOrder
,
501 IN BMM_CALLBACK_DATA
*CallbackData
504 BM_MENU_ENTRY
*NewMenuEntry
;
505 BM_LOAD_CONTEXT
*NewLoadContext
;
506 IFR_OPTION
*IfrOptionList
;
507 UINTN NumberOfOptions
;
510 IfrOptionList
= NULL
;
511 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
512 CallbackData
->BmmAskSaveOrNot
= TRUE
;
514 UpdatePageStart (CallbackData
);
515 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
517 if (NumberOfOptions
> 0) {
518 IfrOptionList
= EfiAllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
520 ASSERT (IfrOptionList
);
522 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
524 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
525 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
526 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
527 if (NewLoadContext
->IsBootNext
) {
528 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
529 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
531 IfrOptionList
[Index
].Flags
= 0;
534 IfrOptionList
[Index
].Value
.u16
= Index
;
535 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
538 IfrOptionList
[Index
].Value
.u16
= Index
;
539 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
540 IfrOptionList
[Index
].Flags
= 0;
541 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
542 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
546 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
547 VARSTORE_ID_BOOT_MAINT
,
548 BOOT_NEXT_VAR_OFFSET
,
549 STRING_TOKEN (STR_BOOT_NEXT
),
550 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
552 EFI_IFR_NUMERIC_SIZE_2
,
554 (UINTN
) (NumberOfOptions
+ 1),
558 SafeFreePool (IfrOptionList
);
561 UpdatePageEnd (CallbackData
);
566 IN BMM_CALLBACK_DATA
*CallbackData
571 CallbackData
->BmmAskSaveOrNot
= TRUE
;
573 UpdatePageStart (CallbackData
);
575 BootTimeOut
= BdsLibGetTimeout ();
577 CreateNumericOpCode (
578 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
579 VARSTORE_ID_BOOT_MAINT
,
580 BOOT_TIME_OUT_VAR_OFFSET
,
581 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
582 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
584 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
592 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
594 UpdatePageEnd (CallbackData
);
599 IN BMM_CALLBACK_DATA
*CallbackData
604 Refresh the text mode page
607 CallbackData - BMM_CALLBACK_DATA
618 CHAR16 RowString
[50];
619 CHAR16 ModeString
[50];
622 EFI_STRING_ID
*ModeToken
;
623 IFR_OPTION
*IfrOptionList
;
625 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
627 ConOut
= gST
->ConOut
;
630 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
632 CallbackData
->BmmAskSaveOrNot
= TRUE
;
634 UpdatePageStart (CallbackData
);
639 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
640 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
641 if (EFI_ERROR (Status
)) {
647 if (ValidMode
== 0) {
651 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
652 ASSERT(IfrOptionList
!= NULL
);
654 ModeToken
= EfiAllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
655 ASSERT(ModeToken
!= NULL
);
658 // Determin which mode should be the first entry in menu
660 GetConsoleOutMode (CallbackData
);
663 // Build text mode options
665 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
666 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
667 if (EFI_ERROR (Status
)) {
671 // Build mode string Column x Row
673 UnicodeValueToString (ModeString
, 0, Col
, 0);
674 StrCat (ModeString
, L
" x ");
675 UnicodeValueToString (RowString
, 0, Row
, 0);
676 StrCat (ModeString
, RowString
);
678 HiiLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
680 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
681 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
682 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
683 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
685 IfrOptionList
[Index
].Flags
= 0;
691 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
692 VARSTORE_ID_BOOT_MAINT
,
694 STRING_TOKEN (STR_CON_MODE_SETUP
),
695 STRING_TOKEN (STR_CON_MODE_SETUP
),
696 EFI_IFR_FLAG_RESET_REQUIRED
,
697 EFI_IFR_NUMERIC_SIZE_2
,
702 SafeFreePool (IfrOptionList
);
703 SafeFreePool (ModeToken
);
705 UpdatePageEnd (CallbackData
);
710 IN BMM_CALLBACK_DATA
*CallbackData
715 IFR_OPTION
*IfrOptionList
;
716 BM_MENU_ENTRY
*NewMenuEntry
;
717 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
719 CallbackData
->BmmAskSaveOrNot
= TRUE
;
721 UpdatePageStart (CallbackData
);
723 NewMenuEntry
= BOpt_GetMenuEntry (
725 CallbackData
->CurrentTerminal
728 if (NewMenuEntry
== NULL
) {
732 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
734 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * 19);
735 if (IfrOptionList
== NULL
) {
739 for (Index
= 0; Index
< 19; Index
++) {
741 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
742 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
743 NewTerminalContext
->BaudRateIndex
= Index
;
744 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
747 IfrOptionList
[Index
].Flags
= CheckFlags
;
748 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
749 IfrOptionList
[Index
].Value
.u8
= Index
;
753 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
754 VARSTORE_ID_BOOT_MAINT
,
755 COM_BAUD_RATE_VAR_OFFSET
,
756 STRING_TOKEN (STR_COM_BAUD_RATE
),
757 STRING_TOKEN (STR_COM_BAUD_RATE
),
759 EFI_IFR_NUMERIC_SIZE_1
,
765 for (Index
= 0; Index
< 4; Index
++) {
768 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
769 NewTerminalContext
->DataBitsIndex
= Index
;
770 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
771 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
774 IfrOptionList
[Index
].Flags
= CheckFlags
;
775 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
776 IfrOptionList
[Index
].Value
.u8
= Index
;
780 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
781 VARSTORE_ID_BOOT_MAINT
,
782 COM_DATA_RATE_VAR_OFFSET
,
783 STRING_TOKEN (STR_COM_DATA_BITS
),
784 STRING_TOKEN (STR_COM_DATA_BITS
),
786 EFI_IFR_NUMERIC_SIZE_1
,
792 for (Index
= 0; Index
< 5; Index
++) {
794 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
795 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
796 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
797 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
800 IfrOptionList
[Index
].Flags
= CheckFlags
;
801 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
802 IfrOptionList
[Index
].Value
.u8
= Index
;
806 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
807 VARSTORE_ID_BOOT_MAINT
,
808 COM_PARITY_VAR_OFFSET
,
809 STRING_TOKEN (STR_COM_PARITY
),
810 STRING_TOKEN (STR_COM_PARITY
),
812 EFI_IFR_NUMERIC_SIZE_1
,
818 for (Index
= 0; Index
< 3; Index
++) {
820 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
821 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
822 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
823 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
826 IfrOptionList
[Index
].Flags
= CheckFlags
;
827 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
828 IfrOptionList
[Index
].Value
.u8
= Index
;
832 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
833 VARSTORE_ID_BOOT_MAINT
,
834 COM_STOP_BITS_VAR_OFFSET
,
835 STRING_TOKEN (STR_COM_STOP_BITS
),
836 STRING_TOKEN (STR_COM_STOP_BITS
),
838 EFI_IFR_NUMERIC_SIZE_1
,
844 for (Index
= 0; Index
< 4; Index
++) {
846 if (NewTerminalContext
->TerminalType
== Index
) {
847 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
848 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
851 IfrOptionList
[Index
].Flags
= CheckFlags
;
852 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
853 IfrOptionList
[Index
].Value
.u8
= Index
;
857 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
858 VARSTORE_ID_BOOT_MAINT
,
859 COM_TERMINAL_VAR_OFFSET
,
860 STRING_TOKEN (STR_COM_TERMI_TYPE
),
861 STRING_TOKEN (STR_COM_TERMI_TYPE
),
863 EFI_IFR_NUMERIC_SIZE_1
,
869 SafeFreePool (IfrOptionList
);
871 UpdatePageEnd (CallbackData
);
876 IN UINT16 UpdatePageId
,
877 IN BMM_CALLBACK_DATA
*CallbackData
880 CleanUpPage (UpdatePageId
, CallbackData
);
881 switch (UpdatePageId
) {
883 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
886 case FORM_CON_OUT_ID
:
887 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
890 case FORM_CON_ERR_ID
:
891 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
894 case FORM_BOOT_CHG_ID
:
895 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
898 case FORM_DRV_CHG_ID
:
899 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
908 GetLegacyBootOptionVar (
910 OUT UINTN
*OptionIndex
,
911 OUT UINTN
*OptionSize
914 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
925 // Get Boot Option number from the size of BootOrder
927 OrderBuffer
= BdsLibGetVariableAndSize (
929 &gEfiGlobalVariableGuid
,
933 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
934 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
935 OptionBuffer
= BdsLibGetVariableAndSize (
937 &gEfiGlobalVariableGuid
,
940 if (NULL
== OptionBuffer
) {
944 Ptr
= (UINT8
*) OptionBuffer
;
945 Ptr
+= sizeof (UINT32
);
947 FilePathSize
= *(UINT16
*) Ptr
;
948 Ptr
+= sizeof (UINT16
);
950 Ptr
+= StrSize ((CHAR16
*) Ptr
);
953 // Now Ptr point to Device Path
955 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
959 // Now Ptr point to Optional Data
963 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
964 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
965 (BBS_BBS_DP
== DevicePath
->SubType
)
967 *OptionIndex
= OrderBuffer
[Index
];
968 SafeFreePool (OrderBuffer
);
971 SafeFreePool (OptionBuffer
);
975 SafeFreePool (OrderBuffer
);
980 UpdateSetLegacyDeviceOrderPage (
981 IN UINT16 UpdatePageId
,
982 IN BMM_CALLBACK_DATA
*CallbackData
985 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
986 BM_MENU_OPTION
*OptionMenu
;
987 BM_MENU_ENTRY
*NewMenuEntry
;
988 IFR_OPTION
*IfrOptionList
;
989 EFI_STRING_ID StrRef
;
990 EFI_STRING_ID StrRefHelp
;
1012 BbsType
= BBS_FLOPPY
;
1017 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1018 UpdatePageStart (CallbackData
);
1020 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1022 SetMem (DisMap
, 32, 0);
1024 // Create oneof option list
1026 switch (UpdatePageId
) {
1027 case FORM_SET_FD_ORDER_ID
:
1028 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1029 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1030 TypeStr
= StrFloppy
;
1031 TypeStrHelp
= StrFloppyHelp
;
1032 BbsType
= BBS_FLOPPY
;
1033 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1034 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1037 case FORM_SET_HD_ORDER_ID
:
1038 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1039 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1040 TypeStr
= StrHardDisk
;
1041 TypeStrHelp
= StrHardDiskHelp
;
1042 BbsType
= BBS_HARDDISK
;
1043 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1044 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1047 case FORM_SET_CD_ORDER_ID
:
1048 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1049 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1051 TypeStrHelp
= StrCDROMHelp
;
1052 BbsType
= BBS_CDROM
;
1053 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1054 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1057 case FORM_SET_NET_ORDER_ID
:
1058 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1059 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1061 TypeStrHelp
= StrNETHelp
;
1062 BbsType
= BBS_EMBED_NETWORK
;
1063 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1064 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1067 case FORM_SET_BEV_ORDER_ID
:
1068 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1069 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1071 TypeStrHelp
= StrBEVHelp
;
1072 BbsType
= BBS_BEV_DEVICE
;
1073 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1074 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1079 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1081 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1082 if (NULL
== IfrOptionList
) {
1086 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1087 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1088 IfrOptionList
[Index
].Flags
= 0;
1090 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1093 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1094 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1097 // for item "Disabled"
1099 IfrOptionList
[Index
].Flags
= 0;
1100 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1101 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1104 // Get Device Order from variable
1106 VarData
= BdsLibGetVariableAndSize (
1108 &EfiLegacyDevOrderGuid
,
1112 if (NULL
!= VarData
) {
1113 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1114 while (VarData
< VarData
+ VarSize
) {
1115 if (DevOrder
->BbsType
== BbsType
) {
1119 VarData
+= sizeof (BBS_TYPE
);
1120 VarData
+= *(UINT16
*) VarData
;
1121 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1124 // Create oneof tag here for FD/HD/CD #1 #2
1126 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1128 // Create the string for oneof tag
1130 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1132 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1134 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1136 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1139 (EFI_QUESTION_ID
) (Key
+ Index
),
1140 VARSTORE_ID_BOOT_MAINT
,
1141 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1144 EFI_IFR_FLAG_CALLBACK
,
1145 EFI_IFR_NUMERIC_SIZE_1
,
1147 OptionMenu
->MenuNumber
+ 1,
1151 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1153 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1154 LegacyOrder
[Index
] = 0xFF;
1155 Pos
= (VarDevOrder
& 0xFF) / 8;
1156 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1157 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1159 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1164 CopyMem (OldData
, LegacyOrder
, 100);
1166 if (IfrOptionList
!= NULL
) {
1167 SafeFreePool (IfrOptionList
);
1168 IfrOptionList
= NULL
;
1171 UpdatePageEnd (CallbackData
);
1176 BMM_CALLBACK_DATA
*Private
,
1180 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1182 // If we select a handle to add driver option, advance to the add handle description page.
1184 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1185 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1187 // Return to main page after "Save Changes" or "Discard Changes".
1189 NewPageId
= FORM_MAIN_ID
;
1190 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1191 NewPageId
= FORM_CON_COM_SETUP_ID
;
1194 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1195 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1196 Private
->BmmCurrentPageId
= NewPageId
;