3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Dynamically Update the pages
22 #include "Generic/Bds.h"
23 #include "BootMaint.h"
24 #include "BdsPlatform.h"
26 EFI_GUID gTerminalDriverGuid
= {
27 0x10634d8e, 0x1c05, 0x46cb, 0xbb, 0xc, 0x5a, 0xfd, 0xc8, 0x29, 0xa8, 0xc8
32 IN BOOLEAN FormSetUpdate
,
33 IN EFI_PHYSICAL_ADDRESS FormCallbackHandle
,
34 IN BOOLEAN FormUpdate
,
35 IN STRING_REF FormTitle
,
40 Refresh the global UpdateData structure.
43 FormSetUpdate - If TRUE, next variable is significant
44 FormCallbackHandle - If not 0, will update FormSet with this info
45 FormUpdate - If TRUE, next variable is significant
46 FormTitle - If not 0, will update Form with this info
47 DataCount - The number of Data entries in this structure
53 UpdateData
->FormSetUpdate
= FormSetUpdate
;
55 ASSERT (0 != FormCallbackHandle
);
56 UpdateData
->FormCallbackHandle
= FormCallbackHandle
;
59 UpdateData
->FormUpdate
= FALSE
;
60 UpdateData
->FormTitle
= FormTitle
;
61 UpdateData
->DataCount
= DataCount
;
66 IN BMM_CALLBACK_DATA
*CallbackData
,
67 IN OUT UINT8
**CurrentLocation
70 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->BmmCallbackHandle
, FALSE
, 0, 0);
72 if (!(CallbackData
->BmmAskSaveOrNot
)) {
74 // Add a "Go back to main page" tag in front of the form when there are no
75 // "Apply changes" and "Discard changes" tags in the end of the form.
79 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
80 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
81 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
86 UpdateData
->DataCount
++;
88 *CurrentLocation
= *CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) (*CurrentLocation
))->Length
;
95 IN BMM_CALLBACK_DATA
*CallbackData
,
96 IN UINT8
*CurrentLocation
100 // Create the "Apply changes" and "Discard changes" tags.
102 if (CallbackData
->BmmAskSaveOrNot
) {
105 STRING_TOKEN (STR_SAVE_AND_EXIT
),
106 STRING_TOKEN (STR_NULL_STRING
),
107 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
108 KEY_VALUE_SAVE_AND_EXIT
,
112 UpdateData
->DataCount
++;
114 CurrentLocation
= CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) CurrentLocation
)->Length
;
118 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
119 STRING_TOKEN (STR_NULL_STRING
),
120 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
121 KEY_VALUE_NO_SAVE_AND_EXIT
,
125 UpdateData
->DataCount
++;
128 // Ensure user can return to the main page.
130 if (0 == UpdateData
->DataCount
) {
133 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
134 STRING_TOKEN (STR_NULL_STRING
),
135 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
136 KEY_VALUE_NO_SAVE_AND_EXIT
,
140 UpdateData
->DataCount
++;
143 CallbackData
->Hii
->UpdateForm (
145 CallbackData
->BmmHiiHandle
,
146 CallbackData
->BmmCurrentPageId
,
154 IN EFI_FORM_LABEL LabelId
,
155 IN BMM_CALLBACK_DATA
*CallbackData
158 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
161 // Remove all op-codes from dynamic page
163 CallbackData
->Hii
->UpdateForm (
165 CallbackData
->BmmHiiHandle
,
174 IN BM_FILE_CONTEXT
*FileContext
180 BDS_COMMON_OPTION
*Option
;
182 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), &Option
);
183 Option
->Description
= 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
);
203 IN BMM_CALLBACK_DATA
*CallbackData
206 BM_MENU_ENTRY
*NewMenuEntry
;
212 Location
= (UINT8
*) &UpdateData
->Data
;
213 CallbackData
->BmmAskSaveOrNot
= FALSE
;
215 UpdatePageStart (CallbackData
, &Location
);
217 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
218 if (!EFI_ERROR (Status
)) {
219 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
220 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
223 FORM_CON_COM_SETUP_ID
,
224 NewMenuEntry
->DisplayStringToken
,
225 STRING_TOKEN (STR_NULL_STRING
),
226 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
227 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
230 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
231 UpdateData
->DataCount
++;
235 UpdatePageEnd (CallbackData
, Location
);
240 IN BMM_CALLBACK_DATA
*CallbackData
243 BM_MENU_ENTRY
*NewMenuEntry
;
244 BM_LOAD_CONTEXT
*NewLoadContext
;
248 Location
= (UINT8
*) &UpdateData
->Data
;
249 CallbackData
->BmmAskSaveOrNot
= TRUE
;
251 UpdatePageStart (CallbackData
, &Location
);
252 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
254 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
255 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
256 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
257 if (NewLoadContext
->IsLegacy
) {
261 NewLoadContext
->Deleted
= FALSE
;
262 CallbackData
->BmmFakeNvData
->BootOptionDel
[Index
] = 0x00;
264 CreateCheckBoxOpCode (
265 (UINT16
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
267 NewMenuEntry
->DisplayStringToken
,
268 NewMenuEntry
->HelpStringToken
,
269 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
270 (UINT16
) BOOT_OPTION_DEL_QUESTION_ID
,
274 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
275 UpdateData
->DataCount
++;
278 UpdatePageEnd (CallbackData
, Location
);
282 UpdateDrvAddHandlePage (
283 IN BMM_CALLBACK_DATA
*CallbackData
286 BM_MENU_ENTRY
*NewMenuEntry
;
290 Location
= (UINT8
*) &UpdateData
->Data
;
291 CallbackData
->BmmAskSaveOrNot
= FALSE
;
293 UpdatePageStart (CallbackData
, &Location
);
295 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
296 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
299 FORM_DRV_ADD_HANDLE_DESC_ID
,
300 NewMenuEntry
->DisplayStringToken
,
301 STRING_TOKEN (STR_NULL_STRING
),
302 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
303 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
307 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
308 UpdateData
->DataCount
++;
311 UpdatePageEnd (CallbackData
, Location
);
316 IN BMM_CALLBACK_DATA
*CallbackData
319 BM_MENU_ENTRY
*NewMenuEntry
;
320 BM_LOAD_CONTEXT
*NewLoadContext
;
324 Location
= (UINT8
*) &UpdateData
->Data
;
325 CallbackData
->BmmAskSaveOrNot
= TRUE
;
327 UpdatePageStart (CallbackData
, &Location
);
329 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
331 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
332 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
334 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
335 NewLoadContext
->Deleted
= FALSE
;
336 CallbackData
->BmmFakeNvData
->DriverOptionDel
[Index
] = 0x00;
338 CreateCheckBoxOpCode (
339 (UINT16
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
341 NewMenuEntry
->DisplayStringToken
,
342 NewMenuEntry
->HelpStringToken
,
343 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
344 (UINT16
) DRIVER_OPTION_DEL_QUESTION_ID
,
348 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
349 UpdateData
->DataCount
++;
352 UpdatePageEnd (CallbackData
, Location
);
356 UpdateDriverAddHandleDescPage (
357 IN BMM_CALLBACK_DATA
*CallbackData
360 BM_MENU_ENTRY
*NewMenuEntry
;
363 Location
= (UINT8
*) &UpdateData
->Data
;
364 CallbackData
->BmmFakeNvData
->DriverAddActive
= 0x01;
365 CallbackData
->BmmFakeNvData
->DriverAddForceReconnect
= 0x00;
366 CallbackData
->BmmAskSaveOrNot
= TRUE
;
367 NewMenuEntry
= CallbackData
->MenuEntry
;
369 UpdatePageStart (CallbackData
, &Location
);
371 UpdateData
->DataCount
+= (UINT16
) 4;
373 CreateSubTitleOpCode (
374 NewMenuEntry
->DisplayStringToken
,
378 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
381 DRV_ADD_HANDLE_DESC_QUESTION_ID
,
383 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
384 STRING_TOKEN (STR_NULL_STRING
),
387 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
388 KEY_VALUE_DRIVER_ADD_DESC_DATA
,
392 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
394 CreateCheckBoxOpCode (
395 DRV_ADD_RECON_QUESTION_ID
,
397 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
398 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
399 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
400 DRV_ADD_RECON_QUESTION_ID
,
403 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
406 DRIVER_ADD_OPTION_QUESTION_ID
,
408 STRING_TOKEN (STR_OPTIONAL_DATA
),
409 STRING_TOKEN (STR_NULL_STRING
),
412 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
413 KEY_VALUE_DRIVER_ADD_OPT_DATA
,
417 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
418 UpdatePageEnd (CallbackData
, Location
);
423 IN UINT16 UpdatePageId
,
424 IN BM_MENU_OPTION
*ConsoleMenu
,
425 IN BMM_CALLBACK_DATA
*CallbackData
428 BM_MENU_ENTRY
*NewMenuEntry
;
429 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
430 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
438 Location
= (UINT8
*) &UpdateData
->Data
;
439 CallbackData
->BmmAskSaveOrNot
= TRUE
;
441 UpdatePageStart (CallbackData
, &Location
);
443 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
444 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
445 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
446 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
447 if (NewConsoleContext
->IsActive
) {
448 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
449 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
451 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
454 CreateCheckBoxOpCode (
455 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
457 NewMenuEntry
->DisplayStringToken
,
458 NewMenuEntry
->HelpStringToken
,
460 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
463 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
464 UpdateData
->DataCount
++;
467 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
468 if (!EFI_ERROR (Status
)) {
469 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
470 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
471 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
472 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
474 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
475 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
476 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
478 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
479 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
481 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
484 CreateCheckBoxOpCode (
485 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
487 NewMenuEntry
->DisplayStringToken
,
488 NewMenuEntry
->HelpStringToken
,
490 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
493 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
494 UpdateData
->DataCount
++;
499 UpdatePageEnd (CallbackData
, Location
);
504 IN UINT16 UpdatePageId
,
505 IN BM_MENU_OPTION
*OptionMenu
,
506 IN BMM_CALLBACK_DATA
*CallbackData
509 BM_MENU_ENTRY
*NewMenuEntry
;
512 IFR_OPTION
*IfrOptionList
;
514 Location
= (UINT8
*) &UpdateData
->Data
;
515 CallbackData
->BmmAskSaveOrNot
= TRUE
;
517 UpdatePageStart (CallbackData
, &Location
);
519 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
521 ZeroMem (CallbackData
->BmmFakeNvData
->OptionOrder
, 100);
523 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
524 if (NULL
== IfrOptionList
) {
528 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
529 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
530 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
531 IfrOptionList
[Index
].Value
= (UINT16
) (NewMenuEntry
->OptionNumber
+ 1);
532 IfrOptionList
[Index
].OptionString
= NULL
;
533 CallbackData
->BmmFakeNvData
->OptionOrder
[Index
] = (UINT8
) (IfrOptionList
[Index
].Value
);
536 if (OptionMenu
->MenuNumber
> 0) {
537 CreateOrderedListOpCode (
538 (UINT16
) OPTION_ORDER_QUESTION_ID
,
540 STRING_TOKEN (STR_CHANGE_ORDER
),
541 STRING_TOKEN (STR_CHANGE_ORDER
),
543 OptionMenu
->MenuNumber
,
547 for (Index
= 0; Index
< OptionMenu
->MenuNumber
+ 2; Index
++) {
548 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
551 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ OptionMenu
->MenuNumber
+ 2);
554 SafeFreePool (IfrOptionList
);
556 UpdatePageEnd (CallbackData
, Location
);
559 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
560 CallbackData
->BmmFakeNvData
->OptionOrder
,
567 IN BMM_CALLBACK_DATA
*CallbackData
571 BM_MENU_ENTRY
*NewMenuEntry
;
572 BM_LOAD_CONTEXT
*NewLoadContext
;
573 IFR_OPTION
*IfrOptionList
;
574 UINTN NumberOfOptions
;
577 Location
= (UINT8
*) &UpdateData
->Data
;
578 IfrOptionList
= NULL
;
579 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
580 CallbackData
->BmmAskSaveOrNot
= TRUE
;
582 UpdatePageStart (CallbackData
, &Location
);
583 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
585 if (NumberOfOptions
> 0) {
586 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ NumberOfOptions
);
587 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
589 ASSERT (IfrOptionList
);
591 CallbackData
->BmmFakeNvData
->BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
593 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
594 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
595 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
596 if (NewLoadContext
->IsBootNext
) {
597 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_DEFAULT
| EFI_IFR_FLAG_INTERACTIVE
;
598 CallbackData
->BmmFakeNvData
->BootNext
= Index
;
600 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
603 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
604 IfrOptionList
[Index
].Value
= Index
;
605 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
606 IfrOptionList
[Index
].OptionString
= NULL
;
609 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
610 IfrOptionList
[Index
].Value
= Index
;
611 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
612 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
613 if (CallbackData
->BmmFakeNvData
->BootNext
== Index
) {
614 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
617 IfrOptionList
[Index
].OptionString
= NULL
;
620 (UINT16
) BOOT_NEXT_QUESTION_ID
,
622 STRING_TOKEN (STR_BOOT_NEXT
),
623 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
625 (UINTN
) (NumberOfOptions
+ 1),
628 Location
= Location
+ (NumberOfOptions
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
629 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
631 UpdateData
->DataCount
+= 3;
632 SafeFreePool (IfrOptionList
);
633 IfrOptionList
= NULL
;
636 UpdatePageEnd (CallbackData
, Location
);
641 IN BMM_CALLBACK_DATA
*CallbackData
647 Location
= (UINT8
*) &UpdateData
->Data
;
648 CallbackData
->BmmAskSaveOrNot
= TRUE
;
650 UpdatePageStart (CallbackData
, &Location
);
652 BootTimeOut
= BdsLibGetTimeout ();
654 CreateNumericOpCode (
655 (UINT16
) BOOT_TIME_OUT_QUESTION_ID
,
657 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
658 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
668 CallbackData
->BmmFakeNvData
->BootTimeOut
= (UINT16
) BootTimeOut
;
669 UpdateData
->DataCount
++;
670 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
672 UpdatePageEnd (CallbackData
, Location
);
677 IN BMM_CALLBACK_DATA
*CallbackData
683 IFR_OPTION
*IfrOptionList
;
684 BM_MENU_ENTRY
*NewMenuEntry
;
685 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
687 ZeroMem (UpdateData
, UPDATE_DATA_SIZE
);
688 Location
= (UINT8
*) &UpdateData
->Data
;
689 UpdatePageStart (CallbackData
, &Location
);
691 NewMenuEntry
= BOpt_GetMenuEntry (
693 CallbackData
->CurrentTerminal
700 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
702 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
703 if (!IfrOptionList
) {
707 for (Index
= 0; Index
< 19; Index
++) {
708 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
709 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
710 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
711 NewTerminalContext
->BaudRateIndex
= (UINT8
) Index
;
712 CallbackData
->BmmFakeNvData
->COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
715 IfrOptionList
[Index
].Flags
= CheckFlags
;
716 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_BAUD_RATE
;
717 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
718 IfrOptionList
[Index
].Value
= Index
;
722 (UINT16
) COM_BAUD_RATE_QUESTION_ID
,
724 STRING_TOKEN (STR_COM_BAUD_RATE
),
725 STRING_TOKEN (STR_COM_BAUD_RATE
),
731 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
732 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
733 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
734 UpdateData
->DataCount
+= 2;
736 SafeFreePool (IfrOptionList
);
738 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
739 if (!IfrOptionList
) {
743 for (Index
= 0; Index
< 4; Index
++) {
744 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
746 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
747 NewTerminalContext
->DataBitsIndex
= (UINT8
) Index
;
748 CallbackData
->BmmFakeNvData
->COMDataRate
= NewTerminalContext
->DataBitsIndex
;
749 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
752 IfrOptionList
[Index
].Flags
= CheckFlags
;
753 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_DATA_BITS
;
754 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
755 IfrOptionList
[Index
].Value
= Index
;
759 (UINT16
) COM_DATA_RATE_QUESTION_ID
,
761 STRING_TOKEN (STR_COM_DATA_BITS
),
762 STRING_TOKEN (STR_COM_DATA_BITS
),
768 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
769 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
770 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
771 UpdateData
->DataCount
+= 2;
773 SafeFreePool (IfrOptionList
);
775 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 5);
776 if (!IfrOptionList
) {
780 for (Index
= 0; Index
< 5; Index
++) {
781 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
782 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
783 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
784 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
785 CallbackData
->BmmFakeNvData
->COMParity
= NewTerminalContext
->ParityIndex
;
788 IfrOptionList
[Index
].Flags
= CheckFlags
;
789 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_PARITY
;
790 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
791 IfrOptionList
[Index
].Value
= Index
;
795 (UINT16
) COM_PARITY_QUESTION_ID
,
797 STRING_TOKEN (STR_COM_PARITY
),
798 STRING_TOKEN (STR_COM_PARITY
),
804 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
805 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
806 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
807 UpdateData
->DataCount
+= 2;
809 SafeFreePool (IfrOptionList
);
811 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 3);
812 if (!IfrOptionList
) {
816 for (Index
= 0; Index
< 3; Index
++) {
817 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
818 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
819 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
820 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
821 CallbackData
->BmmFakeNvData
->COMStopBits
= NewTerminalContext
->StopBitsIndex
;
824 IfrOptionList
[Index
].Flags
= CheckFlags
;
825 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_STOP_BITS
;
826 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
827 IfrOptionList
[Index
].Value
= Index
;
831 (UINT16
) COM_STOP_BITS_QUESTION_ID
,
833 STRING_TOKEN (STR_COM_STOP_BITS
),
834 STRING_TOKEN (STR_COM_STOP_BITS
),
840 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
841 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
842 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
843 UpdateData
->DataCount
+= 2;
845 SafeFreePool (IfrOptionList
);
847 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
848 if (!IfrOptionList
) {
852 for (Index
= 0; Index
< 4; Index
++) {
853 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
854 if (NewTerminalContext
->TerminalType
== Index
) {
855 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
856 CallbackData
->BmmFakeNvData
->COMTerminalType
= NewTerminalContext
->TerminalType
;
859 IfrOptionList
[Index
].Flags
= CheckFlags
;
860 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_TERMI_TYPE
;
861 IfrOptionList
[Index
].StringToken
= (STRING_REF
) TerminalType
[Index
];
862 IfrOptionList
[Index
].Value
= Index
;
866 (UINT16
) COM_TERMINAL_QUESTION_ID
,
868 STRING_TOKEN (STR_COM_TERMI_TYPE
),
869 STRING_TOKEN (STR_COM_TERMI_TYPE
),
875 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
876 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
877 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
878 UpdateData
->DataCount
+= 2;
880 SafeFreePool (IfrOptionList
);
884 STRING_TOKEN (STR_SAVE_AND_EXIT
),
885 STRING_TOKEN (STR_NULL_STRING
),
886 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
887 KEY_VALUE_SAVE_AND_EXIT
,
891 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
892 UpdateData
->DataCount
++;
896 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
897 STRING_TOKEN (STR_NULL_STRING
),
898 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
899 KEY_VALUE_NO_SAVE_AND_EXIT
,
903 UpdateData
->DataCount
++;
905 CallbackData
->Hii
->UpdateForm (
907 CallbackData
->BmmHiiHandle
,
908 (EFI_FORM_LABEL
) FORM_CON_COM_SETUP_ID
,
917 IN UINT16 UpdatePageId
,
918 IN BMM_CALLBACK_DATA
*CallbackData
921 CleanUpPage (UpdatePageId
, CallbackData
);
922 switch (UpdatePageId
) {
924 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
927 case FORM_CON_OUT_ID
:
928 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
931 case FORM_CON_ERR_ID
:
932 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
935 case FORM_BOOT_CHG_ID
:
936 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
939 case FORM_DRV_CHG_ID
:
940 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
949 GetLegacyBootOptionVar (
951 OUT UINTN
*OptionIndex
,
952 OUT UINTN
*OptionSize
955 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
968 // Get Boot Option number from the size of BootOrder
970 OrderBuffer
= BdsLibGetVariableAndSize (
972 &gEfiGlobalVariableGuid
,
976 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
977 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
978 OptionBuffer
= BdsLibGetVariableAndSize (
980 &gEfiGlobalVariableGuid
,
983 if (NULL
== OptionBuffer
) {
987 Ptr
= (UINT8
*) OptionBuffer
;
988 Attribute
= *(UINT32
*) Ptr
;
989 Ptr
+= sizeof (UINT32
);
991 FilePathSize
= *(UINT16
*) Ptr
;
992 Ptr
+= sizeof (UINT16
);
994 Description
= (CHAR16
*) Ptr
;
995 Ptr
+= StrSize ((CHAR16
*) Ptr
);
998 // Now Ptr point to Device Path
1000 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
1001 Ptr
+= FilePathSize
;
1004 // Now Ptr point to Optional Data
1008 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1009 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1010 (BBS_BBS_DP
== DevicePath
->SubType
)
1012 *OptionIndex
= OrderBuffer
[Index
];
1013 SafeFreePool (OrderBuffer
);
1014 return OptionBuffer
;
1016 SafeFreePool (OptionBuffer
);
1020 SafeFreePool (OrderBuffer
);
1025 UpdateSetLegacyDeviceOrderPage (
1026 IN UINT16 UpdatePageId
,
1027 IN BMM_CALLBACK_DATA
*CallbackData
1030 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1031 BM_MENU_OPTION
*OptionMenu
;
1032 BM_MENU_ENTRY
*NewMenuEntry
;
1033 IFR_OPTION
*IfrOptionList
;
1035 STRING_REF StrRefHelp
;
1045 CHAR16
*TypeStrHelp
;
1060 BbsType
= BBS_FLOPPY
;
1065 Location
= (UINT8
*) &UpdateData
->Data
;
1066 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1068 UpdatePageStart (CallbackData
, &Location
);
1070 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1072 SetMem (DisMap
, 32, 0);
1074 // Create oneof option list
1076 switch (UpdatePageId
) {
1077 case FORM_SET_FD_ORDER_ID
:
1078 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1079 Key
= LEGACY_FD_QUESTION_ID
;
1080 TypeStr
= StrFloppy
;
1081 TypeStrHelp
= StrFloppyHelp
;
1082 BbsType
= BBS_FLOPPY
;
1083 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyFD
;
1084 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1087 case FORM_SET_HD_ORDER_ID
:
1088 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1089 Key
= LEGACY_HD_QUESTION_ID
;
1090 TypeStr
= StrHardDisk
;
1091 TypeStrHelp
= StrHardDiskHelp
;
1092 BbsType
= BBS_HARDDISK
;
1093 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyHD
;
1094 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1097 case FORM_SET_CD_ORDER_ID
:
1098 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1099 Key
= LEGACY_CD_QUESTION_ID
;
1101 TypeStrHelp
= StrCDROMHelp
;
1102 BbsType
= BBS_CDROM
;
1103 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyCD
;
1104 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1107 case FORM_SET_NET_ORDER_ID
:
1108 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1109 Key
= LEGACY_NET_QUESTION_ID
;
1111 TypeStrHelp
= StrNETHelp
;
1112 BbsType
= BBS_EMBED_NETWORK
;
1113 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyNET
;
1114 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1117 case FORM_SET_BEV_ORDER_ID
:
1118 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1119 Key
= LEGACY_BEV_QUESTION_ID
;
1121 TypeStrHelp
= StrBEVHelp
;
1122 BbsType
= BBS_BEV_DEVICE
;
1123 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyBEV
;
1124 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1129 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1131 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1132 if (NULL
== IfrOptionList
) {
1136 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1137 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1138 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1140 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
1143 IfrOptionList
[Index
].Key
= Key
;
1144 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1145 IfrOptionList
[Index
].Value
= (UINT16
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1146 IfrOptionList
[Index
].OptionString
= NULL
;
1149 // for item "Disabled"
1151 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1152 IfrOptionList
[Index
].Key
= Key
;
1153 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1154 IfrOptionList
[Index
].Value
= 0xFF;
1155 IfrOptionList
[Index
].OptionString
= NULL
;
1158 // Get Device Order from variable
1160 VarData
= BdsLibGetVariableAndSize (
1162 &EfiLegacyDevOrderGuid
,
1166 if (NULL
!= VarData
) {
1167 OriginalPtr
= VarData
;
1168 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1169 while (VarData
< VarData
+ VarSize
) {
1170 if (DevOrder
->BbsType
== BbsType
) {
1174 VarData
+= sizeof (BBS_TYPE
);
1175 VarData
+= *(UINT16
*) VarData
;
1176 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1179 // Create oneof tag here for FD/HD/CD #1 #2
1181 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1182 for (Index2
= 0; Index2
<= OptionMenu
->MenuNumber
; Index2
++) {
1183 IfrOptionList
[Index2
].Key
= (UINT16
) (Key
+ Index
);
1186 // Create the string for oneof tag
1188 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1190 CallbackData
->Hii
->NewString (
1193 CallbackData
->BmmHiiHandle
,
1198 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1200 CallbackData
->Hii
->NewString (
1203 CallbackData
->BmmHiiHandle
,
1209 (UINT16
) (Key
+ Index
),
1214 OptionMenu
->MenuNumber
+ 1,
1218 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1220 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1221 LegacyOrder
[Index
] = 0xFF;
1222 Pos
= (VarDevOrder
& 0xFF) / 8;
1223 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1224 DisMap
[Pos
] |= (UINT8
) (1 << Bit
);
1226 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1229 Location
= Location
+ (OptionMenu
->MenuNumber
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1230 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1231 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ (OptionMenu
->MenuNumber
+ 3));
1241 if (IfrOptionList
!= NULL
) {
1242 SafeFreePool (IfrOptionList
);
1243 IfrOptionList
= NULL
;
1246 UpdatePageEnd (CallbackData
, Location
);
1251 BMM_CALLBACK_DATA
*Private
,
1255 UINT16 FileOptionMask
;
1257 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& NewPageId
);
1259 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1261 // If we select a handle to add driver option, advance to the add handle description page.
1263 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1264 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1266 // Return to main page after "Save Changes" or "Discard Changes".
1268 NewPageId
= FORM_MAIN_ID
;
1271 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1272 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1273 Private
->BmmCurrentPageId
= NewPageId
;