+++ /dev/null
-/** @file\r
- Variable operation that will be used by bootmaint\r
-\r
-Copyright (c) 2004 - 2008, Intel Corporation. <BR>\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
-**/\r
-\r
-#include "BootMaint.h"\r
-\r
-/**\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
- @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to \r
- BM_LOAD_CONTEXT marked for deletion is deleted.\r
- @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.\r
- @return Others If failed to update the "BootOrder" variable after deletion. \r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelBootOption (\r
- VOID\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\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
-/**\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
-\r
- \r
-\r
- @retval EFI_SUCCESS The boot order is updated successfully.\r
- @return EFI_STATUS other than EFI_SUCCESS if failed to\r
- Set the "BootOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
- VOID\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 != NULL) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- FreePool (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
-/**\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
- @retval EFI_SUCCESS Load Option is successfully updated.\r
- @retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.\r
- @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
- Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
- VOID\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\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
-/**\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
- @retval EFI_SUCCESS The driver order is updated successfully.\r
- @return EFI_STATUS other than EFI_SUCCESS if failed to\r
- Set the "DriverOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
- VOID\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 != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- FreePool (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
-/**\r
- Update the device path of "ConOut", "ConIn" and "ErrOut" \r
- based on the new BaudRate, Data Bits, parity and Stop Bits\r
- set.\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 != NULL) {\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 != NULL) {\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 != NULL) {\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
-/**\r
- This function delete and build multi-instance device path for\r
- specified type of console device.\r
-\r
- This function clear the EFI variable defined by ConsoleName and\r
- gEfiGlobalVariableGuid. It then build the multi-instance device\r
- path by appending the device path of the Console (In/Out/Err) instance \r
- in ConsoleMenu. Then it scan all corresponding console device by\r
- scanning Terminal (built from device supporting Serial I/O instances)\r
- devices in TerminalMenu. At last, it save a EFI variable specifed\r
- by ConsoleName and gEfiGlobalVariableGuid.\r
-\r
- @param ConsoleName The name for the console device type. They are\r
- usually "ConIn", "ConOut" and "ErrOut".\r
- @param ConsoleMenu The console memu which is a list of console devices.\r
- @param UpdatePageId The flag specifying which type of console device\r
- to be processed.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\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
-\r
- ConDevicePath = EfiLibGetVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- if (ConDevicePath != NULL) {\r
- EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- FreePool (ConDevicePath);\r
- ConDevicePath = NULL;\r
- };\r
-\r
- //\r
- // First add all console input device from console input menu\r
- //\r
- for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\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
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
- ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
- ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
- ) {\r
- Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
- Vendor.Header.SubType = MSG_VENDOR_DP;\r
- \r
- ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
- CopyMem (\r
- &Vendor.Guid,\r
- &TerminalTypeGuid[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
- ASSERT (TerminalDevicePath != NULL);\r
- ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- TerminalDevicePath\r
- );\r
- }\r
- }\r
-\r
- if (ConDevicePath != NULL) {\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
-/**\r
- This function delete and build multi-instance device path ConIn\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\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
-/**\r
- This function delete and build multi-instance device path ConOut\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\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
-/**\r
- This function delete and build multi-instance device path ErrOut\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information. \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
-/**\r
- This function create a currently loaded Drive Option from \r
- the BMM. It then appends this Driver Option to the end of \r
- the "DriverOrder" list. It append this Driver Opotion to the end\r
- of DriverOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
- @param HiiHandle The HII handle associated with the BMM formset.\r
- @param DescriptionData The description of this driver option.\r
- @param OptionalData The optional load option.\r
- @param ForceReconnect If to force reconnect.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
- @retval EFI_SUCCESS If function completes successfully.\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);\r
- BufferSize += 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
- FreePool (Buffer);\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
- HiiLibNewString (HiiHandle, &NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayString);\r
-\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- DriverOptionHelpStrDepository\r
- );\r
- HiiLibNewString (HiiHandle, &NewMenuEntry->HelpStringToken, NewMenuEntry->HelpString);\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
- ASSERT_EFI_ERROR (Status);\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
- ASSERT_EFI_ERROR (Status);\r
- if (DriverOrderList != NULL) {\r
- FreePool (DriverOrderList);\r
- }\r
- DriverOrderList = NULL;\r
- FreePool (NewDriverOrderList);\r
- InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
- DriverOptionMenu.MenuNumber++;\r
-\r
- *DescriptionData = 0x0000;\r
- *OptionalData = 0x0000;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function create a currently loaded Boot Option from \r
- the BMM. It then appends this Boot Option to the end of \r
- the "BootOrder" list. It also append this Boot Opotion to the end\r
- of BootOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
- @param NvRamMap The file explorer formset internal state.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
- @retval EFI_SUCCESS If function completes successfully.\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);\r
- BufferSize += 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
- HiiLibNewString (CallbackData->FeHiiHandle, &NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayString);\r
-\r
- NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
- CallbackData,\r
- BootOptionHelpStrDepository\r
- );\r
- HiiLibNewString (CallbackData->FeHiiHandle, &NewMenuEntry->HelpStringToken, NewMenuEntry->HelpString);\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
- ASSERT_EFI_ERROR (Status);\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
- FreePool (BootOrderList);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize + sizeof (UINT16),\r
- NewBootOrderList\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- FreePool (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
-/**\r
- This function update the "BootNext" EFI Variable. If there is \r
- no "BootNex" specified in BMM, this EFI Variable is deleted.\r
- It also update the BMM context data specified the "BootNext"\r
- vaule.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can be saved. See gRT->SetVariable \r
- for detail return information.\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
- ASSERT (NULL != NewMenuEntry);\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
- ASSERT (NewMenuEntry != NULL);\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
-/**\r
- This function update the "BootOrder" EFI Variable based on\r
- BMM Formset's NV map. It then refresh BootOptionMenu\r
- with the new "BootOrder" list.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\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
-\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 == 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
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize,\r
- NewBootOrderList\r
- );\r
- FreePool (NewBootOrderList);\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
-/**\r
- This function update the "DriverOrder" EFI Variable based on\r
- BMM Formset's NV map. It then refresh DriverOptionMenu\r
- with the new "DriverOrder" list.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\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 == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- FreePool (DriverOrderList);\r
- }\r
-\r
- ASSERT (DriverOrderListSize <= (sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])));\r
- for (Index = 0; Index < DriverOrderListSize; Index++) {\r
- NewDriverOrderList[Index] = (UINT16) (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
- BOpt_FreeMenu (&DriverOptionMenu);\r
- BOpt_GetDriverOptions (CallbackData);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Update the legacy BBS boot option. L"LegacyDevOrder" and EfiLegacyDevOrderGuid EFI Variable\r
- is udpated with the new Legacy Boot order. The EFI Variable of "Boot####" and gEfiGlobalVariableGuid\r
- is also updated.\r
-\r
- @param CallbackData The context data for BMM.\r
-\r
- @return EFI_SUCCESS The function completed successfully.\r
- @retval EFI_NOT_FOUND If L"LegacyDevOrder" and EfiLegacyDevOrderGuid EFI Variable can be found.\r
- @retval EFI_OUT_OF_RESOURCES Fail to allocate memory resource\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
- 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 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 ((DEBUG_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
- break;\r
- }\r
- }\r
- //\r
- // Update the Variable "LegacyDevOrder"\r
- //\r
- VarData = (UINT8 *) BdsLibGetVariableAndSize (\r
- VAR_LEGACY_DEV_ORDER,\r
- &EfiLegacyDevOrderGuid,\r
- &VarSize\r
- );\r
-\r
- if (VarData == NULL) {\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
- FreePool (OriginalPtr);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewOrder = (UINT16 *) AllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
- if (NewOrder == NULL) {\r
- FreePool (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)) != 0) {\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
- FreePool (NewOrder);\r
-\r
- Status = gRT->SetVariable (\r
- VAR_LEGACY_DEV_ORDER,\r
- &EfiLegacyDevOrderGuid,\r
- VAR_FLAG,\r
- VarSize,\r
- OriginalPtr\r
- );\r
-\r
- FreePool (OriginalPtr);\r
-\r
- //\r
- // Update Optional Data of Boot####\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
-\r
- Ptr = BootOptionVar;\r
-\r
- Attribute = (UINT32 *) Ptr;\r
- *Attribute |= LOAD_OPTION_ACTIVE;\r
- if (LegacyDev[0] == 0xFF) {\r
- //\r
- // Disable this legacy boot option\r
- //\r
- *Attribute &= ~LOAD_OPTION_ACTIVE;\r
- }\r
-\r
- Ptr += sizeof (UINT32);\r
-\r
- Ptr += sizeof (UINT16);\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
- NewOptionPtr = AllocateZeroPool (NewOptionSize);\r
- if (NewOptionPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\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
-\r
- Status = gRT->SetVariable (\r
- VarName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- NewOptionSize,\r
- NewOptionPtr\r
- );\r
-\r
- FreePool (NewOptionPtr);\r
- FreePool (BootOptionVar);\r
- }\r
-\r
- BOpt_GetBootOptions (CallbackData);\r
- return Status;\r
-}\r
-\r
-/**\r
- Update the Text Mode of Console.\r
-\r
- @param CallbackData The context data for BMM.\r
-\r
- @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
- @return Other value if the Text Mode of Console is not updated.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConMode (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Mode;\r
- CONSOLE_OUT_MODE ModeInfo;\r
-\r
- Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
-\r
- Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
- if (EFI_ERROR(Status)) {\r
- ModeInfo.Column = 80;\r
- ModeInfo.Row = 25;\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- VAR_CON_OUT_MODE,\r
- &gEfiGenericPlatformVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (CONSOLE_OUT_MODE),\r
- &ModeInfo\r
- );\r
-\r
- return Status;\r
-}\r