]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg BootMaint: Use safe string functions
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
index 643c90d4b17124796b17b00d2e508561d7606f8e..b13ed116303b0e948da132e062b0b55819f3bd23 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
 Dynamically update the pages.\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\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
@@ -180,7 +180,7 @@ BootThisFile (
 \r
   Option = (BDS_COMMON_OPTION *) AllocatePool (sizeof (BDS_COMMON_OPTION));\r
   ASSERT (Option != NULL);\r
-  Option->Description     = FileContext->FileName;\r
+  Option->Description     = (CHAR16 *) AllocateCopyPool (StrSize (FileContext->FileName), FileContext->FileName);\r
   Option->DevicePath      = FileContext->DevicePath;\r
   Option->LoadOptionsSize = 0;\r
   Option->LoadOptions     = NULL;\r
@@ -263,7 +263,16 @@ UpdateBootDelPage (
     }\r
 \r
     NewLoadContext->Deleted = FALSE;\r
-    CallbackData->BmmFakeNvData.BootOptionDel[Index] = 0x00;\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
@@ -272,7 +281,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
@@ -343,7 +352,16 @@ UpdateDrvDelPage (
 \r
     NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
     NewLoadContext->Deleted = FALSE;\r
-    CallbackData->BmmFakeNvData.DriverOptionDel[Index] = 0x00;\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
@@ -352,7 +370,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
@@ -449,70 +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
-  }\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
-  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
+  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
-    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
+  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 (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
@@ -534,56 +539,76 @@ UpdateOrderPage (
   IN BMM_CALLBACK_DATA                *CallbackData\r
   )\r
 {\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-  UINT16        Index;\r
-  VOID          *OptionsOpCodeHandle;\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
-  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, 100);\r
+  case FORM_BOOT_CHG_ID:\r
+    //GetBootOrder (CallbackData);\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
+    //GetDriverOrder (CallbackData);\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;\r
-        (\r
-          (Index < OptionMenu->MenuNumber) &&\r
-          (Index <\r
-            (\r
-              sizeof (CallbackData->BmmFakeNvData.OptionOrder) /\r
-              sizeof (UINT8)\r
-            )\r
-          )\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
+    if (BootOptionFound) {\r
+      HiiCreateOneOfOptionOpCode (\r
+        OptionsOpCodeHandle,\r
+        NewMenuEntry->DisplayStringToken,\r
+        0,\r
+        EFI_IFR_TYPE_NUM_SIZE_32,\r
+        OptionOrder[OptionIndex]\r
         );\r
-        Index++\r
-      ) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      NewMenuEntry->DisplayStringToken,\r
-      0,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
-      (UINT8) (NewMenuEntry->OptionNumber + 1)\r
-      );\r
-    CallbackData->BmmFakeNvData.OptionOrder[Index] = (UINT8) (NewMenuEntry->OptionNumber + 1);\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
       0,                                           // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
-      EFI_IFR_NUMERIC_SIZE_1,                      // Data type of Question value               \r
+      EFI_IFR_TYPE_NUM_SIZE_32,                    // Data type of Question value               \r
       100,                                         // Maximum container                         \r
       OptionsOpCodeHandle,                         // Option Opcode list                        \r
       NULL                                         // Default Opcode is NULL                    \r
@@ -593,12 +618,6 @@ UpdateOrderPage (
   HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
 \r
   UpdatePageEnd (CallbackData);\r
-\r
-  CopyMem (\r
-    CallbackData->BmmOldFakeNVData.OptionOrder,\r
-    CallbackData->BmmFakeNvData.OptionOrder,\r
-    100\r
-    );\r
 }\r
 \r
 /**\r
@@ -629,7 +648,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
@@ -640,16 +659,16 @@ UpdateBootNextPage (
           OptionsOpCodeHandle,\r
           NewMenuEntry->DisplayStringToken,\r
           EFI_IFR_OPTION_DEFAULT,\r
-          EFI_IFR_NUMERIC_SIZE_2,\r
+          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
           NewMenuEntry->DisplayStringToken,\r
           0,\r
-          EFI_IFR_NUMERIC_SIZE_2,\r
+          EFI_IFR_TYPE_NUM_SIZE_16,\r
           Index\r
           );\r
       }\r
@@ -660,7 +679,7 @@ UpdateBootNextPage (
         OptionsOpCodeHandle,\r
         STRING_TOKEN (STR_NONE),\r
         EFI_IFR_OPTION_DEFAULT,\r
-        EFI_IFR_NUMERIC_SIZE_2,\r
+        EFI_IFR_TYPE_NUM_SIZE_16,\r
         Index\r
         );\r
     } else {\r
@@ -668,7 +687,7 @@ UpdateBootNextPage (
         OptionsOpCodeHandle,\r
         STRING_TOKEN (STR_NONE),\r
         0,\r
-        EFI_IFR_NUMERIC_SIZE_2,\r
+        EFI_IFR_TYPE_NUM_SIZE_16,\r
         Index\r
         );\r
     }      \r
@@ -714,7 +733,7 @@ UpdateTimeOutPage (
 \r
   DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (DefaultOpCodeHandle != NULL);\r
-  HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_NUMERIC_SIZE_2, BootTimeOut);\r
+  HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
 \r
   HiiCreateNumericOpCode (\r
     mStartOpCodeHandle,\r
@@ -733,7 +752,7 @@ UpdateTimeOutPage (
   \r
   HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
 \r
-  CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
+  //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
 \r
   UpdatePageEnd (CallbackData);\r
 }\r
@@ -753,9 +772,8 @@ UpdateConModePage (
   UINTN                         Index;\r
   UINTN                         Col;\r
   UINTN                         Row;\r
-  CHAR16                        RowString[50];\r
   CHAR16                        ModeString[50];\r
-  UINTN                         TempStringLen;\r
+  CHAR16                        *PStr;\r
   UINTN                         MaxMode;\r
   UINTN                         ValidMode;\r
   EFI_STRING_ID                 *ModeToken;\r
@@ -796,7 +814,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
@@ -810,12 +828,11 @@ UpdateConModePage (
     //\r
     // Build mode string Column x Row\r
     //\r
-    TempStringLen = UnicodeValueToString (ModeString, 0, Col, 0);\r
-    ASSERT ((TempStringLen + StrLen (L" x ")) < (sizeof (ModeString) / sizeof (ModeString[0])));\r
-    StrCat (ModeString, L" x ");\r
-    TempStringLen = UnicodeValueToString (RowString, 0, Row, 0);\r
-    ASSERT ((StrLen (ModeString)  + TempStringLen) < (sizeof (ModeString) / sizeof (ModeString[0])));\r
-    StrCat (ModeString, RowString);\r
+    UnicodeValueToString (ModeString, 0, Col, 0);\r
+    PStr = &ModeString[0];\r
+    StrCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ");\r
+    PStr = PStr + StrLen (PStr);\r
+    UnicodeValueToString (PStr , 0, Row, 0);\r
 \r
     ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
 \r
@@ -824,7 +841,7 @@ UpdateConModePage (
         OptionsOpCodeHandle,\r
         ModeToken[Index],\r
         EFI_IFR_OPTION_DEFAULT,\r
-        EFI_IFR_NUMERIC_SIZE_2,\r
+        EFI_IFR_TYPE_NUM_SIZE_16,\r
         (UINT16) Mode\r
         );\r
     } else {\r
@@ -832,7 +849,7 @@ UpdateConModePage (
         OptionsOpCodeHandle,\r
         ModeToken[Index],\r
         0,\r
-        EFI_IFR_NUMERIC_SIZE_2,\r
+        EFI_IFR_TYPE_NUM_SIZE_16,\r
         (UINT16) Mode\r
         );\r
     }\r
@@ -873,49 +890,43 @@ 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
       CheckFlags,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
       Index\r
       );\r
   }\r
 \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
@@ -931,9 +942,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
@@ -941,16 +950,16 @@ UpdateTerminalPage (
       OptionsOpCodeHandle,\r
       DataBitsList[Index].StringToken,\r
       CheckFlags,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
       Index\r
       );\r
   }\r
 \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
@@ -965,26 +974,24 @@ 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
       OptionsOpCodeHandle,\r
       ParityList[Index].StringToken,\r
       CheckFlags,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
       Index\r
       );\r
   }\r
 \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
@@ -999,26 +1006,24 @@ 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
       OptionsOpCodeHandle,\r
       StopBitsList[Index].StringToken,\r
       CheckFlags,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
       Index\r
       );\r
   }\r
 \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
@@ -1033,25 +1038,24 @@ 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
       OptionsOpCodeHandle,\r
       (EFI_STRING_ID) TerminalType[Index],\r
       CheckFlags,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
       Index\r
       );\r
   }\r
 \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
@@ -1060,6 +1064,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
@@ -1106,92 +1141,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
@@ -1207,7 +1156,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
@@ -1242,9 +1191,8 @@ UpdateSetLegacyDeviceOrderPage (
   CallbackData->BmmAskSaveOrNot = TRUE;\r
   UpdatePageStart (CallbackData);\r
 \r
-  DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
+  DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
 \r
-  SetMem (DisMap, 32, 0);\r
   //\r
   // Create oneof option list\r
   //\r
@@ -1311,34 +1259,26 @@ UpdateSetLegacyDeviceOrderPage (
 \r
   for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
     NewMenuEntry                = BOpt_GetMenuEntry (OptionMenu, Index);\r
-\r
-    if (Index == 0) {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        NewMenuEntry->DisplayStringToken,\r
-        EFI_IFR_OPTION_DEFAULT,\r
-        EFI_IFR_NUMERIC_SIZE_1,\r
-        (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index\r
-        );\r
-    }\r
-\r
+    //\r
+    // Create OneOf for each legacy device\r
+    //\r
     HiiCreateOneOfOptionOpCode (\r
       OptionsOpCodeHandle,\r
       NewMenuEntry->DisplayStringToken,\r
       0,\r
-      EFI_IFR_NUMERIC_SIZE_1,\r
-      (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
+      (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
       );\r
   }\r
 \r
   //\r
-  // for item "Disabled"\r
+  // Create OneOf for item "Disabled"\r
   //\r
   HiiCreateOneOfOptionOpCode (\r
     OptionsOpCodeHandle,\r
     STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
     0,\r
-    EFI_IFR_NUMERIC_SIZE_1,\r
+    EFI_IFR_TYPE_NUM_SIZE_8,\r
     0xFF\r
     );\r
 \r
@@ -1347,20 +1287,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
@@ -1388,7 +1328,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
@@ -1408,6 +1348,7 @@ UpdateSetLegacyDeviceOrderPage (
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
+\r
 /**\r
   Dispatch the display to the next page based on NewPageId.\r
 \r
@@ -1421,6 +1362,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