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"
24 EFI_GUID gTerminalDriverGuid
= {
25 0x10634d8e, 0x1c05, 0x46cb, {0xbb, 0xc, 0x5a, 0xfd, 0xc8, 0x29, 0xa8, 0xc8}
35 Refresh the global UpdateData structure.
45 gUpdateData
.Offset
= 0;
50 IN BMM_CALLBACK_DATA
*CallbackData
55 if (!(CallbackData
->BmmAskSaveOrNot
)) {
57 // Add a "Go back to main page" tag in front of the form when there are no
58 // "Apply changes" and "Discard changes" tags in the end of the form.
62 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
63 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
74 IN BMM_CALLBACK_DATA
*CallbackData
78 // Create the "Apply changes" and "Discard changes" tags.
80 if (CallbackData
->BmmAskSaveOrNot
) {
81 CreateSubTitleOpCode (
82 STRING_TOKEN (STR_NULL_STRING
),
91 STRING_TOKEN (STR_SAVE_AND_EXIT
),
92 STRING_TOKEN (STR_NULL_STRING
),
93 EFI_IFR_FLAG_CALLBACK
,
94 KEY_VALUE_SAVE_AND_EXIT
,
100 // Ensure user can return to the main page.
104 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
105 STRING_TOKEN (STR_NULL_STRING
),
106 EFI_IFR_FLAG_CALLBACK
,
107 KEY_VALUE_NO_SAVE_AND_EXIT
,
112 CallbackData
->BmmHiiHandle
,
114 CallbackData
->BmmCurrentPageId
,
115 CallbackData
->BmmCurrentPageId
,
124 IN BMM_CALLBACK_DATA
*CallbackData
127 RefreshUpdateData ();
130 // Remove all op-codes from dynamic page
133 CallbackData
->BmmHiiHandle
,
144 IN BM_FILE_CONTEXT
*FileContext
150 BDS_COMMON_OPTION
*Option
;
152 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), (VOID
**) &Option
);
153 Option
->Description
= FileContext
->FileName
;
154 Option
->DevicePath
= FileContext
->DevicePath
;
155 Option
->LoadOptionsSize
= 0;
156 Option
->LoadOptions
= NULL
;
159 // Since current no boot from removable media directly is allowed */
161 gST
->ConOut
->ClearScreen (gST
->ConOut
);
163 gBS
->RaiseTPL (TPL_APPLICATION
);
167 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
169 gBS
->RestoreTPL (TPL_APPLICATION
);
177 IN BMM_CALLBACK_DATA
*CallbackData
180 BM_MENU_ENTRY
*NewMenuEntry
;
185 CallbackData
->BmmAskSaveOrNot
= FALSE
;
187 UpdatePageStart (CallbackData
);
189 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, (VOID
**) &Interface
);
190 if (!EFI_ERROR (Status
)) {
191 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
192 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
195 FORM_CON_COM_SETUP_ID
,
196 NewMenuEntry
->DisplayStringToken
,
197 STRING_TOKEN (STR_NULL_STRING
),
198 EFI_IFR_FLAG_CALLBACK
,
199 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
205 UpdatePageEnd (CallbackData
);
210 IN BMM_CALLBACK_DATA
*CallbackData
213 BM_MENU_ENTRY
*NewMenuEntry
;
214 BM_LOAD_CONTEXT
*NewLoadContext
;
217 CallbackData
->BmmAskSaveOrNot
= TRUE
;
219 UpdatePageStart (CallbackData
);
220 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
222 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
223 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
224 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
225 if (NewLoadContext
->IsLegacy
) {
229 NewLoadContext
->Deleted
= FALSE
;
230 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = 0x00;
232 CreateCheckBoxOpCode (
233 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
234 VARSTORE_ID_BOOT_MAINT
,
235 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
236 NewMenuEntry
->DisplayStringToken
,
237 NewMenuEntry
->HelpStringToken
,
244 UpdatePageEnd (CallbackData
);
248 UpdateDrvAddHandlePage (
249 IN BMM_CALLBACK_DATA
*CallbackData
252 BM_MENU_ENTRY
*NewMenuEntry
;
255 CallbackData
->BmmAskSaveOrNot
= FALSE
;
257 UpdatePageStart (CallbackData
);
259 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
260 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
263 FORM_DRV_ADD_HANDLE_DESC_ID
,
264 NewMenuEntry
->DisplayStringToken
,
265 STRING_TOKEN (STR_NULL_STRING
),
266 EFI_IFR_FLAG_CALLBACK
,
267 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
272 UpdatePageEnd (CallbackData
);
277 IN BMM_CALLBACK_DATA
*CallbackData
280 BM_MENU_ENTRY
*NewMenuEntry
;
281 BM_LOAD_CONTEXT
*NewLoadContext
;
284 CallbackData
->BmmAskSaveOrNot
= TRUE
;
286 UpdatePageStart (CallbackData
);
288 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
290 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
291 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
293 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
294 NewLoadContext
->Deleted
= FALSE
;
295 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
297 CreateCheckBoxOpCode (
298 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
299 VARSTORE_ID_BOOT_MAINT
,
300 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
301 NewMenuEntry
->DisplayStringToken
,
302 NewMenuEntry
->HelpStringToken
,
309 UpdatePageEnd (CallbackData
);
313 UpdateDriverAddHandleDescPage (
314 IN BMM_CALLBACK_DATA
*CallbackData
317 BM_MENU_ENTRY
*NewMenuEntry
;
319 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
320 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
321 CallbackData
->BmmAskSaveOrNot
= TRUE
;
322 NewMenuEntry
= CallbackData
->MenuEntry
;
324 UpdatePageStart (CallbackData
);
326 CreateSubTitleOpCode (
327 NewMenuEntry
->DisplayStringToken
,
335 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
336 VARSTORE_ID_BOOT_MAINT
,
337 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
338 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
339 STRING_TOKEN (STR_NULL_STRING
),
347 CreateCheckBoxOpCode (
348 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
349 VARSTORE_ID_BOOT_MAINT
,
350 DRV_ADD_RECON_VAR_OFFSET
,
351 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
352 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
359 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
360 VARSTORE_ID_BOOT_MAINT
,
361 DRIVER_ADD_OPTION_VAR_OFFSET
,
362 STRING_TOKEN (STR_OPTIONAL_DATA
),
363 STRING_TOKEN (STR_NULL_STRING
),
371 UpdatePageEnd (CallbackData
);
376 IN UINT16 UpdatePageId
,
377 IN BM_MENU_OPTION
*ConsoleMenu
,
378 IN BMM_CALLBACK_DATA
*CallbackData
381 BM_MENU_ENTRY
*NewMenuEntry
;
382 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
383 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
390 CallbackData
->BmmAskSaveOrNot
= TRUE
;
392 UpdatePageStart (CallbackData
);
394 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
395 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
396 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
398 if (NewConsoleContext
->IsActive
) {
399 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
400 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
402 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
405 CreateCheckBoxOpCode (
406 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
407 VARSTORE_ID_BOOT_MAINT
,
408 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
409 NewMenuEntry
->DisplayStringToken
,
410 NewMenuEntry
->HelpStringToken
,
417 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, (VOID
**) &Interface
);
418 if (!EFI_ERROR (Status
)) {
419 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
421 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
422 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
424 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
425 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
426 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
428 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
429 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
431 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
434 CreateCheckBoxOpCode (
435 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
436 VARSTORE_ID_BOOT_MAINT
,
437 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
438 NewMenuEntry
->DisplayStringToken
,
439 NewMenuEntry
->HelpStringToken
,
449 UpdatePageEnd (CallbackData
);
454 IN UINT16 UpdatePageId
,
455 IN BM_MENU_OPTION
*OptionMenu
,
456 IN BMM_CALLBACK_DATA
*CallbackData
459 BM_MENU_ENTRY
*NewMenuEntry
;
461 IFR_OPTION
*IfrOptionList
;
463 CallbackData
->BmmAskSaveOrNot
= TRUE
;
465 UpdatePageStart (CallbackData
);
467 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
469 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
471 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
472 if (NULL
== IfrOptionList
) {
476 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
477 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
478 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
479 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
480 IfrOptionList
[Index
].Flags
= 0;
481 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
484 if (OptionMenu
->MenuNumber
> 0) {
485 CreateOrderedListOpCode (
486 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
487 VARSTORE_ID_BOOT_MAINT
,
488 OPTION_ORDER_VAR_OFFSET
,
489 STRING_TOKEN (STR_CHANGE_ORDER
),
490 STRING_TOKEN (STR_CHANGE_ORDER
),
493 EFI_IFR_NUMERIC_SIZE_1
,
496 OptionMenu
->MenuNumber
,
501 SafeFreePool (IfrOptionList
);
503 UpdatePageEnd (CallbackData
);
506 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
507 CallbackData
->BmmFakeNvData
.OptionOrder
,
514 IN BMM_CALLBACK_DATA
*CallbackData
517 BM_MENU_ENTRY
*NewMenuEntry
;
518 BM_LOAD_CONTEXT
*NewLoadContext
;
519 IFR_OPTION
*IfrOptionList
;
520 UINTN NumberOfOptions
;
523 IfrOptionList
= NULL
;
524 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
525 CallbackData
->BmmAskSaveOrNot
= TRUE
;
527 UpdatePageStart (CallbackData
);
528 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
530 if (NumberOfOptions
> 0) {
531 IfrOptionList
= EfiAllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
533 ASSERT (IfrOptionList
);
535 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
537 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
538 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
539 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
540 if (NewLoadContext
->IsBootNext
) {
541 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
542 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
544 IfrOptionList
[Index
].Flags
= 0;
547 IfrOptionList
[Index
].Value
.u16
= Index
;
548 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
551 IfrOptionList
[Index
].Value
.u16
= Index
;
552 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
553 IfrOptionList
[Index
].Flags
= 0;
554 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
555 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
559 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
560 VARSTORE_ID_BOOT_MAINT
,
561 BOOT_NEXT_VAR_OFFSET
,
562 STRING_TOKEN (STR_BOOT_NEXT
),
563 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
565 EFI_IFR_NUMERIC_SIZE_2
,
567 (UINTN
) (NumberOfOptions
+ 1),
571 SafeFreePool (IfrOptionList
);
574 UpdatePageEnd (CallbackData
);
579 IN BMM_CALLBACK_DATA
*CallbackData
584 CallbackData
->BmmAskSaveOrNot
= TRUE
;
586 UpdatePageStart (CallbackData
);
588 BootTimeOut
= BdsLibGetTimeout ();
590 CreateNumericOpCode (
591 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
592 VARSTORE_ID_BOOT_MAINT
,
593 BOOT_TIME_OUT_VAR_OFFSET
,
594 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
595 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
597 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
605 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
607 UpdatePageEnd (CallbackData
);
612 IN BMM_CALLBACK_DATA
*CallbackData
617 Refresh the text mode page
620 CallbackData - BMM_CALLBACK_DATA
631 CHAR16 RowString
[50];
632 CHAR16 ModeString
[50];
635 EFI_STRING_ID
*ModeToken
;
636 IFR_OPTION
*IfrOptionList
;
638 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
640 ConOut
= gST
->ConOut
;
643 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
645 CallbackData
->BmmAskSaveOrNot
= TRUE
;
647 UpdatePageStart (CallbackData
);
652 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
653 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
654 if (EFI_ERROR (Status
)) {
660 if (ValidMode
== 0) {
664 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
665 ASSERT(IfrOptionList
!= NULL
);
667 ModeToken
= EfiAllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
668 ASSERT(ModeToken
!= NULL
);
671 // Determin which mode should be the first entry in menu
673 GetConsoleOutMode (CallbackData
);
676 // Build text mode options
678 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
679 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
680 if (EFI_ERROR (Status
)) {
684 // Build mode string Column x Row
686 UnicodeValueToString (ModeString
, 0, Col
, 0);
687 StrCat (ModeString
, L
" x ");
688 UnicodeValueToString (RowString
, 0, Row
, 0);
689 StrCat (ModeString
, RowString
);
691 IfrLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
693 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
694 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
695 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
696 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
698 IfrOptionList
[Index
].Flags
= 0;
704 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
705 VARSTORE_ID_BOOT_MAINT
,
707 STRING_TOKEN (STR_CON_MODE_SETUP
),
708 STRING_TOKEN (STR_CON_MODE_SETUP
),
709 EFI_IFR_FLAG_RESET_REQUIRED
,
710 EFI_IFR_NUMERIC_SIZE_2
,
715 SafeFreePool (IfrOptionList
);
716 SafeFreePool (ModeToken
);
718 UpdatePageEnd (CallbackData
);
723 IN BMM_CALLBACK_DATA
*CallbackData
728 IFR_OPTION
*IfrOptionList
;
729 BM_MENU_ENTRY
*NewMenuEntry
;
730 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
732 CallbackData
->BmmAskSaveOrNot
= TRUE
;
734 UpdatePageStart (CallbackData
);
736 NewMenuEntry
= BOpt_GetMenuEntry (
738 CallbackData
->CurrentTerminal
741 if (NewMenuEntry
== NULL
) {
745 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
747 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * 19);
748 if (IfrOptionList
== NULL
) {
752 for (Index
= 0; Index
< 19; Index
++) {
754 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
755 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
756 NewTerminalContext
->BaudRateIndex
= Index
;
757 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
760 IfrOptionList
[Index
].Flags
= CheckFlags
;
761 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
762 IfrOptionList
[Index
].Value
.u8
= Index
;
766 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
767 VARSTORE_ID_BOOT_MAINT
,
768 COM_BAUD_RATE_VAR_OFFSET
,
769 STRING_TOKEN (STR_COM_BAUD_RATE
),
770 STRING_TOKEN (STR_COM_BAUD_RATE
),
772 EFI_IFR_NUMERIC_SIZE_1
,
778 for (Index
= 0; Index
< 4; Index
++) {
781 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
782 NewTerminalContext
->DataBitsIndex
= Index
;
783 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
784 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
787 IfrOptionList
[Index
].Flags
= CheckFlags
;
788 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
789 IfrOptionList
[Index
].Value
.u8
= Index
;
793 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
794 VARSTORE_ID_BOOT_MAINT
,
795 COM_DATA_RATE_VAR_OFFSET
,
796 STRING_TOKEN (STR_COM_DATA_BITS
),
797 STRING_TOKEN (STR_COM_DATA_BITS
),
799 EFI_IFR_NUMERIC_SIZE_1
,
805 for (Index
= 0; Index
< 5; Index
++) {
807 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
808 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
809 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
810 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
813 IfrOptionList
[Index
].Flags
= CheckFlags
;
814 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
815 IfrOptionList
[Index
].Value
.u8
= Index
;
819 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
820 VARSTORE_ID_BOOT_MAINT
,
821 COM_PARITY_VAR_OFFSET
,
822 STRING_TOKEN (STR_COM_PARITY
),
823 STRING_TOKEN (STR_COM_PARITY
),
825 EFI_IFR_NUMERIC_SIZE_1
,
831 for (Index
= 0; Index
< 3; Index
++) {
833 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
834 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
835 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
836 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
839 IfrOptionList
[Index
].Flags
= CheckFlags
;
840 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
841 IfrOptionList
[Index
].Value
.u8
= Index
;
845 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
846 VARSTORE_ID_BOOT_MAINT
,
847 COM_STOP_BITS_VAR_OFFSET
,
848 STRING_TOKEN (STR_COM_STOP_BITS
),
849 STRING_TOKEN (STR_COM_STOP_BITS
),
851 EFI_IFR_NUMERIC_SIZE_1
,
857 for (Index
= 0; Index
< 4; Index
++) {
859 if (NewTerminalContext
->TerminalType
== Index
) {
860 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
861 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
864 IfrOptionList
[Index
].Flags
= CheckFlags
;
865 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
866 IfrOptionList
[Index
].Value
.u8
= Index
;
870 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
871 VARSTORE_ID_BOOT_MAINT
,
872 COM_TERMINAL_VAR_OFFSET
,
873 STRING_TOKEN (STR_COM_TERMI_TYPE
),
874 STRING_TOKEN (STR_COM_TERMI_TYPE
),
876 EFI_IFR_NUMERIC_SIZE_1
,
882 SafeFreePool (IfrOptionList
);
884 UpdatePageEnd (CallbackData
);
889 IN UINT16 UpdatePageId
,
890 IN BMM_CALLBACK_DATA
*CallbackData
893 CleanUpPage (UpdatePageId
, CallbackData
);
894 switch (UpdatePageId
) {
896 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
899 case FORM_CON_OUT_ID
:
900 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
903 case FORM_CON_ERR_ID
:
904 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
907 case FORM_BOOT_CHG_ID
:
908 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
911 case FORM_DRV_CHG_ID
:
912 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
921 GetLegacyBootOptionVar (
923 OUT UINTN
*OptionIndex
,
924 OUT UINTN
*OptionSize
927 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
938 // Get Boot Option number from the size of BootOrder
940 OrderBuffer
= BdsLibGetVariableAndSize (
942 &gEfiGlobalVariableGuid
,
946 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
947 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
948 OptionBuffer
= BdsLibGetVariableAndSize (
950 &gEfiGlobalVariableGuid
,
953 if (NULL
== OptionBuffer
) {
957 Ptr
= (UINT8
*) OptionBuffer
;
958 Ptr
+= sizeof (UINT32
);
960 FilePathSize
= *(UINT16
*) Ptr
;
961 Ptr
+= sizeof (UINT16
);
963 Ptr
+= StrSize ((CHAR16
*) Ptr
);
966 // Now Ptr point to Device Path
968 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
972 // Now Ptr point to Optional Data
976 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
977 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
978 (BBS_BBS_DP
== DevicePath
->SubType
)
980 *OptionIndex
= OrderBuffer
[Index
];
981 SafeFreePool (OrderBuffer
);
984 SafeFreePool (OptionBuffer
);
988 SafeFreePool (OrderBuffer
);
993 UpdateSetLegacyDeviceOrderPage (
994 IN UINT16 UpdatePageId
,
995 IN BMM_CALLBACK_DATA
*CallbackData
998 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
999 BM_MENU_OPTION
*OptionMenu
;
1000 BM_MENU_ENTRY
*NewMenuEntry
;
1001 IFR_OPTION
*IfrOptionList
;
1002 EFI_STRING_ID StrRef
;
1003 EFI_STRING_ID StrRefHelp
;
1012 CHAR16
*TypeStrHelp
;
1025 BbsType
= BBS_FLOPPY
;
1030 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1031 UpdatePageStart (CallbackData
);
1033 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1035 SetMem (DisMap
, 32, 0);
1037 // Create oneof option list
1039 switch (UpdatePageId
) {
1040 case FORM_SET_FD_ORDER_ID
:
1041 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1042 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1043 TypeStr
= StrFloppy
;
1044 TypeStrHelp
= StrFloppyHelp
;
1045 BbsType
= BBS_FLOPPY
;
1046 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1047 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1050 case FORM_SET_HD_ORDER_ID
:
1051 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1052 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1053 TypeStr
= StrHardDisk
;
1054 TypeStrHelp
= StrHardDiskHelp
;
1055 BbsType
= BBS_HARDDISK
;
1056 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1057 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1060 case FORM_SET_CD_ORDER_ID
:
1061 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1062 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1064 TypeStrHelp
= StrCDROMHelp
;
1065 BbsType
= BBS_CDROM
;
1066 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1067 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1070 case FORM_SET_NET_ORDER_ID
:
1071 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1072 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1074 TypeStrHelp
= StrNETHelp
;
1075 BbsType
= BBS_EMBED_NETWORK
;
1076 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1077 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1080 case FORM_SET_BEV_ORDER_ID
:
1081 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1082 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1084 TypeStrHelp
= StrBEVHelp
;
1085 BbsType
= BBS_BEV_DEVICE
;
1086 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1087 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1092 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1094 IfrOptionList
= EfiAllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1095 if (NULL
== IfrOptionList
) {
1099 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1100 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1101 IfrOptionList
[Index
].Flags
= 0;
1103 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1106 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1107 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1110 // for item "Disabled"
1112 IfrOptionList
[Index
].Flags
= 0;
1113 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1114 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1117 // Get Device Order from variable
1119 VarData
= BdsLibGetVariableAndSize (
1121 &EfiLegacyDevOrderGuid
,
1125 if (NULL
!= VarData
) {
1126 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1127 while (VarData
< VarData
+ VarSize
) {
1128 if (DevOrder
->BbsType
== BbsType
) {
1132 VarData
+= sizeof (BBS_TYPE
);
1133 VarData
+= *(UINT16
*) VarData
;
1134 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1137 // Create oneof tag here for FD/HD/CD #1 #2
1139 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1141 // Create the string for oneof tag
1143 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1145 IfrLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1147 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1149 IfrLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1152 (EFI_QUESTION_ID
) (Key
+ Index
),
1153 VARSTORE_ID_BOOT_MAINT
,
1154 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1157 EFI_IFR_FLAG_CALLBACK
,
1158 EFI_IFR_NUMERIC_SIZE_1
,
1160 OptionMenu
->MenuNumber
+ 1,
1164 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1166 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1167 LegacyOrder
[Index
] = 0xFF;
1168 Pos
= (VarDevOrder
& 0xFF) / 8;
1169 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1170 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1172 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1177 CopyMem (OldData
, LegacyOrder
, 100);
1179 if (IfrOptionList
!= NULL
) {
1180 SafeFreePool (IfrOptionList
);
1181 IfrOptionList
= NULL
;
1184 UpdatePageEnd (CallbackData
);
1189 BMM_CALLBACK_DATA
*Private
,
1193 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1195 // If we select a handle to add driver option, advance to the add handle description page.
1197 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1198 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1200 // Return to main page after "Save Changes" or "Discard Changes".
1202 NewPageId
= FORM_MAIN_ID
;
1203 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1204 NewPageId
= FORM_CON_COM_SETUP_ID
;
1207 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1208 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1209 Private
->BmmCurrentPageId
= NewPageId
;