+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Variable.c\r
-\r
-Abstract:\r
-\r
- Variable operation that will be used by BootMaint\r
-\r
---*/\r
-\r
-#include "Bds.h"\r
-#include "BootMaint.h"\r
-\r
-EFI_STATUS\r
-Var_DelBootOption (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this boot option, call Var_ChangeBootOrder to\r
- make sure BootOrder is in valid state.\r
- \r
-Arguments:\r
- LoadOption -- Pointer to the boot option that to be deleted\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
-\r
- UINT16 BootString[10];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2 = 0;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (!NewLoadContext->Deleted) {\r
- continue;\r
- }\r
-\r
- UnicodeSPrint (\r
- BootString,\r
- sizeof (BootString),\r
- L"Boot%04x",\r
- NewMenuEntry->OptionNumber\r
- );\r
-\r
- EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
- Index2++;\r
- //\r
- // If current Load Option is the same as BootNext,\r
- // must delete BootNext in order to make sure\r
- // there will be no panic on next boot\r
- //\r
- if (NewLoadContext->IsBootNext) {\r
- EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- NewMenuEntry = NULL;\r
- }\r
-\r
- BootOptionMenu.MenuNumber -= Index2;\r
-\r
- Status = Var_ChangeBootOrder ();\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- After any operation on Boot####, there will be a discrepancy in BootOrder.\r
- Since some are missing but in BootOrder, while some are present but are \r
- not reflected by BootOrder. Then a function rebuild BootOrder from \r
- scratch by content from BootOptionMenu is needed.\r
- \r
-Arguments:\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
-\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *BootOrderList;\r
- UINT16 *BootOrderListPtr;\r
- UINTN BootOrderListSize;\r
- UINTN Index;\r
-\r
- BootOrderList = NULL;\r
- BootOrderListSize = 0;\r
-\r
- //\r
- // First check whether BootOrder is present in current configuration\r
- //\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- //\r
- // If exists, delete it to hold new BootOrder\r
- //\r
- if (BootOrderList) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- SafeFreePool (BootOrderList);\r
- BootOrderList = NULL;\r
- }\r
- //\r
- // Maybe here should be some check method to ensure that\r
- // no new added boot options will be added\r
- // but the setup engine now will give only one callback\r
- // that is to say, user are granted only one chance to\r
- // decide whether the boot option will be added or not\r
- // there should be no indictor to show whether this\r
- // is a "new" boot option\r
- //\r
- BootOrderListSize = BootOptionMenu.MenuNumber;\r
-\r
- if (BootOrderListSize > 0) {\r
- BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
- ASSERT (BootOrderList != NULL);\r
- BootOrderListPtr = BootOrderList;\r
-\r
- //\r
- // Get all current used Boot#### from BootOptionMenu.\r
- // OptionNumber in each BM_LOAD_OPTION is really its\r
- // #### value.\r
- //\r
- for (Index = 0; Index < BootOrderListSize; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- *BootOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
- BootOrderList++;\r
- }\r
-\r
- BootOrderList = BootOrderListPtr;\r
-\r
- //\r
- // After building the BootOrderList, write it back\r
- //\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize * sizeof (UINT16),\r
- BootOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Delete Load Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this Driver option, call Var_ChangeDriverOrder to\r
- make sure DriverOrder is in valid state.\r
- \r
-Arguments:\r
- LoadOption -- Pointer to the Driver option that to be deleted\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
-\r
- UINT16 DriverString[12];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2 = 0;\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (!NewLoadContext->Deleted) {\r
- continue;\r
- }\r
-\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- NewMenuEntry->OptionNumber\r
- );\r
-\r
- EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
- Index2++;\r
-\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- NewMenuEntry = NULL;\r
- }\r
-\r
- DriverOptionMenu.MenuNumber -= Index2;\r
-\r
- Status = Var_ChangeDriverOrder ();\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- After any operation on Driver####, there will be a discrepancy in \r
- DriverOrder. Since some are missing but in DriverOrder, while some \r
- are present but are not reflected by DriverOrder. Then a function \r
- rebuild DriverOrder from scratch by content from DriverOptionMenu is \r
- needed.\r
- \r
-Arguments:\r
-\r
-Returns:\r
- EFI_SUCCESS\r
- Others\r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *DriverOrderList;\r
- UINT16 *DriverOrderListPtr;\r
- UINTN DriverOrderListSize;\r
- UINTN Index;\r
-\r
- DriverOrderList = NULL;\r
- DriverOrderListSize = 0;\r
-\r
- //\r
- // First check whether DriverOrder is present in current configuration\r
- //\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
-\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- SafeFreePool (DriverOrderList);\r
- DriverOrderList = NULL;\r
- }\r
-\r
- DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
-\r
- if (DriverOrderListSize > 0) {\r
- DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
- ASSERT (DriverOrderList != NULL);\r
- DriverOrderListPtr = DriverOrderList;\r
-\r
- //\r
- // Get all current used Driver#### from DriverOptionMenu.\r
- // OptionNumber in each BM_LOAD_OPTION is really its\r
- // #### value.\r
- //\r
- for (Index = 0; Index < DriverOrderListSize; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- *DriverOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
- DriverOrderList++;\r
- }\r
-\r
- DriverOrderList = DriverOrderListPtr;\r
-\r
- //\r
- // After building the DriverOrderList, write it back\r
- //\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize * sizeof (UINT16),\r
- DriverOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
- VOID\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
- EFI_STATUS Status;\r
-\r
- OutDevicePath = EfiLibGetVariable (L"ConOut", &gEfiGlobalVariableGuid);\r
- InpDevicePath = EfiLibGetVariable (L"ConIn", &gEfiGlobalVariableGuid);\r
- ErrDevicePath = EfiLibGetVariable (L"ErrOut", &gEfiGlobalVariableGuid);\r
- if (OutDevicePath) {\r
- ChangeVariableDevicePath (OutDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ConOut",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (OutDevicePath),\r
- OutDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- if (InpDevicePath) {\r
- ChangeVariableDevicePath (InpDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ConIn",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (InpDevicePath),\r
- InpDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- if (ErrDevicePath) {\r
- ChangeVariableDevicePath (ErrDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ErrOut",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (ErrDevicePath),\r
- ErrDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleOption (\r
- IN UINT16 *ConsoleName,\r
- IN BM_MENU_OPTION *ConsoleMenu,\r
- IN UINT16 UpdatePageId\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- EFI_STATUS Status;\r
- VENDOR_DEVICE_PATH Vendor;\r
- EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath;\r
- UINTN Index;\r
- UINT16 *Temp;\r
-\r
- ConDevicePath = EfiLibGetVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- if (ConDevicePath != NULL) {\r
- EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- SafeFreePool (ConDevicePath);\r
- ConDevicePath = NULL;\r
- };\r
-\r
- //\r
- // First add all console input device to it from console input menu\r
- //\r
- for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewConsoleContext->IsActive) {\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- NewConsoleContext->DevicePath\r
- );\r
- }\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||\r
- (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
- (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))\r
- ) {\r
- Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
- Vendor.Header.SubType = MSG_VENDOR_DP;\r
- CopyMem (\r
- &Vendor.Guid,\r
- &Guid[NewTerminalContext->TerminalType],\r
- sizeof (EFI_GUID)\r
- );\r
- SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
- TerminalDevicePath = AppendDevicePathNode (\r
- NewTerminalContext->DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
- );\r
- ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
- Temp = DevicePathToStr (TerminalDevicePath);\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- TerminalDevicePath\r
- );\r
- }\r
- }\r
-\r
- if (ConDevicePath) {\r
- Status = gRT->SetVariable (\r
- ConsoleName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (ConDevicePath),\r
- ConDevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN UINT16 *DescriptionData,\r
- IN UINT16 *OptionalData,\r
- IN UINT8 ForceReconnect\r
- )\r
-{\r
- UINT16 Index;\r
- UINT16 *DriverOrderList;\r
- UINT16 *NewDriverOrderList;\r
- UINT16 DriverString[12];\r
- UINTN DriverOrderListSize;\r
- VOID *Buffer;\r
- UINTN BufferSize;\r
- UINT8 *Ptr;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN OptionalDataExist;\r
- EFI_STATUS Status;\r
-\r
- OptionalDataExist = FALSE;\r
-\r
- Index = BOpt_GetDriverOptionNumber ();\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- Index\r
- );\r
-\r
- if (*DescriptionData == 0x0000) {\r
- StrCpy (DescriptionData, DriverString);\r
- }\r
-\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData) + GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- if (*OptionalData != 0x0000) {\r
- OptionalDataExist = TRUE;\r
- BufferSize += StrSize (OptionalData);\r
- }\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (NULL == Buffer) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->LoadOptionSize = BufferSize;\r
- Ptr = (UINT8 *) Buffer;\r
- NewLoadContext->LoadOption = Ptr;\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
- NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
- NewLoadContext->IsActive = TRUE;\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- Ptr += sizeof (UINT32);\r
- *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
- NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
- Ptr += sizeof (UINT16);\r
- CopyMem (\r
- Ptr,\r
- DescriptionData,\r
- StrSize (DescriptionData)\r
- );\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
- ASSERT (NewLoadContext->Description != NULL);\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (VOID *) Ptr,\r
- StrSize (DescriptionData)\r
- );\r
-\r
- Ptr += StrSize (DescriptionData);\r
- CopyMem (\r
- Ptr,\r
- CallbackData->LoadContext->FilePathList,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (VOID *) Ptr,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->OptionNumber = Index;\r
- NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionStrDepository\r
- );\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- HiiHandle,\r
- &NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->DisplayString\r
- );\r
-\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionHelpStrDepository\r
- );\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- HiiHandle,\r
- &NewMenuEntry->HelpStringToken,\r
- NewMenuEntry->HelpString\r
- );\r
-\r
- if (OptionalDataExist) {\r
- Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- CopyMem (\r
- Ptr,\r
- OptionalData,\r
- StrSize (OptionalData)\r
- );\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- DriverString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
- NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
- ASSERT (NewDriverOrderList != NULL);\r
- CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
- NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
- if (DriverOrderList != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize + sizeof (UINT16),\r
- NewDriverOrderList\r
- );\r
- SafeFreePool (DriverOrderList);\r
- DriverOrderList = NULL;\r
- SafeFreePool (NewDriverOrderList);\r
- NewDriverOrderList = NULL;\r
- InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
- DriverOptionMenu.MenuNumber++;\r
-\r
- *DescriptionData = 0x0000;\r
- *OptionalData = 0x0000;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN FILE_EXPLORER_NV_DATA *NvRamMap\r
- )\r
-{\r
- UINT16 *BootOrderList;\r
- UINT16 *NewBootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT16 BootString[10];\r
- VOID *Buffer;\r
- UINTN BufferSize;\r
- UINT8 *Ptr;\r
- UINT16 Index;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN OptionalDataExist;\r
- EFI_STATUS Status;\r
-\r
- OptionalDataExist = FALSE;\r
-\r
- Index = BOpt_GetBootOptionNumber ();\r
- UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
-\r
- if (NvRamMap->DescriptionData[0] == 0x0000) {\r
- StrCpy (NvRamMap->DescriptionData, BootString);\r
- }\r
-\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData) + GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- if (NvRamMap->OptionalData[0] != 0x0000) {\r
- OptionalDataExist = TRUE;\r
- BufferSize += StrSize (NvRamMap->OptionalData);\r
- }\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (NULL == Buffer) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->LoadOptionSize = BufferSize;\r
- Ptr = (UINT8 *) Buffer;\r
- NewLoadContext->LoadOption = Ptr;\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
- NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
- NewLoadContext->IsActive = TRUE;\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- Ptr += sizeof (UINT32);\r
- *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
- NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
- Ptr += sizeof (UINT16);\r
-\r
- CopyMem (\r
- Ptr,\r
- NvRamMap->DescriptionData,\r
- StrSize (NvRamMap->DescriptionData)\r
- );\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData));\r
- ASSERT (NewLoadContext->Description != NULL);\r
-\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (VOID *) Ptr,\r
- StrSize (NvRamMap->DescriptionData)\r
- );\r
-\r
- Ptr += StrSize (NvRamMap->DescriptionData);\r
- CopyMem (\r
- Ptr,\r
- CallbackData->LoadContext->FilePathList,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (VOID *) Ptr,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->OptionNumber = Index;\r
- NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionStrDepository\r
- );\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->FeHiiHandle,\r
- &NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->DisplayString\r
- );\r
-\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionHelpStrDepository\r
- );\r
-\r
- CallbackData->Hii->NewString (\r
- CallbackData->Hii,\r
- NULL,\r
- CallbackData->FeHiiHandle,\r
- &NewMenuEntry->HelpStringToken,\r
- NewMenuEntry->HelpString\r
- );\r
-\r
- if (OptionalDataExist) {\r
- Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- BootString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
-\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
- ASSERT (NewBootOrderList != NULL);\r
- CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
- NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
- if (BootOrderList != NULL) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize + sizeof (UINT16),\r
- NewBootOrderList\r
- );\r
-\r
- SafeFreePool (BootOrderList);\r
- BootOrderList = NULL;\r
- SafeFreePool (NewBootOrderList);\r
- NewBootOrderList = NULL;\r
- InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
- BootOptionMenu.MenuNumber++;\r
-\r
- NvRamMap->DescriptionData[0] = 0x0000;\r
- NvRamMap->OptionalData[0] = 0x0000;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- UINT16 Index;\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
- CurrentFakeNVMap = CallbackData->BmmFakeNvData;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->IsBootNext = FALSE;\r
- }\r
-\r
- if (CurrentFakeNVMap->BootNext == BootOptionMenu.MenuNumber) {\r
- EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &BootOptionMenu,\r
- CurrentFakeNVMap->BootNext\r
- );\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- Status = gRT->SetVariable (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- sizeof (UINT16),\r
- &NewMenuEntry->OptionNumber\r
- );\r
- NewLoadContext->IsBootNext = TRUE;\r
- CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
- UINT16 *BootOrderList;\r
- UINT16 *NewBootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT8 *Map;\r
-\r
- BootOrderList = NULL;\r
- BootOrderListSize = 0;\r
-\r
- //\r
- // First check whether BootOrder is present in current configuration\r
- //\r
- BootOrderList = BdsLibGetVariableAndSize (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- &BootOrderListSize\r
- );\r
-\r
- NewBootOrderList = AllocateZeroPool (BootOrderListSize);\r
- if (!NewBootOrderList) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Map = AllocateZeroPool (BootOrderListSize / sizeof (UINT16));\r
- if (!Map) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // If exists, delete it to hold new BootOrder\r
- //\r
- if (BootOrderList) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewBootOrderList[Index] = CallbackData->BmmFakeNvData->OptionOrder[Index] - 1;\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize,\r
- NewBootOrderList\r
- );\r
- SafeFreePool (BootOrderList);\r
- SafeFreePool (NewBootOrderList);\r
- SafeFreePool (Map);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_FreeMenu (&BootOptionMenu);\r
- BOpt_GetBootOptions (CallbackData);\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
- UINT16 *DriverOrderList;\r
- UINT16 *NewDriverOrderList;\r
- UINTN DriverOrderListSize;\r
-\r
- DriverOrderList = NULL;\r
- DriverOrderListSize = 0;\r
-\r
- //\r
- // First check whether DriverOrder is present in current configuration\r
- //\r
- DriverOrderList = BdsLibGetVariableAndSize (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- &DriverOrderListSize\r
- );\r
-\r
- NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
-\r
- if (!NewDriverOrderList) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- for (Index = 0; Index < DriverOrderListSize; Index++) {\r
- NewDriverOrderList[Index] = CallbackData->BmmFakeNvData->OptionOrder[Index] - 1;\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize,\r
- NewDriverOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- SafeFreePool (DriverOrderList);\r
-\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- BOpt_GetDriverOptions (CallbackData);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-Var_UpdateBBSOption (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Index2;\r
- VOID *BootOptionVar;\r
- CHAR16 VarName[100];\r
- UINTN OptionSize;\r
- UINT16 FilePathSize;\r
- UINT8 *Ptr;\r
- EFI_STATUS Status;\r
- CHAR16 DescString[100];\r
- UINTN NewOptionSize;\r
- UINT8 *NewOptionPtr;\r
- UINT8 *TempPtr;\r
- UINT32 *Attribute;\r
-\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 Pos;\r
- UINTN Bit;\r
- UINT16 *NewOrder;\r
- UINT16 Tmp;\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
- 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
- }\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 ((EFI_D_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
- break;\r
- }\r
- }\r
- //\r
- // Update the Variable "LegacyDevOrder"\r
- //\r
- VarData = (UINT8 *) BdsLibGetVariableAndSize (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- &VarSize\r
- );\r
-\r
- if (NULL == VarData) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- OriginalPtr = VarData;\r
- DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
-\r
- while (VarData < VarData + VarSize) {\r
- if (DevOrder->BbsType == CallbackData->BbsType) {\r
- break;\r
- }\r
-\r
- VarData += sizeof (BBS_TYPE);\r
- VarData += *(UINT16 *) VarData;\r
- DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
- }\r
-\r
- if (VarData >= VarData + VarSize) {\r
- SafeFreePool (OriginalPtr);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewOrder = (UINT16 *) AllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
- if (NULL == NewOrder) {\r
- SafeFreePool (VarData);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- if (0xFF == LegacyDev[Index]) {\r
- break;\r
- }\r
-\r
- NewOrder[Index] = LegacyDev[Index];\r
- }\r
- //\r
- // Only the enable/disable state of each boot device with same device type can be changed,\r
- // so we can count on the index information in DevOrder.\r
- // DisMap bit array is the only reliable source to check a device's en/dis state,\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
- Pos = Tmp / 8;\r
- Bit = 7 - (Tmp % 8);\r
- if (DisMap[Pos] & (1 << Bit)) {\r
- NewOrder[Index] = (UINT16) (0xFF00 | Tmp);\r
- Index++;\r
- }\r
- }\r
-\r
- CopyMem (\r
- (UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16),\r
- NewOrder,\r
- DevOrder->Length - sizeof (UINT16)\r
- );\r
- SafeFreePool (NewOrder);\r
-\r
- Status = gRT->SetVariable (\r
- VarLegacyDevOrder,\r
- &EfiLegacyDevOrderGuid,\r
- VAR_FLAG,\r
- VarSize,\r
- OriginalPtr\r
- );\r
-\r
- SafeFreePool (OriginalPtr);\r
-\r
- //\r
- // Update Optional Data of Boot####\r
- //\r
- BootOptionVar = GetLegacyBootOptionVar (CallbackData->BbsType, &Index, &OptionSize);\r
-\r
- if (NULL != BootOptionVar) {\r
- CopyMem (\r
- DescString,\r
- LegacyDeviceContext->Description,\r
- StrSize (LegacyDeviceContext->Description)\r
- );\r
-\r
- NewOptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescString) + sizeof (BBS_TABLE) + sizeof (UINT16);\r
-\r
- UnicodeSPrint (VarName, 100, L"Boot%04x", Index);\r
-\r
- Ptr = BootOptionVar;\r
-\r
- Attribute = (UINT32 *) Ptr;\r
- *Attribute |= LOAD_OPTION_ACTIVE;\r
- if (0xFF == LegacyDev[0]) {\r
- //\r
- // Disable this legacy boot option\r
- //\r
- *Attribute &= ~LOAD_OPTION_ACTIVE;\r
- }\r
-\r
- Ptr += sizeof (UINT32);\r
-\r
- FilePathSize = *(UINT16 *) Ptr;\r
- Ptr += sizeof (UINT16);\r
-\r
- NewOptionSize += FilePathSize;\r
-\r
- NewOptionPtr = AllocateZeroPool (NewOptionSize);\r
- if (NULL == NewOptionPtr) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- TempPtr = NewOptionPtr;\r
-\r
- //\r
- // Copy previous option data to new option except the description string\r
- //\r
- CopyMem (\r
- TempPtr,\r
- BootOptionVar,\r
- sizeof (UINT32) + sizeof (UINT16)\r
- );\r
-\r
- TempPtr += (sizeof (UINT32) + sizeof (UINT16));\r
-\r
- CopyMem (\r
- TempPtr,\r
- DescString,\r
- StrSize (DescString)\r
- );\r
-\r
- TempPtr += StrSize (DescString);\r
-\r
- //\r
- // Description = (CHAR16 *)Ptr;\r
- //\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
- CopyMem (\r
- TempPtr,\r
- Ptr,\r
- FilePathSize\r
- );\r
-\r
- TempPtr += FilePathSize;\r
-\r
- //\r
- // DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)Ptr;\r
- //\r
- Ptr += FilePathSize;\r
-\r
- //\r
- // Now Ptr point to optional data, i.e. Bbs Table\r
- //\r
- CopyMem (\r
- TempPtr,\r
- LegacyDeviceContext->BbsTable,\r
- sizeof (BBS_TABLE)\r
- );\r
-\r
- TempPtr += sizeof (BBS_TABLE);\r
- *((UINT16 *) TempPtr) = (UINT16) LegacyDeviceContext->Index;\r
-\r
- Status = gRT->SetVariable (\r
- VarName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- NewOptionSize,\r
- NewOptionPtr\r
- );\r
-\r
- SafeFreePool (NewOptionPtr);\r
- SafeFreePool (BootOptionVar);\r
- }\r
-\r
- BOpt_GetBootOptions (CallbackData);\r
- return Status;\r
-}\r