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