2 Dynamically update the pages.
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "BootMaint.h"
18 Refresh the global UpdateData structure.
26 gUpdateData
.Offset
= 0;
30 Add a "Go back to main page" tag in front of the form when there are no
31 "Apply changes" and "Discard changes" tags in the end of the form.
33 @param CallbackData The BMM context data.
38 IN BMM_CALLBACK_DATA
*CallbackData
43 if (!(CallbackData
->BmmAskSaveOrNot
)) {
45 // Add a "Go back to main page" tag in front of the form when there are no
46 // "Apply changes" and "Discard changes" tags in the end of the form.
50 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
51 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
61 Create the "Apply changes" and "Discard changes" tags. And
62 ensure user can return to the main page.
64 @param CallbackData The BMM context data.
69 IN BMM_CALLBACK_DATA
*CallbackData
73 // Create the "Apply changes" and "Discard changes" tags.
75 if (CallbackData
->BmmAskSaveOrNot
) {
76 CreateSubTitleOpCode (
77 STRING_TOKEN (STR_NULL_STRING
),
86 STRING_TOKEN (STR_SAVE_AND_EXIT
),
87 STRING_TOKEN (STR_NULL_STRING
),
88 EFI_IFR_FLAG_CALLBACK
,
89 KEY_VALUE_SAVE_AND_EXIT
,
95 // Ensure user can return to the main page.
99 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
100 STRING_TOKEN (STR_NULL_STRING
),
101 EFI_IFR_FLAG_CALLBACK
,
102 KEY_VALUE_NO_SAVE_AND_EXIT
,
107 CallbackData
->BmmHiiHandle
,
109 CallbackData
->BmmCurrentPageId
,
110 CallbackData
->BmmCurrentPageId
,
117 Clean up the dynamic opcode at label and form specified by both LabelId.
119 @param LabelId It is both the Form ID and Label ID for opcode deletion.
120 @param CallbackData The BMM context data.
126 IN BMM_CALLBACK_DATA
*CallbackData
129 RefreshUpdateData ();
132 // Remove all op-codes from dynamic page
135 CallbackData
->BmmHiiHandle
,
145 Boot a file selected by user at File Expoloer of BMM.
147 @param FileContext The file context data, which contains the device path
148 of the file to be boot from.
150 @retval EFI_SUCCESS The function completed successfull.
151 @return Other value if the boot from the file fails.
156 IN BM_FILE_CONTEXT
*FileContext
162 BDS_COMMON_OPTION
*Option
;
164 Option
= (BDS_COMMON_OPTION
*) AllocatePool (sizeof (BDS_COMMON_OPTION
));
165 Option
->Description
= FileContext
->FileName
;
166 Option
->DevicePath
= FileContext
->DevicePath
;
167 Option
->LoadOptionsSize
= 0;
168 Option
->LoadOptions
= NULL
;
171 // Since current no boot from removable media directly is allowed */
173 gST
->ConOut
->ClearScreen (gST
->ConOut
);
177 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
184 Create a list of Goto Opcode for all terminal devices logged
185 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
187 @param CallbackData The BMM context data.
191 IN BMM_CALLBACK_DATA
*CallbackData
194 BM_MENU_ENTRY
*NewMenuEntry
;
197 CallbackData
->BmmAskSaveOrNot
= FALSE
;
199 UpdatePageStart (CallbackData
);
202 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
203 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
206 FORM_CON_COM_SETUP_ID
,
207 NewMenuEntry
->DisplayStringToken
,
208 STRING_TOKEN (STR_NULL_STRING
),
209 EFI_IFR_FLAG_CALLBACK
,
210 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
215 UpdatePageEnd (CallbackData
);
219 Create a lit of boot option from global BootOptionMenu. It
220 allow user to delete the boot option.
222 @param CallbackData The BMM context data.
227 IN BMM_CALLBACK_DATA
*CallbackData
230 BM_MENU_ENTRY
*NewMenuEntry
;
231 BM_LOAD_CONTEXT
*NewLoadContext
;
234 CallbackData
->BmmAskSaveOrNot
= TRUE
;
236 UpdatePageStart (CallbackData
);
237 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
239 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
240 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
241 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
242 if (NewLoadContext
->IsLegacy
) {
246 NewLoadContext
->Deleted
= FALSE
;
247 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = 0x00;
249 CreateCheckBoxOpCode (
250 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
251 VARSTORE_ID_BOOT_MAINT
,
252 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
253 NewMenuEntry
->DisplayStringToken
,
254 NewMenuEntry
->HelpStringToken
,
261 UpdatePageEnd (CallbackData
);
265 Create a lit of driver option from global DriverMenu.
267 @param CallbackData The BMM context data.
271 UpdateDrvAddHandlePage (
272 IN BMM_CALLBACK_DATA
*CallbackData
275 BM_MENU_ENTRY
*NewMenuEntry
;
278 CallbackData
->BmmAskSaveOrNot
= FALSE
;
280 UpdatePageStart (CallbackData
);
282 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
283 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
286 FORM_DRV_ADD_HANDLE_DESC_ID
,
287 NewMenuEntry
->DisplayStringToken
,
288 STRING_TOKEN (STR_NULL_STRING
),
289 EFI_IFR_FLAG_CALLBACK
,
290 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
295 UpdatePageEnd (CallbackData
);
299 Create a lit of driver option from global DriverOptionMenu. It
300 allow user to delete the driver option.
302 @param CallbackData The BMM context data.
307 IN BMM_CALLBACK_DATA
*CallbackData
310 BM_MENU_ENTRY
*NewMenuEntry
;
311 BM_LOAD_CONTEXT
*NewLoadContext
;
314 CallbackData
->BmmAskSaveOrNot
= TRUE
;
316 UpdatePageStart (CallbackData
);
318 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
320 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
321 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
323 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
324 NewLoadContext
->Deleted
= FALSE
;
325 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = 0x00;
327 CreateCheckBoxOpCode (
328 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
329 VARSTORE_ID_BOOT_MAINT
,
330 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
331 NewMenuEntry
->DisplayStringToken
,
332 NewMenuEntry
->HelpStringToken
,
339 UpdatePageEnd (CallbackData
);
343 Prepare the page to allow user to add description for
346 @param CallbackData The BMM context data.
350 UpdateDriverAddHandleDescPage (
351 IN BMM_CALLBACK_DATA
*CallbackData
354 BM_MENU_ENTRY
*NewMenuEntry
;
356 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
357 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
358 CallbackData
->BmmAskSaveOrNot
= TRUE
;
359 NewMenuEntry
= CallbackData
->MenuEntry
;
361 UpdatePageStart (CallbackData
);
363 CreateSubTitleOpCode (
364 NewMenuEntry
->DisplayStringToken
,
372 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
373 VARSTORE_ID_BOOT_MAINT
,
374 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
375 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
376 STRING_TOKEN (STR_NULL_STRING
),
384 CreateCheckBoxOpCode (
385 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
386 VARSTORE_ID_BOOT_MAINT
,
387 DRV_ADD_RECON_VAR_OFFSET
,
388 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
389 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
396 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
397 VARSTORE_ID_BOOT_MAINT
,
398 DRIVER_ADD_OPTION_VAR_OFFSET
,
399 STRING_TOKEN (STR_OPTIONAL_DATA
),
400 STRING_TOKEN (STR_NULL_STRING
),
408 UpdatePageEnd (CallbackData
);
414 @param UpdatePageId The form ID to be updated.
415 @param ConsoleMenu The console menu list.
416 @param CallbackData The BMM context data.
421 IN UINT16 UpdatePageId
,
422 IN BM_MENU_OPTION
*ConsoleMenu
,
423 IN BMM_CALLBACK_DATA
*CallbackData
426 BM_MENU_ENTRY
*NewMenuEntry
;
427 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
428 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
433 CallbackData
->BmmAskSaveOrNot
= TRUE
;
435 UpdatePageStart (CallbackData
);
437 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
438 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
439 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
441 if (NewConsoleContext
->IsActive
) {
442 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
443 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
445 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
448 CreateCheckBoxOpCode (
449 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
450 VARSTORE_ID_BOOT_MAINT
,
451 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
452 NewMenuEntry
->DisplayStringToken
,
453 NewMenuEntry
->HelpStringToken
,
460 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
462 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
463 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
465 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
466 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
467 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
469 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
470 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
472 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
475 CreateCheckBoxOpCode (
476 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
477 VARSTORE_ID_BOOT_MAINT
,
478 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
479 NewMenuEntry
->DisplayStringToken
,
480 NewMenuEntry
->HelpStringToken
,
489 UpdatePageEnd (CallbackData
);
493 Update the page's NV Map if user has changed the order
494 a list. This list can be Boot Order or Driver Order.
496 @param UpdatePageId The form ID to be updated.
497 @param OptionMenu The new list.
498 @param CallbackData The BMM context data.
503 IN UINT16 UpdatePageId
,
504 IN BM_MENU_OPTION
*OptionMenu
,
505 IN BMM_CALLBACK_DATA
*CallbackData
508 BM_MENU_ENTRY
*NewMenuEntry
;
510 IFR_OPTION
*IfrOptionList
;
512 CallbackData
->BmmAskSaveOrNot
= TRUE
;
514 UpdatePageStart (CallbackData
);
516 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
518 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, 100);
520 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
521 if (NULL
== IfrOptionList
) {
525 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
526 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
527 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
528 IfrOptionList
[Index
].Value
.u8
= (UINT8
) (NewMenuEntry
->OptionNumber
+ 1);
529 IfrOptionList
[Index
].Flags
= 0;
530 CallbackData
->BmmFakeNvData
.OptionOrder
[Index
] = IfrOptionList
[Index
].Value
.u8
;
533 if (OptionMenu
->MenuNumber
> 0) {
534 CreateOrderedListOpCode (
535 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
,
536 VARSTORE_ID_BOOT_MAINT
,
537 OPTION_ORDER_VAR_OFFSET
,
538 STRING_TOKEN (STR_CHANGE_ORDER
),
539 STRING_TOKEN (STR_CHANGE_ORDER
),
542 EFI_IFR_NUMERIC_SIZE_1
,
545 OptionMenu
->MenuNumber
,
550 FreePool (IfrOptionList
);
552 UpdatePageEnd (CallbackData
);
555 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
556 CallbackData
->BmmFakeNvData
.OptionOrder
,
562 Create the dynamic page to allow user to set
563 the "BootNext" value.
565 @param CallbackData The BMM context data.
570 IN BMM_CALLBACK_DATA
*CallbackData
573 BM_MENU_ENTRY
*NewMenuEntry
;
574 BM_LOAD_CONTEXT
*NewLoadContext
;
575 IFR_OPTION
*IfrOptionList
;
576 UINTN NumberOfOptions
;
579 IfrOptionList
= NULL
;
580 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
581 CallbackData
->BmmAskSaveOrNot
= TRUE
;
583 UpdatePageStart (CallbackData
);
584 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
586 if (NumberOfOptions
> 0) {
587 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
589 ASSERT (IfrOptionList
);
591 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
593 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
594 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
595 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
596 if (NewLoadContext
->IsBootNext
) {
597 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
598 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
600 IfrOptionList
[Index
].Flags
= 0;
603 IfrOptionList
[Index
].Value
.u16
= Index
;
604 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
607 IfrOptionList
[Index
].Value
.u16
= Index
;
608 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
609 IfrOptionList
[Index
].Flags
= 0;
610 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
611 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
615 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
616 VARSTORE_ID_BOOT_MAINT
,
617 BOOT_NEXT_VAR_OFFSET
,
618 STRING_TOKEN (STR_BOOT_NEXT
),
619 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
621 EFI_IFR_NUMERIC_SIZE_2
,
623 (UINTN
) (NumberOfOptions
+ 1),
627 FreePool (IfrOptionList
);
630 UpdatePageEnd (CallbackData
);
634 Create the dynamic page to allow user to set the "TimeOut" value.
636 @param CallbackData The BMM context data.
641 IN BMM_CALLBACK_DATA
*CallbackData
646 CallbackData
->BmmAskSaveOrNot
= TRUE
;
648 UpdatePageStart (CallbackData
);
650 BootTimeOut
= BdsLibGetTimeout ();
652 CreateNumericOpCode (
653 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
654 VARSTORE_ID_BOOT_MAINT
,
655 BOOT_TIME_OUT_VAR_OFFSET
,
656 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
657 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
659 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
667 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
669 UpdatePageEnd (CallbackData
);
673 Refresh the text mode page.
675 @param CallbackData The BMM context data.
680 IN BMM_CALLBACK_DATA
*CallbackData
687 CHAR16 RowString
[50];
688 CHAR16 ModeString
[50];
691 EFI_STRING_ID
*ModeToken
;
692 IFR_OPTION
*IfrOptionList
;
694 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
696 ConOut
= gST
->ConOut
;
699 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
701 CallbackData
->BmmAskSaveOrNot
= TRUE
;
703 UpdatePageStart (CallbackData
);
708 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
709 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
710 if (EFI_ERROR (Status
)) {
716 if (ValidMode
== 0) {
720 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * ValidMode
);
721 ASSERT(IfrOptionList
!= NULL
);
723 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
724 ASSERT(ModeToken
!= NULL
);
727 // Determin which mode should be the first entry in menu
729 GetConsoleOutMode (CallbackData
);
732 // Build text mode options
734 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
735 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
736 if (EFI_ERROR (Status
)) {
740 // Build mode string Column x Row
742 UnicodeValueToString (ModeString
, 0, Col
, 0);
743 StrCat (ModeString
, L
" x ");
744 UnicodeValueToString (RowString
, 0, Row
, 0);
745 StrCat (ModeString
, RowString
);
747 HiiLibNewString (CallbackData
->BmmHiiHandle
, &ModeToken
[Index
], ModeString
);
749 IfrOptionList
[Index
].StringToken
= ModeToken
[Index
];
750 IfrOptionList
[Index
].Value
.u16
= (UINT16
) Mode
;
751 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
752 IfrOptionList
[Index
].Flags
= EFI_IFR_OPTION_DEFAULT
;
754 IfrOptionList
[Index
].Flags
= 0;
760 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
761 VARSTORE_ID_BOOT_MAINT
,
763 STRING_TOKEN (STR_CON_MODE_SETUP
),
764 STRING_TOKEN (STR_CON_MODE_SETUP
),
765 EFI_IFR_FLAG_RESET_REQUIRED
,
766 EFI_IFR_NUMERIC_SIZE_2
,
771 FreePool (IfrOptionList
);
772 FreePool (ModeToken
);
774 UpdatePageEnd (CallbackData
);
778 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
779 Parity, Stop Bits, Terminal Type.
781 @param CallbackData The BMM context data.
786 IN BMM_CALLBACK_DATA
*CallbackData
791 IFR_OPTION
*IfrOptionList
;
792 BM_MENU_ENTRY
*NewMenuEntry
;
793 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
795 CallbackData
->BmmAskSaveOrNot
= TRUE
;
797 UpdatePageStart (CallbackData
);
799 NewMenuEntry
= BOpt_GetMenuEntry (
801 CallbackData
->CurrentTerminal
804 if (NewMenuEntry
== NULL
) {
808 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
810 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
811 if (IfrOptionList
== NULL
) {
815 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
817 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
818 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
819 NewTerminalContext
->BaudRateIndex
= Index
;
820 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
823 IfrOptionList
[Index
].Flags
= CheckFlags
;
824 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
825 IfrOptionList
[Index
].Value
.u8
= Index
;
829 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
830 VARSTORE_ID_BOOT_MAINT
,
831 COM_BAUD_RATE_VAR_OFFSET
,
832 STRING_TOKEN (STR_COM_BAUD_RATE
),
833 STRING_TOKEN (STR_COM_BAUD_RATE
),
835 EFI_IFR_NUMERIC_SIZE_1
,
841 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
844 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
845 NewTerminalContext
->DataBitsIndex
= Index
;
846 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
847 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
850 IfrOptionList
[Index
].Flags
= CheckFlags
;
851 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
852 IfrOptionList
[Index
].Value
.u8
= Index
;
856 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
857 VARSTORE_ID_BOOT_MAINT
,
858 COM_DATA_RATE_VAR_OFFSET
,
859 STRING_TOKEN (STR_COM_DATA_BITS
),
860 STRING_TOKEN (STR_COM_DATA_BITS
),
862 EFI_IFR_NUMERIC_SIZE_1
,
868 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
870 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
871 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
872 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
873 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
876 IfrOptionList
[Index
].Flags
= CheckFlags
;
877 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
878 IfrOptionList
[Index
].Value
.u8
= Index
;
882 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
883 VARSTORE_ID_BOOT_MAINT
,
884 COM_PARITY_VAR_OFFSET
,
885 STRING_TOKEN (STR_COM_PARITY
),
886 STRING_TOKEN (STR_COM_PARITY
),
888 EFI_IFR_NUMERIC_SIZE_1
,
894 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
896 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
897 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
898 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
899 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
902 IfrOptionList
[Index
].Flags
= CheckFlags
;
903 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
904 IfrOptionList
[Index
].Value
.u8
= Index
;
908 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
909 VARSTORE_ID_BOOT_MAINT
,
910 COM_STOP_BITS_VAR_OFFSET
,
911 STRING_TOKEN (STR_COM_STOP_BITS
),
912 STRING_TOKEN (STR_COM_STOP_BITS
),
914 EFI_IFR_NUMERIC_SIZE_1
,
920 for (Index
= 0; Index
< 4; Index
++) {
922 if (NewTerminalContext
->TerminalType
== Index
) {
923 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
924 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
927 IfrOptionList
[Index
].Flags
= CheckFlags
;
928 IfrOptionList
[Index
].StringToken
= (EFI_STRING_ID
) TerminalType
[Index
];
929 IfrOptionList
[Index
].Value
.u8
= Index
;
933 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
934 VARSTORE_ID_BOOT_MAINT
,
935 COM_TERMINAL_VAR_OFFSET
,
936 STRING_TOKEN (STR_COM_TERMI_TYPE
),
937 STRING_TOKEN (STR_COM_TERMI_TYPE
),
939 EFI_IFR_NUMERIC_SIZE_1
,
945 FreePool (IfrOptionList
);
947 UpdatePageEnd (CallbackData
);
951 Dispatch the correct update page function to call based on
954 @param UpdatePageId The form ID.
955 @param CallbackData The BMM context data.
960 IN UINT16 UpdatePageId
,
961 IN BMM_CALLBACK_DATA
*CallbackData
964 CleanUpPage (UpdatePageId
, CallbackData
);
965 switch (UpdatePageId
) {
967 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
970 case FORM_CON_OUT_ID
:
971 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
974 case FORM_CON_ERR_ID
:
975 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
978 case FORM_BOOT_CHG_ID
:
979 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
982 case FORM_DRV_CHG_ID
:
983 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
992 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
993 specified by DeviceType.
995 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
997 @param OptionIndex Returns the index number (#### in Boot####).
998 @param OptionSize Return the size of the Boot### variable.
1002 GetLegacyBootOptionVar (
1003 IN UINTN DeviceType
,
1004 OUT UINTN
*OptionIndex
,
1005 OUT UINTN
*OptionSize
1008 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
1012 UINT16
*OrderBuffer
;
1013 CHAR16 StrTemp
[100];
1014 UINT16 FilePathSize
;
1016 UINT8
*OptionalData
;
1019 // Get Boot Option number from the size of BootOrder
1021 OrderBuffer
= BdsLibGetVariableAndSize (
1023 &gEfiGlobalVariableGuid
,
1027 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
1028 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
1029 OptionBuffer
= BdsLibGetVariableAndSize (
1031 &gEfiGlobalVariableGuid
,
1034 if (NULL
== OptionBuffer
) {
1038 Ptr
= (UINT8
*) OptionBuffer
;
1039 Ptr
+= sizeof (UINT32
);
1041 FilePathSize
= *(UINT16
*) Ptr
;
1042 Ptr
+= sizeof (UINT16
);
1044 Ptr
+= StrSize ((CHAR16
*) Ptr
);
1047 // Now Ptr point to Device Path
1049 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1050 Ptr
+= FilePathSize
;
1053 // Now Ptr point to Optional Data
1057 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1058 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1059 (BBS_BBS_DP
== DevicePath
->SubType
)
1061 *OptionIndex
= OrderBuffer
[Index
];
1062 FreePool (OrderBuffer
);
1063 return OptionBuffer
;
1065 FreePool (OptionBuffer
);
1069 FreePool (OrderBuffer
);
1074 Create a dynamic page so that Legacy Device boot order
1075 can be set for specified device type.
1077 @param UpdatePageId The form ID. It also spefies the legacy device type.
1078 @param CallbackData The BMM context data.
1083 UpdateSetLegacyDeviceOrderPage (
1084 IN UINT16 UpdatePageId
,
1085 IN BMM_CALLBACK_DATA
*CallbackData
1088 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1089 BM_MENU_OPTION
*OptionMenu
;
1090 BM_MENU_ENTRY
*NewMenuEntry
;
1091 IFR_OPTION
*IfrOptionList
;
1092 EFI_STRING_ID StrRef
;
1093 EFI_STRING_ID StrRefHelp
;
1102 CHAR16
*TypeStrHelp
;
1115 BbsType
= BBS_FLOPPY
;
1120 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1121 UpdatePageStart (CallbackData
);
1123 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1125 SetMem (DisMap
, 32, 0);
1127 // Create oneof option list
1129 switch (UpdatePageId
) {
1130 case FORM_SET_FD_ORDER_ID
:
1131 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1132 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1133 TypeStr
= STR_FLOPPY
;
1134 TypeStrHelp
= STR_FLOPPY_HELP
;
1135 BbsType
= BBS_FLOPPY
;
1136 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1137 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1140 case FORM_SET_HD_ORDER_ID
:
1141 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1142 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1143 TypeStr
= STR_HARDDISK
;
1144 TypeStrHelp
= STR_HARDDISK_HELP
;
1145 BbsType
= BBS_HARDDISK
;
1146 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1147 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1150 case FORM_SET_CD_ORDER_ID
:
1151 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1152 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1153 TypeStr
= STR_CDROM
;
1154 TypeStrHelp
= STR_CDROM_HELP
;
1155 BbsType
= BBS_CDROM
;
1156 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1157 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1160 case FORM_SET_NET_ORDER_ID
:
1161 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1162 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1164 TypeStrHelp
= STR_NET_HELP
;
1165 BbsType
= BBS_EMBED_NETWORK
;
1166 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1167 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1170 case FORM_SET_BEV_ORDER_ID
:
1171 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1172 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1174 TypeStrHelp
= STR_BEV_HELP
;
1175 BbsType
= BBS_BEV_DEVICE
;
1176 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1177 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1182 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1184 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1185 if (NULL
== IfrOptionList
) {
1189 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1190 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1191 IfrOptionList
[Index
].Flags
= 0;
1193 IfrOptionList
[Index
].Flags
|= EFI_IFR_OPTION_DEFAULT
;
1196 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1197 IfrOptionList
[Index
].Value
.u8
= (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1200 // for item "Disabled"
1202 IfrOptionList
[Index
].Flags
= 0;
1203 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1204 IfrOptionList
[Index
].Value
.u8
= 0xFF;
1207 // Get Device Order from variable
1209 VarData
= BdsLibGetVariableAndSize (
1210 VAR_LEGACY_DEV_ORDER
,
1211 &EfiLegacyDevOrderGuid
,
1215 if (NULL
!= VarData
) {
1216 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1217 while (VarData
< VarData
+ VarSize
) {
1218 if (DevOrder
->BbsType
== BbsType
) {
1222 VarData
+= sizeof (BBS_TYPE
);
1223 VarData
+= *(UINT16
*) VarData
;
1224 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1227 // Create oneof tag here for FD/HD/CD #1 #2
1229 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1231 // Create the string for oneof tag
1233 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1235 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRef
, String
);
1237 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1239 HiiLibNewString (CallbackData
->BmmHiiHandle
, &StrRefHelp
, String
);
1242 (EFI_QUESTION_ID
) (Key
+ Index
),
1243 VARSTORE_ID_BOOT_MAINT
,
1244 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1247 EFI_IFR_FLAG_CALLBACK
,
1248 EFI_IFR_NUMERIC_SIZE_1
,
1250 OptionMenu
->MenuNumber
+ 1,
1254 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1256 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1257 LegacyOrder
[Index
] = 0xFF;
1258 Pos
= (VarDevOrder
& 0xFF) / 8;
1259 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1260 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1262 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1267 CopyMem (OldData
, LegacyOrder
, 100);
1269 if (IfrOptionList
!= NULL
) {
1270 FreePool (IfrOptionList
);
1271 IfrOptionList
= NULL
;
1274 UpdatePageEnd (CallbackData
);
1278 Dispatch the display to the next page based on NewPageId.
1280 @param Private The BMM context data.
1281 @param NewPageId The original page ID.
1286 BMM_CALLBACK_DATA
*Private
,
1290 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1292 // If we select a handle to add driver option, advance to the add handle description page.
1294 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1295 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1297 // Return to main page after "Save Changes" or "Discard Changes".
1299 NewPageId
= FORM_MAIN_ID
;
1300 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1301 NewPageId
= FORM_CON_COM_SETUP_ID
;
1304 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1305 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1306 Private
->BmmCurrentPageId
= NewPageId
;