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