]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c
MdeModulePkg/Library: Fix typos in comments and variables
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootMaintenance.c
index a1905963af50614ded60b1edd90320cacc1e616a..e2afe43abacdb325016fa73cfc5dc85d77cc81ac 100644 (file)
@@ -443,6 +443,193 @@ BmmExtractDevicePathFromHiiHandle (
 \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] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
+    NewTerminalContext->BaudRate      = BaudRateList[BmmData->COMBaudRate[Index]].Value;\r
+    NewTerminalContext->DataBitsIndex = BmmData->COMDataRate[Index];\r
+    ASSERT (BmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
+    NewTerminalContext->DataBits      = (UINT8) DataBitsList[BmmData->COMDataRate[Index]].Value;\r
+    NewTerminalContext->StopBitsIndex = BmmData->COMStopBits[Index];\r
+    ASSERT (BmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
+    NewTerminalContext->StopBits      = (UINT8) StopBitsList[BmmData->COMStopBits[Index]].Value;\r
+    NewTerminalContext->ParityIndex   = BmmData->COMParity[Index];\r
+    ASSERT (BmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\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 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
@@ -589,13 +776,12 @@ BootMaintRouteConfig (
   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
@@ -630,6 +816,7 @@ BootMaintRouteConfig (
   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
@@ -651,6 +838,10 @@ BootMaintRouteConfig (
   //         \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
@@ -667,11 +858,19 @@ BootMaintRouteConfig (
       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
@@ -683,15 +882,8 @@ BootMaintRouteConfig (
                     &(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
@@ -709,15 +901,27 @@ BootMaintRouteConfig (
       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
@@ -735,83 +939,60 @@ BootMaintRouteConfig (
       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
@@ -819,7 +1000,12 @@ BootMaintRouteConfig (
     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
@@ -836,7 +1022,12 @@ BootMaintRouteConfig (
     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
@@ -848,6 +1039,17 @@ BootMaintRouteConfig (
   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
@@ -882,6 +1084,7 @@ BootMaintCallback (
   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
@@ -913,9 +1116,10 @@ BootMaintCallback (
     }\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
@@ -1018,8 +1222,10 @@ BootMaintCallback (
       //\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
@@ -1027,8 +1233,10 @@ BootMaintCallback (
       //\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
@@ -1076,6 +1284,22 @@ BootMaintCallback (
         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"ConErr", CurrentFakeNVMap);\r
+    }\r
   }\r
 \r
   //\r