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