]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg:Full support F10 hot key in UiApp.
authorDandan Bi <dandan.bi@intel.com>
Thu, 20 Aug 2015 07:05:53 +0000 (07:05 +0000)
committerdandanbi <dandanbi@Edk2>
Thu, 20 Aug 2015 07:05:53 +0000 (07:05 +0000)
In current UiApp/Boot Maintenance manager,some pages don't support F10,
they use Commit Changes and Exit menu to save changes.Now support F10
in these pages.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18249 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni
MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c
MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h
MdeModulePkg/Application/UiApp/BootMaint/ConsoleOption.c
MdeModulePkg/Application/UiApp/BootMaint/Data.c
MdeModulePkg/Application/UiApp/BootMaint/FE.vfr
MdeModulePkg/Application/UiApp/BootMaint/FileExplorer.c
MdeModulePkg/Application/UiApp/BootMaint/FormGuid.h
MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c
MdeModulePkg/Application/UiApp/BootMaint/Variable.c

index a208127ac6ea76ec5dde6824babf05583a1cfa8d..f91d5992899a4eb12b021e9d8cdf749f74f6734c 100644 (file)
Binary files a/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni and b/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni differ
index 0a6eb6c99b4648254979efe7df19b020cc3725d3..0a187f569691d654db68bcac7cea063973144894 100644 (file)
@@ -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
-  if (TerminalMenu.MenuNumber > 0) {\r
-    BmmCallbackInfo->CurrentTerminal = 0;\r
-    UpdateTerminalPage (BmmCallbackInfo);\r
+  ASSERT (CallbackData != NULL);\r
+\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
index e1ac3076390b5928a4a800835a6b24bcc556f604..23d2d2b6d1b4344e8310b3d486d2f6365632f5c6 100644 (file)
@@ -179,6 +179,9 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {
 #define CON_ERR_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM2)\r
 #define CON_MODE_VAR_OFFSET             VAR_OFFSET (ConsoleOutMode)\r
 #define CON_DEVICE_VAR_OFFSET           VAR_OFFSET (ConsoleCheck)\r
+#define CON_IN_DEVICE_VAR_OFFSET        VAR_OFFSET (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_VAR_OFFSET       VAR_OFFSET (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_VAR_OFFSET       VAR_OFFSET (ConsoleErrCheck)\r
 #define BOOT_OPTION_ORDER_VAR_OFFSET    VAR_OFFSET (BootOptionOrder)\r
 #define DRIVER_OPTION_ORDER_VAR_OFFSET  VAR_OFFSET (DriverOptionOrder)\r
 #define BOOT_OPTION_DEL_VAR_OFFSET      VAR_OFFSET (BootOptionDel)\r
@@ -189,6 +192,7 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {
 #define COM_STOP_BITS_VAR_OFFSET        VAR_OFFSET (COMStopBits)\r
 #define COM_PARITY_VAR_OFFSET           VAR_OFFSET (COMParity)\r
 #define COM_TERMINAL_VAR_OFFSET         VAR_OFFSET (COMTerminalType)\r
+#define COM_FLOWCONTROL_VAR_OFFSET      VAR_OFFSET (COMFlowControl)\r
 \r
 #define BOOT_TIME_OUT_QUESTION_ID       QUESTION_ID (BootTimeOut)\r
 #define BOOT_NEXT_QUESTION_ID           QUESTION_ID (BootNext)\r
@@ -213,6 +217,9 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {
 #define CON_ERR_COM2_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM2)\r
 #define CON_MODE_QUESTION_ID            QUESTION_ID (ConsoleOutMode)\r
 #define CON_DEVICE_QUESTION_ID          QUESTION_ID (ConsoleCheck)\r
+#define CON_IN_DEVICE_QUESTION_ID       QUESTION_ID (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_QUESTION_ID      QUESTION_ID (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_QUESTION_ID      QUESTION_ID (ConsoleErrCheck)\r
 #define BOOT_OPTION_ORDER_QUESTION_ID   QUESTION_ID (BootOptionOrder)\r
 #define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
 #define BOOT_OPTION_DEL_QUESTION_ID     QUESTION_ID (BootOptionDel)\r
@@ -223,6 +230,7 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {
 #define COM_STOP_BITS_QUESTION_ID       QUESTION_ID (COMStopBits)\r
 #define COM_PARITY_QUESTION_ID          QUESTION_ID (COMParity)\r
 #define COM_TERMINAL_QUESTION_ID        QUESTION_ID (COMTerminalType)\r
+#define COM_FLOWCONTROL_QUESTION_ID     QUESTION_ID (COMFlowControl)\r
 \r
 #define STRING_DEPOSITORY_NUMBER        8\r
 \r
@@ -247,6 +255,8 @@ typedef struct {
   UINT8                     ParityIndex;\r
   UINT8                     StopBitsIndex;\r
 \r
+  UINT8                     FlowControl;\r
+\r
   UINT8                     IsConIn;\r
   UINT8                     IsConOut;\r
   UINT8                     IsStdErr;\r
@@ -1309,24 +1319,6 @@ CleanUpStringDepository (
   VOID\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
 /**\r
   Discard all changes done to the BMM pages such as Boot Order change,\r
   Driver order change.\r
@@ -1386,6 +1378,47 @@ UpdateFileExplorer (
   IN UINT16                       KeyValue\r
   );\r
 \r
+/**\r
+  This function applies changes in a driver's configuration.\r
+  Input is a Configuration, which has the routing data for this\r
+  driver followed by name / value configuration pairs. The driver\r
+  must apply those pairs to its configurable storage. If the\r
+  driver's configuration is stored in a linear block of data\r
+  and the driver's name / value pairs are in <BlockConfig>\r
+  format, it may use the ConfigToBlock helper function (above) to\r
+  simplify the job. Currently not implemented.\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
+  @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
+                                  beginn ing of the string if the failure\r
+                                  is in the first name / value pair) or\r
+                                  the terminating NULL if all was\r
+                                  successful.\r
+\r
+  @retval EFI_SUCCESS             The results have been distributed or are\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
+                                  protocols.\r
+  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
+                                  Results parameter would result\r
+                                  in this type of error.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data\r
+                                  was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FileExplorerRouteConfig (\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+  IN CONST EFI_STRING                     Configuration,\r
+  OUT EFI_STRING                          *Progress\r
+  );\r
+\r
 /**\r
   This function processes the results of changes in configuration.\r
   When user select a interactive opcode, this callback will be triggered.\r
@@ -1442,6 +1475,58 @@ InitBootMaintenance(
   VOID\r
   );\r
 \r
+/**\r
+\r
+  Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/  \r
+VOID  \r
+GetConsoleInCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/      \r
+VOID    \r
+GetConsoleOutCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/        \r
+VOID  \r
+GetConsoleErrCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+  to BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/        \r
+VOID  \r
+GetTerminalAttribute (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
 //\r
 // Global variable in this program (defined in data.c)\r
 //\r
@@ -1468,6 +1553,8 @@ extern STRING_DEPOSITORY          *DriverOptionStrDepository;
 extern STRING_DEPOSITORY          *DriverOptionHelpStrDepository;\r
 extern STRING_DEPOSITORY          *TerminalStrDepository;\r
 extern EFI_DEVICE_PATH_PROTOCOL   EndDevicePath[];\r
+extern UINT16                     mFlowControlType[2];\r
+extern UINT32                     mFlowControlValue[2];\r
 \r
 //\r
 // Shared IFR form update data\r
index f164db20510b9c9dddf4962481b2fa571636be70..f4b0e66d8ce3670a71b97e728e596db7b0c8bec7 100644 (file)
@@ -998,3 +998,150 @@ GetConsoleOutMode (
     }\r
   }\r
 }\r
+\r
+/**\r
+\r
+  Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/  \r
+VOID  \r
+GetConsoleInCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINT16              Index;\r
+  BM_MENU_ENTRY       *NewMenuEntry; \r
+  UINT8               *ConInCheck;\r
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+\r
+  ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+  for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
+    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
+    ConInCheck[Index] = NewConsoleContext->IsActive;\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/      \r
+VOID    \r
+GetConsoleOutCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINT16              Index;\r
+  BM_MENU_ENTRY       *NewMenuEntry; \r
+  UINT8               *ConOutCheck;\r
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
+  \r
+  ASSERT (CallbackData != NULL);\r
+  ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+  for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
+    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
+    ConOutCheck[Index] = NewConsoleContext->IsActive;\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/        \r
+VOID  \r
+GetConsoleErrCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINT16              Index;\r
+  BM_MENU_ENTRY       *NewMenuEntry; \r
+  UINT8               *ConErrCheck;\r
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+  ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+  for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
+    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
+    ConErrCheck[Index] = NewConsoleContext->IsActive;\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+  to BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID  \r
+GetTerminalAttribute (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  BMM_FAKE_NV_DATA     *CurrentFakeNVMap;\r
+  BM_MENU_ENTRY        *NewMenuEntry;\r
+  BM_TERMINAL_CONTEXT  *NewTerminalContext;    \r
+  UINT16               TerminalIndex;  \r
+  UINT8                AttributeIndex;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+\r
+  CurrentFakeNVMap = &CallbackData->BmmFakeNvData;     \r
+  for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
+       (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) {  \r
+    NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
+    NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
+      if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
+        NewTerminalContext->BaudRateIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) {\r
+      if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
+        NewTerminalContext->DataBitsIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }    \r
+\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) {\r
+      if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
+        NewTerminalContext->ParityIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }\r
+\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) {\r
+      if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
+        NewTerminalContext->StopBitsIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }\r
+    CurrentFakeNVMap->COMBaudRate[TerminalIndex]     = NewTerminalContext->BaudRateIndex;\r
+    CurrentFakeNVMap->COMDataRate[TerminalIndex]     = NewTerminalContext->DataBitsIndex;\r
+    CurrentFakeNVMap->COMStopBits[TerminalIndex]     = NewTerminalContext->StopBitsIndex;\r
+    CurrentFakeNVMap->COMParity[TerminalIndex]       = NewTerminalContext->ParityIndex; \r
+    CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
+    CurrentFakeNVMap->COMFlowControl[TerminalIndex]  = NewTerminalContext->FlowControl;\r
+  }\r
+}\r
+\r
index caf6c609ed8f776a12b223f2793643c5445aee37..4f05ac5fcc43ef849044198eb13ccfb2f69a9552 100644 (file)
@@ -38,6 +38,19 @@ UINT16              TerminalType[] = {
   STRING_TOKEN(STR_COM_TYPE_4),\r
 };\r
 \r
+///\r
+/// Flow Control type string token storage\r
+///\r
+UINT16              mFlowControlType[2] = {\r
+  STRING_TOKEN(STR_NONE_FLOW_CONTROL),\r
+  STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL)\r
+};\r
+\r
+UINT32              mFlowControlValue[2] = {\r
+  0,\r
+  UART_FLOW_CONTROL_HARDWARE\r
+};\r
+\r
 ///\r
 /// File system selection menu\r
 ///\r
index 0a9bb3e0f4593295308cd9225d5fda9404fdf600..1401d2172138ede6f0ee7bff60ec4cf9bb5fee0a 100644 (file)
@@ -41,18 +41,22 @@ formset
 \r
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
 \r
-       string    varid    = FeData.DescriptionData,\r
+       string    varid    = FeData.BootDescriptionData,\r
+                 questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
                  prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
                  minsize  = 6,\r
                  maxsize  = 75,\r
        endstring;\r
 \r
-       string    varid    = FeData.OptionalData,\r
-                       prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
-                       help     = STRING_TOKEN(STR_NULL_STRING),\r
-                       minsize  = 0,\r
-                       maxsize  = 120,\r
+       string    varid    = FeData.BootOptionalData,\r
+                 questionid = KEY_VALUE_BOOT_OPTION,\r
+                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+                 help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
+                 minsize  = 0,\r
+                 maxsize  = 120,\r
        endstring;\r
 \r
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
@@ -81,16 +85,20 @@ formset
 \r
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
 \r
-       string    varid    = FeData.DescriptionData,\r
+       string    varid    = FeData.DriverDescriptionData,\r
+                 questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
                  prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
                  minsize  = 6,\r
                  maxsize  = 75,\r
        endstring;\r
 \r
-       string    varid    = FeData.OptionalData,\r
+       string    varid    = FeData.DriverOptionalData,\r
+                 questionid = KEY_VALUE_DRIVER_OPTION,\r
                  prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
                  minsize  = 0,\r
                  maxsize  = 120,\r
        endstring;\r
index e2e6b0335bef3372d048c3c8592e643adc35d388..e4a68ef2742c220e5bf73c1631787a10536377d6 100644 (file)
@@ -168,8 +168,16 @@ UpdateFileExplorer (
       case FileExplorerStateAddDriverOptionState:\r
         if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {\r
           FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
+          if (!CallbackData->FeFakeNvData.BootOptionChanged) {\r
+            ZeroMem (CallbackData->FeFakeNvData.BootDescriptionData, sizeof (CallbackData->FeFakeNvData.BootDescriptionData));\r
+            ZeroMem (CallbackData->FeFakeNvData.BootOptionalData, sizeof (CallbackData->FeFakeNvData.BootOptionalData));\r
+          }\r
         } else {\r
           FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
+          if (!CallbackData->FeFakeNvData.DriverOptionChanged) {\r
+            ZeroMem (CallbackData->FeFakeNvData.DriverDescriptionData, sizeof (CallbackData->FeFakeNvData.DriverDescriptionData));\r
+            ZeroMem (CallbackData->FeFakeNvData.DriverOptionalData, sizeof (CallbackData->FeFakeNvData.DriverOptionalData));\r
+          }\r
         }\r
 \r
         CallbackData->MenuEntry = NewMenuEntry;\r
@@ -207,6 +215,129 @@ UpdateFileExplorer (
   return ExitFileExplorer;\r
 }\r
 \r
+/**\r
+  This function applies changes in a driver's configuration.\r
+  Input is a Configuration, which has the routing data for this\r
+  driver followed by name / value configuration pairs. The driver\r
+  must apply those pairs to its configurable storage. If the\r
+  driver's configuration is stored in a linear block of data\r
+  and the driver's name / value pairs are in <BlockConfig>\r
+  format, it may use the ConfigToBlock helper function (above) to\r
+  simplify the job. Currently not implemented.\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
+  @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
+                                  beginn ing of the string if the failure\r
+                                  is in the first name / value pair) or\r
+                                  the terminating NULL if all was\r
+                                  successful.\r
+\r
+  @retval EFI_SUCCESS             The results have been distributed or are\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
+                                  protocols.\r
+  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
+                                  Results parameter would result\r
+                                  in this type of error.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data\r
+                                  was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FileExplorerRouteConfig (\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+  IN CONST EFI_STRING                     Configuration,\r
+  OUT EFI_STRING                          *Progress\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  UINTN                           BufferSize;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
+  FILE_EXPLORER_NV_DATA           *FeData;\r
+  BMM_CALLBACK_DATA               *Private;\r
+\r
+  if (Progress == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  *Progress = Configuration;\r
+\r
+  if (Configuration == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Check routing data in <ConfigHdr>.\r
+  // Note: there is no name for Name/Value storage, only GUID will be checked\r
+  //\r
+  if (!HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiConfigRoutingProtocolGuid, \r
+                  NULL, \r
+                  (VOID**) &ConfigRouting\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
+  //\r
+  // Get Buffer Storage data from EFI variable\r
+  //\r
+  BufferSize = sizeof (FILE_EXPLORER_NV_DATA );\r
+  FeData = &Private->FeFakeNvData;\r
+\r
+  //\r
+  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
+  //\r
+  Status = ConfigRouting->ConfigToBlock (\r
+                            ConfigRouting,\r
+                            Configuration,\r
+                            (UINT8 *) FeData,\r
+                            &BufferSize,\r
+                            Progress\r
+                            );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (FeData->BootDescriptionData[0] != 0x00 || FeData->BootOptionalData[0] != 0x00) {\r
+    Status = Var_UpdateBootOption (Private, FeData);\r
+    Private->FeFakeNvData.BootOptionChanged = FALSE;\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    BOpt_GetBootOptions (Private);\r
+    CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
+  }\r
+\r
+  if (FeData->DriverDescriptionData[0] != 0x00 || FeData->DriverOptionalData[0] != 0x00) {\r
+    Status = Var_UpdateDriverOption (\r
+              Private,\r
+              Private->FeHiiHandle,\r
+              FeData->DriverDescriptionData,\r
+              FeData->DriverOptionalData,\r
+              FeData->ForceReconnect\r
+              );\r
+    Private->FeFakeNvData.DriverOptionChanged = FALSE;\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    BOpt_GetDriverOptions (Private);\r
+    CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This function processes the results of changes in configuration.\r
   When user select a interactive opcode, this callback will be triggered.\r
@@ -269,43 +400,30 @@ FileExplorerCallback (
     if ((Value == NULL) || (ActionRequest == NULL)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    \r
-    if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
-      //\r
-      // Apply changes and exit formset\r
-      //\r
-      if (FileExplorerStateAddBootOption == Private->FeCurrentState) {\r
-        Status = Var_UpdateBootOption (Private, NvRamMap);\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-\r
-        BOpt_GetBootOptions (Private);\r
-        CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
-      } else if (FileExplorerStateAddDriverOptionState == Private->FeCurrentState) {\r
-        Status = Var_UpdateDriverOption (\r
-                  Private,\r
-                  Private->FeHiiHandle,\r
-                  NvRamMap->DescriptionData,\r
-                  NvRamMap->OptionalData,\r
-                  NvRamMap->ForceReconnect\r
-                  );\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-\r
-        BOpt_GetDriverOptions (Private);\r
-        CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
-      }\r
 \r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
+    if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT){\r
+      NvRamMap->BootOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+    } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER){\r
+      NvRamMap->DriverOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
       //\r
       // Discard changes and exit formset\r
       //\r
-      NvRamMap->OptionalData[0]     = 0x0000;\r
-      NvRamMap->DescriptionData[0]  = 0x0000;\r
+      NvRamMap->BootOptionalData[0]     = 0x0000;\r
+      NvRamMap->BootDescriptionData[0]  = 0x0000;\r
+      NvRamMap->BootOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    } else if ( QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER){\r
+      NvRamMap->BootOptionalData[0]     = 0x0000;\r
+      NvRamMap->BootDescriptionData[0]  = 0x0000;\r
+      NvRamMap->DriverOptionChanged = FALSE;\r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION){\r
+      NvRamMap->BootOptionChanged = TRUE;\r
+    } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION){\r
+      NvRamMap->DriverOptionChanged = TRUE;\r
     } else if (QuestionId < FILE_OPTION_OFFSET) {\r
       //\r
       // Exit File Explorer formset\r
@@ -322,5 +440,10 @@ FileExplorerCallback (
     }\r
   }\r
 \r
+  //\r
+  // Pass changed uncommitted data back to Form Browser\r
+  //\r
+  HiiSetBrowserData (&mFileExplorerGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap, NULL);\r
+\r
   return Status;\r
 }\r
index ab3d9c9aa6d67134f6b37d593415d67d78d83a43..257c1fdde79e614772f9971b45e6326870af678c 100644 (file)
@@ -70,6 +70,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define KEY_VALUE_NO_SAVE_AND_EXIT           0x110C\r
 #define KEY_VALUE_BOOT_FROM_FILE             0x110D\r
 #define FORM_RESET                           0x110E\r
+#define KEY_VALUE_BOOT_DESCRIPTION           0x110F\r
+#define KEY_VALUE_BOOT_OPTION                0x1110\r
+#define KEY_VALUE_DRIVER_DESCRIPTION         0x1111\r
+#define KEY_VALUE_DRIVER_OPTION              0x1112\r
 \r
 #define MAXIMUM_NORMAL_KEY_VALUE             0x11FF\r
 \r
@@ -142,6 +146,13 @@ typedef struct {
   // At most 100 input/output/errorout device for console storage\r
   //\r
   UINT8   ConsoleCheck[MAX_MENU_NUMBER];\r
+  \r
+  //\r
+  // At most 100 input/output/errorout device for console storage\r
+  //\r
+  UINT8   ConsoleInCheck[MAX_MENU_NUMBER];\r
+  UINT8   ConsoleOutCheck[MAX_MENU_NUMBER];\r
+  UINT8   ConsoleErrCheck[MAX_MENU_NUMBER];\r
 \r
   //\r
   // Boot or Driver Option Order storage\r
@@ -155,15 +166,18 @@ typedef struct {
   //\r
   BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
   BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
+  BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
+  BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
 \r
   //\r
   // This is the Terminal Attributes value storage\r
   //\r
-  UINT8   COMBaudRate;\r
-  UINT8   COMDataRate;\r
-  UINT8   COMStopBits;\r
-  UINT8   COMParity;\r
-  UINT8   COMTerminalType;\r
+  UINT8   COMBaudRate[MAX_MENU_NUMBER];\r
+  UINT8   COMDataRate[MAX_MENU_NUMBER];\r
+  UINT8   COMStopBits[MAX_MENU_NUMBER];\r
+  UINT8   COMParity[MAX_MENU_NUMBER];\r
+  UINT8   COMTerminalType[MAX_MENU_NUMBER];\r
+  UINT8   COMFlowControl[MAX_MENU_NUMBER];\r
 \r
   //\r
   // We use DisableMap array to record the enable/disable state of each boot device\r
@@ -195,8 +209,12 @@ typedef struct {
 /// This is the data structure used by File Explorer formset\r
 ///\r
 typedef struct {\r
-  UINT16  DescriptionData[MAX_MENU_NUMBER];\r
-  UINT16  OptionalData[127];\r
+  UINT16  BootDescriptionData[MAX_MENU_NUMBER];\r
+  UINT16  BootOptionalData[127];\r
+  UINT16  DriverDescriptionData[MAX_MENU_NUMBER];\r
+  UINT16  DriverOptionalData[127];\r
+  BOOLEAN BootOptionChanged;\r
+  BOOLEAN DriverOptionChanged;\r
   UINT8   Active;\r
   UINT8   ForceReconnect;\r
 } FILE_EXPLORER_NV_DATA;\r
index 9f1d20d8ed6a226f6bb2dc13e0106e38654ac520..ae32278f1b6f3509269e8fedb283a79ef5d84541 100644 (file)
@@ -214,6 +214,8 @@ UpdateConCOMPage (
   BM_MENU_ENTRY       *NewMenuEntry;\r
   UINT16              Index;\r
 \r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
   UpdatePageStart (CallbackData);\r
 \r
   for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
@@ -249,7 +251,7 @@ UpdateBootDelPage (
   BM_LOAD_CONTEXT *NewLoadContext;\r
   UINT16          Index;\r
 \r
-  //CallbackData->BmmAskSaveOrNot = TRUE;\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
@@ -262,6 +264,18 @@ UpdateBootDelPage (
       continue;\r
     }\r
 \r
+    NewLoadContext->Deleted = FALSE;\r
+\r
+    if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
+      //\r
+      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+      // through HiiSetBrowserData function.\r
+      //\r
+      CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+    }\r
+\r
     //\r
     // Check to see if the current boot option devicepath is the ShellDevice \r
     // path. If it is keep only UEFI Shell in the delete boot option list \r
@@ -278,7 +292,7 @@ UpdateBootDelPage (
         (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
         NewMenuEntry->DisplayStringToken,\r
         NewMenuEntry->HelpStringToken,\r
-        0,\r
+        EFI_IFR_FLAG_CALLBACK,\r
         0,\r
         NULL\r
         );\r
@@ -351,8 +365,16 @@ UpdateDrvDelPage (
 \r
     NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
     NewLoadContext->Deleted = FALSE;\r
-    CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
 \r
+    if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
+      //\r
+      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+      // through HiiSetBrowserData function.\r
+      //\r
+      CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+    }\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
       (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
@@ -360,7 +382,7 @@ UpdateDrvDelPage (
       (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
-      0,\r
+      EFI_IFR_FLAG_CALLBACK,\r
       0,\r
       NULL\r
       );\r
@@ -462,28 +484,63 @@ UpdateConsolePage (
   UINT16              Index;\r
   UINT16              Index2;\r
   UINT8               CheckFlags;\r
\r
+  UINT8               *ConsoleCheck;\r
+  UINT8               *OldConsoleCheck;\r
+  UINTN               ConsoleCheckSize;\r
+  EFI_QUESTION_ID     QuestionIdBase;\r
+  UINT16              VariableOffsetBase;\r
+\r
   CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
+  ConsoleCheck       = NULL;\r
+  QuestionIdBase     = 0;\r
+  VariableOffsetBase = 0;\r
+\r
+  switch (UpdatePageId) {\r
+  case FORM_CON_IN_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
+    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
+    QuestionIdBase     = CON_IN_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_CON_OUT_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
+    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
+    QuestionIdBase     = CON_OUT_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_CON_ERR_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
+    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
+    QuestionIdBase     = CON_ERR_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
+    break;\r
+  }\r
+  ASSERT (ConsoleCheck != NULL);\r
+\r
   for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
-       (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {\r
-    NewMenuEntry      = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+    CheckFlags = 0;\r
+    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
     NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    CheckFlags        = 0;\r
     if (NewConsoleContext->IsActive) {\r
       CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
+      ConsoleCheck[Index] = TRUE;\r
     } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
+      ConsoleCheck[Index] = FALSE;\r
     }\r
-\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+      (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
@@ -493,7 +550,7 @@ UpdateConsolePage (
   }\r
 \r
   for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
-       (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {\r
+       (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
     CheckFlags          = 0;\r
     NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
     NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
@@ -504,16 +561,15 @@ UpdateConsolePage (
         ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
         ) {\r
       CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
+      ConsoleCheck[Index] = TRUE;\r
     } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
+      ConsoleCheck[Index] = FALSE;\r
     }\r
-\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+      (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
@@ -524,6 +580,8 @@ UpdateConsolePage (
     Index++;\r
   }\r
 \r
+  CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
+\r
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
@@ -883,7 +941,7 @@ UpdateConModePage (
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
-/**\r
+ /**\r
   Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
   Parity, Stop Bits, Terminal Type.\r
 \r
@@ -898,35 +956,31 @@ UpdateTerminalPage (
   UINT8               Index;\r
   UINT8               CheckFlags;\r
   BM_MENU_ENTRY       *NewMenuEntry;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
   VOID                *OptionsOpCodeHandle;\r
+  UINTN               CurrentTerminal;\r
 \r
   CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
+  CurrentTerminal = CallbackData->CurrentTerminal;\r
   NewMenuEntry = BOpt_GetMenuEntry (\r
                   &TerminalMenu,\r
-                  CallbackData->CurrentTerminal\r
+                  CurrentTerminal\r
                   );\r
 \r
   if (NewMenuEntry == NULL) {\r
     return ;\r
   }\r
 \r
-  NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
   for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
+    if (BaudRateList[Index].Value == 115200) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->BaudRateIndex         = Index;\r
-      CallbackData->BmmFakeNvData.COMBaudRate  = NewTerminalContext->BaudRateIndex;\r
     }\r
-\r
     HiiCreateOneOfOptionOpCode (\r
       OptionsOpCodeHandle,\r
       BaudRateList[Index].StringToken,\r
@@ -938,9 +992,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_BAUD_RATE_VAR_OFFSET,\r
+    (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     0,\r
@@ -956,9 +1010,7 @@ UpdateTerminalPage (
   for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
     CheckFlags = 0;\r
 \r
-    if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
-      NewTerminalContext->DataBitsIndex         = Index;\r
-      CallbackData->BmmFakeNvData.COMDataRate  = NewTerminalContext->DataBitsIndex;\r
+    if (DataBitsList[Index].Value == 8) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
     }\r
 \r
@@ -973,9 +1025,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_DATA_RATE_VAR_OFFSET,\r
+    (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     0,\r
@@ -990,10 +1042,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
+    if (ParityList[Index].Value ==  NoParity) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->ParityIndex         = (UINT8) Index;\r
-      CallbackData->BmmFakeNvData.COMParity  = NewTerminalContext->ParityIndex;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1007,9 +1057,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_PARITY_VAR_OFFSET,\r
+    (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     0,\r
@@ -1024,10 +1074,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
+    if (StopBitsList[Index].Value == OneStopBit) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->StopBitsIndex         = (UINT8) Index;\r
-      CallbackData->BmmFakeNvData.COMStopBits  = NewTerminalContext->StopBitsIndex;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1041,9 +1089,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_STOP_BITS_VAR_OFFSET,\r
+    (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     0,\r
@@ -1058,9 +1106,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->TerminalType == Index) {\r
+    if (Index == 0) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1074,9 +1121,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_TERMINAL_VAR_OFFSET,\r
+    (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     0,\r
@@ -1085,6 +1132,37 @@ UpdateTerminalPage (
     NULL\r
     );\r
 \r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
+  CheckFlags = 0;\r
+    if (Index == 0) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      (EFI_STRING_ID) mFlowControlType[Index],\r
+      CheckFlags,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
+      mFlowControlValue[Index]\r
+      );\r
+  }\r
+\r
+  HiiCreateOneOfOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
+    STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+    STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+    0,\r
+    EFI_IFR_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
+    );\r
+\r
   HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
 \r
   UpdatePageEnd (CallbackData);\r
index 2b594fcbd4c76958d8ce673a4262846ee5ea417a..c80fada8a274dbb4c99dd566ef00683be2d4058b 100644 (file)
@@ -728,16 +728,16 @@ Var_UpdateBootOption (
   Index = BOpt_GetBootOptionNumber () ;\r
   UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
 \r
-  if (NvRamMap->DescriptionData[0] == 0x0000) {\r
-    StrCpyS (NvRamMap->DescriptionData, sizeof (NvRamMap->DescriptionData) / sizeof (NvRamMap->DescriptionData[0]), BootString);\r
+  if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
+    StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
   }\r
 \r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData);\r
+  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
   BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
 \r
-  if (NvRamMap->OptionalData[0] != 0x0000) {\r
+  if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
     OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (NvRamMap->OptionalData);\r
+    BufferSize += StrSize (NvRamMap->BootOptionalData);\r
   }\r
 \r
   Buffer = AllocateZeroPool (BufferSize);\r
@@ -767,21 +767,21 @@ Var_UpdateBootOption (
 \r
   CopyMem (\r
     Ptr,\r
-    NvRamMap->DescriptionData,\r
-    StrSize (NvRamMap->DescriptionData)\r
+    NvRamMap->BootDescriptionData,\r
+    StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
-  NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData));\r
+  NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
 \r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
   CopyMem (\r
     NewLoadContext->Description,\r
     (VOID *) Ptr,\r
-    StrSize (NvRamMap->DescriptionData)\r
+    StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
-  Ptr += StrSize (NvRamMap->DescriptionData);\r
+  Ptr += StrSize (NvRamMap->BootDescriptionData);\r
   CopyMem (\r
     Ptr,\r
     CallbackData->LoadContext->FilePathList,\r
@@ -814,7 +814,7 @@ Var_UpdateBootOption (
   if (OptionalDataExist) {\r
     Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
 \r
-    CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
+    CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
   }\r
 \r
   Status = gRT->SetVariable (\r
@@ -852,8 +852,8 @@ Var_UpdateBootOption (
   InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
   BootOptionMenu.MenuNumber++;\r
 \r
-  NvRamMap->DescriptionData[0]  = 0x0000;\r
-  NvRamMap->OptionalData[0]     = 0x0000;\r
+  NvRamMap->BootDescriptionData[0]  = 0x0000;\r
+  NvRamMap->BootOptionalData[0]     = 0x0000;\r
   return EFI_SUCCESS;\r
 }\r
 \r