2 Dynamically Update the pages.
4 Copyright (c) 2006 - 2007 Intel Corporation.
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 "Generic/Bds.h"
16 #include "BootMaint.h"
17 #include "BdsPlatform.h"
19 EFI_GUID gTerminalDriverGuid
= {
20 0x9E863906, 0xA40F, 0x4875, {0x97, 0x7F, 0x5B, 0x93, 0xFF, 0x23, 0x7F, 0xC6}
25 IN BOOLEAN FormSetUpdate
,
26 IN EFI_PHYSICAL_ADDRESS FormCallbackHandle
,
27 IN BOOLEAN FormUpdate
,
28 IN STRING_REF FormTitle
,
33 Refresh the global UpdateData structure.
36 FormSetUpdate - If TRUE, next variable is significant
37 FormCallbackHandle - If not 0, will update FormSet with this info
38 FormUpdate - If TRUE, next variable is significant
39 FormTitle - If not 0, will update Form with this info
40 DataCount - The number of Data entries in this structure
46 UpdateData
->FormSetUpdate
= FormSetUpdate
;
48 ASSERT (0 != FormCallbackHandle
);
49 UpdateData
->FormCallbackHandle
= FormCallbackHandle
;
52 UpdateData
->FormUpdate
= FALSE
;
53 UpdateData
->FormTitle
= FormTitle
;
54 UpdateData
->DataCount
= DataCount
;
59 IN BMM_CALLBACK_DATA
*CallbackData
,
60 IN OUT UINT8
**CurrentLocation
63 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->BmmCallbackHandle
, FALSE
, 0, 0);
65 if (!(CallbackData
->BmmAskSaveOrNot
)) {
67 // Add a "Go back to main page" tag in front of the form when there are no
68 // "Apply changes" and "Discard changes" tags in the end of the form.
72 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
73 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
74 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
79 UpdateData
->DataCount
++;
81 *CurrentLocation
= *CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) (*CurrentLocation
))->Length
;
88 IN BMM_CALLBACK_DATA
*CallbackData
,
89 IN UINT8
*CurrentLocation
93 // Create the "Apply changes" and "Discard changes" tags.
95 if (CallbackData
->BmmAskSaveOrNot
) {
98 STRING_TOKEN (STR_SAVE_AND_EXIT
),
99 STRING_TOKEN (STR_NULL_STRING
),
100 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
101 KEY_VALUE_SAVE_AND_EXIT
,
105 UpdateData
->DataCount
++;
107 CurrentLocation
= CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) CurrentLocation
)->Length
;
111 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
112 STRING_TOKEN (STR_NULL_STRING
),
113 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
114 KEY_VALUE_NO_SAVE_AND_EXIT
,
118 UpdateData
->DataCount
++;
121 // Ensure user can return to the main page.
123 if (0 == UpdateData
->DataCount
) {
126 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
127 STRING_TOKEN (STR_NULL_STRING
),
128 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
129 KEY_VALUE_NO_SAVE_AND_EXIT
,
133 UpdateData
->DataCount
++;
136 CallbackData
->Hii
->UpdateForm (
138 CallbackData
->BmmHiiHandle
,
139 CallbackData
->BmmCurrentPageId
,
147 IN EFI_FORM_LABEL LabelId
,
148 IN BMM_CALLBACK_DATA
*CallbackData
151 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
154 // Remove all op-codes from dynamic page
156 CallbackData
->Hii
->UpdateForm (
158 CallbackData
->BmmHiiHandle
,
167 IN BM_FILE_CONTEXT
*FileContext
173 BDS_COMMON_OPTION
*Option
;
175 Option
= AllocatePool (sizeof (BDS_COMMON_OPTION
));
177 Option
->Description
= FileContext
->FileName
;
178 Option
->DevicePath
= FileContext
->DevicePath
;
179 Option
->LoadOptionsSize
= 0;
180 Option
->LoadOptions
= NULL
;
183 // Since current no boot from removable media directly is allowed */
185 gST
->ConOut
->ClearScreen (gST
->ConOut
);
189 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
197 IN BMM_CALLBACK_DATA
*CallbackData
200 BM_MENU_ENTRY
*NewMenuEntry
;
206 Location
= (UINT8
*) &UpdateData
->Data
;
207 CallbackData
->BmmAskSaveOrNot
= FALSE
;
209 UpdatePageStart (CallbackData
, &Location
);
211 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
212 if (!EFI_ERROR (Status
)) {
213 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
214 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
217 FORM_CON_COM_SETUP_ID
,
218 NewMenuEntry
->DisplayStringToken
,
219 STRING_TOKEN (STR_NULL_STRING
),
220 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
221 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
224 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
225 UpdateData
->DataCount
++;
229 UpdatePageEnd (CallbackData
, Location
);
234 IN BMM_CALLBACK_DATA
*CallbackData
237 BM_MENU_ENTRY
*NewMenuEntry
;
238 BM_LOAD_CONTEXT
*NewLoadContext
;
242 Location
= (UINT8
*) &UpdateData
->Data
;
243 CallbackData
->BmmAskSaveOrNot
= TRUE
;
245 UpdatePageStart (CallbackData
, &Location
);
246 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
248 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
249 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
250 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
251 if (NewLoadContext
->IsLegacy
) {
255 NewLoadContext
->Deleted
= FALSE
;
256 CallbackData
->BmmFakeNvData
->BootOptionDel
[Index
] = 0x00;
258 CreateCheckBoxOpCode (
259 (UINT16
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
261 NewMenuEntry
->DisplayStringToken
,
262 NewMenuEntry
->HelpStringToken
,
263 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
264 (UINT16
) BOOT_OPTION_DEL_QUESTION_ID
,
268 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
269 UpdateData
->DataCount
++;
272 UpdatePageEnd (CallbackData
, Location
);
276 UpdateDrvAddHandlePage (
277 IN BMM_CALLBACK_DATA
*CallbackData
280 BM_MENU_ENTRY
*NewMenuEntry
;
284 Location
= (UINT8
*) &UpdateData
->Data
;
285 CallbackData
->BmmAskSaveOrNot
= FALSE
;
287 UpdatePageStart (CallbackData
, &Location
);
289 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
290 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
293 FORM_DRV_ADD_HANDLE_DESC_ID
,
294 NewMenuEntry
->DisplayStringToken
,
295 STRING_TOKEN (STR_NULL_STRING
),
296 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
297 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
301 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
302 UpdateData
->DataCount
++;
305 UpdatePageEnd (CallbackData
, Location
);
310 IN BMM_CALLBACK_DATA
*CallbackData
313 BM_MENU_ENTRY
*NewMenuEntry
;
314 BM_LOAD_CONTEXT
*NewLoadContext
;
318 Location
= (UINT8
*) &UpdateData
->Data
;
319 CallbackData
->BmmAskSaveOrNot
= TRUE
;
321 UpdatePageStart (CallbackData
, &Location
);
323 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
325 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
326 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
328 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
329 NewLoadContext
->Deleted
= FALSE
;
330 CallbackData
->BmmFakeNvData
->DriverOptionDel
[Index
] = 0x00;
332 CreateCheckBoxOpCode (
333 (UINT16
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
335 NewMenuEntry
->DisplayStringToken
,
336 NewMenuEntry
->HelpStringToken
,
337 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
338 (UINT16
) DRIVER_OPTION_DEL_QUESTION_ID
,
342 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
343 UpdateData
->DataCount
++;
346 UpdatePageEnd (CallbackData
, Location
);
350 UpdateDriverAddHandleDescPage (
351 IN BMM_CALLBACK_DATA
*CallbackData
354 BM_MENU_ENTRY
*NewMenuEntry
;
357 Location
= (UINT8
*) &UpdateData
->Data
;
358 CallbackData
->BmmFakeNvData
->DriverAddActive
= 0x01;
359 CallbackData
->BmmFakeNvData
->DriverAddForceReconnect
= 0x00;
360 CallbackData
->BmmAskSaveOrNot
= TRUE
;
361 NewMenuEntry
= CallbackData
->MenuEntry
;
363 UpdatePageStart (CallbackData
, &Location
);
365 UpdateData
->DataCount
+= (UINT16
) 4;
367 CreateSubTitleOpCode (
368 NewMenuEntry
->DisplayStringToken
,
372 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
375 DRV_ADD_HANDLE_DESC_QUESTION_ID
,
377 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
378 STRING_TOKEN (STR_NULL_STRING
),
381 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
382 KEY_VALUE_DRIVER_ADD_DESC_DATA
,
386 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
388 CreateCheckBoxOpCode (
389 DRV_ADD_RECON_QUESTION_ID
,
391 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
392 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
393 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
394 DRV_ADD_RECON_QUESTION_ID
,
397 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
400 DRIVER_ADD_OPTION_QUESTION_ID
,
402 STRING_TOKEN (STR_OPTIONAL_DATA
),
403 STRING_TOKEN (STR_NULL_STRING
),
406 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
407 KEY_VALUE_DRIVER_ADD_OPT_DATA
,
411 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
412 UpdatePageEnd (CallbackData
, Location
);
417 IN UINT16 UpdatePageId
,
418 IN BM_MENU_OPTION
*ConsoleMenu
,
419 IN BMM_CALLBACK_DATA
*CallbackData
422 BM_MENU_ENTRY
*NewMenuEntry
;
423 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
424 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
432 Location
= (UINT8
*) &UpdateData
->Data
;
433 CallbackData
->BmmAskSaveOrNot
= TRUE
;
435 UpdatePageStart (CallbackData
, &Location
);
437 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
438 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
439 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
440 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
441 if (NewConsoleContext
->IsActive
) {
442 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
443 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
445 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
448 CreateCheckBoxOpCode (
449 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
451 NewMenuEntry
->DisplayStringToken
,
452 NewMenuEntry
->HelpStringToken
,
454 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
457 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
458 UpdateData
->DataCount
++;
461 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
462 if (!EFI_ERROR (Status
)) {
463 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
464 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
465 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
466 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
468 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
469 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
470 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
472 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
473 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
475 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
478 CreateCheckBoxOpCode (
479 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
481 NewMenuEntry
->DisplayStringToken
,
482 NewMenuEntry
->HelpStringToken
,
484 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
487 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
488 UpdateData
->DataCount
++;
493 UpdatePageEnd (CallbackData
, Location
);
498 IN UINT16 UpdatePageId
,
499 IN BM_MENU_OPTION
*OptionMenu
,
500 IN BMM_CALLBACK_DATA
*CallbackData
503 BM_MENU_ENTRY
*NewMenuEntry
;
506 IFR_OPTION
*IfrOptionList
;
508 Location
= (UINT8
*) &UpdateData
->Data
;
509 CallbackData
->BmmAskSaveOrNot
= TRUE
;
511 UpdatePageStart (CallbackData
, &Location
);
513 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
515 ZeroMem (CallbackData
->BmmFakeNvData
->OptionOrder
, 100);
517 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
518 if (NULL
== IfrOptionList
) {
522 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
523 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
524 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
525 IfrOptionList
[Index
].Value
= (UINT16
) (NewMenuEntry
->OptionNumber
+ 1);
526 IfrOptionList
[Index
].OptionString
= NULL
;
527 CallbackData
->BmmFakeNvData
->OptionOrder
[Index
] = (UINT8
) (IfrOptionList
[Index
].Value
);
530 if (OptionMenu
->MenuNumber
> 0) {
531 CreateOrderedListOpCode (
532 (UINT16
) OPTION_ORDER_QUESTION_ID
,
534 STRING_TOKEN (STR_CHANGE_ORDER
),
535 STRING_TOKEN (STR_CHANGE_ORDER
),
537 OptionMenu
->MenuNumber
,
541 for (Index
= 0; Index
< OptionMenu
->MenuNumber
+ 2; Index
++) {
542 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
545 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ OptionMenu
->MenuNumber
+ 2);
548 SafeFreePool (IfrOptionList
);
550 UpdatePageEnd (CallbackData
, Location
);
553 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
554 CallbackData
->BmmFakeNvData
->OptionOrder
,
561 IN BMM_CALLBACK_DATA
*CallbackData
565 BM_MENU_ENTRY
*NewMenuEntry
;
566 BM_LOAD_CONTEXT
*NewLoadContext
;
567 IFR_OPTION
*IfrOptionList
;
568 UINTN NumberOfOptions
;
571 Location
= (UINT8
*) &UpdateData
->Data
;
572 IfrOptionList
= NULL
;
573 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
574 CallbackData
->BmmAskSaveOrNot
= TRUE
;
576 UpdatePageStart (CallbackData
, &Location
);
577 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
579 if (NumberOfOptions
> 0) {
580 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ NumberOfOptions
);
581 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
583 ASSERT (IfrOptionList
);
585 CallbackData
->BmmFakeNvData
->BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
587 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
588 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
589 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
590 if (NewLoadContext
->IsBootNext
) {
591 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_DEFAULT
| EFI_IFR_FLAG_INTERACTIVE
;
592 CallbackData
->BmmFakeNvData
->BootNext
= Index
;
594 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
597 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
598 IfrOptionList
[Index
].Value
= Index
;
599 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
600 IfrOptionList
[Index
].OptionString
= NULL
;
603 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
604 IfrOptionList
[Index
].Value
= Index
;
605 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
606 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
607 if (CallbackData
->BmmFakeNvData
->BootNext
== Index
) {
608 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
611 IfrOptionList
[Index
].OptionString
= NULL
;
614 (UINT16
) BOOT_NEXT_QUESTION_ID
,
616 STRING_TOKEN (STR_BOOT_NEXT
),
617 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
619 (UINTN
) (NumberOfOptions
+ 1),
622 Location
= Location
+ (NumberOfOptions
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
623 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
625 UpdateData
->DataCount
+= 3;
626 SafeFreePool (IfrOptionList
);
627 IfrOptionList
= NULL
;
630 UpdatePageEnd (CallbackData
, Location
);
635 IN BMM_CALLBACK_DATA
*CallbackData
641 Location
= (UINT8
*) &UpdateData
->Data
;
642 CallbackData
->BmmAskSaveOrNot
= TRUE
;
644 UpdatePageStart (CallbackData
, &Location
);
646 BootTimeOut
= BdsLibGetTimeout ();
648 CreateNumericOpCode (
649 (UINT16
) BOOT_TIME_OUT_QUESTION_ID
,
651 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
652 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
662 CallbackData
->BmmFakeNvData
->BootTimeOut
= (UINT16
) BootTimeOut
;
663 UpdateData
->DataCount
++;
664 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
666 UpdatePageEnd (CallbackData
, Location
);
671 IN BMM_CALLBACK_DATA
*CallbackData
677 IFR_OPTION
*IfrOptionList
;
678 BM_MENU_ENTRY
*NewMenuEntry
;
679 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
681 ZeroMem (UpdateData
, UPDATE_DATA_SIZE
);
682 Location
= (UINT8
*) &UpdateData
->Data
;
683 UpdatePageStart (CallbackData
, &Location
);
685 NewMenuEntry
= BOpt_GetMenuEntry (
687 CallbackData
->CurrentTerminal
694 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
696 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
697 if (!IfrOptionList
) {
701 for (Index
= 0; Index
< 19; Index
++) {
702 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
703 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
704 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
705 NewTerminalContext
->BaudRateIndex
= (UINT8
) Index
;
706 CallbackData
->BmmFakeNvData
->COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
709 IfrOptionList
[Index
].Flags
= CheckFlags
;
710 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_BAUD_RATE
;
711 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
712 IfrOptionList
[Index
].Value
= Index
;
716 (UINT16
) COM_BAUD_RATE_QUESTION_ID
,
718 STRING_TOKEN (STR_COM_BAUD_RATE
),
719 STRING_TOKEN (STR_COM_BAUD_RATE
),
725 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
726 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
727 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
728 UpdateData
->DataCount
+= 2;
730 SafeFreePool (IfrOptionList
);
732 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
733 if (!IfrOptionList
) {
737 for (Index
= 0; Index
< 4; Index
++) {
738 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
740 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
741 NewTerminalContext
->DataBitsIndex
= (UINT8
) Index
;
742 CallbackData
->BmmFakeNvData
->COMDataRate
= NewTerminalContext
->DataBitsIndex
;
743 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
746 IfrOptionList
[Index
].Flags
= CheckFlags
;
747 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_DATA_BITS
;
748 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
749 IfrOptionList
[Index
].Value
= Index
;
753 (UINT16
) COM_DATA_RATE_QUESTION_ID
,
755 STRING_TOKEN (STR_COM_DATA_BITS
),
756 STRING_TOKEN (STR_COM_DATA_BITS
),
762 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
763 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
764 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
765 UpdateData
->DataCount
+= 2;
767 SafeFreePool (IfrOptionList
);
769 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 5);
770 if (!IfrOptionList
) {
774 for (Index
= 0; Index
< 5; Index
++) {
775 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
776 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
777 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
778 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
779 CallbackData
->BmmFakeNvData
->COMParity
= NewTerminalContext
->ParityIndex
;
782 IfrOptionList
[Index
].Flags
= CheckFlags
;
783 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_PARITY
;
784 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
785 IfrOptionList
[Index
].Value
= Index
;
789 (UINT16
) COM_PARITY_QUESTION_ID
,
791 STRING_TOKEN (STR_COM_PARITY
),
792 STRING_TOKEN (STR_COM_PARITY
),
798 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
799 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
800 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
801 UpdateData
->DataCount
+= 2;
803 SafeFreePool (IfrOptionList
);
805 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 3);
806 if (!IfrOptionList
) {
810 for (Index
= 0; Index
< 3; Index
++) {
811 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
812 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
813 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
814 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
815 CallbackData
->BmmFakeNvData
->COMStopBits
= NewTerminalContext
->StopBitsIndex
;
818 IfrOptionList
[Index
].Flags
= CheckFlags
;
819 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_STOP_BITS
;
820 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
821 IfrOptionList
[Index
].Value
= Index
;
825 (UINT16
) COM_STOP_BITS_QUESTION_ID
,
827 STRING_TOKEN (STR_COM_STOP_BITS
),
828 STRING_TOKEN (STR_COM_STOP_BITS
),
834 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
835 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
836 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
837 UpdateData
->DataCount
+= 2;
839 SafeFreePool (IfrOptionList
);
841 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
842 if (!IfrOptionList
) {
846 for (Index
= 0; Index
< 4; Index
++) {
847 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
848 if (NewTerminalContext
->TerminalType
== Index
) {
849 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
850 CallbackData
->BmmFakeNvData
->COMTerminalType
= NewTerminalContext
->TerminalType
;
853 IfrOptionList
[Index
].Flags
= CheckFlags
;
854 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_TERMI_TYPE
;
855 IfrOptionList
[Index
].StringToken
= (STRING_REF
) TerminalType
[Index
];
856 IfrOptionList
[Index
].Value
= Index
;
860 (UINT16
) COM_TERMINAL_QUESTION_ID
,
862 STRING_TOKEN (STR_COM_TERMI_TYPE
),
863 STRING_TOKEN (STR_COM_TERMI_TYPE
),
869 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
870 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
871 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
872 UpdateData
->DataCount
+= 2;
874 SafeFreePool (IfrOptionList
);
878 STRING_TOKEN (STR_SAVE_AND_EXIT
),
879 STRING_TOKEN (STR_NULL_STRING
),
880 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
881 KEY_VALUE_SAVE_AND_EXIT
,
885 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
886 UpdateData
->DataCount
++;
890 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
891 STRING_TOKEN (STR_NULL_STRING
),
892 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
893 KEY_VALUE_NO_SAVE_AND_EXIT
,
897 UpdateData
->DataCount
++;
899 CallbackData
->Hii
->UpdateForm (
901 CallbackData
->BmmHiiHandle
,
902 (EFI_FORM_LABEL
) FORM_CON_COM_SETUP_ID
,
911 IN UINT16 UpdatePageId
,
912 IN BMM_CALLBACK_DATA
*CallbackData
915 CleanUpPage (UpdatePageId
, CallbackData
);
916 switch (UpdatePageId
) {
918 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
921 case FORM_CON_OUT_ID
:
922 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
925 case FORM_CON_ERR_ID
:
926 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
929 case FORM_BOOT_CHG_ID
:
930 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
933 case FORM_DRV_CHG_ID
:
934 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
943 GetLegacyBootOptionVar (
945 OUT UINTN
*OptionIndex
,
946 OUT UINTN
*OptionSize
949 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
962 // Get Boot Option number from the size of BootOrder
964 OrderBuffer
= BdsLibGetVariableAndSize (
966 &gEfiGlobalVariableGuid
,
970 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
971 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
972 OptionBuffer
= BdsLibGetVariableAndSize (
974 &gEfiGlobalVariableGuid
,
977 if (NULL
== OptionBuffer
) {
981 Ptr
= (UINT8
*) OptionBuffer
;
982 Attribute
= *(UINT32
*) Ptr
;
983 Ptr
+= sizeof (UINT32
);
985 FilePathSize
= *(UINT16
*) Ptr
;
986 Ptr
+= sizeof (UINT16
);
988 Description
= (CHAR16
*) Ptr
;
989 Ptr
+= StrSize ((CHAR16
*) Ptr
);
992 // Now Ptr point to Device Path
994 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
998 // Now Ptr point to Optional Data
1002 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1003 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1004 (BBS_BBS_DP
== DevicePath
->SubType
)
1006 *OptionIndex
= OrderBuffer
[Index
];
1007 SafeFreePool (OrderBuffer
);
1008 return OptionBuffer
;
1010 SafeFreePool (OptionBuffer
);
1014 SafeFreePool (OrderBuffer
);
1019 UpdateSetLegacyDeviceOrderPage (
1020 IN UINT16 UpdatePageId
,
1021 IN BMM_CALLBACK_DATA
*CallbackData
1024 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1025 BM_MENU_OPTION
*OptionMenu
;
1026 BM_MENU_ENTRY
*NewMenuEntry
;
1027 IFR_OPTION
*IfrOptionList
;
1029 STRING_REF StrRefHelp
;
1039 CHAR16
*TypeStrHelp
;
1054 BbsType
= BBS_FLOPPY
;
1059 Location
= (UINT8
*) &UpdateData
->Data
;
1060 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1062 UpdatePageStart (CallbackData
, &Location
);
1064 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1066 SetMem (DisMap
, 32, 0);
1068 // Create oneof option list
1070 switch (UpdatePageId
) {
1071 case FORM_SET_FD_ORDER_ID
:
1072 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1073 Key
= LEGACY_FD_QUESTION_ID
;
1074 TypeStr
= StrFloppy
;
1075 TypeStrHelp
= StrFloppyHelp
;
1076 BbsType
= BBS_FLOPPY
;
1077 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyFD
;
1078 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1081 case FORM_SET_HD_ORDER_ID
:
1082 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1083 Key
= LEGACY_HD_QUESTION_ID
;
1084 TypeStr
= StrHardDisk
;
1085 TypeStrHelp
= StrHardDiskHelp
;
1086 BbsType
= BBS_HARDDISK
;
1087 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyHD
;
1088 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1091 case FORM_SET_CD_ORDER_ID
:
1092 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1093 Key
= LEGACY_CD_QUESTION_ID
;
1095 TypeStrHelp
= StrCDROMHelp
;
1096 BbsType
= BBS_CDROM
;
1097 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyCD
;
1098 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1101 case FORM_SET_NET_ORDER_ID
:
1102 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1103 Key
= LEGACY_NET_QUESTION_ID
;
1105 TypeStrHelp
= StrNETHelp
;
1106 BbsType
= BBS_EMBED_NETWORK
;
1107 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyNET
;
1108 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1111 case FORM_SET_BEV_ORDER_ID
:
1112 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1113 Key
= LEGACY_BEV_QUESTION_ID
;
1115 TypeStrHelp
= StrBEVHelp
;
1116 BbsType
= BBS_BEV_DEVICE
;
1117 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyBEV
;
1118 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1123 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1125 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1126 if (NULL
== IfrOptionList
) {
1130 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1131 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1132 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1134 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
1137 IfrOptionList
[Index
].Key
= Key
;
1138 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1139 IfrOptionList
[Index
].Value
= (UINT16
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1140 IfrOptionList
[Index
].OptionString
= NULL
;
1143 // for item "Disabled"
1145 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1146 IfrOptionList
[Index
].Key
= Key
;
1147 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1148 IfrOptionList
[Index
].Value
= 0xFF;
1149 IfrOptionList
[Index
].OptionString
= NULL
;
1152 // Get Device Order from variable
1154 VarData
= BdsLibGetVariableAndSize (
1156 &EfiLegacyDevOrderGuid
,
1160 if (NULL
!= VarData
) {
1161 OriginalPtr
= VarData
;
1162 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1163 while (VarData
< VarData
+ VarSize
) {
1164 if (DevOrder
->BbsType
== BbsType
) {
1168 VarData
+= sizeof (BBS_TYPE
);
1169 VarData
+= *(UINT16
*) VarData
;
1170 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1173 // Create oneof tag here for FD/HD/CD #1 #2
1175 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1176 for (Index2
= 0; Index2
<= OptionMenu
->MenuNumber
; Index2
++) {
1177 IfrOptionList
[Index2
].Key
= (UINT16
) (Key
+ Index
);
1180 // Create the string for oneof tag
1182 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1184 CallbackData
->Hii
->NewString (
1187 CallbackData
->BmmHiiHandle
,
1192 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1194 CallbackData
->Hii
->NewString (
1197 CallbackData
->BmmHiiHandle
,
1203 (UINT16
) (Key
+ Index
),
1208 OptionMenu
->MenuNumber
+ 1,
1212 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1214 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1215 LegacyOrder
[Index
] = 0xFF;
1216 Pos
= (VarDevOrder
& 0xFF) / 8;
1217 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1218 DisMap
[Pos
] |= (UINT8
) (1 << Bit
);
1220 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1223 Location
= Location
+ (OptionMenu
->MenuNumber
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1224 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1225 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ (OptionMenu
->MenuNumber
+ 3));
1235 if (IfrOptionList
!= NULL
) {
1236 SafeFreePool (IfrOptionList
);
1237 IfrOptionList
= NULL
;
1240 UpdatePageEnd (CallbackData
, Location
);
1245 BMM_CALLBACK_DATA
*Private
,
1249 UINT16 FileOptionMask
;
1251 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& NewPageId
);
1253 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1255 // If we select a handle to add driver option, advance to the add handle description page.
1257 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1258 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1260 // Return to main page after "Save Changes" or "Discard Changes".
1262 NewPageId
= FORM_MAIN_ID
;
1265 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1266 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1267 Private
->BmmCurrentPageId
= NewPageId
;