/** @file\r
The functions for Boot Maintainence Main menu.\r
\r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
-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
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
{\r
END_DEVICE_PATH_TYPE,\r
END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
- { \r
+ {\r
(UINT8) (END_DEVICE_PATH_LENGTH),\r
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
}\r
\r
/**\r
This function will change video resolution and text mode\r
- according to defined setup mode or defined boot mode \r
+ according to defined setup mode or defined boot mode\r
\r
- @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
+ @param IsSetupMode Indicate mode is changed to setup mode or boot mode.\r
\r
@retval EFI_SUCCESS Mode is changed successfully.\r
@retval Others Mode failed to be changed.\r
EFI_STATUS Status;\r
UINTN Index;\r
UINTN CurrentColumn;\r
- UINTN CurrentRow; \r
+ UINTN CurrentRow;\r
\r
MaxGopMode = 0;\r
MaxTextMode = 0;\r
\r
//\r
- // Get current video resolution and text mode \r
+ // Get current video resolution and text mode\r
//\r
Status = gBS->HandleProtocol (\r
gST->ConsoleOutHandle,\r
);\r
if (EFI_ERROR (Status)) {\r
SimpleTextOut = NULL;\r
- } \r
+ }\r
\r
if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
return EFI_UNSUPPORTED;\r
NewHorizontalResolution = mBmmBootHorizontalResolution;\r
NewVerticalResolution = mBmmBootVerticalResolution;\r
NewColumns = mBmmBootTextModeColumn;\r
- NewRows = mBmmBootTextModeRow; \r
+ NewRows = mBmmBootTextModeRow;\r
}\r
\r
if (GraphicsOutput != NULL) {\r
MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
- } \r
+ }\r
\r
if (SimpleTextOut != NULL) {\r
MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
\r
}\r
\r
+/**\r
+ Converts the unicode character of the string from uppercase to lowercase.\r
+ This is a internal function.\r
+\r
+ @param ConfigString String to be converted\r
+\r
+**/\r
+VOID\r
+HiiToLower (\r
+ IN EFI_STRING ConfigString\r
+ )\r
+{\r
+ EFI_STRING String;\r
+ BOOLEAN Lower;\r
+\r
+ ASSERT (ConfigString != NULL);\r
+\r
+ //\r
+ // Convert all hex digits in range [A-F] in the configuration header to [a-f]\r
+ //\r
+ for (String = ConfigString, Lower = FALSE; *String != L'\0'; String++) {\r
+ if (*String == L'=') {\r
+ Lower = TRUE;\r
+ } else if (*String == L'&') {\r
+ Lower = FALSE;\r
+ } else if (Lower && *String >= L'A' && *String <= L'F') {\r
+ *String = (CHAR16) (*String - L'A' + L'a');\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Update the progress string through the offset value.\r
+\r
+ @param Offset The offset value\r
+ @param Configuration Point to the configuration string.\r
+\r
+**/\r
+EFI_STRING\r
+UpdateProgress(\r
+ IN UINTN Offset,\r
+ IN EFI_STRING Configuration\r
+)\r
+{\r
+ UINTN Length;\r
+ EFI_STRING StringPtr;\r
+ EFI_STRING ReturnString;\r
+\r
+ StringPtr = NULL;\r
+ ReturnString = NULL;\r
+\r
+ //\r
+ // &OFFSET=XXXX followed by a Null-terminator.\r
+ // Length = StrLen (L"&OFFSET=") + 4 + 1\r
+ //\r
+ Length = StrLen (L"&OFFSET=") + 4 + 1;\r
+\r
+ StringPtr = AllocateZeroPool (Length * sizeof (CHAR16));\r
+\r
+ if (StringPtr == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ UnicodeSPrint (\r
+ StringPtr,\r
+ (8 + 4 + 1) * sizeof (CHAR16),\r
+ L"&OFFSET=%04x",\r
+ Offset\r
+ );\r
+\r
+ ReturnString = StrStr (Configuration, StringPtr);\r
+\r
+ if (ReturnString == NULL) {\r
+ //\r
+ // If doesn't find the string in Configuration, convert the string to lower case then search again.\r
+ //\r
+ HiiToLower (StringPtr);\r
+ ReturnString = StrStr (Configuration, StringPtr);\r
+ }\r
+\r
+ FreePool (StringPtr);\r
+\r
+ return ReturnString;\r
+}\r
+\r
+/**\r
+ Update the terminal content in TerminalMenu.\r
+\r
+ @param BmmData The BMM fake NV data.\r
+\r
+**/\r
+VOID\r
+UpdateTerminalContent (\r
+ IN BMM_FAKE_NV_DATA *BmmData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ ASSERT (NewMenuEntry != NULL);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewTerminalContext->BaudRateIndex = BmmData->COMBaudRate[Index];\r
+ ASSERT (BmmData->COMBaudRate[Index] < (ARRAY_SIZE (BaudRateList)));\r
+ NewTerminalContext->BaudRate = BaudRateList[BmmData->COMBaudRate[Index]].Value;\r
+ NewTerminalContext->DataBitsIndex = BmmData->COMDataRate[Index];\r
+ ASSERT (BmmData->COMDataRate[Index] < (ARRAY_SIZE (DataBitsList)));\r
+ NewTerminalContext->DataBits = (UINT8) DataBitsList[BmmData->COMDataRate[Index]].Value;\r
+ NewTerminalContext->StopBitsIndex = BmmData->COMStopBits[Index];\r
+ ASSERT (BmmData->COMStopBits[Index] < (ARRAY_SIZE (StopBitsList)));\r
+ NewTerminalContext->StopBits = (UINT8) StopBitsList[BmmData->COMStopBits[Index]].Value;\r
+ NewTerminalContext->ParityIndex = BmmData->COMParity[Index];\r
+ ASSERT (BmmData->COMParity[Index] < (ARRAY_SIZE (ParityList)));\r
+ NewTerminalContext->Parity = (UINT8) ParityList[BmmData->COMParity[Index]].Value;\r
+ NewTerminalContext->TerminalType = BmmData->COMTerminalType[Index];\r
+ NewTerminalContext->FlowControl = BmmData->COMFlowControl[Index];\r
+ ChangeTerminalDevicePath (\r
+ NewTerminalContext->DevicePath,\r
+ FALSE\r
+ );\r
+ }\r
+}\r
+\r
+/**\r
+ Update the console content in ConsoleMenu.\r
+\r
+ @param ConsoleName The name for the console device type.\r
+ @param BmmData The BMM fake NV data.\r
+\r
+**/\r
+VOID\r
+UpdateConsoleContent(\r
+ IN CHAR16 *ConsoleName,\r
+ IN BMM_FAKE_NV_DATA *BmmData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ if (StrCmp (ConsoleName, L"ConIn") == 0) {\r
+ for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = BmmData->ConsoleInCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConIn = BmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
+ }\r
+ }\r
+\r
+ if (StrCmp (ConsoleName, L"ConOut") == 0) {\r
+ for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = BmmData->ConsoleOutCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConOut = BmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
+ }\r
+ }\r
+ if (StrCmp (ConsoleName, L"ErrOut") == 0) {\r
+ for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = BmmData->ConsoleErrCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsStdErr = BmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
+ }\r
+ }\r
+}\r
+\r
/**\r
This function allows a caller to extract the current configuration for one\r
or more named elements from the target driver.\r
\r
@param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
@param[in] Configuration A null-terminated Unicode string in\r
- <ConfigString> format. \r
+ <ConfigString> format.\r
@param[out] Progress A pointer to a string filled in with the\r
offset of the most recent '&' before the\r
first failing name / value pair (or the\r
successful.\r
\r
@retval EFI_SUCCESS The results have been distributed or are\r
- awaiting distribution. \r
+ awaiting distribution.\r
@retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
parts of the results that must be\r
stored awaiting possible future\r
EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
BMM_FAKE_NV_DATA *NewBmmData;\r
BMM_FAKE_NV_DATA *OldBmmData;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
BM_MENU_ENTRY *NewMenuEntry;\r
BM_LOAD_CONTEXT *NewLoadContext;\r
UINT16 Index;\r
BOOLEAN TerminalAttChange;\r
- BMM_CALLBACK_DATA *Private; \r
+ BMM_CALLBACK_DATA *Private;\r
+ UINTN Offset;\r
\r
if (Progress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiConfigRoutingProtocolGuid, \r
- NULL, \r
+ &gEfiHiiConfigRoutingProtocolGuid,\r
+ NULL,\r
(VOID **)&ConfigRouting\r
);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Private = BMM_CALLBACK_DATA_FROM_THIS (This); \r
+ Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
//\r
// Get Buffer Storage data from EFI variable\r
//\r
BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
OldBmmData = &Private->BmmOldFakeNVData;\r
NewBmmData = &Private->BmmFakeNvData;\r
+ Offset = 0;\r
//\r
// Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
//\r
&BufferSize,\r
Progress\r
);\r
- ASSERT_EFI_ERROR (Status); \r
+ ASSERT_EFI_ERROR (Status);\r
//\r
- // Compare new and old BMM configuration data and only do action for modified item to \r
+ // Compare new and old BMM configuration data and only do action for modified item to\r
// avoid setting unnecessary non-volatile variable\r
//\r
\r
//\r
// Check data which located in BMM main page and save the settings if need\r
- // \r
+ //\r
if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) {\r
Status = Var_UpdateBootNext (Private);\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootNext);\r
+ goto Exit;\r
+ }\r
}\r
\r
//\r
// Check data which located in Boot Options Menu and save the settings if need\r
- // \r
- if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) { \r
- for (Index = 0; \r
- ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); \r
+ //\r
+ if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) {\r
+ for (Index = 0;\r
+ ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0]))));\r
Index ++) {\r
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewBmmData->BootOptionDelMark[Index] = FALSE;\r
}\r
\r
- Var_DelBootOption ();\r
+ Status = Var_DelBootOption ();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootOptionDel);\r
+ goto Exit;\r
+ }\r
}\r
\r
if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {\r
Status = Var_UpdateBootOrder (Private);\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootOptionOrder);\r
+ goto Exit;\r
+ }\r
}\r
\r
if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
&(NewBmmData->BootTimeOut)\r
);\r
if (EFI_ERROR (Status)) {\r
- //\r
- // If set variable fail, and don't have the appropriate error status for RouteConfig fuction to return,\r
- // just return the EFI_NOT_FOUND.\r
- //\r
- if (Status == EFI_OUT_OF_RESOURCES) {\r
- return Status;\r
- } else {\r
- return EFI_NOT_FOUND;\r
- }\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootTimeOut);\r
+ goto Exit;\r
}\r
Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
}\r
\r
//\r
// Check data which located in Driver Options Menu and save the settings if need\r
- // \r
- if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) { \r
- for (Index = 0; \r
- ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); \r
+ //\r
+ if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) {\r
+ for (Index = 0;\r
+ ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0]))));\r
Index++) {\r
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewBmmData->DriverOptionDel[Index] = FALSE;\r
NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
}\r
- Var_DelDriverOption (); \r
+ Status = Var_DelDriverOption ();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverOptionDel);\r
+ goto Exit;\r
+ }\r
}\r
\r
- if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
+ if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {\r
Status = Var_UpdateDriverOrder (Private);\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverOptionOrder);\r
+ goto Exit;\r
+ }\r
}\r
\r
if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
- Var_UpdateConMode(Private);\r
+ Status = Var_UpdateConMode(Private);\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleOutMode);\r
+ goto Exit;\r
+ }\r
}\r
\r
TerminalAttChange = FALSE;\r
continue;\r
}\r
\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- ASSERT (NewMenuEntry != NULL);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];\r
- ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
- NewTerminalContext->BaudRate = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
- NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
- ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
- NewTerminalContext->DataBits = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
- NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
- ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
- NewTerminalContext->StopBits = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
- NewTerminalContext->ParityIndex = NewBmmData->COMParity[Index];\r
- ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
- NewTerminalContext->Parity = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value;\r
- NewTerminalContext->TerminalType = NewBmmData->COMTerminalType[Index];\r
- NewTerminalContext->FlowControl = NewBmmData->COMFlowControl[Index];\r
- ChangeTerminalDevicePath (\r
- NewTerminalContext->DevicePath,\r
- FALSE\r
- );\r
TerminalAttChange = TRUE;\r
}\r
if (TerminalAttChange) {\r
- Var_UpdateConsoleInpOption ();\r
- Var_UpdateConsoleOutOption ();\r
- Var_UpdateErrorOutOption ();\r
+ if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMBaudRate);\r
+ } else if (CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMDataRate);\r
+ } else if (CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMStopBits);\r
+ } else if (CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMParity);\r
+ } else if (CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMTerminalType);\r
+ } else if (CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMFlowControl);\r
+ }\r
+ Status = Var_UpdateConsoleInpOption ();\r
+ if (EFI_ERROR (Status)) {\r
+ goto Exit;\r
+ }\r
+ Status = Var_UpdateConsoleOutOption ();\r
+ if (EFI_ERROR (Status)) {\r
+ goto Exit;\r
+ }\r
+ Status = Var_UpdateErrorOutOption ();\r
+ if (EFI_ERROR (Status)) {\r
+ goto Exit;\r
+ }\r
}\r
//\r
// Check data which located in Console Options Menu and save the settings if need\r
//\r
if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){\r
- for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
- NewMenuEntry = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];\r
- }\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
+ Status = Var_UpdateConsoleInpOption();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleInCheck);\r
+ goto Exit;\r
}\r
- Var_UpdateConsoleInpOption();\r
}\r
\r
if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
- for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
- NewMenuEntry = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];\r
- }\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
+ Status = Var_UpdateConsoleOutOption();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleOutCheck);\r
+ goto Exit;\r
}\r
- Var_UpdateConsoleOutOption();\r
}\r
\r
if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
- for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
- NewMenuEntry = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];\r
- }\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
+ Status = Var_UpdateErrorOutOption();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleErrCheck);\r
+ goto Exit;\r
}\r
- Var_UpdateErrorOutOption();\r
}\r
\r
if (CompareMem (NewBmmData->BootDescriptionData, OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) != 0 ||\r
Status = Var_UpdateBootOption (Private);\r
NewBmmData->BootOptionChanged = FALSE;\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ if (CompareMem (NewBmmData->BootDescriptionData, OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootDescriptionData);\r
+ } else {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootOptionalData);\r
+ }\r
+ goto Exit;\r
}\r
BOpt_GetBootOptions (Private);\r
}\r
NewBmmData->DriverOptionChanged = FALSE;\r
NewBmmData->ForceReconnect = TRUE;\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ if (CompareMem (NewBmmData->DriverDescriptionData, OldBmmData->DriverDescriptionData, sizeof (NewBmmData->DriverDescriptionData)) != 0) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverDescriptionData);\r
+ } else {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverOptionalData);\r
+ }\r
+ goto Exit;\r
}\r
\r
BOpt_GetDriverOptions (Private);\r
CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));\r
\r
return EFI_SUCCESS;\r
+\r
+Exit:\r
+ //\r
+ // Fail to save the data, update the progress string.\r
+ //\r
+ *Progress = UpdateProgress (Offset, Configuration);\r
+ if (Status == EFI_OUT_OF_RESOURCES) {\r
+ return Status;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
}\r
\r
/**\r
BMM_CALLBACK_DATA *Private;\r
BM_MENU_ENTRY *NewMenuEntry;\r
BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
+ BMM_FAKE_NV_DATA *OldFakeNVMap;\r
UINTN Index;\r
EFI_DEVICE_PATH_PROTOCOL * File;\r
\r
// 2. Re-scan the BootOption menus (including the legacy boot option).\r
//\r
CustomizeMenus ();\r
+ EfiBootManagerRefreshAllBootOption ();\r
BOpt_GetBootOptions (Private);\r
mFirstEnterBMMForm = TRUE;\r
}\r
}\r
}\r
//\r
- // Retrive uncommitted data from Form Browser\r
+ // Retrieve uncommitted data from Form Browser\r
//\r
CurrentFakeNVMap = &Private->BmmFakeNvData;\r
+ OldFakeNVMap = &Private->BmmOldFakeNVData;\r
HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);\r
\r
if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
if (Value == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
UpdatePageId (Private, QuestionId);\r
\r
if (QuestionId < FILE_OPTION_OFFSET) {\r
if (QuestionId < CONFIG_OPTION_OFFSET) {\r
switch (QuestionId) {\r
case FORM_BOOT_ADD_ID:\r
- // Leave BMM and enter FileExplorer. \r
+ // Leave BMM and enter FileExplorer.\r
ChooseFile (NULL, L".efi", CreateBootOptionFromFile, &File);\r
break;\r
\r
if ((Value == NULL) || (ActionRequest == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
+ CleanUselessBeforeSubmit (Private);\r
CurrentFakeNVMap->BootOptionChanged = FALSE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
} else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
+ CleanUselessBeforeSubmit (Private);\r
CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
} else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
//\r
// Discard changes and exit formset\r
//\r
- CurrentFakeNVMap->DriverOptionalData[0] = 0x0000;\r
- CurrentFakeNVMap->DriverDescriptionData[0] = 0x0000;\r
+ ZeroMem (CurrentFakeNVMap->DriverOptionalData, sizeof (CurrentFakeNVMap->DriverOptionalData));\r
+ ZeroMem (CurrentFakeNVMap->BootDescriptionData, sizeof (CurrentFakeNVMap->BootDescriptionData));\r
+ ZeroMem (OldFakeNVMap->DriverOptionalData, sizeof (OldFakeNVMap->DriverOptionalData));\r
+ ZeroMem (OldFakeNVMap->DriverDescriptionData, sizeof (OldFakeNVMap->DriverDescriptionData));\r
CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
CurrentFakeNVMap->ForceReconnect = TRUE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
//\r
// Discard changes and exit formset\r
//\r
- CurrentFakeNVMap->BootOptionalData[0] = 0x0000;\r
- CurrentFakeNVMap->BootDescriptionData[0] = 0x0000;\r
+ ZeroMem (CurrentFakeNVMap->BootOptionalData, sizeof (CurrentFakeNVMap->BootOptionalData));\r
+ ZeroMem (CurrentFakeNVMap->BootDescriptionData, sizeof (CurrentFakeNVMap->BootDescriptionData));\r
+ ZeroMem (OldFakeNVMap->BootOptionalData, sizeof (OldFakeNVMap->BootOptionalData));\r
+ ZeroMem (OldFakeNVMap->BootDescriptionData, sizeof (OldFakeNVMap->BootDescriptionData));\r
CurrentFakeNVMap->BootOptionChanged = FALSE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
} else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
CurrentFakeNVMap->BootOptionChanged = TRUE;\r
} else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
CurrentFakeNVMap->DriverOptionChanged = TRUE;\r
- } \r
+ }\r
\r
if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
if (Value->b){\r
case KEY_VALUE_SAVE_AND_EXIT:\r
case KEY_VALUE_NO_SAVE_AND_EXIT:\r
if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
+ CleanUselessBeforeSubmit (Private);\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
} else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
DiscardChangeHandler (Private, CurrentFakeNVMap);\r
break;\r
}\r
}\r
+ //\r
+ // Update the content in Terminal menu and Console menu here.\r
+ //\r
+ if (QuestionId == COM_BAUD_RATE_QUESTION_ID + Private->CurrentTerminal || QuestionId == COM_DATA_RATE_QUESTION_ID + Private->CurrentTerminal ||\r
+ QuestionId == COM_PARITY_QUESTION_ID + Private->CurrentTerminal || QuestionId == COM_STOP_BITS_QUESTION_ID + Private->CurrentTerminal ||\r
+ QuestionId == COM_TERMINAL_QUESTION_ID + Private->CurrentTerminal || QuestionId == COM_FLOWCONTROL_QUESTION_ID + Private->CurrentTerminal\r
+ ) {\r
+ UpdateTerminalContent(CurrentFakeNVMap);\r
+ }\r
+ if ((QuestionId >= CON_IN_DEVICE_QUESTION_ID) && (QuestionId < CON_IN_DEVICE_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ UpdateConsoleContent (L"ConIn",CurrentFakeNVMap);\r
+ } else if ((QuestionId >= CON_OUT_DEVICE_QUESTION_ID) && (QuestionId < CON_OUT_DEVICE_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ UpdateConsoleContent (L"ConOut", CurrentFakeNVMap);\r
+ } else if ((QuestionId >= CON_ERR_DEVICE_QUESTION_ID) && (QuestionId < CON_ERR_DEVICE_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ UpdateConsoleContent (L"ErrOut", CurrentFakeNVMap);\r
+ }\r
}\r
\r
//\r
}\r
}\r
\r
+/**\r
+ This function is to clean some useless data before submit changes.\r
+\r
+ @param Private The BMM context data.\r
+\r
+**/\r
+VOID\r
+CleanUselessBeforeSubmit (\r
+ IN BMM_CALLBACK_DATA *Private\r
+ )\r
+{\r
+ UINT16 Index;\r
+ if (Private->BmmPreviousPageId != FORM_BOOT_DEL_ID) {\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ if (Private->BmmFakeNvData.BootOptionDel[Index] && !Private->BmmFakeNvData.BootOptionDelMark[Index]) {\r
+ Private->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+ Private->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;\r
+ }\r
+ }\r
+ }\r
+ if (Private->BmmPreviousPageId != FORM_DRV_DEL_ID) {\r
+ for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+ if (Private->BmmFakeNvData.DriverOptionDel[Index] && !Private->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
+ Private->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+ Private->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
/**\r
\r
Update the menus in the BMM page.\r
Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mBmmCallbackInfo->FormBrowser2);\r
ASSERT_EFI_ERROR (Status);\r
\r
- EfiBootManagerRefreshAllBootOption ();\r
-\r
//\r
// Create LoadOption in BmmCallbackInfo for Driver Callback\r
//\r
\r
CreateUpdateData();\r
//\r
- // Update boot maintenance manager page \r
+ // Update boot maintenance manager page\r
//\r
InitializeBmmConfig(mBmmCallbackInfo);\r
\r