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