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