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