2 Dynamically update the pages.
4 Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
5 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.
27 // Free current updated date
29 if (mStartOpCodeHandle
!= NULL
) {
30 HiiFreeOpCodeHandle (mStartOpCodeHandle
);
34 // Create new OpCode Handle
36 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
39 // Create Hii Extend Label OpCode as the start opcode
41 mStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
42 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
47 Add a "Go back to main page" tag in front of the form when there are no
48 "Apply changes" and "Discard changes" tags in the end of the form.
50 @param CallbackData The BMM context data.
55 IN BMM_CALLBACK_DATA
*CallbackData
59 mStartLabel
->Number
= CallbackData
->BmmCurrentPageId
;
61 if (!(CallbackData
->BmmAskSaveOrNot
)) {
63 // Add a "Go back to main page" tag in front of the form when there are no
64 // "Apply changes" and "Discard changes" tags in the end of the form.
69 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
70 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
79 Create the "Apply changes" and "Discard changes" tags. And
80 ensure user can return to the main page.
82 @param CallbackData The BMM context data.
87 IN BMM_CALLBACK_DATA
*CallbackData
91 // Create the "Apply changes" and "Discard changes" tags.
93 if (CallbackData
->BmmAskSaveOrNot
) {
94 HiiCreateSubTitleOpCode (
96 STRING_TOKEN (STR_NULL_STRING
),
102 HiiCreateActionOpCode (
104 KEY_VALUE_SAVE_AND_EXIT
,
105 STRING_TOKEN (STR_SAVE_AND_EXIT
),
106 STRING_TOKEN (STR_NULL_STRING
),
107 EFI_IFR_FLAG_CALLBACK
,
113 // Ensure user can return to the main page.
115 HiiCreateActionOpCode (
117 KEY_VALUE_NO_SAVE_AND_EXIT
,
118 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
119 STRING_TOKEN (STR_NULL_STRING
),
120 EFI_IFR_FLAG_CALLBACK
,
125 CallbackData
->BmmHiiHandle
,
126 &gBootMaintFormSetGuid
,
127 CallbackData
->BmmCurrentPageId
,
128 mStartOpCodeHandle
, // Label CallbackData->BmmCurrentPageId
129 mEndOpCodeHandle
// LABEL_END
134 Clean up the dynamic opcode at label and form specified by both LabelId.
136 @param LabelId It is both the Form ID and Label ID for opcode deletion.
137 @param CallbackData The BMM context data.
143 IN BMM_CALLBACK_DATA
*CallbackData
146 RefreshUpdateData ();
149 // Remove all op-codes from dynamic page
151 mStartLabel
->Number
= LabelId
;
153 CallbackData
->BmmHiiHandle
,
154 &gBootMaintFormSetGuid
,
156 mStartOpCodeHandle
, // Label LabelId
157 mEndOpCodeHandle
// LABEL_END
162 Boot a file selected by user at File Expoloer of BMM.
164 @param FileContext The file context data, which contains the device path
165 of the file to be boot from.
167 @retval EFI_SUCCESS The function completed successfull.
168 @return Other value if the boot from the file fails.
173 IN BM_FILE_CONTEXT
*FileContext
179 BDS_COMMON_OPTION
*Option
;
181 Option
= (BDS_COMMON_OPTION
*) AllocatePool (sizeof (BDS_COMMON_OPTION
));
182 ASSERT (Option
!= NULL
);
183 Option
->Description
= (CHAR16
*) AllocateCopyPool (StrSize (FileContext
->FileName
), FileContext
->FileName
);
184 Option
->DevicePath
= FileContext
->DevicePath
;
185 Option
->LoadOptionsSize
= 0;
186 Option
->LoadOptions
= NULL
;
189 // Since current no boot from removable media directly is allowed */
191 gST
->ConOut
->ClearScreen (gST
->ConOut
);
195 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
202 Create a list of Goto Opcode for all terminal devices logged
203 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
205 @param CallbackData The BMM context data.
209 IN BMM_CALLBACK_DATA
*CallbackData
212 BM_MENU_ENTRY
*NewMenuEntry
;
215 CallbackData
->BmmAskSaveOrNot
= FALSE
;
217 UpdatePageStart (CallbackData
);
220 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
221 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
223 HiiCreateGotoOpCode (
225 FORM_CON_COM_SETUP_ID
,
226 NewMenuEntry
->DisplayStringToken
,
227 STRING_TOKEN (STR_NULL_STRING
),
228 EFI_IFR_FLAG_CALLBACK
,
229 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
233 UpdatePageEnd (CallbackData
);
237 Create a lit of boot option from global BootOptionMenu. It
238 allow user to delete the boot option.
240 @param CallbackData The BMM context data.
245 IN BMM_CALLBACK_DATA
*CallbackData
248 BM_MENU_ENTRY
*NewMenuEntry
;
249 BM_LOAD_CONTEXT
*NewLoadContext
;
252 CallbackData
->BmmAskSaveOrNot
= TRUE
;
254 UpdatePageStart (CallbackData
);
255 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
257 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.OptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.OptionDel
[0])));
258 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
259 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
260 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
261 if (NewLoadContext
->IsLegacy
) {
265 NewLoadContext
->Deleted
= FALSE
;
266 CallbackData
->BmmFakeNvData
.OptionDel
[Index
] = FALSE
;
268 HiiCreateCheckBoxOpCode (
270 (EFI_QUESTION_ID
) (OPTION_DEL_QUESTION_ID
+ Index
),
271 VARSTORE_ID_BOOT_MAINT
,
272 (UINT16
) (OPTION_DEL_VAR_OFFSET
+ Index
),
273 NewMenuEntry
->DisplayStringToken
,
274 NewMenuEntry
->HelpStringToken
,
281 UpdatePageEnd (CallbackData
);
285 Create a lit of driver option from global DriverMenu.
287 @param CallbackData The BMM context data.
291 UpdateDrvAddHandlePage (
292 IN BMM_CALLBACK_DATA
*CallbackData
295 BM_MENU_ENTRY
*NewMenuEntry
;
298 CallbackData
->BmmAskSaveOrNot
= FALSE
;
300 UpdatePageStart (CallbackData
);
302 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
303 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
305 HiiCreateGotoOpCode (
307 FORM_DRV_ADD_HANDLE_DESC_ID
,
308 NewMenuEntry
->DisplayStringToken
,
309 STRING_TOKEN (STR_NULL_STRING
),
310 EFI_IFR_FLAG_CALLBACK
,
311 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
315 UpdatePageEnd (CallbackData
);
319 Create a lit of driver option from global DriverOptionMenu. It
320 allow user to delete the driver option.
322 @param CallbackData The BMM context data.
327 IN BMM_CALLBACK_DATA
*CallbackData
330 BM_MENU_ENTRY
*NewMenuEntry
;
331 BM_LOAD_CONTEXT
*NewLoadContext
;
334 CallbackData
->BmmAskSaveOrNot
= TRUE
;
336 UpdatePageStart (CallbackData
);
338 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
340 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.OptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.OptionDel
[0])));
341 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
342 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
344 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
345 NewLoadContext
->Deleted
= FALSE
;
346 CallbackData
->BmmFakeNvData
.OptionDel
[Index
] = FALSE
;
348 HiiCreateCheckBoxOpCode (
350 (EFI_QUESTION_ID
) (OPTION_DEL_QUESTION_ID
+ Index
),
351 VARSTORE_ID_BOOT_MAINT
,
352 (UINT16
) (OPTION_DEL_VAR_OFFSET
+ Index
),
353 NewMenuEntry
->DisplayStringToken
,
354 NewMenuEntry
->HelpStringToken
,
361 UpdatePageEnd (CallbackData
);
365 Prepare the page to allow user to add description for
368 @param CallbackData The BMM context data.
372 UpdateDriverAddHandleDescPage (
373 IN BMM_CALLBACK_DATA
*CallbackData
376 BM_MENU_ENTRY
*NewMenuEntry
;
378 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
379 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
380 CallbackData
->BmmAskSaveOrNot
= TRUE
;
381 NewMenuEntry
= CallbackData
->MenuEntry
;
383 UpdatePageStart (CallbackData
);
385 HiiCreateSubTitleOpCode (
387 NewMenuEntry
->DisplayStringToken
,
393 HiiCreateStringOpCode (
395 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
396 VARSTORE_ID_BOOT_MAINT
,
397 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
398 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
399 STRING_TOKEN (STR_NULL_STRING
),
407 HiiCreateCheckBoxOpCode (
409 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
410 VARSTORE_ID_BOOT_MAINT
,
411 DRV_ADD_RECON_VAR_OFFSET
,
412 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
413 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
419 HiiCreateStringOpCode (
421 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
422 VARSTORE_ID_BOOT_MAINT
,
423 DRIVER_ADD_OPTION_VAR_OFFSET
,
424 STRING_TOKEN (STR_OPTIONAL_DATA
),
425 STRING_TOKEN (STR_NULL_STRING
),
433 UpdatePageEnd (CallbackData
);
439 @param UpdatePageId The form ID to be updated.
440 @param ConsoleMenu The console menu list.
441 @param CallbackData The BMM context data.
446 IN UINT16 UpdatePageId
,
447 IN BM_MENU_OPTION
*ConsoleMenu
,
448 IN BMM_CALLBACK_DATA
*CallbackData
451 BM_MENU_ENTRY
*NewMenuEntry
;
452 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
453 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
458 CallbackData
->BmmAskSaveOrNot
= TRUE
;
460 UpdatePageStart (CallbackData
);
462 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
463 (Index
< (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (UINT8
)))) ; Index
++) {
464 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
465 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
467 if (NewConsoleContext
->IsActive
) {
468 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
469 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
471 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
474 HiiCreateCheckBoxOpCode (
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
,
487 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
488 (Index2
< (sizeof (CallbackData
->BmmFakeNvData
.ConsoleCheck
) / sizeof (UINT8
)))); Index2
++) {
490 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
491 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
493 ASSERT (Index
< MAX_MENU_NUMBER
);
494 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
495 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
496 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
498 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
499 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = TRUE
;
501 CallbackData
->BmmFakeNvData
.ConsoleCheck
[Index
] = FALSE
;
504 HiiCreateCheckBoxOpCode (
506 (EFI_QUESTION_ID
) (CON_DEVICE_QUESTION_ID
+ Index
),
507 VARSTORE_ID_BOOT_MAINT
,
508 (UINT16
) (CON_DEVICE_VAR_OFFSET
+ Index
),
509 NewMenuEntry
->DisplayStringToken
,
510 NewMenuEntry
->HelpStringToken
,
519 UpdatePageEnd (CallbackData
);
523 Update the page's NV Map if user has changed the order
524 a list. This list can be Boot Order or Driver Order.
526 @param UpdatePageId The form ID to be updated.
527 @param OptionMenu The new list.
528 @param CallbackData The BMM context data.
533 IN UINT16 UpdatePageId
,
534 IN BM_MENU_OPTION
*OptionMenu
,
535 IN BMM_CALLBACK_DATA
*CallbackData
538 BM_MENU_ENTRY
*NewMenuEntry
;
540 UINT16 OptionOrderIndex
;
541 VOID
*OptionsOpCodeHandle
;
543 BM_LOAD_CONTEXT
*NewLoadContext
;
545 DeviceType
= (UINTN
) -1;
546 CallbackData
->BmmAskSaveOrNot
= TRUE
;
548 UpdatePageStart (CallbackData
);
550 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
552 ZeroMem (CallbackData
->BmmFakeNvData
.OptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.OptionOrder
));
554 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
555 ASSERT (OptionsOpCodeHandle
!= NULL
);
558 Index
= 0, OptionOrderIndex
= 0;
560 (Index
< OptionMenu
->MenuNumber
) &&
563 sizeof (CallbackData
->BmmFakeNvData
.OptionOrder
) /
564 sizeof (CallbackData
->BmmFakeNvData
.OptionOrder
[0])
570 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
571 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
573 if (NewLoadContext
->IsLegacy
) {
574 if (((BBS_BBS_DEVICE_PATH
*) NewLoadContext
->FilePathList
)->DeviceType
!= DeviceType
) {
575 DeviceType
= ((BBS_BBS_DEVICE_PATH
*) NewLoadContext
->FilePathList
)->DeviceType
;
578 // Only show one legacy boot option for the same device type
579 // assuming the boot options are grouped by the device type
584 HiiCreateOneOfOptionOpCode (
586 NewMenuEntry
->DisplayStringToken
,
588 EFI_IFR_TYPE_NUM_SIZE_32
,
589 (UINT32
) (NewMenuEntry
->OptionNumber
+ 1)
591 CallbackData
->BmmFakeNvData
.OptionOrder
[OptionOrderIndex
++] = (UINT32
) (NewMenuEntry
->OptionNumber
+ 1);
594 if (OptionMenu
->MenuNumber
> 0) {
595 HiiCreateOrderedListOpCode (
596 mStartOpCodeHandle
, // Container for dynamic created opcodes
597 (EFI_QUESTION_ID
) OPTION_ORDER_QUESTION_ID
, // Question ID
598 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
599 OPTION_ORDER_VAR_OFFSET
, // Offset in Buffer Storage
600 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
601 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
603 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
604 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
605 100, // Maximum container
606 OptionsOpCodeHandle
, // Option Opcode list
607 NULL
// Default Opcode is NULL
611 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
613 UpdatePageEnd (CallbackData
);
616 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
617 CallbackData
->BmmFakeNvData
.OptionOrder
,
618 sizeof (CallbackData
->BmmOldFakeNVData
.OptionOrder
)
623 Create the dynamic page to allow user to set
624 the "BootNext" value.
626 @param CallbackData The BMM context data.
631 IN BMM_CALLBACK_DATA
*CallbackData
634 BM_MENU_ENTRY
*NewMenuEntry
;
635 BM_LOAD_CONTEXT
*NewLoadContext
;
636 UINTN NumberOfOptions
;
638 VOID
*OptionsOpCodeHandle
;
640 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
641 CallbackData
->BmmAskSaveOrNot
= TRUE
;
643 UpdatePageStart (CallbackData
);
644 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
646 if (NumberOfOptions
> 0) {
647 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
648 ASSERT (OptionsOpCodeHandle
!= NULL
);
650 CallbackData
->BmmFakeNvData
.BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
652 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
653 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
654 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
656 if (NewLoadContext
->IsBootNext
) {
657 HiiCreateOneOfOptionOpCode (
659 NewMenuEntry
->DisplayStringToken
,
660 EFI_IFR_OPTION_DEFAULT
,
661 EFI_IFR_TYPE_NUM_SIZE_16
,
664 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
666 HiiCreateOneOfOptionOpCode (
668 NewMenuEntry
->DisplayStringToken
,
670 EFI_IFR_TYPE_NUM_SIZE_16
,
676 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
677 HiiCreateOneOfOptionOpCode (
679 STRING_TOKEN (STR_NONE
),
680 EFI_IFR_OPTION_DEFAULT
,
681 EFI_IFR_TYPE_NUM_SIZE_16
,
685 HiiCreateOneOfOptionOpCode (
687 STRING_TOKEN (STR_NONE
),
689 EFI_IFR_TYPE_NUM_SIZE_16
,
694 HiiCreateOneOfOpCode (
696 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
697 VARSTORE_ID_BOOT_MAINT
,
698 BOOT_NEXT_VAR_OFFSET
,
699 STRING_TOKEN (STR_BOOT_NEXT
),
700 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
702 EFI_IFR_NUMERIC_SIZE_2
,
707 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
710 UpdatePageEnd (CallbackData
);
714 Create the dynamic page to allow user to set the "TimeOut" value.
716 @param CallbackData The BMM context data.
721 IN BMM_CALLBACK_DATA
*CallbackData
725 VOID
*DefaultOpCodeHandle
;
727 CallbackData
->BmmAskSaveOrNot
= TRUE
;
729 UpdatePageStart (CallbackData
);
731 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
733 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
734 ASSERT (DefaultOpCodeHandle
!= NULL
);
735 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
737 HiiCreateNumericOpCode (
739 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
740 VARSTORE_ID_BOOT_MAINT
,
741 BOOT_TIME_OUT_VAR_OFFSET
,
742 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
743 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
745 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
752 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
754 CallbackData
->BmmFakeNvData
.BootTimeOut
= BootTimeOut
;
756 UpdatePageEnd (CallbackData
);
760 Refresh the text mode page.
762 @param CallbackData The BMM context data.
767 IN BMM_CALLBACK_DATA
*CallbackData
774 CHAR16 ModeString
[50];
778 EFI_STRING_ID
*ModeToken
;
780 VOID
*OptionsOpCodeHandle
;
781 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
783 ConOut
= gST
->ConOut
;
786 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
788 CallbackData
->BmmAskSaveOrNot
= TRUE
;
790 UpdatePageStart (CallbackData
);
795 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
796 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
797 if (EFI_ERROR (Status
)) {
803 if (ValidMode
== 0) {
807 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
808 ASSERT (OptionsOpCodeHandle
!= NULL
);
810 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
811 ASSERT(ModeToken
!= NULL
);
814 // Determin which mode should be the first entry in menu
816 GetConsoleOutMode (CallbackData
);
819 // Build text mode options
821 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
822 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
823 if (EFI_ERROR (Status
)) {
828 // Build mode string Column x Row
830 UnicodeValueToString (ModeString
, 0, Col
, 0);
831 PStr
= &ModeString
[0];
832 StrnCat (PStr
, L
" x ", StrLen(L
" x ") + 1);
833 PStr
= PStr
+ StrLen (PStr
);
834 UnicodeValueToString (PStr
, 0, Row
, 0);
836 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
838 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
839 HiiCreateOneOfOptionOpCode (
842 EFI_IFR_OPTION_DEFAULT
,
843 EFI_IFR_TYPE_NUM_SIZE_16
,
847 HiiCreateOneOfOptionOpCode (
851 EFI_IFR_TYPE_NUM_SIZE_16
,
858 HiiCreateOneOfOpCode (
860 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
861 VARSTORE_ID_BOOT_MAINT
,
863 STRING_TOKEN (STR_CON_MODE_SETUP
),
864 STRING_TOKEN (STR_CON_MODE_SETUP
),
865 EFI_IFR_FLAG_RESET_REQUIRED
,
866 EFI_IFR_NUMERIC_SIZE_2
,
871 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
872 FreePool (ModeToken
);
874 UpdatePageEnd (CallbackData
);
878 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
879 Parity, Stop Bits, Terminal Type.
881 @param CallbackData The BMM context data.
886 IN BMM_CALLBACK_DATA
*CallbackData
891 BM_MENU_ENTRY
*NewMenuEntry
;
892 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
893 VOID
*OptionsOpCodeHandle
;
895 CallbackData
->BmmAskSaveOrNot
= TRUE
;
897 UpdatePageStart (CallbackData
);
899 NewMenuEntry
= BOpt_GetMenuEntry (
901 CallbackData
->CurrentTerminal
904 if (NewMenuEntry
== NULL
) {
908 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
910 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
911 ASSERT (OptionsOpCodeHandle
!= NULL
);
913 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
915 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
916 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
917 NewTerminalContext
->BaudRateIndex
= Index
;
918 CallbackData
->BmmFakeNvData
.COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
921 HiiCreateOneOfOptionOpCode (
923 BaudRateList
[Index
].StringToken
,
925 EFI_IFR_TYPE_NUM_SIZE_8
,
930 HiiCreateOneOfOpCode (
932 (EFI_QUESTION_ID
) COM_BAUD_RATE_QUESTION_ID
,
933 VARSTORE_ID_BOOT_MAINT
,
934 COM_BAUD_RATE_VAR_OFFSET
,
935 STRING_TOKEN (STR_COM_BAUD_RATE
),
936 STRING_TOKEN (STR_COM_BAUD_RATE
),
938 EFI_IFR_NUMERIC_SIZE_1
,
943 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
944 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
945 ASSERT (OptionsOpCodeHandle
!= NULL
);
947 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
950 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
951 NewTerminalContext
->DataBitsIndex
= Index
;
952 CallbackData
->BmmFakeNvData
.COMDataRate
= NewTerminalContext
->DataBitsIndex
;
953 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
956 HiiCreateOneOfOptionOpCode (
958 DataBitsList
[Index
].StringToken
,
960 EFI_IFR_TYPE_NUM_SIZE_8
,
965 HiiCreateOneOfOpCode (
967 (EFI_QUESTION_ID
) COM_DATA_RATE_QUESTION_ID
,
968 VARSTORE_ID_BOOT_MAINT
,
969 COM_DATA_RATE_VAR_OFFSET
,
970 STRING_TOKEN (STR_COM_DATA_BITS
),
971 STRING_TOKEN (STR_COM_DATA_BITS
),
973 EFI_IFR_NUMERIC_SIZE_1
,
978 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
979 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
980 ASSERT (OptionsOpCodeHandle
!= NULL
);
982 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
984 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
985 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
986 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
987 CallbackData
->BmmFakeNvData
.COMParity
= NewTerminalContext
->ParityIndex
;
990 HiiCreateOneOfOptionOpCode (
992 ParityList
[Index
].StringToken
,
994 EFI_IFR_TYPE_NUM_SIZE_8
,
999 HiiCreateOneOfOpCode (
1001 (EFI_QUESTION_ID
) COM_PARITY_QUESTION_ID
,
1002 VARSTORE_ID_BOOT_MAINT
,
1003 COM_PARITY_VAR_OFFSET
,
1004 STRING_TOKEN (STR_COM_PARITY
),
1005 STRING_TOKEN (STR_COM_PARITY
),
1007 EFI_IFR_NUMERIC_SIZE_1
,
1008 OptionsOpCodeHandle
,
1012 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1013 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1014 ASSERT (OptionsOpCodeHandle
!= NULL
);
1016 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
1018 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
1019 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1020 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
1021 CallbackData
->BmmFakeNvData
.COMStopBits
= NewTerminalContext
->StopBitsIndex
;
1024 HiiCreateOneOfOptionOpCode (
1025 OptionsOpCodeHandle
,
1026 StopBitsList
[Index
].StringToken
,
1028 EFI_IFR_TYPE_NUM_SIZE_8
,
1033 HiiCreateOneOfOpCode (
1035 (EFI_QUESTION_ID
) COM_STOP_BITS_QUESTION_ID
,
1036 VARSTORE_ID_BOOT_MAINT
,
1037 COM_STOP_BITS_VAR_OFFSET
,
1038 STRING_TOKEN (STR_COM_STOP_BITS
),
1039 STRING_TOKEN (STR_COM_STOP_BITS
),
1041 EFI_IFR_NUMERIC_SIZE_1
,
1042 OptionsOpCodeHandle
,
1046 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1047 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1048 ASSERT (OptionsOpCodeHandle
!= NULL
);
1050 for (Index
= 0; Index
< 4; Index
++) {
1052 if (NewTerminalContext
->TerminalType
== Index
) {
1053 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1054 CallbackData
->BmmFakeNvData
.COMTerminalType
= NewTerminalContext
->TerminalType
;
1057 HiiCreateOneOfOptionOpCode (
1058 OptionsOpCodeHandle
,
1059 (EFI_STRING_ID
) TerminalType
[Index
],
1061 EFI_IFR_TYPE_NUM_SIZE_8
,
1066 HiiCreateOneOfOpCode (
1068 (EFI_QUESTION_ID
) COM_TERMINAL_QUESTION_ID
,
1069 VARSTORE_ID_BOOT_MAINT
,
1070 COM_TERMINAL_VAR_OFFSET
,
1071 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1072 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1074 EFI_IFR_NUMERIC_SIZE_1
,
1075 OptionsOpCodeHandle
,
1079 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1080 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1081 ASSERT (OptionsOpCodeHandle
!= NULL
);
1083 CallbackData
->BmmFakeNvData
.COMFlowControl
= NewTerminalContext
->FlowControl
;
1084 for (Index
= 0; Index
< sizeof (mFlowControlType
) / sizeof (mFlowControlType
[0]); Index
++) {
1085 HiiCreateOneOfOptionOpCode (
1086 OptionsOpCodeHandle
,
1087 (EFI_STRING_ID
) mFlowControlType
[Index
],
1089 EFI_IFR_TYPE_NUM_SIZE_8
,
1090 mFlowControlValue
[Index
]
1094 HiiCreateOneOfOpCode (
1096 (EFI_QUESTION_ID
) COM_FLOWCONTROL_QUESTION_ID
,
1097 VARSTORE_ID_BOOT_MAINT
,
1098 COM_FLOWCONTROL_VAR_OFFSET
,
1099 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1100 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1102 EFI_IFR_NUMERIC_SIZE_1
,
1103 OptionsOpCodeHandle
,
1107 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1109 UpdatePageEnd (CallbackData
);
1113 Dispatch the correct update page function to call based on
1116 @param UpdatePageId The form ID.
1117 @param CallbackData The BMM context data.
1122 IN UINT16 UpdatePageId
,
1123 IN BMM_CALLBACK_DATA
*CallbackData
1126 CleanUpPage (UpdatePageId
, CallbackData
);
1127 switch (UpdatePageId
) {
1128 case FORM_CON_IN_ID
:
1129 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1132 case FORM_CON_OUT_ID
:
1133 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1136 case FORM_CON_ERR_ID
:
1137 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1140 case FORM_BOOT_CHG_ID
:
1141 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1144 case FORM_DRV_CHG_ID
:
1145 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1154 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
1155 specified by DeviceType.
1157 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1159 @param OptionIndex Returns the index number (#### in Boot####).
1160 @param OptionSize Return the size of the Boot### variable.
1164 GetLegacyBootOptionVar (
1165 IN UINTN DeviceType
,
1166 OUT UINTN
*OptionIndex
,
1167 OUT UINTN
*OptionSize
1170 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
1174 UINT16
*OrderBuffer
;
1175 CHAR16 StrTemp
[100];
1176 UINT16 FilePathSize
;
1178 UINT8
*OptionalData
;
1181 // Get Boot Option number from the size of BootOrder
1183 OrderBuffer
= BdsLibGetVariableAndSize (
1185 &gEfiGlobalVariableGuid
,
1189 if (OrderBuffer
== NULL
) {
1193 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
1194 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
1195 OptionBuffer
= BdsLibGetVariableAndSize (
1197 &gEfiGlobalVariableGuid
,
1200 if (NULL
== OptionBuffer
) {
1204 Ptr
= (UINT8
*) OptionBuffer
;
1205 Ptr
+= sizeof (UINT32
);
1207 FilePathSize
= *(UINT16
*) Ptr
;
1208 Ptr
+= sizeof (UINT16
);
1210 Ptr
+= StrSize ((CHAR16
*) Ptr
);
1213 // Now Ptr point to Device Path
1215 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1216 Ptr
+= FilePathSize
;
1219 // Now Ptr point to Optional Data
1223 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1224 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1225 (BBS_BBS_DP
== DevicePath
->SubType
)
1227 *OptionIndex
= OrderBuffer
[Index
];
1228 FreePool (OrderBuffer
);
1229 return OptionBuffer
;
1231 FreePool (OptionBuffer
);
1235 FreePool (OrderBuffer
);
1240 Create a dynamic page so that Legacy Device boot order
1241 can be set for specified device type.
1243 @param UpdatePageId The form ID. It also spefies the legacy device type.
1244 @param CallbackData The BMM context data.
1249 UpdateSetLegacyDeviceOrderPage (
1250 IN UINT16 UpdatePageId
,
1251 IN BMM_CALLBACK_DATA
*CallbackData
1254 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
1255 BM_MENU_OPTION
*OptionMenu
;
1256 BM_MENU_ENTRY
*NewMenuEntry
;
1257 EFI_STRING_ID StrRef
;
1258 EFI_STRING_ID StrRefHelp
;
1267 CHAR16
*TypeStrHelp
;
1273 VOID
*OptionsOpCodeHandle
;
1281 BbsType
= BBS_FLOPPY
;
1286 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1287 UpdatePageStart (CallbackData
);
1289 DisMap
= ZeroMem (CallbackData
->BmmOldFakeNVData
.DisableMap
, sizeof (CallbackData
->BmmOldFakeNVData
.DisableMap
));
1292 // Create oneof option list
1294 switch (UpdatePageId
) {
1295 case FORM_SET_FD_ORDER_ID
:
1296 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1297 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1298 TypeStr
= STR_FLOPPY
;
1299 TypeStrHelp
= STR_FLOPPY_HELP
;
1300 BbsType
= BBS_FLOPPY
;
1301 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1302 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1305 case FORM_SET_HD_ORDER_ID
:
1306 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1307 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1308 TypeStr
= STR_HARDDISK
;
1309 TypeStrHelp
= STR_HARDDISK_HELP
;
1310 BbsType
= BBS_HARDDISK
;
1311 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1312 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1315 case FORM_SET_CD_ORDER_ID
:
1316 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1317 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1318 TypeStr
= STR_CDROM
;
1319 TypeStrHelp
= STR_CDROM_HELP
;
1320 BbsType
= BBS_CDROM
;
1321 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1322 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1325 case FORM_SET_NET_ORDER_ID
:
1326 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1327 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1329 TypeStrHelp
= STR_NET_HELP
;
1330 BbsType
= BBS_EMBED_NETWORK
;
1331 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1332 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1335 case FORM_SET_BEV_ORDER_ID
:
1336 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1337 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1339 TypeStrHelp
= STR_BEV_HELP
;
1340 BbsType
= BBS_BEV_DEVICE
;
1341 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1342 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1346 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
1350 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1352 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1353 ASSERT (OptionsOpCodeHandle
!= NULL
);
1355 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1356 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1358 // Create OneOf for each legacy device
1360 HiiCreateOneOfOptionOpCode (
1361 OptionsOpCodeHandle
,
1362 NewMenuEntry
->DisplayStringToken
,
1364 EFI_IFR_TYPE_NUM_SIZE_8
,
1365 (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->BbsIndex
1370 // Create OneOf for item "Disabled"
1372 HiiCreateOneOfOptionOpCode (
1373 OptionsOpCodeHandle
,
1374 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
),
1376 EFI_IFR_TYPE_NUM_SIZE_8
,
1381 // Get Device Order from variable
1383 VarData
= BdsLibGetVariableAndSize (
1384 VAR_LEGACY_DEV_ORDER
,
1385 &gEfiLegacyDevOrderVariableGuid
,
1389 if (NULL
!= VarData
) {
1390 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1391 while (VarData
< VarData
+ VarSize
) {
1392 if (DevOrder
->BbsType
== BbsType
) {
1396 VarData
+= sizeof (BBS_TYPE
);
1397 VarData
+= *(UINT16
*) VarData
;
1398 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1401 // Create oneof tag here for FD/HD/CD #1 #2
1403 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1405 // Create the string for oneof tag
1407 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1408 StrRef
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1410 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1411 StrRefHelp
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1413 HiiCreateOneOfOpCode (
1415 (EFI_QUESTION_ID
) (Key
+ Index
),
1416 VARSTORE_ID_BOOT_MAINT
,
1417 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1420 EFI_IFR_FLAG_CALLBACK
,
1421 EFI_IFR_NUMERIC_SIZE_1
,
1422 OptionsOpCodeHandle
,
1426 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1428 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1429 LegacyOrder
[Index
] = 0xFF;
1430 Pos
= (VarDevOrder
& 0xFF) / 8;
1431 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1432 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1434 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1439 CopyMem (OldData
, LegacyOrder
, 100);
1441 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1443 UpdatePageEnd (CallbackData
);
1447 Dispatch the display to the next page based on NewPageId.
1449 @param Private The BMM context data.
1450 @param NewPageId The original page ID.
1455 BMM_CALLBACK_DATA
*Private
,
1459 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1461 // If we select a handle to add driver option, advance to the add handle description page.
1463 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1464 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1466 // Return to main page after "Save Changes" or "Discard Changes".
1468 NewPageId
= FORM_MAIN_ID
;
1469 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1470 NewPageId
= FORM_CON_COM_SETUP_ID
;
1473 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1474 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1475 Private
->BmmCurrentPageId
= NewPageId
;