2 Variable operation that will be used by bootmaint
4 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "BootMaintenanceManager.h"
18 Delete Boot Option that represent a Deleted state in BootOptionMenu.
19 After deleting this boot option, call Var_ChangeBootOrder to
20 make sure BootOrder is in valid state.
22 @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
23 BM_LOAD_CONTEXT marked for deletion is deleted.
24 @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.
25 @return Others If failed to update the "BootOrder" variable after deletion.
33 BM_MENU_ENTRY
*NewMenuEntry
;
34 BM_LOAD_CONTEXT
*NewLoadContext
;
35 UINT16 BootString
[10];
42 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
43 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, (Index
- Index2
));
44 if (NULL
== NewMenuEntry
) {
48 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
49 if (!NewLoadContext
->Deleted
) {
57 NewMenuEntry
->OptionNumber
60 EfiLibDeleteVariable (BootString
, &gEfiGlobalVariableGuid
);
63 // If current Load Option is the same as BootNext,
64 // must delete BootNext in order to make sure
65 // there will be no panic on next boot
67 if (NewLoadContext
->IsBootNext
) {
68 EfiLibDeleteVariable (L
"BootNext", &gEfiGlobalVariableGuid
);
71 RemoveEntryList (&NewMenuEntry
->Link
);
72 BOpt_DestroyMenuEntry (NewMenuEntry
);
76 BootOptionMenu
.MenuNumber
-= Index2
;
78 Status
= Var_ChangeBootOrder ();
83 After any operation on Boot####, there will be a discrepancy in BootOrder.
84 Since some are missing but in BootOrder, while some are present but are
85 not reflected by BootOrder. Then a function rebuild BootOrder from
86 scratch by content from BootOptionMenu is needed.
91 @retval EFI_SUCCESS The boot order is updated successfully.
92 @return EFI_STATUS other than EFI_SUCCESS if failed to
93 Set the "BootOrder" EFI Variable.
103 BM_MENU_ENTRY
*NewMenuEntry
;
104 UINT16
*BootOrderList
;
105 UINT16
*BootOrderListPtr
;
106 UINTN BootOrderListSize
;
109 BootOrderList
= NULL
;
110 BootOrderListSize
= 0;
112 // First check whether BootOrder is present in current configuration
114 GetEfiGlobalVariable2 (L
"BootOrder", (VOID
**) &BootOrderList
, &BootOrderListSize
);
117 // If exists, delete it to hold new BootOrder
119 if (BootOrderList
!= NULL
) {
120 EfiLibDeleteVariable (L
"BootOrder", &gEfiGlobalVariableGuid
);
121 FreePool (BootOrderList
);
122 BootOrderList
= NULL
;
125 // Maybe here should be some check method to ensure that
126 // no new added boot options will be added
127 // but the setup engine now will give only one callback
128 // that is to say, user are granted only one chance to
129 // decide whether the boot option will be added or not
130 // there should be no indictor to show whether this
131 // is a "new" boot option
133 BootOrderListSize
= BootOptionMenu
.MenuNumber
;
135 if (BootOrderListSize
> 0) {
136 BootOrderList
= AllocateZeroPool (BootOrderListSize
* sizeof (UINT16
));
137 ASSERT (BootOrderList
!= NULL
);
138 BootOrderListPtr
= BootOrderList
;
141 // Get all current used Boot#### from BootOptionMenu.
142 // OptionNumber in each BM_LOAD_OPTION is really its
145 for (Index
= 0; Index
< BootOrderListSize
; Index
++) {
146 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
147 *BootOrderList
= (UINT16
) NewMenuEntry
->OptionNumber
;
151 BootOrderList
= BootOrderListPtr
;
154 // After building the BootOrderList, write it back
156 Status
= gRT
->SetVariable (
158 &gEfiGlobalVariableGuid
,
160 BootOrderListSize
* sizeof (UINT16
),
163 if (EFI_ERROR (Status
)) {
171 Delete Load Option that represent a Deleted state in BootOptionMenu.
172 After deleting this Driver option, call Var_ChangeDriverOrder to
173 make sure DriverOrder is in valid state.
175 @retval EFI_SUCCESS Load Option is successfully updated.
176 @retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.
177 @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI
182 Var_DelDriverOption (
186 BM_MENU_ENTRY
*NewMenuEntry
;
187 BM_LOAD_CONTEXT
*NewLoadContext
;
188 UINT16 DriverString
[12];
193 Status
= EFI_SUCCESS
;
195 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
196 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, (Index
- Index2
));
197 if (NULL
== NewMenuEntry
) {
198 return EFI_NOT_FOUND
;
201 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
202 if (!NewLoadContext
->Deleted
) {
208 sizeof (DriverString
),
210 NewMenuEntry
->OptionNumber
213 EfiLibDeleteVariable (DriverString
, &gEfiGlobalVariableGuid
);
216 RemoveEntryList (&NewMenuEntry
->Link
);
217 BOpt_DestroyMenuEntry (NewMenuEntry
);
221 DriverOptionMenu
.MenuNumber
-= Index2
;
223 Status
= Var_ChangeDriverOrder ();
228 After any operation on Driver####, there will be a discrepancy in
229 DriverOrder. Since some are missing but in DriverOrder, while some
230 are present but are not reflected by DriverOrder. Then a function
231 rebuild DriverOrder from scratch by content from DriverOptionMenu is
234 @retval EFI_SUCCESS The driver order is updated successfully.
235 @return Other status than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.
239 Var_ChangeDriverOrder (
244 BM_MENU_ENTRY
*NewMenuEntry
;
245 UINT16
*DriverOrderList
;
246 UINT16
*DriverOrderListPtr
;
247 UINTN DriverOrderListSize
;
250 DriverOrderList
= NULL
;
251 DriverOrderListSize
= 0;
254 // First check whether DriverOrder is present in current configuration
256 GetEfiGlobalVariable2 (L
"DriverOrder", (VOID
**) &DriverOrderList
, &DriverOrderListSize
);
258 // If exists, delete it to hold new DriverOrder
260 if (DriverOrderList
!= NULL
) {
261 EfiLibDeleteVariable (L
"DriverOrder", &gEfiGlobalVariableGuid
);
262 FreePool (DriverOrderList
);
263 DriverOrderList
= NULL
;
266 DriverOrderListSize
= DriverOptionMenu
.MenuNumber
;
268 if (DriverOrderListSize
> 0) {
269 DriverOrderList
= AllocateZeroPool (DriverOrderListSize
* sizeof (UINT16
));
270 ASSERT (DriverOrderList
!= NULL
);
271 DriverOrderListPtr
= DriverOrderList
;
274 // Get all current used Driver#### from DriverOptionMenu.
275 // OptionNumber in each BM_LOAD_OPTION is really its
278 for (Index
= 0; Index
< DriverOrderListSize
; Index
++) {
279 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
280 *DriverOrderList
= (UINT16
) NewMenuEntry
->OptionNumber
;
284 DriverOrderList
= DriverOrderListPtr
;
287 // After building the DriverOrderList, write it back
289 Status
= gRT
->SetVariable (
291 &gEfiGlobalVariableGuid
,
293 DriverOrderListSize
* sizeof (UINT16
),
296 if (EFI_ERROR (Status
)) {
304 Update the device path of "ConOut", "ConIn" and "ErrOut"
305 based on the new BaudRate, Data Bits, parity and Stop Bits
310 Var_UpdateAllConsoleOption (
314 EFI_DEVICE_PATH_PROTOCOL
*OutDevicePath
;
315 EFI_DEVICE_PATH_PROTOCOL
*InpDevicePath
;
316 EFI_DEVICE_PATH_PROTOCOL
*ErrDevicePath
;
319 GetEfiGlobalVariable2 (L
"ConOut", (VOID
**)&OutDevicePath
, NULL
);
320 GetEfiGlobalVariable2 (L
"ConIn", (VOID
**)&InpDevicePath
, NULL
);
321 GetEfiGlobalVariable2 (L
"ErrOut", (VOID
**)&ErrDevicePath
, NULL
);
322 if (OutDevicePath
!= NULL
) {
323 ChangeVariableDevicePath (OutDevicePath
);
324 Status
= gRT
->SetVariable (
326 &gEfiGlobalVariableGuid
,
328 GetDevicePathSize (OutDevicePath
),
331 ASSERT (!EFI_ERROR (Status
));
334 if (InpDevicePath
!= NULL
) {
335 ChangeVariableDevicePath (InpDevicePath
);
336 Status
= gRT
->SetVariable (
338 &gEfiGlobalVariableGuid
,
340 GetDevicePathSize (InpDevicePath
),
343 ASSERT (!EFI_ERROR (Status
));
346 if (ErrDevicePath
!= NULL
) {
347 ChangeVariableDevicePath (ErrDevicePath
);
348 Status
= gRT
->SetVariable (
350 &gEfiGlobalVariableGuid
,
352 GetDevicePathSize (ErrDevicePath
),
355 ASSERT (!EFI_ERROR (Status
));
360 This function delete and build multi-instance device path for
361 specified type of console device.
363 This function clear the EFI variable defined by ConsoleName and
364 gEfiGlobalVariableGuid. It then build the multi-instance device
365 path by appending the device path of the Console (In/Out/Err) instance
366 in ConsoleMenu. Then it scan all corresponding console device by
367 scanning Terminal (built from device supporting Serial I/O instances)
368 devices in TerminalMenu. At last, it save a EFI variable specifed
369 by ConsoleName and gEfiGlobalVariableGuid.
371 @param ConsoleName The name for the console device type. They are
372 usually "ConIn", "ConOut" and "ErrOut".
373 @param ConsoleMenu The console memu which is a list of console devices.
374 @param UpdatePageId The flag specifying which type of console device
377 @retval EFI_SUCCESS The function complete successfully.
378 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
382 Var_UpdateConsoleOption (
383 IN UINT16
*ConsoleName
,
384 IN BM_MENU_OPTION
*ConsoleMenu
,
385 IN UINT16 UpdatePageId
388 EFI_DEVICE_PATH_PROTOCOL
*ConDevicePath
;
389 BM_MENU_ENTRY
*NewMenuEntry
;
390 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
391 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
393 VENDOR_DEVICE_PATH Vendor
;
394 EFI_DEVICE_PATH_PROTOCOL
*TerminalDevicePath
;
397 GetEfiGlobalVariable2 (ConsoleName
, (VOID
**)&ConDevicePath
, NULL
);
398 if (ConDevicePath
!= NULL
) {
399 EfiLibDeleteVariable (ConsoleName
, &gEfiGlobalVariableGuid
);
400 FreePool (ConDevicePath
);
401 ConDevicePath
= NULL
;
405 // First add all console input device from console input menu
407 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
408 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
410 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
411 if (NewConsoleContext
->IsActive
) {
412 ConDevicePath
= AppendDevicePathInstance (
414 NewConsoleContext
->DevicePath
419 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
420 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
422 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
423 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
424 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
425 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
427 Vendor
.Header
.Type
= MESSAGING_DEVICE_PATH
;
428 Vendor
.Header
.SubType
= MSG_VENDOR_DP
;
430 ASSERT (NewTerminalContext
->TerminalType
< (sizeof (TerminalTypeGuid
) / sizeof (TerminalTypeGuid
[0])));
433 &TerminalTypeGuid
[NewTerminalContext
->TerminalType
],
436 SetDevicePathNodeLength (&Vendor
.Header
, sizeof (VENDOR_DEVICE_PATH
));
437 TerminalDevicePath
= AppendDevicePathNode (
438 NewTerminalContext
->DevicePath
,
439 (EFI_DEVICE_PATH_PROTOCOL
*) &Vendor
441 ASSERT (TerminalDevicePath
!= NULL
);
442 ChangeTerminalDevicePath (TerminalDevicePath
, TRUE
);
443 ConDevicePath
= AppendDevicePathInstance (
450 if (ConDevicePath
!= NULL
) {
451 Status
= gRT
->SetVariable (
453 &gEfiGlobalVariableGuid
,
455 GetDevicePathSize (ConDevicePath
),
458 if (EFI_ERROR (Status
)) {
468 This function delete and build multi-instance device path ConIn
471 @retval EFI_SUCCESS The function complete successfully.
472 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
475 Var_UpdateConsoleInpOption (
479 return Var_UpdateConsoleOption (L
"ConIn", &ConsoleInpMenu
, FORM_CON_IN_ID
);
483 This function delete and build multi-instance device path ConOut
486 @retval EFI_SUCCESS The function complete successfully.
487 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
490 Var_UpdateConsoleOutOption (
494 return Var_UpdateConsoleOption (L
"ConOut", &ConsoleOutMenu
, FORM_CON_OUT_ID
);
498 This function delete and build multi-instance device path ErrOut
501 @retval EFI_SUCCESS The function complete successfully.
502 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
505 Var_UpdateErrorOutOption (
509 return Var_UpdateConsoleOption (L
"ErrOut", &ConsoleErrMenu
, FORM_CON_ERR_ID
);
513 This function create a currently loaded Drive Option from
514 the BMM. It then appends this Driver Option to the end of
515 the "DriverOrder" list. It append this Driver Opotion to the end
518 @param CallbackData The BMM context data.
519 @param HiiHandle The HII handle associated with the BMM formset.
520 @param DescriptionData The description of this driver option.
521 @param OptionalData The optional load option.
522 @param ForceReconnect If to force reconnect.
524 @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.
525 @retval EFI_SUCCESS If function completes successfully.
529 Var_UpdateDriverOption (
530 IN BMM_CALLBACK_DATA
*CallbackData
,
531 IN EFI_HII_HANDLE HiiHandle
,
532 IN UINT16
*DescriptionData
,
533 IN UINT16
*OptionalData
,
534 IN UINT8 ForceReconnect
538 UINT16 DriverString
[12];
539 BM_MENU_ENTRY
*NewMenuEntry
;
540 BM_LOAD_CONTEXT
*NewLoadContext
;
541 BOOLEAN OptionalDataExist
;
543 EFI_BOOT_MANAGER_LOAD_OPTION LoadOption
;
544 UINT8
*OptionalDesData
;
545 UINT32 OptionalDataSize
;
547 OptionalDataExist
= FALSE
;
548 OptionalDesData
= NULL
;
549 OptionalDataSize
= 0;
551 Index
= BOpt_GetDriverOptionNumber ();
554 sizeof (DriverString
),
559 if (*DescriptionData
== 0x0000) {
560 StrCpyS (DescriptionData
, MAX_MENU_NUMBER
, DriverString
);
563 if (*OptionalData
!= 0x0000) {
564 OptionalDataExist
= TRUE
;
565 OptionalDesData
= (UINT8
*)OptionalData
;
566 OptionalDataSize
= (UINT32
)StrSize (OptionalData
);
569 NewMenuEntry
= BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT
);
570 if (NULL
== NewMenuEntry
) {
571 return EFI_OUT_OF_RESOURCES
;
574 Status
= EfiBootManagerInitializeLoadOption (
577 LoadOptionTypeDriver
,
578 LOAD_OPTION_ACTIVE
| (ForceReconnect
<< 1),
580 CallbackData
->LoadContext
->FilePathList
,
584 if (!EFI_ERROR (Status
)){
585 Status
= EfiBootManagerAddLoadOptionVariable (&LoadOption
,(UINTN
) -1 );
588 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
589 NewLoadContext
->Deleted
= FALSE
;
590 NewLoadContext
->Attributes
= LoadOption
.Attributes
;
591 NewLoadContext
->FilePathListLength
= (UINT16
)GetDevicePathSize (LoadOption
.FilePath
);
593 NewLoadContext
->Description
= AllocateZeroPool (StrSize (DescriptionData
));
594 ASSERT (NewLoadContext
->Description
!= NULL
);
595 NewMenuEntry
->DisplayString
= NewLoadContext
->Description
;
597 NewLoadContext
->Description
,
598 LoadOption
.Description
,
599 StrSize (DescriptionData
)
602 NewLoadContext
->FilePathList
= AllocateZeroPool (GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
));
603 ASSERT (NewLoadContext
->FilePathList
!= NULL
);
605 NewLoadContext
->FilePathList
,
607 GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
)
610 NewMenuEntry
->HelpString
= UiDevicePathToStr (NewLoadContext
->FilePathList
);
611 NewMenuEntry
->OptionNumber
= Index
;
612 NewMenuEntry
->DisplayStringToken
= HiiSetString (HiiHandle
, 0, NewMenuEntry
->DisplayString
, NULL
);
613 NewMenuEntry
->HelpStringToken
= HiiSetString (HiiHandle
, 0, NewMenuEntry
->HelpString
, NULL
);
615 if (OptionalDataExist
) {
616 NewLoadContext
->OptionalData
= AllocateZeroPool (LoadOption
.OptionalDataSize
);
618 NewLoadContext
->OptionalData
,
619 LoadOption
.OptionalData
,
620 LoadOption
.OptionalDataSize
624 InsertTailList (&DriverOptionMenu
.Head
, &NewMenuEntry
->Link
);
625 DriverOptionMenu
.MenuNumber
++;
627 EfiBootManagerFreeLoadOption(&LoadOption
);
633 This function create a currently loaded Boot Option from
634 the BMM. It then appends this Boot Option to the end of
635 the "BootOrder" list. It also append this Boot Opotion to the end
638 @param CallbackData The BMM context data.
640 @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.
641 @retval EFI_SUCCESS If function completes successfully.
645 Var_UpdateBootOption (
646 IN BMM_CALLBACK_DATA
*CallbackData
649 UINT16 BootString
[10];
651 BM_MENU_ENTRY
*NewMenuEntry
;
652 BM_LOAD_CONTEXT
*NewLoadContext
;
653 BOOLEAN OptionalDataExist
;
655 BMM_FAKE_NV_DATA
*NvRamMap
;
656 EFI_BOOT_MANAGER_LOAD_OPTION LoadOption
;
658 UINT32 OptionalDataSize
;
660 OptionalDataExist
= FALSE
;
661 NvRamMap
= &CallbackData
->BmmFakeNvData
;
663 OptionalDataSize
= 0;
665 Index
= BOpt_GetBootOptionNumber () ;
666 UnicodeSPrint (BootString
, sizeof (BootString
), L
"Boot%04x", Index
);
668 if (NvRamMap
->BootDescriptionData
[0] == 0x0000) {
669 StrCpyS (NvRamMap
->BootDescriptionData
, sizeof (NvRamMap
->BootDescriptionData
) / sizeof (NvRamMap
->BootDescriptionData
[0]), BootString
);
672 if (NvRamMap
->BootOptionalData
[0] != 0x0000) {
673 OptionalDataExist
= TRUE
;
674 OptionalData
= (UINT8
*)NvRamMap
->BootOptionalData
;
675 OptionalDataSize
= (UINT32
)StrSize (NvRamMap
->BootOptionalData
);
678 NewMenuEntry
= BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT
);
679 if (NULL
== NewMenuEntry
) {
680 return EFI_OUT_OF_RESOURCES
;
683 Status
= EfiBootManagerInitializeLoadOption (
688 NvRamMap
->BootDescriptionData
,
689 CallbackData
->LoadContext
->FilePathList
,
693 if (!EFI_ERROR (Status
)){
694 Status
= EfiBootManagerAddLoadOptionVariable (&LoadOption
,(UINTN
) -1 );
697 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
698 NewLoadContext
->Deleted
= FALSE
;
699 NewLoadContext
->Attributes
= LoadOption
.Attributes
;
700 NewLoadContext
->FilePathListLength
= (UINT16
) GetDevicePathSize (LoadOption
.FilePath
);
702 NewLoadContext
->Description
= AllocateZeroPool (StrSize (NvRamMap
->BootDescriptionData
));
703 ASSERT (NewLoadContext
->Description
!= NULL
);
705 NewMenuEntry
->DisplayString
= NewLoadContext
->Description
;
708 NewLoadContext
->Description
,
709 LoadOption
.Description
,
710 StrSize (NvRamMap
->BootDescriptionData
)
713 NewLoadContext
->FilePathList
= AllocateZeroPool (GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
));
714 ASSERT (NewLoadContext
->FilePathList
!= NULL
);
716 NewLoadContext
->FilePathList
,
718 GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
)
721 NewMenuEntry
->HelpString
= UiDevicePathToStr (NewLoadContext
->FilePathList
);
722 NewMenuEntry
->OptionNumber
= Index
;
723 NewMenuEntry
->DisplayStringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, NewMenuEntry
->DisplayString
, NULL
);
724 NewMenuEntry
->HelpStringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, NewMenuEntry
->HelpString
, NULL
);
726 if (OptionalDataExist
) {
727 NewLoadContext
->OptionalData
= AllocateZeroPool (LoadOption
.OptionalDataSize
);
729 NewLoadContext
->OptionalData
,
730 LoadOption
.OptionalData
,
731 LoadOption
.OptionalDataSize
735 InsertTailList (&BootOptionMenu
.Head
, &NewMenuEntry
->Link
);
736 BootOptionMenu
.MenuNumber
++;
738 EfiBootManagerFreeLoadOption(&LoadOption
);
744 This function update the "BootNext" EFI Variable. If there is
745 no "BootNext" specified in BMM, this EFI Variable is deleted.
746 It also update the BMM context data specified the "BootNext"
749 @param CallbackData The BMM context data.
751 @retval EFI_SUCCESS The function complete successfully.
752 @return The EFI variable can be saved. See gRT->SetVariable
753 for detail return information.
758 IN BMM_CALLBACK_DATA
*CallbackData
761 BM_MENU_ENTRY
*NewMenuEntry
;
762 BM_LOAD_CONTEXT
*NewLoadContext
;
763 BMM_FAKE_NV_DATA
*CurrentFakeNVMap
;
767 Status
= EFI_SUCCESS
;
768 CurrentFakeNVMap
= &CallbackData
->BmmFakeNvData
;
769 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
770 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
771 ASSERT (NULL
!= NewMenuEntry
);
773 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
774 NewLoadContext
->IsBootNext
= FALSE
;
777 if (CurrentFakeNVMap
->BootNext
== NONE_BOOTNEXT_VALUE
) {
778 EfiLibDeleteVariable (L
"BootNext", &gEfiGlobalVariableGuid
);
782 NewMenuEntry
= BOpt_GetMenuEntry (
784 CurrentFakeNVMap
->BootNext
786 ASSERT (NewMenuEntry
!= NULL
);
788 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
789 Status
= gRT
->SetVariable (
791 &gEfiGlobalVariableGuid
,
794 &NewMenuEntry
->OptionNumber
796 NewLoadContext
->IsBootNext
= TRUE
;
797 CallbackData
->BmmOldFakeNVData
.BootNext
= CurrentFakeNVMap
->BootNext
;
802 This function update the "BootOrder" EFI Variable based on
803 BMM Formset's NV map. It then refresh BootOptionMenu
804 with the new "BootOrder" list.
806 @param CallbackData The BMM context data.
808 @retval EFI_SUCCESS The function complete successfully.
809 @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.
810 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
814 Var_UpdateBootOrder (
815 IN BMM_CALLBACK_DATA
*CallbackData
826 // First check whether BootOrder is present in current configuration
828 GetEfiGlobalVariable2 (L
"BootOrder", (VOID
**) &BootOrder
, &BootOrderSize
);
829 if (BootOrder
== NULL
) {
830 return EFI_OUT_OF_RESOURCES
;
833 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
[0])));
836 // OptionOrder is subset of BootOrder
838 for (OrderIndex
= 0; (OrderIndex
< BootOptionMenu
.MenuNumber
) && (CallbackData
->BmmFakeNvData
.BootOptionOrder
[OrderIndex
] != 0); OrderIndex
++) {
839 for (Index
= OrderIndex
; Index
< BootOrderSize
/ sizeof (UINT16
); Index
++) {
840 if ((BootOrder
[Index
] == (UINT16
) (CallbackData
->BmmFakeNvData
.BootOptionOrder
[OrderIndex
] - 1)) && (OrderIndex
!= Index
)) {
841 OptionNumber
= BootOrder
[Index
];
842 CopyMem (&BootOrder
[OrderIndex
+ 1], &BootOrder
[OrderIndex
], (Index
- OrderIndex
) * sizeof (UINT16
));
843 BootOrder
[OrderIndex
] = OptionNumber
;
848 Status
= gRT
->SetVariable (
850 &gEfiGlobalVariableGuid
,
855 FreePool (BootOrder
);
857 BOpt_FreeMenu (&BootOptionMenu
);
858 BOpt_GetBootOptions (CallbackData
);
865 This function update the "DriverOrder" EFI Variable based on
866 BMM Formset's NV map. It then refresh DriverOptionMenu
867 with the new "DriverOrder" list.
869 @param CallbackData The BMM context data.
871 @retval EFI_SUCCESS The function complete successfully.
872 @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.
873 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
877 Var_UpdateDriverOrder (
878 IN BMM_CALLBACK_DATA
*CallbackData
883 UINT16
*DriverOrderList
;
884 UINT16
*NewDriverOrderList
;
885 UINTN DriverOrderListSize
;
887 DriverOrderList
= NULL
;
888 DriverOrderListSize
= 0;
891 // First check whether DriverOrder is present in current configuration
893 GetEfiGlobalVariable2 (L
"DriverOrder", (VOID
**) &DriverOrderList
, &DriverOrderListSize
);
894 NewDriverOrderList
= AllocateZeroPool (DriverOrderListSize
);
896 if (NewDriverOrderList
== NULL
) {
897 return EFI_OUT_OF_RESOURCES
;
900 // If exists, delete it to hold new DriverOrder
902 if (DriverOrderList
!= NULL
) {
903 EfiLibDeleteVariable (L
"DriverOrder", &gEfiGlobalVariableGuid
);
904 FreePool (DriverOrderList
);
907 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
[0])));
908 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
909 NewDriverOrderList
[Index
] = (UINT16
) (CallbackData
->BmmFakeNvData
.DriverOptionOrder
[Index
] - 1);
912 Status
= gRT
->SetVariable (
914 &gEfiGlobalVariableGuid
,
919 if (EFI_ERROR (Status
)) {
923 BOpt_FreeMenu (&DriverOptionMenu
);
924 BOpt_GetDriverOptions (CallbackData
);
929 Update the Text Mode of Console.
931 @param CallbackData The context data for BMM.
933 @retval EFI_SUCCSS If the Text Mode of Console is updated.
934 @return Other value if the Text Mode of Console is not updated.
939 IN BMM_CALLBACK_DATA
*CallbackData
944 CONSOLE_OUT_MODE ModeInfo
;
946 Mode
= CallbackData
->BmmFakeNvData
.ConsoleOutMode
;
948 Status
= gST
->ConOut
->QueryMode (gST
->ConOut
, Mode
, &(ModeInfo
.Column
), &(ModeInfo
.Row
));
949 if (!EFI_ERROR(Status
)) {
950 Status
= PcdSet32S (PcdSetupConOutColumn
, (UINT32
) ModeInfo
.Column
);
951 if (!EFI_ERROR (Status
)) {
952 Status
= PcdSet32S (PcdSetupConOutRow
, (UINT32
) ModeInfo
.Row
);