newline added at end
[people/mcb30/edk2.git] / edk2 / EdkUnixPkg / Dxe / PlatformBds / Generic / BootMaint / UpdatePage.c
1 /*++\r
2 \r
3 Copyright (c) 2006, Intel Corporation                                                         \r
4 All rights reserved. This program and the accompanying materials                          \r
5 are licensed and made available under the terms and conditions of the BSD License         \r
6 which accompanies this distribution.  The full text of the license may be found at        \r
7 http://opensource.org/licenses/bsd-license.php                                            \r
8                                                                                           \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
11 \r
12 Module Name:\r
13 \r
14   UpdatePage.c\r
15     \r
16 AgBStract:\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
26 EFI_GUID gTerminalDriverGuid = {\r
27   0x10634d8e, 0x1c05, 0x46cb, {0xbb, 0xc, 0x5a, 0xfd, 0xc8, 0x29, 0xa8, 0xc8}\r
28 };\r
29 \r
30 VOID\r
31 RefreshUpdateData (\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
39 Routine Description:\r
40   Refresh the global UpdateData structure.\r
41 \r
42 Arguments:\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
49 Returns:\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
64 VOID\r
65 UpdatePageStart (\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
93 VOID\r
94 UpdatePageEnd (\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
152 VOID\r
153 CleanUpPage (\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
172 EFI_STATUS\r
173 BootThisFile (\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
182   Status                  = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID**) &Option);\r
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
201 VOID\r
202 UpdateConCOMPage (\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
238 VOID\r
239 UpdateBootDelPage (\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
281 VOID\r
282 UpdateDrvAddHandlePage (\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
314 VOID\r
315 UpdateDrvDelPage (\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
355 VOID\r
356 UpdateDriverAddHandleDescPage (\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
421 VOID\r
422 UpdateConsolePage (\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
502 VOID\r
503 UpdateOrderPage (\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
565 VOID\r
566 UpdateBootNextPage (\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
639 VOID\r
640 UpdateTimeOutPage (\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
675 VOID\r
676 UpdateTerminalPage (\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
915 VOID\r
916 UpdatePageBody (\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
948 VOID *\r
949 GetLegacyBootOptionVar (\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
1024 VOID\r
1025 UpdateSetLegacyDeviceOrderPage (\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
1249 VOID\r
1250 UpdatePageId (\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