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