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