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.
30 gUpdateData
.Offset
= 0;
34 Add a "Go back to main page" tag in front of the form when there are no
35 "Apply changes" and "Discard changes" tags in the end of the form.
38 @param CallbackData The BMM context data.
45 IN BMM_CALLBACK_DATA
*CallbackData
50 if (!(CallbackData
->BmmAskSaveOrNot
)) {
52 // Add a "Go back to main page" tag in front of the form when there are no
53 // "Apply changes" and "Discard changes" tags in the end of the form.
57 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
58 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
68 Create the "Apply changes" and "Discard changes" tags. And
69 ensure user can return to the main page.
71 @param CallbackData The BMM context data.
78 IN BMM_CALLBACK_DATA
*CallbackData
82 // Create the "Apply changes" and "Discard changes" tags.
84 if (CallbackData
->BmmAskSaveOrNot
) {
85 CreateSubTitleOpCode (
86 STRING_TOKEN (STR_NULL_STRING
),
95 STRING_TOKEN (STR_SAVE_AND_EXIT
),
96 STRING_TOKEN (STR_NULL_STRING
),
97 EFI_IFR_FLAG_CALLBACK
,
98 KEY_VALUE_SAVE_AND_EXIT
,
104 // Ensure user can return to the main page.
108 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
109 STRING_TOKEN (STR_NULL_STRING
),
110 EFI_IFR_FLAG_CALLBACK
,
111 KEY_VALUE_NO_SAVE_AND_EXIT
,
116 CallbackData
->BmmHiiHandle
,
118 CallbackData
->BmmCurrentPageId
,
119 CallbackData
->BmmCurrentPageId
,
126 Clean up the dynamic opcode at label and form specified by
129 @param LabelId It is both the Form ID and Label ID for
131 @param CallbackData The BMM context data.
139 IN BMM_CALLBACK_DATA
*CallbackData
142 RefreshUpdateData ();
145 // Remove all op-codes from dynamic page
148 CallbackData
->BmmHiiHandle
,
158 Boot a file selected by user at File Expoloer of BMM.
160 @param FileContext The file context data, which contains the device path
161 of the file to be boot from.
163 @retval EFI_SUCCESS The function completed successfull.
164 @retun Other value if the boot from the file fails.
169 IN BM_FILE_CONTEXT
*FileContext
175 BDS_COMMON_OPTION
*Option
;
177 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), (VOID
**) &Option
);
178 Option
->Description
= FileContext
->FileName
;
179 Option
->DevicePath
= FileContext
->DevicePath
;
180 Option
->LoadOptionsSize
= 0;
181 Option
->LoadOptions
= NULL
;
184 // Since current no boot from removable media directly is allowed */
186 gST
->ConOut
->ClearScreen (gST
->ConOut
);
188 gBS
->RaiseTPL (TPL_APPLICATION
);
192 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
194 gBS
->RestoreTPL (TPL_APPLICATION
);
201 Create a list of Goto Opcode for all terminal devices logged
202 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
204 @param CallbackData The BMM context data.
211 IN BMM_CALLBACK_DATA
*CallbackData
214 BM_MENU_ENTRY
*NewMenuEntry
;
217 CallbackData
->BmmAskSaveOrNot
= FALSE
;
219 UpdatePageStart (CallbackData
);
222 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
223 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
226 FORM_CON_COM_SETUP_ID
,
227 NewMenuEntry
->DisplayStringToken
,
228 STRING_TOKEN (STR_NULL_STRING
),
229 EFI_IFR_FLAG_CALLBACK
,
230 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
235 UpdatePageEnd (CallbackData
);
239 Create a lit of boot option from global BootOptionMenu. It
240 allow user to delete the boot option.
242 @param CallbackData The BMM context data.
249 IN BMM_CALLBACK_DATA
*CallbackData
252 BM_MENU_ENTRY
*NewMenuEntry
;
253 BM_LOAD_CONTEXT
*NewLoadContext
;
256 CallbackData
->BmmAskSaveOrNot
= TRUE
;
258 UpdatePageStart (CallbackData
);
259 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
261 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
262 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
263 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
264 if (NewLoadContext
->IsLegacy
) {
268 NewLoadContext
->Deleted
= FALSE
;
269 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = 0x00;
271 CreateCheckBoxOpCode (
272 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
273 VARSTORE_ID_BOOT_MAINT
,
274 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
275 NewMenuEntry
->DisplayStringToken
,
276 NewMenuEntry
->HelpStringToken
,
283 UpdatePageEnd (CallbackData
);
287 Create a lit of driver option from global DriverMenu.
289 @param CallbackData The BMM context data.
295 UpdateDrvAddHandlePage (
296 IN BMM_CALLBACK_DATA
*CallbackData
299 BM_MENU_ENTRY
*NewMenuEntry
;
302 CallbackData
->BmmAskSaveOrNot
= FALSE
;
304 UpdatePageStart (CallbackData
);
306 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
307 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
310 FORM_DRV_ADD_HANDLE_DESC_ID
,
311 NewMenuEntry
->DisplayStringToken
,
312 STRING_TOKEN (STR_NULL_STRING
),
313 EFI_IFR_FLAG_CALLBACK
,
314 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
319 UpdatePageEnd (CallbackData
);
323 Create a lit of driver option from global DriverOptionMenu. It
324 allow user to delete the driver option.
327 @param CallbackData The BMM context data.
334 IN BMM_CALLBACK_DATA
*CallbackData
337 BM_MENU_ENTRY
*NewMenuEntry
;
338 BM_LOAD_CONTEXT
*NewLoadContext
;
341 CallbackData
->BmmAskSaveOrNot
= TRUE
;
343 UpdatePageStart (CallbackData
);
345 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
347 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
348 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
350 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
351 NewLoadContext
->Deleted
= FALSE
;
352 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
354 CreateCheckBoxOpCode (
355 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
356 VARSTORE_ID_BOOT_MAINT
,
357 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
358 NewMenuEntry
->DisplayStringToken
,
359 NewMenuEntry
->HelpStringToken
,
366 UpdatePageEnd (CallbackData
);
370 Prepare the page to allow user to add description for
373 @param CallbackData The BMM context data.
379 UpdateDriverAddHandleDescPage (
380 IN BMM_CALLBACK_DATA
*CallbackData
383 BM_MENU_ENTRY
*NewMenuEntry
;
385 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
386 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
387 CallbackData
->BmmAskSaveOrNot
= TRUE
;
388 NewMenuEntry
= CallbackData
->MenuEntry
;
390 UpdatePageStart (CallbackData
);
392 CreateSubTitleOpCode (
393 NewMenuEntry
->DisplayStringToken
,
401 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
402 VARSTORE_ID_BOOT_MAINT
,
403 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
404 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
405 STRING_TOKEN (STR_NULL_STRING
),
413 CreateCheckBoxOpCode (
414 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
415 VARSTORE_ID_BOOT_MAINT
,
416 DRV_ADD_RECON_VAR_OFFSET
,
417 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
418 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
425 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
426 VARSTORE_ID_BOOT_MAINT
,
427 DRIVER_ADD_OPTION_VAR_OFFSET
,
428 STRING_TOKEN (STR_OPTIONAL_DATA
),
429 STRING_TOKEN (STR_NULL_STRING
),
437 UpdatePageEnd (CallbackData
);
441 EDES_TODO: Add function description.
443 @param UpdatePageId EDES_TODO: Add parameter description
444 @param ConsoleMenu EDES_TODO: Add parameter description
445 @param CallbackData The BMM context data.
452 IN UINT16 UpdatePageId
,
453 IN BM_MENU_OPTION
*ConsoleMenu
,
454 IN BMM_CALLBACK_DATA
*CallbackData
457 BM_MENU_ENTRY
*NewMenuEntry
;
458 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
459 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
464 CallbackData
->BmmAskSaveOrNot
= TRUE
;
466 UpdatePageStart (CallbackData
);
468 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
469 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
470 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
472 if (NewConsoleContext
->IsActive
) {
473 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
474 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
476 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
479 CreateCheckBoxOpCode (
480 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
481 VARSTORE_ID_BOOT_MAINT
,
482 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
483 NewMenuEntry
->DisplayStringToken
,
484 NewMenuEntry
->HelpStringToken
,
491 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
493 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
494 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
496 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
497 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
498 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
500 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
501 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
503 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
506 CreateCheckBoxOpCode (
507 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
508 VARSTORE_ID_BOOT_MAINT
,
509 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
510 NewMenuEntry
->DisplayStringToken
,
511 NewMenuEntry
->HelpStringToken
,
520 UpdatePageEnd (CallbackData
);
524 Update the page's NV Map if user has changed the order
525 a list. This list can be Boot Order or Driver Order.
527 @param UpdatePageId The form ID to be updated.
528 @param OptionMenu The new list.
529 @param CallbackData The BMM context data.
536 IN UINT16 UpdatePageId
,
537 IN BM_MENU_OPTION
*OptionMenu
,
538 IN BMM_CALLBACK_DATA
*CallbackData
541 BM_MENU_ENTRY
*NewMenuEntry
;
543 IFR_OPTION
*IfrOptionList
;
545 CallbackData
->BmmAskSaveOrNot
= TRUE
;
547 UpdatePageStart (CallbackData
);
549 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
551 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
553 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
554 if (NULL
== IfrOptionList
) {
558 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
559 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
560 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
561 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
562 IfrOptionList
[Index
].Flags
= 0;
563 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
566 if (OptionMenu
->MenuNumber
> 0) {
567 CreateOrderedListOpCode (
568 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
569 VARSTORE_ID_BOOT_MAINT
,
570 OPTION_ORDER_VAR_OFFSET
,
571 STRING_TOKEN (STR_CHANGE_ORDER
),
572 STRING_TOKEN (STR_CHANGE_ORDER
),
575 EFI_IFR_NUMERIC_SIZE_1
,
578 OptionMenu
->MenuNumber
,
583 SafeFreePool (IfrOptionList
);
585 UpdatePageEnd (CallbackData
);
588 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
589 CallbackData
->BmmFakeNvData
.OptionOrder
,
595 Create the dynamic page to allow user to set
596 the "BootNext" vaule.
598 @param CallbackData The BMM context data.
605 IN BMM_CALLBACK_DATA
*CallbackData
608 BM_MENU_ENTRY
*NewMenuEntry
;
609 BM_LOAD_CONTEXT
*NewLoadContext
;
610 IFR_OPTION
*IfrOptionList
;
611 UINTN NumberOfOptions
;
614 IfrOptionList
= NULL
;
615 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
616 CallbackData
->BmmAskSaveOrNot
= TRUE
;
618 UpdatePageStart (CallbackData
);
619 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
621 if (NumberOfOptions
> 0) {
622 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
624 ASSERT (IfrOptionList
);
626 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
628 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
629 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
630 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
631 if (NewLoadContext
->IsBootNext
) {
632 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
633 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
635 IfrOptionList
[Index
].Flags
= 0;
638 IfrOptionList
[Index
].Value
.u16
= Index
;
639 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
642 IfrOptionList
[Index
].Value
.u16
= Index
;
643 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
644 IfrOptionList
[Index
].Flags
= 0;
645 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
646 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
650 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
651 VARSTORE_ID_BOOT_MAINT
,
652 BOOT_NEXT_VAR_OFFSET
,
653 STRING_TOKEN (STR_BOOT_NEXT
),
654 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
656 EFI_IFR_NUMERIC_SIZE_2
,
658 (UINTN
) (NumberOfOptions
+ 1),
662 SafeFreePool (IfrOptionList
);
665 UpdatePageEnd (CallbackData
);
669 Create the dynamic page to allow user to set
672 @param CallbackData The BMM context data.
679 IN BMM_CALLBACK_DATA
*CallbackData
684 CallbackData
->BmmAskSaveOrNot
= TRUE
;
686 UpdatePageStart (CallbackData
);
688 BootTimeOut
= BdsLibGetTimeout ();
690 CreateNumericOpCode (
691 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
692 VARSTORE_ID_BOOT_MAINT
,
693 BOOT_TIME_OUT_VAR_OFFSET
,
694 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
695 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
697 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
705 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
707 UpdatePageEnd (CallbackData
);
711 Refresh the text mode page
714 @param CallbackData The BMM context data.
721 IN BMM_CALLBACK_DATA
*CallbackData
728 CHAR16 RowString
[50];
729 CHAR16 ModeString
[50];
732 EFI_STRING_ID
*ModeToken
;
733 IFR_OPTION
*IfrOptionList
;
735 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
737 ConOut
= gST
->ConOut
;
740 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
742 CallbackData
->BmmAskSaveOrNot
= TRUE
;
744 UpdatePageStart (CallbackData
);
749 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
750 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
751 if (EFI_ERROR (Status
)) {
757 if (ValidMode
== 0) {
761 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
762 ASSERT(IfrOptionList
!= NULL
);
764 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
765 ASSERT(ModeToken
!= NULL
);
768 // Determin which mode should be the first entry in menu
770 GetConsoleOutMode (CallbackData
);
773 // Build text mode options
775 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
776 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
777 if (EFI_ERROR (Status
)) {
781 // Build mode string Column x Row
783 UnicodeValueToString (ModeString
, 0, Col
, 0);
784 StrCat (ModeString
, L
" x ");
785 UnicodeValueToString (RowString
, 0, Row
, 0);
786 StrCat (ModeString
, RowString
);
788 HiiLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
790 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
791 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
792 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
793 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
795 IfrOptionList
[Index
].Flags
= 0;
801 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
802 VARSTORE_ID_BOOT_MAINT
,
804 STRING_TOKEN (STR_CON_MODE_SETUP
),
805 STRING_TOKEN (STR_CON_MODE_SETUP
),
806 EFI_IFR_FLAG_RESET_REQUIRED
,
807 EFI_IFR_NUMERIC_SIZE_2
,
812 SafeFreePool (IfrOptionList
);
813 SafeFreePool (ModeToken
);
815 UpdatePageEnd (CallbackData
);
819 Create the dynamic page which allows user to
820 set the property such as Baud Rate, Data Bits,
821 Parity, Stop Bits, Terminal Type.
823 @param CallbackData The BMM context data.
830 IN BMM_CALLBACK_DATA
*CallbackData
835 IFR_OPTION
*IfrOptionList
;
836 BM_MENU_ENTRY
*NewMenuEntry
;
837 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
839 CallbackData
->BmmAskSaveOrNot
= TRUE
;
841 UpdatePageStart (CallbackData
);
843 NewMenuEntry
= BOpt_GetMenuEntry (
845 CallbackData
->CurrentTerminal
848 if (NewMenuEntry
== NULL
) {
852 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
854 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
855 if (IfrOptionList
== NULL
) {
859 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
861 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
862 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
863 NewTerminalContext
->BaudRateIndex
= Index
;
864 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
867 IfrOptionList
[Index
].Flags
= CheckFlags
;
868 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
869 IfrOptionList
[Index
].Value
.u8
= Index
;
873 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
874 VARSTORE_ID_BOOT_MAINT
,
875 COM_BAUD_RATE_VAR_OFFSET
,
876 STRING_TOKEN (STR_COM_BAUD_RATE
),
877 STRING_TOKEN (STR_COM_BAUD_RATE
),
879 EFI_IFR_NUMERIC_SIZE_1
,
885 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
888 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
889 NewTerminalContext
->DataBitsIndex
= Index
;
890 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
891 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
894 IfrOptionList
[Index
].Flags
= CheckFlags
;
895 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
896 IfrOptionList
[Index
].Value
.u8
= Index
;
900 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
901 VARSTORE_ID_BOOT_MAINT
,
902 COM_DATA_RATE_VAR_OFFSET
,
903 STRING_TOKEN (STR_COM_DATA_BITS
),
904 STRING_TOKEN (STR_COM_DATA_BITS
),
906 EFI_IFR_NUMERIC_SIZE_1
,
912 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
914 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
915 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
916 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
917 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
920 IfrOptionList
[Index
].Flags
= CheckFlags
;
921 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
922 IfrOptionList
[Index
].Value
.u8
= Index
;
926 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
927 VARSTORE_ID_BOOT_MAINT
,
928 COM_PARITY_VAR_OFFSET
,
929 STRING_TOKEN (STR_COM_PARITY
),
930 STRING_TOKEN (STR_COM_PARITY
),
932 EFI_IFR_NUMERIC_SIZE_1
,
938 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
940 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
941 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
942 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
943 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
946 IfrOptionList
[Index
].Flags
= CheckFlags
;
947 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
948 IfrOptionList
[Index
].Value
.u8
= Index
;
952 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
953 VARSTORE_ID_BOOT_MAINT
,
954 COM_STOP_BITS_VAR_OFFSET
,
955 STRING_TOKEN (STR_COM_STOP_BITS
),
956 STRING_TOKEN (STR_COM_STOP_BITS
),
958 EFI_IFR_NUMERIC_SIZE_1
,
964 for (Index
= 0; Index
< 4; Index
++) {
966 if (NewTerminalContext
->TerminalType
== Index
) {
967 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
968 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
971 IfrOptionList
[Index
].Flags
= CheckFlags
;
972 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
973 IfrOptionList
[Index
].Value
.u8
= Index
;
977 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
978 VARSTORE_ID_BOOT_MAINT
,
979 COM_TERMINAL_VAR_OFFSET
,
980 STRING_TOKEN (STR_COM_TERMI_TYPE
),
981 STRING_TOKEN (STR_COM_TERMI_TYPE
),
983 EFI_IFR_NUMERIC_SIZE_1
,
989 SafeFreePool (IfrOptionList
);
991 UpdatePageEnd (CallbackData
);
995 Dispatch the correct update page function to call based on
998 @param UpdatePageId The form ID.
999 @param CallbackData The BMM context data.
1006 IN UINT16 UpdatePageId
,
1007 IN BMM_CALLBACK_DATA
*CallbackData
1010 CleanUpPage (UpdatePageId
, CallbackData
);
1011 switch (UpdatePageId
) {
1012 case FORM_CON_IN_ID
:
1013 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1016 case FORM_CON_OUT_ID
:
1017 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1020 case FORM_CON_ERR_ID
:
1021 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1024 case FORM_BOOT_CHG_ID
:
1025 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1028 case FORM_DRV_CHG_ID
:
1029 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1038 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
1039 specified by DeviceType.
1041 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1043 @param OptionIndex Returns the index number (#### in Boot####).
1044 @param OptionSize Return the size of the Boot### variable.
1050 GetLegacyBootOptionVar (
1051 IN UINTN DeviceType
,
1052 OUT UINTN
*OptionIndex
,
1053 OUT UINTN
*OptionSize
1056 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
1060 UINT16
*OrderBuffer
;
1061 CHAR16 StrTemp
[100];
1062 UINT16 FilePathSize
;
1064 UINT8
*OptionalData
;
1067 // Get Boot Option number from the size of BootOrder
1069 OrderBuffer
= BdsLibGetVariableAndSize (
1071 &gEfiGlobalVariableGuid
,
1075 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
1076 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
1077 OptionBuffer
= BdsLibGetVariableAndSize (
1079 &gEfiGlobalVariableGuid
,
1082 if (NULL
== OptionBuffer
) {
1086 Ptr
= (UINT8
*) OptionBuffer
;
1087 Ptr
+= sizeof (UINT32
);
1089 FilePathSize
= *(UINT16
*) Ptr
;
1090 Ptr
+= sizeof (UINT16
);
1092 Ptr
+= StrSize ((CHAR16
*) Ptr
);
1095 // Now Ptr point to Device Path
1097 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1098 Ptr
+= FilePathSize
;
1101 // Now Ptr point to Optional Data
1105 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1106 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1107 (BBS_BBS_DP
== DevicePath
->SubType
)
1109 *OptionIndex
= OrderBuffer
[Index
];
1110 SafeFreePool (OrderBuffer
);
1111 return OptionBuffer
;
1113 SafeFreePool (OptionBuffer
);
1117 SafeFreePool (OrderBuffer
);
1122 Create a dynamic page so that Legacy Device boot order
1123 can be set for specified device type.
1125 @param UpdatePageId The form ID. It also spefies the legacy device type.
1126 @param CallbackData The BMM context data.
1132 UpdateSetLegacyDeviceOrderPage (
1133 IN UINT16 UpdatePageId
,
1134 IN BMM_CALLBACK_DATA
*CallbackData
1137 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1138 BM_MENU_OPTION
*OptionMenu
;
1139 BM_MENU_ENTRY
*NewMenuEntry
;
1140 IFR_OPTION
*IfrOptionList
;
1141 EFI_STRING_ID StrRef
;
1142 EFI_STRING_ID StrRefHelp
;
1151 CHAR16
*TypeStrHelp
;
1164 BbsType
= BBS_FLOPPY
;
1169 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1170 UpdatePageStart (CallbackData
);
1172 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1174 SetMem (DisMap
, 32, 0);
1176 // Create oneof option list
1178 switch (UpdatePageId
) {
1179 case FORM_SET_FD_ORDER_ID
:
1180 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1181 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1182 TypeStr
= StrFloppy
;
1183 TypeStrHelp
= StrFloppyHelp
;
1184 BbsType
= BBS_FLOPPY
;
1185 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1186 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1189 case FORM_SET_HD_ORDER_ID
:
1190 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1191 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1192 TypeStr
= StrHardDisk
;
1193 TypeStrHelp
= StrHardDiskHelp
;
1194 BbsType
= BBS_HARDDISK
;
1195 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1196 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1199 case FORM_SET_CD_ORDER_ID
:
1200 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1201 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1203 TypeStrHelp
= StrCDROMHelp
;
1204 BbsType
= BBS_CDROM
;
1205 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1206 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1209 case FORM_SET_NET_ORDER_ID
:
1210 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1211 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1213 TypeStrHelp
= StrNETHelp
;
1214 BbsType
= BBS_EMBED_NETWORK
;
1215 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1216 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1219 case FORM_SET_BEV_ORDER_ID
:
1220 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1221 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1223 TypeStrHelp
= StrBEVHelp
;
1224 BbsType
= BBS_BEV_DEVICE
;
1225 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1226 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1231 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1233 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1234 if (NULL
== IfrOptionList
) {
1238 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1239 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1240 IfrOptionList
[Index
].Flags
= 0;
1242 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1245 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1246 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1249 // for item "Disabled"
1251 IfrOptionList
[Index
].Flags
= 0;
1252 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1253 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1256 // Get Device Order from variable
1258 VarData
= BdsLibGetVariableAndSize (
1259 VAR_LEGACY_DEV_ORDER
,
1260 &EfiLegacyDevOrderGuid
,
1264 if (NULL
!= VarData
) {
1265 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1266 while (VarData
< VarData
+ VarSize
) {
1267 if (DevOrder
->BbsType
== BbsType
) {
1271 VarData
+= sizeof (BBS_TYPE
);
1272 VarData
+= *(UINT16
*) VarData
;
1273 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1276 // Create oneof tag here for FD/HD/CD #1 #2
1278 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1280 // Create the string for oneof tag
1282 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1284 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1286 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1288 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1291 (EFI_QUESTION_ID
) (Key
+ Index
),
1292 VARSTORE_ID_BOOT_MAINT
,
1293 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1296 EFI_IFR_FLAG_CALLBACK
,
1297 EFI_IFR_NUMERIC_SIZE_1
,
1299 OptionMenu
->MenuNumber
+ 1,
1303 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1305 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1306 LegacyOrder
[Index
] = 0xFF;
1307 Pos
= (VarDevOrder
& 0xFF) / 8;
1308 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1309 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1311 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1316 CopyMem (OldData
, LegacyOrder
, 100);
1318 if (IfrOptionList
!= NULL
) {
1319 SafeFreePool (IfrOptionList
);
1320 IfrOptionList
= NULL
;
1323 UpdatePageEnd (CallbackData
);
1327 Dispatch the display to the next page based on NewPageId.
1329 @param Private The BMM context data.
1330 @param NewPageId The original page ID.
1337 BMM_CALLBACK_DATA
*Private
,
1341 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1343 // If we select a handle to add driver option, advance to the add handle description page.
1345 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1346 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1348 // Return to main page after "Save Changes" or "Discard Changes".
1350 NewPageId
= FORM_MAIN_ID
;
1351 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1352 NewPageId
= FORM_CON_COM_SETUP_ID
;
1355 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1356 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1357 Private
->BmmCurrentPageId
= NewPageId
;