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