(EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
);\r
ASSERT (TerminalDevicePath != NULL);\r
- ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
+ ChangeTerminalDevicePath (&TerminalDevicePath, TRUE);\r
ConDevicePath = AppendDevicePathInstance (\r
ConDevicePath,\r
TerminalDevicePath\r
NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
\r
if (BootOrderList != NULL) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
FreePool (BootOrderList);\r
}\r
\r
{\r
EFI_STATUS Status;\r
UINT16 Index;\r
+ UINT16 OrderIndex;\r
UINT16 *BootOrderList;\r
- UINT16 *NewBootOrderList;\r
UINTN BootOrderListSize;\r
+ UINT16 OptionNumber;\r
\r
BootOrderList = NULL;\r
BootOrderListSize = 0;\r
&gEfiGlobalVariableGuid,\r
&BootOrderListSize\r
);\r
-\r
- NewBootOrderList = AllocateZeroPool (BootOrderListSize);\r
- if (NewBootOrderList == NULL) {\r
+ if (BootOrderList == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- //\r
- // If exists, delete it to hold new BootOrder\r
- //\r
- if (BootOrderList != NULL) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- FreePool (BootOrderList);\r
- }\r
-\r
ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])));\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewBootOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[Index] - 1);\r
+\r
+ for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.OptionOrder[OrderIndex] != 0); OrderIndex++) {\r
+ for (Index = OrderIndex; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
+ if ((BootOrderList[Index] == (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
+ OptionNumber = BootOrderList[Index];\r
+ CopyMem (&BootOrderList[OrderIndex + 1], &BootOrderList[OrderIndex], (Index - OrderIndex) * sizeof (UINT16));\r
+ BootOrderList[OrderIndex] = OptionNumber;\r
+ }\r
+ }\r
}\r
\r
+ GroupMultipleLegacyBootOption4SameType (\r
+ BootOrderList,\r
+ BootOrderListSize / sizeof (UINT16)\r
+ );\r
+\r
Status = gRT->SetVariable (\r
L"BootOrder",\r
&gEfiGlobalVariableGuid,\r
VAR_FLAG,\r
BootOrderListSize,\r
- NewBootOrderList\r
+ BootOrderList\r
);\r
- FreePool (NewBootOrderList);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ FreePool (BootOrderList);\r
\r
BOpt_FreeMenu (&BootOptionMenu);\r
BOpt_GetBootOptions (CallbackData);\r
\r
- return EFI_SUCCESS;\r
+ return Status;\r
\r
}\r
\r
VOID *BootOptionVar;\r
CHAR16 VarName[100];\r
UINTN OptionSize;\r
- UINT8 *Ptr;\r
EFI_STATUS Status;\r
- CHAR16 DescString[100];\r
- CHAR8 DescAsciiString[100];\r
- UINTN NewOptionSize;\r
- UINT8 *NewOptionPtr;\r
- UINT8 *TempPtr;\r
UINT32 *Attribute;\r
BM_MENU_OPTION *OptionMenu;\r
- BM_LEGACY_DEVICE_CONTEXT *LegacyDeviceContext;\r
UINT8 *LegacyDev;\r
UINT8 *VarData;\r
UINTN VarSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
UINT8 *OriginalPtr;\r
UINT8 *DisMap;\r
UINTN Bit;\r
UINT16 *NewOrder;\r
UINT16 Tmp;\r
+ UINT16 *EnBootOption;\r
+ UINTN EnBootOptionCount;\r
+ UINT16 *DisBootOption;\r
+ UINTN DisBootOptionCount;\r
+ UINT16 *BootOrder;\r
\r
- LegacyDeviceContext = NULL;\r
DisMap = NULL;\r
NewOrder = NULL;\r
\r
- if (FORM_SET_FD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData.LegacyFD;\r
- CallbackData->BbsType = BBS_FLOPPY;\r
- } else {\r
- if (FORM_SET_HD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
+ switch (CallbackData->BmmPreviousPageId) {\r
+ case FORM_SET_FD_ORDER_ID:\r
+ OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
+ LegacyDev = CallbackData->BmmFakeNvData.LegacyFD;\r
+ CallbackData->BbsType = BBS_FLOPPY;\r
+ break;\r
+\r
+ case FORM_SET_HD_ORDER_ID:\r
OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
LegacyDev = CallbackData->BmmFakeNvData.LegacyHD;\r
CallbackData->BbsType = BBS_HARDDISK;\r
- } else {\r
- if (FORM_SET_CD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData.LegacyCD;\r
- CallbackData->BbsType = BBS_CDROM;\r
- } else {\r
- if (FORM_SET_NET_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData.LegacyNET;\r
- CallbackData->BbsType = BBS_EMBED_NETWORK;\r
- } else {\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
- LegacyDev = CallbackData->BmmFakeNvData.LegacyBEV;\r
- CallbackData->BbsType = BBS_BEV_DEVICE;\r
- }\r
- }\r
- }\r
+ break;\r
+\r
+ case FORM_SET_CD_ORDER_ID:\r
+ OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
+ LegacyDev = CallbackData->BmmFakeNvData.LegacyCD;\r
+ CallbackData->BbsType = BBS_CDROM;\r
+ break;\r
+\r
+ case FORM_SET_NET_ORDER_ID:\r
+ OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
+ LegacyDev = CallbackData->BmmFakeNvData.LegacyNET;\r
+ CallbackData->BbsType = BBS_EMBED_NETWORK;\r
+ break;\r
+\r
+ default:\r
+ ASSERT (FORM_SET_BEV_ORDER_ID == CallbackData->BmmPreviousPageId);\r
+ OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
+ LegacyDev = CallbackData->BmmFakeNvData.LegacyBEV;\r
+ CallbackData->BbsType = BBS_BEV_DEVICE;\r
+ break;\r
}\r
\r
DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
Status = EFI_SUCCESS;\r
\r
- //\r
- // Find the first device's context\r
- // If all devices are disabled( 0xFF == LegacyDev[0]), LegacyDeviceContext can be set to any VariableContext\r
- // because we just use it to fill the desc string, and user can not see the string in UI\r
- //\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- LegacyDeviceContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (0xFF != LegacyDev[0] && LegacyDev[0] == LegacyDeviceContext->Index) {\r
- DEBUG ((DEBUG_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
- break;\r
- }\r
- }\r
- ASSERT (LegacyDeviceContext != NULL);\r
\r
//\r
// Update the Variable "LegacyDevOrder"\r
OriginalPtr = VarData;\r
DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
\r
- while (VarData < VarData + VarSize) {\r
+ while (VarData < OriginalPtr + VarSize) {\r
if (DevOrder->BbsType == CallbackData->BbsType) {\r
break;\r
}\r
\r
- VarData += sizeof (BBS_TYPE);\r
- VarData += *(UINT16 *) VarData;\r
+ VarData += sizeof (BBS_TYPE) + DevOrder->Length;\r
DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
}\r
\r
- if (VarData >= VarData + VarSize) {\r
+ if (VarData >= OriginalPtr + VarSize) {\r
FreePool (OriginalPtr);\r
return EFI_NOT_FOUND;\r
}\r
\r
- NewOrder = (UINT16 *) AllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
+ NewOrder = AllocateZeroPool (DevOrder->Length - sizeof (DevOrder->Length));\r
if (NewOrder == NULL) {\r
- FreePool (VarData);\r
+ FreePool (OriginalPtr);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
// so we use DisMap to set en/dis state of each item in NewOrder array\r
//\r
for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) {\r
- Tmp = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index2 * sizeof (UINT16));\r
- Tmp &= 0xFF;\r
+ Tmp = (UINT16) (DevOrder->Data[Index2] & 0xFF);\r
Pos = Tmp / 8;\r
Bit = 7 - (Tmp % 8);\r
if ((DisMap[Pos] & (1 << Bit)) != 0) {\r
}\r
\r
CopyMem (\r
- (UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16),\r
+ DevOrder->Data,\r
NewOrder,\r
- DevOrder->Length - sizeof (UINT16)\r
+ DevOrder->Length - sizeof (DevOrder->Length)\r
);\r
FreePool (NewOrder);\r
\r
OriginalPtr\r
);\r
\r
- FreePool (OriginalPtr);\r
\r
//\r
- // Update Optional Data of Boot####\r
+ // Update BootOrder and Boot####.Attribute\r
//\r
- BootOptionVar = GetLegacyBootOptionVar (CallbackData->BbsType, &Index, &OptionSize);\r
-\r
- if (BootOptionVar != NULL) {\r
- CopyMem (\r
- DescString,\r
- LegacyDeviceContext->Description,\r
- StrSize (LegacyDeviceContext->Description)\r
- );\r
-\r
- UnicodeStrToAsciiStr((CONST CHAR16*)&DescString, (CHAR8 *)&DescAsciiString);\r
-\r
- NewOptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescString) +\r
- sizeof (BBS_BBS_DEVICE_PATH);\r
- NewOptionSize += AsciiStrLen (DescAsciiString) +\r
- END_DEVICE_PATH_LENGTH + sizeof (BBS_TABLE) + sizeof (UINT16);\r
-\r
- UnicodeSPrint (VarName, 100, L"Boot%04x", Index);\r
+ // 1. Re-order the Option Number in BootOrder according to Legacy Dev Order\r
+ //\r
+ ASSERT (OptionMenu->MenuNumber == DevOrder->Length / sizeof (UINT16) - 1);\r
+ BootOrder = BdsLibGetVariableAndSize (\r
+ L"BootOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ &VarSize\r
+ );\r
+ ASSERT (BootOrder != NULL);\r
+\r
+ DisBootOption = AllocatePool (VarSize);\r
+ ASSERT (DisBootOption != NULL);\r
+ EnBootOption = AllocatePool (VarSize);\r
+ ASSERT (EnBootOption != NULL);\r
+ \r
+ OrderLegacyBootOption4SameType (\r
+ BootOrder,\r
+ VarSize / sizeof (UINT16),\r
+ DevOrder->Data,\r
+ DevOrder->Length / sizeof (UINT16) - 1,\r
+ EnBootOption,\r
+ &EnBootOptionCount,\r
+ DisBootOption,\r
+ &DisBootOptionCount\r
+ );\r
+ \r
+ Status = gRT->SetVariable (\r
+ L"BootOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ VarSize,\r
+ BootOrder\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- Ptr = BootOptionVar;\r
+ FreePool (BootOrder);\r
\r
- Attribute = (UINT32 *) Ptr;\r
- *Attribute |= LOAD_OPTION_ACTIVE;\r
- if (LegacyDev[0] == 0xFF) {\r
- //\r
- // Disable this legacy boot option\r
- //\r
+ //\r
+ // 2. Deactivate the DisBootOption and activate the EnBootOption\r
+ //\r
+ for (Index = 0; Index < DisBootOptionCount; Index++) {\r
+ UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", DisBootOption[Index]);\r
+ BootOptionVar = BdsLibGetVariableAndSize (\r
+ VarName,\r
+ &gEfiGlobalVariableGuid,\r
+ &OptionSize\r
+ );\r
+ if (BootOptionVar != NULL) {\r
+ Attribute = (UINT32 *) BootOptionVar;\r
*Attribute &= ~LOAD_OPTION_ACTIVE;\r
- }\r
\r
- Ptr += sizeof (UINT32);\r
-\r
- Ptr += sizeof (UINT16);\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
+ Status = gRT->SetVariable (\r
+ VarName,\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ OptionSize,\r
+ BootOptionVar\r
+ );\r
\r
- NewOptionPtr = AllocateZeroPool (NewOptionSize);\r
- if (NewOptionPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ FreePool (BootOptionVar);\r
}\r
+ }\r
\r
- TempPtr = NewOptionPtr;\r
-\r
- //\r
- // Attribute\r
- //\r
- CopyMem (\r
- TempPtr,\r
- BootOptionVar,\r
- sizeof (UINT32)\r
- );\r
-\r
- TempPtr += sizeof (UINT32);\r
-\r
- //\r
- // BBS device path Length\r
- //\r
- *((UINT16 *) TempPtr) = (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) +\r
- AsciiStrLen (DescAsciiString) +\r
- END_DEVICE_PATH_LENGTH);\r
-\r
- TempPtr += sizeof (UINT16);\r
-\r
- //\r
- // Description string\r
- //\r
- CopyMem (\r
- TempPtr,\r
- DescString,\r
- StrSize (DescString)\r
- );\r
-\r
- TempPtr += StrSize (DescString);\r
-\r
- //\r
- // BBS device path\r
- //\r
- CopyMem (\r
- TempPtr,\r
- Ptr,\r
- sizeof (BBS_BBS_DEVICE_PATH)\r
- );\r
-\r
- CopyMem (\r
- ((BBS_BBS_DEVICE_PATH*) TempPtr)->String,\r
- DescAsciiString,\r
- AsciiStrSize (DescAsciiString)\r
- );\r
-\r
- SetDevicePathNodeLength (\r
- (EFI_DEVICE_PATH_PROTOCOL *) TempPtr,\r
- sizeof (BBS_BBS_DEVICE_PATH) + AsciiStrLen (DescAsciiString)\r
- );\r
-\r
- TempPtr += sizeof (BBS_BBS_DEVICE_PATH) + AsciiStrLen (DescAsciiString);\r
-\r
- //\r
- // End node\r
- //\r
- CopyMem (\r
- TempPtr,\r
- EndDevicePath,\r
- END_DEVICE_PATH_LENGTH\r
- );\r
- TempPtr += END_DEVICE_PATH_LENGTH;\r
-\r
- //\r
- // Now TempPtr point to optional data, i.e. Bbs Table\r
- //\r
- CopyMem (\r
- TempPtr,\r
- LegacyDeviceContext->BbsTable,\r
- sizeof (BBS_TABLE)\r
- );\r
-\r
- //\r
- // Now TempPtr point to BBS index\r
- //\r
- TempPtr += sizeof (BBS_TABLE);\r
- *((UINT16 *) TempPtr) = (UINT16) LegacyDeviceContext->Index;\r
+ for (Index = 0; Index < EnBootOptionCount; Index++) {\r
+ UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", EnBootOption[Index]);\r
+ BootOptionVar = BdsLibGetVariableAndSize (\r
+ VarName,\r
+ &gEfiGlobalVariableGuid,\r
+ &OptionSize\r
+ );\r
+ if (BootOptionVar != NULL) {\r
+ Attribute = (UINT32 *) BootOptionVar;\r
+ *Attribute |= LOAD_OPTION_ACTIVE;\r
\r
- Status = gRT->SetVariable (\r
- VarName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- NewOptionSize,\r
- NewOptionPtr\r
- );\r
+ Status = gRT->SetVariable (\r
+ VarName,\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ OptionSize,\r
+ BootOptionVar\r
+ );\r
\r
- FreePool (NewOptionPtr);\r
- FreePool (BootOptionVar);\r
+ FreePool (BootOptionVar);\r
+ }\r
}\r
\r
BOpt_GetBootOptions (CallbackData);\r
+\r
+ FreePool (OriginalPtr);\r
+ FreePool (EnBootOption);\r
+ FreePool (DisBootOption);\r
return Status;\r
}\r
\r