]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
Refine the save action for the BdsDxe.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / BootMaint.c
index 205537f494a556534f8611faa44b89b59ba58a99..9f3f6d3247c6f9abeddcd48eb6ad61f87f27a835 100644 (file)
@@ -428,6 +428,22 @@ BootMaintRouteConfig (
     Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID);\r
   }\r
 \r
+  //\r
+  // Change for "delete boot option" page need update NewBmmData->BootOptionOrder, so process \r
+  // NewBmmData->BootOptionOrder before NewBmmData->BootOptionDel\r
+  //\r
+  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {  \r
+    Status = Var_UpdateBootOrder (Private);\r
+  }\r
+\r
+  //\r
+  // Change for "delete driver option" page need update NewBmmData->DriverOptionOrder, so process \r
+  // NewBmmData->DriverOptionOrder before NewBmmData->DriverOptionDel\r
+  //\r
+  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
+    Status = Var_UpdateDriverOrder (Private);\r
+  }\r
+\r
   //\r
   // Check data which located in Boot Options Menu and save the settings if need\r
   //\r
@@ -438,6 +454,8 @@ BootMaintRouteConfig (
       NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
       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
@@ -453,18 +471,12 @@ BootMaintRouteConfig (
       NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
       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->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {  \r
-    Status = Var_UpdateBootOrder (Private);\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
-    Status = Var_UpdateDriverOrder (Private);\r
-  }\r
-\r
   if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0) {\r
     Status = gRT->SetVariable (\r
                     L"Timeout",\r
@@ -837,13 +849,28 @@ BootMaintCallback (
     if ((Value == NULL) || (ActionRequest == NULL)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    \r
-    //\r
-    // need to be subtituded.\r
-    //\r
-    // Update Select FD/HD/CD/NET/BEV Order Form\r
-    //\r
-    if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\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 if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      //\r
+      // Update Select FD/HD/CD/NET/BEV Order Form\r
+      //\r
 \r
       DisMap  = Private->BmmOldFakeNVData.DisableMap;\r
 \r
@@ -991,21 +1018,15 @@ BootMaintCallback (
     } 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
-          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
-        }\r
+        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+        break;\r
 \r
+      case KEY_VALUE_NO_SAVE_AND_EXIT:\r
         //\r
-        // Tell browser not to ask for confirmation of changes,\r
-        // since we have already applied or discarded.\r
+        // Restore local maintain data.\r
         //\r
-        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+        DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
         break;  \r
 \r
       case FORM_RESET:\r
@@ -1025,205 +1046,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_SET_FD_ORDER_ID:\r
-  case FORM_SET_HD_ORDER_ID:\r
-  case FORM_SET_CD_ORDER_ID:\r
-  case FORM_SET_NET_ORDER_ID:\r
-  case FORM_SET_BEV_ORDER_ID:\r
-    Var_UpdateBBSOption (Private, FormId);\r
-    break;\r
-\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
-    }\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
-    }\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
-    BdsDxeSetVariableAndReportStatusCodeOnError (\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
-\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
-    Index         = (UINT16)Private->CurrentTerminal;\r
-    NewMenuEntry                      = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
-    ASSERT (NewMenuEntry != NULL);\r
-\r
-    NewTerminalContext                = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate[Index];\r
-    ASSERT (CurrentFakeNVMap->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
-    NewTerminalContext->BaudRate      = BaudRateList[CurrentFakeNVMap->COMBaudRate[Index]].Value;\r
-    NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate[Index];\r
-    ASSERT (CurrentFakeNVMap->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
-    NewTerminalContext->DataBits      = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate[Index]].Value;\r
-    NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits[Index];\r
-    ASSERT (CurrentFakeNVMap->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
-    NewTerminalContext->StopBits      = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits[Index]].Value;\r
-    NewTerminalContext->ParityIndex   = CurrentFakeNVMap->COMParity[Index];\r
-    ASSERT (CurrentFakeNVMap->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
-    NewTerminalContext->Parity        = (UINT8) ParityList[CurrentFakeNVMap->COMParity[Index]].Value;\r
-    NewTerminalContext->TerminalType  = CurrentFakeNVMap->COMTerminalType[Index];\r
-    NewTerminalContext->FlowControl   = CurrentFakeNVMap->COMFlowControl[Index];\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->ConsoleInCheck[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->ConsoleInCheck[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->ConsoleOutCheck[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->ConsoleOutCheck[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->ConsoleErrCheck[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->ConsoleErrCheck[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
@@ -1253,6 +1075,7 @@ DiscardChangeHandler (
     ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
     for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
       CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
+      CurrentFakeNVMap->BootOptionDelMark[Index] = FALSE;\r
     }\r
     break;\r
 \r
@@ -1260,6 +1083,7 @@ DiscardChangeHandler (
     ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
     for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
       CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
+      CurrentFakeNVMap->DriverOptionDelMark[Index] = FALSE;\r
     }\r
     break;\r
 \r