]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
1 /** @file
2 Dynamically update the pages.
3
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include "BootMaintenanceManager.h"
10
11 /**
12 Create the global UpdateData structure.
13
14 **/
15 VOID
16 CreateUpdateData (
17 VOID
18 )
19 {
20 //
21 // Init OpCode Handle and Allocate space for creation of Buffer
22 //
23 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();
24 ASSERT (mStartOpCodeHandle != NULL);
25
26 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();
27 ASSERT (mEndOpCodeHandle != NULL);
28
29 //
30 // Create Hii Extend Label OpCode as the start opcode
31 //
32 mStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
33 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
34
35 //
36 // Create Hii Extend Label OpCode as the end opcode
37 //
38 mEndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
39 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
40 mEndLabel->Number = LABEL_END;
41 }
42
43 /**
44 Refresh the global UpdateData structure.
45
46 **/
47 VOID
48 RefreshUpdateData (
49 VOID
50 )
51 {
52 //
53 // Free current updated date
54 //
55 if (mStartOpCodeHandle != NULL) {
56 HiiFreeOpCodeHandle (mStartOpCodeHandle);
57 }
58
59 //
60 // Create new OpCode Handle
61 //
62 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();
63
64 //
65 // Create Hii Extend Label OpCode as the start opcode
66 //
67 mStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
68 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
69 }
70
71 /**
72 Add a "Go back to main page" tag in front of the form when there are no
73 "Apply changes" and "Discard changes" tags in the end of the form.
74
75 @param CallbackData The BMM context data.
76
77 **/
78 VOID
79 UpdatePageStart (
80 IN BMM_CALLBACK_DATA *CallbackData
81 )
82 {
83 RefreshUpdateData ();
84 mStartLabel->Number = CallbackData->BmmCurrentPageId;
85
86 if (!(CallbackData->BmmAskSaveOrNot)) {
87 //
88 // Add a "Go back to main page" tag in front of the form when there are no
89 // "Apply changes" and "Discard changes" tags in the end of the form.
90 //
91 HiiCreateGotoOpCode (
92 mStartOpCodeHandle,
93 FORM_MAIN_ID,
94 STRING_TOKEN (STR_FORM_GOTO_MAIN),
95 STRING_TOKEN (STR_FORM_GOTO_MAIN),
96 0,
97 FORM_MAIN_ID
98 );
99 }
100 }
101
102 /**
103 Create the "Apply changes" and "Discard changes" tags. And
104 ensure user can return to the main page.
105
106 @param CallbackData The BMM context data.
107
108 **/
109 VOID
110 UpdatePageEnd (
111 IN BMM_CALLBACK_DATA *CallbackData
112 )
113 {
114 //
115 // Create the "Apply changes" and "Discard changes" tags.
116 //
117 if (CallbackData->BmmAskSaveOrNot) {
118 HiiCreateSubTitleOpCode (
119 mStartOpCodeHandle,
120 STRING_TOKEN (STR_NULL_STRING),
121 0,
122 0,
123 0
124 );
125
126 HiiCreateActionOpCode (
127 mStartOpCodeHandle,
128 KEY_VALUE_SAVE_AND_EXIT,
129 STRING_TOKEN (STR_SAVE_AND_EXIT),
130 STRING_TOKEN (STR_NULL_STRING),
131 EFI_IFR_FLAG_CALLBACK,
132 0
133 );
134 }
135
136 //
137 // Ensure user can return to the main page.
138 //
139 HiiCreateActionOpCode (
140 mStartOpCodeHandle,
141 KEY_VALUE_NO_SAVE_AND_EXIT,
142 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
143 STRING_TOKEN (STR_NULL_STRING),
144 EFI_IFR_FLAG_CALLBACK,
145 0
146 );
147
148 HiiUpdateForm (
149 CallbackData->BmmHiiHandle,
150 &mBootMaintGuid,
151 CallbackData->BmmCurrentPageId,
152 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId
153 mEndOpCodeHandle // LABEL_END
154 );
155 }
156
157 /**
158 Clean up the dynamic opcode at label and form specified by both LabelId.
159
160 @param LabelId It is both the Form ID and Label ID for opcode deletion.
161 @param CallbackData The BMM context data.
162
163 **/
164 VOID
165 CleanUpPage (
166 IN UINT16 LabelId,
167 IN BMM_CALLBACK_DATA *CallbackData
168 )
169 {
170 RefreshUpdateData ();
171
172 //
173 // Remove all op-codes from dynamic page
174 //
175 mStartLabel->Number = LabelId;
176 HiiUpdateForm (
177 CallbackData->BmmHiiHandle,
178 &mBootMaintGuid,
179 LabelId,
180 mStartOpCodeHandle, // Label LabelId
181 mEndOpCodeHandle // LABEL_END
182 );
183 }
184
185 /**
186 Create a list of Goto Opcode for all terminal devices logged
187 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
188
189 @param CallbackData The BMM context data.
190 **/
191 VOID
192 UpdateConCOMPage (
193 IN BMM_CALLBACK_DATA *CallbackData
194 )
195 {
196 BM_MENU_ENTRY *NewMenuEntry;
197 UINT16 Index;
198
199 CallbackData->BmmAskSaveOrNot = TRUE;
200
201 UpdatePageStart (CallbackData);
202
203 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
204 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
205
206 HiiCreateGotoOpCode (
207 mStartOpCodeHandle,
208 FORM_CON_COM_SETUP_ID,
209 NewMenuEntry->DisplayStringToken,
210 STRING_TOKEN (STR_NULL_STRING),
211 EFI_IFR_FLAG_CALLBACK,
212 (UINT16)(TERMINAL_OPTION_OFFSET + Index)
213 );
214 }
215
216 UpdatePageEnd (CallbackData);
217 }
218
219 /**
220 Create a list of boot option from global BootOptionMenu. It
221 allow user to delete the boot option.
222
223 @param CallbackData The BMM context data.
224
225 **/
226 VOID
227 UpdateBootDelPage (
228 IN BMM_CALLBACK_DATA *CallbackData
229 )
230 {
231 BM_MENU_ENTRY *NewMenuEntry;
232 BM_LOAD_CONTEXT *NewLoadContext;
233 UINT16 Index;
234
235 CallbackData->BmmAskSaveOrNot = TRUE;
236
237 UpdatePageStart (CallbackData);
238
239 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));
240 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
241 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
242 NewLoadContext = (BM_LOAD_CONTEXT *)NewMenuEntry->VariableContext;
243 if (NewLoadContext->IsLegacy) {
244 continue;
245 }
246
247 NewLoadContext->Deleted = FALSE;
248
249 if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {
250 //
251 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
252 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
253 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
254 // through HiiSetBrowserData function.
255 //
256 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;
257 CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;
258 }
259
260 HiiCreateCheckBoxOpCode (
261 mStartOpCodeHandle,
262 (EFI_QUESTION_ID)(BOOT_OPTION_DEL_QUESTION_ID + Index),
263 VARSTORE_ID_BOOT_MAINT,
264 (UINT16)(BOOT_OPTION_DEL_VAR_OFFSET + Index),
265 NewMenuEntry->DisplayStringToken,
266 NewMenuEntry->HelpStringToken,
267 EFI_IFR_FLAG_CALLBACK,
268 0,
269 NULL
270 );
271 }
272
273 UpdatePageEnd (CallbackData);
274 }
275
276 /**
277 Create a lit of driver option from global DriverMenu.
278
279 @param CallbackData The BMM context data.
280
281 **/
282 VOID
283 UpdateDrvAddHandlePage (
284 IN BMM_CALLBACK_DATA *CallbackData
285 )
286 {
287 BM_MENU_ENTRY *NewMenuEntry;
288 UINT16 Index;
289
290 CallbackData->BmmAskSaveOrNot = FALSE;
291
292 UpdatePageStart (CallbackData);
293
294 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {
295 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);
296
297 HiiCreateGotoOpCode (
298 mStartOpCodeHandle,
299 FORM_DRV_ADD_HANDLE_DESC_ID,
300 NewMenuEntry->DisplayStringToken,
301 STRING_TOKEN (STR_NULL_STRING),
302 EFI_IFR_FLAG_CALLBACK,
303 (UINT16)(HANDLE_OPTION_OFFSET + Index)
304 );
305 }
306
307 UpdatePageEnd (CallbackData);
308 }
309
310 /**
311 Create a lit of driver option from global DriverOptionMenu. It
312 allow user to delete the driver option.
313
314 @param CallbackData The BMM context data.
315
316 **/
317 VOID
318 UpdateDrvDelPage (
319 IN BMM_CALLBACK_DATA *CallbackData
320 )
321 {
322 BM_MENU_ENTRY *NewMenuEntry;
323 BM_LOAD_CONTEXT *NewLoadContext;
324 UINT16 Index;
325
326 CallbackData->BmmAskSaveOrNot = TRUE;
327
328 UpdatePageStart (CallbackData);
329
330 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));
331 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
332 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
333
334 NewLoadContext = (BM_LOAD_CONTEXT *)NewMenuEntry->VariableContext;
335 NewLoadContext->Deleted = FALSE;
336
337 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {
338 //
339 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
340 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
341 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
342 // through HiiSetBrowserData function.
343 //
344 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;
345 CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;
346 }
347
348 HiiCreateCheckBoxOpCode (
349 mStartOpCodeHandle,
350 (EFI_QUESTION_ID)(DRIVER_OPTION_DEL_QUESTION_ID + Index),
351 VARSTORE_ID_BOOT_MAINT,
352 (UINT16)(DRIVER_OPTION_DEL_VAR_OFFSET + Index),
353 NewMenuEntry->DisplayStringToken,
354 NewMenuEntry->HelpStringToken,
355 EFI_IFR_FLAG_CALLBACK,
356 0,
357 NULL
358 );
359 }
360
361 UpdatePageEnd (CallbackData);
362 }
363
364 /**
365 Prepare the page to allow user to add description for
366 a Driver Option.
367
368 @param CallbackData The BMM context data.
369
370 **/
371 VOID
372 UpdateDriverAddHandleDescPage (
373 IN BMM_CALLBACK_DATA *CallbackData
374 )
375 {
376 BM_MENU_ENTRY *NewMenuEntry;
377
378 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;
379 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;
380 CallbackData->BmmAskSaveOrNot = TRUE;
381 NewMenuEntry = CallbackData->MenuEntry;
382
383 UpdatePageStart (CallbackData);
384
385 HiiCreateSubTitleOpCode (
386 mStartOpCodeHandle,
387 NewMenuEntry->DisplayStringToken,
388 0,
389 0,
390 0
391 );
392
393 HiiCreateStringOpCode (
394 mStartOpCodeHandle,
395 (EFI_QUESTION_ID)DRV_ADD_HANDLE_DESC_QUESTION_ID,
396 VARSTORE_ID_BOOT_MAINT,
397 DRV_ADD_HANDLE_DESC_VAR_OFFSET,
398 STRING_TOKEN (STR_LOAD_OPTION_DESC),
399 STRING_TOKEN (STR_NULL_STRING),
400 0,
401 0,
402 6,
403 75,
404 NULL
405 );
406
407 HiiCreateCheckBoxOpCode (
408 mStartOpCodeHandle,
409 (EFI_QUESTION_ID)DRV_ADD_RECON_QUESTION_ID,
410 VARSTORE_ID_BOOT_MAINT,
411 DRV_ADD_RECON_VAR_OFFSET,
412 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
413 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
414 0,
415 0,
416 NULL
417 );
418
419 HiiCreateStringOpCode (
420 mStartOpCodeHandle,
421 (EFI_QUESTION_ID)DRIVER_ADD_OPTION_QUESTION_ID,
422 VARSTORE_ID_BOOT_MAINT,
423 DRIVER_ADD_OPTION_VAR_OFFSET,
424 STRING_TOKEN (STR_OPTIONAL_DATA),
425 STRING_TOKEN (STR_NULL_STRING),
426 0,
427 0,
428 6,
429 75,
430 NULL
431 );
432
433 UpdatePageEnd (CallbackData);
434 }
435
436 /**
437 Update console page.
438
439 @param UpdatePageId The form ID to be updated.
440 @param ConsoleMenu The console menu list.
441 @param CallbackData The BMM context data.
442
443 **/
444 VOID
445 UpdateConsolePage (
446 IN UINT16 UpdatePageId,
447 IN BM_MENU_OPTION *ConsoleMenu,
448 IN BMM_CALLBACK_DATA *CallbackData
449 )
450 {
451 BM_MENU_ENTRY *NewMenuEntry;
452 BM_CONSOLE_CONTEXT *NewConsoleContext;
453 BM_TERMINAL_CONTEXT *NewTerminalContext;
454 UINT16 Index;
455 UINT16 Index2;
456 UINT8 CheckFlags;
457 UINT8 *ConsoleCheck;
458 EFI_QUESTION_ID QuestionIdBase;
459 UINT16 VariableOffsetBase;
460
461 CallbackData->BmmAskSaveOrNot = TRUE;
462
463 UpdatePageStart (CallbackData);
464
465 ConsoleCheck = NULL;
466 QuestionIdBase = 0;
467 VariableOffsetBase = 0;
468
469 switch (UpdatePageId) {
470 case FORM_CON_IN_ID:
471 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];
472 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;
473 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;
474 break;
475
476 case FORM_CON_OUT_ID:
477 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];
478 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;
479 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;
480 break;
481
482 case FORM_CON_ERR_ID:
483 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];
484 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;
485 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;
486 break;
487 }
488
489 ASSERT (ConsoleCheck != NULL);
490
491 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \
492 (Index < MAX_MENU_NUMBER)); Index++)
493 {
494 CheckFlags = 0;
495 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);
496 NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;
497 if (NewConsoleContext->IsActive) {
498 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
499 ConsoleCheck[Index] = TRUE;
500 } else {
501 ConsoleCheck[Index] = FALSE;
502 }
503
504 HiiCreateCheckBoxOpCode (
505 mStartOpCodeHandle,
506 (EFI_QUESTION_ID)(QuestionIdBase + Index),
507 VARSTORE_ID_BOOT_MAINT,
508 (UINT16)(VariableOffsetBase + Index),
509 NewMenuEntry->DisplayStringToken,
510 NewMenuEntry->HelpStringToken,
511 EFI_IFR_FLAG_CALLBACK,
512 CheckFlags,
513 NULL
514 );
515 }
516
517 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \
518 (Index2 < MAX_MENU_NUMBER)); Index2++)
519 {
520 CheckFlags = 0;
521 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);
522 NewTerminalContext = (BM_TERMINAL_CONTEXT *)NewMenuEntry->VariableContext;
523
524 ASSERT (Index < MAX_MENU_NUMBER);
525 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||
526 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||
527 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))
528 )
529 {
530 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
531 ConsoleCheck[Index] = TRUE;
532 } else {
533 ConsoleCheck[Index] = FALSE;
534 }
535
536 HiiCreateCheckBoxOpCode (
537 mStartOpCodeHandle,
538 (EFI_QUESTION_ID)(QuestionIdBase + Index),
539 VARSTORE_ID_BOOT_MAINT,
540 (UINT16)(VariableOffsetBase + Index),
541 NewMenuEntry->DisplayStringToken,
542 NewMenuEntry->HelpStringToken,
543 EFI_IFR_FLAG_CALLBACK,
544 CheckFlags,
545 NULL
546 );
547
548 Index++;
549 }
550
551 UpdatePageEnd (CallbackData);
552 }
553
554 /**
555 Update the page's NV Map if user has changed the order
556 a list. This list can be Boot Order or Driver Order.
557
558 @param UpdatePageId The form ID to be updated.
559 @param OptionMenu The new list.
560 @param CallbackData The BMM context data.
561
562 **/
563 VOID
564 UpdateOrderPage (
565 IN UINT16 UpdatePageId,
566 IN BM_MENU_OPTION *OptionMenu,
567 IN BMM_CALLBACK_DATA *CallbackData
568 )
569 {
570 BM_MENU_ENTRY *NewMenuEntry;
571 UINT16 Index;
572 UINT16 OptionIndex;
573 VOID *OptionsOpCodeHandle;
574 BOOLEAN BootOptionFound;
575 UINT32 *OptionOrder;
576 EFI_QUESTION_ID QuestionId;
577 UINT16 VarOffset;
578
579 CallbackData->BmmAskSaveOrNot = TRUE;
580 UpdatePageStart (CallbackData);
581
582 OptionOrder = NULL;
583 QuestionId = 0;
584 VarOffset = 0;
585 switch (UpdatePageId) {
586 case FORM_BOOT_CHG_ID:
587 //
588 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
589 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.
590 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,
591 // so we should not get the data from BootOptionMenu to show it.
592 //
593 if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {
594 GetBootOrder (CallbackData);
595 }
596
597 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;
598 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;
599 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;
600 break;
601
602 case FORM_DRV_CHG_ID:
603 //
604 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
605 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.
606 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,
607 // so we should not get the data from DriverOptionMenu to show it.
608 //
609 if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {
610 GetDriverOrder (CallbackData);
611 }
612
613 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;
614 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;
615 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;
616 break;
617 }
618
619 ASSERT (OptionOrder != NULL);
620
621 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
622 ASSERT (OptionsOpCodeHandle != NULL);
623
624 NewMenuEntry = NULL;
625 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {
626 BootOptionFound = FALSE;
627 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
628 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
629 if ((UINT32)(NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {
630 BootOptionFound = TRUE;
631 break;
632 }
633 }
634
635 if (BootOptionFound) {
636 HiiCreateOneOfOptionOpCode (
637 OptionsOpCodeHandle,
638 NewMenuEntry->DisplayStringToken,
639 0,
640 EFI_IFR_TYPE_NUM_SIZE_32,
641 OptionOrder[OptionIndex]
642 );
643 }
644 }
645
646 if (OptionMenu->MenuNumber > 0) {
647 HiiCreateOrderedListOpCode (
648 mStartOpCodeHandle, // Container for dynamic created opcodes
649 QuestionId, // Question ID
650 VARSTORE_ID_BOOT_MAINT, // VarStore ID
651 VarOffset, // Offset in Buffer Storage
652 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text
653 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text
654 0, // Question flag
655 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
656 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value
657 100, // Maximum container
658 OptionsOpCodeHandle, // Option Opcode list
659 NULL // Default Opcode is NULL
660 );
661 }
662
663 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
664
665 UpdatePageEnd (CallbackData);
666 }
667
668 /**
669 Refresh the text mode page.
670
671 @param CallbackData The BMM context data.
672
673 **/
674 VOID
675 UpdateConModePage (
676 IN BMM_CALLBACK_DATA *CallbackData
677 )
678 {
679 UINTN Mode;
680 UINTN Index;
681 UINTN Col;
682 UINTN Row;
683 CHAR16 ModeString[50];
684 CHAR16 *PStr;
685 UINTN MaxMode;
686 UINTN ValidMode;
687 EFI_STRING_ID *ModeToken;
688 EFI_STATUS Status;
689 VOID *OptionsOpCodeHandle;
690 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
691
692 ConOut = gST->ConOut;
693 Index = 0;
694 ValidMode = 0;
695 MaxMode = (UINTN)(ConOut->Mode->MaxMode);
696
697 CallbackData->BmmAskSaveOrNot = TRUE;
698
699 UpdatePageStart (CallbackData);
700
701 //
702 // Check valid mode
703 //
704 for (Mode = 0; Mode < MaxMode; Mode++) {
705 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
706 if (EFI_ERROR (Status)) {
707 continue;
708 }
709
710 ValidMode++;
711 }
712
713 if (ValidMode == 0) {
714 return;
715 }
716
717 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
718 ASSERT (OptionsOpCodeHandle != NULL);
719
720 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);
721 ASSERT (ModeToken != NULL);
722
723 //
724 // Determin which mode should be the first entry in menu
725 //
726 GetConsoleOutMode (CallbackData);
727
728 //
729 // Build text mode options
730 //
731 for (Mode = 0; Mode < MaxMode; Mode++) {
732 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);
733 if (EFI_ERROR (Status)) {
734 continue;
735 }
736
737 //
738 // Build mode string Column x Row
739 //
740 UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);
741 PStr = &ModeString[0];
742 StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen (L" x ") + 1);
743 PStr = PStr + StrLen (PStr);
744 UnicodeValueToStringS (
745 PStr,
746 sizeof (ModeString) - ((UINTN)PStr - (UINTN)&ModeString[0]),
747 0,
748 Row,
749 0
750 );
751
752 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);
753
754 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {
755 HiiCreateOneOfOptionOpCode (
756 OptionsOpCodeHandle,
757 ModeToken[Index],
758 EFI_IFR_OPTION_DEFAULT,
759 EFI_IFR_TYPE_NUM_SIZE_16,
760 (UINT16)Mode
761 );
762 } else {
763 HiiCreateOneOfOptionOpCode (
764 OptionsOpCodeHandle,
765 ModeToken[Index],
766 0,
767 EFI_IFR_TYPE_NUM_SIZE_16,
768 (UINT16)Mode
769 );
770 }
771
772 Index++;
773 }
774
775 HiiCreateOneOfOpCode (
776 mStartOpCodeHandle,
777 (EFI_QUESTION_ID)CON_MODE_QUESTION_ID,
778 VARSTORE_ID_BOOT_MAINT,
779 CON_MODE_VAR_OFFSET,
780 STRING_TOKEN (STR_CON_MODE_SETUP),
781 STRING_TOKEN (STR_CON_MODE_SETUP),
782 EFI_IFR_FLAG_RESET_REQUIRED,
783 EFI_IFR_NUMERIC_SIZE_2,
784 OptionsOpCodeHandle,
785 NULL
786 );
787
788 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
789 FreePool (ModeToken);
790
791 UpdatePageEnd (CallbackData);
792 }
793
794 /**
795 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
796 Parity, Stop Bits, Terminal Type.
797
798 @param CallbackData The BMM context data.
799
800 **/
801 VOID
802 UpdateTerminalPage (
803 IN BMM_CALLBACK_DATA *CallbackData
804 )
805 {
806 UINT8 Index;
807 UINT8 CheckFlags;
808 BM_MENU_ENTRY *NewMenuEntry;
809 VOID *OptionsOpCodeHandle;
810 UINTN CurrentTerminal;
811
812 CallbackData->BmmAskSaveOrNot = TRUE;
813
814 UpdatePageStart (CallbackData);
815
816 CurrentTerminal = CallbackData->CurrentTerminal;
817 NewMenuEntry = BOpt_GetMenuEntry (
818 &TerminalMenu,
819 CurrentTerminal
820 );
821
822 if (NewMenuEntry == NULL) {
823 return;
824 }
825
826 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
827 ASSERT (OptionsOpCodeHandle != NULL);
828
829 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList[0]); Index++) {
830 CheckFlags = 0;
831 if (BaudRateList[Index].Value == 115200) {
832 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
833 }
834
835 HiiCreateOneOfOptionOpCode (
836 OptionsOpCodeHandle,
837 BaudRateList[Index].StringToken,
838 CheckFlags,
839 EFI_IFR_TYPE_NUM_SIZE_8,
840 Index
841 );
842 }
843
844 HiiCreateOneOfOpCode (
845 mStartOpCodeHandle,
846 (EFI_QUESTION_ID)(COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),
847 VARSTORE_ID_BOOT_MAINT,
848 (UINT16)(COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),
849 STRING_TOKEN (STR_COM_BAUD_RATE),
850 STRING_TOKEN (STR_COM_BAUD_RATE),
851 EFI_IFR_FLAG_CALLBACK,
852 EFI_IFR_NUMERIC_SIZE_1,
853 OptionsOpCodeHandle,
854 NULL
855 );
856
857 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
858 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
859 ASSERT (OptionsOpCodeHandle != NULL);
860
861 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {
862 CheckFlags = 0;
863
864 if (DataBitsList[Index].Value == 8) {
865 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
866 }
867
868 HiiCreateOneOfOptionOpCode (
869 OptionsOpCodeHandle,
870 DataBitsList[Index].StringToken,
871 CheckFlags,
872 EFI_IFR_TYPE_NUM_SIZE_8,
873 Index
874 );
875 }
876
877 HiiCreateOneOfOpCode (
878 mStartOpCodeHandle,
879 (EFI_QUESTION_ID)(COM_DATA_RATE_QUESTION_ID + CurrentTerminal),
880 VARSTORE_ID_BOOT_MAINT,
881 (UINT16)(COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),
882 STRING_TOKEN (STR_COM_DATA_BITS),
883 STRING_TOKEN (STR_COM_DATA_BITS),
884 EFI_IFR_FLAG_CALLBACK,
885 EFI_IFR_NUMERIC_SIZE_1,
886 OptionsOpCodeHandle,
887 NULL
888 );
889
890 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
891 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
892 ASSERT (OptionsOpCodeHandle != NULL);
893
894 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {
895 CheckFlags = 0;
896 if (ParityList[Index].Value == NoParity) {
897 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
898 }
899
900 HiiCreateOneOfOptionOpCode (
901 OptionsOpCodeHandle,
902 ParityList[Index].StringToken,
903 CheckFlags,
904 EFI_IFR_TYPE_NUM_SIZE_8,
905 Index
906 );
907 }
908
909 HiiCreateOneOfOpCode (
910 mStartOpCodeHandle,
911 (EFI_QUESTION_ID)(COM_PARITY_QUESTION_ID + CurrentTerminal),
912 VARSTORE_ID_BOOT_MAINT,
913 (UINT16)(COM_PARITY_VAR_OFFSET + CurrentTerminal),
914 STRING_TOKEN (STR_COM_PARITY),
915 STRING_TOKEN (STR_COM_PARITY),
916 EFI_IFR_FLAG_CALLBACK,
917 EFI_IFR_NUMERIC_SIZE_1,
918 OptionsOpCodeHandle,
919 NULL
920 );
921
922 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
923 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
924 ASSERT (OptionsOpCodeHandle != NULL);
925
926 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {
927 CheckFlags = 0;
928 if (StopBitsList[Index].Value == OneStopBit) {
929 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
930 }
931
932 HiiCreateOneOfOptionOpCode (
933 OptionsOpCodeHandle,
934 StopBitsList[Index].StringToken,
935 CheckFlags,
936 EFI_IFR_TYPE_NUM_SIZE_8,
937 Index
938 );
939 }
940
941 HiiCreateOneOfOpCode (
942 mStartOpCodeHandle,
943 (EFI_QUESTION_ID)(COM_STOP_BITS_QUESTION_ID + CurrentTerminal),
944 VARSTORE_ID_BOOT_MAINT,
945 (UINT16)(COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),
946 STRING_TOKEN (STR_COM_STOP_BITS),
947 STRING_TOKEN (STR_COM_STOP_BITS),
948 EFI_IFR_FLAG_CALLBACK,
949 EFI_IFR_NUMERIC_SIZE_1,
950 OptionsOpCodeHandle,
951 NULL
952 );
953
954 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
955 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
956 ASSERT (OptionsOpCodeHandle != NULL);
957
958 for (Index = 0; Index < ARRAY_SIZE (TerminalType); Index++) {
959 CheckFlags = 0;
960 if (Index == 0) {
961 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
962 }
963
964 HiiCreateOneOfOptionOpCode (
965 OptionsOpCodeHandle,
966 (EFI_STRING_ID)TerminalType[Index],
967 CheckFlags,
968 EFI_IFR_TYPE_NUM_SIZE_8,
969 Index
970 );
971 }
972
973 HiiCreateOneOfOpCode (
974 mStartOpCodeHandle,
975 (EFI_QUESTION_ID)(COM_TERMINAL_QUESTION_ID + CurrentTerminal),
976 VARSTORE_ID_BOOT_MAINT,
977 (UINT16)(COM_TERMINAL_VAR_OFFSET + CurrentTerminal),
978 STRING_TOKEN (STR_COM_TERMI_TYPE),
979 STRING_TOKEN (STR_COM_TERMI_TYPE),
980 EFI_IFR_FLAG_CALLBACK,
981 EFI_IFR_NUMERIC_SIZE_1,
982 OptionsOpCodeHandle,
983 NULL
984 );
985
986 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
987 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
988 ASSERT (OptionsOpCodeHandle != NULL);
989
990 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {
991 CheckFlags = 0;
992 if (Index == 0) {
993 CheckFlags |= EFI_IFR_OPTION_DEFAULT;
994 }
995
996 HiiCreateOneOfOptionOpCode (
997 OptionsOpCodeHandle,
998 (EFI_STRING_ID)mFlowControlType[Index],
999 CheckFlags,
1000 EFI_IFR_TYPE_NUM_SIZE_8,
1001 mFlowControlValue[Index]
1002 );
1003 }
1004
1005 HiiCreateOneOfOpCode (
1006 mStartOpCodeHandle,
1007 (EFI_QUESTION_ID)(COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),
1008 VARSTORE_ID_BOOT_MAINT,
1009 (UINT16)(COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),
1010 STRING_TOKEN (STR_COM_FLOW_CONTROL),
1011 STRING_TOKEN (STR_COM_FLOW_CONTROL),
1012 EFI_IFR_FLAG_CALLBACK,
1013 EFI_IFR_NUMERIC_SIZE_1,
1014 OptionsOpCodeHandle,
1015 NULL
1016 );
1017
1018 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
1019
1020 UpdatePageEnd (CallbackData);
1021 }
1022
1023 /**
1024 Update add boot/driver option page.
1025
1026 @param CallbackData The BMM context data.
1027 @param FormId The form ID to be updated.
1028 @param DevicePath Device path.
1029
1030 **/
1031 VOID
1032 UpdateOptionPage (
1033 IN BMM_CALLBACK_DATA *CallbackData,
1034 IN EFI_FORM_ID FormId,
1035 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
1036 )
1037 {
1038 CHAR16 *String;
1039 EFI_STRING_ID StringToken;
1040
1041 String = NULL;
1042
1043 if (DevicePath != NULL) {
1044 String = ExtractFileNameFromDevicePath (DevicePath);
1045 }
1046
1047 if (String == NULL) {
1048 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);
1049 ASSERT (String != NULL);
1050 }
1051
1052 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);
1053 FreePool (String);
1054
1055 if (FormId == FORM_BOOT_ADD_ID) {
1056 if (!CallbackData->BmmFakeNvData.BootOptionChanged) {
1057 ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));
1058 ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));
1059 ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData));
1060 ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));
1061 }
1062 } else if (FormId == FORM_DRV_ADD_FILE_ID) {
1063 if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {
1064 ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));
1065 ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));
1066 ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData));
1067 ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));
1068 }
1069 }
1070
1071 RefreshUpdateData ();
1072 mStartLabel->Number = FormId;
1073
1074 HiiCreateSubTitleOpCode (
1075 mStartOpCodeHandle,
1076 StringToken,
1077 0,
1078 0,
1079 0
1080 );
1081
1082 HiiUpdateForm (
1083 CallbackData->BmmHiiHandle,
1084 &mBootMaintGuid,
1085 FormId,
1086 mStartOpCodeHandle, // Label FormId
1087 mEndOpCodeHandle // LABEL_END
1088 );
1089 }
1090
1091 /**
1092 Dispatch the correct update page function to call based on
1093 the UpdatePageId.
1094
1095 @param UpdatePageId The form ID.
1096 @param CallbackData The BMM context data.
1097
1098 **/
1099 VOID
1100 UpdatePageBody (
1101 IN UINT16 UpdatePageId,
1102 IN BMM_CALLBACK_DATA *CallbackData
1103 )
1104 {
1105 CleanUpPage (UpdatePageId, CallbackData);
1106 switch (UpdatePageId) {
1107 case FORM_CON_IN_ID:
1108 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);
1109 break;
1110
1111 case FORM_CON_OUT_ID:
1112 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);
1113 break;
1114
1115 case FORM_CON_ERR_ID:
1116 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);
1117 break;
1118
1119 case FORM_BOOT_CHG_ID:
1120 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);
1121 break;
1122
1123 case FORM_DRV_CHG_ID:
1124 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);
1125 break;
1126
1127 default:
1128 break;
1129 }
1130 }
1131
1132 /**
1133 Dispatch the display to the next page based on NewPageId.
1134
1135 @param Private The BMM context data.
1136 @param NewPageId The original page ID.
1137
1138 **/
1139 VOID
1140 UpdatePageId (
1141 BMM_CALLBACK_DATA *Private,
1142 UINT16 NewPageId
1143 )
1144 {
1145 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {
1146 //
1147 // If we select a handle to add driver option, advance to the add handle description page.
1148 //
1149 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;
1150 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {
1151 //
1152 // Return to main page after "Save Changes" or "Discard Changes".
1153 //
1154 NewPageId = FORM_MAIN_ID;
1155 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {
1156 NewPageId = FORM_CON_COM_SETUP_ID;
1157 }
1158
1159 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {
1160 Private->BmmPreviousPageId = Private->BmmCurrentPageId;
1161 Private->BmmCurrentPageId = NewPageId;
1162 }
1163 }