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