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