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