]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
index cd1756aa588a677d669b83a553201384f2520550..e2b444cc45e22810ef556b0f599e34cffcb4d5aa 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
 Dynamically update the pages.\r
 \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
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -28,16 +22,16 @@ CreateUpdateData (
   //\r
   mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (mStartOpCodeHandle != NULL);\r
-  \r
+\r
   mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (mEndOpCodeHandle != NULL);\r
-  \r
+\r
   //\r
   // Create Hii Extend Label OpCode as the start opcode\r
   //\r
   mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
   mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  \r
+\r
   //\r
   // Create Hii Extend Label OpCode as the end opcode\r
   //\r
@@ -57,7 +51,7 @@ RefreshUpdateData (
 {\r
   //\r
   // Free current updated date\r
-  //  \r
+  //\r
   if (mStartOpCodeHandle != NULL) {\r
     HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
   }\r
@@ -78,7 +72,7 @@ RefreshUpdateData (
 /**\r
   Add a "Go back to main page" tag in front of the form when there are no\r
   "Apply changes" and "Discard changes" tags in the end of the form.\r
\r
+\r
   @param CallbackData    The BMM context data.\r
 \r
 **/\r
@@ -162,7 +156,7 @@ UpdatePageEnd (
 }\r
 \r
 /**\r
-  Clean up the dynamic opcode at label and form specified by both LabelId. \r
+  Clean up the dynamic opcode at label and form specified by both LabelId.\r
 \r
   @param LabelId         It is both the Form ID and Label ID for opcode deletion.\r
   @param CallbackData    The BMM context data.\r
@@ -262,8 +256,9 @@ UpdateBootDelPage (
       // through HiiSetBrowserData function.\r
       //\r
       CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+      CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;\r
     }\r
-    \r
+\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
       (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
@@ -348,6 +343,7 @@ UpdateDrvDelPage (
       // through HiiSetBrowserData function.\r
       //\r
       CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+      CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;\r
     }\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
@@ -366,7 +362,7 @@ UpdateDrvDelPage (
 }\r
 \r
 /**\r
-  Prepare the page to allow user to add description for \r
+  Prepare the page to allow user to add description for\r
   a Driver Option.\r
 \r
   @param CallbackData    The BMM context data.\r
@@ -459,8 +455,6 @@ UpdateConsolePage (
   UINT16              Index2;\r
   UINT8               CheckFlags;\r
   UINT8               *ConsoleCheck;\r
-  UINT8               *OldConsoleCheck;\r
-  UINTN               ConsoleCheckSize;\r
   EFI_QUESTION_ID     QuestionIdBase;\r
   UINT16              VariableOffsetBase;\r
 \r
@@ -469,32 +463,24 @@ UpdateConsolePage (
   UpdatePageStart (CallbackData);\r
 \r
   ConsoleCheck       = NULL;\r
-  OldConsoleCheck    = NULL;\r
   QuestionIdBase     = 0;\r
   VariableOffsetBase = 0;\r
-  ConsoleCheckSize   = 0;\r
 \r
   switch (UpdatePageId) {\r
   case FORM_CON_IN_ID:\r
     ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
-    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
-    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
     QuestionIdBase     = CON_IN_DEVICE_QUESTION_ID;\r
     VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
     break;\r
 \r
   case FORM_CON_OUT_ID:\r
     ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
-    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
-    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
     QuestionIdBase     = CON_OUT_DEVICE_QUESTION_ID;\r
     VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
     break;\r
 \r
   case FORM_CON_ERR_ID:\r
     ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
-    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
-    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
     QuestionIdBase     = CON_ERR_DEVICE_QUESTION_ID;\r
     VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
     break;\r
@@ -519,7 +505,7 @@ UpdateConsolePage (
       (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
-      0,\r
+      EFI_IFR_FLAG_CALLBACK,\r
       CheckFlags,\r
       NULL\r
       );\r
@@ -548,7 +534,7 @@ UpdateConsolePage (
       (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
-      0,\r
+      EFI_IFR_FLAG_CALLBACK,\r
       CheckFlags,\r
       NULL\r
       );\r
@@ -556,8 +542,6 @@ UpdateConsolePage (
     Index++;\r
   }\r
 \r
-  CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
-\r
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
@@ -581,7 +565,6 @@ UpdateOrderPage (
   UINT16            Index;\r
   UINT16            OptionIndex;\r
   VOID              *OptionsOpCodeHandle;\r
-  BM_LOAD_CONTEXT   *NewLoadContext;\r
   BOOLEAN           BootOptionFound;\r
   UINT32            *OptionOrder;\r
   EFI_QUESTION_ID   QuestionId;\r
@@ -593,33 +576,48 @@ UpdateOrderPage (
   OptionOrder = NULL;\r
   QuestionId = 0;\r
   VarOffset = 0;\r
-  switch (UpdatePageId) { \r
-  \r
+  switch (UpdatePageId) {\r
+\r
   case FORM_BOOT_CHG_ID:\r
-    GetBootOrder (CallbackData);\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
+\r
   case FORM_DRV_CHG_ID:\r
-    GetDriverOrder (CallbackData);\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
+  }\r
+  ASSERT (OptionOrder != NULL);\r
+\r
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
-  \r
+\r
   NewMenuEntry = NULL;\r
   for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
     BootOptionFound = FALSE;\r
     for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
       NewMenuEntry   = BOpt_GetMenuEntry (OptionMenu, Index);\r
-      NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
       if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
         BootOptionFound = TRUE;\r
         break;\r
@@ -635,21 +633,21 @@ UpdateOrderPage (
         );\r
     }\r
   }\r
-  \r
+\r
   if (OptionMenu->MenuNumber > 0) {\r
-    HiiCreateOrderedListOpCode (                   \r
-      mStartOpCodeHandle,                          // Container for dynamic created opcodes     \r
-      QuestionId,                                  // Question ID                               \r
-      VARSTORE_ID_BOOT_MAINT,                      // VarStore ID                               \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
+    HiiCreateOrderedListOpCode (\r
+      mStartOpCodeHandle,                          // Container for dynamic created opcodes\r
+      QuestionId,                                  // Question ID\r
+      VARSTORE_ID_BOOT_MAINT,                      // VarStore ID\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_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
+      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
       );\r
   }\r
 \r
@@ -659,138 +657,6 @@ UpdateOrderPage (
 \r
 }\r
 \r
-/**\r
-  Create the dynamic page to allow user to set\r
-  the "BootNext" value.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootNextPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINTN           NumberOfOptions;\r
-  UINT16          Index;\r
-  VOID            *OptionsOpCodeHandle;\r
-\r
-  NumberOfOptions               = BootOptionMenu.MenuNumber;\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  if (NumberOfOptions > 0) {\r
-    OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-    ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
-    CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
-\r
-    for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-      NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-      NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-      if (NewLoadContext->IsBootNext) {\r
-        HiiCreateOneOfOptionOpCode (\r
-          OptionsOpCodeHandle,\r
-          NewMenuEntry->DisplayStringToken,\r
-          EFI_IFR_OPTION_DEFAULT,\r
-          EFI_IFR_TYPE_NUM_SIZE_32,\r
-          Index\r
-          );\r
-        CallbackData->BmmFakeNvData.BootNext = Index;\r
-      } else {\r
-        HiiCreateOneOfOptionOpCode (\r
-          OptionsOpCodeHandle,\r
-          NewMenuEntry->DisplayStringToken,\r
-          0,\r
-          EFI_IFR_TYPE_NUM_SIZE_32,\r
-          Index\r
-          );\r
-      }\r
-    }\r
-\r
-    if (CallbackData->BmmFakeNvData.BootNext == NONE_BOOTNEXT_VALUE) {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        STRING_TOKEN (STR_NONE),\r
-        EFI_IFR_OPTION_DEFAULT,\r
-        EFI_IFR_TYPE_NUM_SIZE_32,\r
-        NONE_BOOTNEXT_VALUE\r
-        );\r
-    } else {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        STRING_TOKEN (STR_NONE),\r
-        0,\r
-        EFI_IFR_TYPE_NUM_SIZE_32,\r
-        NONE_BOOTNEXT_VALUE\r
-        );\r
-    }      \r
-\r
-    HiiCreateOneOfOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      BOOT_NEXT_VAR_OFFSET,\r
-      STRING_TOKEN (STR_BOOT_NEXT),\r
-      STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
-      0,\r
-      EFI_IFR_NUMERIC_SIZE_4,\r
-      OptionsOpCodeHandle,\r
-      NULL\r
-      );\r
-\r
-    HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-  }\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
-  Create the dynamic page to allow user to set the "TimeOut" value.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateTimeOutPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  VOID    *DefaultOpCodeHandle;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (DefaultOpCodeHandle != NULL);\r
-  HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, CallbackData->BmmFakeNvData.BootTimeOut);\r
-\r
-  HiiCreateNumericOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    BOOT_TIME_OUT_VAR_OFFSET,\r
-    STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
-    STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
-    0,\r
-    EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
-    0,\r
-    65535,\r
-    0,\r
-    DefaultOpCodeHandle\r
-    );\r
-  \r
-  HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-\r
 /**\r
   Refresh the text mode page.\r
 \r
@@ -858,15 +724,21 @@ UpdateConModePage (
     if (EFI_ERROR (Status)) {\r
       continue;\r
     }\r
-    \r
+\r
     //\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
-    StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
+    StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen(L" x ") + 1);\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
@@ -965,17 +837,17 @@ UpdateTerminalPage (
     (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
-    0,\r
+    EFI_IFR_FLAG_CALLBACK,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     OptionsOpCodeHandle,\r
     NULL\r
     );\r
-  \r
+\r
   HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
   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 (DataBitsList[Index].Value == 8) {\r
@@ -998,7 +870,7 @@ UpdateTerminalPage (
     (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
-    0,\r
+    EFI_IFR_FLAG_CALLBACK,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     OptionsOpCodeHandle,\r
     NULL\r
@@ -1008,7 +880,7 @@ 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 (ParityList[Index].Value ==  NoParity) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
@@ -1030,7 +902,7 @@ UpdateTerminalPage (
     (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     STRING_TOKEN (STR_COM_PARITY),\r
-    0,\r
+    EFI_IFR_FLAG_CALLBACK,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     OptionsOpCodeHandle,\r
     NULL\r
@@ -1040,7 +912,7 @@ 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 (StopBitsList[Index].Value == OneStopBit) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
@@ -1062,7 +934,7 @@ UpdateTerminalPage (
     (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
-    0,\r
+    EFI_IFR_FLAG_CALLBACK,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     OptionsOpCodeHandle,\r
     NULL\r
@@ -1072,7 +944,7 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
+  for (Index = 0; Index < ARRAY_SIZE (TerminalType); Index++) {\r
     CheckFlags = 0;\r
     if (Index == 0) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
@@ -1094,7 +966,7 @@ UpdateTerminalPage (
     (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
-    0,\r
+    EFI_IFR_FLAG_CALLBACK,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     OptionsOpCodeHandle,\r
     NULL\r
@@ -1104,7 +976,7 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
+  for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
   CheckFlags = 0;\r
     if (Index == 0) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
@@ -1125,7 +997,7 @@ UpdateTerminalPage (
     (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_FLAG_CALLBACK,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     OptionsOpCodeHandle,\r
     NULL\r
@@ -1135,7 +1007,7 @@ UpdateTerminalPage (
 \r
   UpdatePageEnd (CallbackData);\r
 }\r
\r
+\r
 /**\r
 Update add boot/driver option page.\r
 \r
@@ -1154,26 +1026,32 @@ UpdateOptionPage(
   CHAR16                *String;\r
   EFI_STRING_ID         StringToken;\r
 \r
+  String = NULL;\r
+\r
   if (DevicePath != NULL){\r
     String = ExtractFileNameFromDevicePath(DevicePath);\r
-    StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
-    FreePool(String);\r
-  } else {\r
+  }\r
+  if (String == NULL) {\r
     String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
     ASSERT (String != NULL);\r
-    StringToken =  HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
-    FreePool (String);\r
   }\r
 \r
+  StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
+  FreePool (String);\r
+\r
   if(FormId == FORM_BOOT_ADD_ID){\r
     if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
       ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
       ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
+      ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData));\r
+      ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));\r
     }\r
   } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
     if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
       ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
       ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
+      ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData));\r
+      ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));\r
     }\r
   }\r
 \r