]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg: Replace [Ascii|Unicode]ValueToString
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
index aaa33600426bc36aa83690ca647c46414b98983a..bdf26141d842de3887298b320d2421c8cfd0c3dc 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Dynamically update the pages.\r
 \r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, 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
@@ -99,31 +99,31 @@ UpdatePageEnd (
       0\r
       );\r
 \r
-    HiiCreateGotoOpCode (\r
+    HiiCreateActionOpCode (\r
       mStartOpCodeHandle,\r
-      FORM_MAIN_ID,\r
+      KEY_VALUE_SAVE_AND_EXIT,\r
       STRING_TOKEN (STR_SAVE_AND_EXIT),\r
       STRING_TOKEN (STR_NULL_STRING),\r
       EFI_IFR_FLAG_CALLBACK,\r
-      KEY_VALUE_SAVE_AND_EXIT\r
+      0\r
       );\r
   }\r
 \r
   //\r
   // Ensure user can return to the main page.\r
   //\r
-  HiiCreateGotoOpCode (\r
+  HiiCreateActionOpCode (\r
     mStartOpCodeHandle,\r
-    FORM_MAIN_ID,\r
+    KEY_VALUE_NO_SAVE_AND_EXIT,\r
     STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
     STRING_TOKEN (STR_NULL_STRING),\r
     EFI_IFR_FLAG_CALLBACK,\r
-    KEY_VALUE_NO_SAVE_AND_EXIT\r
+    0\r
     );\r
 \r
   HiiUpdateForm (\r
     CallbackData->BmmHiiHandle,\r
-    &mBootMaintGuid,\r
+    &gBootMaintFormSetGuid,\r
     CallbackData->BmmCurrentPageId,\r
     mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
     mEndOpCodeHandle    // LABEL_END\r
@@ -151,7 +151,7 @@ CleanUpPage (
   mStartLabel->Number = LabelId;\r
   HiiUpdateForm (\r
     CallbackData->BmmHiiHandle,\r
-    &mBootMaintGuid,\r
+    &gBootMaintFormSetGuid,\r
     LabelId,\r
     mStartOpCodeHandle, // Label LabelId\r
     mEndOpCodeHandle    // LABEL_END\r
@@ -254,7 +254,7 @@ UpdateBootDelPage (
   UpdatePageStart (CallbackData);\r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
 \r
-  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0])));\r
+  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
   for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
     NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
     NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
@@ -263,16 +263,25 @@ UpdateBootDelPage (
     }\r
 \r
     NewLoadContext->Deleted = FALSE;\r
-    CallbackData->BmmFakeNvData.OptionDel[Index] = 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
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (OPTION_DEL_VAR_OFFSET + Index),\r
+      (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
@@ -337,22 +346,31 @@ UpdateDrvDelPage (
 \r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
   \r
-  ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0])));\r
+  ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
   for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
     NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
 \r
     NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
     NewLoadContext->Deleted = FALSE;\r
-    CallbackData->BmmFakeNvData.OptionDel[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
 \r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (OPTION_DEL_VAR_OFFSET + Index),\r
+      (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
@@ -449,71 +467,57 @@ UpdateConsolePage (
   )\r
 {\r
   BM_MENU_ENTRY       *NewMenuEntry;\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
   UINT16              Index;\r
-  UINT16              Index2;\r
   UINT8               CheckFlags;\r
\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
+  UINT8               *ConsoleCheck;\r
+  EFI_QUESTION_ID     QuestionIdBase;\r
+  UINT16              VariableOffsetBase;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
-  for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
-       (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {\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
-    } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
-    }\r
+  ConsoleCheck       = NULL;\r
+  QuestionIdBase     = 0;\r
+  VariableOffsetBase = 0;\r
 \r
-    HiiCreateCheckBoxOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
-      NewMenuEntry->DisplayStringToken,\r
-      NewMenuEntry->HelpStringToken,\r
-      0,\r
-      CheckFlags,\r
-      NULL\r
-      );\r
+  switch (UpdatePageId) {\r
+  case FORM_CON_IN_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\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
+    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
+    QuestionIdBase     = CON_ERR_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
+    break;\r
   }\r
+  ASSERT (ConsoleCheck != NULL);\r
 \r
-  for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
-       (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {\r
-    CheckFlags          = 0;\r
-    NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
-    NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    ASSERT (Index < MAX_MENU_NUMBER);\r
-    if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
-        ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
-        ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
-        ) {\r
+  for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+    CheckFlags = 0;\r
+    if (UpdatePageId != FORM_CON_ERR_ID) {\r
       CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
-    } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
     }\r
-\r
+    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\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
       CheckFlags,\r
       NULL\r
       );\r
-\r
-    Index++;\r
   }\r
 \r
   UpdatePageEnd (CallbackData);\r
@@ -535,68 +539,87 @@ UpdateOrderPage (
   IN BMM_CALLBACK_DATA                *CallbackData\r
   )\r
 {\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  UINT16          Index;\r
-  UINT16          OptionOrderIndex;\r
-  VOID            *OptionsOpCodeHandle;\r
-  UINTN           DeviceType;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
+  BM_MENU_ENTRY     *NewMenuEntry;\r
+  UINT16            Index;\r
+  UINT16            OptionIndex;\r
+  VOID              *OptionsOpCodeHandle;\r
+  BOOLEAN           BootOptionFound;\r
+  UINT32            *OptionOrder;\r
+  EFI_QUESTION_ID   QuestionId;\r
+  UINT16            VarOffset;\r
 \r
-  DeviceType                    = (UINTN) -1;\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
+  \r
+  OptionOrder = NULL;\r
+  QuestionId = 0;\r
+  VarOffset = 0;\r
+  switch (UpdatePageId) { \r
 \r
-  ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, sizeof (CallbackData->BmmFakeNvData.OptionOrder));\r
+  case FORM_BOOT_CHG_ID:\r
+    //\r
+    // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
+    // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.\r
+    // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,\r
+    // so we should not get the data from BootOptionMenu to show it.\r
+    //\r
+    if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {\r
+      GetBootOrder (CallbackData);\r
+    }\r
+    OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
+    QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
+    VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_DRV_CHG_ID:\r
+    //\r
+    // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
+    // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.\r
+    // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,\r
+    // so we should not get the data from DriverOptionMenu to show it.\r
+    //\r
+    if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {\r
+      GetDriverOrder (CallbackData);\r
+    }\r
+    OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
+    QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
+    VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
+    break;\r
+  }  \r
+  ASSERT (OptionOrder != NULL);\r
 \r
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
   \r
-  for (\r
-        Index = 0, OptionOrderIndex = 0;\r
-        (\r
-          (Index < OptionMenu->MenuNumber) &&\r
-          (OptionOrderIndex <\r
-            (\r
-              sizeof (CallbackData->BmmFakeNvData.OptionOrder) /\r
-              sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])\r
-            )\r
-          )\r
-        );\r
-        Index++\r
-      ) {\r
-    NewMenuEntry   = BOpt_GetMenuEntry (OptionMenu, Index);\r
-    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    if (NewLoadContext->IsLegacy) {\r
-      if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {\r
-        DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;\r
-      } else {\r
-        //\r
-        // Only show one legacy boot option for the same device type\r
-        // assuming the boot options are grouped by the device type\r
-        //\r
-        continue;\r
+  NewMenuEntry = NULL;\r
+  for (OptionIndex = 0; (OptionIndex < MAX_MENU_NUMBER && OptionOrder[OptionIndex] != 0); OptionIndex++) {\r
+    BootOptionFound = FALSE;\r
+    for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
+      NewMenuEntry   = BOpt_GetMenuEntry (OptionMenu, Index);\r
+      if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
+        BootOptionFound = TRUE;\r
+        break;\r
       }\r
     }\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      NewMenuEntry->DisplayStringToken,\r
-      0,\r
-      EFI_IFR_TYPE_NUM_SIZE_32,\r
-      (UINT32) (NewMenuEntry->OptionNumber + 1)\r
-      );\r
-    CallbackData->BmmFakeNvData.OptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+    if (BootOptionFound) {\r
+      HiiCreateOneOfOptionOpCode (\r
+        OptionsOpCodeHandle,\r
+        NewMenuEntry->DisplayStringToken,\r
+        0,\r
+        EFI_IFR_TYPE_NUM_SIZE_32,\r
+        OptionOrder[OptionIndex]\r
+        );\r
+    }\r
   }\r
-\r
+  \r
   if (OptionMenu->MenuNumber > 0) {\r
     HiiCreateOrderedListOpCode (                   \r
       mStartOpCodeHandle,                          // Container for dynamic created opcodes     \r
-      (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,  // Question ID                               \r
+      QuestionId,                                  // Question ID                               \r
       VARSTORE_ID_BOOT_MAINT,                      // VarStore ID                               \r
-      OPTION_ORDER_VAR_OFFSET,                     // Offset in Buffer Storage                  \r
+      VarOffset,                                   // Offset in Buffer Storage                  \r
       STRING_TOKEN (STR_CHANGE_ORDER),             // Question prompt text                      \r
       STRING_TOKEN (STR_CHANGE_ORDER),             // Question help text                        \r
       0,                                           // Question flag                             \r
@@ -611,12 +634,6 @@ UpdateOrderPage (
   HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
 \r
   UpdatePageEnd (CallbackData);\r
-\r
-  CopyMem (\r
-    CallbackData->BmmOldFakeNVData.OptionOrder,\r
-    CallbackData->BmmFakeNvData.OptionOrder,\r
-    sizeof (CallbackData->BmmOldFakeNVData.OptionOrder)\r
-    );\r
 }\r
 \r
 /**\r
@@ -647,7 +664,7 @@ UpdateBootNextPage (
     OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
     ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-    CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
+    //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
 \r
     for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
       NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
@@ -661,7 +678,7 @@ UpdateBootNextPage (
           EFI_IFR_TYPE_NUM_SIZE_16,\r
           Index\r
           );\r
-        CallbackData->BmmFakeNvData.BootNext = Index;\r
+        //CallbackData->BmmFakeNvData.BootNext = Index;\r
       } else {\r
         HiiCreateOneOfOptionOpCode (\r
           OptionsOpCodeHandle,\r
@@ -751,7 +768,7 @@ UpdateTimeOutPage (
   \r
   HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
 \r
-  CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
+  //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
 \r
   UpdatePageEnd (CallbackData);\r
 }\r
@@ -813,7 +830,7 @@ UpdateConModePage (
   //\r
   // Determin which mode should be the first entry in menu\r
   //\r
-  GetConsoleOutMode (CallbackData);\r
+  // GetConsoleOutMode (CallbackData);\r
 \r
   //\r
   // Build text mode options\r
@@ -827,11 +844,17 @@ UpdateConModePage (
     //\r
     // Build mode string Column x Row\r
     //\r
-    UnicodeValueToString (ModeString, 0, Col, 0);\r
+    UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
     PStr = &ModeString[0];\r
-    StrnCat (PStr, L" x ", StrLen(L" x ") + 1);\r
+    StrCatS (PStr, ARRAY_SIZE (ModeString), L" x ");\r
     PStr = PStr + StrLen (PStr);\r
-    UnicodeValueToString (PStr , 0, Row, 0);\r
+    UnicodeValueToStringS (\r
+      PStr,\r
+      sizeof (ModeString) - ((UINTN)PStr - (UINTN)&ModeString[0]),\r
+      0,\r
+      Row,\r
+      0\r
+      );\r
 \r
     ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
 \r
@@ -889,35 +912,29 @@ UpdateTerminalPage (
   UINT8               Index;\r
   UINT8               CheckFlags;\r
   BM_MENU_ENTRY       *NewMenuEntry;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
   VOID                *OptionsOpCodeHandle;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
+  UINTN               CurrentTerminal;\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
@@ -929,9 +946,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
@@ -944,12 +961,10 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
+  for (Index = 0; Index < ARRAY_SIZE (DataBitsList); 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
@@ -964,9 +979,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
@@ -979,12 +994,10 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
+  for (Index = 0; Index < ARRAY_SIZE (ParityList); 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
@@ -998,9 +1011,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
@@ -1013,12 +1026,10 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
+  for (Index = 0; Index < ARRAY_SIZE (StopBitsList); 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
@@ -1032,9 +1043,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
@@ -1049,9 +1060,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < 4; 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
@@ -1065,9 +1075,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
@@ -1076,6 +1086,37 @@ UpdateTerminalPage (
     NULL\r
     );\r
 \r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); 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
@@ -1122,92 +1163,6 @@ UpdatePageBody (
   }\r
 }\r
 \r
-/**\r
-  Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
-  specified by DeviceType.\r
-\r
-  @param DeviceType      The legacy device type. It can be floppy, network, harddisk, cdrom,\r
-                         etc.\r
-  @param OptionIndex     Returns the index number (#### in Boot####).\r
-  @param OptionSize      Return the size of the Boot### variable.\r
-\r
-**/\r
-VOID *\r
-GetLegacyBootOptionVar (\r
-  IN  UINTN                            DeviceType,\r
-  OUT UINTN                            *OptionIndex,\r
-  OUT UINTN                            *OptionSize\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  VOID                      *OptionBuffer;\r
-  UINTN                     OrderSize;\r
-  UINTN                     Index;\r
-  UINT16                    *OrderBuffer;\r
-  CHAR16                    StrTemp[100];\r
-  UINT16                    FilePathSize;\r
-  UINT8                     *Ptr;\r
-  UINT8                     *OptionalData;\r
-\r
-  //\r
-  // Get Boot Option number from the size of BootOrder\r
-  //\r
-  OrderBuffer = BdsLibGetVariableAndSize (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  &OrderSize\r
-                  );\r
-                  \r
-  if (OrderBuffer == NULL) {\r
-    return NULL;\r
-  }\r
-  \r
-  for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {\r
-    UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);\r
-    OptionBuffer = BdsLibGetVariableAndSize (\r
-                    StrTemp,\r
-                    &gEfiGlobalVariableGuid,\r
-                    OptionSize\r
-                    );\r
-    if (NULL == OptionBuffer) {\r
-      continue;\r
-    }\r
-\r
-    Ptr       = (UINT8 *) OptionBuffer;\r
-    Ptr += sizeof (UINT32);\r
-\r
-    FilePathSize = *(UINT16 *) Ptr;\r
-    Ptr += sizeof (UINT16);\r
-\r
-    Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
-    //\r
-    // Now Ptr point to Device Path\r
-    //\r
-    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
-    Ptr += FilePathSize;\r
-\r
-    //\r
-    // Now Ptr point to Optional Data\r
-    //\r
-    OptionalData = Ptr;\r
-\r
-    if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&\r
-        (BBS_DEVICE_PATH == DevicePath->Type) &&\r
-        (BBS_BBS_DP == DevicePath->SubType)\r
-        ) {\r
-      *OptionIndex = OrderBuffer[Index];\r
-      FreePool (OrderBuffer);\r
-      return OptionBuffer;\r
-    } else {\r
-      FreePool (OptionBuffer);\r
-    }\r
-  }\r
-\r
-  FreePool (OrderBuffer);\r
-  return NULL;\r
-}\r
-\r
 /**\r
   Create a dynamic page so that Legacy Device boot order\r
   can be set for specified device type.\r
@@ -1223,7 +1178,7 @@ UpdateSetLegacyDeviceOrderPage (
   IN BMM_CALLBACK_DATA                *CallbackData\r
   )\r
 {\r
-  BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
+  LEGACY_DEV_ORDER_ENTRY      *DevOrder;\r
   BM_MENU_OPTION              *OptionMenu;\r
   BM_MENU_ENTRY               *NewMenuEntry;\r
   EFI_STRING_ID               StrRef;\r
@@ -1354,20 +1309,20 @@ UpdateSetLegacyDeviceOrderPage (
   //\r
   VarData = BdsLibGetVariableAndSize (\r
               VAR_LEGACY_DEV_ORDER,\r
-              &EfiLegacyDevOrderGuid,\r
+              &gEfiLegacyDevOrderVariableGuid,\r
               &VarSize\r
               );\r
 \r
   if (NULL != VarData) {\r
-    DevOrder    = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
+    DevOrder    = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
     while (VarData < VarData + VarSize) {\r
       if (DevOrder->BbsType == BbsType) {\r
         break;\r
       }\r
 \r
-      VarData += sizeof (BBS_TYPE);\r
+      VarData  = (UINT8 *)((UINTN)VarData + sizeof (BBS_TYPE));\r
       VarData += *(UINT16 *) VarData;\r
-      DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
+      DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
     }\r
     //\r
     // Create oneof tag here for FD/HD/CD #1 #2\r
@@ -1395,7 +1350,7 @@ UpdateSetLegacyDeviceOrderPage (
         NULL\r
         );\r
 \r
-      VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
+      VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
 \r
       if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
         LegacyOrder[Index]  = 0xFF;\r
@@ -1415,6 +1370,7 @@ UpdateSetLegacyDeviceOrderPage (
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
+\r
 /**\r
   Dispatch the display to the next page based on NewPageId.\r
 \r
@@ -1428,6 +1384,14 @@ UpdatePageId (
   UINT16                         NewPageId\r
   )\r
 {\r
+  //\r
+  // For the question don't impact the page update, just ignore it.\r
+  //\r
+  if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
+      ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
+    return;\r
+  }\r
+\r
   if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
     //\r
     // If we select a handle to add driver option, advance to the add handle description page.\r