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