]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c
MdeModulePkg:Create Boot Maintenance Manager Library
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / BootMaint / BootMaint.c
index 4f46ed69c06c1740c59c810d5685fbd3db9443ce..0a187f569691d654db68bcac7cea063973144894 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The functions for Boot Maintainence Main menu.\r
 \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2015, 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
@@ -296,9 +296,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
+  UINT16                          Index;\r
+  BOOLEAN                         TerminalAttChange;\r
   BMM_CALLBACK_DATA               *Private; \r
 \r
   if (Progress == NULL) {\r
@@ -368,6 +371,7 @@ BootMaintRouteConfig (
       NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
       NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
       NewBmmData->BootOptionDel[Index] = FALSE;\r
+      NewBmmData->BootOptionDelMark[Index] = FALSE;\r
     }\r
     \r
     Var_DelBootOption ();\r
@@ -375,7 +379,20 @@ BootMaintRouteConfig (
   \r
   if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {  \r
     Status = Var_UpdateBootOrder (Private);\r
-  } \r
+  }\r
+\r
+  if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
+    Status = gRT->SetVariable(\r
+                    L"Timeout",\r
+                    &gEfiGlobalVariableGuid,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    sizeof(UINT16),\r
+                    &(NewBmmData->BootTimeOut)\r
+                    );\r
+    ASSERT_EFI_ERROR(Status);\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
@@ -388,13 +405,112 @@ BootMaintRouteConfig (
       NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
       NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
       NewBmmData->DriverOptionDel[Index] = FALSE;\r
+      NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
     }\r
     Var_DelDriverOption ();  \r
   }\r
   \r
   if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
     Status = Var_UpdateDriverOrder (Private);\r
-  }      \r
+  }\r
+\r
+  if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
+    Var_UpdateConMode(Private);\r
+  }\r
+\r
+  TerminalAttChange = FALSE;\r
+  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+\r
+    //\r
+    // only need update modified items\r
+    //\r
+    if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) {\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
+  }\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
+    }\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
+    }\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
+    }\r
+    Var_UpdateErrorOutOption();\r
+  }\r
 \r
   //\r
   // After user do the save action, need to update OldBmmData.\r
@@ -436,7 +552,6 @@ BootMaintCallback (
   BMM_CALLBACK_DATA *Private;\r
   BM_MENU_ENTRY     *NewMenuEntry;\r
   BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
-  EFI_STATUS        Status;\r
   UINTN             OldValue;\r
   UINTN             NewValue;\r
   UINTN             Number;\r
@@ -583,32 +698,44 @@ BootMaintCallback (
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
-    switch (QuestionId) {\r
-    case KEY_VALUE_SAVE_AND_EXIT:\r
-    case KEY_VALUE_NO_SAVE_AND_EXIT:\r
-      if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
-        Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-      } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
-        DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+    if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      if (Value->b){\r
+        //\r
+        // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
+        //\r
+        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
+      } else {\r
+        //\r
+        // Means user remove the old check status.\r
+        //\r
+        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
       }\r
+    } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      if (Value->b){\r
+        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
+      } else {\r
+        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
+      }\r
+    } else {\r
+      switch (QuestionId) {\r
+      case KEY_VALUE_SAVE_AND_EXIT:\r
+      case KEY_VALUE_NO_SAVE_AND_EXIT:\r
+        if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
+          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+        } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
+          DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+        }\r
 \r
-      //\r
-      // Tell browser not to ask for confirmation of changes,\r
-      // since we have already applied or discarded.\r
-      //\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
-\r
-      break;\r
+        break;\r
  \r
-    case FORM_RESET:\r
-      gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
-      return EFI_UNSUPPORTED;\r
+      case FORM_RESET:\r
+        gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+        return EFI_UNSUPPORTED;\r
 \r
-    default:\r
-      break;\r
+      default:\r
+        break;\r
+      }\r
     }\r
   }\r
 \r
@@ -620,198 +747,6 @@ BootMaintCallback (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Function handling request to apply changes for BMM pages.\r
-\r
-  @param Private            Pointer to callback data buffer.\r
-  @param CurrentFakeNVMap   Pointer to buffer holding data of various values used by BMM\r
-  @param FormId             ID of the form which has sent the request to apply change.\r
-\r
-  @retval  EFI_SUCCESS       Change successfully applied.\r
-  @retval  Other             Error occurs while trying to apply changes.\r
-\r
-**/\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
-  IN  BMM_CALLBACK_DATA               *Private,\r
-  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap,\r
-  IN  EFI_FORM_ID                     FormId\r
-  )\r
-{\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
-  BM_LOAD_CONTEXT     *NewLoadContext;\r
-  BM_MENU_ENTRY       *NewMenuEntry;\r
-  EFI_STATUS          Status;\r
-  UINT16              Index;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  switch (FormId) {\r
-  case FORM_BOOT_DEL_ID:\r
-    for (Index = 0; \r
-         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])))); \r
-         Index ++) {\r
-      NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
-      CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
-    }\r
-\r
-    Var_DelBootOption ();\r
-    break;\r
-\r
-  case FORM_DRV_DEL_ID:\r
-    for (Index = 0; \r
-         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])))); \r
-         Index++) {\r
-      NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
-      CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
-    }\r
-\r
-    Var_DelDriverOption ();\r
-    break;\r
-\r
-  case FORM_BOOT_CHG_ID:\r
-    Status = Var_UpdateBootOrder (Private);\r
-    break;\r
-\r
-  case FORM_DRV_CHG_ID:\r
-    Status = Var_UpdateDriverOrder (Private);\r
-    break;\r
-\r
-  case FORM_TIME_OUT_ID:\r
-    Status = gRT->SetVariable (\r
-                    L"Timeout",\r
-                    &gEfiGlobalVariableGuid,\r
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                    sizeof (UINT16),\r
-                    &(CurrentFakeNVMap->BootTimeOut)\r
-                    );\r
-    ASSERT_EFI_ERROR(Status);\r
-\r
-    Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
-    break;\r
-\r
-  case FORM_BOOT_NEXT_ID:\r
-    Status = Var_UpdateBootNext (Private);\r
-    break;\r
-\r
-  case FORM_CON_MODE_ID:\r
-    Status = Var_UpdateConMode (Private);\r
-    break;\r
-\r
-  case FORM_CON_COM_SETUP_ID:\r
-    NewMenuEntry                      = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
-\r
-    ASSERT (NewMenuEntry != NULL);\r
-\r
-    NewTerminalContext                = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
-    ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
-    NewTerminalContext->BaudRate      = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
-    NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
-    ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
-    NewTerminalContext->DataBits      = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
-    NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
-    ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
-    NewTerminalContext->StopBits      = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
-    NewTerminalContext->ParityIndex   = CurrentFakeNVMap->COMParity;\r
-    ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0])));\r
-    NewTerminalContext->Parity        = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
-    NewTerminalContext->TerminalType  = CurrentFakeNVMap->COMTerminalType;\r
-\r
-    ChangeTerminalDevicePath (\r
-      NewTerminalContext->DevicePath,\r
-      FALSE\r
-      );\r
-\r
-    Var_UpdateConsoleInpOption ();\r
-    Var_UpdateConsoleOutOption ();\r
-    Var_UpdateErrorOutOption ();\r
-    break;\r
-\r
-  case FORM_CON_IN_ID:\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 = CurrentFakeNVMap->ConsoleCheck[Index];\r
-    }\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 = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
-    }\r
-\r
-    Var_UpdateConsoleInpOption ();\r
-    break;\r
-\r
-  case FORM_CON_OUT_ID:\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 = CurrentFakeNVMap->ConsoleCheck[Index];\r
-    }\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  = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
-    }\r
-\r
-    Var_UpdateConsoleOutOption ();\r
-    break;\r
-\r
-  case FORM_CON_ERR_ID:\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 = CurrentFakeNVMap->ConsoleCheck[Index];\r
-    }\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  = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
-    }\r
-\r
-    Var_UpdateErrorOutOption ();\r
-    break;\r
-\r
-  case FORM_DRV_ADD_HANDLE_DESC_ID:\r
-    Status = Var_UpdateDriverOption (\r
-               Private,\r
-               Private->BmmHiiHandle,\r
-               CurrentFakeNVMap->DriverAddHandleDesc,\r
-               CurrentFakeNVMap->DriverAddHandleOptionalData,\r
-               CurrentFakeNVMap->DriverAddForceReconnect\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Error;\r
-    }\r
-\r
-    BOpt_GetDriverOptions (Private);\r
-    CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-\r
-Error:\r
-  return Status;\r
-}\r
-\r
 /**\r
   Discard all changes done to the BMM pages such as Boot Order change,\r
   Driver order change.\r
@@ -995,27 +930,65 @@ InitializeDrivers(
   FreePool (HiiHandles);\r
 }\r
 \r
-\r
 /**\r
-  Create dynamic code for BMM.\r
+   Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and\r
+   BmmOldFakeNVData member in BMM context data.\r
 \r
-  @param  BmmCallbackInfo        The BMM context data.\r
+  @param CallbackData    The BMM context data.\r
 \r
 **/\r
 VOID\r
-InitializeBmmConfig(\r
-  IN BMM_CALLBACK_DATA        *BmmCallbackInfo\r
+InitializeBmmConfig (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
   )\r
 {\r
-  UpdateBootDelPage (BmmCallbackInfo);\r
-  UpdateDrvDelPage (BmmCallbackInfo);\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT16          Index;\r
+\r
+  ASSERT (CallbackData != NULL);\r
 \r
-  if (TerminalMenu.MenuNumber > 0) {\r
-    BmmCallbackInfo->CurrentTerminal = 0;\r
-    UpdateTerminalPage (BmmCallbackInfo);\r
+  InitializeDrivers (CallbackData);\r
+\r
+  //\r
+  // Initialize data which located in BMM main page\r
+  //\r
+  CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
+  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+    NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+    NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+    if (NewLoadContext->IsBootNext) {\r
+      CallbackData->BmmFakeNvData.BootNext = Index;\r
+      break;\r
+    }\r
   }\r
 \r
-  InitializeDrivers (BmmCallbackInfo);\r
+  CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
+\r
+  //\r
+  // Initialize data which located in Boot Options Menu\r
+  //\r
+  GetBootOrder (CallbackData);\r
+\r
+  //\r
+  // Initialize data which located in Driver Options Menu\r
+  //\r
+  GetDriverOrder (CallbackData);\r
+\r
+  //\r
+  // Initialize data which located in Console Options Menu\r
+  //  \r
+  GetConsoleOutMode (CallbackData);\r
+  GetConsoleInCheck (CallbackData);\r
+  GetConsoleOutCheck (CallbackData);\r
+  GetConsoleErrCheck (CallbackData);\r
+  GetTerminalAttribute (CallbackData);\r
+\r
+  //\r
+  // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
+  //\r
+  CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
 }\r
 \r
 /**\r
@@ -1273,7 +1246,7 @@ InitBootMaintenance(
   BmmCallbackInfo->BmmPreviousPageId             = FORM_MAIN_ID;\r
   BmmCallbackInfo->BmmCurrentPageId              = FORM_MAIN_ID;\r
   BmmCallbackInfo->FeConfigAccess.ExtractConfig  = FakeExtractConfig;\r
-  BmmCallbackInfo->FeConfigAccess.RouteConfig    = FakeRouteConfig;\r
+  BmmCallbackInfo->FeConfigAccess.RouteConfig    = FileExplorerRouteConfig;\r
   BmmCallbackInfo->FeConfigAccess.Callback       = FileExplorerCallback;\r
   BmmCallbackInfo->FeCurrentState                = FileExplorerStateInActive;\r
   BmmCallbackInfo->FeDisplayContext              = FileExplorerDisplayUnknown;\r
@@ -1360,7 +1333,6 @@ InitBootMaintenance(
   Remove the installed BootMaint and FileExplorer HiiPackages.\r
 \r
 **/\r
-\r
 VOID\r
 FreeBMPackage(\r
   VOID\r