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