]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Added some functions header.
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
CommitLineData
fd6a62f3 1/** @file\r
2 Dynamically Update the pages\r
93e3992d 3\r
fd6a62f3 4Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
93e3992d 5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
fd6a62f3 13**/\r
93e3992d 14\r
15#include "BootMaint.h"\r
16\r
93e3992d 17VOID\r
18RefreshUpdateData (\r
19 VOID\r
20 )\r
21/*++\r
22\r
23Routine Description:\r
24 Refresh the global UpdateData structure.\r
25\r
26Arguments:\r
27 None.\r
28\r
29Returns:\r
30 None.\r
31\r
32--*/\r
33{\r
34 gUpdateData.Offset = 0;\r
35}\r
36\r
37VOID\r
38UpdatePageStart (\r
39 IN BMM_CALLBACK_DATA *CallbackData\r
40 )\r
41{\r
42 RefreshUpdateData ();\r
43\r
44 if (!(CallbackData->BmmAskSaveOrNot)) {\r
45 //\r
46 // Add a "Go back to main page" tag in front of the form when there are no\r
47 // "Apply changes" and "Discard changes" tags in the end of the form.\r
48 //\r
49 CreateGotoOpCode (\r
50 FORM_MAIN_ID,\r
51 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
52 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
53 0,\r
54 FORM_MAIN_ID,\r
55 &gUpdateData\r
56 );\r
57 }\r
58\r
59}\r
60\r
61VOID\r
62UpdatePageEnd (\r
63 IN BMM_CALLBACK_DATA *CallbackData\r
64 )\r
65{\r
66 //\r
67 // Create the "Apply changes" and "Discard changes" tags.\r
68 //\r
69 if (CallbackData->BmmAskSaveOrNot) {\r
70 CreateSubTitleOpCode (\r
71 STRING_TOKEN (STR_NULL_STRING),\r
72 0,\r
73 0,\r
74 0,\r
75 &gUpdateData\r
76 );\r
77\r
78 CreateGotoOpCode (\r
79 FORM_MAIN_ID,\r
80 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
81 STRING_TOKEN (STR_NULL_STRING),\r
82 EFI_IFR_FLAG_CALLBACK,\r
83 KEY_VALUE_SAVE_AND_EXIT,\r
84 &gUpdateData\r
85 );\r
86 }\r
87\r
88 //\r
89 // Ensure user can return to the main page.\r
90 //\r
91 CreateGotoOpCode (\r
92 FORM_MAIN_ID,\r
93 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
94 STRING_TOKEN (STR_NULL_STRING),\r
95 EFI_IFR_FLAG_CALLBACK,\r
96 KEY_VALUE_NO_SAVE_AND_EXIT,\r
97 &gUpdateData\r
98 );\r
99\r
100 IfrLibUpdateForm (\r
101 CallbackData->BmmHiiHandle,\r
102 &mBootMaintGuid,\r
103 CallbackData->BmmCurrentPageId,\r
104 CallbackData->BmmCurrentPageId,\r
105 FALSE,\r
106 &gUpdateData\r
107 );\r
108}\r
109\r
110VOID\r
111CleanUpPage (\r
112 IN UINT16 LabelId,\r
113 IN BMM_CALLBACK_DATA *CallbackData\r
114 )\r
115{\r
116 RefreshUpdateData ();\r
117\r
118 //\r
119 // Remove all op-codes from dynamic page\r
120 //\r
121 IfrLibUpdateForm (\r
122 CallbackData->BmmHiiHandle,\r
123 &mBootMaintGuid,\r
124 LabelId,\r
125 LabelId,\r
126 FALSE,\r
127 &gUpdateData\r
128 );\r
129}\r
130\r
131EFI_STATUS\r
132BootThisFile (\r
133 IN BM_FILE_CONTEXT *FileContext\r
134 )\r
135{\r
136 EFI_STATUS Status;\r
137 UINTN ExitDataSize;\r
138 CHAR16 *ExitData;\r
139 BDS_COMMON_OPTION *Option;\r
140\r
141 Status = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID **) &Option);\r
142 Option->Description = FileContext->FileName;\r
143 Option->DevicePath = FileContext->DevicePath;\r
144 Option->LoadOptionsSize = 0;\r
145 Option->LoadOptions = NULL;\r
146\r
147 //\r
148 // Since current no boot from removable media directly is allowed */\r
149 //\r
150 gST->ConOut->ClearScreen (gST->ConOut);\r
151\r
152 gBS->RaiseTPL (TPL_APPLICATION);\r
153\r
154 ExitDataSize = 0;\r
155\r
156 Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);\r
157\r
158 gBS->RestoreTPL (TPL_APPLICATION);\r
159\r
160 return Status;\r
161\r
162}\r
163\r
164VOID\r
165UpdateConCOMPage (\r
166 IN BMM_CALLBACK_DATA *CallbackData\r
167 )\r
168{\r
169 BM_MENU_ENTRY *NewMenuEntry;\r
170 UINT16 Index;\r
93e3992d 171\r
172 CallbackData->BmmAskSaveOrNot = FALSE;\r
173\r
174 UpdatePageStart (CallbackData);\r
175\r
fb42e02b 176\r
177 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
178 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
179\r
180 CreateGotoOpCode (\r
181 FORM_CON_COM_SETUP_ID,\r
182 NewMenuEntry->DisplayStringToken,\r
183 STRING_TOKEN (STR_NULL_STRING),\r
184 EFI_IFR_FLAG_CALLBACK,\r
185 (UINT16) (TERMINAL_OPTION_OFFSET + Index),\r
186 &gUpdateData\r
187 );\r
93e3992d 188 }\r
189\r
190 UpdatePageEnd (CallbackData);\r
191}\r
192\r
193VOID\r
194UpdateBootDelPage (\r
195 IN BMM_CALLBACK_DATA *CallbackData\r
196 )\r
197{\r
198 BM_MENU_ENTRY *NewMenuEntry;\r
199 BM_LOAD_CONTEXT *NewLoadContext;\r
200 UINT16 Index;\r
201\r
202 CallbackData->BmmAskSaveOrNot = TRUE;\r
203\r
204 UpdatePageStart (CallbackData);\r
205 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
206\r
207 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
208 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
209 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
210 if (NewLoadContext->IsLegacy) {\r
211 continue;\r
212 }\r
213\r
214 NewLoadContext->Deleted = FALSE;\r
215 CallbackData->BmmFakeNvData.BootOptionDel[Index] = 0x00;\r
216\r
217 CreateCheckBoxOpCode (\r
218 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
219 VARSTORE_ID_BOOT_MAINT,\r
220 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
221 NewMenuEntry->DisplayStringToken,\r
222 NewMenuEntry->HelpStringToken,\r
223 0,\r
224 0,\r
225 &gUpdateData\r
226 );\r
227 }\r
228\r
229 UpdatePageEnd (CallbackData);\r
230}\r
231\r
232VOID\r
233UpdateDrvAddHandlePage (\r
234 IN BMM_CALLBACK_DATA *CallbackData\r
235 )\r
236{\r
237 BM_MENU_ENTRY *NewMenuEntry;\r
238 UINT16 Index;\r
239\r
240 CallbackData->BmmAskSaveOrNot = FALSE;\r
241\r
242 UpdatePageStart (CallbackData);\r
243\r
244 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
245 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
246\r
247 CreateGotoOpCode (\r
248 FORM_DRV_ADD_HANDLE_DESC_ID,\r
249 NewMenuEntry->DisplayStringToken,\r
250 STRING_TOKEN (STR_NULL_STRING),\r
251 EFI_IFR_FLAG_CALLBACK,\r
252 (UINT16) (HANDLE_OPTION_OFFSET + Index),\r
253 &gUpdateData\r
254 );\r
255 }\r
256\r
257 UpdatePageEnd (CallbackData);\r
258}\r
259\r
260VOID\r
261UpdateDrvDelPage (\r
262 IN BMM_CALLBACK_DATA *CallbackData\r
263 )\r
264{\r
265 BM_MENU_ENTRY *NewMenuEntry;\r
266 BM_LOAD_CONTEXT *NewLoadContext;\r
267 UINT16 Index;\r
268\r
269 CallbackData->BmmAskSaveOrNot = TRUE;\r
270\r
271 UpdatePageStart (CallbackData);\r
272\r
273 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
274\r
275 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
276 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
277\r
278 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
279 NewLoadContext->Deleted = FALSE;\r
280 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = 0x00;\r
281\r
282 CreateCheckBoxOpCode (\r
283 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
284 VARSTORE_ID_BOOT_MAINT,\r
285 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
286 NewMenuEntry->DisplayStringToken,\r
287 NewMenuEntry->HelpStringToken,\r
288 0,\r
289 0,\r
290 &gUpdateData\r
291 );\r
292 }\r
293\r
294 UpdatePageEnd (CallbackData);\r
295}\r
296\r
297VOID\r
298UpdateDriverAddHandleDescPage (\r
299 IN BMM_CALLBACK_DATA *CallbackData\r
300 )\r
301{\r
302 BM_MENU_ENTRY *NewMenuEntry;\r
303\r
304 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
305 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
306 CallbackData->BmmAskSaveOrNot = TRUE;\r
307 NewMenuEntry = CallbackData->MenuEntry;\r
308\r
309 UpdatePageStart (CallbackData);\r
310\r
311 CreateSubTitleOpCode (\r
312 NewMenuEntry->DisplayStringToken,\r
313 0,\r
314 0,\r
315 0,\r
316 &gUpdateData\r
317 );\r
318\r
319 CreateStringOpCode (\r
320 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
321 VARSTORE_ID_BOOT_MAINT,\r
322 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
323 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
324 STRING_TOKEN (STR_NULL_STRING),\r
325 0,\r
326 0,\r
327 6,\r
328 75,\r
329 &gUpdateData\r
330 );\r
331\r
332 CreateCheckBoxOpCode (\r
333 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
334 VARSTORE_ID_BOOT_MAINT,\r
335 DRV_ADD_RECON_VAR_OFFSET,\r
336 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
337 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
338 0,\r
339 0,\r
340 &gUpdateData\r
341 );\r
342\r
343 CreateStringOpCode (\r
344 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
345 VARSTORE_ID_BOOT_MAINT,\r
346 DRIVER_ADD_OPTION_VAR_OFFSET,\r
347 STRING_TOKEN (STR_OPTIONAL_DATA),\r
348 STRING_TOKEN (STR_NULL_STRING),\r
349 0,\r
350 0,\r
351 6,\r
352 75,\r
353 &gUpdateData\r
354 );\r
355\r
356 UpdatePageEnd (CallbackData);\r
357}\r
358\r
359VOID\r
360UpdateConsolePage (\r
361 IN UINT16 UpdatePageId,\r
362 IN BM_MENU_OPTION *ConsoleMenu,\r
363 IN BMM_CALLBACK_DATA *CallbackData\r
364 )\r
365{\r
366 BM_MENU_ENTRY *NewMenuEntry;\r
367 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
368 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
369 UINT16 Index;\r
370 UINT16 Index2;\r
371 UINT8 CheckFlags;\r
fb42e02b 372 \r
93e3992d 373 CallbackData->BmmAskSaveOrNot = TRUE;\r
374\r
375 UpdatePageStart (CallbackData);\r
376\r
377 for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
378 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
379 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
380 CheckFlags = 0;\r
381 if (NewConsoleContext->IsActive) {\r
382 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
383 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
384 } else {\r
385 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
386 }\r
387\r
388 CreateCheckBoxOpCode (\r
389 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
390 VARSTORE_ID_BOOT_MAINT,\r
391 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
392 NewMenuEntry->DisplayStringToken,\r
393 NewMenuEntry->HelpStringToken,\r
394 0,\r
395 CheckFlags,\r
396 &gUpdateData\r
397 );\r
398 }\r
399\r
fb42e02b 400 for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {\r
401 CheckFlags = 0;\r
402 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
403 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
404\r
405 if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||\r
406 (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
407 (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))\r
408 ) {\r
409 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
410 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
411 } else {\r
412 CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
93e3992d 413 }\r
fb42e02b 414\r
415 CreateCheckBoxOpCode (\r
416 (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
417 VARSTORE_ID_BOOT_MAINT,\r
418 (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
419 NewMenuEntry->DisplayStringToken,\r
420 NewMenuEntry->HelpStringToken,\r
421 0,\r
422 CheckFlags,\r
423 &gUpdateData\r
424 );\r
425\r
426 Index++;\r
93e3992d 427 }\r
428\r
429 UpdatePageEnd (CallbackData);\r
430}\r
431\r
432VOID\r
433UpdateOrderPage (\r
434 IN UINT16 UpdatePageId,\r
435 IN BM_MENU_OPTION *OptionMenu,\r
436 IN BMM_CALLBACK_DATA *CallbackData\r
437 )\r
438{\r
439 BM_MENU_ENTRY *NewMenuEntry;\r
440 UINT16 Index;\r
441 IFR_OPTION *IfrOptionList;\r
442\r
443 CallbackData->BmmAskSaveOrNot = TRUE;\r
444\r
445 UpdatePageStart (CallbackData);\r
446\r
447 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
448\r
449 ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100);\r
450\r
451 IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);\r
452 if (NULL == IfrOptionList) {\r
453 return ;\r
454 }\r
455\r
456 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
457 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
458 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
459 IfrOptionList[Index].Value.u8 = (UINT8) (NewMenuEntry->OptionNumber + 1);\r
460 IfrOptionList[Index].Flags = 0;\r
461 CallbackData->BmmFakeNvData.OptionOrder[Index] = IfrOptionList[Index].Value.u8;\r
462 }\r
463\r
464 if (OptionMenu->MenuNumber > 0) {\r
465 CreateOrderedListOpCode (\r
466 (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,\r
467 VARSTORE_ID_BOOT_MAINT,\r
468 OPTION_ORDER_VAR_OFFSET,\r
469 STRING_TOKEN (STR_CHANGE_ORDER),\r
470 STRING_TOKEN (STR_CHANGE_ORDER),\r
471 0,\r
472 0,\r
473 EFI_IFR_NUMERIC_SIZE_1,\r
474 100,\r
475 IfrOptionList,\r
476 OptionMenu->MenuNumber,\r
477 &gUpdateData\r
478 );\r
479 }\r
480\r
481 SafeFreePool (IfrOptionList);\r
482\r
483 UpdatePageEnd (CallbackData);\r
484\r
485 CopyMem (\r
486 CallbackData->BmmOldFakeNVData.OptionOrder,\r
487 CallbackData->BmmFakeNvData.OptionOrder,\r
488 100\r
489 );\r
490}\r
491\r
492VOID\r
493UpdateBootNextPage (\r
494 IN BMM_CALLBACK_DATA *CallbackData\r
495 )\r
496{\r
497 BM_MENU_ENTRY *NewMenuEntry;\r
498 BM_LOAD_CONTEXT *NewLoadContext;\r
499 IFR_OPTION *IfrOptionList;\r
500 UINTN NumberOfOptions;\r
501 UINT16 Index;\r
502\r
503 IfrOptionList = NULL;\r
504 NumberOfOptions = BootOptionMenu.MenuNumber;\r
505 CallbackData->BmmAskSaveOrNot = TRUE;\r
506\r
507 UpdatePageStart (CallbackData);\r
508 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
509\r
510 if (NumberOfOptions > 0) {\r
511 IfrOptionList = EfiAllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));\r
512\r
513 ASSERT (IfrOptionList);\r
514\r
515 CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
516\r
517 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
518 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
519 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
520 if (NewLoadContext->IsBootNext) {\r
521 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;\r
522 CallbackData->BmmFakeNvData.BootNext = Index;\r
523 } else {\r
524 IfrOptionList[Index].Flags = 0;\r
525 }\r
526\r
527 IfrOptionList[Index].Value.u16 = Index;\r
528 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
529 }\r
530\r
531 IfrOptionList[Index].Value.u16 = Index;\r
532 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);\r
533 IfrOptionList[Index].Flags = 0;\r
534 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
535 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;\r
536 }\r
537\r
538 CreateOneOfOpCode (\r
539 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
540 VARSTORE_ID_BOOT_MAINT,\r
541 BOOT_NEXT_VAR_OFFSET,\r
542 STRING_TOKEN (STR_BOOT_NEXT),\r
543 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
544 0,\r
545 EFI_IFR_NUMERIC_SIZE_2,\r
546 IfrOptionList,\r
547 (UINTN) (NumberOfOptions + 1),\r
548 &gUpdateData\r
549 );\r
550\r
551 SafeFreePool (IfrOptionList);\r
552 }\r
553\r
554 UpdatePageEnd (CallbackData);\r
555}\r
556\r
557VOID\r
558UpdateTimeOutPage (\r
559 IN BMM_CALLBACK_DATA *CallbackData\r
560 )\r
561{\r
562 UINT16 BootTimeOut;\r
563\r
564 CallbackData->BmmAskSaveOrNot = TRUE;\r
565\r
566 UpdatePageStart (CallbackData);\r
567\r
568 BootTimeOut = BdsLibGetTimeout ();\r
569\r
570 CreateNumericOpCode (\r
571 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
572 VARSTORE_ID_BOOT_MAINT,\r
573 BOOT_TIME_OUT_VAR_OFFSET,\r
574 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
575 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
576 0,\r
577 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
578 0,\r
579 65535,\r
580 0,\r
581 BootTimeOut,\r
582 &gUpdateData\r
583 );\r
584\r
585 CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
586\r
587 UpdatePageEnd (CallbackData);\r
588}\r
589\r
590VOID\r
591UpdateConModePage (\r
592 IN BMM_CALLBACK_DATA *CallbackData\r
593 )\r
594/*++\r
595\r
596Routine Description:\r
597 Refresh the text mode page\r
598\r
599Arguments:\r
600 CallbackData - BMM_CALLBACK_DATA\r
601\r
602Returns:\r
603 None.\r
604\r
605--*/\r
606{\r
607 UINTN Mode;\r
608 UINTN Index;\r
609 UINTN Col;\r
610 UINTN Row;\r
611 CHAR16 RowString[50];\r
612 CHAR16 ModeString[50];\r
613 UINTN MaxMode;\r
614 UINTN ValidMode;\r
615 EFI_STRING_ID *ModeToken;\r
616 IFR_OPTION *IfrOptionList;\r
617 EFI_STATUS Status;\r
618 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
619\r
620 ConOut = gST->ConOut;\r
621 Index = 0;\r
622 ValidMode = 0;\r
623 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
624\r
625 CallbackData->BmmAskSaveOrNot = TRUE;\r
626\r
627 UpdatePageStart (CallbackData);\r
628\r
629 //\r
630 // Check valid mode\r
631 //\r
632 for (Mode = 0; Mode < MaxMode; Mode++) {\r
633 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
634 if (EFI_ERROR (Status)) {\r
635 continue;\r
636 }\r
637 ValidMode++;\r
638 }\r
639\r
640 if (ValidMode == 0) {\r
641 return;\r
642 }\r
643\r
644 IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * ValidMode);\r
645 ASSERT(IfrOptionList != NULL);\r
646\r
647 ModeToken = EfiAllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
648 ASSERT(ModeToken != NULL);\r
649\r
650 //\r
651 // Determin which mode should be the first entry in menu\r
652 //\r
653 GetConsoleOutMode (CallbackData);\r
654\r
655 //\r
656 // Build text mode options\r
657 //\r
658 for (Mode = 0; Mode < MaxMode; Mode++) {\r
659 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
660 if (EFI_ERROR (Status)) {\r
661 continue;\r
662 }\r
663 //\r
664 // Build mode string Column x Row\r
665 //\r
666 UnicodeValueToString (ModeString, 0, Col, 0);\r
667 StrCat (ModeString, L" x ");\r
668 UnicodeValueToString (RowString, 0, Row, 0);\r
669 StrCat (ModeString, RowString);\r
670\r
9226efe5 671 HiiLibNewString (CallbackData->BmmHiiHandle, &ModeToken[Index], ModeString);\r
93e3992d 672\r
673 IfrOptionList[Index].StringToken = ModeToken[Index];\r
674 IfrOptionList[Index].Value.u16 = (UINT16) Mode;\r
675 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
676 IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT;\r
677 } else {\r
678 IfrOptionList[Index].Flags = 0;\r
679 }\r
680 Index++;\r
681 }\r
682\r
683 CreateOneOfOpCode (\r
684 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
685 VARSTORE_ID_BOOT_MAINT,\r
686 CON_MODE_VAR_OFFSET,\r
687 STRING_TOKEN (STR_CON_MODE_SETUP),\r
688 STRING_TOKEN (STR_CON_MODE_SETUP),\r
689 EFI_IFR_FLAG_RESET_REQUIRED,\r
690 EFI_IFR_NUMERIC_SIZE_2,\r
691 IfrOptionList,\r
692 ValidMode,\r
693 &gUpdateData\r
694 );\r
695 SafeFreePool (IfrOptionList);\r
696 SafeFreePool (ModeToken);\r
697\r
698 UpdatePageEnd (CallbackData);\r
699}\r
700\r
701VOID\r
702UpdateTerminalPage (\r
703 IN BMM_CALLBACK_DATA *CallbackData\r
704 )\r
705{\r
706 UINT8 Index;\r
707 UINT8 CheckFlags;\r
708 IFR_OPTION *IfrOptionList;\r
709 BM_MENU_ENTRY *NewMenuEntry;\r
710 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
711\r
712 CallbackData->BmmAskSaveOrNot = TRUE;\r
713\r
714 UpdatePageStart (CallbackData);\r
715\r
716 NewMenuEntry = BOpt_GetMenuEntry (\r
717 &TerminalMenu,\r
718 CallbackData->CurrentTerminal\r
719 );\r
720\r
721 if (NewMenuEntry == NULL) {\r
722 return ;\r
723 }\r
724\r
725 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
726\r
727 IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 19);\r
728 if (IfrOptionList == NULL) {\r
729 return ;\r
730 }\r
731\r
732 for (Index = 0; Index < 19; Index++) {\r
733 CheckFlags = 0;\r
734 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
735 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
736 NewTerminalContext->BaudRateIndex = Index;\r
737 CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;\r
738 }\r
739\r
740 IfrOptionList[Index].Flags = CheckFlags;\r
741 IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;\r
742 IfrOptionList[Index].Value.u8 = Index;\r
743 }\r
744\r
745 CreateOneOfOpCode (\r
746 (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
747 VARSTORE_ID_BOOT_MAINT,\r
748 COM_BAUD_RATE_VAR_OFFSET,\r
749 STRING_TOKEN (STR_COM_BAUD_RATE),\r
750 STRING_TOKEN (STR_COM_BAUD_RATE),\r
751 0,\r
752 EFI_IFR_NUMERIC_SIZE_1,\r
753 IfrOptionList,\r
754 19,\r
755 &gUpdateData\r
756 );\r
757\r
758 for (Index = 0; Index < 4; Index++) {\r
759 CheckFlags = 0;\r
760\r
761 if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
762 NewTerminalContext->DataBitsIndex = Index;\r
763 CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;\r
764 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
765 }\r
766\r
767 IfrOptionList[Index].Flags = CheckFlags;\r
768 IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;\r
769 IfrOptionList[Index].Value.u8 = Index;\r
770 }\r
771\r
772 CreateOneOfOpCode (\r
773 (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
774 VARSTORE_ID_BOOT_MAINT,\r
775 COM_DATA_RATE_VAR_OFFSET,\r
776 STRING_TOKEN (STR_COM_DATA_BITS),\r
777 STRING_TOKEN (STR_COM_DATA_BITS),\r
778 0,\r
779 EFI_IFR_NUMERIC_SIZE_1,\r
780 IfrOptionList,\r
781 4,\r
782 &gUpdateData\r
783 );\r
784\r
785 for (Index = 0; Index < 5; Index++) {\r
786 CheckFlags = 0;\r
787 if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
788 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
789 NewTerminalContext->ParityIndex = (UINT8) Index;\r
790 CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;\r
791 }\r
792\r
793 IfrOptionList[Index].Flags = CheckFlags;\r
794 IfrOptionList[Index].StringToken = ParityList[Index].StringToken;\r
795 IfrOptionList[Index].Value.u8 = Index;\r
796 }\r
797\r
798 CreateOneOfOpCode (\r
799 (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
800 VARSTORE_ID_BOOT_MAINT,\r
801 COM_PARITY_VAR_OFFSET,\r
802 STRING_TOKEN (STR_COM_PARITY),\r
803 STRING_TOKEN (STR_COM_PARITY),\r
804 0,\r
805 EFI_IFR_NUMERIC_SIZE_1,\r
806 IfrOptionList,\r
807 5,\r
808 &gUpdateData\r
809 );\r
810\r
811 for (Index = 0; Index < 3; Index++) {\r
812 CheckFlags = 0;\r
813 if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
814 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
815 NewTerminalContext->StopBitsIndex = (UINT8) Index;\r
816 CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;\r
817 }\r
818\r
819 IfrOptionList[Index].Flags = CheckFlags;\r
820 IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;\r
821 IfrOptionList[Index].Value.u8 = Index;\r
822 }\r
823\r
824 CreateOneOfOpCode (\r
825 (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
826 VARSTORE_ID_BOOT_MAINT,\r
827 COM_STOP_BITS_VAR_OFFSET,\r
828 STRING_TOKEN (STR_COM_STOP_BITS),\r
829 STRING_TOKEN (STR_COM_STOP_BITS),\r
830 0,\r
831 EFI_IFR_NUMERIC_SIZE_1,\r
832 IfrOptionList,\r
833 3,\r
834 &gUpdateData\r
835 );\r
836\r
837 for (Index = 0; Index < 4; Index++) {\r
838 CheckFlags = 0;\r
839 if (NewTerminalContext->TerminalType == Index) {\r
840 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
841 CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
842 }\r
843\r
844 IfrOptionList[Index].Flags = CheckFlags;\r
845 IfrOptionList[Index].StringToken = (EFI_STRING_ID) TerminalType[Index];\r
846 IfrOptionList[Index].Value.u8 = Index;\r
847 }\r
848\r
849 CreateOneOfOpCode (\r
850 (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
851 VARSTORE_ID_BOOT_MAINT,\r
852 COM_TERMINAL_VAR_OFFSET,\r
853 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
854 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
855 0,\r
856 EFI_IFR_NUMERIC_SIZE_1,\r
857 IfrOptionList,\r
858 4,\r
859 &gUpdateData\r
860 );\r
861\r
862 SafeFreePool (IfrOptionList);\r
863\r
864 UpdatePageEnd (CallbackData);\r
865}\r
866\r
867VOID\r
868UpdatePageBody (\r
869 IN UINT16 UpdatePageId,\r
870 IN BMM_CALLBACK_DATA *CallbackData\r
871 )\r
872{\r
873 CleanUpPage (UpdatePageId, CallbackData);\r
874 switch (UpdatePageId) {\r
875 case FORM_CON_IN_ID:\r
876 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
877 break;\r
878\r
879 case FORM_CON_OUT_ID:\r
880 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
881 break;\r
882\r
883 case FORM_CON_ERR_ID:\r
884 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
885 break;\r
886\r
887 case FORM_BOOT_CHG_ID:\r
888 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
889 break;\r
890\r
891 case FORM_DRV_CHG_ID:\r
892 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
893 break;\r
894\r
895 default:\r
896 break;\r
897 }\r
898}\r
899\r
900VOID *\r
901GetLegacyBootOptionVar (\r
902 IN UINTN DeviceType,\r
903 OUT UINTN *OptionIndex,\r
904 OUT UINTN *OptionSize\r
905 )\r
906{\r
907 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
908 VOID *OptionBuffer;\r
909 UINTN OrderSize;\r
910 UINTN Index;\r
911 UINT16 *OrderBuffer;\r
912 CHAR16 StrTemp[100];\r
913 UINT16 FilePathSize;\r
914 UINT8 *Ptr;\r
915 UINT8 *OptionalData;\r
916\r
917 //\r
918 // Get Boot Option number from the size of BootOrder\r
919 //\r
920 OrderBuffer = BdsLibGetVariableAndSize (\r
921 L"BootOrder",\r
922 &gEfiGlobalVariableGuid,\r
923 &OrderSize\r
924 );\r
925\r
926 for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {\r
927 UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);\r
928 OptionBuffer = BdsLibGetVariableAndSize (\r
929 StrTemp,\r
930 &gEfiGlobalVariableGuid,\r
931 OptionSize\r
932 );\r
933 if (NULL == OptionBuffer) {\r
934 continue;\r
935 }\r
936\r
937 Ptr = (UINT8 *) OptionBuffer;\r
938 Ptr += sizeof (UINT32);\r
939\r
940 FilePathSize = *(UINT16 *) Ptr;\r
941 Ptr += sizeof (UINT16);\r
942\r
943 Ptr += StrSize ((CHAR16 *) Ptr);\r
944\r
945 //\r
946 // Now Ptr point to Device Path\r
947 //\r
948 DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
949 Ptr += FilePathSize;\r
950\r
951 //\r
952 // Now Ptr point to Optional Data\r
953 //\r
954 OptionalData = Ptr;\r
955\r
956 if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&\r
957 (BBS_DEVICE_PATH == DevicePath->Type) &&\r
958 (BBS_BBS_DP == DevicePath->SubType)\r
959 ) {\r
960 *OptionIndex = OrderBuffer[Index];\r
961 SafeFreePool (OrderBuffer);\r
962 return OptionBuffer;\r
963 } else {\r
964 SafeFreePool (OptionBuffer);\r
965 }\r
966 }\r
967\r
968 SafeFreePool (OrderBuffer);\r
969 return NULL;\r
970}\r
971\r
972VOID\r
973UpdateSetLegacyDeviceOrderPage (\r
974 IN UINT16 UpdatePageId,\r
975 IN BMM_CALLBACK_DATA *CallbackData\r
976 )\r
977{\r
978 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
979 BM_MENU_OPTION *OptionMenu;\r
980 BM_MENU_ENTRY *NewMenuEntry;\r
981 IFR_OPTION *IfrOptionList;\r
982 EFI_STRING_ID StrRef;\r
983 EFI_STRING_ID StrRefHelp;\r
984 BBS_TYPE BbsType;\r
985 UINTN VarSize;\r
986 UINTN Pos;\r
987 UINTN Bit;\r
988 UINT16 Index;\r
989 UINT16 Key;\r
990 CHAR16 String[100];\r
991 CHAR16 *TypeStr;\r
992 CHAR16 *TypeStrHelp;\r
993 UINT16 VarDevOrder;\r
994 UINT8 *VarData;\r
995 UINT8 *LegacyOrder;\r
996 UINT8 *OldData;\r
997 UINT8 *DisMap;\r
998\r
999 OptionMenu = NULL;\r
1000 Key = 0;\r
1001 StrRef = 0;\r
1002 StrRefHelp = 0;\r
1003 TypeStr = NULL;\r
1004 TypeStrHelp = NULL;\r
1005 BbsType = BBS_FLOPPY;\r
1006 LegacyOrder = NULL;\r
1007 OldData = NULL;\r
1008 DisMap = NULL;\r
1009\r
1010 CallbackData->BmmAskSaveOrNot = TRUE;\r
1011 UpdatePageStart (CallbackData);\r
1012\r
1013 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
1014\r
1015 SetMem (DisMap, 32, 0);\r
1016 //\r
1017 // Create oneof option list\r
1018 //\r
1019 switch (UpdatePageId) {\r
1020 case FORM_SET_FD_ORDER_ID:\r
1021 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1022 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1023 TypeStr = StrFloppy;\r
1024 TypeStrHelp = StrFloppyHelp;\r
1025 BbsType = BBS_FLOPPY;\r
1026 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1027 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1028 break;\r
1029\r
1030 case FORM_SET_HD_ORDER_ID:\r
1031 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1032 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1033 TypeStr = StrHardDisk;\r
1034 TypeStrHelp = StrHardDiskHelp;\r
1035 BbsType = BBS_HARDDISK;\r
1036 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1037 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1038 break;\r
1039\r
1040 case FORM_SET_CD_ORDER_ID:\r
1041 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1042 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1043 TypeStr = StrCDROM;\r
1044 TypeStrHelp = StrCDROMHelp;\r
1045 BbsType = BBS_CDROM;\r
1046 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1047 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1048 break;\r
1049\r
1050 case FORM_SET_NET_ORDER_ID:\r
1051 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1052 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1053 TypeStr = StrNET;\r
1054 TypeStrHelp = StrNETHelp;\r
1055 BbsType = BBS_EMBED_NETWORK;\r
1056 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1057 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1058 break;\r
1059\r
1060 case FORM_SET_BEV_ORDER_ID:\r
1061 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1062 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1063 TypeStr = StrBEV;\r
1064 TypeStrHelp = StrBEVHelp;\r
1065 BbsType = BBS_BEV_DEVICE;\r
1066 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1067 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1068 break;\r
1069\r
1070 }\r
1071\r
1072 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1073\r
1074 IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));\r
1075 if (NULL == IfrOptionList) {\r
1076 return ;\r
1077 }\r
1078\r
1079 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1080 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
1081 IfrOptionList[Index].Flags = 0;\r
1082 if (0 == Index) {\r
1083 IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT;\r
1084 }\r
1085\r
1086 IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;\r
1087 IfrOptionList[Index].Value.u8 = (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;\r
1088 }\r
1089 //\r
1090 // for item "Disabled"\r
1091 //\r
1092 IfrOptionList[Index].Flags = 0;\r
1093 IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);\r
1094 IfrOptionList[Index].Value.u8 = 0xFF;\r
1095\r
1096 //\r
1097 // Get Device Order from variable\r
1098 //\r
1099 VarData = BdsLibGetVariableAndSize (\r
1100 VarLegacyDevOrder,\r
1101 &EfiLegacyDevOrderGuid,\r
1102 &VarSize\r
1103 );\r
1104\r
1105 if (NULL != VarData) {\r
1106 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1107 while (VarData < VarData + VarSize) {\r
1108 if (DevOrder->BbsType == BbsType) {\r
1109 break;\r
1110 }\r
1111\r
1112 VarData += sizeof (BBS_TYPE);\r
1113 VarData += *(UINT16 *) VarData;\r
1114 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1115 }\r
1116 //\r
1117 // Create oneof tag here for FD/HD/CD #1 #2\r
1118 //\r
1119 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1120 //\r
1121 // Create the string for oneof tag\r
1122 //\r
1123 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
1124 StrRef = 0;\r
9226efe5 1125 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRef, String);\r
93e3992d 1126\r
1127 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
1128 StrRefHelp = 0;\r
9226efe5 1129 HiiLibNewString (CallbackData->BmmHiiHandle, &StrRefHelp, String);\r
93e3992d 1130\r
1131 CreateOneOfOpCode (\r
1132 (EFI_QUESTION_ID) (Key + Index),\r
1133 VARSTORE_ID_BOOT_MAINT,\r
1134 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1135 StrRef,\r
1136 StrRefHelp,\r
1137 EFI_IFR_FLAG_CALLBACK,\r
1138 EFI_IFR_NUMERIC_SIZE_1,\r
1139 IfrOptionList,\r
1140 OptionMenu->MenuNumber + 1,\r
1141 &gUpdateData\r
1142 );\r
1143\r
1144 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
1145\r
1146 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1147 LegacyOrder[Index] = 0xFF;\r
1148 Pos = (VarDevOrder & 0xFF) / 8;\r
1149 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1150 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1151 } else {\r
1152 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1153 }\r
1154 }\r
1155 }\r
1156\r
1157 CopyMem (OldData, LegacyOrder, 100);\r
1158\r
1159 if (IfrOptionList != NULL) {\r
1160 SafeFreePool (IfrOptionList);\r
1161 IfrOptionList = NULL;\r
1162 }\r
1163\r
1164 UpdatePageEnd (CallbackData);\r
1165}\r
1166\r
1167VOID\r
1168UpdatePageId (\r
1169 BMM_CALLBACK_DATA *Private,\r
1170 UINT16 NewPageId\r
1171 )\r
1172{\r
1173 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1174 //\r
1175 // If we select a handle to add driver option, advance to the add handle description page.\r
1176 //\r
1177 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1178 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1179 //\r
1180 // Return to main page after "Save Changes" or "Discard Changes".\r
1181 //\r
1182 NewPageId = FORM_MAIN_ID;\r
1183 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1184 NewPageId = FORM_CON_COM_SETUP_ID;\r
1185 }\r
1186\r
1187 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1188 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1189 Private->BmmCurrentPageId = NewPageId;\r
1190 }\r
1191}\r