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.
16 // Include common header file for this module.
18 #include "CommonHeader.h"
20 #include "Generic/Bds.h"
21 #include "BootMaint.h"
22 #include "BdsPlatform.h"
24 EFI_GUID gTerminalDriverGuid
= {
25 0x9E863906, 0xA40F, 0x4875, {0x97, 0x7F, 0x5B, 0x93, 0xFF, 0x23, 0x7F, 0xC6}
30 IN BOOLEAN FormSetUpdate
,
31 IN EFI_PHYSICAL_ADDRESS FormCallbackHandle
,
32 IN BOOLEAN FormUpdate
,
33 IN STRING_REF FormTitle
,
38 Refresh the global UpdateData structure.
41 FormSetUpdate - If TRUE, next variable is significant
42 FormCallbackHandle - If not 0, will update FormSet with this info
43 FormUpdate - If TRUE, next variable is significant
44 FormTitle - If not 0, will update Form with this info
45 DataCount - The number of Data entries in this structure
51 UpdateData
->FormSetUpdate
= FormSetUpdate
;
53 ASSERT (0 != FormCallbackHandle
);
54 UpdateData
->FormCallbackHandle
= FormCallbackHandle
;
57 UpdateData
->FormUpdate
= FALSE
;
58 UpdateData
->FormTitle
= FormTitle
;
59 UpdateData
->DataCount
= DataCount
;
64 IN BMM_CALLBACK_DATA
*CallbackData
,
65 IN OUT UINT8
**CurrentLocation
68 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->BmmCallbackHandle
, FALSE
, 0, 0);
70 if (!(CallbackData
->BmmAskSaveOrNot
)) {
72 // Add a "Go back to main page" tag in front of the form when there are no
73 // "Apply changes" and "Discard changes" tags in the end of the form.
77 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
78 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
79 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
84 UpdateData
->DataCount
++;
86 *CurrentLocation
= *CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) (*CurrentLocation
))->Length
;
93 IN BMM_CALLBACK_DATA
*CallbackData
,
94 IN UINT8
*CurrentLocation
98 // Create the "Apply changes" and "Discard changes" tags.
100 if (CallbackData
->BmmAskSaveOrNot
) {
103 STRING_TOKEN (STR_SAVE_AND_EXIT
),
104 STRING_TOKEN (STR_NULL_STRING
),
105 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
106 KEY_VALUE_SAVE_AND_EXIT
,
110 UpdateData
->DataCount
++;
112 CurrentLocation
= CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) CurrentLocation
)->Length
;
116 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
117 STRING_TOKEN (STR_NULL_STRING
),
118 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
119 KEY_VALUE_NO_SAVE_AND_EXIT
,
123 UpdateData
->DataCount
++;
126 // Ensure user can return to the main page.
128 if (0 == UpdateData
->DataCount
) {
131 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
132 STRING_TOKEN (STR_NULL_STRING
),
133 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
134 KEY_VALUE_NO_SAVE_AND_EXIT
,
138 UpdateData
->DataCount
++;
141 CallbackData
->Hii
->UpdateForm (
143 CallbackData
->BmmHiiHandle
,
144 CallbackData
->BmmCurrentPageId
,
152 IN EFI_FORM_LABEL LabelId
,
153 IN BMM_CALLBACK_DATA
*CallbackData
156 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
159 // Remove all op-codes from dynamic page
161 CallbackData
->Hii
->UpdateForm (
163 CallbackData
->BmmHiiHandle
,
172 IN BM_FILE_CONTEXT
*FileContext
178 BDS_COMMON_OPTION
*Option
;
180 Option
= AllocatePool (sizeof (BDS_COMMON_OPTION
));
182 Option
->Description
= FileContext
->FileName
;
183 Option
->DevicePath
= FileContext
->DevicePath
;
184 Option
->LoadOptionsSize
= 0;
185 Option
->LoadOptions
= NULL
;
188 // Since current no boot from removable media directly is allowed */
190 gST
->ConOut
->ClearScreen (gST
->ConOut
);
194 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
202 IN BMM_CALLBACK_DATA
*CallbackData
205 BM_MENU_ENTRY
*NewMenuEntry
;
211 Location
= (UINT8
*) &UpdateData
->Data
;
212 CallbackData
->BmmAskSaveOrNot
= FALSE
;
214 UpdatePageStart (CallbackData
, &Location
);
216 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
217 if (!EFI_ERROR (Status
)) {
218 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
219 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
222 FORM_CON_COM_SETUP_ID
,
223 NewMenuEntry
->DisplayStringToken
,
224 STRING_TOKEN (STR_NULL_STRING
),
225 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
226 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
229 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
230 UpdateData
->DataCount
++;
234 UpdatePageEnd (CallbackData
, Location
);
239 IN BMM_CALLBACK_DATA
*CallbackData
242 BM_MENU_ENTRY
*NewMenuEntry
;
243 BM_LOAD_CONTEXT
*NewLoadContext
;
247 Location
= (UINT8
*) &UpdateData
->Data
;
248 CallbackData
->BmmAskSaveOrNot
= TRUE
;
250 UpdatePageStart (CallbackData
, &Location
);
251 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
253 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
254 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
255 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
256 if (NewLoadContext
->IsLegacy
) {
260 NewLoadContext
->Deleted
= FALSE
;
261 CallbackData
->BmmFakeNvData
->BootOptionDel
[Index
] = 0x00;
263 CreateCheckBoxOpCode (
264 (UINT16
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
266 NewMenuEntry
->DisplayStringToken
,
267 NewMenuEntry
->HelpStringToken
,
268 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
269 (UINT16
) BOOT_OPTION_DEL_QUESTION_ID
,
273 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
274 UpdateData
->DataCount
++;
277 UpdatePageEnd (CallbackData
, Location
);
281 UpdateDrvAddHandlePage (
282 IN BMM_CALLBACK_DATA
*CallbackData
285 BM_MENU_ENTRY
*NewMenuEntry
;
289 Location
= (UINT8
*) &UpdateData
->Data
;
290 CallbackData
->BmmAskSaveOrNot
= FALSE
;
292 UpdatePageStart (CallbackData
, &Location
);
294 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
295 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
298 FORM_DRV_ADD_HANDLE_DESC_ID
,
299 NewMenuEntry
->DisplayStringToken
,
300 STRING_TOKEN (STR_NULL_STRING
),
301 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
302 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
306 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
307 UpdateData
->DataCount
++;
310 UpdatePageEnd (CallbackData
, Location
);
315 IN BMM_CALLBACK_DATA
*CallbackData
318 BM_MENU_ENTRY
*NewMenuEntry
;
319 BM_LOAD_CONTEXT
*NewLoadContext
;
323 Location
= (UINT8
*) &UpdateData
->Data
;
324 CallbackData
->BmmAskSaveOrNot
= TRUE
;
326 UpdatePageStart (CallbackData
, &Location
);
328 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
330 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
331 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
333 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
334 NewLoadContext
->Deleted
= FALSE
;
335 CallbackData
->BmmFakeNvData
->DriverOptionDel
[Index
] = 0x00;
337 CreateCheckBoxOpCode (
338 (UINT16
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
340 NewMenuEntry
->DisplayStringToken
,
341 NewMenuEntry
->HelpStringToken
,
342 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
343 (UINT16
) DRIVER_OPTION_DEL_QUESTION_ID
,
347 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
348 UpdateData
->DataCount
++;
351 UpdatePageEnd (CallbackData
, Location
);
355 UpdateDriverAddHandleDescPage (
356 IN BMM_CALLBACK_DATA
*CallbackData
359 BM_MENU_ENTRY
*NewMenuEntry
;
362 Location
= (UINT8
*) &UpdateData
->Data
;
363 CallbackData
->BmmFakeNvData
->DriverAddActive
= 0x01;
364 CallbackData
->BmmFakeNvData
->DriverAddForceReconnect
= 0x00;
365 CallbackData
->BmmAskSaveOrNot
= TRUE
;
366 NewMenuEntry
= CallbackData
->MenuEntry
;
368 UpdatePageStart (CallbackData
, &Location
);
370 UpdateData
->DataCount
+= (UINT16
) 4;
372 CreateSubTitleOpCode (
373 NewMenuEntry
->DisplayStringToken
,
377 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
380 DRV_ADD_HANDLE_DESC_QUESTION_ID
,
382 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
383 STRING_TOKEN (STR_NULL_STRING
),
386 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
387 KEY_VALUE_DRIVER_ADD_DESC_DATA
,
391 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
393 CreateCheckBoxOpCode (
394 DRV_ADD_RECON_QUESTION_ID
,
396 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
397 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
398 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
399 DRV_ADD_RECON_QUESTION_ID
,
402 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
405 DRIVER_ADD_OPTION_QUESTION_ID
,
407 STRING_TOKEN (STR_OPTIONAL_DATA
),
408 STRING_TOKEN (STR_NULL_STRING
),
411 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
412 KEY_VALUE_DRIVER_ADD_OPT_DATA
,
416 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
417 UpdatePageEnd (CallbackData
, Location
);
422 IN UINT16 UpdatePageId
,
423 IN BM_MENU_OPTION
*ConsoleMenu
,
424 IN BMM_CALLBACK_DATA
*CallbackData
427 BM_MENU_ENTRY
*NewMenuEntry
;
428 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
429 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
437 Location
= (UINT8
*) &UpdateData
->Data
;
438 CallbackData
->BmmAskSaveOrNot
= TRUE
;
440 UpdatePageStart (CallbackData
, &Location
);
442 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
443 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
444 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
445 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
446 if (NewConsoleContext
->IsActive
) {
447 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
448 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
450 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
453 CreateCheckBoxOpCode (
454 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
456 NewMenuEntry
->DisplayStringToken
,
457 NewMenuEntry
->HelpStringToken
,
459 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
462 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
463 UpdateData
->DataCount
++;
466 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
467 if (!EFI_ERROR (Status
)) {
468 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
469 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
470 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
471 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
473 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
474 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
475 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
477 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
478 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
480 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
483 CreateCheckBoxOpCode (
484 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
486 NewMenuEntry
->DisplayStringToken
,
487 NewMenuEntry
->HelpStringToken
,
489 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
492 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
493 UpdateData
->DataCount
++;
498 UpdatePageEnd (CallbackData
, Location
);
503 IN UINT16 UpdatePageId
,
504 IN BM_MENU_OPTION
*OptionMenu
,
505 IN BMM_CALLBACK_DATA
*CallbackData
508 BM_MENU_ENTRY
*NewMenuEntry
;
511 IFR_OPTION
*IfrOptionList
;
513 Location
= (UINT8
*) &UpdateData
->Data
;
514 CallbackData
->BmmAskSaveOrNot
= TRUE
;
516 UpdatePageStart (CallbackData
, &Location
);
518 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
520 ZeroMem (CallbackData
->BmmFakeNvData
->OptionOrder
, 100);
522 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
523 if (NULL
== IfrOptionList
) {
527 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
528 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
529 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
530 IfrOptionList
[Index
].Value
= (UINT16
) (NewMenuEntry
->OptionNumber
+ 1);
531 IfrOptionList
[Index
].OptionString
= NULL
;
532 CallbackData
->BmmFakeNvData
->OptionOrder
[Index
] = (UINT8
) (IfrOptionList
[Index
].Value
);
535 if (OptionMenu
->MenuNumber
> 0) {
536 CreateOrderedListOpCode (
537 (UINT16
) OPTION_ORDER_QUESTION_ID
,
539 STRING_TOKEN (STR_CHANGE_ORDER
),
540 STRING_TOKEN (STR_CHANGE_ORDER
),
542 OptionMenu
->MenuNumber
,
546 for (Index
= 0; Index
< OptionMenu
->MenuNumber
+ 2; Index
++) {
547 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
550 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ OptionMenu
->MenuNumber
+ 2);
553 SafeFreePool (IfrOptionList
);
555 UpdatePageEnd (CallbackData
, Location
);
558 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
559 CallbackData
->BmmFakeNvData
->OptionOrder
,
566 IN BMM_CALLBACK_DATA
*CallbackData
570 BM_MENU_ENTRY
*NewMenuEntry
;
571 BM_LOAD_CONTEXT
*NewLoadContext
;
572 IFR_OPTION
*IfrOptionList
;
573 UINTN NumberOfOptions
;
576 Location
= (UINT8
*) &UpdateData
->Data
;
577 IfrOptionList
= NULL
;
578 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
579 CallbackData
->BmmAskSaveOrNot
= TRUE
;
581 UpdatePageStart (CallbackData
, &Location
);
582 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
584 if (NumberOfOptions
> 0) {
585 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ NumberOfOptions
);
586 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
588 ASSERT (IfrOptionList
);
590 CallbackData
->BmmFakeNvData
->BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
592 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
593 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
594 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
595 if (NewLoadContext
->IsBootNext
) {
596 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_DEFAULT
| EFI_IFR_FLAG_INTERACTIVE
;
597 CallbackData
->BmmFakeNvData
->BootNext
= Index
;
599 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
602 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
603 IfrOptionList
[Index
].Value
= Index
;
604 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
605 IfrOptionList
[Index
].OptionString
= NULL
;
608 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
609 IfrOptionList
[Index
].Value
= Index
;
610 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
611 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
612 if (CallbackData
->BmmFakeNvData
->BootNext
== Index
) {
613 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
616 IfrOptionList
[Index
].OptionString
= NULL
;
619 (UINT16
) BOOT_NEXT_QUESTION_ID
,
621 STRING_TOKEN (STR_BOOT_NEXT
),
622 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
624 (UINTN
) (NumberOfOptions
+ 1),
627 Location
= Location
+ (NumberOfOptions
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
628 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
630 UpdateData
->DataCount
+= 3;
631 SafeFreePool (IfrOptionList
);
632 IfrOptionList
= NULL
;
635 UpdatePageEnd (CallbackData
, Location
);
640 IN BMM_CALLBACK_DATA
*CallbackData
646 Location
= (UINT8
*) &UpdateData
->Data
;
647 CallbackData
->BmmAskSaveOrNot
= TRUE
;
649 UpdatePageStart (CallbackData
, &Location
);
651 BootTimeOut
= BdsLibGetTimeout ();
653 CreateNumericOpCode (
654 (UINT16
) BOOT_TIME_OUT_QUESTION_ID
,
656 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
657 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
667 CallbackData
->BmmFakeNvData
->BootTimeOut
= (UINT16
) BootTimeOut
;
668 UpdateData
->DataCount
++;
669 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
671 UpdatePageEnd (CallbackData
, Location
);
676 IN BMM_CALLBACK_DATA
*CallbackData
682 IFR_OPTION
*IfrOptionList
;
683 BM_MENU_ENTRY
*NewMenuEntry
;
684 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
686 ZeroMem (UpdateData
, UPDATE_DATA_SIZE
);
687 Location
= (UINT8
*) &UpdateData
->Data
;
688 UpdatePageStart (CallbackData
, &Location
);
690 NewMenuEntry
= BOpt_GetMenuEntry (
692 CallbackData
->CurrentTerminal
699 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
701 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
702 if (!IfrOptionList
) {
706 for (Index
= 0; Index
< 19; Index
++) {
707 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
708 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
709 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
710 NewTerminalContext
->BaudRateIndex
= (UINT8
) Index
;
711 CallbackData
->BmmFakeNvData
->COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
714 IfrOptionList
[Index
].Flags
= CheckFlags
;
715 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_BAUD_RATE
;
716 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
717 IfrOptionList
[Index
].Value
= Index
;
721 (UINT16
) COM_BAUD_RATE_QUESTION_ID
,
723 STRING_TOKEN (STR_COM_BAUD_RATE
),
724 STRING_TOKEN (STR_COM_BAUD_RATE
),
730 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
731 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
732 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
733 UpdateData
->DataCount
+= 2;
735 SafeFreePool (IfrOptionList
);
737 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
738 if (!IfrOptionList
) {
742 for (Index
= 0; Index
< 4; Index
++) {
743 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
745 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
746 NewTerminalContext
->DataBitsIndex
= (UINT8
) Index
;
747 CallbackData
->BmmFakeNvData
->COMDataRate
= NewTerminalContext
->DataBitsIndex
;
748 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
751 IfrOptionList
[Index
].Flags
= CheckFlags
;
752 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_DATA_BITS
;
753 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
754 IfrOptionList
[Index
].Value
= Index
;
758 (UINT16
) COM_DATA_RATE_QUESTION_ID
,
760 STRING_TOKEN (STR_COM_DATA_BITS
),
761 STRING_TOKEN (STR_COM_DATA_BITS
),
767 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
768 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
769 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
770 UpdateData
->DataCount
+= 2;
772 SafeFreePool (IfrOptionList
);
774 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 5);
775 if (!IfrOptionList
) {
779 for (Index
= 0; Index
< 5; Index
++) {
780 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
781 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
782 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
783 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
784 CallbackData
->BmmFakeNvData
->COMParity
= NewTerminalContext
->ParityIndex
;
787 IfrOptionList
[Index
].Flags
= CheckFlags
;
788 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_PARITY
;
789 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
790 IfrOptionList
[Index
].Value
= Index
;
794 (UINT16
) COM_PARITY_QUESTION_ID
,
796 STRING_TOKEN (STR_COM_PARITY
),
797 STRING_TOKEN (STR_COM_PARITY
),
803 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
804 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
805 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
806 UpdateData
->DataCount
+= 2;
808 SafeFreePool (IfrOptionList
);
810 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 3);
811 if (!IfrOptionList
) {
815 for (Index
= 0; Index
< 3; Index
++) {
816 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
817 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
818 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
819 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
820 CallbackData
->BmmFakeNvData
->COMStopBits
= NewTerminalContext
->StopBitsIndex
;
823 IfrOptionList
[Index
].Flags
= CheckFlags
;
824 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_STOP_BITS
;
825 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
826 IfrOptionList
[Index
].Value
= Index
;
830 (UINT16
) COM_STOP_BITS_QUESTION_ID
,
832 STRING_TOKEN (STR_COM_STOP_BITS
),
833 STRING_TOKEN (STR_COM_STOP_BITS
),
839 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
840 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
841 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
842 UpdateData
->DataCount
+= 2;
844 SafeFreePool (IfrOptionList
);
846 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
847 if (!IfrOptionList
) {
851 for (Index
= 0; Index
< 4; Index
++) {
852 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
853 if (NewTerminalContext
->TerminalType
== Index
) {
854 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
855 CallbackData
->BmmFakeNvData
->COMTerminalType
= NewTerminalContext
->TerminalType
;
858 IfrOptionList
[Index
].Flags
= CheckFlags
;
859 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_TERMI_TYPE
;
860 IfrOptionList
[Index
].StringToken
= (STRING_REF
) TerminalType
[Index
];
861 IfrOptionList
[Index
].Value
= Index
;
865 (UINT16
) COM_TERMINAL_QUESTION_ID
,
867 STRING_TOKEN (STR_COM_TERMI_TYPE
),
868 STRING_TOKEN (STR_COM_TERMI_TYPE
),
874 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
875 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
876 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
877 UpdateData
->DataCount
+= 2;
879 SafeFreePool (IfrOptionList
);
883 STRING_TOKEN (STR_SAVE_AND_EXIT
),
884 STRING_TOKEN (STR_NULL_STRING
),
885 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
886 KEY_VALUE_SAVE_AND_EXIT
,
890 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
891 UpdateData
->DataCount
++;
895 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
896 STRING_TOKEN (STR_NULL_STRING
),
897 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
898 KEY_VALUE_NO_SAVE_AND_EXIT
,
902 UpdateData
->DataCount
++;
904 CallbackData
->Hii
->UpdateForm (
906 CallbackData
->BmmHiiHandle
,
907 (EFI_FORM_LABEL
) FORM_CON_COM_SETUP_ID
,
916 IN UINT16 UpdatePageId
,
917 IN BMM_CALLBACK_DATA
*CallbackData
920 CleanUpPage (UpdatePageId
, CallbackData
);
921 switch (UpdatePageId
) {
923 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
926 case FORM_CON_OUT_ID
:
927 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
930 case FORM_CON_ERR_ID
:
931 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
934 case FORM_BOOT_CHG_ID
:
935 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
938 case FORM_DRV_CHG_ID
:
939 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
948 GetLegacyBootOptionVar (
950 OUT UINTN
*OptionIndex
,
951 OUT UINTN
*OptionSize
954 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
967 // Get Boot Option number from the size of BootOrder
969 OrderBuffer
= BdsLibGetVariableAndSize (
971 &gEfiGlobalVariableGuid
,
975 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
976 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
977 OptionBuffer
= BdsLibGetVariableAndSize (
979 &gEfiGlobalVariableGuid
,
982 if (NULL
== OptionBuffer
) {
986 Ptr
= (UINT8
*) OptionBuffer
;
987 Attribute
= *(UINT32
*) Ptr
;
988 Ptr
+= sizeof (UINT32
);
990 FilePathSize
= *(UINT16
*) Ptr
;
991 Ptr
+= sizeof (UINT16
);
993 Description
= (CHAR16
*) Ptr
;
994 Ptr
+= StrSize ((CHAR16
*) Ptr
);
997 // Now Ptr point to Device Path
999 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1000 Ptr
+= FilePathSize
;
1003 // Now Ptr point to Optional Data
1007 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1008 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1009 (BBS_BBS_DP
== DevicePath
->SubType
)
1011 *OptionIndex
= OrderBuffer
[Index
];
1012 SafeFreePool (OrderBuffer
);
1013 return OptionBuffer
;
1015 SafeFreePool (OptionBuffer
);
1019 SafeFreePool (OrderBuffer
);
1024 UpdateSetLegacyDeviceOrderPage (
1025 IN UINT16 UpdatePageId
,
1026 IN BMM_CALLBACK_DATA
*CallbackData
1029 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1030 BM_MENU_OPTION
*OptionMenu
;
1031 BM_MENU_ENTRY
*NewMenuEntry
;
1032 IFR_OPTION
*IfrOptionList
;
1034 STRING_REF StrRefHelp
;
1044 CHAR16
*TypeStrHelp
;
1059 BbsType
= BBS_FLOPPY
;
1064 Location
= (UINT8
*) &UpdateData
->Data
;
1065 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1067 UpdatePageStart (CallbackData
, &Location
);
1069 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1071 SetMem (DisMap
, 32, 0);
1073 // Create oneof option list
1075 switch (UpdatePageId
) {
1076 case FORM_SET_FD_ORDER_ID
:
1077 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1078 Key
= LEGACY_FD_QUESTION_ID
;
1079 TypeStr
= StrFloppy
;
1080 TypeStrHelp
= StrFloppyHelp
;
1081 BbsType
= BBS_FLOPPY
;
1082 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyFD
;
1083 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1086 case FORM_SET_HD_ORDER_ID
:
1087 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1088 Key
= LEGACY_HD_QUESTION_ID
;
1089 TypeStr
= StrHardDisk
;
1090 TypeStrHelp
= StrHardDiskHelp
;
1091 BbsType
= BBS_HARDDISK
;
1092 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyHD
;
1093 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1096 case FORM_SET_CD_ORDER_ID
:
1097 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1098 Key
= LEGACY_CD_QUESTION_ID
;
1100 TypeStrHelp
= StrCDROMHelp
;
1101 BbsType
= BBS_CDROM
;
1102 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyCD
;
1103 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1106 case FORM_SET_NET_ORDER_ID
:
1107 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1108 Key
= LEGACY_NET_QUESTION_ID
;
1110 TypeStrHelp
= StrNETHelp
;
1111 BbsType
= BBS_EMBED_NETWORK
;
1112 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyNET
;
1113 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1116 case FORM_SET_BEV_ORDER_ID
:
1117 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1118 Key
= LEGACY_BEV_QUESTION_ID
;
1120 TypeStrHelp
= StrBEVHelp
;
1121 BbsType
= BBS_BEV_DEVICE
;
1122 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyBEV
;
1123 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1128 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1130 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1131 if (NULL
== IfrOptionList
) {
1135 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1136 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1137 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1139 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
1142 IfrOptionList
[Index
].Key
= Key
;
1143 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1144 IfrOptionList
[Index
].Value
= (UINT16
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1145 IfrOptionList
[Index
].OptionString
= NULL
;
1148 // for item "Disabled"
1150 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1151 IfrOptionList
[Index
].Key
= Key
;
1152 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1153 IfrOptionList
[Index
].Value
= 0xFF;
1154 IfrOptionList
[Index
].OptionString
= NULL
;
1157 // Get Device Order from variable
1159 VarData
= BdsLibGetVariableAndSize (
1161 &EfiLegacyDevOrderGuid
,
1165 if (NULL
!= VarData
) {
1166 OriginalPtr
= VarData
;
1167 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1168 while (VarData
< VarData
+ VarSize
) {
1169 if (DevOrder
->BbsType
== BbsType
) {
1173 VarData
+= sizeof (BBS_TYPE
);
1174 VarData
+= *(UINT16
*) VarData
;
1175 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1178 // Create oneof tag here for FD/HD/CD #1 #2
1180 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1181 for (Index2
= 0; Index2
<= OptionMenu
->MenuNumber
; Index2
++) {
1182 IfrOptionList
[Index2
].Key
= (UINT16
) (Key
+ Index
);
1185 // Create the string for oneof tag
1187 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1189 CallbackData
->Hii
->NewString (
1192 CallbackData
->BmmHiiHandle
,
1197 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1199 CallbackData
->Hii
->NewString (
1202 CallbackData
->BmmHiiHandle
,
1208 (UINT16
) (Key
+ Index
),
1213 OptionMenu
->MenuNumber
+ 1,
1217 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1219 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1220 LegacyOrder
[Index
] = 0xFF;
1221 Pos
= (VarDevOrder
& 0xFF) / 8;
1222 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1223 DisMap
[Pos
] |= (UINT8
) (1 << Bit
);
1225 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1228 Location
= Location
+ (OptionMenu
->MenuNumber
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1229 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1230 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ (OptionMenu
->MenuNumber
+ 3));
1240 if (IfrOptionList
!= NULL
) {
1241 SafeFreePool (IfrOptionList
);
1242 IfrOptionList
= NULL
;
1245 UpdatePageEnd (CallbackData
, Location
);
1250 BMM_CALLBACK_DATA
*Private
,
1254 UINT16 FileOptionMask
;
1256 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& NewPageId
);
1258 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1260 // If we select a handle to add driver option, advance to the add handle description page.
1262 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1263 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1265 // Return to main page after "Save Changes" or "Discard Changes".
1267 NewPageId
= FORM_MAIN_ID
;
1270 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1271 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1272 Private
->BmmCurrentPageId
= NewPageId
;