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 "BootMaint.h"
18 EFI_GUID gTerminalDriverGuid
= {
19 0x9E863906, 0xA40F, 0x4875, {0x97, 0x7F, 0x5B, 0x93, 0xFF, 0x23, 0x7F, 0xC6}
24 IN BOOLEAN FormSetUpdate
,
25 IN EFI_PHYSICAL_ADDRESS FormCallbackHandle
,
26 IN BOOLEAN FormUpdate
,
27 IN STRING_REF FormTitle
,
32 Refresh the global UpdateData structure.
35 FormSetUpdate - If TRUE, next variable is significant
36 FormCallbackHandle - If not 0, will update FormSet with this info
37 FormUpdate - If TRUE, next variable is significant
38 FormTitle - If not 0, will update Form with this info
39 DataCount - The number of Data entries in this structure
45 UpdateData
->FormSetUpdate
= FormSetUpdate
;
47 ASSERT (0 != FormCallbackHandle
);
48 UpdateData
->FormCallbackHandle
= FormCallbackHandle
;
51 UpdateData
->FormUpdate
= FALSE
;
52 UpdateData
->FormTitle
= FormTitle
;
53 UpdateData
->DataCount
= DataCount
;
58 IN BMM_CALLBACK_DATA
*CallbackData
,
59 IN OUT UINT8
**CurrentLocation
62 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->BmmCallbackHandle
, FALSE
, 0, 0);
64 if (!(CallbackData
->BmmAskSaveOrNot
)) {
66 // Add a "Go back to main page" tag in front of the form when there are no
67 // "Apply changes" and "Discard changes" tags in the end of the form.
71 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
72 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
73 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
78 UpdateData
->DataCount
++;
80 *CurrentLocation
= *CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) (*CurrentLocation
))->Length
;
87 IN BMM_CALLBACK_DATA
*CallbackData
,
88 IN UINT8
*CurrentLocation
92 // Create the "Apply changes" and "Discard changes" tags.
94 if (CallbackData
->BmmAskSaveOrNot
) {
97 STRING_TOKEN (STR_SAVE_AND_EXIT
),
98 STRING_TOKEN (STR_NULL_STRING
),
99 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
100 KEY_VALUE_SAVE_AND_EXIT
,
104 UpdateData
->DataCount
++;
106 CurrentLocation
= CurrentLocation
+ ((EFI_IFR_OP_HEADER
*) CurrentLocation
)->Length
;
110 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
111 STRING_TOKEN (STR_NULL_STRING
),
112 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
113 KEY_VALUE_NO_SAVE_AND_EXIT
,
117 UpdateData
->DataCount
++;
120 // Ensure user can return to the main page.
122 if (0 == UpdateData
->DataCount
) {
125 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
126 STRING_TOKEN (STR_NULL_STRING
),
127 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
128 KEY_VALUE_NO_SAVE_AND_EXIT
,
132 UpdateData
->DataCount
++;
135 CallbackData
->Hii
->UpdateForm (
137 CallbackData
->BmmHiiHandle
,
138 CallbackData
->BmmCurrentPageId
,
146 IN EFI_FORM_LABEL LabelId
,
147 IN BMM_CALLBACK_DATA
*CallbackData
150 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
153 // Remove all op-codes from dynamic page
155 CallbackData
->Hii
->UpdateForm (
157 CallbackData
->BmmHiiHandle
,
166 IN BM_FILE_CONTEXT
*FileContext
172 BDS_COMMON_OPTION
*Option
;
174 Status
= gBS
->AllocatePool (EfiBootServicesData
, sizeof (BDS_COMMON_OPTION
), (VOID
**) &Option
);
175 Option
->Description
= FileContext
->FileName
;
176 Option
->DevicePath
= FileContext
->DevicePath
;
177 Option
->LoadOptionsSize
= 0;
178 Option
->LoadOptions
= NULL
;
181 // Since current no boot from removable media directly is allowed */
183 gST
->ConOut
->ClearScreen (gST
->ConOut
);
187 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
195 IN BMM_CALLBACK_DATA
*CallbackData
198 BM_MENU_ENTRY
*NewMenuEntry
;
204 Location
= (UINT8
*) &UpdateData
->Data
;
205 CallbackData
->BmmAskSaveOrNot
= FALSE
;
207 UpdatePageStart (CallbackData
, &Location
);
209 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
210 if (!EFI_ERROR (Status
)) {
211 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
212 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
215 FORM_CON_COM_SETUP_ID
,
216 NewMenuEntry
->DisplayStringToken
,
217 STRING_TOKEN (STR_NULL_STRING
),
218 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
219 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
),
222 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
223 UpdateData
->DataCount
++;
227 UpdatePageEnd (CallbackData
, Location
);
232 IN BMM_CALLBACK_DATA
*CallbackData
235 BM_MENU_ENTRY
*NewMenuEntry
;
236 BM_LOAD_CONTEXT
*NewLoadContext
;
240 Location
= (UINT8
*) &UpdateData
->Data
;
241 CallbackData
->BmmAskSaveOrNot
= TRUE
;
243 UpdatePageStart (CallbackData
, &Location
);
244 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
246 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
247 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
248 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
249 if (NewLoadContext
->IsLegacy
) {
253 NewLoadContext
->Deleted
= FALSE
;
254 CallbackData
->BmmFakeNvData
->BootOptionDel
[Index
] = 0x00;
256 CreateCheckBoxOpCode (
257 (UINT16
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
259 NewMenuEntry
->DisplayStringToken
,
260 NewMenuEntry
->HelpStringToken
,
261 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
262 (UINT16
) BOOT_OPTION_DEL_QUESTION_ID
,
266 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
267 UpdateData
->DataCount
++;
270 UpdatePageEnd (CallbackData
, Location
);
274 UpdateDrvAddHandlePage (
275 IN BMM_CALLBACK_DATA
*CallbackData
278 BM_MENU_ENTRY
*NewMenuEntry
;
282 Location
= (UINT8
*) &UpdateData
->Data
;
283 CallbackData
->BmmAskSaveOrNot
= FALSE
;
285 UpdatePageStart (CallbackData
, &Location
);
287 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
288 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
291 FORM_DRV_ADD_HANDLE_DESC_ID
,
292 NewMenuEntry
->DisplayStringToken
,
293 STRING_TOKEN (STR_NULL_STRING
),
294 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
295 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
),
299 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
300 UpdateData
->DataCount
++;
303 UpdatePageEnd (CallbackData
, Location
);
308 IN BMM_CALLBACK_DATA
*CallbackData
311 BM_MENU_ENTRY
*NewMenuEntry
;
312 BM_LOAD_CONTEXT
*NewLoadContext
;
316 Location
= (UINT8
*) &UpdateData
->Data
;
317 CallbackData
->BmmAskSaveOrNot
= TRUE
;
319 UpdatePageStart (CallbackData
, &Location
);
321 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
323 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
324 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
326 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
327 NewLoadContext
->Deleted
= FALSE
;
328 CallbackData
->BmmFakeNvData
->DriverOptionDel
[Index
] = 0x00;
330 CreateCheckBoxOpCode (
331 (UINT16
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
333 NewMenuEntry
->DisplayStringToken
,
334 NewMenuEntry
->HelpStringToken
,
335 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
336 (UINT16
) DRIVER_OPTION_DEL_QUESTION_ID
,
340 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
341 UpdateData
->DataCount
++;
344 UpdatePageEnd (CallbackData
, Location
);
348 UpdateDriverAddHandleDescPage (
349 IN BMM_CALLBACK_DATA
*CallbackData
352 BM_MENU_ENTRY
*NewMenuEntry
;
355 Location
= (UINT8
*) &UpdateData
->Data
;
356 CallbackData
->BmmFakeNvData
->DriverAddActive
= 0x01;
357 CallbackData
->BmmFakeNvData
->DriverAddForceReconnect
= 0x00;
358 CallbackData
->BmmAskSaveOrNot
= TRUE
;
359 NewMenuEntry
= CallbackData
->MenuEntry
;
361 UpdatePageStart (CallbackData
, &Location
);
363 UpdateData
->DataCount
+= (UINT16
) 4;
365 CreateSubTitleOpCode (
366 NewMenuEntry
->DisplayStringToken
,
370 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
373 DRV_ADD_HANDLE_DESC_QUESTION_ID
,
375 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
376 STRING_TOKEN (STR_NULL_STRING
),
379 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
380 KEY_VALUE_DRIVER_ADD_DESC_DATA
,
384 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
386 CreateCheckBoxOpCode (
387 DRV_ADD_RECON_QUESTION_ID
,
389 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
390 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
391 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
392 DRV_ADD_RECON_QUESTION_ID
,
395 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
398 DRIVER_ADD_OPTION_QUESTION_ID
,
400 STRING_TOKEN (STR_OPTIONAL_DATA
),
401 STRING_TOKEN (STR_NULL_STRING
),
404 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
405 KEY_VALUE_DRIVER_ADD_OPT_DATA
,
409 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
410 UpdatePageEnd (CallbackData
, Location
);
415 IN UINT16 UpdatePageId
,
416 IN BM_MENU_OPTION
*ConsoleMenu
,
417 IN BMM_CALLBACK_DATA
*CallbackData
420 BM_MENU_ENTRY
*NewMenuEntry
;
421 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
422 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
430 Location
= (UINT8
*) &UpdateData
->Data
;
431 CallbackData
->BmmAskSaveOrNot
= TRUE
;
433 UpdatePageStart (CallbackData
, &Location
);
435 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
436 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
437 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
438 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
439 if (NewConsoleContext
->IsActive
) {
440 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
441 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
443 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
446 CreateCheckBoxOpCode (
447 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
449 NewMenuEntry
->DisplayStringToken
,
450 NewMenuEntry
->HelpStringToken
,
452 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
455 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
456 UpdateData
->DataCount
++;
459 Status
= EfiLibLocateProtocol (&gTerminalDriverGuid
, &Interface
);
460 if (!EFI_ERROR (Status
)) {
461 for (Index2
= 0; Index2
< TerminalMenu
.MenuNumber
; Index2
++) {
462 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
463 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
464 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
466 if ((NewTerminalContext
->IsConIn
&& (UpdatePageId
== FORM_CON_IN_ID
)) ||
467 (NewTerminalContext
->IsConOut
&& (UpdatePageId
== FORM_CON_OUT_ID
)) ||
468 (NewTerminalContext
->IsStdErr
&& (UpdatePageId
== FORM_CON_ERR_ID
))
470 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
471 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = TRUE
;
473 CallbackData
->BmmFakeNvData
->ConsoleCheck
[Index
] = FALSE
;
476 CreateCheckBoxOpCode (
477 (UINT16
) (CON_DEVICE_QUESTION_ID
+ Index
),
479 NewMenuEntry
->DisplayStringToken
,
480 NewMenuEntry
->HelpStringToken
,
482 (UINT16
) (CONSOLE_OPTION_OFFSET
+ Index
),
485 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
486 UpdateData
->DataCount
++;
491 UpdatePageEnd (CallbackData
, Location
);
496 IN UINT16 UpdatePageId
,
497 IN BM_MENU_OPTION
*OptionMenu
,
498 IN BMM_CALLBACK_DATA
*CallbackData
501 BM_MENU_ENTRY
*NewMenuEntry
;
504 IFR_OPTION
*IfrOptionList
;
506 Location
= (UINT8
*) &UpdateData
->Data
;
507 CallbackData
->BmmAskSaveOrNot
= TRUE
;
509 UpdatePageStart (CallbackData
, &Location
);
511 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
513 ZeroMem (CallbackData
->BmmFakeNvData
->OptionOrder
, 100);
515 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * OptionMenu
->MenuNumber
);
516 if (NULL
== IfrOptionList
) {
520 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
521 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
522 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
523 IfrOptionList
[Index
].Value
= (UINT16
) (NewMenuEntry
->OptionNumber
+ 1);
524 IfrOptionList
[Index
].OptionString
= NULL
;
525 CallbackData
->BmmFakeNvData
->OptionOrder
[Index
] = (UINT8
) (IfrOptionList
[Index
].Value
);
528 if (OptionMenu
->MenuNumber
> 0) {
529 CreateOrderedListOpCode (
530 (UINT16
) OPTION_ORDER_QUESTION_ID
,
532 STRING_TOKEN (STR_CHANGE_ORDER
),
533 STRING_TOKEN (STR_CHANGE_ORDER
),
535 OptionMenu
->MenuNumber
,
539 for (Index
= 0; Index
< OptionMenu
->MenuNumber
+ 2; Index
++) {
540 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
543 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ OptionMenu
->MenuNumber
+ 2);
546 SafeFreePool (IfrOptionList
);
548 UpdatePageEnd (CallbackData
, Location
);
551 CallbackData
->BmmOldFakeNVData
.OptionOrder
,
552 CallbackData
->BmmFakeNvData
->OptionOrder
,
559 IN BMM_CALLBACK_DATA
*CallbackData
563 BM_MENU_ENTRY
*NewMenuEntry
;
564 BM_LOAD_CONTEXT
*NewLoadContext
;
565 IFR_OPTION
*IfrOptionList
;
566 UINTN NumberOfOptions
;
569 Location
= (UINT8
*) &UpdateData
->Data
;
570 IfrOptionList
= NULL
;
571 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
572 CallbackData
->BmmAskSaveOrNot
= TRUE
;
574 UpdatePageStart (CallbackData
, &Location
);
575 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
577 if (NumberOfOptions
> 0) {
578 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ NumberOfOptions
);
579 IfrOptionList
= AllocateZeroPool ((NumberOfOptions
+ 1) * sizeof (IFR_OPTION
));
581 ASSERT (IfrOptionList
);
583 CallbackData
->BmmFakeNvData
->BootNext
= (UINT16
) (BootOptionMenu
.MenuNumber
);
585 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
586 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
587 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
588 if (NewLoadContext
->IsBootNext
) {
589 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_DEFAULT
| EFI_IFR_FLAG_INTERACTIVE
;
590 CallbackData
->BmmFakeNvData
->BootNext
= Index
;
592 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
595 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
596 IfrOptionList
[Index
].Value
= Index
;
597 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
598 IfrOptionList
[Index
].OptionString
= NULL
;
601 IfrOptionList
[Index
].Key
= (UINT16
) KEY_VALUE_MAIN_BOOT_NEXT
;
602 IfrOptionList
[Index
].Value
= Index
;
603 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_NONE
);
604 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
605 if (CallbackData
->BmmFakeNvData
->BootNext
== Index
) {
606 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
609 IfrOptionList
[Index
].OptionString
= NULL
;
612 (UINT16
) BOOT_NEXT_QUESTION_ID
,
614 STRING_TOKEN (STR_BOOT_NEXT
),
615 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
617 (UINTN
) (NumberOfOptions
+ 1),
620 Location
= Location
+ (NumberOfOptions
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
621 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
623 UpdateData
->DataCount
+= 3;
624 SafeFreePool (IfrOptionList
);
625 IfrOptionList
= NULL
;
628 UpdatePageEnd (CallbackData
, Location
);
633 IN BMM_CALLBACK_DATA
*CallbackData
639 Location
= (UINT8
*) &UpdateData
->Data
;
640 CallbackData
->BmmAskSaveOrNot
= TRUE
;
642 UpdatePageStart (CallbackData
, &Location
);
644 BootTimeOut
= BdsLibGetTimeout ();
646 CreateNumericOpCode (
647 (UINT16
) BOOT_TIME_OUT_QUESTION_ID
,
649 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
650 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
660 CallbackData
->BmmFakeNvData
->BootTimeOut
= (UINT16
) BootTimeOut
;
661 UpdateData
->DataCount
++;
662 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
664 UpdatePageEnd (CallbackData
, Location
);
669 IN BMM_CALLBACK_DATA
*CallbackData
675 IFR_OPTION
*IfrOptionList
;
676 BM_MENU_ENTRY
*NewMenuEntry
;
677 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
679 ZeroMem (UpdateData
, UPDATE_DATA_SIZE
);
680 Location
= (UINT8
*) &UpdateData
->Data
;
681 UpdatePageStart (CallbackData
, &Location
);
683 NewMenuEntry
= BOpt_GetMenuEntry (
685 CallbackData
->CurrentTerminal
692 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
694 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 19);
695 if (!IfrOptionList
) {
699 for (Index
= 0; Index
< 19; Index
++) {
700 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
701 if (NewTerminalContext
->BaudRate
== (UINT64
) (BaudRateList
[Index
].Value
)) {
702 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
703 NewTerminalContext
->BaudRateIndex
= (UINT8
) Index
;
704 CallbackData
->BmmFakeNvData
->COMBaudRate
= NewTerminalContext
->BaudRateIndex
;
707 IfrOptionList
[Index
].Flags
= CheckFlags
;
708 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_BAUD_RATE
;
709 IfrOptionList
[Index
].StringToken
= BaudRateList
[Index
].StringToken
;
710 IfrOptionList
[Index
].Value
= Index
;
714 (UINT16
) COM_BAUD_RATE_QUESTION_ID
,
716 STRING_TOKEN (STR_COM_BAUD_RATE
),
717 STRING_TOKEN (STR_COM_BAUD_RATE
),
723 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
724 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
725 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
726 UpdateData
->DataCount
+= 2;
728 SafeFreePool (IfrOptionList
);
730 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
731 if (!IfrOptionList
) {
735 for (Index
= 0; Index
< 4; Index
++) {
736 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
738 if (NewTerminalContext
->DataBits
== DataBitsList
[Index
].Value
) {
739 NewTerminalContext
->DataBitsIndex
= (UINT8
) Index
;
740 CallbackData
->BmmFakeNvData
->COMDataRate
= NewTerminalContext
->DataBitsIndex
;
741 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
744 IfrOptionList
[Index
].Flags
= CheckFlags
;
745 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_DATA_BITS
;
746 IfrOptionList
[Index
].StringToken
= DataBitsList
[Index
].StringToken
;
747 IfrOptionList
[Index
].Value
= Index
;
751 (UINT16
) COM_DATA_RATE_QUESTION_ID
,
753 STRING_TOKEN (STR_COM_DATA_BITS
),
754 STRING_TOKEN (STR_COM_DATA_BITS
),
760 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
761 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
762 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
763 UpdateData
->DataCount
+= 2;
765 SafeFreePool (IfrOptionList
);
767 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 5);
768 if (!IfrOptionList
) {
772 for (Index
= 0; Index
< 5; Index
++) {
773 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
774 if (NewTerminalContext
->Parity
== ParityList
[Index
].Value
) {
775 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
776 NewTerminalContext
->ParityIndex
= (UINT8
) Index
;
777 CallbackData
->BmmFakeNvData
->COMParity
= NewTerminalContext
->ParityIndex
;
780 IfrOptionList
[Index
].Flags
= CheckFlags
;
781 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_PARITY
;
782 IfrOptionList
[Index
].StringToken
= ParityList
[Index
].StringToken
;
783 IfrOptionList
[Index
].Value
= Index
;
787 (UINT16
) COM_PARITY_QUESTION_ID
,
789 STRING_TOKEN (STR_COM_PARITY
),
790 STRING_TOKEN (STR_COM_PARITY
),
796 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
797 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
798 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
799 UpdateData
->DataCount
+= 2;
801 SafeFreePool (IfrOptionList
);
803 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 3);
804 if (!IfrOptionList
) {
808 for (Index
= 0; Index
< 3; Index
++) {
809 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
810 if (NewTerminalContext
->StopBits
== StopBitsList
[Index
].Value
) {
811 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
812 NewTerminalContext
->StopBitsIndex
= (UINT8
) Index
;
813 CallbackData
->BmmFakeNvData
->COMStopBits
= NewTerminalContext
->StopBitsIndex
;
816 IfrOptionList
[Index
].Flags
= CheckFlags
;
817 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_STOP_BITS
;
818 IfrOptionList
[Index
].StringToken
= StopBitsList
[Index
].StringToken
;
819 IfrOptionList
[Index
].Value
= Index
;
823 (UINT16
) COM_STOP_BITS_QUESTION_ID
,
825 STRING_TOKEN (STR_COM_STOP_BITS
),
826 STRING_TOKEN (STR_COM_STOP_BITS
),
832 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
833 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
834 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
835 UpdateData
->DataCount
+= 2;
837 SafeFreePool (IfrOptionList
);
839 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * 4);
840 if (!IfrOptionList
) {
844 for (Index
= 0; Index
< 4; Index
++) {
845 CheckFlags
= EFI_IFR_FLAG_INTERACTIVE
;
846 if (NewTerminalContext
->TerminalType
== Index
) {
847 CheckFlags
|= EFI_IFR_FLAG_DEFAULT
;
848 CallbackData
->BmmFakeNvData
->COMTerminalType
= NewTerminalContext
->TerminalType
;
851 IfrOptionList
[Index
].Flags
= CheckFlags
;
852 IfrOptionList
[Index
].Key
= KEY_VALUE_COM_SET_TERMI_TYPE
;
853 IfrOptionList
[Index
].StringToken
= (STRING_REF
) TerminalType
[Index
];
854 IfrOptionList
[Index
].Value
= Index
;
858 (UINT16
) COM_TERMINAL_QUESTION_ID
,
860 STRING_TOKEN (STR_COM_TERMI_TYPE
),
861 STRING_TOKEN (STR_COM_TERMI_TYPE
),
867 Location
= Location
+ (Index
+ 1) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
868 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
869 UpdateData
->DataCount
= (UINT8
) (UpdateData
->DataCount
+ Index
);
870 UpdateData
->DataCount
+= 2;
872 SafeFreePool (IfrOptionList
);
876 STRING_TOKEN (STR_SAVE_AND_EXIT
),
877 STRING_TOKEN (STR_NULL_STRING
),
878 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
879 KEY_VALUE_SAVE_AND_EXIT
,
883 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
884 UpdateData
->DataCount
++;
888 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
889 STRING_TOKEN (STR_NULL_STRING
),
890 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
891 KEY_VALUE_NO_SAVE_AND_EXIT
,
895 UpdateData
->DataCount
++;
897 CallbackData
->Hii
->UpdateForm (
899 CallbackData
->BmmHiiHandle
,
900 (EFI_FORM_LABEL
) FORM_CON_COM_SETUP_ID
,
909 IN UINT16 UpdatePageId
,
910 IN BMM_CALLBACK_DATA
*CallbackData
913 CleanUpPage (UpdatePageId
, CallbackData
);
914 switch (UpdatePageId
) {
916 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
919 case FORM_CON_OUT_ID
:
920 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
923 case FORM_CON_ERR_ID
:
924 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
927 case FORM_BOOT_CHG_ID
:
928 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
931 case FORM_DRV_CHG_ID
:
932 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
941 GetLegacyBootOptionVar (
943 OUT UINTN
*OptionIndex
,
944 OUT UINTN
*OptionSize
947 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
960 // Get Boot Option number from the size of BootOrder
962 OrderBuffer
= BdsLibGetVariableAndSize (
964 &gEfiGlobalVariableGuid
,
968 for (Index
= 0; Index
< OrderSize
/ sizeof (UINT16
); Index
++) {
969 UnicodeSPrint (StrTemp
, 100, L
"Boot%04x", OrderBuffer
[Index
]);
970 OptionBuffer
= BdsLibGetVariableAndSize (
972 &gEfiGlobalVariableGuid
,
975 if (NULL
== OptionBuffer
) {
979 Ptr
= (UINT8
*) OptionBuffer
;
980 Attribute
= *(UINT32
*) Ptr
;
981 Ptr
+= sizeof (UINT32
);
983 FilePathSize
= *(UINT16
*) Ptr
;
984 Ptr
+= sizeof (UINT16
);
986 Description
= (CHAR16
*) Ptr
;
987 Ptr
+= StrSize ((CHAR16
*) Ptr
);
990 // Now Ptr point to Device Path
992 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) Ptr
;
996 // Now Ptr point to Optional Data
1000 if ((DeviceType
== ((BBS_TABLE
*) OptionalData
)->DeviceType
) &&
1001 (BBS_DEVICE_PATH
== DevicePath
->Type
) &&
1002 (BBS_BBS_DP
== DevicePath
->SubType
)
1004 *OptionIndex
= OrderBuffer
[Index
];
1005 SafeFreePool (OrderBuffer
);
1006 return OptionBuffer
;
1008 SafeFreePool (OptionBuffer
);
1012 SafeFreePool (OrderBuffer
);
1017 UpdateSetLegacyDeviceOrderPage (
1018 IN UINT16 UpdatePageId
,
1019 IN BMM_CALLBACK_DATA
*CallbackData
1022 BM_LEGACY_DEV_ORDER_CONTEXT
*DevOrder
;
1023 BM_MENU_OPTION
*OptionMenu
;
1024 BM_MENU_ENTRY
*NewMenuEntry
;
1025 IFR_OPTION
*IfrOptionList
;
1027 STRING_REF StrRefHelp
;
1037 CHAR16
*TypeStrHelp
;
1052 BbsType
= BBS_FLOPPY
;
1057 Location
= (UINT8
*) &UpdateData
->Data
;
1058 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1060 UpdatePageStart (CallbackData
, &Location
);
1062 DisMap
= CallbackData
->BmmOldFakeNVData
.DisableMap
;
1064 SetMem (DisMap
, 32, 0);
1066 // Create oneof option list
1068 switch (UpdatePageId
) {
1069 case FORM_SET_FD_ORDER_ID
:
1070 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1071 Key
= LEGACY_FD_QUESTION_ID
;
1072 TypeStr
= StrFloppy
;
1073 TypeStrHelp
= StrFloppyHelp
;
1074 BbsType
= BBS_FLOPPY
;
1075 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyFD
;
1076 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1079 case FORM_SET_HD_ORDER_ID
:
1080 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1081 Key
= LEGACY_HD_QUESTION_ID
;
1082 TypeStr
= StrHardDisk
;
1083 TypeStrHelp
= StrHardDiskHelp
;
1084 BbsType
= BBS_HARDDISK
;
1085 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyHD
;
1086 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1089 case FORM_SET_CD_ORDER_ID
:
1090 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1091 Key
= LEGACY_CD_QUESTION_ID
;
1093 TypeStrHelp
= StrCDROMHelp
;
1094 BbsType
= BBS_CDROM
;
1095 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyCD
;
1096 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1099 case FORM_SET_NET_ORDER_ID
:
1100 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1101 Key
= LEGACY_NET_QUESTION_ID
;
1103 TypeStrHelp
= StrNETHelp
;
1104 BbsType
= BBS_EMBED_NETWORK
;
1105 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyNET
;
1106 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1109 case FORM_SET_BEV_ORDER_ID
:
1110 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1111 Key
= LEGACY_BEV_QUESTION_ID
;
1113 TypeStrHelp
= StrBEVHelp
;
1114 BbsType
= BBS_BEV_DEVICE
;
1115 LegacyOrder
= CallbackData
->BmmFakeNvData
->LegacyBEV
;
1116 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1121 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1123 IfrOptionList
= AllocateZeroPool (sizeof (IFR_OPTION
) * (OptionMenu
->MenuNumber
+ 1));
1124 if (NULL
== IfrOptionList
) {
1128 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1129 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1130 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1132 IfrOptionList
[Index
].Flags
|= EFI_IFR_FLAG_DEFAULT
;
1135 IfrOptionList
[Index
].Key
= Key
;
1136 IfrOptionList
[Index
].StringToken
= NewMenuEntry
->DisplayStringToken
;
1137 IfrOptionList
[Index
].Value
= (UINT16
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->Index
;
1138 IfrOptionList
[Index
].OptionString
= NULL
;
1141 // for item "Disabled"
1143 IfrOptionList
[Index
].Flags
= EFI_IFR_FLAG_INTERACTIVE
;
1144 IfrOptionList
[Index
].Key
= Key
;
1145 IfrOptionList
[Index
].StringToken
= STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
);
1146 IfrOptionList
[Index
].Value
= 0xFF;
1147 IfrOptionList
[Index
].OptionString
= NULL
;
1150 // Get Device Order from variable
1152 VarData
= BdsLibGetVariableAndSize (
1154 &EfiLegacyDevOrderGuid
,
1158 if (NULL
!= VarData
) {
1159 OriginalPtr
= VarData
;
1160 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1161 while (VarData
< VarData
+ VarSize
) {
1162 if (DevOrder
->BbsType
== BbsType
) {
1166 VarData
+= sizeof (BBS_TYPE
);
1167 VarData
+= *(UINT16
*) VarData
;
1168 DevOrder
= (BM_LEGACY_DEV_ORDER_CONTEXT
*) VarData
;
1171 // Create oneof tag here for FD/HD/CD #1 #2
1173 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1174 for (Index2
= 0; Index2
<= OptionMenu
->MenuNumber
; Index2
++) {
1175 IfrOptionList
[Index2
].Key
= (UINT16
) (Key
+ Index
);
1178 // Create the string for oneof tag
1180 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1182 CallbackData
->Hii
->NewString (
1185 CallbackData
->BmmHiiHandle
,
1190 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1192 CallbackData
->Hii
->NewString (
1195 CallbackData
->BmmHiiHandle
,
1201 (UINT16
) (Key
+ Index
),
1206 OptionMenu
->MenuNumber
+ 1,
1210 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1212 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1213 LegacyOrder
[Index
] = 0xFF;
1214 Pos
= (VarDevOrder
& 0xFF) / 8;
1215 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1216 DisMap
[Pos
] |= (UINT8
) (1 << Bit
);
1218 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1221 Location
= Location
+ (OptionMenu
->MenuNumber
+ 2) * ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1222 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
1223 UpdateData
->DataCount
= (UINT16
) (UpdateData
->DataCount
+ (OptionMenu
->MenuNumber
+ 3));
1233 if (IfrOptionList
!= NULL
) {
1234 SafeFreePool (IfrOptionList
);
1235 IfrOptionList
= NULL
;
1238 UpdatePageEnd (CallbackData
, Location
);
1243 BMM_CALLBACK_DATA
*Private
,
1247 UINT16 FileOptionMask
;
1249 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& NewPageId
);
1251 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1253 // If we select a handle to add driver option, advance to the add handle description page.
1255 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1256 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1258 // Return to main page after "Save Changes" or "Discard Changes".
1260 NewPageId
= FORM_MAIN_ID
;
1263 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1264 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1265 Private
->BmmCurrentPageId
= NewPageId
;