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"
24 Refresh the global UpdateData structure.
34 gUpdateData
.Offset
= 0;
39 IN BMM_CALLBACK_DATA
*CallbackData
44 if (!(CallbackData
->BmmAskSaveOrNot
)) {
46 // Add a "Go back to main page" tag in front of the form when there are no
47 // "Apply changes" and "Discard changes" tags in the end of the form.
51 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
52 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
63 IN BMM_CALLBACK_DATA
*CallbackData
67 // Create the "Apply changes" and "Discard changes" tags.
69 if (CallbackData
->BmmAskSaveOrNot
) {
70 CreateSubTitleOpCode (
71 STRING_TOKEN (STR_NULL_STRING
),
80 STRING_TOKEN (STR_SAVE_AND_EXIT
),
81 STRING_TOKEN (STR_NULL_STRING
),
82 EFI_IFR_FLAG_CALLBACK
,
83 KEY_VALUE_SAVE_AND_EXIT
,
89 // Ensure user can return to the main page.
93 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
94 STRING_TOKEN (STR_NULL_STRING
),
95 EFI_IFR_FLAG_CALLBACK
,
96 KEY_VALUE_NO_SAVE_AND_EXIT
,
101 CallbackData
->BmmHiiHandle
,
103 CallbackData
->BmmCurrentPageId
,
104 CallbackData
->BmmCurrentPageId
,
113 IN BMM_CALLBACK_DATA
*CallbackData
116 RefreshUpdateData ();
119 // Remove all op-codes from dynamic page
122 CallbackData
->BmmHiiHandle
,
133 IN BM_FILE_CONTEXT
*FileContext
139 BDS_COMMON_OPTION
*Option
;
141 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), (VOID
**) &Option
);
142 Option
->Description
= FileContext
->FileName
;
143 Option
->DevicePath
= FileContext
->DevicePath
;
144 Option
->LoadOptionsSize
= 0;
145 Option
->LoadOptions
= NULL
;
148 // Since current no boot from removable media directly is allowed */
150 gST
->ConOut
->ClearScreen (gST
->ConOut
);
152 gBS
->RaiseTPL (TPL_APPLICATION
);
156 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
158 gBS
->RestoreTPL (TPL_APPLICATION
);
166 IN BMM_CALLBACK_DATA
*CallbackData
169 BM_MENU_ENTRY
*NewMenuEntry
;
172 CallbackData
->BmmAskSaveOrNot
= FALSE
;
174 UpdatePageStart (CallbackData
);
177 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
178 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
181 FORM_CON_COM_SETUP_ID
,
182 NewMenuEntry
->DisplayStringToken
,
183 STRING_TOKEN (STR_NULL_STRING
),
184 EFI_IFR_FLAG_CALLBACK
,
185 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
190 UpdatePageEnd (CallbackData
);
195 IN BMM_CALLBACK_DATA
*CallbackData
198 BM_MENU_ENTRY
*NewMenuEntry
;
199 BM_LOAD_CONTEXT
*NewLoadContext
;
202 CallbackData
->BmmAskSaveOrNot
= TRUE
;
204 UpdatePageStart (CallbackData
);
205 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
207 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
208 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
209 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
210 if (NewLoadContext
->IsLegacy
) {
214 NewLoadContext
->Deleted
= FALSE
;
215 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = 0x00;
217 CreateCheckBoxOpCode (
218 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
219 VARSTORE_ID_BOOT_MAINT
,
220 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
221 NewMenuEntry
->DisplayStringToken
,
222 NewMenuEntry
->HelpStringToken
,
229 UpdatePageEnd (CallbackData
);
233 UpdateDrvAddHandlePage (
234 IN BMM_CALLBACK_DATA
*CallbackData
237 BM_MENU_ENTRY
*NewMenuEntry
;
240 CallbackData
->BmmAskSaveOrNot
= FALSE
;
242 UpdatePageStart (CallbackData
);
244 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
245 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
248 FORM_DRV_ADD_HANDLE_DESC_ID
,
249 NewMenuEntry
->DisplayStringToken
,
250 STRING_TOKEN (STR_NULL_STRING
),
251 EFI_IFR_FLAG_CALLBACK
,
252 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
257 UpdatePageEnd (CallbackData
);
262 IN BMM_CALLBACK_DATA
*CallbackData
265 BM_MENU_ENTRY
*NewMenuEntry
;
266 BM_LOAD_CONTEXT
*NewLoadContext
;
269 CallbackData
->BmmAskSaveOrNot
= TRUE
;
271 UpdatePageStart (CallbackData
);
273 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
275 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
276 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
278 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
279 NewLoadContext
->Deleted
= FALSE
;
280 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
282 CreateCheckBoxOpCode (
283 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
284 VARSTORE_ID_BOOT_MAINT
,
285 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
286 NewMenuEntry
->DisplayStringToken
,
287 NewMenuEntry
->HelpStringToken
,
294 UpdatePageEnd (CallbackData
);
298 UpdateDriverAddHandleDescPage (
299 IN BMM_CALLBACK_DATA
*CallbackData
302 BM_MENU_ENTRY
*NewMenuEntry
;
304 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
305 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
306 CallbackData
->BmmAskSaveOrNot
= TRUE
;
307 NewMenuEntry
= CallbackData
->MenuEntry
;
309 UpdatePageStart (CallbackData
);
311 CreateSubTitleOpCode (
312 NewMenuEntry
->DisplayStringToken
,
320 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
321 VARSTORE_ID_BOOT_MAINT
,
322 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
323 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
324 STRING_TOKEN (STR_NULL_STRING
),
332 CreateCheckBoxOpCode (
333 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
334 VARSTORE_ID_BOOT_MAINT
,
335 DRV_ADD_RECON_VAR_OFFSET
,
336 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
337 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
344 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
345 VARSTORE_ID_BOOT_MAINT
,
346 DRIVER_ADD_OPTION_VAR_OFFSET
,
347 STRING_TOKEN (STR_OPTIONAL_DATA
),
348 STRING_TOKEN (STR_NULL_STRING
),
356 UpdatePageEnd (CallbackData
);
361 IN UINT16 UpdatePageId
,
362 IN BM_MENU_OPTION
*ConsoleMenu
,
363 IN BMM_CALLBACK_DATA
*CallbackData
366 BM_MENU_ENTRY
*NewMenuEntry
;
367 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
368 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
373 CallbackData
->BmmAskSaveOrNot
= TRUE
;
375 UpdatePageStart (CallbackData
);
377 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
378 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
379 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
381 if (NewConsoleContext
->IsActive
) {
382 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
383 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
385 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
388 CreateCheckBoxOpCode (
389 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
390 VARSTORE_ID_BOOT_MAINT
,
391 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
392 NewMenuEntry
->DisplayStringToken
,
393 NewMenuEntry
->HelpStringToken
,
400 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
402 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
403 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
405 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
406 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
407 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
409 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
410 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
412 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
415 CreateCheckBoxOpCode (
416 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
417 VARSTORE_ID_BOOT_MAINT
,
418 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
419 NewMenuEntry
->DisplayStringToken
,
420 NewMenuEntry
->HelpStringToken
,
429 UpdatePageEnd (CallbackData
);
434 IN UINT16 UpdatePageId
,
435 IN BM_MENU_OPTION
*OptionMenu
,
436 IN BMM_CALLBACK_DATA
*CallbackData
439 BM_MENU_ENTRY
*NewMenuEntry
;
441 IFR_OPTION
*IfrOptionList
;
443 CallbackData
->BmmAskSaveOrNot
= TRUE
;
445 UpdatePageStart (CallbackData
);
447 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
449 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
451 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
452 if (NULL
== IfrOptionList
) {
456 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
457 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
458 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
459 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
460 IfrOptionList
[Index
].Flags
= 0;
461 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
464 if (OptionMenu
->MenuNumber
> 0) {
465 CreateOrderedListOpCode (
466 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
467 VARSTORE_ID_BOOT_MAINT
,
468 OPTION_ORDER_VAR_OFFSET
,
469 STRING_TOKEN (STR_CHANGE_ORDER
),
470 STRING_TOKEN (STR_CHANGE_ORDER
),
473 EFI_IFR_NUMERIC_SIZE_1
,
476 OptionMenu
->MenuNumber
,
481 SafeFreePool (IfrOptionList
);
483 UpdatePageEnd (CallbackData
);
486 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
487 CallbackData
->BmmFakeNvData
.OptionOrder
,
494 IN BMM_CALLBACK_DATA
*CallbackData
497 BM_MENU_ENTRY
*NewMenuEntry
;
498 BM_LOAD_CONTEXT
*NewLoadContext
;
499 IFR_OPTION
*IfrOptionList
;
500 UINTN NumberOfOptions
;
503 IfrOptionList
= NULL
;
504 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
505 CallbackData
->BmmAskSaveOrNot
= TRUE
;
507 UpdatePageStart (CallbackData
);
508 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
510 if (NumberOfOptions
> 0) {
511 IfrOptionList
= EfiAllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
513 ASSERT (IfrOptionList
);
515 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
517 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
518 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
519 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
520 if (NewLoadContext
->IsBootNext
) {
521 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
522 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
524 IfrOptionList
[Index
].Flags
= 0;
527 IfrOptionList
[Index
].Value
.u16
= Index
;
528 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
531 IfrOptionList
[Index
].Value
.u16
= Index
;
532 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
533 IfrOptionList
[Index
].Flags
= 0;
534 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
535 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
539 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
540 VARSTORE_ID_BOOT_MAINT
,
541 BOOT_NEXT_VAR_OFFSET
,
542 STRING_TOKEN (STR_BOOT_NEXT
),
543 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
545 EFI_IFR_NUMERIC_SIZE_2
,
547 (UINTN
) (NumberOfOptions
+ 1),
551 SafeFreePool (IfrOptionList
);
554 UpdatePageEnd (CallbackData
);
559 IN BMM_CALLBACK_DATA
*CallbackData
564 CallbackData
->BmmAskSaveOrNot
= TRUE
;
566 UpdatePageStart (CallbackData
);
568 BootTimeOut
= BdsLibGetTimeout ();
570 CreateNumericOpCode (
571 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
572 VARSTORE_ID_BOOT_MAINT
,
573 BOOT_TIME_OUT_VAR_OFFSET
,
574 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
575 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
577 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
585 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
587 UpdatePageEnd (CallbackData
);
592 IN BMM_CALLBACK_DATA
*CallbackData
597 Refresh the text mode page
600 CallbackData - BMM_CALLBACK_DATA
611 CHAR16 RowString
[50];
612 CHAR16 ModeString
[50];
615 EFI_STRING_ID
*ModeToken
;
616 IFR_OPTION
*IfrOptionList
;
618 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
620 ConOut
= gST
->ConOut
;
623 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
625 CallbackData
->BmmAskSaveOrNot
= TRUE
;
627 UpdatePageStart (CallbackData
);
632 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
633 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
634 if (EFI_ERROR (Status
)) {
640 if (ValidMode
== 0) {
644 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
645 ASSERT(IfrOptionList
!= NULL
);
647 ModeToken
= EfiAllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
648 ASSERT(ModeToken
!= NULL
);
651 // Determin which mode should be the first entry in menu
653 GetConsoleOutMode (CallbackData
);
656 // Build text mode options
658 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
659 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
660 if (EFI_ERROR (Status
)) {
664 // Build mode string Column x Row
666 UnicodeValueToString (ModeString
, 0, Col
, 0);
667 StrCat (ModeString
, L
" x ");
668 UnicodeValueToString (RowString
, 0, Row
, 0);
669 StrCat (ModeString
, RowString
);
671 HiiLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
673 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
674 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
675 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
676 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
678 IfrOptionList
[Index
].Flags
= 0;
684 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
685 VARSTORE_ID_BOOT_MAINT
,
687 STRING_TOKEN (STR_CON_MODE_SETUP
),
688 STRING_TOKEN (STR_CON_MODE_SETUP
),
689 EFI_IFR_FLAG_RESET_REQUIRED
,
690 EFI_IFR_NUMERIC_SIZE_2
,
695 SafeFreePool (IfrOptionList
);
696 SafeFreePool (ModeToken
);
698 UpdatePageEnd (CallbackData
);
703 IN BMM_CALLBACK_DATA
*CallbackData
708 IFR_OPTION
*IfrOptionList
;
709 BM_MENU_ENTRY
*NewMenuEntry
;
710 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
712 CallbackData
->BmmAskSaveOrNot
= TRUE
;
714 UpdatePageStart (CallbackData
);
716 NewMenuEntry
= BOpt_GetMenuEntry (
718 CallbackData
->CurrentTerminal
721 if (NewMenuEntry
== NULL
) {
725 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
727 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * 19);
728 if (IfrOptionList
== NULL
) {
732 for (Index
= 0; Index
< 19; Index
++) {
734 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
735 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
736 NewTerminalContext
->BaudRateIndex
= Index
;
737 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
740 IfrOptionList
[Index
].Flags
= CheckFlags
;
741 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
742 IfrOptionList
[Index
].Value
.u8
= Index
;
746 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
747 VARSTORE_ID_BOOT_MAINT
,
748 COM_BAUD_RATE_VAR_OFFSET
,
749 STRING_TOKEN (STR_COM_BAUD_RATE
),
750 STRING_TOKEN (STR_COM_BAUD_RATE
),
752 EFI_IFR_NUMERIC_SIZE_1
,
758 for (Index
= 0; Index
< 4; Index
++) {
761 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
762 NewTerminalContext
->DataBitsIndex
= Index
;
763 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
764 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
767 IfrOptionList
[Index
].Flags
= CheckFlags
;
768 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
769 IfrOptionList
[Index
].Value
.u8
= Index
;
773 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
774 VARSTORE_ID_BOOT_MAINT
,
775 COM_DATA_RATE_VAR_OFFSET
,
776 STRING_TOKEN (STR_COM_DATA_BITS
),
777 STRING_TOKEN (STR_COM_DATA_BITS
),
779 EFI_IFR_NUMERIC_SIZE_1
,
785 for (Index
= 0; Index
< 5; Index
++) {
787 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
788 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
789 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
790 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
793 IfrOptionList
[Index
].Flags
= CheckFlags
;
794 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
795 IfrOptionList
[Index
].Value
.u8
= Index
;
799 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
800 VARSTORE_ID_BOOT_MAINT
,
801 COM_PARITY_VAR_OFFSET
,
802 STRING_TOKEN (STR_COM_PARITY
),
803 STRING_TOKEN (STR_COM_PARITY
),
805 EFI_IFR_NUMERIC_SIZE_1
,
811 for (Index
= 0; Index
< 3; Index
++) {
813 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
814 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
815 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
816 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
819 IfrOptionList
[Index
].Flags
= CheckFlags
;
820 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
821 IfrOptionList
[Index
].Value
.u8
= Index
;
825 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
826 VARSTORE_ID_BOOT_MAINT
,
827 COM_STOP_BITS_VAR_OFFSET
,
828 STRING_TOKEN (STR_COM_STOP_BITS
),
829 STRING_TOKEN (STR_COM_STOP_BITS
),
831 EFI_IFR_NUMERIC_SIZE_1
,
837 for (Index
= 0; Index
< 4; Index
++) {
839 if (NewTerminalContext
->TerminalType
== Index
) {
840 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
841 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
844 IfrOptionList
[Index
].Flags
= CheckFlags
;
845 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
846 IfrOptionList
[Index
].Value
.u8
= Index
;
850 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
851 VARSTORE_ID_BOOT_MAINT
,
852 COM_TERMINAL_VAR_OFFSET
,
853 STRING_TOKEN (STR_COM_TERMI_TYPE
),
854 STRING_TOKEN (STR_COM_TERMI_TYPE
),
856 EFI_IFR_NUMERIC_SIZE_1
,
862 SafeFreePool (IfrOptionList
);
864 UpdatePageEnd (CallbackData
);
869 IN UINT16 UpdatePageId
,
870 IN BMM_CALLBACK_DATA
*CallbackData
873 CleanUpPage (UpdatePageId
, CallbackData
);
874 switch (UpdatePageId
) {
876 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
879 case FORM_CON_OUT_ID
:
880 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
883 case FORM_CON_ERR_ID
:
884 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
887 case FORM_BOOT_CHG_ID
:
888 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
891 case FORM_DRV_CHG_ID
:
892 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
901 GetLegacyBootOptionVar (
903 OUT UINTN
*OptionIndex
,
904 OUT UINTN
*OptionSize
907 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
918 // Get Boot Option number from the size of BootOrder
920 OrderBuffer
= BdsLibGetVariableAndSize (
922 &gEfiGlobalVariableGuid
,
926 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
927 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
928 OptionBuffer
= BdsLibGetVariableAndSize (
930 &gEfiGlobalVariableGuid
,
933 if (NULL
== OptionBuffer
) {
937 Ptr
= (UINT8
*) OptionBuffer
;
938 Ptr
+= sizeof (UINT32
);
940 FilePathSize
= *(UINT16
*) Ptr
;
941 Ptr
+= sizeof (UINT16
);
943 Ptr
+= StrSize ((CHAR16
*) Ptr
);
946 // Now Ptr point to Device Path
948 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
952 // Now Ptr point to Optional Data
956 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
957 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
958 (BBS_BBS_DP
== DevicePath
->SubType
)
960 *OptionIndex
= OrderBuffer
[Index
];
961 SafeFreePool (OrderBuffer
);
964 SafeFreePool (OptionBuffer
);
968 SafeFreePool (OrderBuffer
);
973 UpdateSetLegacyDeviceOrderPage (
974 IN UINT16 UpdatePageId
,
975 IN BMM_CALLBACK_DATA
*CallbackData
978 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
979 BM_MENU_OPTION
*OptionMenu
;
980 BM_MENU_ENTRY
*NewMenuEntry
;
981 IFR_OPTION
*IfrOptionList
;
982 EFI_STRING_ID StrRef
;
983 EFI_STRING_ID StrRefHelp
;
1005 BbsType
= BBS_FLOPPY
;
1010 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1011 UpdatePageStart (CallbackData
);
1013 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1015 SetMem (DisMap
, 32, 0);
1017 // Create oneof option list
1019 switch (UpdatePageId
) {
1020 case FORM_SET_FD_ORDER_ID
:
1021 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1022 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1023 TypeStr
= StrFloppy
;
1024 TypeStrHelp
= StrFloppyHelp
;
1025 BbsType
= BBS_FLOPPY
;
1026 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1027 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1030 case FORM_SET_HD_ORDER_ID
:
1031 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1032 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1033 TypeStr
= StrHardDisk
;
1034 TypeStrHelp
= StrHardDiskHelp
;
1035 BbsType
= BBS_HARDDISK
;
1036 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1037 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1040 case FORM_SET_CD_ORDER_ID
:
1041 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1042 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1044 TypeStrHelp
= StrCDROMHelp
;
1045 BbsType
= BBS_CDROM
;
1046 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1047 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1050 case FORM_SET_NET_ORDER_ID
:
1051 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1052 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1054 TypeStrHelp
= StrNETHelp
;
1055 BbsType
= BBS_EMBED_NETWORK
;
1056 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1057 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1060 case FORM_SET_BEV_ORDER_ID
:
1061 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1062 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1064 TypeStrHelp
= StrBEVHelp
;
1065 BbsType
= BBS_BEV_DEVICE
;
1066 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1067 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1072 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1074 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1075 if (NULL
== IfrOptionList
) {
1079 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1080 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1081 IfrOptionList
[Index
].Flags
= 0;
1083 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1086 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1087 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1090 // for item "Disabled"
1092 IfrOptionList
[Index
].Flags
= 0;
1093 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1094 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1097 // Get Device Order from variable
1099 VarData
= BdsLibGetVariableAndSize (
1101 &EfiLegacyDevOrderGuid
,
1105 if (NULL
!= VarData
) {
1106 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1107 while (VarData
< VarData
+ VarSize
) {
1108 if (DevOrder
->BbsType
== BbsType
) {
1112 VarData
+= sizeof (BBS_TYPE
);
1113 VarData
+= *(UINT16
*) VarData
;
1114 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1117 // Create oneof tag here for FD/HD/CD #1 #2
1119 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1121 // Create the string for oneof tag
1123 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1125 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1127 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1129 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1132 (EFI_QUESTION_ID
) (Key
+ Index
),
1133 VARSTORE_ID_BOOT_MAINT
,
1134 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1137 EFI_IFR_FLAG_CALLBACK
,
1138 EFI_IFR_NUMERIC_SIZE_1
,
1140 OptionMenu
->MenuNumber
+ 1,
1144 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1146 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1147 LegacyOrder
[Index
] = 0xFF;
1148 Pos
= (VarDevOrder
& 0xFF) / 8;
1149 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1150 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1152 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1157 CopyMem (OldData
, LegacyOrder
, 100);
1159 if (IfrOptionList
!= NULL
) {
1160 SafeFreePool (IfrOptionList
);
1161 IfrOptionList
= NULL
;
1164 UpdatePageEnd (CallbackData
);
1169 BMM_CALLBACK_DATA
*Private
,
1173 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1175 // If we select a handle to add driver option, advance to the add handle description page.
1177 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1178 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1180 // Return to main page after "Save Changes" or "Discard Changes".
1182 NewPageId
= FORM_MAIN_ID
;
1183 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1184 NewPageId
= FORM_CON_COM_SETUP_ID
;
1187 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1188 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1189 Private
->BmmCurrentPageId
= NewPageId
;