]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Clean up BootMaint module in BdsDxe.
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
1 /** @file
2 Dynamically update the pages.
3
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
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
9
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.
12
13 **/
14
15 #include "BootMaint.h"
16
17 /**
18 Refresh the global UpdateData structure.
19
20 @param VOID
21
22 @return VOID
23
24 **/
25 VOID
26 RefreshUpdateData (
27 VOID
28 )
29 {
30 gUpdateData.Offset = 0;
31 }
32
33 /**
34 Add a "Go back to main page" tag in front of the form when there are no
35 "Apply changes" and "Discard changes" tags in the end of the form.
36
37
38 @param CallbackData The BMM context data.
39
40 @return VOID
41
42 **/
43 VOID
44 UpdatePageStart (
45 IN BMM_CALLBACK_DATA *CallbackData
46 )
47 {
48 RefreshUpdateData ();
49
50 if (!(CallbackData->BmmAskSaveOrNot)) {
51 //
52 // Add a "Go back to main page" tag in front of the form when there are no
53 // "Apply changes" and "Discard changes" tags in the end of the form.
54 //
55 CreateGotoOpCode (
56 FORM_MAIN_ID,
57 STRING_TOKEN (STR_FORM_GOTO_MAIN),
58 STRING_TOKEN (STR_FORM_GOTO_MAIN),
59 0,
60 FORM_MAIN_ID,
61 &gUpdateData
62 );
63 }
64
65 }
66
67 /**
68 Create the "Apply changes" and "Discard changes" tags. And
69 ensure user can return to the main page.
70
71 @param CallbackData The BMM context data.
72
73 @return VOID
74
75 **/
76 VOID
77 UpdatePageEnd (
78 IN BMM_CALLBACK_DATA *CallbackData
79 )
80 {
81 //
82 // Create the "Apply changes" and "Discard changes" tags.
83 //
84 if (CallbackData->BmmAskSaveOrNot) {
85 CreateSubTitleOpCode (
86 STRING_TOKEN (STR_NULL_STRING),
87 0,
88 0,
89 0,
90 &gUpdateData
91 );
92
93 CreateGotoOpCode (
94 FORM_MAIN_ID,
95 STRING_TOKEN (STR_SAVE_AND_EXIT),
96 STRING_TOKEN (STR_NULL_STRING),
97 EFI_IFR_FLAG_CALLBACK,
98 KEY_VALUE_SAVE_AND_EXIT,
99 &gUpdateData
100 );
101 }
102
103 //
104 // Ensure user can return to the main page.
105 //
106 CreateGotoOpCode (
107 FORM_MAIN_ID,
108 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
109 STRING_TOKEN (STR_NULL_STRING),
110 EFI_IFR_FLAG_CALLBACK,
111 KEY_VALUE_NO_SAVE_AND_EXIT,
112 &gUpdateData
113 );
114
115 IfrLibUpdateForm (
116 CallbackData->BmmHiiHandle,
117 &mBootMaintGuid,
118 CallbackData->BmmCurrentPageId,
119 CallbackData->BmmCurrentPageId,
120 FALSE,
121 &gUpdateData
122 );
123 }
124
125 /**
126 Clean up the dynamic opcode at label and form specified by
127 both LabelId.
128
129 @param LabelId It is both the Form ID and Label ID for
130 opcode deletion.
131 @param CallbackData The BMM context data.
132
133 @return VOID
134
135 **/
136 VOID
137 CleanUpPage (
138 IN UINT16 LabelId,
139 IN BMM_CALLBACK_DATA *CallbackData
140 )
141 {
142 RefreshUpdateData ();
143
144 //
145 // Remove all op-codes from dynamic page
146 //
147 IfrLibUpdateForm (
148 CallbackData->BmmHiiHandle,
149 &mBootMaintGuid,
150 LabelId,
151 LabelId,
152 FALSE,
153 &gUpdateData
154 );
155 }
156
157 /**
158 Boot a file selected by user at File Expoloer of BMM.
159
160 @param FileContext The file context data, which contains the device path
161 of the file to be boot from.
162
163 @retval EFI_SUCCESS The function completed successfull.
164 @retun Other value if the boot from the file fails.
165
166 **/
167 EFI_STATUS
168 BootThisFile (
169 IN BM_FILE_CONTEXT *FileContext
170 )
171 {
172 EFI_STATUS Status;
173 UINTN ExitDataSize;
174 CHAR16 *ExitData;
175 BDS_COMMON_OPTION *Option;
176
177 Status = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID **) &Option);
178 Option->Description = FileContext->FileName;
179 Option->DevicePath = FileContext->DevicePath;
180 Option->LoadOptionsSize = 0;
181 Option->LoadOptions = NULL;
182
183 //
184 // Since current no boot from removable media directly is allowed */
185 //
186 gST->ConOut->ClearScreen (gST->ConOut);
187
188 gBS->RaiseTPL (TPL_APPLICATION);
189
190 ExitDataSize = 0;
191
192 Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);
193
194 gBS->RestoreTPL (TPL_APPLICATION);
195
196 return Status;
197
198 }
199
200 /**
201 Create a list of Goto Opcode for all terminal devices logged
202 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
203
204 @param CallbackData The BMM context data.
205
206 @return VOID
207
208 **/
209 VOID
210 UpdateConCOMPage (
211 IN BMM_CALLBACK_DATA *CallbackData
212 )
213 {
214 BM_MENU_ENTRY *NewMenuEntry;
215 UINT16 Index;
216
217 CallbackData->BmmAskSaveOrNot = FALSE;
218
219 UpdatePageStart (CallbackData);
220
221
222 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
223 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
224
225 CreateGotoOpCode (
226 FORM_CON_COM_SETUP_ID,
227 NewMenuEntry->DisplayStringToken,
228 STRING_TOKEN (STR_NULL_STRING),
229 EFI_IFR_FLAG_CALLBACK,
230 (UINT16) (TERMINAL_OPTION_OFFSET + Index),
231 &gUpdateData
232 );
233 }
234
235 UpdatePageEnd (CallbackData);
236 }
237
238 /**
239 Create a lit of boot option from global BootOptionMenu. It
240 allow user to delete the boot option.
241
242 @param CallbackData The BMM context data.
243
244 @return VOID
245
246 **/
247 VOID
248 UpdateBootDelPage (
249 IN BMM_CALLBACK_DATA *CallbackData
250 )
251 {
252 BM_MENU_ENTRY *NewMenuEntry;
253 BM_LOAD_CONTEXT *NewLoadContext;
254 UINT16 Index;
255
256 CallbackData->BmmAskSaveOrNot = TRUE;
257
258 UpdatePageStart (CallbackData);
259 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
260
261 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
262 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
263 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
264 if (NewLoadContext->IsLegacy) {
265 continue;
266 }
267
268 NewLoadContext->Deleted = FALSE;
269 CallbackData->BmmFakeNvData.BootOptionDel[Index] = 0x00;
270
271 CreateCheckBoxOpCode (
272 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),
273 VARSTORE_ID_BOOT_MAINT,
274 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),
275 NewMenuEntry->DisplayStringToken,
276 NewMenuEntry->HelpStringToken,
277 0,
278 0,
279 &gUpdateData
280 );
281 }
282
283 UpdatePageEnd (CallbackData);
284 }
285
286 /**
287 Create a lit of driver option from global DriverMenu.
288
289 @param CallbackData The BMM context data.
290
291 @return VOID
292
293 **/
294 VOID
295 UpdateDrvAddHandlePage (
296 IN BMM_CALLBACK_DATA *CallbackData
297 )
298 {
299 BM_MENU_ENTRY *NewMenuEntry;
300 UINT16 Index;
301
302 CallbackData->BmmAskSaveOrNot = FALSE;
303
304 UpdatePageStart (CallbackData);
305
306 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {
307 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);
308
309 CreateGotoOpCode (
310 FORM_DRV_ADD_HANDLE_DESC_ID,
311 NewMenuEntry->DisplayStringToken,
312 STRING_TOKEN (STR_NULL_STRING),
313 EFI_IFR_FLAG_CALLBACK,
314 (UINT16) (HANDLE_OPTION_OFFSET + Index),
315 &gUpdateData
316 );
317 }
318
319 UpdatePageEnd (CallbackData);
320 }
321
322 /**
323 Create a lit of driver option from global DriverOptionMenu. It
324 allow user to delete the driver option.
325
326
327 @param CallbackData The BMM context data.
328
329 @return VOID
330
331 **/
332 VOID
333 UpdateDrvDelPage (
334 IN BMM_CALLBACK_DATA *CallbackData
335 )
336 {
337 BM_MENU_ENTRY *NewMenuEntry;
338 BM_LOAD_CONTEXT *NewLoadContext;
339 UINT16 Index;
340
341 CallbackData->BmmAskSaveOrNot = TRUE;
342
343 UpdatePageStart (CallbackData);
344
345 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);
346
347 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
348 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
349
350 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
351 NewLoadContext->Deleted = FALSE;
352 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = 0x00;
353
354 CreateCheckBoxOpCode (
355 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),
356 VARSTORE_ID_BOOT_MAINT,
357 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),
358 NewMenuEntry->DisplayStringToken,
359 NewMenuEntry->HelpStringToken,
360 0,
361 0,
362 &gUpdateData
363 );
364 }
365
366 UpdatePageEnd (CallbackData);
367 }
368
369 /**
370 Prepare the page to allow user to add description for
371 a Driver Option.
372
373 @param CallbackData The BMM context data.
374
375 @return VOID
376
377 **/
378 VOID
379 UpdateDriverAddHandleDescPage (
380 IN BMM_CALLBACK_DATA *CallbackData
381 )
382 {
383 BM_MENU_ENTRY *NewMenuEntry;
384
385 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;
386 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;
387 CallbackData->BmmAskSaveOrNot = TRUE;
388 NewMenuEntry = CallbackData->MenuEntry;
389
390 UpdatePageStart (CallbackData);
391
392 CreateSubTitleOpCode (
393 NewMenuEntry->DisplayStringToken,
394 0,
395 0,
396 0,
397 &gUpdateData
398 );
399
400 CreateStringOpCode (
401 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,
402 VARSTORE_ID_BOOT_MAINT,
403 DRV_ADD_HANDLE_DESC_VAR_OFFSET,
404 STRING_TOKEN (STR_LOAD_OPTION_DESC),
405 STRING_TOKEN (STR_NULL_STRING),
406 0,
407 0,
408 6,
409 75,
410 &gUpdateData
411 );
412
413 CreateCheckBoxOpCode (
414 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,
415 VARSTORE_ID_BOOT_MAINT,
416 DRV_ADD_RECON_VAR_OFFSET,
417 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
418 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
419 0,
420 0,
421 &gUpdateData
422 );
423
424 CreateStringOpCode (
425 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,
426 VARSTORE_ID_BOOT_MAINT,
427 DRIVER_ADD_OPTION_VAR_OFFSET,
428 STRING_TOKEN (STR_OPTIONAL_DATA),
429 STRING_TOKEN (STR_NULL_STRING),
430 0,
431 0,
432 6,
433 75,
434 &gUpdateData
435 );
436
437 UpdatePageEnd (CallbackData);
438 }
439
440 /**
441 EDES_TODO: Add function description.
442
443 @param UpdatePageId EDES_TODO: Add parameter description
444 @param ConsoleMenu EDES_TODO: Add parameter description
445 @param CallbackData The BMM context data.
446
447 @return VOID
448
449 **/
450 VOID
451 UpdateConsolePage (
452 IN UINT16 UpdatePageId,
453 IN BM_MENU_OPTION *ConsoleMenu,
454 IN BMM_CALLBACK_DATA *CallbackData
455 )
456 {
457 BM_MENU_ENTRY *NewMenuEntry;
458 BM_CONSOLE_CONTEXT *NewConsoleContext;
459 BM_TERMINAL_CONTEXT *NewTerminalContext;
460 UINT16 Index;
461 UINT16 Index2;
462 UINT8 CheckFlags;
463
464 CallbackData->BmmAskSaveOrNot = TRUE;
465
466 UpdatePageStart (CallbackData);
467
468 for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {
469 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);
470 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
471 CheckFlags = 0;
472 if (NewConsoleContext->IsActive) {
473 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
474 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;
475 } else {
476 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;
477 }
478
479 CreateCheckBoxOpCode (
480 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),
481 VARSTORE_ID_BOOT_MAINT,
482 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),
483 NewMenuEntry->DisplayStringToken,
484 NewMenuEntry->HelpStringToken,
485 0,
486 CheckFlags,
487 &gUpdateData
488 );
489 }
490
491 for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {
492 CheckFlags = 0;
493 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);
494 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
495
496 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||
497 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||
498 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))
499 ) {
500 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
501 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;
502 } else {
503 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;
504 }
505
506 CreateCheckBoxOpCode (
507 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),
508 VARSTORE_ID_BOOT_MAINT,
509 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),
510 NewMenuEntry->DisplayStringToken,
511 NewMenuEntry->HelpStringToken,
512 0,
513 CheckFlags,
514 &gUpdateData
515 );
516
517 Index++;
518 }
519
520 UpdatePageEnd (CallbackData);
521 }
522
523 /**
524 Update the page's NV Map if user has changed the order
525 a list. This list can be Boot Order or Driver Order.
526
527 @param UpdatePageId The form ID to be updated.
528 @param OptionMenu The new list.
529 @param CallbackData The BMM context data.
530
531 @return VOID
532
533 **/
534 VOID
535 UpdateOrderPage (
536 IN UINT16 UpdatePageId,
537 IN BM_MENU_OPTION *OptionMenu,
538 IN BMM_CALLBACK_DATA *CallbackData
539 )
540 {
541 BM_MENU_ENTRY *NewMenuEntry;
542 UINT16 Index;
543 IFR_OPTION *IfrOptionList;
544
545 CallbackData->BmmAskSaveOrNot = TRUE;
546
547 UpdatePageStart (CallbackData);
548
549 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
550
551 ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100);
552
553 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);
554 if (NULL == IfrOptionList) {
555 return ;
556 }
557
558 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
559 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
560 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
561 IfrOptionList[Index].Value.u8 = (UINT8) (NewMenuEntry->OptionNumber + 1);
562 IfrOptionList[Index].Flags = 0;
563 CallbackData->BmmFakeNvData.OptionOrder[Index] = IfrOptionList[Index].Value.u8;
564 }
565
566 if (OptionMenu->MenuNumber > 0) {
567 CreateOrderedListOpCode (
568 (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,
569 VARSTORE_ID_BOOT_MAINT,
570 OPTION_ORDER_VAR_OFFSET,
571 STRING_TOKEN (STR_CHANGE_ORDER),
572 STRING_TOKEN (STR_CHANGE_ORDER),
573 0,
574 0,
575 EFI_IFR_NUMERIC_SIZE_1,
576 100,
577 IfrOptionList,
578 OptionMenu->MenuNumber,
579 &gUpdateData
580 );
581 }
582
583 SafeFreePool (IfrOptionList);
584
585 UpdatePageEnd (CallbackData);
586
587 CopyMem (
588 CallbackData->BmmOldFakeNVData.OptionOrder,
589 CallbackData->BmmFakeNvData.OptionOrder,
590 100
591 );
592 }
593
594 /**
595 Create the dynamic page to allow user to set
596 the "BootNext" vaule.
597
598 @param CallbackData The BMM context data.
599
600 @return VOID
601
602 **/
603 VOID
604 UpdateBootNextPage (
605 IN BMM_CALLBACK_DATA *CallbackData
606 )
607 {
608 BM_MENU_ENTRY *NewMenuEntry;
609 BM_LOAD_CONTEXT *NewLoadContext;
610 IFR_OPTION *IfrOptionList;
611 UINTN NumberOfOptions;
612 UINT16 Index;
613
614 IfrOptionList = NULL;
615 NumberOfOptions = BootOptionMenu.MenuNumber;
616 CallbackData->BmmAskSaveOrNot = TRUE;
617
618 UpdatePageStart (CallbackData);
619 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
620
621 if (NumberOfOptions > 0) {
622 IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));
623
624 ASSERT (IfrOptionList);
625
626 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
627
628 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
629 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
630 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
631 if (NewLoadContext->IsBootNext) {
632 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;
633 CallbackData->BmmFakeNvData.BootNext = Index;
634 } else {
635 IfrOptionList[Index].Flags = 0;
636 }
637
638 IfrOptionList[Index].Value.u16 = Index;
639 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
640 }
641
642 IfrOptionList[Index].Value.u16 = Index;
643 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);
644 IfrOptionList[Index].Flags = 0;
645 if (CallbackData->BmmFakeNvData.BootNext == Index) {
646 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;
647 }
648
649 CreateOneOfOpCode (
650 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,
651 VARSTORE_ID_BOOT_MAINT,
652 BOOT_NEXT_VAR_OFFSET,
653 STRING_TOKEN (STR_BOOT_NEXT),
654 STRING_TOKEN (STR_BOOT_NEXT_HELP),
655 0,
656 EFI_IFR_NUMERIC_SIZE_2,
657 IfrOptionList,
658 (UINTN) (NumberOfOptions + 1),
659 &gUpdateData
660 );
661
662 SafeFreePool (IfrOptionList);
663 }
664
665 UpdatePageEnd (CallbackData);
666 }
667
668 /**
669 Create the dynamic page to allow user to set
670 the "TimeOut" vaule.
671
672 @param CallbackData The BMM context data.
673
674 @return VOID
675
676 **/
677 VOID
678 UpdateTimeOutPage (
679 IN BMM_CALLBACK_DATA *CallbackData
680 )
681 {
682 UINT16 BootTimeOut;
683
684 CallbackData->BmmAskSaveOrNot = TRUE;
685
686 UpdatePageStart (CallbackData);
687
688 BootTimeOut = BdsLibGetTimeout ();
689
690 CreateNumericOpCode (
691 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,
692 VARSTORE_ID_BOOT_MAINT,
693 BOOT_TIME_OUT_VAR_OFFSET,
694 STRING_TOKEN (STR_NUM_AUTO_BOOT),
695 STRING_TOKEN (STR_HLP_AUTO_BOOT),
696 0,
697 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,
698 0,
699 65535,
700 0,
701 BootTimeOut,
702 &gUpdateData
703 );
704
705 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
706
707 UpdatePageEnd (CallbackData);
708 }
709
710 /**
711 Refresh the text mode page
712
713
714 @param CallbackData The BMM context data.
715
716 @return VOID
717
718 **/
719 VOID
720 UpdateConModePage (
721 IN BMM_CALLBACK_DATA *CallbackData
722 )
723 {
724 UINTN Mode;
725 UINTN Index;
726 UINTN Col;
727 UINTN Row;
728 CHAR16 RowString[50];
729 CHAR16 ModeString[50];
730 UINTN MaxMode;
731 UINTN ValidMode;
732 EFI_STRING_ID *ModeToken;
733 IFR_OPTION *IfrOptionList;
734 EFI_STATUS Status;
735 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
736
737 ConOut = gST->ConOut;
738 Index = 0;
739 ValidMode = 0;
740 MaxMode = (UINTN) (ConOut->Mode->MaxMode);
741
742 CallbackData->BmmAskSaveOrNot = TRUE;
743
744 UpdatePageStart (CallbackData);
745
746 //
747 // Check valid mode
748 //
749 for (Mode = 0; Mode < MaxMode; Mode++) {
750 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
751 if (EFI_ERROR (Status)) {
752 continue;
753 }
754 ValidMode++;
755 }
756
757 if (ValidMode == 0) {
758 return;
759 }
760
761 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * ValidMode);
762 ASSERT(IfrOptionList != NULL);
763
764 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);
765 ASSERT(ModeToken != NULL);
766
767 //
768 // Determin which mode should be the first entry in menu
769 //
770 GetConsoleOutMode (CallbackData);
771
772 //
773 // Build text mode options
774 //
775 for (Mode = 0; Mode < MaxMode; Mode++) {
776 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
777 if (EFI_ERROR (Status)) {
778 continue;
779 }
780 //
781 // Build mode string Column x Row
782 //
783 UnicodeValueToString (ModeString, 0, Col, 0);
784 StrCat (ModeString, L" x ");
785 UnicodeValueToString (RowString, 0, Row, 0);
786 StrCat (ModeString, RowString);
787
788 HiiLibNewString (CallbackData->BmmHiiHandle, &ModeToken[Index], ModeString);
789
790 IfrOptionList[Index].StringToken = ModeToken[Index];
791 IfrOptionList[Index].Value.u16 = (UINT16) Mode;
792 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {
793 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;
794 } else {
795 IfrOptionList[Index].Flags = 0;
796 }
797 Index++;
798 }
799
800 CreateOneOfOpCode (
801 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,
802 VARSTORE_ID_BOOT_MAINT,
803 CON_MODE_VAR_OFFSET,
804 STRING_TOKEN (STR_CON_MODE_SETUP),
805 STRING_TOKEN (STR_CON_MODE_SETUP),
806 EFI_IFR_FLAG_RESET_REQUIRED,
807 EFI_IFR_NUMERIC_SIZE_2,
808 IfrOptionList,
809 ValidMode,
810 &gUpdateData
811 );
812 SafeFreePool (IfrOptionList);
813 SafeFreePool (ModeToken);
814
815 UpdatePageEnd (CallbackData);
816 }
817
818 /**
819 Create the dynamic page which allows user to
820 set the property such as Baud Rate, Data Bits,
821 Parity, Stop Bits, Terminal Type.
822
823 @param CallbackData The BMM context data.
824
825 @return VOID
826
827 **/
828 VOID
829 UpdateTerminalPage (
830 IN BMM_CALLBACK_DATA *CallbackData
831 )
832 {
833 UINT8 Index;
834 UINT8 CheckFlags;
835 IFR_OPTION *IfrOptionList;
836 BM_MENU_ENTRY *NewMenuEntry;
837 BM_TERMINAL_CONTEXT *NewTerminalContext;
838
839 CallbackData->BmmAskSaveOrNot = TRUE;
840
841 UpdatePageStart (CallbackData);
842
843 NewMenuEntry = BOpt_GetMenuEntry (
844 &TerminalMenu,
845 CallbackData->CurrentTerminal
846 );
847
848 if (NewMenuEntry == NULL) {
849 return ;
850 }
851
852 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
853
854 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 19);
855 if (IfrOptionList == NULL) {
856 return ;
857 }
858
859 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {
860 CheckFlags = 0;
861 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
862 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
863 NewTerminalContext->BaudRateIndex = Index;
864 CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;
865 }
866
867 IfrOptionList[Index].Flags = CheckFlags;
868 IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;
869 IfrOptionList[Index].Value.u8 = Index;
870 }
871
872 CreateOneOfOpCode (
873 (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,
874 VARSTORE_ID_BOOT_MAINT,
875 COM_BAUD_RATE_VAR_OFFSET,
876 STRING_TOKEN (STR_COM_BAUD_RATE),
877 STRING_TOKEN (STR_COM_BAUD_RATE),
878 0,
879 EFI_IFR_NUMERIC_SIZE_1,
880 IfrOptionList,
881 19,
882 &gUpdateData
883 );
884
885 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {
886 CheckFlags = 0;
887
888 if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
889 NewTerminalContext->DataBitsIndex = Index;
890 CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;
891 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
892 }
893
894 IfrOptionList[Index].Flags = CheckFlags;
895 IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;
896 IfrOptionList[Index].Value.u8 = Index;
897 }
898
899 CreateOneOfOpCode (
900 (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,
901 VARSTORE_ID_BOOT_MAINT,
902 COM_DATA_RATE_VAR_OFFSET,
903 STRING_TOKEN (STR_COM_DATA_BITS),
904 STRING_TOKEN (STR_COM_DATA_BITS),
905 0,
906 EFI_IFR_NUMERIC_SIZE_1,
907 IfrOptionList,
908 4,
909 &gUpdateData
910 );
911
912 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {
913 CheckFlags = 0;
914 if (NewTerminalContext->Parity == ParityList[Index].Value) {
915 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
916 NewTerminalContext->ParityIndex = (UINT8) Index;
917 CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;
918 }
919
920 IfrOptionList[Index].Flags = CheckFlags;
921 IfrOptionList[Index].StringToken = ParityList[Index].StringToken;
922 IfrOptionList[Index].Value.u8 = Index;
923 }
924
925 CreateOneOfOpCode (
926 (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,
927 VARSTORE_ID_BOOT_MAINT,
928 COM_PARITY_VAR_OFFSET,
929 STRING_TOKEN (STR_COM_PARITY),
930 STRING_TOKEN (STR_COM_PARITY),
931 0,
932 EFI_IFR_NUMERIC_SIZE_1,
933 IfrOptionList,
934 5,
935 &gUpdateData
936 );
937
938 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {
939 CheckFlags = 0;
940 if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
941 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
942 NewTerminalContext->StopBitsIndex = (UINT8) Index;
943 CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;
944 }
945
946 IfrOptionList[Index].Flags = CheckFlags;
947 IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;
948 IfrOptionList[Index].Value.u8 = Index;
949 }
950
951 CreateOneOfOpCode (
952 (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,
953 VARSTORE_ID_BOOT_MAINT,
954 COM_STOP_BITS_VAR_OFFSET,
955 STRING_TOKEN (STR_COM_STOP_BITS),
956 STRING_TOKEN (STR_COM_STOP_BITS),
957 0,
958 EFI_IFR_NUMERIC_SIZE_1,
959 IfrOptionList,
960 3,
961 &gUpdateData
962 );
963
964 for (Index = 0; Index < 4; Index++) {
965 CheckFlags = 0;
966 if (NewTerminalContext->TerminalType == Index) {
967 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
968 CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;
969 }
970
971 IfrOptionList[Index].Flags = CheckFlags;
972 IfrOptionList[Index].StringToken = (EFI_STRING_ID) TerminalType[Index];
973 IfrOptionList[Index].Value.u8 = Index;
974 }
975
976 CreateOneOfOpCode (
977 (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,
978 VARSTORE_ID_BOOT_MAINT,
979 COM_TERMINAL_VAR_OFFSET,
980 STRING_TOKEN (STR_COM_TERMI_TYPE),
981 STRING_TOKEN (STR_COM_TERMI_TYPE),
982 0,
983 EFI_IFR_NUMERIC_SIZE_1,
984 IfrOptionList,
985 4,
986 &gUpdateData
987 );
988
989 SafeFreePool (IfrOptionList);
990
991 UpdatePageEnd (CallbackData);
992 }
993
994 /**
995 Dispatch the correct update page function to call based on
996 the UpdatePageId.
997
998 @param UpdatePageId The form ID.
999 @param CallbackData The BMM context data.
1000
1001 @return VOID
1002
1003 **/
1004 VOID
1005 UpdatePageBody (
1006 IN UINT16 UpdatePageId,
1007 IN BMM_CALLBACK_DATA *CallbackData
1008 )
1009 {
1010 CleanUpPage (UpdatePageId, CallbackData);
1011 switch (UpdatePageId) {
1012 case FORM_CON_IN_ID:
1013 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);
1014 break;
1015
1016 case FORM_CON_OUT_ID:
1017 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);
1018 break;
1019
1020 case FORM_CON_ERR_ID:
1021 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);
1022 break;
1023
1024 case FORM_BOOT_CHG_ID:
1025 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);
1026 break;
1027
1028 case FORM_DRV_CHG_ID:
1029 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);
1030 break;
1031
1032 default:
1033 break;
1034 }
1035 }
1036
1037 /**
1038 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
1039 specified by DeviceType.
1040
1041 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
1042 etc.
1043 @param OptionIndex Returns the index number (#### in Boot####).
1044 @param OptionSize Return the size of the Boot### variable.
1045
1046 @return VOID
1047
1048 **/
1049 VOID *
1050 GetLegacyBootOptionVar (
1051 IN UINTN DeviceType,
1052 OUT UINTN *OptionIndex,
1053 OUT UINTN *OptionSize
1054 )
1055 {
1056 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
1057 VOID *OptionBuffer;
1058 UINTN OrderSize;
1059 UINTN Index;
1060 UINT16 *OrderBuffer;
1061 CHAR16 StrTemp[100];
1062 UINT16 FilePathSize;
1063 UINT8 *Ptr;
1064 UINT8 *OptionalData;
1065
1066 //
1067 // Get Boot Option number from the size of BootOrder
1068 //
1069 OrderBuffer = BdsLibGetVariableAndSize (
1070 L"BootOrder",
1071 &gEfiGlobalVariableGuid,
1072 &OrderSize
1073 );
1074
1075 for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {
1076 UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);
1077 OptionBuffer = BdsLibGetVariableAndSize (
1078 StrTemp,
1079 &gEfiGlobalVariableGuid,
1080 OptionSize
1081 );
1082 if (NULL == OptionBuffer) {
1083 continue;
1084 }
1085
1086 Ptr = (UINT8 *) OptionBuffer;
1087 Ptr += sizeof (UINT32);
1088
1089 FilePathSize = *(UINT16 *) Ptr;
1090 Ptr += sizeof (UINT16);
1091
1092 Ptr += StrSize ((CHAR16 *) Ptr);
1093
1094 //
1095 // Now Ptr point to Device Path
1096 //
1097 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
1098 Ptr += FilePathSize;
1099
1100 //
1101 // Now Ptr point to Optional Data
1102 //
1103 OptionalData = Ptr;
1104
1105 if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&
1106 (BBS_DEVICE_PATH == DevicePath->Type) &&
1107 (BBS_BBS_DP == DevicePath->SubType)
1108 ) {
1109 *OptionIndex = OrderBuffer[Index];
1110 SafeFreePool (OrderBuffer);
1111 return OptionBuffer;
1112 } else {
1113 SafeFreePool (OptionBuffer);
1114 }
1115 }
1116
1117 SafeFreePool (OrderBuffer);
1118 return NULL;
1119 }
1120
1121 /**
1122 Create a dynamic page so that Legacy Device boot order
1123 can be set for specified device type.
1124
1125 @param UpdatePageId The form ID. It also spefies the legacy device type.
1126 @param CallbackData The BMM context data.
1127
1128 @return VOID
1129
1130 **/
1131 VOID
1132 UpdateSetLegacyDeviceOrderPage (
1133 IN UINT16 UpdatePageId,
1134 IN BMM_CALLBACK_DATA *CallbackData
1135 )
1136 {
1137 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;
1138 BM_MENU_OPTION *OptionMenu;
1139 BM_MENU_ENTRY *NewMenuEntry;
1140 IFR_OPTION *IfrOptionList;
1141 EFI_STRING_ID StrRef;
1142 EFI_STRING_ID StrRefHelp;
1143 BBS_TYPE BbsType;
1144 UINTN VarSize;
1145 UINTN Pos;
1146 UINTN Bit;
1147 UINT16 Index;
1148 UINT16 Key;
1149 CHAR16 String[100];
1150 CHAR16 *TypeStr;
1151 CHAR16 *TypeStrHelp;
1152 UINT16 VarDevOrder;
1153 UINT8 *VarData;
1154 UINT8 *LegacyOrder;
1155 UINT8 *OldData;
1156 UINT8 *DisMap;
1157
1158 OptionMenu = NULL;
1159 Key = 0;
1160 StrRef = 0;
1161 StrRefHelp = 0;
1162 TypeStr = NULL;
1163 TypeStrHelp = NULL;
1164 BbsType = BBS_FLOPPY;
1165 LegacyOrder = NULL;
1166 OldData = NULL;
1167 DisMap = NULL;
1168
1169 CallbackData->BmmAskSaveOrNot = TRUE;
1170 UpdatePageStart (CallbackData);
1171
1172 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;
1173
1174 SetMem (DisMap, 32, 0);
1175 //
1176 // Create oneof option list
1177 //
1178 switch (UpdatePageId) {
1179 case FORM_SET_FD_ORDER_ID:
1180 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;
1181 Key = (UINT16) LEGACY_FD_QUESTION_ID;
1182 TypeStr = StrFloppy;
1183 TypeStrHelp = StrFloppyHelp;
1184 BbsType = BBS_FLOPPY;
1185 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;
1186 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;
1187 break;
1188
1189 case FORM_SET_HD_ORDER_ID:
1190 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;
1191 Key = (UINT16) LEGACY_HD_QUESTION_ID;
1192 TypeStr = StrHardDisk;
1193 TypeStrHelp = StrHardDiskHelp;
1194 BbsType = BBS_HARDDISK;
1195 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;
1196 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;
1197 break;
1198
1199 case FORM_SET_CD_ORDER_ID:
1200 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;
1201 Key = (UINT16) LEGACY_CD_QUESTION_ID;
1202 TypeStr = StrCDROM;
1203 TypeStrHelp = StrCDROMHelp;
1204 BbsType = BBS_CDROM;
1205 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;
1206 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;
1207 break;
1208
1209 case FORM_SET_NET_ORDER_ID:
1210 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;
1211 Key = (UINT16) LEGACY_NET_QUESTION_ID;
1212 TypeStr = StrNET;
1213 TypeStrHelp = StrNETHelp;
1214 BbsType = BBS_EMBED_NETWORK;
1215 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;
1216 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;
1217 break;
1218
1219 case FORM_SET_BEV_ORDER_ID:
1220 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;
1221 Key = (UINT16) LEGACY_BEV_QUESTION_ID;
1222 TypeStr = StrBEV;
1223 TypeStrHelp = StrBEVHelp;
1224 BbsType = BBS_BEV_DEVICE;
1225 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;
1226 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;
1227 break;
1228
1229 }
1230
1231 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
1232
1233 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));
1234 if (NULL == IfrOptionList) {
1235 return ;
1236 }
1237
1238 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
1239 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
1240 IfrOptionList[Index].Flags = 0;
1241 if (0 == Index) {
1242 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;
1243 }
1244
1245 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
1246 IfrOptionList[Index].Value.u8 = (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;
1247 }
1248 //
1249 // for item "Disabled"
1250 //
1251 IfrOptionList[Index].Flags = 0;
1252 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);
1253 IfrOptionList[Index].Value.u8 = 0xFF;
1254
1255 //
1256 // Get Device Order from variable
1257 //
1258 VarData = BdsLibGetVariableAndSize (
1259 VAR_LEGACY_DEV_ORDER,
1260 &EfiLegacyDevOrderGuid,
1261 &VarSize
1262 );
1263
1264 if (NULL != VarData) {
1265 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
1266 while (VarData < VarData + VarSize) {
1267 if (DevOrder->BbsType == BbsType) {
1268 break;
1269 }
1270
1271 VarData += sizeof (BBS_TYPE);
1272 VarData += *(UINT16 *) VarData;
1273 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
1274 }
1275 //
1276 // Create oneof tag here for FD/HD/CD #1 #2
1277 //
1278 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
1279 //
1280 // Create the string for oneof tag
1281 //
1282 UnicodeSPrint (String, sizeof (String), TypeStr, Index);
1283 StrRef = 0;
1284 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRef, String);
1285
1286 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);
1287 StrRefHelp = 0;
1288 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRefHelp, String);
1289
1290 CreateOneOfOpCode (
1291 (EFI_QUESTION_ID) (Key + Index),
1292 VARSTORE_ID_BOOT_MAINT,
1293 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),
1294 StrRef,
1295 StrRefHelp,
1296 EFI_IFR_FLAG_CALLBACK,
1297 EFI_IFR_NUMERIC_SIZE_1,
1298 IfrOptionList,
1299 OptionMenu->MenuNumber + 1,
1300 &gUpdateData
1301 );
1302
1303 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));
1304
1305 if (0xFF00 == (VarDevOrder & 0xFF00)) {
1306 LegacyOrder[Index] = 0xFF;
1307 Pos = (VarDevOrder & 0xFF) / 8;
1308 Bit = 7 - ((VarDevOrder & 0xFF) % 8);
1309 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));
1310 } else {
1311 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);
1312 }
1313 }
1314 }
1315
1316 CopyMem (OldData, LegacyOrder, 100);
1317
1318 if (IfrOptionList != NULL) {
1319 SafeFreePool (IfrOptionList);
1320 IfrOptionList = NULL;
1321 }
1322
1323 UpdatePageEnd (CallbackData);
1324 }
1325
1326 /**
1327 Dispatch the display to the next page based on NewPageId.
1328
1329 @param Private The BMM context data.
1330 @param NewPageId The original page ID.
1331
1332 @return VOID
1333
1334 **/
1335 VOID
1336 UpdatePageId (
1337 BMM_CALLBACK_DATA *Private,
1338 UINT16 NewPageId
1339 )
1340 {
1341 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {
1342 //
1343 // If we select a handle to add driver option, advance to the add handle description page.
1344 //
1345 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;
1346 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {
1347 //
1348 // Return to main page after "Save Changes" or "Discard Changes".
1349 //
1350 NewPageId = FORM_MAIN_ID;
1351 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {
1352 NewPageId = FORM_CON_COM_SETUP_ID;
1353 }
1354
1355 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {
1356 Private->BmmPreviousPageId = Private->BmmCurrentPageId;
1357 Private->BmmCurrentPageId = NewPageId;
1358 }
1359 }