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