]> 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 5146399dd4b33d67861a6b25b2c924bca92dc4d4..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,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,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
@@ -594,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
@@ -630,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
@@ -641,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
@@ -661,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
@@ -669,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
@@ -715,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
@@ -734,7 +752,7 @@ UpdateTimeOutPage (
   \r
   HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
 \r
-  CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
+  //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
 \r
   UpdatePageEnd (CallbackData);\r
 }\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
@@ -812,7 +830,7 @@ UpdateConModePage (
     //\r
     UnicodeValueToString (ModeString, 0, Col, 0);\r
     PStr = &ModeString[0];\r
-    StrnCat (PStr, L" x ", StrLen(L" x ") + 1);\r
+    StrCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ");\r
     PStr = PStr + StrLen (PStr);\r
     UnicodeValueToString (PStr , 0, Row, 0);\r
 \r
@@ -823,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
@@ -831,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
@@ -872,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
@@ -930,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
@@ -940,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
@@ -964,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
@@ -998,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
@@ -1032,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
@@ -1059,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
@@ -1105,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
@@ -1206,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
@@ -1241,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
@@ -1310,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
@@ -1346,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
@@ -1387,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
@@ -1407,6 +1348,7 @@ UpdateSetLegacyDeviceOrderPage (
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
+\r
 /**\r
   Dispatch the display to the next page based on NewPageId.\r
 \r
@@ -1420,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