mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
MdeModulePkg/BMMUiLib: Replace same logic with API in UefiBootManagerLib
Use the API EfiBootManagerDeleteLoadOptionVariable in UefiBootManagerLib to replace the same logic in function Var_DelBootOption/Var_DelDriverOption. This can make code clean and prevent potential bugs. https://bugzilla.tianocore.org/show_bug.cgi?id=391 Cc: Eric Dong <eric.dong@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com>
This commit is contained in:
parent
31abcf1dc7
commit
bdc8cb0d3b
@ -633,8 +633,6 @@ Var_UpdateBootOption (
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Delete Boot Option that represent a Deleted state in BootOptionMenu.
|
Delete Boot Option that represent a Deleted state in BootOptionMenu.
|
||||||
After deleting this boot option, call Var_ChangeBootOrder to
|
|
||||||
make sure BootOrder is in valid state.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
|
@retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
|
||||||
BM_LOAD_CONTEXT marked for deletion is deleted
|
BM_LOAD_CONTEXT marked for deletion is deleted
|
||||||
@ -646,21 +644,6 @@ Var_DelBootOption (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
After any operation on Boot####, there will be a discrepancy in BootOrder.
|
|
||||||
Since some are missing but in BootOrder, while some are present but are
|
|
||||||
not reflected by BootOrder. Then a function rebuild BootOrder from
|
|
||||||
scratch by content from BootOptionMenu is needed.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The boot order is updated successfully.
|
|
||||||
@return other than EFI_SUCCESS if failed to change the "BootOrder" EFI Variable.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
Var_ChangeBootOrder (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function create a currently loaded Drive Option from
|
This function create a currently loaded Drive Option from
|
||||||
the BMM. It then appends this Driver Option to the end of
|
the BMM. It then appends this Driver Option to the end of
|
||||||
@ -687,9 +670,7 @@ Var_UpdateDriverOption (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Delete Load Option that represent a Deleted state in BootOptionMenu.
|
Delete Load Option that represent a Deleted state in DriverOptionMenu.
|
||||||
After deleting this Driver option, call Var_ChangeDriverOrder to
|
|
||||||
make sure DriverOrder is in valid state.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS Load Option is successfully updated.
|
@retval EFI_SUCCESS Load Option is successfully updated.
|
||||||
@return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI
|
@return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI
|
||||||
@ -701,22 +682,6 @@ Var_DelDriverOption (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
After any operation on Driver####, there will be a discrepancy in
|
|
||||||
DriverOrder. Since some are missing but in DriverOrder, while some
|
|
||||||
are present but are not reflected by DriverOrder. Then a function
|
|
||||||
rebuild DriverOrder from scratch by content from DriverOptionMenu is
|
|
||||||
needed.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The driver order is updated successfully.
|
|
||||||
@return other than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
Var_ChangeDriverOrder (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function delete and build multi-instance device path ConIn
|
This function delete and build multi-instance device path ConIn
|
||||||
console device.
|
console device.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Variable operation that will be used by bootmaint
|
Variable operation that will be used by bootmaint
|
||||||
|
|
||||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -16,8 +16,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Delete Boot Option that represent a Deleted state in BootOptionMenu.
|
Delete Boot Option that represent a Deleted state in BootOptionMenu.
|
||||||
After deleting this boot option, call Var_ChangeBootOrder to
|
|
||||||
make sure BootOrder is in valid state.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
|
@retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
|
||||||
BM_LOAD_CONTEXT marked for deletion is deleted.
|
BM_LOAD_CONTEXT marked for deletion is deleted.
|
||||||
@ -32,12 +30,10 @@ Var_DelBootOption (
|
|||||||
{
|
{
|
||||||
BM_MENU_ENTRY *NewMenuEntry;
|
BM_MENU_ENTRY *NewMenuEntry;
|
||||||
BM_LOAD_CONTEXT *NewLoadContext;
|
BM_LOAD_CONTEXT *NewLoadContext;
|
||||||
UINT16 BootString[10];
|
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN Index2;
|
UINTN Index2;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
Index2 = 0;
|
Index2 = 0;
|
||||||
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
|
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
|
||||||
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));
|
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));
|
||||||
@ -50,14 +46,10 @@ Var_DelBootOption (
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeSPrint (
|
Status = EfiBootManagerDeleteLoadOptionVariable (NewMenuEntry->OptionNumber,LoadOptionTypeBoot);
|
||||||
BootString,
|
if (EFI_ERROR (Status)) {
|
||||||
sizeof (BootString),
|
return Status;
|
||||||
L"Boot%04x",
|
}
|
||||||
NewMenuEntry->OptionNumber
|
|
||||||
);
|
|
||||||
|
|
||||||
EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);
|
|
||||||
Index2++;
|
Index2++;
|
||||||
//
|
//
|
||||||
// If current Load Option is the same as BootNext,
|
// If current Load Option is the same as BootNext,
|
||||||
@ -75,102 +67,11 @@ Var_DelBootOption (
|
|||||||
|
|
||||||
BootOptionMenu.MenuNumber -= Index2;
|
BootOptionMenu.MenuNumber -= Index2;
|
||||||
|
|
||||||
Status = Var_ChangeBootOrder ();
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
After any operation on Boot####, there will be a discrepancy in BootOrder.
|
|
||||||
Since some are missing but in BootOrder, while some are present but are
|
|
||||||
not reflected by BootOrder. Then a function rebuild BootOrder from
|
|
||||||
scratch by content from BootOptionMenu is needed.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The boot order is updated successfully.
|
|
||||||
@return EFI_STATUS other than EFI_SUCCESS if failed to
|
|
||||||
Set the "BootOrder" EFI Variable.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
Var_ChangeBootOrder (
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
|
|
||||||
EFI_STATUS Status;
|
|
||||||
BM_MENU_ENTRY *NewMenuEntry;
|
|
||||||
UINT16 *BootOrderList;
|
|
||||||
UINT16 *BootOrderListPtr;
|
|
||||||
UINTN BootOrderListSize;
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
BootOrderList = NULL;
|
|
||||||
BootOrderListSize = 0;
|
|
||||||
//
|
|
||||||
// First check whether BootOrder is present in current configuration
|
|
||||||
//
|
|
||||||
GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);
|
|
||||||
|
|
||||||
//
|
|
||||||
// If exists, delete it to hold new BootOrder
|
|
||||||
//
|
|
||||||
if (BootOrderList != NULL) {
|
|
||||||
EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);
|
|
||||||
FreePool (BootOrderList);
|
|
||||||
BootOrderList = NULL;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Maybe here should be some check method to ensure that
|
|
||||||
// no new added boot options will be added
|
|
||||||
// but the setup engine now will give only one callback
|
|
||||||
// that is to say, user are granted only one chance to
|
|
||||||
// decide whether the boot option will be added or not
|
|
||||||
// there should be no indictor to show whether this
|
|
||||||
// is a "new" boot option
|
|
||||||
//
|
|
||||||
BootOrderListSize = BootOptionMenu.MenuNumber;
|
|
||||||
|
|
||||||
if (BootOrderListSize > 0) {
|
|
||||||
BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));
|
|
||||||
ASSERT (BootOrderList != NULL);
|
|
||||||
BootOrderListPtr = BootOrderList;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get all current used Boot#### from BootOptionMenu.
|
|
||||||
// OptionNumber in each BM_LOAD_OPTION is really its
|
|
||||||
// #### value.
|
|
||||||
//
|
|
||||||
for (Index = 0; Index < BootOrderListSize; Index++) {
|
|
||||||
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
|
|
||||||
*BootOrderList = (UINT16) NewMenuEntry->OptionNumber;
|
|
||||||
BootOrderList++;
|
|
||||||
}
|
|
||||||
|
|
||||||
BootOrderList = BootOrderListPtr;
|
|
||||||
|
|
||||||
//
|
|
||||||
// After building the BootOrderList, write it back
|
|
||||||
//
|
|
||||||
Status = gRT->SetVariable (
|
|
||||||
L"BootOrder",
|
|
||||||
&gEfiGlobalVariableGuid,
|
|
||||||
VAR_FLAG,
|
|
||||||
BootOrderListSize * sizeof (UINT16),
|
|
||||||
BootOrderList
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Delete Load Option that represent a Deleted state in BootOptionMenu.
|
Delete Load Option that represent a Deleted state in DriverOptionMenu.
|
||||||
After deleting this Driver option, call Var_ChangeDriverOrder to
|
|
||||||
make sure DriverOrder is in valid state.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS Load Option is successfully updated.
|
@retval EFI_SUCCESS Load Option is successfully updated.
|
||||||
@retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.
|
@retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.
|
||||||
@ -185,12 +86,10 @@ Var_DelDriverOption (
|
|||||||
{
|
{
|
||||||
BM_MENU_ENTRY *NewMenuEntry;
|
BM_MENU_ENTRY *NewMenuEntry;
|
||||||
BM_LOAD_CONTEXT *NewLoadContext;
|
BM_LOAD_CONTEXT *NewLoadContext;
|
||||||
UINT16 DriverString[12];
|
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN Index2;
|
UINTN Index2;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
Index2 = 0;
|
Index2 = 0;
|
||||||
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
|
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
|
||||||
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));
|
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));
|
||||||
@ -202,15 +101,11 @@ Var_DelDriverOption (
|
|||||||
if (!NewLoadContext->Deleted) {
|
if (!NewLoadContext->Deleted) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Status = EfiBootManagerDeleteLoadOptionVariable (NewMenuEntry->OptionNumber,LoadOptionTypeDriver);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
UnicodeSPrint (
|
|
||||||
DriverString,
|
|
||||||
sizeof (DriverString),
|
|
||||||
L"Driver%04x",
|
|
||||||
NewMenuEntry->OptionNumber
|
|
||||||
);
|
|
||||||
|
|
||||||
EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);
|
|
||||||
Index2++;
|
Index2++;
|
||||||
|
|
||||||
RemoveEntryList (&NewMenuEntry->Link);
|
RemoveEntryList (&NewMenuEntry->Link);
|
||||||
@ -220,83 +115,6 @@ Var_DelDriverOption (
|
|||||||
|
|
||||||
DriverOptionMenu.MenuNumber -= Index2;
|
DriverOptionMenu.MenuNumber -= Index2;
|
||||||
|
|
||||||
Status = Var_ChangeDriverOrder ();
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
After any operation on Driver####, there will be a discrepancy in
|
|
||||||
DriverOrder. Since some are missing but in DriverOrder, while some
|
|
||||||
are present but are not reflected by DriverOrder. Then a function
|
|
||||||
rebuild DriverOrder from scratch by content from DriverOptionMenu is
|
|
||||||
needed.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The driver order is updated successfully.
|
|
||||||
@return Other status than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
Var_ChangeDriverOrder (
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
BM_MENU_ENTRY *NewMenuEntry;
|
|
||||||
UINT16 *DriverOrderList;
|
|
||||||
UINT16 *DriverOrderListPtr;
|
|
||||||
UINTN DriverOrderListSize;
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
DriverOrderList = NULL;
|
|
||||||
DriverOrderListSize = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
// First check whether DriverOrder is present in current configuration
|
|
||||||
//
|
|
||||||
GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);
|
|
||||||
//
|
|
||||||
// If exists, delete it to hold new DriverOrder
|
|
||||||
//
|
|
||||||
if (DriverOrderList != NULL) {
|
|
||||||
EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);
|
|
||||||
FreePool (DriverOrderList);
|
|
||||||
DriverOrderList = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DriverOrderListSize = DriverOptionMenu.MenuNumber;
|
|
||||||
|
|
||||||
if (DriverOrderListSize > 0) {
|
|
||||||
DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));
|
|
||||||
ASSERT (DriverOrderList != NULL);
|
|
||||||
DriverOrderListPtr = DriverOrderList;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get all current used Driver#### from DriverOptionMenu.
|
|
||||||
// OptionNumber in each BM_LOAD_OPTION is really its
|
|
||||||
// #### value.
|
|
||||||
//
|
|
||||||
for (Index = 0; Index < DriverOrderListSize; Index++) {
|
|
||||||
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
|
|
||||||
*DriverOrderList = (UINT16) NewMenuEntry->OptionNumber;
|
|
||||||
DriverOrderList++;
|
|
||||||
}
|
|
||||||
|
|
||||||
DriverOrderList = DriverOrderListPtr;
|
|
||||||
|
|
||||||
//
|
|
||||||
// After building the DriverOrderList, write it back
|
|
||||||
//
|
|
||||||
Status = gRT->SetVariable (
|
|
||||||
L"DriverOrder",
|
|
||||||
&gEfiGlobalVariableGuid,
|
|
||||||
VAR_FLAG,
|
|
||||||
DriverOrderListSize * sizeof (UINT16),
|
|
||||||
DriverOrderList
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user