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