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