mirror of https://github.com/acidanthera/audk.git
Fix Boot Option appear twice while add a new boot option in some specific steps.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9738 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
173eeac9eb
commit
a5c3c546ea
|
@ -591,6 +591,20 @@ BOpt_IsEfiApp (
|
|||
|
||||
Get the Option Number that has not been allocated for use.
|
||||
|
||||
@param Type The type of Option.
|
||||
|
||||
@return The available Option Number.
|
||||
|
||||
**/
|
||||
UINT16
|
||||
BOpt_GetOptionNumber (
|
||||
CHAR16 *Type
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
Get the Option Number for Boot#### that does not used.
|
||||
|
||||
@return The available Option Number.
|
||||
|
||||
**/
|
||||
|
@ -601,9 +615,9 @@ BOpt_GetBootOptionNumber (
|
|||
|
||||
/**
|
||||
|
||||
Get the Option Number that is not in use.
|
||||
Get the Option Number for Driver#### that does not used.
|
||||
|
||||
@return The unused Option Number.
|
||||
@return The unused Option Number.
|
||||
|
||||
**/
|
||||
UINT16
|
||||
|
|
|
@ -1407,6 +1407,70 @@ BOpt_FindDrivers (
|
|||
|
||||
Get the Option Number that has not been allocated for use.
|
||||
|
||||
@param Type The type of Option.
|
||||
|
||||
@return The available Option Number.
|
||||
|
||||
**/
|
||||
UINT16
|
||||
BOpt_GetOptionNumber (
|
||||
CHAR16 *Type
|
||||
)
|
||||
{
|
||||
UINT16 *OrderList;
|
||||
UINTN OrderListSize;
|
||||
UINTN Index;
|
||||
CHAR16 StrTemp[20];
|
||||
UINT16 *OptionBuffer;
|
||||
UINT16 OptionNumber;
|
||||
UINTN OptionSize;
|
||||
|
||||
OrderListSize = 0;
|
||||
OrderList = NULL;
|
||||
OptionNumber = 0;
|
||||
|
||||
UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type);
|
||||
|
||||
OrderList = BdsLibGetVariableAndSize (
|
||||
StrTemp,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&OrderListSize
|
||||
);
|
||||
for (OptionNumber = 0; ; OptionNumber++) {
|
||||
for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) {
|
||||
if (OptionNumber == OrderList[Index]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Index < OrderListSize / sizeof (UINT16)) {
|
||||
//
|
||||
// The OptionNumber occurs in the OrderList, continue to use next one
|
||||
//
|
||||
continue;
|
||||
}
|
||||
UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber);
|
||||
DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp));
|
||||
OptionBuffer = BdsLibGetVariableAndSize (
|
||||
StrTemp,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&OptionSize
|
||||
);
|
||||
if (NULL == OptionBuffer) {
|
||||
//
|
||||
// The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return OptionNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Get the Option Number for Boot#### that does not used.
|
||||
|
||||
@return The available Option Number.
|
||||
|
||||
**/
|
||||
|
@ -1415,71 +1479,12 @@ BOpt_GetBootOptionNumber (
|
|||
VOID
|
||||
)
|
||||
{
|
||||
BM_MENU_ENTRY *NewMenuEntry;
|
||||
UINT16 *BootOrderList;
|
||||
UINTN BootOrderListSize;
|
||||
UINT16 Number;
|
||||
UINTN Index;
|
||||
UINTN Index2;
|
||||
BOOLEAN Found;
|
||||
CHAR16 StrTemp[100];
|
||||
UINT16 *OptionBuffer;
|
||||
UINTN OptionSize;
|
||||
|
||||
BootOrderListSize = 0;
|
||||
BootOrderList = NULL;
|
||||
|
||||
BootOrderList = BdsLibGetVariableAndSize (
|
||||
L"BootOrder",
|
||||
&gEfiGlobalVariableGuid,
|
||||
&BootOrderListSize
|
||||
);
|
||||
if (BootOrderList != NULL) {
|
||||
//
|
||||
// already have Boot####
|
||||
//
|
||||
// AlreadyBootNumbers = BootOrderListSize / sizeof(UINT16);
|
||||
//
|
||||
for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {
|
||||
Found = TRUE;
|
||||
for (Index2 = 0; Index2 < BootOptionMenu.MenuNumber; Index2++) {
|
||||
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index2);
|
||||
if (Index == NewMenuEntry->OptionNumber) {
|
||||
Found = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
UnicodeSPrint (StrTemp, 100, L"Boot%04x", Index);
|
||||
DEBUG((DEBUG_ERROR,"INdex= %s\n", StrTemp));
|
||||
OptionBuffer = BdsLibGetVariableAndSize (
|
||||
StrTemp,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&OptionSize
|
||||
);
|
||||
if (NULL == OptionBuffer) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// end for Index
|
||||
//
|
||||
Number = (UINT16) Index;
|
||||
} else {
|
||||
//
|
||||
// No Boot####
|
||||
//
|
||||
Number = 0;
|
||||
}
|
||||
|
||||
return Number;
|
||||
return BOpt_GetOptionNumber (L"Boot");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Get the Option Number that is not in use.
|
||||
Get the Option Number for Driver#### that does not used.
|
||||
|
||||
@return The unused Option Number.
|
||||
|
||||
|
@ -1489,54 +1494,7 @@ BOpt_GetDriverOptionNumber (
|
|||
VOID
|
||||
)
|
||||
{
|
||||
BM_MENU_ENTRY *NewMenuEntry;
|
||||
UINT16 *DriverOrderList;
|
||||
UINTN DriverOrderListSize;
|
||||
UINT16 Number;
|
||||
UINTN Index;
|
||||
UINTN Index2;
|
||||
BOOLEAN Found;
|
||||
|
||||
DriverOrderListSize = 0;
|
||||
DriverOrderList = NULL;
|
||||
|
||||
DriverOrderList = BdsLibGetVariableAndSize (
|
||||
L"DriverOrder",
|
||||
&gEfiGlobalVariableGuid,
|
||||
&DriverOrderListSize
|
||||
);
|
||||
if (DriverOrderList != NULL) {
|
||||
//
|
||||
// already have Driver####
|
||||
//
|
||||
// AlreadyDriverNumbers = DriverOrderListSize / sizeof(UINT16);
|
||||
//
|
||||
for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {
|
||||
Found = TRUE;
|
||||
for (Index2 = 0; Index2 < DriverOptionMenu.MenuNumber; Index2++) {
|
||||
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index2);
|
||||
if (Index == NewMenuEntry->OptionNumber) {
|
||||
Found = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
// end for Index
|
||||
//
|
||||
Number = (UINT16) Index;
|
||||
} else {
|
||||
//
|
||||
// No Driver####
|
||||
//
|
||||
Number = 0;
|
||||
}
|
||||
|
||||
return Number;
|
||||
return BOpt_GetOptionNumber (L"Driver");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue