]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg BootMaint: Use safe string functions
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
CommitLineData
5c08e117 1/** @file\r
2Dynamically update the pages.\r
3\r
49264dac 4Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
180a5a35 5This program and the accompanying materials\r
5c08e117 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "BootMaint.h"\r
16\r
17/**\r
18 Refresh the global UpdateData structure.\r
19\r
20**/\r
21VOID\r
22RefreshUpdateData (\r
23 VOID\r
24 )\r
25{\r
75bf9d0e
LG
26 //\r
27 // Free current updated date\r
28 // \r
29 if (mStartOpCodeHandle != NULL) {\r
30 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
31 }\r
32\r
33 //\r
34 // Create new OpCode Handle\r
35 //\r
36 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
37\r
38 //\r
39 // Create Hii Extend Label OpCode as the start opcode\r
40 //\r
41 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
42 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
43\r
5c08e117 44}\r
45\r
46/**\r
47 Add a "Go back to main page" tag in front of the form when there are no\r
48 "Apply changes" and "Discard changes" tags in the end of the form.\r
49 \r
50 @param CallbackData The BMM context data.\r
51\r
52**/\r
53VOID\r
54UpdatePageStart (\r
55 IN BMM_CALLBACK_DATA *CallbackData\r
56 )\r
57{\r
58 RefreshUpdateData ();\r
75bf9d0e 59 mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
5c08e117 60\r
61 if (!(CallbackData->BmmAskSaveOrNot)) {\r
62 //\r
63 // Add a "Go back to main page" tag in front of the form when there are no\r
64 // "Apply changes" and "Discard changes" tags in the end of the form.\r
65 //\r
75bf9d0e
LG
66 HiiCreateGotoOpCode (\r
67 mStartOpCodeHandle,\r
5c08e117 68 FORM_MAIN_ID,\r
69 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
70 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
71 0,\r
75bf9d0e 72 FORM_MAIN_ID\r
5c08e117 73 );\r
74 }\r
75\r
76}\r
77\r
78/**\r
79 Create the "Apply changes" and "Discard changes" tags. And\r
80 ensure user can return to the main page.\r
81\r
82 @param CallbackData The BMM context data.\r
83\r
84**/\r
85VOID\r
86UpdatePageEnd (\r
87 IN BMM_CALLBACK_DATA *CallbackData\r
88 )\r
89{\r
90 //\r
91 // Create the "Apply changes" and "Discard changes" tags.\r
92 //\r
93 if (CallbackData->BmmAskSaveOrNot) {\r
75bf9d0e
LG
94 HiiCreateSubTitleOpCode (\r
95 mStartOpCodeHandle,\r
5c08e117 96 STRING_TOKEN (STR_NULL_STRING),\r
97 0,\r
98 0,\r
75bf9d0e 99 0\r
5c08e117 100 );\r
101\r
84724077 102 HiiCreateActionOpCode (\r
75bf9d0e 103 mStartOpCodeHandle,\r
84724077 104 KEY_VALUE_SAVE_AND_EXIT,\r
5c08e117 105 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
106 STRING_TOKEN (STR_NULL_STRING),\r
107 EFI_IFR_FLAG_CALLBACK,\r
84724077 108 0\r
5c08e117 109 );\r
110 }\r
111\r
112 //\r
113 // Ensure user can return to the main page.\r
114 //\r
84724077 115 HiiCreateActionOpCode (\r
75bf9d0e 116 mStartOpCodeHandle,\r
84724077 117 KEY_VALUE_NO_SAVE_AND_EXIT,\r
5c08e117 118 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
119 STRING_TOKEN (STR_NULL_STRING),\r
120 EFI_IFR_FLAG_CALLBACK,\r
84724077 121 0\r
5c08e117 122 );\r
123\r
75bf9d0e 124 HiiUpdateForm (\r
5c08e117 125 CallbackData->BmmHiiHandle,\r
e24fc103 126 &gBootMaintFormSetGuid,\r
5c08e117 127 CallbackData->BmmCurrentPageId,\r
75bf9d0e
LG
128 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
129 mEndOpCodeHandle // LABEL_END\r
5c08e117 130 );\r
131}\r
132\r
133/**\r
134 Clean up the dynamic opcode at label and form specified by both LabelId. \r
135\r
136 @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
137 @param CallbackData The BMM context data.\r
138\r
139**/\r
140VOID\r
141CleanUpPage (\r
142 IN UINT16 LabelId,\r
143 IN BMM_CALLBACK_DATA *CallbackData\r
144 )\r
145{\r
146 RefreshUpdateData ();\r
147\r
148 //\r
149 // Remove all op-codes from dynamic page\r
150 //\r
75bf9d0e
LG
151 mStartLabel->Number = LabelId;\r
152 HiiUpdateForm (\r
5c08e117 153 CallbackData->BmmHiiHandle,\r
e24fc103 154 &gBootMaintFormSetGuid,\r
5c08e117 155 LabelId,\r
75bf9d0e
LG
156 mStartOpCodeHandle, // Label LabelId\r
157 mEndOpCodeHandle // LABEL_END\r
5c08e117 158 );\r
159}\r
160\r
161/**\r
162 Boot a file selected by user at File Expoloer of BMM.\r
163\r
164 @param FileContext The file context data, which contains the device path\r
165 of the file to be boot from.\r
166\r
167 @retval EFI_SUCCESS The function completed successfull.\r
168 @return Other value if the boot from the file fails.\r
169\r
170**/\r
171EFI_STATUS\r
172BootThisFile (\r
173 IN BM_FILE_CONTEXT *FileContext\r
174 )\r
175{\r
176 EFI_STATUS Status;\r
177 UINTN ExitDataSize;\r
178 CHAR16 *ExitData;\r
179 BDS_COMMON_OPTION *Option;\r
180\r
181 Option = (BDS_COMMON_OPTION *) AllocatePool (sizeof (BDS_COMMON_OPTION));\r
182 ASSERT (Option != NULL);\r
326f0711 183 Option->Description = (CHAR16 *) AllocateCopyPool (StrSize (FileContext->FileName), FileContext->FileName);\r
5c08e117 184 Option->DevicePath = FileContext->DevicePath;\r
185 Option->LoadOptionsSize = 0;\r
186 Option->LoadOptions = NULL;\r
187\r
188 //\r
189 // Since current no boot from removable media directly is allowed */\r
190 //\r
191 gST->ConOut->ClearScreen (gST->ConOut);\r
192\r
193 ExitDataSize = 0;\r
194\r
195 Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);\r
196\r
197 return Status;\r
198\r
199}\r
200\r
201/**\r
202 Create a list of Goto Opcode for all terminal devices logged\r
203 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
204\r
205 @param CallbackData The BMM context data.\r
206**/\r
207VOID\r
208UpdateConCOMPage (\r
209 IN BMM_CALLBACK_DATA *CallbackData\r
210 )\r
211{\r
212 BM_MENU_ENTRY *NewMenuEntry;\r
213 UINT16 Index;\r
214\r
215 CallbackData->BmmAskSaveOrNot = FALSE;\r
216\r
217 UpdatePageStart (CallbackData);\r
218\r
219\r
220 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
221 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
222\r
75bf9d0e
LG
223 HiiCreateGotoOpCode (\r
224 mStartOpCodeHandle,\r
5c08e117 225 FORM_CON_COM_SETUP_ID,\r
226 NewMenuEntry->DisplayStringToken,\r
227 STRING_TOKEN (STR_NULL_STRING),\r
228 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 229 (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
5c08e117 230 );\r
231 }\r
232\r
233 UpdatePageEnd (CallbackData);\r
234}\r
235\r
236/**\r
237 Create a lit of boot option from global BootOptionMenu. It\r
238 allow user to delete the boot option.\r
239\r
240 @param CallbackData The BMM context data.\r
241\r
242**/\r
243VOID\r
244UpdateBootDelPage (\r
245 IN BMM_CALLBACK_DATA *CallbackData\r
246 )\r
247{\r
248 BM_MENU_ENTRY *NewMenuEntry;\r
249 BM_LOAD_CONTEXT *NewLoadContext;\r
250 UINT16 Index;\r
251\r
252 CallbackData->BmmAskSaveOrNot = TRUE;\r
253\r
254 UpdatePageStart (CallbackData);\r
255 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
256\r
be9304f3 257 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
5c08e117 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
8acb3f7b
ED
266\r
267 if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
268 //\r
269 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
270 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
271 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
272 // through HiiSetBrowserData function.\r
273 //\r
274 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
275 }\r
5c08e117 276\r
75bf9d0e
LG
277 HiiCreateCheckBoxOpCode (\r
278 mStartOpCodeHandle,\r
be9304f3 279 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
5c08e117 280 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 281 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
5c08e117 282 NewMenuEntry->DisplayStringToken,\r
283 NewMenuEntry->HelpStringToken,\r
8acb3f7b 284 EFI_IFR_FLAG_CALLBACK,\r
5c08e117 285 0,\r
75bf9d0e 286 NULL\r
5c08e117 287 );\r
288 }\r
289\r
290 UpdatePageEnd (CallbackData);\r
291}\r
292\r
293/**\r
294 Create a lit of driver option from global DriverMenu.\r
295\r
296 @param CallbackData The BMM context data.\r
297\r
298**/\r
299VOID\r
300UpdateDrvAddHandlePage (\r
301 IN BMM_CALLBACK_DATA *CallbackData\r
302 )\r
303{\r
304 BM_MENU_ENTRY *NewMenuEntry;\r
305 UINT16 Index;\r
306\r
307 CallbackData->BmmAskSaveOrNot = FALSE;\r
308\r
309 UpdatePageStart (CallbackData);\r
310\r
311 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
312 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
313\r
75bf9d0e
LG
314 HiiCreateGotoOpCode (\r
315 mStartOpCodeHandle,\r
5c08e117 316 FORM_DRV_ADD_HANDLE_DESC_ID,\r
317 NewMenuEntry->DisplayStringToken,\r
318 STRING_TOKEN (STR_NULL_STRING),\r
319 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 320 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
5c08e117 321 );\r
322 }\r
323\r
324 UpdatePageEnd (CallbackData);\r
325}\r
326\r
327/**\r
328 Create a lit of driver option from global DriverOptionMenu. It\r
329 allow user to delete the driver option.\r
330\r
331 @param CallbackData The BMM context data.\r
332\r
333**/\r
334VOID\r
335UpdateDrvDelPage (\r
336 IN BMM_CALLBACK_DATA *CallbackData\r
337 )\r
338{\r
339 BM_MENU_ENTRY *NewMenuEntry;\r
340 BM_LOAD_CONTEXT *NewLoadContext;\r
341 UINT16 Index;\r
342\r
343 CallbackData->BmmAskSaveOrNot = TRUE;\r
344\r
345 UpdatePageStart (CallbackData);\r
346\r
347 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
348 \r
be9304f3 349 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
5c08e117 350 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
351 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
352\r
353 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
354 NewLoadContext->Deleted = FALSE;\r
8acb3f7b
ED
355\r
356 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
357 //\r
358 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
359 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
360 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
361 // through HiiSetBrowserData function.\r
362 //\r
363 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
364 }\r
5c08e117 365\r
75bf9d0e
LG
366 HiiCreateCheckBoxOpCode (\r
367 mStartOpCodeHandle,\r
be9304f3 368 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
5c08e117 369 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 370 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
5c08e117 371 NewMenuEntry->DisplayStringToken,\r
372 NewMenuEntry->HelpStringToken,\r
8acb3f7b 373 EFI_IFR_FLAG_CALLBACK,\r
5c08e117 374 0,\r
75bf9d0e 375 NULL\r
5c08e117 376 );\r
377 }\r
378\r
379 UpdatePageEnd (CallbackData);\r
380}\r
381\r
382/**\r
383 Prepare the page to allow user to add description for \r
384 a Driver Option.\r
385\r
386 @param CallbackData The BMM context data.\r
387\r
388**/\r
389VOID\r
390UpdateDriverAddHandleDescPage (\r
391 IN BMM_CALLBACK_DATA *CallbackData\r
392 )\r
393{\r
394 BM_MENU_ENTRY *NewMenuEntry;\r
395\r
396 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
397 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
398 CallbackData->BmmAskSaveOrNot = TRUE;\r
399 NewMenuEntry = CallbackData->MenuEntry;\r
400\r
401 UpdatePageStart (CallbackData);\r
402\r
75bf9d0e
LG
403 HiiCreateSubTitleOpCode (\r
404 mStartOpCodeHandle,\r
5c08e117 405 NewMenuEntry->DisplayStringToken,\r
406 0,\r
407 0,\r
75bf9d0e 408 0\r
5c08e117 409 );\r
410\r
75bf9d0e
LG
411 HiiCreateStringOpCode (\r
412 mStartOpCodeHandle,\r
5c08e117 413 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
414 VARSTORE_ID_BOOT_MAINT,\r
415 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
416 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
417 STRING_TOKEN (STR_NULL_STRING),\r
418 0,\r
419 0,\r
420 6,\r
421 75,\r
75bf9d0e 422 NULL\r
5c08e117 423 );\r
424\r
75bf9d0e
LG
425 HiiCreateCheckBoxOpCode (\r
426 mStartOpCodeHandle,\r
5c08e117 427 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
428 VARSTORE_ID_BOOT_MAINT,\r
429 DRV_ADD_RECON_VAR_OFFSET,\r
430 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
431 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
432 0,\r
433 0,\r
75bf9d0e 434 NULL\r
5c08e117 435 );\r
436\r
75bf9d0e
LG
437 HiiCreateStringOpCode (\r
438 mStartOpCodeHandle,\r
5c08e117 439 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
440 VARSTORE_ID_BOOT_MAINT,\r
441 DRIVER_ADD_OPTION_VAR_OFFSET,\r
442 STRING_TOKEN (STR_OPTIONAL_DATA),\r
443 STRING_TOKEN (STR_NULL_STRING),\r
444 0,\r
445 0,\r
446 6,\r
447 75,\r
75bf9d0e 448 NULL\r
5c08e117 449 );\r
450\r
451 UpdatePageEnd (CallbackData);\r
452}\r
453\r
454/**\r
455 Update console page.\r
456\r
457 @param UpdatePageId The form ID to be updated.\r
458 @param ConsoleMenu The console menu list.\r
459 @param CallbackData The BMM context data.\r
460\r
461**/\r
462VOID\r
463UpdateConsolePage (\r
464 IN UINT16 UpdatePageId,\r
465 IN BM_MENU_OPTION *ConsoleMenu,\r
466 IN BMM_CALLBACK_DATA *CallbackData\r
467 )\r
468{\r
469 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 470 UINT16 Index;\r
5c08e117 471 UINT8 CheckFlags;\r
be9304f3
ED
472 UINT8 *ConsoleCheck;\r
473 EFI_QUESTION_ID QuestionIdBase;\r
474 UINT16 VariableOffsetBase;\r
5c08e117 475\r
476 UpdatePageStart (CallbackData);\r
477\r
be9304f3
ED
478 ConsoleCheck = NULL;\r
479 QuestionIdBase = 0;\r
480 VariableOffsetBase = 0;\r
5c08e117 481\r
be9304f3
ED
482 switch (UpdatePageId) {\r
483 case FORM_CON_IN_ID:\r
484 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
485 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
486 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
487 break;\r
488\r
489 case FORM_CON_OUT_ID:\r
490 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
491 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
492 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
493 break;\r
494\r
495 case FORM_CON_ERR_ID:\r
496 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
497 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
498 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
499 break;\r
5c08e117 500 }\r
be9304f3 501 ASSERT (ConsoleCheck != NULL);\r
5c08e117 502\r
be9304f3
ED
503 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
504 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
505 CheckFlags = 0;\r
506 if (UpdatePageId != FORM_CON_ERR_ID) {\r
5c08e117 507 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
5c08e117 508 }\r
be9304f3 509 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
75bf9d0e
LG
510 HiiCreateCheckBoxOpCode (\r
511 mStartOpCodeHandle,\r
be9304f3 512 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
5c08e117 513 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 514 (UINT16) (VariableOffsetBase + Index),\r
5c08e117 515 NewMenuEntry->DisplayStringToken,\r
516 NewMenuEntry->HelpStringToken,\r
517 0,\r
518 CheckFlags,\r
75bf9d0e 519 NULL\r
5c08e117 520 );\r
5c08e117 521 }\r
522\r
523 UpdatePageEnd (CallbackData);\r
524}\r
525\r
526/**\r
527 Update the page's NV Map if user has changed the order\r
528 a list. This list can be Boot Order or Driver Order.\r
529\r
530 @param UpdatePageId The form ID to be updated.\r
531 @param OptionMenu The new list.\r
532 @param CallbackData The BMM context data.\r
533\r
534**/\r
535VOID\r
536UpdateOrderPage (\r
537 IN UINT16 UpdatePageId,\r
538 IN BM_MENU_OPTION *OptionMenu,\r
539 IN BMM_CALLBACK_DATA *CallbackData\r
540 )\r
541{\r
be9304f3
ED
542 BM_MENU_ENTRY *NewMenuEntry;\r
543 UINT16 Index;\r
544 UINT16 OptionIndex;\r
545 VOID *OptionsOpCodeHandle;\r
be9304f3
ED
546 BOOLEAN BootOptionFound;\r
547 UINT32 *OptionOrder;\r
548 EFI_QUESTION_ID QuestionId;\r
549 UINT16 VarOffset;\r
5c08e117 550\r
5c08e117 551\r
552 UpdatePageStart (CallbackData);\r
553\r
554 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
be9304f3
ED
555 \r
556 OptionOrder = NULL;\r
557 QuestionId = 0;\r
558 VarOffset = 0;\r
559 switch (UpdatePageId) { \r
5c08e117 560\r
be9304f3
ED
561 case FORM_BOOT_CHG_ID:\r
562 //GetBootOrder (CallbackData);\r
563 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
564 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
565 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
566 break;\r
567\r
568 case FORM_DRV_CHG_ID:\r
569 //GetDriverOrder (CallbackData);\r
570 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
571 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
572 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
573 break;\r
574 } \r
575 ASSERT (OptionOrder != NULL);\r
5c08e117 576\r
75bf9d0e
LG
577 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
578 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 579 \r
be9304f3 580 NewMenuEntry = NULL;\r
0fb44022 581 for (OptionIndex = 0; (OptionIndex < MAX_MENU_NUMBER && OptionOrder[OptionIndex] != 0); OptionIndex++) {\r
be9304f3
ED
582 BootOptionFound = FALSE;\r
583 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
584 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
be9304f3
ED
585 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
586 BootOptionFound = TRUE;\r
587 break;\r
22d1f978
RN
588 }\r
589 }\r
be9304f3
ED
590 if (BootOptionFound) {\r
591 HiiCreateOneOfOptionOpCode (\r
592 OptionsOpCodeHandle,\r
593 NewMenuEntry->DisplayStringToken,\r
594 0,\r
595 EFI_IFR_TYPE_NUM_SIZE_32,\r
596 OptionOrder[OptionIndex]\r
597 );\r
598 }\r
5c08e117 599 }\r
be9304f3 600 \r
5c08e117 601 if (OptionMenu->MenuNumber > 0) {\r
75bf9d0e
LG
602 HiiCreateOrderedListOpCode ( \r
603 mStartOpCodeHandle, // Container for dynamic created opcodes \r
be9304f3 604 QuestionId, // Question ID \r
75bf9d0e 605 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
be9304f3 606 VarOffset, // Offset in Buffer Storage \r
75bf9d0e
LG
607 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
608 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
609 0, // Question flag \r
610 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
b452ca89 611 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
75bf9d0e
LG
612 100, // Maximum container \r
613 OptionsOpCodeHandle, // Option Opcode list \r
614 NULL // Default Opcode is NULL \r
5c08e117 615 );\r
616 }\r
617\r
75bf9d0e 618 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 619\r
620 UpdatePageEnd (CallbackData);\r
5c08e117 621}\r
622\r
623/**\r
624 Create the dynamic page to allow user to set\r
625 the "BootNext" value.\r
626\r
627 @param CallbackData The BMM context data.\r
628\r
629**/\r
630VOID\r
631UpdateBootNextPage (\r
632 IN BMM_CALLBACK_DATA *CallbackData\r
633 )\r
634{\r
635 BM_MENU_ENTRY *NewMenuEntry;\r
636 BM_LOAD_CONTEXT *NewLoadContext;\r
5c08e117 637 UINTN NumberOfOptions;\r
638 UINT16 Index;\r
75bf9d0e 639 VOID *OptionsOpCodeHandle;\r
5c08e117 640\r
5c08e117 641 NumberOfOptions = BootOptionMenu.MenuNumber;\r
642 CallbackData->BmmAskSaveOrNot = TRUE;\r
643\r
644 UpdatePageStart (CallbackData);\r
645 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
646\r
647 if (NumberOfOptions > 0) {\r
75bf9d0e
LG
648 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
649 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 650\r
be9304f3 651 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
5c08e117 652\r
653 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
654 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
655 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
75bf9d0e 656\r
5c08e117 657 if (NewLoadContext->IsBootNext) {\r
75bf9d0e
LG
658 HiiCreateOneOfOptionOpCode (\r
659 OptionsOpCodeHandle,\r
660 NewMenuEntry->DisplayStringToken,\r
661 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 662 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
663 Index\r
664 );\r
be9304f3 665 //CallbackData->BmmFakeNvData.BootNext = Index;\r
5c08e117 666 } else {\r
75bf9d0e
LG
667 HiiCreateOneOfOptionOpCode (\r
668 OptionsOpCodeHandle,\r
669 NewMenuEntry->DisplayStringToken,\r
670 0,\r
b452ca89 671 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
672 Index\r
673 );\r
5c08e117 674 }\r
5c08e117 675 }\r
676\r
5c08e117 677 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
75bf9d0e
LG
678 HiiCreateOneOfOptionOpCode (\r
679 OptionsOpCodeHandle,\r
680 STRING_TOKEN (STR_NONE),\r
681 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 682 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
683 Index\r
684 );\r
685 } else {\r
686 HiiCreateOneOfOptionOpCode (\r
687 OptionsOpCodeHandle,\r
688 STRING_TOKEN (STR_NONE),\r
689 0,\r
b452ca89 690 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
691 Index\r
692 );\r
693 } \r
5c08e117 694\r
75bf9d0e
LG
695 HiiCreateOneOfOpCode (\r
696 mStartOpCodeHandle,\r
5c08e117 697 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
698 VARSTORE_ID_BOOT_MAINT,\r
699 BOOT_NEXT_VAR_OFFSET,\r
700 STRING_TOKEN (STR_BOOT_NEXT),\r
701 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
702 0,\r
703 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
704 OptionsOpCodeHandle,\r
705 NULL\r
5c08e117 706 );\r
707\r
75bf9d0e 708 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 709 }\r
710\r
711 UpdatePageEnd (CallbackData);\r
712}\r
713\r
714/**\r
715 Create the dynamic page to allow user to set the "TimeOut" value.\r
716\r
717 @param CallbackData The BMM context data.\r
718\r
719**/\r
720VOID\r
721UpdateTimeOutPage (\r
722 IN BMM_CALLBACK_DATA *CallbackData\r
723 )\r
724{\r
725 UINT16 BootTimeOut;\r
75bf9d0e 726 VOID *DefaultOpCodeHandle;\r
5c08e117 727\r
728 CallbackData->BmmAskSaveOrNot = TRUE;\r
729\r
730 UpdatePageStart (CallbackData);\r
731\r
8c81cb83 732 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
5c08e117 733\r
75bf9d0e
LG
734 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
735 ASSERT (DefaultOpCodeHandle != NULL);\r
b452ca89 736 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
75bf9d0e
LG
737\r
738 HiiCreateNumericOpCode (\r
739 mStartOpCodeHandle,\r
5c08e117 740 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
741 VARSTORE_ID_BOOT_MAINT,\r
742 BOOT_TIME_OUT_VAR_OFFSET,\r
743 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
744 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
745 0,\r
746 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
747 0,\r
748 65535,\r
749 0,\r
75bf9d0e 750 DefaultOpCodeHandle\r
5c08e117 751 );\r
75bf9d0e
LG
752 \r
753 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
5c08e117 754\r
be9304f3 755 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
5c08e117 756\r
757 UpdatePageEnd (CallbackData);\r
758}\r
759\r
760/**\r
761 Refresh the text mode page.\r
762\r
763 @param CallbackData The BMM context data.\r
764\r
765**/\r
766VOID\r
767UpdateConModePage (\r
768 IN BMM_CALLBACK_DATA *CallbackData\r
769 )\r
770{\r
771 UINTN Mode;\r
772 UINTN Index;\r
773 UINTN Col;\r
774 UINTN Row;\r
5c08e117 775 CHAR16 ModeString[50];\r
19bf20e1 776 CHAR16 *PStr;\r
5c08e117 777 UINTN MaxMode;\r
778 UINTN ValidMode;\r
779 EFI_STRING_ID *ModeToken;\r
5c08e117 780 EFI_STATUS Status;\r
75bf9d0e 781 VOID *OptionsOpCodeHandle;\r
5c08e117 782 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
783\r
784 ConOut = gST->ConOut;\r
785 Index = 0;\r
786 ValidMode = 0;\r
787 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
788\r
789 CallbackData->BmmAskSaveOrNot = TRUE;\r
790\r
791 UpdatePageStart (CallbackData);\r
792\r
793 //\r
794 // Check valid mode\r
795 //\r
796 for (Mode = 0; Mode < MaxMode; Mode++) {\r
797 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
798 if (EFI_ERROR (Status)) {\r
799 continue;\r
800 }\r
801 ValidMode++;\r
802 }\r
803\r
804 if (ValidMode == 0) {\r
805 return;\r
806 }\r
807\r
75bf9d0e
LG
808 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
809 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 810\r
811 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
812 ASSERT(ModeToken != NULL);\r
813\r
814 //\r
815 // Determin which mode should be the first entry in menu\r
816 //\r
be9304f3 817 // GetConsoleOutMode (CallbackData);\r
5c08e117 818\r
819 //\r
820 // Build text mode options\r
821 //\r
822 for (Mode = 0; Mode < MaxMode; Mode++) {\r
823 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
824 if (EFI_ERROR (Status)) {\r
825 continue;\r
826 }\r
827 \r
828 //\r
829 // Build mode string Column x Row\r
830 //\r
7a45e5aa 831 UnicodeValueToString (ModeString, 0, Col, 0);\r
19bf20e1 832 PStr = &ModeString[0];\r
49264dac 833 StrCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ");\r
b55f8b01
LG
834 PStr = PStr + StrLen (PStr);\r
835 UnicodeValueToString (PStr , 0, Row, 0);\r
5c08e117 836\r
cb7d01c0 837 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
5c08e117 838\r
5c08e117 839 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
75bf9d0e
LG
840 HiiCreateOneOfOptionOpCode (\r
841 OptionsOpCodeHandle,\r
842 ModeToken[Index],\r
843 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 844 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
845 (UINT16) Mode\r
846 );\r
5c08e117 847 } else {\r
75bf9d0e
LG
848 HiiCreateOneOfOptionOpCode (\r
849 OptionsOpCodeHandle,\r
850 ModeToken[Index],\r
851 0,\r
b452ca89 852 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
853 (UINT16) Mode\r
854 );\r
5c08e117 855 }\r
856 Index++;\r
857 }\r
858\r
75bf9d0e
LG
859 HiiCreateOneOfOpCode (\r
860 mStartOpCodeHandle,\r
5c08e117 861 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
862 VARSTORE_ID_BOOT_MAINT,\r
863 CON_MODE_VAR_OFFSET,\r
864 STRING_TOKEN (STR_CON_MODE_SETUP),\r
865 STRING_TOKEN (STR_CON_MODE_SETUP),\r
866 EFI_IFR_FLAG_RESET_REQUIRED,\r
867 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
868 OptionsOpCodeHandle,\r
869 NULL\r
5c08e117 870 );\r
75bf9d0e
LG
871\r
872 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 873 FreePool (ModeToken);\r
874\r
875 UpdatePageEnd (CallbackData);\r
876}\r
877\r
878/**\r
879 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
880 Parity, Stop Bits, Terminal Type.\r
881\r
882 @param CallbackData The BMM context data.\r
883\r
884**/\r
885VOID\r
886UpdateTerminalPage (\r
887 IN BMM_CALLBACK_DATA *CallbackData\r
888 )\r
889{\r
890 UINT8 Index;\r
891 UINT8 CheckFlags;\r
5c08e117 892 BM_MENU_ENTRY *NewMenuEntry;\r
75bf9d0e 893 VOID *OptionsOpCodeHandle;\r
be9304f3 894 UINTN CurrentTerminal;\r
5c08e117 895\r
896 UpdatePageStart (CallbackData);\r
897\r
be9304f3 898 CurrentTerminal = CallbackData->CurrentTerminal;\r
5c08e117 899 NewMenuEntry = BOpt_GetMenuEntry (\r
900 &TerminalMenu,\r
be9304f3 901 CurrentTerminal\r
5c08e117 902 );\r
903\r
904 if (NewMenuEntry == NULL) {\r
905 return ;\r
906 }\r
907\r
75bf9d0e
LG
908 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
909 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 910\r
911 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
912 CheckFlags = 0;\r
be9304f3 913 if (BaudRateList[Index].Value == 115200) {\r
5c08e117 914 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 915 }\r
75bf9d0e
LG
916 HiiCreateOneOfOptionOpCode (\r
917 OptionsOpCodeHandle,\r
918 BaudRateList[Index].StringToken,\r
919 CheckFlags,\r
b452ca89 920 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
921 Index\r
922 );\r
5c08e117 923 }\r
924\r
75bf9d0e
LG
925 HiiCreateOneOfOpCode (\r
926 mStartOpCodeHandle,\r
be9304f3 927 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 928 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 929 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 930 STRING_TOKEN (STR_COM_BAUD_RATE),\r
931 STRING_TOKEN (STR_COM_BAUD_RATE),\r
932 0,\r
933 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
934 OptionsOpCodeHandle,\r
935 NULL\r
5c08e117 936 );\r
75bf9d0e
LG
937 \r
938 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
939 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
940 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 941\r
942 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
943 CheckFlags = 0;\r
944\r
be9304f3 945 if (DataBitsList[Index].Value == 8) {\r
5c08e117 946 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
947 }\r
948\r
75bf9d0e
LG
949 HiiCreateOneOfOptionOpCode (\r
950 OptionsOpCodeHandle,\r
951 DataBitsList[Index].StringToken,\r
952 CheckFlags,\r
b452ca89 953 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
954 Index\r
955 );\r
5c08e117 956 }\r
957\r
75bf9d0e
LG
958 HiiCreateOneOfOpCode (\r
959 mStartOpCodeHandle,\r
be9304f3 960 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 961 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 962 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 963 STRING_TOKEN (STR_COM_DATA_BITS),\r
964 STRING_TOKEN (STR_COM_DATA_BITS),\r
965 0,\r
966 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
967 OptionsOpCodeHandle,\r
968 NULL\r
5c08e117 969 );\r
970\r
75bf9d0e
LG
971 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
972 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
973 ASSERT (OptionsOpCodeHandle != NULL);\r
974\r
5c08e117 975 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
976 CheckFlags = 0;\r
be9304f3 977 if (ParityList[Index].Value == NoParity) {\r
5c08e117 978 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 979 }\r
980\r
75bf9d0e
LG
981 HiiCreateOneOfOptionOpCode (\r
982 OptionsOpCodeHandle,\r
983 ParityList[Index].StringToken,\r
984 CheckFlags,\r
b452ca89 985 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
986 Index\r
987 );\r
5c08e117 988 }\r
989\r
75bf9d0e
LG
990 HiiCreateOneOfOpCode (\r
991 mStartOpCodeHandle,\r
be9304f3 992 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
5c08e117 993 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 994 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
5c08e117 995 STRING_TOKEN (STR_COM_PARITY),\r
996 STRING_TOKEN (STR_COM_PARITY),\r
997 0,\r
998 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
999 OptionsOpCodeHandle,\r
1000 NULL\r
5c08e117 1001 );\r
1002\r
75bf9d0e
LG
1003 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1004 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1005 ASSERT (OptionsOpCodeHandle != NULL);\r
1006\r
5c08e117 1007 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
1008 CheckFlags = 0;\r
be9304f3 1009 if (StopBitsList[Index].Value == OneStopBit) {\r
5c08e117 1010 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1011 }\r
1012\r
75bf9d0e
LG
1013 HiiCreateOneOfOptionOpCode (\r
1014 OptionsOpCodeHandle,\r
1015 StopBitsList[Index].StringToken,\r
1016 CheckFlags,\r
b452ca89 1017 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1018 Index\r
1019 );\r
5c08e117 1020 }\r
1021\r
75bf9d0e
LG
1022 HiiCreateOneOfOpCode (\r
1023 mStartOpCodeHandle,\r
be9304f3 1024 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
5c08e117 1025 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1026 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1027 STRING_TOKEN (STR_COM_STOP_BITS),\r
1028 STRING_TOKEN (STR_COM_STOP_BITS),\r
1029 0,\r
1030 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1031 OptionsOpCodeHandle,\r
1032 NULL\r
5c08e117 1033 );\r
1034\r
75bf9d0e
LG
1035 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1036 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1037 ASSERT (OptionsOpCodeHandle != NULL);\r
1038\r
5c08e117 1039 for (Index = 0; Index < 4; Index++) {\r
1040 CheckFlags = 0;\r
be9304f3 1041 if (Index == 0) {\r
5c08e117 1042 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1043 }\r
1044\r
75bf9d0e
LG
1045 HiiCreateOneOfOptionOpCode (\r
1046 OptionsOpCodeHandle,\r
1047 (EFI_STRING_ID) TerminalType[Index],\r
1048 CheckFlags,\r
b452ca89 1049 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1050 Index\r
1051 );\r
5c08e117 1052 }\r
1053\r
75bf9d0e
LG
1054 HiiCreateOneOfOpCode (\r
1055 mStartOpCodeHandle,\r
be9304f3 1056 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
5c08e117 1057 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1058 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1059 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1060 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1061 0,\r
1062 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1063 OptionsOpCodeHandle,\r
1064 NULL\r
5c08e117 1065 );\r
1066\r
8e491a81
ED
1067 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1068 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1069 ASSERT (OptionsOpCodeHandle != NULL);\r
1070\r
8e491a81 1071 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
be9304f3
ED
1072 CheckFlags = 0;\r
1073 if (Index == 0) {\r
1074 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1075 }\r
8e491a81
ED
1076 HiiCreateOneOfOptionOpCode (\r
1077 OptionsOpCodeHandle,\r
1078 (EFI_STRING_ID) mFlowControlType[Index],\r
be9304f3 1079 CheckFlags,\r
8e491a81
ED
1080 EFI_IFR_TYPE_NUM_SIZE_8,\r
1081 mFlowControlValue[Index]\r
1082 );\r
1083 }\r
1084\r
1085 HiiCreateOneOfOpCode (\r
1086 mStartOpCodeHandle,\r
be9304f3 1087 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
8e491a81 1088 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1089 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
8e491a81
ED
1090 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1091 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1092 0,\r
1093 EFI_IFR_NUMERIC_SIZE_1,\r
1094 OptionsOpCodeHandle,\r
1095 NULL\r
1096 );\r
1097\r
75bf9d0e 1098 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1099\r
1100 UpdatePageEnd (CallbackData);\r
1101}\r
1102\r
1103/**\r
1104 Dispatch the correct update page function to call based on\r
1105 the UpdatePageId.\r
1106\r
1107 @param UpdatePageId The form ID.\r
1108 @param CallbackData The BMM context data.\r
1109\r
1110**/\r
1111VOID\r
1112UpdatePageBody (\r
1113 IN UINT16 UpdatePageId,\r
1114 IN BMM_CALLBACK_DATA *CallbackData\r
1115 )\r
1116{\r
1117 CleanUpPage (UpdatePageId, CallbackData);\r
1118 switch (UpdatePageId) {\r
1119 case FORM_CON_IN_ID:\r
1120 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1121 break;\r
1122\r
1123 case FORM_CON_OUT_ID:\r
1124 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1125 break;\r
1126\r
1127 case FORM_CON_ERR_ID:\r
1128 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1129 break;\r
1130\r
1131 case FORM_BOOT_CHG_ID:\r
1132 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1133 break;\r
1134\r
1135 case FORM_DRV_CHG_ID:\r
1136 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1137 break;\r
1138\r
1139 default:\r
1140 break;\r
1141 }\r
1142}\r
1143\r
5c08e117 1144/**\r
1145 Create a dynamic page so that Legacy Device boot order\r
1146 can be set for specified device type.\r
1147\r
1148 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1149 @param CallbackData The BMM context data.\r
1150\r
1151\r
1152**/\r
1153VOID\r
1154UpdateSetLegacyDeviceOrderPage (\r
1155 IN UINT16 UpdatePageId,\r
1156 IN BMM_CALLBACK_DATA *CallbackData\r
1157 )\r
1158{\r
e24fc103 1159 LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
5c08e117 1160 BM_MENU_OPTION *OptionMenu;\r
1161 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 1162 EFI_STRING_ID StrRef;\r
1163 EFI_STRING_ID StrRefHelp;\r
1164 BBS_TYPE BbsType;\r
1165 UINTN VarSize;\r
1166 UINTN Pos;\r
1167 UINTN Bit;\r
1168 UINT16 Index;\r
1169 UINT16 Key;\r
1170 CHAR16 String[100];\r
1171 CHAR16 *TypeStr;\r
1172 CHAR16 *TypeStrHelp;\r
1173 UINT16 VarDevOrder;\r
1174 UINT8 *VarData;\r
1175 UINT8 *LegacyOrder;\r
1176 UINT8 *OldData;\r
1177 UINT8 *DisMap;\r
75bf9d0e 1178 VOID *OptionsOpCodeHandle;\r
5c08e117 1179\r
1180 OptionMenu = NULL;\r
1181 Key = 0;\r
1182 StrRef = 0;\r
1183 StrRefHelp = 0;\r
1184 TypeStr = NULL;\r
1185 TypeStrHelp = NULL;\r
1186 BbsType = BBS_FLOPPY;\r
1187 LegacyOrder = NULL;\r
1188 OldData = NULL;\r
1189 DisMap = NULL;\r
1190\r
1191 CallbackData->BmmAskSaveOrNot = TRUE;\r
1192 UpdatePageStart (CallbackData);\r
1193\r
22d1f978 1194 DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
5c08e117 1195\r
5c08e117 1196 //\r
1197 // Create oneof option list\r
1198 //\r
1199 switch (UpdatePageId) {\r
1200 case FORM_SET_FD_ORDER_ID:\r
1201 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1202 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1203 TypeStr = STR_FLOPPY;\r
1204 TypeStrHelp = STR_FLOPPY_HELP;\r
1205 BbsType = BBS_FLOPPY;\r
1206 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1207 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1208 break;\r
1209\r
1210 case FORM_SET_HD_ORDER_ID:\r
1211 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1212 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1213 TypeStr = STR_HARDDISK;\r
1214 TypeStrHelp = STR_HARDDISK_HELP;\r
1215 BbsType = BBS_HARDDISK;\r
1216 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1217 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1218 break;\r
1219\r
1220 case FORM_SET_CD_ORDER_ID:\r
1221 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1222 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1223 TypeStr = STR_CDROM;\r
1224 TypeStrHelp = STR_CDROM_HELP;\r
1225 BbsType = BBS_CDROM;\r
1226 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1227 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1228 break;\r
1229\r
1230 case FORM_SET_NET_ORDER_ID:\r
1231 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1232 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1233 TypeStr = STR_NET;\r
1234 TypeStrHelp = STR_NET_HELP;\r
1235 BbsType = BBS_EMBED_NETWORK;\r
1236 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1237 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1238 break;\r
1239\r
1240 case FORM_SET_BEV_ORDER_ID:\r
1241 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1242 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1243 TypeStr = STR_BEV;\r
1244 TypeStrHelp = STR_BEV_HELP;\r
1245 BbsType = BBS_BEV_DEVICE;\r
1246 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1247 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1248 break;\r
1249\r
1250 default:\r
1251 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
1252 return;\r
1253 }\r
1254\r
1255 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1256\r
75bf9d0e
LG
1257 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1258 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 1259\r
1260 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1261 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
b1620d0b 1262 //\r
22d1f978 1263 // Create OneOf for each legacy device\r
b1620d0b 1264 //\r
75bf9d0e
LG
1265 HiiCreateOneOfOptionOpCode (\r
1266 OptionsOpCodeHandle,\r
1267 NewMenuEntry->DisplayStringToken,\r
22d1f978 1268 0,\r
b452ca89 1269 EFI_IFR_TYPE_NUM_SIZE_8,\r
22d1f978 1270 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
75bf9d0e 1271 );\r
5c08e117 1272 }\r
75bf9d0e 1273\r
5c08e117 1274 //\r
22d1f978 1275 // Create OneOf for item "Disabled"\r
5c08e117 1276 //\r
75bf9d0e
LG
1277 HiiCreateOneOfOptionOpCode (\r
1278 OptionsOpCodeHandle,\r
1279 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1280 0,\r
b452ca89 1281 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1282 0xFF\r
1283 );\r
5c08e117 1284\r
1285 //\r
1286 // Get Device Order from variable\r
1287 //\r
1288 VarData = BdsLibGetVariableAndSize (\r
1289 VAR_LEGACY_DEV_ORDER,\r
e24fc103 1290 &gEfiLegacyDevOrderVariableGuid,\r
5c08e117 1291 &VarSize\r
1292 );\r
1293\r
1294 if (NULL != VarData) {\r
e24fc103 1295 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1296 while (VarData < VarData + VarSize) {\r
1297 if (DevOrder->BbsType == BbsType) {\r
1298 break;\r
1299 }\r
1300\r
1a45b15e 1301 VarData = (UINT8 *)((UINTN)VarData + sizeof (BBS_TYPE));\r
5c08e117 1302 VarData += *(UINT16 *) VarData;\r
e24fc103 1303 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1304 }\r
1305 //\r
1306 // Create oneof tag here for FD/HD/CD #1 #2\r
1307 //\r
1308 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1309 //\r
1310 // Create the string for oneof tag\r
1311 //\r
1312 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
cb7d01c0 1313 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1314\r
1315 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
cb7d01c0 1316 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1317\r
75bf9d0e
LG
1318 HiiCreateOneOfOpCode (\r
1319 mStartOpCodeHandle,\r
5c08e117 1320 (EFI_QUESTION_ID) (Key + Index),\r
1321 VARSTORE_ID_BOOT_MAINT,\r
1322 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1323 StrRef,\r
1324 StrRefHelp,\r
1325 EFI_IFR_FLAG_CALLBACK,\r
1326 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1327 OptionsOpCodeHandle,\r
1328 NULL\r
5c08e117 1329 );\r
1330\r
1a45b15e 1331 VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
5c08e117 1332\r
1333 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1334 LegacyOrder[Index] = 0xFF;\r
1335 Pos = (VarDevOrder & 0xFF) / 8;\r
1336 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1337 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1338 } else {\r
1339 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1340 }\r
1341 }\r
1342 }\r
1343\r
1344 CopyMem (OldData, LegacyOrder, 100);\r
1345\r
75bf9d0e 1346 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1347\r
1348 UpdatePageEnd (CallbackData);\r
1349}\r
1350\r
be9304f3 1351\r
5c08e117 1352/**\r
1353 Dispatch the display to the next page based on NewPageId.\r
1354\r
1355 @param Private The BMM context data.\r
1356 @param NewPageId The original page ID.\r
1357\r
1358**/\r
1359VOID\r
1360UpdatePageId (\r
1361 BMM_CALLBACK_DATA *Private,\r
1362 UINT16 NewPageId\r
1363 )\r
1364{\r
8acb3f7b
ED
1365 //\r
1366 // For the question don't impact the page update, just ignore it.\r
1367 //\r
1368 if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
1369 ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
1370 return;\r
1371 }\r
1372\r
5c08e117 1373 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1374 //\r
1375 // If we select a handle to add driver option, advance to the add handle description page.\r
1376 //\r
1377 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1378 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1379 //\r
1380 // Return to main page after "Save Changes" or "Discard Changes".\r
1381 //\r
1382 NewPageId = FORM_MAIN_ID;\r
1383 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1384 NewPageId = FORM_CON_COM_SETUP_ID;\r
1385 }\r
1386\r
1387 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1388 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1389 Private->BmmCurrentPageId = NewPageId;\r
1390 }\r
1391}\r