]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c
MdeModulePkg:Full support F10 hot key in UiApp.
[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
DB
497 ConsoleCheck = NULL;\r
498 QuestionIdBase = 0;\r
499 VariableOffsetBase = 0;\r
500\r
501 switch (UpdatePageId) {\r
502 case FORM_CON_IN_ID:\r
503 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
504 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
505 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
506 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
507 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
508 break;\r
509\r
510 case FORM_CON_OUT_ID:\r
511 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
512 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
513 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
514 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
515 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
516 break;\r
517\r
518 case FORM_CON_ERR_ID:\r
519 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
520 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
521 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
522 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
523 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
524 break;\r
525 }\r
526 ASSERT (ConsoleCheck != NULL);\r
527\r
143f0b1d 528 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
a22a50fa
DB
529 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
530 CheckFlags = 0;\r
531 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
143f0b1d 532 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
143f0b1d
ED
533 if (NewConsoleContext->IsActive) {\r
534 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
a22a50fa 535 ConsoleCheck[Index] = TRUE;\r
143f0b1d 536 } else {\r
a22a50fa 537 ConsoleCheck[Index] = FALSE;\r
143f0b1d 538 }\r
143f0b1d
ED
539 HiiCreateCheckBoxOpCode (\r
540 mStartOpCodeHandle,\r
a22a50fa 541 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
143f0b1d 542 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 543 (UINT16) (VariableOffsetBase + Index),\r
143f0b1d
ED
544 NewMenuEntry->DisplayStringToken,\r
545 NewMenuEntry->HelpStringToken,\r
546 0,\r
547 CheckFlags,\r
548 NULL\r
549 );\r
550 }\r
551\r
552 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
a22a50fa 553 (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
143f0b1d
ED
554 CheckFlags = 0;\r
555 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
556 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
557\r
558 ASSERT (Index < MAX_MENU_NUMBER);\r
559 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
560 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
561 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
562 ) {\r
563 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
a22a50fa 564 ConsoleCheck[Index] = TRUE;\r
143f0b1d 565 } else {\r
a22a50fa 566 ConsoleCheck[Index] = FALSE;\r
143f0b1d 567 }\r
143f0b1d
ED
568 HiiCreateCheckBoxOpCode (\r
569 mStartOpCodeHandle,\r
a22a50fa 570 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
143f0b1d 571 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 572 (UINT16) (VariableOffsetBase + Index),\r
143f0b1d
ED
573 NewMenuEntry->DisplayStringToken,\r
574 NewMenuEntry->HelpStringToken,\r
575 0,\r
576 CheckFlags,\r
577 NULL\r
578 );\r
579\r
580 Index++;\r
581 }\r
582\r
a22a50fa
DB
583 CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
584\r
143f0b1d
ED
585 UpdatePageEnd (CallbackData);\r
586}\r
587\r
588/**\r
589 Update the page's NV Map if user has changed the order\r
590 a list. This list can be Boot Order or Driver Order.\r
591\r
592 @param UpdatePageId The form ID to be updated.\r
593 @param OptionMenu The new list.\r
594 @param CallbackData The BMM context data.\r
595\r
596**/\r
597VOID\r
598UpdateOrderPage (\r
599 IN UINT16 UpdatePageId,\r
600 IN BM_MENU_OPTION *OptionMenu,\r
601 IN BMM_CALLBACK_DATA *CallbackData\r
602 )\r
603{\r
604 BM_MENU_ENTRY *NewMenuEntry;\r
605 UINT16 Index;\r
606 UINT16 OptionIndex;\r
607 VOID *OptionsOpCodeHandle;\r
608 BM_LOAD_CONTEXT *NewLoadContext;\r
609 BOOLEAN BootOptionFound;\r
610 UINT32 *OptionOrder;\r
611 EFI_QUESTION_ID QuestionId;\r
612 UINT16 VarOffset;\r
613\r
614\r
615 UpdatePageStart (CallbackData);\r
616\r
617 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
618 \r
619 OptionOrder = NULL;\r
620 QuestionId = 0;\r
621 VarOffset = 0;\r
622 switch (UpdatePageId) { \r
623 \r
624 case FORM_BOOT_CHG_ID:\r
625 GetBootOrder (CallbackData);\r
626 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
627 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
628 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
629 break;\r
630 \r
631 case FORM_DRV_CHG_ID:\r
632 GetDriverOrder (CallbackData);\r
633 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
634 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
635 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
636 break;\r
637 } \r
638 ASSERT (OptionOrder != NULL); \r
639 \r
640 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
641 ASSERT (OptionsOpCodeHandle != NULL);\r
642 \r
643 NewMenuEntry = NULL;\r
644 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
645 BootOptionFound = FALSE;\r
646 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
647 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
648 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
649 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
650 BootOptionFound = TRUE;\r
651 break;\r
652 }\r
653 }\r
654 if (BootOptionFound) {\r
655 HiiCreateOneOfOptionOpCode (\r
656 OptionsOpCodeHandle,\r
657 NewMenuEntry->DisplayStringToken,\r
658 0,\r
659 EFI_IFR_TYPE_NUM_SIZE_32,\r
660 OptionOrder[OptionIndex]\r
661 );\r
662 }\r
663 }\r
664 \r
665 if (OptionMenu->MenuNumber > 0) {\r
666 HiiCreateOrderedListOpCode ( \r
667 mStartOpCodeHandle, // Container for dynamic created opcodes \r
668 QuestionId, // Question ID \r
669 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
670 VarOffset, // Offset in Buffer Storage \r
671 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
672 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
673 0, // Question flag \r
674 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
675 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
676 100, // Maximum container \r
677 OptionsOpCodeHandle, // Option Opcode list \r
678 NULL // Default Opcode is NULL \r
679 );\r
680 }\r
681\r
682 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
683\r
684 UpdatePageEnd (CallbackData);\r
685\r
686}\r
687\r
688/**\r
689 Create the dynamic page to allow user to set\r
690 the "BootNext" value.\r
691\r
692 @param CallbackData The BMM context data.\r
693\r
694**/\r
695VOID\r
696UpdateBootNextPage (\r
697 IN BMM_CALLBACK_DATA *CallbackData\r
698 )\r
699{\r
700 BM_MENU_ENTRY *NewMenuEntry;\r
701 BM_LOAD_CONTEXT *NewLoadContext;\r
702 UINTN NumberOfOptions;\r
703 UINT16 Index;\r
704 VOID *OptionsOpCodeHandle;\r
705\r
706 NumberOfOptions = BootOptionMenu.MenuNumber;\r
707 CallbackData->BmmAskSaveOrNot = TRUE;\r
708\r
709 UpdatePageStart (CallbackData);\r
710 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
711\r
712 if (NumberOfOptions > 0) {\r
713 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
714 ASSERT (OptionsOpCodeHandle != NULL);\r
715\r
716 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
717\r
718 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
719 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
720 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
721\r
722 if (NewLoadContext->IsBootNext) {\r
723 HiiCreateOneOfOptionOpCode (\r
724 OptionsOpCodeHandle,\r
725 NewMenuEntry->DisplayStringToken,\r
726 EFI_IFR_OPTION_DEFAULT,\r
727 EFI_IFR_TYPE_NUM_SIZE_16,\r
728 Index\r
729 );\r
730 CallbackData->BmmFakeNvData.BootNext = Index;\r
731 } else {\r
732 HiiCreateOneOfOptionOpCode (\r
733 OptionsOpCodeHandle,\r
734 NewMenuEntry->DisplayStringToken,\r
735 0,\r
736 EFI_IFR_TYPE_NUM_SIZE_16,\r
737 Index\r
738 );\r
739 }\r
740 }\r
741\r
742 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
743 HiiCreateOneOfOptionOpCode (\r
744 OptionsOpCodeHandle,\r
745 STRING_TOKEN (STR_NONE),\r
746 EFI_IFR_OPTION_DEFAULT,\r
747 EFI_IFR_TYPE_NUM_SIZE_16,\r
748 Index\r
749 );\r
750 } else {\r
751 HiiCreateOneOfOptionOpCode (\r
752 OptionsOpCodeHandle,\r
753 STRING_TOKEN (STR_NONE),\r
754 0,\r
755 EFI_IFR_TYPE_NUM_SIZE_16,\r
756 Index\r
757 );\r
758 } \r
759\r
760 HiiCreateOneOfOpCode (\r
761 mStartOpCodeHandle,\r
762 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
763 VARSTORE_ID_BOOT_MAINT,\r
764 BOOT_NEXT_VAR_OFFSET,\r
765 STRING_TOKEN (STR_BOOT_NEXT),\r
766 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
767 0,\r
768 EFI_IFR_NUMERIC_SIZE_2,\r
769 OptionsOpCodeHandle,\r
770 NULL\r
771 );\r
772\r
773 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
774 }\r
775\r
776 UpdatePageEnd (CallbackData);\r
777}\r
778\r
779/**\r
780 Create the dynamic page to allow user to set the "TimeOut" value.\r
781\r
782 @param CallbackData The BMM context data.\r
783\r
784**/\r
785VOID\r
786UpdateTimeOutPage (\r
787 IN BMM_CALLBACK_DATA *CallbackData\r
788 )\r
789{\r
790 UINT16 BootTimeOut;\r
791 VOID *DefaultOpCodeHandle;\r
792\r
793 CallbackData->BmmAskSaveOrNot = TRUE;\r
794\r
795 UpdatePageStart (CallbackData);\r
796\r
797 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
798\r
799 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
800 ASSERT (DefaultOpCodeHandle != NULL);\r
801 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
802\r
803 HiiCreateNumericOpCode (\r
804 mStartOpCodeHandle,\r
805 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
806 VARSTORE_ID_BOOT_MAINT,\r
807 BOOT_TIME_OUT_VAR_OFFSET,\r
808 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
809 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
810 0,\r
811 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
812 0,\r
813 65535,\r
814 0,\r
815 DefaultOpCodeHandle\r
816 );\r
817 \r
818 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
819\r
820 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
821\r
822 UpdatePageEnd (CallbackData);\r
823}\r
824\r
825\r
826/**\r
827 Refresh the text mode page.\r
828\r
829 @param CallbackData The BMM context data.\r
830\r
831**/\r
832VOID\r
833UpdateConModePage (\r
834 IN BMM_CALLBACK_DATA *CallbackData\r
835 )\r
836{\r
837 UINTN Mode;\r
838 UINTN Index;\r
839 UINTN Col;\r
840 UINTN Row;\r
841 CHAR16 ModeString[50];\r
842 CHAR16 *PStr;\r
843 UINTN MaxMode;\r
844 UINTN ValidMode;\r
845 EFI_STRING_ID *ModeToken;\r
846 EFI_STATUS Status;\r
847 VOID *OptionsOpCodeHandle;\r
848 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
849\r
850 ConOut = gST->ConOut;\r
851 Index = 0;\r
852 ValidMode = 0;\r
853 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
854\r
855 CallbackData->BmmAskSaveOrNot = TRUE;\r
856\r
857 UpdatePageStart (CallbackData);\r
858\r
859 //\r
860 // Check valid mode\r
861 //\r
862 for (Mode = 0; Mode < MaxMode; Mode++) {\r
863 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
864 if (EFI_ERROR (Status)) {\r
865 continue;\r
866 }\r
867 ValidMode++;\r
868 }\r
869\r
870 if (ValidMode == 0) {\r
871 return;\r
872 }\r
873\r
874 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
875 ASSERT (OptionsOpCodeHandle != NULL);\r
876\r
877 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
878 ASSERT(ModeToken != NULL);\r
879\r
880 //\r
881 // Determin which mode should be the first entry in menu\r
882 //\r
883 GetConsoleOutMode (CallbackData);\r
884\r
885 //\r
886 // Build text mode options\r
887 //\r
888 for (Mode = 0; Mode < MaxMode; Mode++) {\r
889 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
890 if (EFI_ERROR (Status)) {\r
891 continue;\r
892 }\r
893 \r
894 //\r
895 // Build mode string Column x Row\r
896 //\r
897 UnicodeValueToString (ModeString, 0, Col, 0);\r
898 PStr = &ModeString[0];\r
d91cb870 899 StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
143f0b1d
ED
900 PStr = PStr + StrLen (PStr);\r
901 UnicodeValueToString (PStr , 0, Row, 0);\r
902\r
903 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
904\r
905 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
906 HiiCreateOneOfOptionOpCode (\r
907 OptionsOpCodeHandle,\r
908 ModeToken[Index],\r
909 EFI_IFR_OPTION_DEFAULT,\r
910 EFI_IFR_TYPE_NUM_SIZE_16,\r
911 (UINT16) Mode\r
912 );\r
913 } else {\r
914 HiiCreateOneOfOptionOpCode (\r
915 OptionsOpCodeHandle,\r
916 ModeToken[Index],\r
917 0,\r
918 EFI_IFR_TYPE_NUM_SIZE_16,\r
919 (UINT16) Mode\r
920 );\r
921 }\r
922 Index++;\r
923 }\r
924\r
925 HiiCreateOneOfOpCode (\r
926 mStartOpCodeHandle,\r
927 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
928 VARSTORE_ID_BOOT_MAINT,\r
929 CON_MODE_VAR_OFFSET,\r
930 STRING_TOKEN (STR_CON_MODE_SETUP),\r
931 STRING_TOKEN (STR_CON_MODE_SETUP),\r
932 EFI_IFR_FLAG_RESET_REQUIRED,\r
933 EFI_IFR_NUMERIC_SIZE_2,\r
934 OptionsOpCodeHandle,\r
935 NULL\r
936 );\r
937\r
938 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
939 FreePool (ModeToken);\r
940\r
941 UpdatePageEnd (CallbackData);\r
942}\r
943\r
a22a50fa 944 /**\r
143f0b1d
ED
945 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
946 Parity, Stop Bits, Terminal Type.\r
947\r
948 @param CallbackData The BMM context data.\r
949\r
950**/\r
951VOID\r
952UpdateTerminalPage (\r
953 IN BMM_CALLBACK_DATA *CallbackData\r
954 )\r
955{\r
956 UINT8 Index;\r
957 UINT8 CheckFlags;\r
958 BM_MENU_ENTRY *NewMenuEntry;\r
143f0b1d 959 VOID *OptionsOpCodeHandle;\r
a22a50fa 960 UINTN CurrentTerminal;\r
143f0b1d
ED
961\r
962 CallbackData->BmmAskSaveOrNot = TRUE;\r
963\r
964 UpdatePageStart (CallbackData);\r
965\r
a22a50fa 966 CurrentTerminal = CallbackData->CurrentTerminal;\r
143f0b1d
ED
967 NewMenuEntry = BOpt_GetMenuEntry (\r
968 &TerminalMenu,\r
a22a50fa 969 CurrentTerminal\r
143f0b1d
ED
970 );\r
971\r
972 if (NewMenuEntry == NULL) {\r
973 return ;\r
974 }\r
975\r
143f0b1d
ED
976 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
977 ASSERT (OptionsOpCodeHandle != NULL);\r
978\r
979 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
980 CheckFlags = 0;\r
a22a50fa 981 if (BaudRateList[Index].Value == 115200) {\r
143f0b1d 982 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
143f0b1d 983 }\r
143f0b1d
ED
984 HiiCreateOneOfOptionOpCode (\r
985 OptionsOpCodeHandle,\r
986 BaudRateList[Index].StringToken,\r
987 CheckFlags,\r
988 EFI_IFR_TYPE_NUM_SIZE_8,\r
989 Index\r
990 );\r
991 }\r
992\r
993 HiiCreateOneOfOpCode (\r
994 mStartOpCodeHandle,\r
a22a50fa 995 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
143f0b1d 996 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 997 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
143f0b1d
ED
998 STRING_TOKEN (STR_COM_BAUD_RATE),\r
999 STRING_TOKEN (STR_COM_BAUD_RATE),\r
1000 0,\r
1001 EFI_IFR_NUMERIC_SIZE_1,\r
1002 OptionsOpCodeHandle,\r
1003 NULL\r
1004 );\r
1005 \r
1006 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1007 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1008 ASSERT (OptionsOpCodeHandle != NULL);\r
1009\r
1010 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
1011 CheckFlags = 0;\r
1012\r
a22a50fa 1013 if (DataBitsList[Index].Value == 8) {\r
143f0b1d
ED
1014 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1015 }\r
1016\r
1017 HiiCreateOneOfOptionOpCode (\r
1018 OptionsOpCodeHandle,\r
1019 DataBitsList[Index].StringToken,\r
1020 CheckFlags,\r
1021 EFI_IFR_TYPE_NUM_SIZE_8,\r
1022 Index\r
1023 );\r
1024 }\r
1025\r
1026 HiiCreateOneOfOpCode (\r
1027 mStartOpCodeHandle,\r
a22a50fa 1028 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
143f0b1d 1029 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 1030 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
143f0b1d
ED
1031 STRING_TOKEN (STR_COM_DATA_BITS),\r
1032 STRING_TOKEN (STR_COM_DATA_BITS),\r
1033 0,\r
1034 EFI_IFR_NUMERIC_SIZE_1,\r
1035 OptionsOpCodeHandle,\r
1036 NULL\r
1037 );\r
1038\r
1039 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1040 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1041 ASSERT (OptionsOpCodeHandle != NULL);\r
1042\r
1043 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
1044 CheckFlags = 0;\r
a22a50fa 1045 if (ParityList[Index].Value == NoParity) {\r
143f0b1d 1046 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
143f0b1d
ED
1047 }\r
1048\r
1049 HiiCreateOneOfOptionOpCode (\r
1050 OptionsOpCodeHandle,\r
1051 ParityList[Index].StringToken,\r
1052 CheckFlags,\r
1053 EFI_IFR_TYPE_NUM_SIZE_8,\r
1054 Index\r
1055 );\r
1056 }\r
1057\r
1058 HiiCreateOneOfOpCode (\r
1059 mStartOpCodeHandle,\r
a22a50fa 1060 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
143f0b1d 1061 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 1062 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
143f0b1d
ED
1063 STRING_TOKEN (STR_COM_PARITY),\r
1064 STRING_TOKEN (STR_COM_PARITY),\r
1065 0,\r
1066 EFI_IFR_NUMERIC_SIZE_1,\r
1067 OptionsOpCodeHandle,\r
1068 NULL\r
1069 );\r
1070\r
1071 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1072 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1073 ASSERT (OptionsOpCodeHandle != NULL);\r
1074\r
1075 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
1076 CheckFlags = 0;\r
a22a50fa 1077 if (StopBitsList[Index].Value == OneStopBit) {\r
143f0b1d 1078 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
143f0b1d
ED
1079 }\r
1080\r
1081 HiiCreateOneOfOptionOpCode (\r
1082 OptionsOpCodeHandle,\r
1083 StopBitsList[Index].StringToken,\r
1084 CheckFlags,\r
1085 EFI_IFR_TYPE_NUM_SIZE_8,\r
1086 Index\r
1087 );\r
1088 }\r
1089\r
1090 HiiCreateOneOfOpCode (\r
1091 mStartOpCodeHandle,\r
a22a50fa 1092 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
143f0b1d 1093 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 1094 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
143f0b1d
ED
1095 STRING_TOKEN (STR_COM_STOP_BITS),\r
1096 STRING_TOKEN (STR_COM_STOP_BITS),\r
1097 0,\r
1098 EFI_IFR_NUMERIC_SIZE_1,\r
1099 OptionsOpCodeHandle,\r
1100 NULL\r
1101 );\r
1102\r
1103 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1104 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1105 ASSERT (OptionsOpCodeHandle != NULL);\r
1106\r
4cac5c05 1107 for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
143f0b1d 1108 CheckFlags = 0;\r
a22a50fa 1109 if (Index == 0) {\r
143f0b1d 1110 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
143f0b1d
ED
1111 }\r
1112\r
1113 HiiCreateOneOfOptionOpCode (\r
1114 OptionsOpCodeHandle,\r
1115 (EFI_STRING_ID) TerminalType[Index],\r
1116 CheckFlags,\r
1117 EFI_IFR_TYPE_NUM_SIZE_8,\r
1118 Index\r
1119 );\r
1120 }\r
1121\r
1122 HiiCreateOneOfOpCode (\r
1123 mStartOpCodeHandle,\r
a22a50fa 1124 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
143f0b1d 1125 VARSTORE_ID_BOOT_MAINT,\r
a22a50fa 1126 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
143f0b1d
ED
1127 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1128 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1129 0,\r
1130 EFI_IFR_NUMERIC_SIZE_1,\r
1131 OptionsOpCodeHandle,\r
1132 NULL\r
1133 );\r
1134\r
a22a50fa
DB
1135 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1136 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1137 ASSERT (OptionsOpCodeHandle != NULL);\r
1138\r
1139 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
1140 CheckFlags = 0;\r
1141 if (Index == 0) {\r
1142 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1143 }\r
1144 HiiCreateOneOfOptionOpCode (\r
1145 OptionsOpCodeHandle,\r
1146 (EFI_STRING_ID) mFlowControlType[Index],\r
1147 CheckFlags,\r
1148 EFI_IFR_TYPE_NUM_SIZE_8,\r
1149 mFlowControlValue[Index]\r
1150 );\r
1151 }\r
1152\r
1153 HiiCreateOneOfOpCode (\r
1154 mStartOpCodeHandle,\r
1155 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
1156 VARSTORE_ID_BOOT_MAINT,\r
1157 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
1158 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1159 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1160 0,\r
1161 EFI_IFR_NUMERIC_SIZE_1,\r
1162 OptionsOpCodeHandle,\r
1163 NULL\r
1164 );\r
1165\r
143f0b1d
ED
1166 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1167\r
1168 UpdatePageEnd (CallbackData);\r
1169}\r
1170\r
1171/**\r
1172 Dispatch the correct update page function to call based on\r
1173 the UpdatePageId.\r
1174\r
1175 @param UpdatePageId The form ID.\r
1176 @param CallbackData The BMM context data.\r
1177\r
1178**/\r
1179VOID\r
1180UpdatePageBody (\r
1181 IN UINT16 UpdatePageId,\r
1182 IN BMM_CALLBACK_DATA *CallbackData\r
1183 )\r
1184{\r
1185 CleanUpPage (UpdatePageId, CallbackData);\r
1186 switch (UpdatePageId) {\r
1187 case FORM_CON_IN_ID:\r
1188 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1189 break;\r
1190\r
1191 case FORM_CON_OUT_ID:\r
1192 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1193 break;\r
1194\r
1195 case FORM_CON_ERR_ID:\r
1196 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1197 break;\r
1198\r
1199 case FORM_BOOT_CHG_ID:\r
1200 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1201 break;\r
1202\r
1203 case FORM_DRV_CHG_ID:\r
1204 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1205 break;\r
1206\r
1207 default:\r
1208 break;\r
1209 }\r
1210}\r
1211\r
1212/**\r
1213 Dispatch the display to the next page based on NewPageId.\r
1214\r
1215 @param Private The BMM context data.\r
1216 @param NewPageId The original page ID.\r
1217\r
1218**/\r
1219VOID\r
1220UpdatePageId (\r
1221 BMM_CALLBACK_DATA *Private,\r
1222 UINT16 NewPageId\r
1223 )\r
1224{\r
1225 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1226 //\r
1227 // If we select a handle to add driver option, advance to the add handle description page.\r
1228 //\r
1229 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1230 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1231 //\r
1232 // Return to main page after "Save Changes" or "Discard Changes".\r
1233 //\r
1234 NewPageId = FORM_MAIN_ID;\r
1235 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1236 NewPageId = FORM_CON_COM_SETUP_ID;\r
1237 }\r
1238\r
1239 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1240 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1241 Private->BmmCurrentPageId = NewPageId;\r
1242 }\r
1243}\r