]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
change comment style from 3 line to 1 line
[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
582c2368 462 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
463 (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {\r
5c08e117 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
582c2368 487 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
488 (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {\r
5c08e117 489 CheckFlags = 0;\r
490 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
491 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
492\r
493 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
494 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
495 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
496 ) {\r
497 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
498 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
499 } else {\r
500 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
501 }\r
502\r
75bf9d0e
LG
503 HiiCreateCheckBoxOpCode (\r
504 mStartOpCodeHandle,\r
5c08e117 505 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
506 VARSTORE_ID_BOOT_MAINT,\r
507 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
508 NewMenuEntry->DisplayStringToken,\r
509 NewMenuEntry->HelpStringToken,\r
510 0,\r
511 CheckFlags,\r
75bf9d0e 512 NULL\r
5c08e117 513 );\r
514\r
515 Index++;\r
516 }\r
517\r
518 UpdatePageEnd (CallbackData);\r
519}\r
520\r
521/**\r
522 Update the page's NV Map if user has changed the order\r
523 a list. This list can be Boot Order or Driver Order.\r
524\r
525 @param UpdatePageId The form ID to be updated.\r
526 @param OptionMenu The new list.\r
527 @param CallbackData The BMM context data.\r
528\r
529**/\r
530VOID\r
531UpdateOrderPage (\r
532 IN UINT16 UpdatePageId,\r
533 IN BM_MENU_OPTION *OptionMenu,\r
534 IN BMM_CALLBACK_DATA *CallbackData\r
535 )\r
536{\r
537 BM_MENU_ENTRY *NewMenuEntry;\r
538 UINT16 Index;\r
75bf9d0e 539 VOID *OptionsOpCodeHandle;\r
5c08e117 540\r
541 CallbackData->BmmAskSaveOrNot = TRUE;\r
542\r
543 UpdatePageStart (CallbackData);\r
544\r
545 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
546\r
547 ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100);\r
548\r
75bf9d0e
LG
549 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
550 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 551 \r
8bb37919 552 for (\r
553 Index = 0;\r
554 (\r
555 (Index < OptionMenu->MenuNumber) &&\r
556 (Index <\r
557 (\r
558 sizeof (CallbackData->BmmFakeNvData.OptionOrder) /\r
559 sizeof (UINT8)\r
560 )\r
561 )\r
562 );\r
563 Index++\r
564 ) {\r
5c08e117 565 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
75bf9d0e
LG
566 HiiCreateOneOfOptionOpCode (\r
567 OptionsOpCodeHandle,\r
568 NewMenuEntry->DisplayStringToken,\r
569 0,\r
570 EFI_IFR_NUMERIC_SIZE_1,\r
571 (UINT8) (NewMenuEntry->OptionNumber + 1)\r
572 );\r
573 CallbackData->BmmFakeNvData.OptionOrder[Index] = (UINT8) (NewMenuEntry->OptionNumber + 1);\r
5c08e117 574 }\r
575\r
576 if (OptionMenu->MenuNumber > 0) {\r
75bf9d0e
LG
577 HiiCreateOrderedListOpCode ( \r
578 mStartOpCodeHandle, // Container for dynamic created opcodes \r
579 (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID, // Question ID \r
580 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
581 OPTION_ORDER_VAR_OFFSET, // Offset in Buffer Storage \r
582 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
583 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
584 0, // Question flag \r
585 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
586 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value \r
587 100, // Maximum container \r
588 OptionsOpCodeHandle, // Option Opcode list \r
589 NULL // Default Opcode is NULL \r
5c08e117 590 );\r
591 }\r
592\r
75bf9d0e 593 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 594\r
595 UpdatePageEnd (CallbackData);\r
596\r
597 CopyMem (\r
598 CallbackData->BmmOldFakeNVData.OptionOrder,\r
599 CallbackData->BmmFakeNvData.OptionOrder,\r
600 100\r
601 );\r
602}\r
603\r
604/**\r
605 Create the dynamic page to allow user to set\r
606 the "BootNext" value.\r
607\r
608 @param CallbackData The BMM context data.\r
609\r
610**/\r
611VOID\r
612UpdateBootNextPage (\r
613 IN BMM_CALLBACK_DATA *CallbackData\r
614 )\r
615{\r
616 BM_MENU_ENTRY *NewMenuEntry;\r
617 BM_LOAD_CONTEXT *NewLoadContext;\r
5c08e117 618 UINTN NumberOfOptions;\r
619 UINT16 Index;\r
75bf9d0e 620 VOID *OptionsOpCodeHandle;\r
5c08e117 621\r
5c08e117 622 NumberOfOptions = BootOptionMenu.MenuNumber;\r
623 CallbackData->BmmAskSaveOrNot = TRUE;\r
624\r
625 UpdatePageStart (CallbackData);\r
626 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
627\r
628 if (NumberOfOptions > 0) {\r
75bf9d0e
LG
629 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
630 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 631\r
632 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
633\r
634 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
635 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
636 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
75bf9d0e 637\r
5c08e117 638 if (NewLoadContext->IsBootNext) {\r
75bf9d0e
LG
639 HiiCreateOneOfOptionOpCode (\r
640 OptionsOpCodeHandle,\r
641 NewMenuEntry->DisplayStringToken,\r
642 EFI_IFR_OPTION_DEFAULT,\r
643 EFI_IFR_NUMERIC_SIZE_2,\r
644 Index\r
645 );\r
5c08e117 646 CallbackData->BmmFakeNvData.BootNext = Index;\r
647 } else {\r
75bf9d0e
LG
648 HiiCreateOneOfOptionOpCode (\r
649 OptionsOpCodeHandle,\r
650 NewMenuEntry->DisplayStringToken,\r
651 0,\r
652 EFI_IFR_NUMERIC_SIZE_2,\r
653 Index\r
654 );\r
5c08e117 655 }\r
5c08e117 656 }\r
657\r
5c08e117 658 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
75bf9d0e
LG
659 HiiCreateOneOfOptionOpCode (\r
660 OptionsOpCodeHandle,\r
661 STRING_TOKEN (STR_NONE),\r
662 EFI_IFR_OPTION_DEFAULT,\r
663 EFI_IFR_NUMERIC_SIZE_2,\r
664 Index\r
665 );\r
666 } else {\r
667 HiiCreateOneOfOptionOpCode (\r
668 OptionsOpCodeHandle,\r
669 STRING_TOKEN (STR_NONE),\r
670 0,\r
671 EFI_IFR_NUMERIC_SIZE_2,\r
672 Index\r
673 );\r
674 } \r
5c08e117 675\r
75bf9d0e
LG
676 HiiCreateOneOfOpCode (\r
677 mStartOpCodeHandle,\r
5c08e117 678 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
679 VARSTORE_ID_BOOT_MAINT,\r
680 BOOT_NEXT_VAR_OFFSET,\r
681 STRING_TOKEN (STR_BOOT_NEXT),\r
682 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
683 0,\r
684 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
685 OptionsOpCodeHandle,\r
686 NULL\r
5c08e117 687 );\r
688\r
75bf9d0e 689 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 690 }\r
691\r
692 UpdatePageEnd (CallbackData);\r
693}\r
694\r
695/**\r
696 Create the dynamic page to allow user to set the "TimeOut" value.\r
697\r
698 @param CallbackData The BMM context data.\r
699\r
700**/\r
701VOID\r
702UpdateTimeOutPage (\r
703 IN BMM_CALLBACK_DATA *CallbackData\r
704 )\r
705{\r
706 UINT16 BootTimeOut;\r
75bf9d0e 707 VOID *DefaultOpCodeHandle;\r
5c08e117 708\r
709 CallbackData->BmmAskSaveOrNot = TRUE;\r
710\r
711 UpdatePageStart (CallbackData);\r
712\r
8c81cb83 713 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
5c08e117 714\r
75bf9d0e
LG
715 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
716 ASSERT (DefaultOpCodeHandle != NULL);\r
717 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_NUMERIC_SIZE_2, BootTimeOut);\r
718\r
719 HiiCreateNumericOpCode (\r
720 mStartOpCodeHandle,\r
5c08e117 721 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
722 VARSTORE_ID_BOOT_MAINT,\r
723 BOOT_TIME_OUT_VAR_OFFSET,\r
724 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
725 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
726 0,\r
727 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
728 0,\r
729 65535,\r
730 0,\r
75bf9d0e 731 DefaultOpCodeHandle\r
5c08e117 732 );\r
75bf9d0e
LG
733 \r
734 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
5c08e117 735\r
736 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
737\r
738 UpdatePageEnd (CallbackData);\r
739}\r
740\r
741/**\r
742 Refresh the text mode page.\r
743\r
744 @param CallbackData The BMM context data.\r
745\r
746**/\r
747VOID\r
748UpdateConModePage (\r
749 IN BMM_CALLBACK_DATA *CallbackData\r
750 )\r
751{\r
752 UINTN Mode;\r
753 UINTN Index;\r
754 UINTN Col;\r
755 UINTN Row;\r
756 CHAR16 RowString[50];\r
757 CHAR16 ModeString[50];\r
ca835f41 758 UINTN TempStringLen;\r
5c08e117 759 UINTN MaxMode;\r
760 UINTN ValidMode;\r
761 EFI_STRING_ID *ModeToken;\r
5c08e117 762 EFI_STATUS Status;\r
75bf9d0e 763 VOID *OptionsOpCodeHandle;\r
5c08e117 764 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
765\r
766 ConOut = gST->ConOut;\r
767 Index = 0;\r
768 ValidMode = 0;\r
769 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
770\r
771 CallbackData->BmmAskSaveOrNot = TRUE;\r
772\r
773 UpdatePageStart (CallbackData);\r
774\r
775 //\r
776 // Check valid mode\r
777 //\r
778 for (Mode = 0; Mode < MaxMode; Mode++) {\r
779 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
780 if (EFI_ERROR (Status)) {\r
781 continue;\r
782 }\r
783 ValidMode++;\r
784 }\r
785\r
786 if (ValidMode == 0) {\r
787 return;\r
788 }\r
789\r
75bf9d0e
LG
790 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
791 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 792\r
793 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
794 ASSERT(ModeToken != NULL);\r
795\r
796 //\r
797 // Determin which mode should be the first entry in menu\r
798 //\r
799 GetConsoleOutMode (CallbackData);\r
800\r
801 //\r
802 // Build text mode options\r
803 //\r
804 for (Mode = 0; Mode < MaxMode; Mode++) {\r
805 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
806 if (EFI_ERROR (Status)) {\r
807 continue;\r
808 }\r
809 \r
810 //\r
811 // Build mode string Column x Row\r
812 //\r
ca835f41 813 TempStringLen = UnicodeValueToString (ModeString, 0, Col, 0);\r
814 ASSERT ((TempStringLen + StrLen (L" x ")) < (sizeof (ModeString) / sizeof (ModeString[0])));\r
5c08e117 815 StrCat (ModeString, L" x ");\r
ca835f41 816 TempStringLen = UnicodeValueToString (RowString, 0, Row, 0);\r
817 ASSERT ((StrLen (ModeString) + TempStringLen) < (sizeof (ModeString) / sizeof (ModeString[0])));\r
5c08e117 818 StrCat (ModeString, RowString);\r
819\r
cb7d01c0 820 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
5c08e117 821\r
5c08e117 822 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
75bf9d0e
LG
823 HiiCreateOneOfOptionOpCode (\r
824 OptionsOpCodeHandle,\r
825 ModeToken[Index],\r
826 EFI_IFR_OPTION_DEFAULT,\r
827 EFI_IFR_NUMERIC_SIZE_2,\r
828 (UINT16) Mode\r
829 );\r
5c08e117 830 } else {\r
75bf9d0e
LG
831 HiiCreateOneOfOptionOpCode (\r
832 OptionsOpCodeHandle,\r
833 ModeToken[Index],\r
834 0,\r
835 EFI_IFR_NUMERIC_SIZE_2,\r
836 (UINT16) Mode\r
837 );\r
5c08e117 838 }\r
839 Index++;\r
840 }\r
841\r
75bf9d0e
LG
842 HiiCreateOneOfOpCode (\r
843 mStartOpCodeHandle,\r
5c08e117 844 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
845 VARSTORE_ID_BOOT_MAINT,\r
846 CON_MODE_VAR_OFFSET,\r
847 STRING_TOKEN (STR_CON_MODE_SETUP),\r
848 STRING_TOKEN (STR_CON_MODE_SETUP),\r
849 EFI_IFR_FLAG_RESET_REQUIRED,\r
850 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
851 OptionsOpCodeHandle,\r
852 NULL\r
5c08e117 853 );\r
75bf9d0e
LG
854\r
855 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 856 FreePool (ModeToken);\r
857\r
858 UpdatePageEnd (CallbackData);\r
859}\r
860\r
861/**\r
862 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
863 Parity, Stop Bits, Terminal Type.\r
864\r
865 @param CallbackData The BMM context data.\r
866\r
867**/\r
868VOID\r
869UpdateTerminalPage (\r
870 IN BMM_CALLBACK_DATA *CallbackData\r
871 )\r
872{\r
873 UINT8 Index;\r
874 UINT8 CheckFlags;\r
5c08e117 875 BM_MENU_ENTRY *NewMenuEntry;\r
876 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
75bf9d0e 877 VOID *OptionsOpCodeHandle;\r
5c08e117 878\r
879 CallbackData->BmmAskSaveOrNot = TRUE;\r
880\r
881 UpdatePageStart (CallbackData);\r
882\r
883 NewMenuEntry = BOpt_GetMenuEntry (\r
884 &TerminalMenu,\r
885 CallbackData->CurrentTerminal\r
886 );\r
887\r
888 if (NewMenuEntry == NULL) {\r
889 return ;\r
890 }\r
891\r
892 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
893\r
75bf9d0e
LG
894 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
895 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 896\r
897 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
898 CheckFlags = 0;\r
899 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
900 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
901 NewTerminalContext->BaudRateIndex = Index;\r
902 CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;\r
903 }\r
904\r
75bf9d0e
LG
905 HiiCreateOneOfOptionOpCode (\r
906 OptionsOpCodeHandle,\r
907 BaudRateList[Index].StringToken,\r
908 CheckFlags,\r
909 EFI_IFR_NUMERIC_SIZE_1,\r
910 Index\r
911 );\r
5c08e117 912 }\r
913\r
75bf9d0e
LG
914 HiiCreateOneOfOpCode (\r
915 mStartOpCodeHandle,\r
5c08e117 916 (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
917 VARSTORE_ID_BOOT_MAINT,\r
918 COM_BAUD_RATE_VAR_OFFSET,\r
919 STRING_TOKEN (STR_COM_BAUD_RATE),\r
920 STRING_TOKEN (STR_COM_BAUD_RATE),\r
921 0,\r
922 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
923 OptionsOpCodeHandle,\r
924 NULL\r
5c08e117 925 );\r
75bf9d0e
LG
926 \r
927 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
928 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
929 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 930\r
931 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
932 CheckFlags = 0;\r
933\r
934 if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
935 NewTerminalContext->DataBitsIndex = Index;\r
936 CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;\r
937 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
938 }\r
939\r
75bf9d0e
LG
940 HiiCreateOneOfOptionOpCode (\r
941 OptionsOpCodeHandle,\r
942 DataBitsList[Index].StringToken,\r
943 CheckFlags,\r
944 EFI_IFR_NUMERIC_SIZE_1,\r
945 Index\r
946 );\r
5c08e117 947 }\r
948\r
75bf9d0e
LG
949 HiiCreateOneOfOpCode (\r
950 mStartOpCodeHandle,\r
5c08e117 951 (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
952 VARSTORE_ID_BOOT_MAINT,\r
953 COM_DATA_RATE_VAR_OFFSET,\r
954 STRING_TOKEN (STR_COM_DATA_BITS),\r
955 STRING_TOKEN (STR_COM_DATA_BITS),\r
956 0,\r
957 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
958 OptionsOpCodeHandle,\r
959 NULL\r
5c08e117 960 );\r
961\r
75bf9d0e
LG
962 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
963 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
964 ASSERT (OptionsOpCodeHandle != NULL);\r
965\r
5c08e117 966 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
967 CheckFlags = 0;\r
968 if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
969 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
970 NewTerminalContext->ParityIndex = (UINT8) Index;\r
971 CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;\r
972 }\r
973\r
75bf9d0e
LG
974 HiiCreateOneOfOptionOpCode (\r
975 OptionsOpCodeHandle,\r
976 ParityList[Index].StringToken,\r
977 CheckFlags,\r
978 EFI_IFR_NUMERIC_SIZE_1,\r
979 Index\r
980 );\r
5c08e117 981 }\r
982\r
75bf9d0e
LG
983 HiiCreateOneOfOpCode (\r
984 mStartOpCodeHandle,\r
5c08e117 985 (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
986 VARSTORE_ID_BOOT_MAINT,\r
987 COM_PARITY_VAR_OFFSET,\r
988 STRING_TOKEN (STR_COM_PARITY),\r
989 STRING_TOKEN (STR_COM_PARITY),\r
990 0,\r
991 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
992 OptionsOpCodeHandle,\r
993 NULL\r
5c08e117 994 );\r
995\r
75bf9d0e
LG
996 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
997 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
998 ASSERT (OptionsOpCodeHandle != NULL);\r
999\r
5c08e117 1000 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
1001 CheckFlags = 0;\r
1002 if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
1003 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1004 NewTerminalContext->StopBitsIndex = (UINT8) Index;\r
1005 CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;\r
1006 }\r
1007\r
75bf9d0e
LG
1008 HiiCreateOneOfOptionOpCode (\r
1009 OptionsOpCodeHandle,\r
1010 StopBitsList[Index].StringToken,\r
1011 CheckFlags,\r
1012 EFI_IFR_NUMERIC_SIZE_1,\r
1013 Index\r
1014 );\r
5c08e117 1015 }\r
1016\r
75bf9d0e
LG
1017 HiiCreateOneOfOpCode (\r
1018 mStartOpCodeHandle,\r
5c08e117 1019 (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
1020 VARSTORE_ID_BOOT_MAINT,\r
1021 COM_STOP_BITS_VAR_OFFSET,\r
1022 STRING_TOKEN (STR_COM_STOP_BITS),\r
1023 STRING_TOKEN (STR_COM_STOP_BITS),\r
1024 0,\r
1025 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1026 OptionsOpCodeHandle,\r
1027 NULL\r
5c08e117 1028 );\r
1029\r
75bf9d0e
LG
1030 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1031 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1032 ASSERT (OptionsOpCodeHandle != NULL);\r
1033\r
5c08e117 1034 for (Index = 0; Index < 4; Index++) {\r
1035 CheckFlags = 0;\r
1036 if (NewTerminalContext->TerminalType == Index) {\r
1037 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1038 CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
1039 }\r
1040\r
75bf9d0e
LG
1041 HiiCreateOneOfOptionOpCode (\r
1042 OptionsOpCodeHandle,\r
1043 (EFI_STRING_ID) TerminalType[Index],\r
1044 CheckFlags,\r
1045 EFI_IFR_NUMERIC_SIZE_1,\r
1046 Index\r
1047 );\r
5c08e117 1048 }\r
1049\r
75bf9d0e
LG
1050 HiiCreateOneOfOpCode (\r
1051 mStartOpCodeHandle,\r
5c08e117 1052 (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
1053 VARSTORE_ID_BOOT_MAINT,\r
1054 COM_TERMINAL_VAR_OFFSET,\r
1055 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1056 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1057 0,\r
1058 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1059 OptionsOpCodeHandle,\r
1060 NULL\r
5c08e117 1061 );\r
1062\r
75bf9d0e 1063 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1064\r
1065 UpdatePageEnd (CallbackData);\r
1066}\r
1067\r
1068/**\r
1069 Dispatch the correct update page function to call based on\r
1070 the UpdatePageId.\r
1071\r
1072 @param UpdatePageId The form ID.\r
1073 @param CallbackData The BMM context data.\r
1074\r
1075**/\r
1076VOID\r
1077UpdatePageBody (\r
1078 IN UINT16 UpdatePageId,\r
1079 IN BMM_CALLBACK_DATA *CallbackData\r
1080 )\r
1081{\r
1082 CleanUpPage (UpdatePageId, CallbackData);\r
1083 switch (UpdatePageId) {\r
1084 case FORM_CON_IN_ID:\r
1085 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1086 break;\r
1087\r
1088 case FORM_CON_OUT_ID:\r
1089 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1090 break;\r
1091\r
1092 case FORM_CON_ERR_ID:\r
1093 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1094 break;\r
1095\r
1096 case FORM_BOOT_CHG_ID:\r
1097 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1098 break;\r
1099\r
1100 case FORM_DRV_CHG_ID:\r
1101 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1102 break;\r
1103\r
1104 default:\r
1105 break;\r
1106 }\r
1107}\r
1108\r
1109/**\r
1110 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
1111 specified by DeviceType.\r
1112\r
1113 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,\r
1114 etc.\r
1115 @param OptionIndex Returns the index number (#### in Boot####).\r
1116 @param OptionSize Return the size of the Boot### variable.\r
1117\r
1118**/\r
1119VOID *\r
1120GetLegacyBootOptionVar (\r
1121 IN UINTN DeviceType,\r
1122 OUT UINTN *OptionIndex,\r
1123 OUT UINTN *OptionSize\r
1124 )\r
1125{\r
1126 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
1127 VOID *OptionBuffer;\r
1128 UINTN OrderSize;\r
1129 UINTN Index;\r
1130 UINT16 *OrderBuffer;\r
1131 CHAR16 StrTemp[100];\r
1132 UINT16 FilePathSize;\r
1133 UINT8 *Ptr;\r
1134 UINT8 *OptionalData;\r
1135\r
1136 //\r
1137 // Get Boot Option number from the size of BootOrder\r
1138 //\r
1139 OrderBuffer = BdsLibGetVariableAndSize (\r
1140 L"BootOrder",\r
1141 &gEfiGlobalVariableGuid,\r
1142 &OrderSize\r
1143 );\r
1144 \r
1145 if (OrderBuffer == NULL) {\r
1146 return NULL;\r
1147 }\r
1148 \r
1149 for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {\r
1150 UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);\r
1151 OptionBuffer = BdsLibGetVariableAndSize (\r
1152 StrTemp,\r
1153 &gEfiGlobalVariableGuid,\r
1154 OptionSize\r
1155 );\r
1156 if (NULL == OptionBuffer) {\r
1157 continue;\r
1158 }\r
1159\r
1160 Ptr = (UINT8 *) OptionBuffer;\r
1161 Ptr += sizeof (UINT32);\r
1162\r
1163 FilePathSize = *(UINT16 *) Ptr;\r
1164 Ptr += sizeof (UINT16);\r
1165\r
1166 Ptr += StrSize ((CHAR16 *) Ptr);\r
1167\r
1168 //\r
1169 // Now Ptr point to Device Path\r
1170 //\r
1171 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
1172 Ptr += FilePathSize;\r
1173\r
1174 //\r
1175 // Now Ptr point to Optional Data\r
1176 //\r
1177 OptionalData = Ptr;\r
1178\r
1179 if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&\r
1180 (BBS_DEVICE_PATH == DevicePath->Type) &&\r
1181 (BBS_BBS_DP == DevicePath->SubType)\r
1182 ) {\r
1183 *OptionIndex = OrderBuffer[Index];\r
1184 FreePool (OrderBuffer);\r
1185 return OptionBuffer;\r
1186 } else {\r
1187 FreePool (OptionBuffer);\r
1188 }\r
1189 }\r
1190\r
1191 FreePool (OrderBuffer);\r
1192 return NULL;\r
1193}\r
1194\r
1195/**\r
1196 Create a dynamic page so that Legacy Device boot order\r
1197 can be set for specified device type.\r
1198\r
1199 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1200 @param CallbackData The BMM context data.\r
1201\r
1202\r
1203**/\r
1204VOID\r
1205UpdateSetLegacyDeviceOrderPage (\r
1206 IN UINT16 UpdatePageId,\r
1207 IN BMM_CALLBACK_DATA *CallbackData\r
1208 )\r
1209{\r
1210 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
1211 BM_MENU_OPTION *OptionMenu;\r
1212 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 1213 EFI_STRING_ID StrRef;\r
1214 EFI_STRING_ID StrRefHelp;\r
1215 BBS_TYPE BbsType;\r
1216 UINTN VarSize;\r
1217 UINTN Pos;\r
1218 UINTN Bit;\r
1219 UINT16 Index;\r
1220 UINT16 Key;\r
1221 CHAR16 String[100];\r
1222 CHAR16 *TypeStr;\r
1223 CHAR16 *TypeStrHelp;\r
1224 UINT16 VarDevOrder;\r
1225 UINT8 *VarData;\r
1226 UINT8 *LegacyOrder;\r
1227 UINT8 *OldData;\r
1228 UINT8 *DisMap;\r
75bf9d0e 1229 VOID *OptionsOpCodeHandle;\r
5c08e117 1230\r
1231 OptionMenu = NULL;\r
1232 Key = 0;\r
1233 StrRef = 0;\r
1234 StrRefHelp = 0;\r
1235 TypeStr = NULL;\r
1236 TypeStrHelp = NULL;\r
1237 BbsType = BBS_FLOPPY;\r
1238 LegacyOrder = NULL;\r
1239 OldData = NULL;\r
1240 DisMap = NULL;\r
1241\r
1242 CallbackData->BmmAskSaveOrNot = TRUE;\r
1243 UpdatePageStart (CallbackData);\r
1244\r
1245 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
1246\r
1247 SetMem (DisMap, 32, 0);\r
1248 //\r
1249 // Create oneof option list\r
1250 //\r
1251 switch (UpdatePageId) {\r
1252 case FORM_SET_FD_ORDER_ID:\r
1253 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1254 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1255 TypeStr = STR_FLOPPY;\r
1256 TypeStrHelp = STR_FLOPPY_HELP;\r
1257 BbsType = BBS_FLOPPY;\r
1258 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1259 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1260 break;\r
1261\r
1262 case FORM_SET_HD_ORDER_ID:\r
1263 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1264 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1265 TypeStr = STR_HARDDISK;\r
1266 TypeStrHelp = STR_HARDDISK_HELP;\r
1267 BbsType = BBS_HARDDISK;\r
1268 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1269 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1270 break;\r
1271\r
1272 case FORM_SET_CD_ORDER_ID:\r
1273 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1274 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1275 TypeStr = STR_CDROM;\r
1276 TypeStrHelp = STR_CDROM_HELP;\r
1277 BbsType = BBS_CDROM;\r
1278 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1279 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1280 break;\r
1281\r
1282 case FORM_SET_NET_ORDER_ID:\r
1283 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1284 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1285 TypeStr = STR_NET;\r
1286 TypeStrHelp = STR_NET_HELP;\r
1287 BbsType = BBS_EMBED_NETWORK;\r
1288 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1289 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1290 break;\r
1291\r
1292 case FORM_SET_BEV_ORDER_ID:\r
1293 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1294 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1295 TypeStr = STR_BEV;\r
1296 TypeStrHelp = STR_BEV_HELP;\r
1297 BbsType = BBS_BEV_DEVICE;\r
1298 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1299 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1300 break;\r
1301\r
1302 default:\r
1303 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
1304 return;\r
1305 }\r
1306\r
1307 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1308\r
75bf9d0e
LG
1309 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1310 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 1311\r
1312 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1313 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
75bf9d0e
LG
1314\r
1315 if (Index == 0) {\r
1316 HiiCreateOneOfOptionOpCode (\r
1317 OptionsOpCodeHandle,\r
1318 NewMenuEntry->DisplayStringToken,\r
1319 EFI_IFR_OPTION_DEFAULT,\r
1320 EFI_IFR_NUMERIC_SIZE_1,\r
1321 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index\r
1322 );\r
5c08e117 1323 }\r
1324\r
75bf9d0e
LG
1325 HiiCreateOneOfOptionOpCode (\r
1326 OptionsOpCodeHandle,\r
1327 NewMenuEntry->DisplayStringToken,\r
1328 0,\r
1329 EFI_IFR_NUMERIC_SIZE_1,\r
1330 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index\r
1331 );\r
5c08e117 1332 }\r
75bf9d0e 1333\r
5c08e117 1334 //\r
1335 // for item "Disabled"\r
1336 //\r
75bf9d0e
LG
1337 HiiCreateOneOfOptionOpCode (\r
1338 OptionsOpCodeHandle,\r
1339 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1340 0,\r
1341 EFI_IFR_NUMERIC_SIZE_1,\r
1342 0xFF\r
1343 );\r
5c08e117 1344\r
1345 //\r
1346 // Get Device Order from variable\r
1347 //\r
1348 VarData = BdsLibGetVariableAndSize (\r
1349 VAR_LEGACY_DEV_ORDER,\r
1350 &EfiLegacyDevOrderGuid,\r
1351 &VarSize\r
1352 );\r
1353\r
1354 if (NULL != VarData) {\r
1355 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1356 while (VarData < VarData + VarSize) {\r
1357 if (DevOrder->BbsType == BbsType) {\r
1358 break;\r
1359 }\r
1360\r
1361 VarData += sizeof (BBS_TYPE);\r
1362 VarData += *(UINT16 *) VarData;\r
1363 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1364 }\r
1365 //\r
1366 // Create oneof tag here for FD/HD/CD #1 #2\r
1367 //\r
1368 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1369 //\r
1370 // Create the string for oneof tag\r
1371 //\r
1372 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
cb7d01c0 1373 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1374\r
1375 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
cb7d01c0 1376 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1377\r
75bf9d0e
LG
1378 HiiCreateOneOfOpCode (\r
1379 mStartOpCodeHandle,\r
5c08e117 1380 (EFI_QUESTION_ID) (Key + Index),\r
1381 VARSTORE_ID_BOOT_MAINT,\r
1382 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1383 StrRef,\r
1384 StrRefHelp,\r
1385 EFI_IFR_FLAG_CALLBACK,\r
1386 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1387 OptionsOpCodeHandle,\r
1388 NULL\r
5c08e117 1389 );\r
1390\r
1391 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
1392\r
1393 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1394 LegacyOrder[Index] = 0xFF;\r
1395 Pos = (VarDevOrder & 0xFF) / 8;\r
1396 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1397 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1398 } else {\r
1399 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1400 }\r
1401 }\r
1402 }\r
1403\r
1404 CopyMem (OldData, LegacyOrder, 100);\r
1405\r
75bf9d0e 1406 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1407\r
1408 UpdatePageEnd (CallbackData);\r
1409}\r
1410\r
1411/**\r
1412 Dispatch the display to the next page based on NewPageId.\r
1413\r
1414 @param Private The BMM context data.\r
1415 @param NewPageId The original page ID.\r
1416\r
1417**/\r
1418VOID\r
1419UpdatePageId (\r
1420 BMM_CALLBACK_DATA *Private,\r
1421 UINT16 NewPageId\r
1422 )\r
1423{\r
1424 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1425 //\r
1426 // If we select a handle to add driver option, advance to the add handle description page.\r
1427 //\r
1428 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1429 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1430 //\r
1431 // Return to main page after "Save Changes" or "Discard Changes".\r
1432 //\r
1433 NewPageId = FORM_MAIN_ID;\r
1434 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1435 NewPageId = FORM_CON_COM_SETUP_ID;\r
1436 }\r
1437\r
1438 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1439 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1440 Private->BmmCurrentPageId = NewPageId;\r
1441 }\r
1442}\r