]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Code scrub for BdsDxe module.
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
CommitLineData
fd6a62f3 1/** @file\r
dce655e8 2Dynamically update the pages.\r
93e3992d 3\r
fd6a62f3 4Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
93e3992d 5All rights reserved. This 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
fd6a62f3 13**/\r
93e3992d 14\r
15#include "BootMaint.h"\r
16\r
b30312ba 17/**\r
93e3992d 18 Refresh the global UpdateData structure.\r
19\r
b30312ba 20**/\r
21VOID\r
22RefreshUpdateData (\r
23 VOID\r
24 )\r
93e3992d 25{\r
26 gUpdateData.Offset = 0;\r
27}\r
28\r
b30312ba 29/**\r
dce655e8 30 Add a "Go back to main page" tag in front of the form when there are no\r
31 "Apply changes" and "Discard changes" tags in the end of the form.\r
30394aa1 32 \r
dce655e8 33 @param CallbackData The BMM context data.\r
b30312ba 34\r
b30312ba 35**/\r
93e3992d 36VOID\r
37UpdatePageStart (\r
38 IN BMM_CALLBACK_DATA *CallbackData\r
39 )\r
40{\r
41 RefreshUpdateData ();\r
42\r
43 if (!(CallbackData->BmmAskSaveOrNot)) {\r
44 //\r
45 // Add a "Go back to main page" tag in front of the form when there are no\r
46 // "Apply changes" and "Discard changes" tags in the end of the form.\r
47 //\r
48 CreateGotoOpCode (\r
49 FORM_MAIN_ID,\r
50 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
51 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
52 0,\r
53 FORM_MAIN_ID,\r
54 &gUpdateData\r
55 );\r
56 }\r
57\r
58}\r
59\r
b30312ba 60/**\r
dce655e8 61 Create the "Apply changes" and "Discard changes" tags. And\r
62 ensure user can return to the main page.\r
b30312ba 63\r
dce655e8 64 @param CallbackData The BMM context data.\r
b30312ba 65\r
b30312ba 66**/\r
93e3992d 67VOID\r
68UpdatePageEnd (\r
69 IN BMM_CALLBACK_DATA *CallbackData\r
70 )\r
71{\r
72 //\r
73 // Create the "Apply changes" and "Discard changes" tags.\r
74 //\r
75 if (CallbackData->BmmAskSaveOrNot) {\r
76 CreateSubTitleOpCode (\r
77 STRING_TOKEN (STR_NULL_STRING),\r
78 0,\r
79 0,\r
80 0,\r
81 &gUpdateData\r
82 );\r
83\r
84 CreateGotoOpCode (\r
85 FORM_MAIN_ID,\r
86 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
87 STRING_TOKEN (STR_NULL_STRING),\r
88 EFI_IFR_FLAG_CALLBACK,\r
89 KEY_VALUE_SAVE_AND_EXIT,\r
90 &gUpdateData\r
91 );\r
92 }\r
93\r
94 //\r
95 // Ensure user can return to the main page.\r
96 //\r
97 CreateGotoOpCode (\r
98 FORM_MAIN_ID,\r
99 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
100 STRING_TOKEN (STR_NULL_STRING),\r
101 EFI_IFR_FLAG_CALLBACK,\r
102 KEY_VALUE_NO_SAVE_AND_EXIT,\r
103 &gUpdateData\r
104 );\r
105\r
106 IfrLibUpdateForm (\r
107 CallbackData->BmmHiiHandle,\r
108 &mBootMaintGuid,\r
109 CallbackData->BmmCurrentPageId,\r
110 CallbackData->BmmCurrentPageId,\r
111 FALSE,\r
112 &gUpdateData\r
113 );\r
114}\r
115\r
b30312ba 116/**\r
dce655e8 117 Clean up the dynamic opcode at label and form specified by\r
118 both LabelId. \r
b30312ba 119\r
dce655e8 120 @param LabelId It is both the Form ID and Label ID for\r
121 opcode deletion.\r
122 @param CallbackData The BMM context data.\r
b30312ba 123\r
b30312ba 124**/\r
93e3992d 125VOID\r
126CleanUpPage (\r
127 IN UINT16 LabelId,\r
128 IN BMM_CALLBACK_DATA *CallbackData\r
129 )\r
130{\r
131 RefreshUpdateData ();\r
132\r
133 //\r
134 // Remove all op-codes from dynamic page\r
135 //\r
136 IfrLibUpdateForm (\r
137 CallbackData->BmmHiiHandle,\r
138 &mBootMaintGuid,\r
139 LabelId,\r
140 LabelId,\r
141 FALSE,\r
142 &gUpdateData\r
143 );\r
144}\r
145\r
b30312ba 146/**\r
dce655e8 147 Boot a file selected by user at File Expoloer of BMM.\r
b30312ba 148\r
dce655e8 149 @param FileContext The file context data, which contains the device path\r
150 of the file to be boot from.\r
b30312ba 151\r
dce655e8 152 @retval EFI_SUCCESS The function completed successfull.\r
744fc758 153 @return Other value if the boot from the file fails.\r
b30312ba 154\r
155**/\r
93e3992d 156EFI_STATUS\r
157BootThisFile (\r
158 IN BM_FILE_CONTEXT *FileContext\r
159 )\r
160{\r
161 EFI_STATUS Status;\r
162 UINTN ExitDataSize;\r
163 CHAR16 *ExitData;\r
164 BDS_COMMON_OPTION *Option;\r
165\r
166 Status = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID **) &Option);\r
167 Option->Description = FileContext->FileName;\r
168 Option->DevicePath = FileContext->DevicePath;\r
169 Option->LoadOptionsSize = 0;\r
170 Option->LoadOptions = NULL;\r
171\r
172 //\r
173 // Since current no boot from removable media directly is allowed */\r
174 //\r
175 gST->ConOut->ClearScreen (gST->ConOut);\r
176\r
177 gBS->RaiseTPL (TPL_APPLICATION);\r
178\r
179 ExitDataSize = 0;\r
180\r
181 Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);\r
182\r
183 gBS->RestoreTPL (TPL_APPLICATION);\r
184\r
185 return Status;\r
186\r
187}\r
188\r
b30312ba 189/**\r
dce655e8 190 Create a list of Goto Opcode for all terminal devices logged\r
191 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
b30312ba 192\r
dce655e8 193 @param CallbackData The BMM context data.\r
b30312ba 194**/\r
93e3992d 195VOID\r
196UpdateConCOMPage (\r
197 IN BMM_CALLBACK_DATA *CallbackData\r
198 )\r
199{\r
200 BM_MENU_ENTRY *NewMenuEntry;\r
201 UINT16 Index;\r
93e3992d 202\r
203 CallbackData->BmmAskSaveOrNot = FALSE;\r
204\r
205 UpdatePageStart (CallbackData);\r
206\r
fb42e02b 207\r
208 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
209 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
210\r
211 CreateGotoOpCode (\r
212 FORM_CON_COM_SETUP_ID,\r
213 NewMenuEntry->DisplayStringToken,\r
214 STRING_TOKEN (STR_NULL_STRING),\r
215 EFI_IFR_FLAG_CALLBACK,\r
216 (UINT16) (TERMINAL_OPTION_OFFSET + Index),\r
217 &gUpdateData\r
218 );\r
93e3992d 219 }\r
220\r
221 UpdatePageEnd (CallbackData);\r
222}\r
223\r
b30312ba 224/**\r
dce655e8 225 Create a lit of boot option from global BootOptionMenu. It\r
226 allow user to delete the boot option.\r
b30312ba 227\r
dce655e8 228 @param CallbackData The BMM context data.\r
b30312ba 229\r
b30312ba 230**/\r
93e3992d 231VOID\r
232UpdateBootDelPage (\r
233 IN BMM_CALLBACK_DATA *CallbackData\r
234 )\r
235{\r
236 BM_MENU_ENTRY *NewMenuEntry;\r
237 BM_LOAD_CONTEXT *NewLoadContext;\r
238 UINT16 Index;\r
239\r
240 CallbackData->BmmAskSaveOrNot = TRUE;\r
241\r
242 UpdatePageStart (CallbackData);\r
243 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
244\r
245 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
246 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
247 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
248 if (NewLoadContext->IsLegacy) {\r
249 continue;\r
250 }\r
251\r
252 NewLoadContext->Deleted = FALSE;\r
253 CallbackData->BmmFakeNvData.BootOptionDel[Index] = 0x00;\r
254\r
255 CreateCheckBoxOpCode (\r
256 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
257 VARSTORE_ID_BOOT_MAINT,\r
258 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
259 NewMenuEntry->DisplayStringToken,\r
260 NewMenuEntry->HelpStringToken,\r
261 0,\r
262 0,\r
263 &gUpdateData\r
264 );\r
265 }\r
266\r
267 UpdatePageEnd (CallbackData);\r
268}\r
269\r
b30312ba 270/**\r
dce655e8 271 Create a lit of driver option from global DriverMenu.\r
b30312ba 272\r
dce655e8 273 @param CallbackData The BMM context data.\r
b30312ba 274\r
b30312ba 275**/\r
93e3992d 276VOID\r
277UpdateDrvAddHandlePage (\r
278 IN BMM_CALLBACK_DATA *CallbackData\r
279 )\r
280{\r
281 BM_MENU_ENTRY *NewMenuEntry;\r
282 UINT16 Index;\r
283\r
284 CallbackData->BmmAskSaveOrNot = FALSE;\r
285\r
286 UpdatePageStart (CallbackData);\r
287\r
288 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
289 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
290\r
291 CreateGotoOpCode (\r
292 FORM_DRV_ADD_HANDLE_DESC_ID,\r
293 NewMenuEntry->DisplayStringToken,\r
294 STRING_TOKEN (STR_NULL_STRING),\r
295 EFI_IFR_FLAG_CALLBACK,\r
296 (UINT16) (HANDLE_OPTION_OFFSET + Index),\r
297 &gUpdateData\r
298 );\r
299 }\r
300\r
301 UpdatePageEnd (CallbackData);\r
302}\r
303\r
b30312ba 304/**\r
dce655e8 305 Create a lit of driver option from global DriverOptionMenu. It\r
306 allow user to delete the driver option.\r
b30312ba 307\r
dce655e8 308 @param CallbackData The BMM context data.\r
309\r
b30312ba 310**/\r
93e3992d 311VOID\r
312UpdateDrvDelPage (\r
313 IN BMM_CALLBACK_DATA *CallbackData\r
314 )\r
315{\r
316 BM_MENU_ENTRY *NewMenuEntry;\r
317 BM_LOAD_CONTEXT *NewLoadContext;\r
318 UINT16 Index;\r
319\r
320 CallbackData->BmmAskSaveOrNot = TRUE;\r
321\r
322 UpdatePageStart (CallbackData);\r
323\r
324 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
325\r
326 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
327 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
328\r
329 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
330 NewLoadContext->Deleted = FALSE;\r
331 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = 0x00;\r
332\r
333 CreateCheckBoxOpCode (\r
334 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
335 VARSTORE_ID_BOOT_MAINT,\r
336 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
337 NewMenuEntry->DisplayStringToken,\r
338 NewMenuEntry->HelpStringToken,\r
339 0,\r
340 0,\r
341 &gUpdateData\r
342 );\r
343 }\r
344\r
345 UpdatePageEnd (CallbackData);\r
346}\r
347\r
b30312ba 348/**\r
dce655e8 349 Prepare the page to allow user to add description for \r
350 a Driver Option.\r
b30312ba 351\r
dce655e8 352 @param CallbackData The BMM context data.\r
b30312ba 353\r
b30312ba 354**/\r
93e3992d 355VOID\r
356UpdateDriverAddHandleDescPage (\r
357 IN BMM_CALLBACK_DATA *CallbackData\r
358 )\r
359{\r
360 BM_MENU_ENTRY *NewMenuEntry;\r
361\r
362 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
363 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
364 CallbackData->BmmAskSaveOrNot = TRUE;\r
365 NewMenuEntry = CallbackData->MenuEntry;\r
366\r
367 UpdatePageStart (CallbackData);\r
368\r
369 CreateSubTitleOpCode (\r
370 NewMenuEntry->DisplayStringToken,\r
371 0,\r
372 0,\r
373 0,\r
374 &gUpdateData\r
375 );\r
376\r
377 CreateStringOpCode (\r
378 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
379 VARSTORE_ID_BOOT_MAINT,\r
380 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
381 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
382 STRING_TOKEN (STR_NULL_STRING),\r
383 0,\r
384 0,\r
385 6,\r
386 75,\r
387 &gUpdateData\r
388 );\r
389\r
390 CreateCheckBoxOpCode (\r
391 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
392 VARSTORE_ID_BOOT_MAINT,\r
393 DRV_ADD_RECON_VAR_OFFSET,\r
394 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
395 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
396 0,\r
397 0,\r
398 &gUpdateData\r
399 );\r
400\r
401 CreateStringOpCode (\r
402 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
403 VARSTORE_ID_BOOT_MAINT,\r
404 DRIVER_ADD_OPTION_VAR_OFFSET,\r
405 STRING_TOKEN (STR_OPTIONAL_DATA),\r
406 STRING_TOKEN (STR_NULL_STRING),\r
407 0,\r
408 0,\r
409 6,\r
410 75,\r
411 &gUpdateData\r
412 );\r
413\r
414 UpdatePageEnd (CallbackData);\r
415}\r
416\r
b30312ba 417/**\r
744fc758 418 Update console page.\r
b30312ba 419\r
744fc758 420 @param UpdatePageId The form ID to be updated.\r
421 @param ConsoleMenu The console menu list.\r
dce655e8 422 @param CallbackData The BMM context data.\r
b30312ba 423\r
b30312ba 424**/\r
93e3992d 425VOID\r
426UpdateConsolePage (\r
427 IN UINT16 UpdatePageId,\r
428 IN BM_MENU_OPTION *ConsoleMenu,\r
429 IN BMM_CALLBACK_DATA *CallbackData\r
430 )\r
431{\r
432 BM_MENU_ENTRY *NewMenuEntry;\r
433 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
434 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
435 UINT16 Index;\r
436 UINT16 Index2;\r
437 UINT8 CheckFlags;\r
fb42e02b 438 \r
93e3992d 439 CallbackData->BmmAskSaveOrNot = TRUE;\r
440\r
441 UpdatePageStart (CallbackData);\r
442\r
443 for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
444 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
445 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
446 CheckFlags = 0;\r
447 if (NewConsoleContext->IsActive) {\r
448 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
449 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
450 } else {\r
451 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
452 }\r
453\r
454 CreateCheckBoxOpCode (\r
455 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
456 VARSTORE_ID_BOOT_MAINT,\r
457 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
458 NewMenuEntry->DisplayStringToken,\r
459 NewMenuEntry->HelpStringToken,\r
460 0,\r
461 CheckFlags,\r
462 &gUpdateData\r
463 );\r
464 }\r
465\r
fb42e02b 466 for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {\r
467 CheckFlags = 0;\r
468 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
469 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
470\r
a78b08d1 471 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
472 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
473 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
fb42e02b 474 ) {\r
475 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
476 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
477 } else {\r
478 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
93e3992d 479 }\r
fb42e02b 480\r
481 CreateCheckBoxOpCode (\r
482 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
483 VARSTORE_ID_BOOT_MAINT,\r
484 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
485 NewMenuEntry->DisplayStringToken,\r
486 NewMenuEntry->HelpStringToken,\r
487 0,\r
488 CheckFlags,\r
489 &gUpdateData\r
490 );\r
491\r
492 Index++;\r
93e3992d 493 }\r
494\r
495 UpdatePageEnd (CallbackData);\r
496}\r
497\r
b30312ba 498/**\r
dce655e8 499 Update the page's NV Map if user has changed the order\r
500 a list. This list can be Boot Order or Driver Order.\r
b30312ba 501\r
dce655e8 502 @param UpdatePageId The form ID to be updated.\r
503 @param OptionMenu The new list.\r
504 @param CallbackData The BMM context data.\r
b30312ba 505\r
b30312ba 506**/\r
93e3992d 507VOID\r
508UpdateOrderPage (\r
509 IN UINT16 UpdatePageId,\r
510 IN BM_MENU_OPTION *OptionMenu,\r
511 IN BMM_CALLBACK_DATA *CallbackData\r
512 )\r
513{\r
514 BM_MENU_ENTRY *NewMenuEntry;\r
515 UINT16 Index;\r
516 IFR_OPTION *IfrOptionList;\r
517\r
518 CallbackData->BmmAskSaveOrNot = TRUE;\r
519\r
520 UpdatePageStart (CallbackData);\r
521\r
522 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
523\r
524 ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100);\r
525\r
dce655e8 526 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);\r
93e3992d 527 if (NULL == IfrOptionList) {\r
528 return ;\r
529 }\r
530\r
531 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
532 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
533 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
534 IfrOptionList[Index].Value.u8 = (UINT8) (NewMenuEntry->OptionNumber + 1);\r
535 IfrOptionList[Index].Flags = 0;\r
536 CallbackData->BmmFakeNvData.OptionOrder[Index] = IfrOptionList[Index].Value.u8;\r
537 }\r
538\r
539 if (OptionMenu->MenuNumber > 0) {\r
540 CreateOrderedListOpCode (\r
541 (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,\r
542 VARSTORE_ID_BOOT_MAINT,\r
543 OPTION_ORDER_VAR_OFFSET,\r
544 STRING_TOKEN (STR_CHANGE_ORDER),\r
545 STRING_TOKEN (STR_CHANGE_ORDER),\r
546 0,\r
547 0,\r
548 EFI_IFR_NUMERIC_SIZE_1,\r
549 100,\r
550 IfrOptionList,\r
551 OptionMenu->MenuNumber,\r
552 &gUpdateData\r
553 );\r
554 }\r
555\r
556 SafeFreePool (IfrOptionList);\r
557\r
558 UpdatePageEnd (CallbackData);\r
559\r
560 CopyMem (\r
561 CallbackData->BmmOldFakeNVData.OptionOrder,\r
562 CallbackData->BmmFakeNvData.OptionOrder,\r
563 100\r
564 );\r
565}\r
566\r
b30312ba 567/**\r
dce655e8 568 Create the dynamic page to allow user to set\r
569 the "BootNext" vaule.\r
b30312ba 570\r
dce655e8 571 @param CallbackData The BMM context data.\r
b30312ba 572\r
b30312ba 573**/\r
93e3992d 574VOID\r
575UpdateBootNextPage (\r
576 IN BMM_CALLBACK_DATA *CallbackData\r
577 )\r
578{\r
579 BM_MENU_ENTRY *NewMenuEntry;\r
580 BM_LOAD_CONTEXT *NewLoadContext;\r
581 IFR_OPTION *IfrOptionList;\r
582 UINTN NumberOfOptions;\r
583 UINT16 Index;\r
584\r
585 IfrOptionList = NULL;\r
586 NumberOfOptions = BootOptionMenu.MenuNumber;\r
587 CallbackData->BmmAskSaveOrNot = TRUE;\r
588\r
589 UpdatePageStart (CallbackData);\r
590 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
591\r
592 if (NumberOfOptions > 0) {\r
dce655e8 593 IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));\r
93e3992d 594\r
595 ASSERT (IfrOptionList);\r
596\r
597 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
598\r
599 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
600 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
601 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
602 if (NewLoadContext->IsBootNext) {\r
603 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;\r
604 CallbackData->BmmFakeNvData.BootNext = Index;\r
605 } else {\r
606 IfrOptionList[Index].Flags = 0;\r
607 }\r
608\r
609 IfrOptionList[Index].Value.u16 = Index;\r
610 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
611 }\r
612\r
613 IfrOptionList[Index].Value.u16 = Index;\r
614 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);\r
615 IfrOptionList[Index].Flags = 0;\r
616 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
617 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;\r
618 }\r
619\r
620 CreateOneOfOpCode (\r
621 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
622 VARSTORE_ID_BOOT_MAINT,\r
623 BOOT_NEXT_VAR_OFFSET,\r
624 STRING_TOKEN (STR_BOOT_NEXT),\r
625 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
626 0,\r
627 EFI_IFR_NUMERIC_SIZE_2,\r
628 IfrOptionList,\r
629 (UINTN) (NumberOfOptions + 1),\r
630 &gUpdateData\r
631 );\r
632\r
633 SafeFreePool (IfrOptionList);\r
634 }\r
635\r
636 UpdatePageEnd (CallbackData);\r
637}\r
638\r
b30312ba 639/**\r
dce655e8 640 Create the dynamic page to allow user to set\r
641 the "TimeOut" vaule.\r
b30312ba 642\r
dce655e8 643 @param CallbackData The BMM context data.\r
b30312ba 644\r
b30312ba 645**/\r
93e3992d 646VOID\r
647UpdateTimeOutPage (\r
648 IN BMM_CALLBACK_DATA *CallbackData\r
649 )\r
650{\r
651 UINT16 BootTimeOut;\r
652\r
653 CallbackData->BmmAskSaveOrNot = TRUE;\r
654\r
655 UpdatePageStart (CallbackData);\r
656\r
657 BootTimeOut = BdsLibGetTimeout ();\r
658\r
659 CreateNumericOpCode (\r
660 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
661 VARSTORE_ID_BOOT_MAINT,\r
662 BOOT_TIME_OUT_VAR_OFFSET,\r
663 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
664 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
665 0,\r
666 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
667 0,\r
668 65535,\r
669 0,\r
670 BootTimeOut,\r
671 &gUpdateData\r
672 );\r
673\r
674 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
675\r
676 UpdatePageEnd (CallbackData);\r
677}\r
678\r
b30312ba 679/**\r
93e3992d 680 Refresh the text mode page\r
681\r
dce655e8 682 @param CallbackData The BMM context data.\r
93e3992d 683\r
b30312ba 684**/\r
685VOID\r
686UpdateConModePage (\r
687 IN BMM_CALLBACK_DATA *CallbackData\r
688 )\r
93e3992d 689{\r
690 UINTN Mode;\r
691 UINTN Index;\r
692 UINTN Col;\r
693 UINTN Row;\r
694 CHAR16 RowString[50];\r
695 CHAR16 ModeString[50];\r
696 UINTN MaxMode;\r
697 UINTN ValidMode;\r
698 EFI_STRING_ID *ModeToken;\r
699 IFR_OPTION *IfrOptionList;\r
700 EFI_STATUS Status;\r
701 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
702\r
703 ConOut = gST->ConOut;\r
704 Index = 0;\r
705 ValidMode = 0;\r
706 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
707\r
708 CallbackData->BmmAskSaveOrNot = TRUE;\r
709\r
710 UpdatePageStart (CallbackData);\r
711\r
712 //\r
713 // Check valid mode\r
714 //\r
715 for (Mode = 0; Mode < MaxMode; Mode++) {\r
716 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
717 if (EFI_ERROR (Status)) {\r
718 continue;\r
719 }\r
720 ValidMode++;\r
721 }\r
722\r
723 if (ValidMode == 0) {\r
724 return;\r
725 }\r
726\r
dce655e8 727 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * ValidMode);\r
93e3992d 728 ASSERT(IfrOptionList != NULL);\r
729\r
dce655e8 730 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
93e3992d 731 ASSERT(ModeToken != NULL);\r
732\r
733 //\r
734 // Determin which mode should be the first entry in menu\r
735 //\r
736 GetConsoleOutMode (CallbackData);\r
737\r
738 //\r
739 // Build text mode options\r
740 //\r
741 for (Mode = 0; Mode < MaxMode; Mode++) {\r
742 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
743 if (EFI_ERROR (Status)) {\r
744 continue;\r
745 }\r
746 //\r
747 // Build mode string Column x Row\r
748 //\r
749 UnicodeValueToString (ModeString, 0, Col, 0);\r
750 StrCat (ModeString, L" x ");\r
751 UnicodeValueToString (RowString, 0, Row, 0);\r
752 StrCat (ModeString, RowString);\r
753\r
9226efe5 754 HiiLibNewString (CallbackData->BmmHiiHandle, &ModeToken[Index], ModeString);\r
93e3992d 755\r
756 IfrOptionList[Index].StringToken = ModeToken[Index];\r
757 IfrOptionList[Index].Value.u16 = (UINT16) Mode;\r
758 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
759 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;\r
760 } else {\r
761 IfrOptionList[Index].Flags = 0;\r
762 }\r
763 Index++;\r
764 }\r
765\r
766 CreateOneOfOpCode (\r
767 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
768 VARSTORE_ID_BOOT_MAINT,\r
769 CON_MODE_VAR_OFFSET,\r
770 STRING_TOKEN (STR_CON_MODE_SETUP),\r
771 STRING_TOKEN (STR_CON_MODE_SETUP),\r
772 EFI_IFR_FLAG_RESET_REQUIRED,\r
773 EFI_IFR_NUMERIC_SIZE_2,\r
774 IfrOptionList,\r
775 ValidMode,\r
776 &gUpdateData\r
777 );\r
778 SafeFreePool (IfrOptionList);\r
779 SafeFreePool (ModeToken);\r
780\r
781 UpdatePageEnd (CallbackData);\r
782}\r
783\r
b30312ba 784/**\r
dce655e8 785 Create the dynamic page which allows user to \r
786 set the property such as Baud Rate, Data Bits,\r
787 Parity, Stop Bits, Terminal Type.\r
b30312ba 788\r
dce655e8 789 @param CallbackData The BMM context data.\r
b30312ba 790\r
b30312ba 791**/\r
93e3992d 792VOID\r
793UpdateTerminalPage (\r
794 IN BMM_CALLBACK_DATA *CallbackData\r
795 )\r
796{\r
797 UINT8 Index;\r
798 UINT8 CheckFlags;\r
799 IFR_OPTION *IfrOptionList;\r
800 BM_MENU_ENTRY *NewMenuEntry;\r
801 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
802\r
803 CallbackData->BmmAskSaveOrNot = TRUE;\r
804\r
805 UpdatePageStart (CallbackData);\r
806\r
807 NewMenuEntry = BOpt_GetMenuEntry (\r
808 &TerminalMenu,\r
809 CallbackData->CurrentTerminal\r
810 );\r
811\r
812 if (NewMenuEntry == NULL) {\r
813 return ;\r
814 }\r
815\r
816 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
817\r
dce655e8 818 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 19);\r
93e3992d 819 if (IfrOptionList == NULL) {\r
820 return ;\r
821 }\r
822\r
dce655e8 823 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
93e3992d 824 CheckFlags = 0;\r
825 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
826 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
827 NewTerminalContext->BaudRateIndex = Index;\r
828 CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;\r
829 }\r
830\r
831 IfrOptionList[Index].Flags = CheckFlags;\r
832 IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;\r
833 IfrOptionList[Index].Value.u8 = Index;\r
834 }\r
835\r
836 CreateOneOfOpCode (\r
837 (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
838 VARSTORE_ID_BOOT_MAINT,\r
839 COM_BAUD_RATE_VAR_OFFSET,\r
840 STRING_TOKEN (STR_COM_BAUD_RATE),\r
841 STRING_TOKEN (STR_COM_BAUD_RATE),\r
842 0,\r
843 EFI_IFR_NUMERIC_SIZE_1,\r
844 IfrOptionList,\r
845 19,\r
846 &gUpdateData\r
847 );\r
848\r
dce655e8 849 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
93e3992d 850 CheckFlags = 0;\r
851\r
852 if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
853 NewTerminalContext->DataBitsIndex = Index;\r
854 CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;\r
855 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
856 }\r
857\r
858 IfrOptionList[Index].Flags = CheckFlags;\r
859 IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;\r
860 IfrOptionList[Index].Value.u8 = Index;\r
861 }\r
862\r
863 CreateOneOfOpCode (\r
864 (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
865 VARSTORE_ID_BOOT_MAINT,\r
866 COM_DATA_RATE_VAR_OFFSET,\r
867 STRING_TOKEN (STR_COM_DATA_BITS),\r
868 STRING_TOKEN (STR_COM_DATA_BITS),\r
869 0,\r
870 EFI_IFR_NUMERIC_SIZE_1,\r
871 IfrOptionList,\r
872 4,\r
873 &gUpdateData\r
874 );\r
875\r
dce655e8 876 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
93e3992d 877 CheckFlags = 0;\r
878 if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
879 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
880 NewTerminalContext->ParityIndex = (UINT8) Index;\r
881 CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;\r
882 }\r
883\r
884 IfrOptionList[Index].Flags = CheckFlags;\r
885 IfrOptionList[Index].StringToken = ParityList[Index].StringToken;\r
886 IfrOptionList[Index].Value.u8 = Index;\r
887 }\r
888\r
889 CreateOneOfOpCode (\r
890 (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
891 VARSTORE_ID_BOOT_MAINT,\r
892 COM_PARITY_VAR_OFFSET,\r
893 STRING_TOKEN (STR_COM_PARITY),\r
894 STRING_TOKEN (STR_COM_PARITY),\r
895 0,\r
896 EFI_IFR_NUMERIC_SIZE_1,\r
897 IfrOptionList,\r
898 5,\r
899 &gUpdateData\r
900 );\r
901\r
dce655e8 902 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
93e3992d 903 CheckFlags = 0;\r
904 if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
905 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
906 NewTerminalContext->StopBitsIndex = (UINT8) Index;\r
907 CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;\r
908 }\r
909\r
910 IfrOptionList[Index].Flags = CheckFlags;\r
911 IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;\r
912 IfrOptionList[Index].Value.u8 = Index;\r
913 }\r
914\r
915 CreateOneOfOpCode (\r
916 (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
917 VARSTORE_ID_BOOT_MAINT,\r
918 COM_STOP_BITS_VAR_OFFSET,\r
919 STRING_TOKEN (STR_COM_STOP_BITS),\r
920 STRING_TOKEN (STR_COM_STOP_BITS),\r
921 0,\r
922 EFI_IFR_NUMERIC_SIZE_1,\r
923 IfrOptionList,\r
924 3,\r
925 &gUpdateData\r
926 );\r
927\r
928 for (Index = 0; Index < 4; Index++) {\r
929 CheckFlags = 0;\r
930 if (NewTerminalContext->TerminalType == Index) {\r
931 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
932 CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
933 }\r
934\r
935 IfrOptionList[Index].Flags = CheckFlags;\r
936 IfrOptionList[Index].StringToken = (EFI_STRING_ID) TerminalType[Index];\r
937 IfrOptionList[Index].Value.u8 = Index;\r
938 }\r
939\r
940 CreateOneOfOpCode (\r
941 (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
942 VARSTORE_ID_BOOT_MAINT,\r
943 COM_TERMINAL_VAR_OFFSET,\r
944 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
945 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
946 0,\r
947 EFI_IFR_NUMERIC_SIZE_1,\r
948 IfrOptionList,\r
949 4,\r
950 &gUpdateData\r
951 );\r
952\r
953 SafeFreePool (IfrOptionList);\r
954\r
955 UpdatePageEnd (CallbackData);\r
956}\r
957\r
b30312ba 958/**\r
dce655e8 959 Dispatch the correct update page function to call based on\r
960 the UpdatePageId.\r
b30312ba 961\r
dce655e8 962 @param UpdatePageId The form ID.\r
963 @param CallbackData The BMM context data.\r
b30312ba 964\r
b30312ba 965**/\r
93e3992d 966VOID\r
967UpdatePageBody (\r
968 IN UINT16 UpdatePageId,\r
969 IN BMM_CALLBACK_DATA *CallbackData\r
970 )\r
971{\r
972 CleanUpPage (UpdatePageId, CallbackData);\r
973 switch (UpdatePageId) {\r
974 case FORM_CON_IN_ID:\r
975 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
976 break;\r
977\r
978 case FORM_CON_OUT_ID:\r
979 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
980 break;\r
981\r
982 case FORM_CON_ERR_ID:\r
983 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
984 break;\r
985\r
986 case FORM_BOOT_CHG_ID:\r
987 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
988 break;\r
989\r
990 case FORM_DRV_CHG_ID:\r
991 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
992 break;\r
993\r
994 default:\r
995 break;\r
996 }\r
997}\r
998\r
b30312ba 999/**\r
dce655e8 1000 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
1001 specified by DeviceType.\r
b30312ba 1002\r
dce655e8 1003 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,\r
1004 etc.\r
1005 @param OptionIndex Returns the index number (#### in Boot####).\r
1006 @param OptionSize Return the size of the Boot### variable.\r
b30312ba 1007\r
b30312ba 1008**/\r
93e3992d 1009VOID *\r
1010GetLegacyBootOptionVar (\r
1011 IN UINTN DeviceType,\r
1012 OUT UINTN *OptionIndex,\r
1013 OUT UINTN *OptionSize\r
1014 )\r
1015{\r
1016 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
1017 VOID *OptionBuffer;\r
1018 UINTN OrderSize;\r
1019 UINTN Index;\r
1020 UINT16 *OrderBuffer;\r
1021 CHAR16 StrTemp[100];\r
1022 UINT16 FilePathSize;\r
1023 UINT8 *Ptr;\r
1024 UINT8 *OptionalData;\r
1025\r
1026 //\r
1027 // Get Boot Option number from the size of BootOrder\r
1028 //\r
1029 OrderBuffer = BdsLibGetVariableAndSize (\r
1030 L"BootOrder",\r
1031 &gEfiGlobalVariableGuid,\r
1032 &OrderSize\r
1033 );\r
1034\r
1035 for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {\r
1036 UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);\r
1037 OptionBuffer = BdsLibGetVariableAndSize (\r
1038 StrTemp,\r
1039 &gEfiGlobalVariableGuid,\r
1040 OptionSize\r
1041 );\r
1042 if (NULL == OptionBuffer) {\r
1043 continue;\r
1044 }\r
1045\r
1046 Ptr = (UINT8 *) OptionBuffer;\r
1047 Ptr += sizeof (UINT32);\r
1048\r
1049 FilePathSize = *(UINT16 *) Ptr;\r
1050 Ptr += sizeof (UINT16);\r
1051\r
1052 Ptr += StrSize ((CHAR16 *) Ptr);\r
1053\r
1054 //\r
1055 // Now Ptr point to Device Path\r
1056 //\r
1057 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
1058 Ptr += FilePathSize;\r
1059\r
1060 //\r
1061 // Now Ptr point to Optional Data\r
1062 //\r
1063 OptionalData = Ptr;\r
1064\r
1065 if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&\r
1066 (BBS_DEVICE_PATH == DevicePath->Type) &&\r
1067 (BBS_BBS_DP == DevicePath->SubType)\r
1068 ) {\r
1069 *OptionIndex = OrderBuffer[Index];\r
1070 SafeFreePool (OrderBuffer);\r
1071 return OptionBuffer;\r
1072 } else {\r
1073 SafeFreePool (OptionBuffer);\r
1074 }\r
1075 }\r
1076\r
1077 SafeFreePool (OrderBuffer);\r
1078 return NULL;\r
1079}\r
1080\r
b30312ba 1081/**\r
dce655e8 1082 Create a dynamic page so that Legacy Device boot order\r
1083 can be set for specified device type.\r
b30312ba 1084\r
dce655e8 1085 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1086 @param CallbackData The BMM context data.\r
b30312ba 1087\r
b30312ba 1088\r
1089**/\r
93e3992d 1090VOID\r
1091UpdateSetLegacyDeviceOrderPage (\r
1092 IN UINT16 UpdatePageId,\r
1093 IN BMM_CALLBACK_DATA *CallbackData\r
1094 )\r
1095{\r
1096 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
1097 BM_MENU_OPTION *OptionMenu;\r
1098 BM_MENU_ENTRY *NewMenuEntry;\r
1099 IFR_OPTION *IfrOptionList;\r
1100 EFI_STRING_ID StrRef;\r
1101 EFI_STRING_ID StrRefHelp;\r
1102 BBS_TYPE BbsType;\r
1103 UINTN VarSize;\r
1104 UINTN Pos;\r
1105 UINTN Bit;\r
1106 UINT16 Index;\r
1107 UINT16 Key;\r
1108 CHAR16 String[100];\r
1109 CHAR16 *TypeStr;\r
1110 CHAR16 *TypeStrHelp;\r
1111 UINT16 VarDevOrder;\r
1112 UINT8 *VarData;\r
1113 UINT8 *LegacyOrder;\r
1114 UINT8 *OldData;\r
1115 UINT8 *DisMap;\r
1116\r
1117 OptionMenu = NULL;\r
1118 Key = 0;\r
1119 StrRef = 0;\r
1120 StrRefHelp = 0;\r
1121 TypeStr = NULL;\r
1122 TypeStrHelp = NULL;\r
1123 BbsType = BBS_FLOPPY;\r
1124 LegacyOrder = NULL;\r
1125 OldData = NULL;\r
1126 DisMap = NULL;\r
1127\r
1128 CallbackData->BmmAskSaveOrNot = TRUE;\r
1129 UpdatePageStart (CallbackData);\r
1130\r
1131 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
1132\r
1133 SetMem (DisMap, 32, 0);\r
1134 //\r
1135 // Create oneof option list\r
1136 //\r
1137 switch (UpdatePageId) {\r
1138 case FORM_SET_FD_ORDER_ID:\r
1139 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1140 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
744fc758 1141 TypeStr = STR_FLOPPY;\r
1142 TypeStrHelp = STR_FLOPPY_HELP;\r
93e3992d 1143 BbsType = BBS_FLOPPY;\r
1144 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1145 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1146 break;\r
1147\r
1148 case FORM_SET_HD_ORDER_ID:\r
1149 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1150 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
744fc758 1151 TypeStr = STR_HARDDISK;\r
1152 TypeStrHelp = STR_HARDDISK_HELP;\r
93e3992d 1153 BbsType = BBS_HARDDISK;\r
1154 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1155 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1156 break;\r
1157\r
1158 case FORM_SET_CD_ORDER_ID:\r
1159 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1160 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
744fc758 1161 TypeStr = STR_CDROM;\r
1162 TypeStrHelp = STR_CDROM_HELP;\r
93e3992d 1163 BbsType = BBS_CDROM;\r
1164 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1165 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1166 break;\r
1167\r
1168 case FORM_SET_NET_ORDER_ID:\r
1169 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1170 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
744fc758 1171 TypeStr = STR_NET;\r
1172 TypeStrHelp = STR_NET_HELP;\r
93e3992d 1173 BbsType = BBS_EMBED_NETWORK;\r
1174 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1175 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1176 break;\r
1177\r
1178 case FORM_SET_BEV_ORDER_ID:\r
1179 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1180 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
744fc758 1181 TypeStr = STR_BEV;\r
1182 TypeStrHelp = STR_BEV_HELP;\r
93e3992d 1183 BbsType = BBS_BEV_DEVICE;\r
1184 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1185 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1186 break;\r
1187\r
1188 }\r
1189\r
1190 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1191\r
dce655e8 1192 IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));\r
93e3992d 1193 if (NULL == IfrOptionList) {\r
1194 return ;\r
1195 }\r
1196\r
1197 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1198 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
1199 IfrOptionList[Index].Flags = 0;\r
1200 if (0 == Index) {\r
1201 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;\r
1202 }\r
1203\r
1204 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
1205 IfrOptionList[Index].Value.u8 = (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;\r
1206 }\r
1207 //\r
1208 // for item "Disabled"\r
1209 //\r
1210 IfrOptionList[Index].Flags = 0;\r
1211 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);\r
1212 IfrOptionList[Index].Value.u8 = 0xFF;\r
1213\r
1214 //\r
1215 // Get Device Order from variable\r
1216 //\r
1217 VarData = BdsLibGetVariableAndSize (\r
5f597758 1218 VAR_LEGACY_DEV_ORDER,\r
93e3992d 1219 &EfiLegacyDevOrderGuid,\r
1220 &VarSize\r
1221 );\r
1222\r
1223 if (NULL != VarData) {\r
1224 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1225 while (VarData < VarData + VarSize) {\r
1226 if (DevOrder->BbsType == BbsType) {\r
1227 break;\r
1228 }\r
1229\r
1230 VarData += sizeof (BBS_TYPE);\r
1231 VarData += *(UINT16 *) VarData;\r
1232 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1233 }\r
1234 //\r
1235 // Create oneof tag here for FD/HD/CD #1 #2\r
1236 //\r
1237 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1238 //\r
1239 // Create the string for oneof tag\r
1240 //\r
1241 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
1242 StrRef = 0;\r
9226efe5 1243 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRef, String);\r
93e3992d 1244\r
1245 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
1246 StrRefHelp = 0;\r
9226efe5 1247 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRefHelp, String);\r
93e3992d 1248\r
1249 CreateOneOfOpCode (\r
1250 (EFI_QUESTION_ID) (Key + Index),\r
1251 VARSTORE_ID_BOOT_MAINT,\r
1252 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1253 StrRef,\r
1254 StrRefHelp,\r
1255 EFI_IFR_FLAG_CALLBACK,\r
1256 EFI_IFR_NUMERIC_SIZE_1,\r
1257 IfrOptionList,\r
1258 OptionMenu->MenuNumber + 1,\r
1259 &gUpdateData\r
1260 );\r
1261\r
1262 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
1263\r
1264 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1265 LegacyOrder[Index] = 0xFF;\r
1266 Pos = (VarDevOrder & 0xFF) / 8;\r
1267 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1268 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1269 } else {\r
1270 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1271 }\r
1272 }\r
1273 }\r
1274\r
1275 CopyMem (OldData, LegacyOrder, 100);\r
1276\r
1277 if (IfrOptionList != NULL) {\r
1278 SafeFreePool (IfrOptionList);\r
1279 IfrOptionList = NULL;\r
1280 }\r
1281\r
1282 UpdatePageEnd (CallbackData);\r
1283}\r
1284\r
b30312ba 1285/**\r
dce655e8 1286 Dispatch the display to the next page based on NewPageId.\r
b30312ba 1287\r
dce655e8 1288 @param Private The BMM context data.\r
1289 @param NewPageId The original page ID.\r
b30312ba 1290\r
b30312ba 1291**/\r
93e3992d 1292VOID\r
1293UpdatePageId (\r
1294 BMM_CALLBACK_DATA *Private,\r
1295 UINT16 NewPageId\r
1296 )\r
1297{\r
1298 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1299 //\r
1300 // If we select a handle to add driver option, advance to the add handle description page.\r
1301 //\r
1302 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1303 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1304 //\r
1305 // Return to main page after "Save Changes" or "Discard Changes".\r
1306 //\r
1307 NewPageId = FORM_MAIN_ID;\r
1308 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1309 NewPageId = FORM_CON_COM_SETUP_ID;\r
1310 }\r
1311\r
1312 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1313 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1314 Private->BmmCurrentPageId = NewPageId;\r
1315 }\r
1316}\r