\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
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
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
// \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
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
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
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
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
- Var_UpdateConsoleInpOption();\r
+ Status = Var_UpdateConsoleInpOption();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleInCheck);\r
+ goto Exit;\r
+ }\r
}\r
\r
if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
- Var_UpdateConsoleOutOption();\r
+ Status = Var_UpdateConsoleOutOption();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleOutCheck);\r
+ goto Exit;\r
+ }\r
}\r
\r
if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
- Var_UpdateErrorOutOption();\r
+ Status = Var_UpdateErrorOutOption();\r
+ if (EFI_ERROR (Status)) {\r
+ Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleErrCheck);\r
+ goto Exit;\r
+ }\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