X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=IntelFrameworkModulePkg%2FUniversal%2FBdsDxe%2FBootMaint%2FBootOption.c;h=c4a0e17f3bf1b21f3dc175570b26618b3a1b2288;hb=16973234fc60a95daf7be32ee89123914fdab3f0;hp=73d36088a5e5f82ae216542582a2e8985125e9c8;hpb=0c16f340a867d1636ef776dae034c48c95720386;p=mirror_edk2.git diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootOption.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootOption.c index 73d36088a5..c4a0e17f3b 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootOption.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootOption.c @@ -5,8 +5,8 @@ Boot option manipulation -Copyright (c) 2004 - 2010, Intel Corporation.
-All rights reserved. This program and the accompanying materials +Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
+This program and the accompanying materials 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 http://opensource.org/licenses/bsd-license.php @@ -370,13 +370,9 @@ BOpt_FindFileSystem ( if (FileContext->Info == NULL) { VolumeLabel = L"NO FILE SYSTEM INFO"; } else { - if (FileContext->Info->VolumeLabel == NULL) { - VolumeLabel = L"NULL VOLUME LABEL"; - } else { - VolumeLabel = FileContext->Info->VolumeLabel; - if (*VolumeLabel == 0x0000) { - VolumeLabel = L"NO VOLUME LABEL"; - } + VolumeLabel = FileContext->Info->VolumeLabel; + if (*VolumeLabel == 0x0000) { + VolumeLabel = L"NO VOLUME LABEL"; } } @@ -529,6 +525,7 @@ BOpt_FreeMenu ( RemoveEntryList (&MenuEntry->Link); BOpt_DestroyMenuEntry (MenuEntry); } + FreeMenu->MenuNumber = 0; } /** @@ -707,7 +704,7 @@ BOpt_GetLegacyOptions ( HDD_INFO *HddInfo; UINT16 BbsCount; BBS_TABLE *BbsTable; - UINTN Index; + UINT16 Index; CHAR16 DescString[100]; UINTN FDNum; UINTN HDNum; @@ -766,8 +763,8 @@ BOpt_GetLegacyOptions ( } NewLegacyDevContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext; - NewLegacyDevContext->BbsTable = &BbsTable[Index]; - NewLegacyDevContext->Index = Index; + NewLegacyDevContext->BbsEntry = &BbsTable[Index]; + NewLegacyDevContext->BbsIndex = Index; NewLegacyDevContext->BbsCount = BbsCount; BdsBuildLegacyDevNameString ( &BbsTable[Index], @@ -775,12 +772,11 @@ BOpt_GetLegacyOptions ( sizeof (DescString), DescString ); - NewLegacyDevContext->Description = AllocateZeroPool (StrSize (DescString)); + NewLegacyDevContext->Description = AllocateCopyPool (StrSize (DescString), DescString); if (NULL == NewLegacyDevContext->Description) { break; } - CopyMem (NewLegacyDevContext->Description, DescString, StrSize (DescString)); NewMenuEntry->DisplayString = NewLegacyDevContext->Description; NewMenuEntry->HelpString = NULL; @@ -876,9 +872,7 @@ BOpt_GetBootOptions ( EFI_DEVICE_PATH_PROTOCOL *DevicePath; UINTN MenuCount; UINT8 *Ptr; - UINTN DevicePathType; - CHAR16 *HiiString; - + MenuCount = 0; BootOrderListSize = 0; BootNextSize = 0; @@ -899,7 +893,7 @@ BOpt_GetBootOptions ( if (BootOrderList == NULL) { return EFI_NOT_FOUND; } - + // // Get the BootNext from the Var // @@ -1013,60 +1007,12 @@ BOpt_GetBootOptions ( NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr; LoadOptionPtr += sizeof (UINT16); - + StringSize = StrSize((UINT16*)LoadOptionPtr); - // - // Get Hii description string according to device path type - // - HiiString = NULL; - DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath); - switch (DevicePathType) { - case BDS_EFI_ACPI_FLOPPY_BOOT: - HiiString = GetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)); - break; - case BDS_EFI_MESSAGE_SATA_BOOT: - case BDS_EFI_MESSAGE_ATAPI_BOOT: - case BDS_EFI_MEDIA_CDROM_BOOT: - HiiString = GetStringById (STRING_TOKEN (STR_DESCRIPTION_DVD)); - break; - case BDS_EFI_MESSAGE_USB_DEVICE_BOOT: - HiiString = GetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)); - break; - case BDS_EFI_MESSAGE_SCSI_BOOT: - HiiString = GetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)); - break; - case BDS_EFI_MESSAGE_MISC_BOOT: - HiiString = GetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)); - break; - case BDS_EFI_MESSAGE_MAC_BOOT: - HiiString = GetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)); - break; - case BBS_DEVICE_PATH: - // - // Do nothing for legacy boot option. - // - break; - default: - DEBUG((EFI_D_INFO, "Can not find HiiString for given device path type 0x%x\n", DevicePathType)); - } - - if (HiiString != NULL) { - NewLoadContext->Description = AllocateZeroPool(StringSize + StrSize(HiiString)); - ASSERT (NewLoadContext->Description != NULL); - StrCpy (NewLoadContext->Description, HiiString); - if (StrnCmp ((UINT16*)LoadOptionPtr, L"0", 1) != 0) { - StrCat (NewLoadContext->Description, L" "); - StrCat (NewLoadContext->Description, (UINT16*)LoadOptionPtr); - } - - FreePool (HiiString); - } else { - NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr)); - ASSERT (NewLoadContext->Description != NULL); - StrCpy (NewLoadContext->Description, (UINT16*)LoadOptionPtr); - } - + + NewLoadContext->Description = AllocateCopyPool (StrSize((UINT16*)LoadOptionPtr), LoadOptionPtr); ASSERT (NewLoadContext->Description != NULL); + NewMenuEntry->DisplayString = NewLoadContext->Description; LoadOptionPtr += StringSize; @@ -1141,6 +1087,7 @@ BOpt_AppendFileName ( { UINTN Size1; UINTN Size2; + UINTN MaxLen; CHAR16 *Str; CHAR16 *TmpStr; CHAR16 *Ptr; @@ -1148,18 +1095,19 @@ BOpt_AppendFileName ( Size1 = StrSize (Str1); Size2 = StrSize (Str2); - Str = AllocateZeroPool (Size1 + Size2 + sizeof (CHAR16)); + MaxLen = (Size1 + Size2 + sizeof (CHAR16)) / sizeof (CHAR16); + Str = AllocateZeroPool (MaxLen * sizeof (CHAR16)); ASSERT (Str != NULL); - TmpStr = AllocateZeroPool (Size1 + Size2 + sizeof (CHAR16)); + TmpStr = AllocateZeroPool (MaxLen * sizeof (CHAR16)); ASSERT (TmpStr != NULL); - StrCat (Str, Str1); + StrCatS (Str, MaxLen, Str1); if (!((*Str == '\\') && (*(Str + 1) == 0))) { - StrCat (Str, L"\\"); + StrCatS (Str, MaxLen, L"\\"); } - StrCat (Str, Str2); + StrCatS (Str, MaxLen, Str2); Ptr = Str; LastSlash = Str; @@ -1172,11 +1120,11 @@ BOpt_AppendFileName ( // // - // Use TmpStr as a backup, as StrCpy in BaseLib does not handle copy of two strings + // Use TmpStr as a backup, as StrCpyS in BaseLib does not handle copy of two strings // that overlap. // - StrCpy (TmpStr, Ptr + 3); - StrCpy (LastSlash, TmpStr); + StrCpyS (TmpStr, MaxLen, Ptr + 3); + StrCpyS (LastSlash, MaxLen - ((UINTN) LastSlash - (UINTN) Str) / sizeof (CHAR16), TmpStr); Ptr = LastSlash; } else if (*Ptr == '\\' && *(Ptr + 1) == '.' && *(Ptr + 2) == '\\') { // @@ -1184,11 +1132,11 @@ BOpt_AppendFileName ( // // - // Use TmpStr as a backup, as StrCpy in BaseLib does not handle copy of two strings + // Use TmpStr as a backup, as StrCpyS in BaseLib does not handle copy of two strings // that overlap. // - StrCpy (TmpStr, Ptr + 2); - StrCpy (Ptr, TmpStr); + StrCpyS (TmpStr, MaxLen, Ptr + 2); + StrCpyS (Ptr, MaxLen - ((UINTN) Ptr - (UINTN) Str) / sizeof (CHAR16), TmpStr); Ptr = LastSlash; } else if (*Ptr == '\\') { LastSlash = Ptr; @@ -1198,7 +1146,7 @@ BOpt_AppendFileName ( } FreePool (TmpStr); - + return Str; } @@ -1244,69 +1192,7 @@ BOpt_IsEfiImageName ( return FALSE; } -/** - - Check whether current FileName point to a valid Efi Application - - @param Dir Pointer to current Directory - @param FileName Pointer to current File name. - - @retval TRUE Is a valid Efi Application - @retval FALSE not a valid Efi Application - -**/ -BOOLEAN -BOpt_IsEfiApp ( - IN EFI_FILE_HANDLE Dir, - IN UINT16 *FileName - ) -{ - UINTN BufferSize; - EFI_IMAGE_DOS_HEADER DosHdr; - UINT16 Subsystem; - EFI_FILE_HANDLE File; - EFI_STATUS Status; - EFI_IMAGE_OPTIONAL_HEADER_UNION PeHdr; - - Status = Dir->Open (Dir, &File, FileName, EFI_FILE_MODE_READ, 0); - - if (EFI_ERROR (Status)) { - return FALSE; - } - - BufferSize = sizeof (EFI_IMAGE_DOS_HEADER); - File->Read (File, &BufferSize, &DosHdr); - if (DosHdr.e_magic != EFI_IMAGE_DOS_SIGNATURE) { - File->Close (File); - return FALSE; - } - - File->SetPosition (File, DosHdr.e_lfanew); - BufferSize = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION); - File->Read (File, &BufferSize, &PeHdr); - if (PeHdr.Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) { - File->Close (File); - return FALSE; - } - // - // Determine PE type and read subsytem - // - if (PeHdr.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { - Subsystem = PeHdr.Pe32.OptionalHeader.Subsystem; - } else if (PeHdr.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) { - Subsystem = PeHdr.Pe32Plus.OptionalHeader.Subsystem; - } else { - return FALSE; - } - if (Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) { - File->Close (File); - return TRUE; - } else { - File->Close (File); - return FALSE; - } -} /** @@ -1407,136 +1293,98 @@ 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_GetBootOptionNumber ( - VOID +BOpt_GetOptionNumber ( + CHAR16 *Type ) { - BM_MENU_ENTRY *NewMenuEntry; - UINT16 *BootOrderList; - UINTN BootOrderListSize; - UINT16 Number; + UINT16 *OrderList; + UINTN OrderListSize; UINTN Index; - UINTN Index2; - BOOLEAN Found; - CHAR16 StrTemp[100]; + CHAR16 StrTemp[20]; UINT16 *OptionBuffer; + UINT16 OptionNumber; UINTN OptionSize; - BootOrderListSize = 0; - BootOrderList = NULL; + OrderListSize = 0; + OrderList = NULL; + OptionNumber = 0; + Index = 0; - 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; - } - } + UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type); - if (Found) { - UnicodeSPrint (StrTemp, 100, L"Boot%04x", Index); - DEBUG((DEBUG_ERROR,"INdex= %s\n", StrTemp)); - OptionBuffer = BdsLibGetVariableAndSize ( + OrderList = BdsLibGetVariableAndSize ( StrTemp, &gEfiGlobalVariableGuid, - &OptionSize + &OrderListSize ); - if (NULL == OptionBuffer) { + + for (OptionNumber = 0; ; OptionNumber++) { + if (OrderList != NULL) { + for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) { + if (OptionNumber == OrderList[Index]) { break; } } } - // - // end for Index - // - Number = (UINT16) Index; - } else { - // - // No Boot#### - // - Number = 0; + + 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 Number; + return OptionNumber; } /** - Get the Option Number that is not in use. + Get the Option Number for Boot#### that does not used. - @return The unused Option Number. + @return The available Option Number. **/ UINT16 -BOpt_GetDriverOptionNumber ( +BOpt_GetBootOptionNumber ( VOID ) { - BM_MENU_ENTRY *NewMenuEntry; - UINT16 *DriverOrderList; - UINTN DriverOrderListSize; - UINT16 Number; - UINTN Index; - UINTN Index2; - BOOLEAN Found; + return BOpt_GetOptionNumber (L"Boot"); +} - 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; - } - } + Get the Option Number for Driver#### that does not used. - if (Found) { - break; - } - } - // - // end for Index - // - Number = (UINT16) Index; - } else { - // - // No Driver#### - // - Number = 0; - } + @return The unused Option Number. - return Number; +**/ +UINT16 +BOpt_GetDriverOptionNumber ( + VOID + ) +{ + return BOpt_GetOptionNumber (L"Driver"); } /** @@ -1587,7 +1435,7 @@ BOpt_GetDriverOptions ( if (DriverOrderList == NULL) { return EFI_NOT_FOUND; } - + for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) { UnicodeSPrint ( DriverString, @@ -1707,3 +1555,207 @@ BOpt_GetDriverOptions ( } +/** + Get option number according to Boot#### and BootOrder variable. + The value is saved as #### + 1. + + @param CallbackData The BMM context data. +**/ +VOID +GetBootOrder ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BMM_FAKE_NV_DATA *BmmConfig; + UINT16 Index; + UINT16 OptionOrderIndex; + UINTN DeviceType; + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + + ASSERT (CallbackData != NULL); + + DeviceType = (UINTN) -1; + BmmConfig = &CallbackData->BmmFakeNvData; + ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder)); + + for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) && + (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0])))); + Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + + if (NewLoadContext->IsLegacy) { + if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) { + DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType; + } else { + // + // Only show one legacy boot option for the same device type + // assuming the boot options are grouped by the device type + // + continue; + } + } + BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1); + } +} + +/** + According to LegacyDevOrder variable to get legacy FD\HD\CD\NET\BEV + devices list . + + @param CallbackData The BMM context data. +**/ +VOID +GetLegacyDeviceOrder ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINTN Index; + UINTN OptionIndex; + UINT16 PageIdList[5]; + UINTN PageNum; + UINTN VarSize; + UINT8 *VarData; + UINT8 *WorkingVarData; + LEGACY_DEV_ORDER_ENTRY *DevOrder; + UINT16 VarDevOrder; + UINT8 *DisMap; + BM_MENU_OPTION *OptionMenu; + BBS_TYPE BbsType; + UINT8 *LegacyOrder; + UINT8 *OldData; + UINTN Pos; + UINTN Bit; + + ASSERT (CallbackData != NULL); + + PageIdList[0] = FORM_SET_FD_ORDER_ID; + PageIdList[1] = FORM_SET_HD_ORDER_ID; + PageIdList[2] = FORM_SET_CD_ORDER_ID; + PageIdList[3] = FORM_SET_NET_ORDER_ID; + PageIdList[4] = FORM_SET_BEV_ORDER_ID; + OptionMenu = NULL; + BbsType = 0; + LegacyOrder = NULL; + OldData = NULL; + DisMap = ZeroMem (CallbackData->BmmFakeNvData.DisableMap, sizeof (CallbackData->BmmFakeNvData.DisableMap)); + PageNum = ARRAY_SIZE (PageIdList); + VarData = BdsLibGetVariableAndSize ( + VAR_LEGACY_DEV_ORDER, + &gEfiLegacyDevOrderVariableGuid, + &VarSize + ); + + for (Index = 0; Index < PageNum; Index++) { + switch (PageIdList[Index]) { + + case FORM_SET_FD_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu; + BbsType = BBS_FLOPPY; + LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD; + OldData = CallbackData->BmmOldFakeNVData.LegacyFD; + break; + + case FORM_SET_HD_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu; + BbsType = BBS_HARDDISK; + LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD; + OldData = CallbackData->BmmOldFakeNVData.LegacyHD; + break; + + case FORM_SET_CD_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu; + BbsType = BBS_CDROM; + LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD; + OldData = CallbackData->BmmOldFakeNVData.LegacyCD; + break; + + case FORM_SET_NET_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu; + BbsType = BBS_EMBED_NETWORK; + LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET; + OldData = CallbackData->BmmOldFakeNVData.LegacyNET; + break; + + default: + ASSERT (PageIdList[Index] == FORM_SET_BEV_ORDER_ID); + OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu; + BbsType = BBS_BEV_DEVICE; + LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV; + OldData = CallbackData->BmmOldFakeNVData.LegacyBEV; + break; + } + + if (NULL != VarData) { + WorkingVarData = VarData; + DevOrder = (LEGACY_DEV_ORDER_ENTRY *) WorkingVarData; + while (WorkingVarData < VarData + VarSize) { + if (DevOrder->BbsType == BbsType) { + break; + } + + WorkingVarData = (UINT8 *)((UINTN)WorkingVarData + sizeof (BBS_TYPE)); + WorkingVarData += *(UINT16 *) WorkingVarData; + DevOrder = (LEGACY_DEV_ORDER_ENTRY *) WorkingVarData; + } + for (OptionIndex = 0; OptionIndex < OptionMenu->MenuNumber; OptionIndex++) { + VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + OptionIndex * sizeof (UINT16)); + if (0xFF00 == (VarDevOrder & 0xFF00)) { + LegacyOrder[OptionIndex] = 0xFF; + Pos = (VarDevOrder & 0xFF) / 8; + Bit = 7 - ((VarDevOrder & 0xFF) % 8); + DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit)); + } else { + LegacyOrder[OptionIndex] = (UINT8) (VarDevOrder & 0xFF); + } + } + CopyMem (OldData, LegacyOrder, 100); + } + } +} + +/** + Get driver option order from globalc DriverOptionMenu. + + @param CallbackData The BMM context data. + +**/ +VOID +GetDriverOrder ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BMM_FAKE_NV_DATA *BmmConfig; + UINT16 Index; + UINT16 OptionOrderIndex; + UINTN DeviceType; + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + + ASSERT (CallbackData != NULL); + + DeviceType = (UINTN) -1; + BmmConfig = &CallbackData->BmmFakeNvData; + ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder)); + + for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) && + (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0])))); + Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + + if (NewLoadContext->IsLegacy) { + if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) { + DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType; + } else { + // + // Only show one legacy boot option for the same device type + // assuming the boot options are grouped by the device type + // + continue; + } + } + BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1); + } +}