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