]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
CommitLineData
4af04335
DB
1/** @file\r
2Dynamically update the pages.\r
3\r
d1102dba 4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
4af04335
DB
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
d1102dba 25\r
4af04335
DB
26 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
27 ASSERT (mEndOpCodeHandle != NULL);\r
d1102dba 28\r
4af04335
DB
29 //\r
30 // Create Hii Extend Label OpCode as the start opcode\r
31 //\r
1436aea4 32 mStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
4af04335 33 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
d1102dba 34\r
4af04335
DB
35 //\r
36 // Create Hii Extend Label OpCode as the end opcode\r
37 //\r
1436aea4 38 mEndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
4af04335
DB
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
d1102dba 54 //\r
4af04335
DB
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
1436aea4 67 mStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
4af04335 68 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
4af04335
DB
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
d1102dba 74\r
4af04335
DB
75 @param CallbackData The BMM context data.\r
76\r
77**/\r
78VOID\r
79UpdatePageStart (\r
1436aea4 80 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
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
1436aea4 111 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
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
d1102dba 158 Clean up the dynamic opcode at label and form specified by both LabelId.\r
4af04335
DB
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
1436aea4
MK
166 IN UINT16 LabelId,\r
167 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
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
1436aea4 193 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
194 )\r
195{\r
1436aea4
MK
196 BM_MENU_ENTRY *NewMenuEntry;\r
197 UINT16 Index;\r
4af04335
DB
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
1436aea4 212 (UINT16)(TERMINAL_OPTION_OFFSET + Index)\r
4af04335
DB
213 );\r
214 }\r
215\r
216 UpdatePageEnd (CallbackData);\r
217}\r
218\r
4af04335
DB
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
1436aea4 228 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
229 )\r
230{\r
1436aea4
MK
231 BM_MENU_ENTRY *NewMenuEntry;\r
232 BM_LOAD_CONTEXT *NewLoadContext;\r
233 UINT16 Index;\r
4af04335
DB
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
1436aea4
MK
241 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
242 NewLoadContext = (BM_LOAD_CONTEXT *)NewMenuEntry->VariableContext;\r
4af04335
DB
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
1436aea4 256 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
7880f73a 257 CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;\r
4af04335 258 }\r
d1102dba 259\r
4af04335
DB
260 HiiCreateCheckBoxOpCode (\r
261 mStartOpCodeHandle,\r
1436aea4 262 (EFI_QUESTION_ID)(BOOT_OPTION_DEL_QUESTION_ID + Index),\r
4af04335 263 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 264 (UINT16)(BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
4af04335
DB
265 NewMenuEntry->DisplayStringToken,\r
266 NewMenuEntry->HelpStringToken,\r
267 EFI_IFR_FLAG_CALLBACK,\r
268 0,\r
269 NULL\r
270 );\r
271 }\r
1436aea4 272\r
4af04335
DB
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
1436aea4 284 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
285 )\r
286{\r
1436aea4
MK
287 BM_MENU_ENTRY *NewMenuEntry;\r
288 UINT16 Index;\r
4af04335
DB
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
1436aea4 303 (UINT16)(HANDLE_OPTION_OFFSET + Index)\r
4af04335
DB
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
1436aea4 319 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
320 )\r
321{\r
1436aea4
MK
322 BM_MENU_ENTRY *NewMenuEntry;\r
323 BM_LOAD_CONTEXT *NewLoadContext;\r
324 UINT16 Index;\r
4af04335
DB
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
1436aea4 332 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
4af04335 333\r
1436aea4 334 NewLoadContext = (BM_LOAD_CONTEXT *)NewMenuEntry->VariableContext;\r
4af04335
DB
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
1436aea4 344 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
7880f73a 345 CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;\r
4af04335 346 }\r
1436aea4 347\r
4af04335
DB
348 HiiCreateCheckBoxOpCode (\r
349 mStartOpCodeHandle,\r
1436aea4 350 (EFI_QUESTION_ID)(DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
4af04335 351 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 352 (UINT16)(DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
4af04335
DB
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
d1102dba 365 Prepare the page to allow user to add description for\r
4af04335
DB
366 a Driver Option.\r
367\r
368 @param CallbackData The BMM context data.\r
369\r
370**/\r
371VOID\r
372UpdateDriverAddHandleDescPage (\r
1436aea4 373 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
374 )\r
375{\r
1436aea4 376 BM_MENU_ENTRY *NewMenuEntry;\r
4af04335 377\r
1436aea4
MK
378 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
379 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
380 CallbackData->BmmAskSaveOrNot = TRUE;\r
381 NewMenuEntry = CallbackData->MenuEntry;\r
4af04335
DB
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
1436aea4 395 (EFI_QUESTION_ID)DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
4af04335
DB
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
1436aea4 409 (EFI_QUESTION_ID)DRV_ADD_RECON_QUESTION_ID,\r
4af04335
DB
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
1436aea4 421 (EFI_QUESTION_ID)DRIVER_ADD_OPTION_QUESTION_ID,\r
4af04335
DB
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
1436aea4
MK
446 IN UINT16 UpdatePageId,\r
447 IN BM_MENU_OPTION *ConsoleMenu,\r
448 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
449 )\r
450{\r
1436aea4
MK
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
4af04335
DB
460\r
461 CallbackData->BmmAskSaveOrNot = TRUE;\r
462\r
463 UpdatePageStart (CallbackData);\r
464\r
465 ConsoleCheck = NULL;\r
4af04335
DB
466 QuestionIdBase = 0;\r
467 VariableOffsetBase = 0;\r
4af04335
DB
468\r
469 switch (UpdatePageId) {\r
1436aea4
MK
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
4af04335 487 }\r
1436aea4 488\r
4af04335
DB
489 ASSERT (ConsoleCheck != NULL);\r
490\r
491 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
1436aea4
MK
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
4af04335 497 if (NewConsoleContext->IsActive) {\r
1436aea4 498 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
4af04335
DB
499 ConsoleCheck[Index] = TRUE;\r
500 } else {\r
501 ConsoleCheck[Index] = FALSE;\r
502 }\r
1436aea4 503\r
4af04335
DB
504 HiiCreateCheckBoxOpCode (\r
505 mStartOpCodeHandle,\r
1436aea4 506 (EFI_QUESTION_ID)(QuestionIdBase + Index),\r
4af04335 507 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 508 (UINT16)(VariableOffsetBase + Index),\r
4af04335
DB
509 NewMenuEntry->DisplayStringToken,\r
510 NewMenuEntry->HelpStringToken,\r
a3475fe0 511 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
512 CheckFlags,\r
513 NULL\r
514 );\r
515 }\r
516\r
517 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
1436aea4
MK
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
4af04335
DB
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
1436aea4
MK
528 )\r
529 {\r
530 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
4af04335
DB
531 ConsoleCheck[Index] = TRUE;\r
532 } else {\r
533 ConsoleCheck[Index] = FALSE;\r
534 }\r
1436aea4 535\r
4af04335
DB
536 HiiCreateCheckBoxOpCode (\r
537 mStartOpCodeHandle,\r
1436aea4 538 (EFI_QUESTION_ID)(QuestionIdBase + Index),\r
4af04335 539 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 540 (UINT16)(VariableOffsetBase + Index),\r
4af04335
DB
541 NewMenuEntry->DisplayStringToken,\r
542 NewMenuEntry->HelpStringToken,\r
a3475fe0 543 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
544 CheckFlags,\r
545 NULL\r
546 );\r
547\r
548 Index++;\r
549 }\r
550\r
4af04335
DB
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
1436aea4
MK
565 IN UINT16 UpdatePageId,\r
566 IN BM_MENU_OPTION *OptionMenu,\r
567 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
568 )\r
569{\r
1436aea4
MK
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
4af04335
DB
578\r
579 CallbackData->BmmAskSaveOrNot = TRUE;\r
580 UpdatePageStart (CallbackData);\r
581\r
582 OptionOrder = NULL;\r
1436aea4
MK
583 QuestionId = 0;\r
584 VarOffset = 0;\r
d1102dba 585 switch (UpdatePageId) {\r
1436aea4
MK
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
d1102dba 596\r
1436aea4
MK
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
d1102dba 601\r
1436aea4
MK
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
d1102dba 617 }\r
1436aea4 618\r
d1102dba
LG
619 ASSERT (OptionOrder != NULL);\r
620\r
4af04335
DB
621 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
622 ASSERT (OptionsOpCodeHandle != NULL);\r
d1102dba 623\r
4af04335
DB
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
1436aea4
MK
628 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
629 if ((UINT32)(NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
4af04335
DB
630 BootOptionFound = TRUE;\r
631 break;\r
632 }\r
633 }\r
1436aea4 634\r
4af04335
DB
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
d1102dba 645\r
4af04335 646 if (OptionMenu->MenuNumber > 0) {\r
d1102dba
LG
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
4af04335 655 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
d1102dba
LG
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
4af04335
DB
660 );\r
661 }\r
662\r
663 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
664\r
665 UpdatePageEnd (CallbackData);\r
4af04335
DB
666}\r
667\r
4af04335
DB
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
1436aea4 676 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
677 )\r
678{\r
1436aea4
MK
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
4af04335
DB
690 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
691\r
692 ConOut = gST->ConOut;\r
693 Index = 0;\r
694 ValidMode = 0;\r
1436aea4 695 MaxMode = (UINTN)(ConOut->Mode->MaxMode);\r
4af04335
DB
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
1436aea4 709\r
4af04335
DB
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
1436aea4
MK
720 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
721 ASSERT (ModeToken != NULL);\r
4af04335
DB
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
d1102dba 736\r
4af04335
DB
737 //\r
738 // Build mode string Column x Row\r
739 //\r
9f4048f7 740 UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
4af04335 741 PStr = &ModeString[0];\r
1436aea4 742 StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen (L" x ") + 1);\r
4af04335 743 PStr = PStr + StrLen (PStr);\r
9f4048f7
HW
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
4af04335
DB
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
1436aea4 760 (UINT16)Mode\r
4af04335
DB
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
1436aea4 768 (UINT16)Mode\r
4af04335
DB
769 );\r
770 }\r
1436aea4 771\r
4af04335
DB
772 Index++;\r
773 }\r
774\r
775 HiiCreateOneOfOpCode (\r
776 mStartOpCodeHandle,\r
1436aea4 777 (EFI_QUESTION_ID)CON_MODE_QUESTION_ID,\r
4af04335
DB
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
1436aea4
MK
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
4af04335 797\r
1436aea4 798 @param CallbackData The BMM context data.\r
4af04335
DB
799\r
800**/\r
801VOID\r
802UpdateTerminalPage (\r
1436aea4 803 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
804 )\r
805{\r
1436aea4
MK
806 UINT8 Index;\r
807 UINT8 CheckFlags;\r
808 BM_MENU_ENTRY *NewMenuEntry;\r
809 VOID *OptionsOpCodeHandle;\r
810 UINTN CurrentTerminal;\r
4af04335
DB
811\r
812 CallbackData->BmmAskSaveOrNot = TRUE;\r
813\r
814 UpdatePageStart (CallbackData);\r
815\r
816 CurrentTerminal = CallbackData->CurrentTerminal;\r
1436aea4
MK
817 NewMenuEntry = BOpt_GetMenuEntry (\r
818 &TerminalMenu,\r
819 CurrentTerminal\r
820 );\r
4af04335
DB
821\r
822 if (NewMenuEntry == NULL) {\r
1436aea4 823 return;\r
4af04335
DB
824 }\r
825\r
826 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
827 ASSERT (OptionsOpCodeHandle != NULL);\r
828\r
1436aea4 829 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList[0]); Index++) {\r
4af04335
DB
830 CheckFlags = 0;\r
831 if (BaudRateList[Index].Value == 115200) {\r
832 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
833 }\r
1436aea4 834\r
4af04335
DB
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
1436aea4 846 (EFI_QUESTION_ID)(COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
4af04335 847 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 848 (UINT16)(COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
4af04335
DB
849 STRING_TOKEN (STR_COM_BAUD_RATE),\r
850 STRING_TOKEN (STR_COM_BAUD_RATE),\r
a3475fe0 851 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
852 EFI_IFR_NUMERIC_SIZE_1,\r
853 OptionsOpCodeHandle,\r
854 NULL\r
855 );\r
d1102dba 856\r
4af04335
DB
857 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
858 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
859 ASSERT (OptionsOpCodeHandle != NULL);\r
860\r
6eeeb288 861 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
4af04335
DB
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
1436aea4 879 (EFI_QUESTION_ID)(COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
4af04335 880 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 881 (UINT16)(COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
4af04335
DB
882 STRING_TOKEN (STR_COM_DATA_BITS),\r
883 STRING_TOKEN (STR_COM_DATA_BITS),\r
a3475fe0 884 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
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
6eeeb288 894 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
4af04335
DB
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
1436aea4 911 (EFI_QUESTION_ID)(COM_PARITY_QUESTION_ID + CurrentTerminal),\r
4af04335 912 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 913 (UINT16)(COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
4af04335
DB
914 STRING_TOKEN (STR_COM_PARITY),\r
915 STRING_TOKEN (STR_COM_PARITY),\r
a3475fe0 916 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
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
6eeeb288 926 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
4af04335
DB
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
1436aea4 943 (EFI_QUESTION_ID)(COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
4af04335 944 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 945 (UINT16)(COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
4af04335
DB
946 STRING_TOKEN (STR_COM_STOP_BITS),\r
947 STRING_TOKEN (STR_COM_STOP_BITS),\r
a3475fe0 948 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
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
6eeeb288 958 for (Index = 0; Index < ARRAY_SIZE (TerminalType); Index++) {\r
4af04335
DB
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
1436aea4 966 (EFI_STRING_ID)TerminalType[Index],\r
4af04335
DB
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
1436aea4 975 (EFI_QUESTION_ID)(COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
4af04335 976 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 977 (UINT16)(COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
4af04335
DB
978 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
979 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
a3475fe0 980 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
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
6eeeb288 990 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
1436aea4 991 CheckFlags = 0;\r
4af04335
DB
992 if (Index == 0) {\r
993 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
994 }\r
1436aea4 995\r
4af04335
DB
996 HiiCreateOneOfOptionOpCode (\r
997 OptionsOpCodeHandle,\r
1436aea4 998 (EFI_STRING_ID)mFlowControlType[Index],\r
4af04335
DB
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
1436aea4 1007 (EFI_QUESTION_ID)(COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
4af04335 1008 VARSTORE_ID_BOOT_MAINT,\r
1436aea4 1009 (UINT16)(COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
4af04335
DB
1010 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1011 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
a3475fe0 1012 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
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
d1102dba 1022\r
4af04335
DB
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
1436aea4
MK
1032UpdateOptionPage (\r
1033 IN BMM_CALLBACK_DATA *CallbackData,\r
1034 IN EFI_FORM_ID FormId,\r
1035 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
4af04335
DB
1036 )\r
1037{\r
1436aea4
MK
1038 CHAR16 *String;\r
1039 EFI_STRING_ID StringToken;\r
4af04335 1040\r
a91f1a0e
BD
1041 String = NULL;\r
1042\r
1436aea4
MK
1043 if (DevicePath != NULL) {\r
1044 String = ExtractFileNameFromDevicePath (DevicePath);\r
a91f1a0e 1045 }\r
1436aea4 1046\r
a91f1a0e 1047 if (String == NULL) {\r
4af04335
DB
1048 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
1049 ASSERT (String != NULL);\r
4af04335
DB
1050 }\r
1051\r
a91f1a0e
BD
1052 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1053 FreePool (String);\r
1054\r
1436aea4 1055 if (FormId == FORM_BOOT_ADD_ID) {\r
4af04335
DB
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
7880f73a
DB
1059 ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData));\r
1060 ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));\r
4af04335 1061 }\r
1436aea4 1062 } else if (FormId == FORM_DRV_ADD_FILE_ID) {\r
4af04335
DB
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
7880f73a
DB
1066 ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData));\r
1067 ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));\r
4af04335
DB
1068 }\r
1069 }\r
1070\r
1436aea4 1071 RefreshUpdateData ();\r
4af04335
DB
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
1436aea4
MK
1086 mStartOpCodeHandle, // Label FormId\r
1087 mEndOpCodeHandle // LABEL_END\r
4af04335
DB
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
1436aea4
MK
1101 IN UINT16 UpdatePageId,\r
1102 IN BMM_CALLBACK_DATA *CallbackData\r
4af04335
DB
1103 )\r
1104{\r
1105 CleanUpPage (UpdatePageId, CallbackData);\r
1106 switch (UpdatePageId) {\r
1436aea4
MK
1107 case FORM_CON_IN_ID:\r
1108 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1109 break;\r
4af04335 1110\r
1436aea4
MK
1111 case FORM_CON_OUT_ID:\r
1112 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1113 break;\r
4af04335 1114\r
1436aea4
MK
1115 case FORM_CON_ERR_ID:\r
1116 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1117 break;\r
4af04335 1118\r
1436aea4
MK
1119 case FORM_BOOT_CHG_ID:\r
1120 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1121 break;\r
4af04335 1122\r
1436aea4
MK
1123 case FORM_DRV_CHG_ID:\r
1124 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1125 break;\r
4af04335 1126\r
1436aea4
MK
1127 default:\r
1128 break;\r
4af04335
DB
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
1436aea4
MK
1141 BMM_CALLBACK_DATA *Private,\r
1142 UINT16 NewPageId\r
4af04335
DB
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
1436aea4
MK
1160 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1161 Private->BmmCurrentPageId = NewPageId;\r
4af04335
DB
1162 }\r
1163}\r