]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg:Rename BootMaintenanceManagerLib to BootMaintenanceManagerUiLib
authorDandan Bi <dandan.bi@intel.com>
Tue, 19 Jan 2016 03:28:46 +0000 (03:28 +0000)
committerdandanbi <dandanbi@Edk2>
Tue, 19 Jan 2016 03:28:46 +0000 (03:28 +0000)
Avoid any confusion,add the keyword "Ui",
user can understand the use of the library clearly.

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

26 files changed:
MdeModulePkg/Library/BootMaintenanceManagerLib/BmLib.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenance.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManager.h [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManager.vfr [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerLib.inf [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerLib.uni [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerStrings.uni [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/BootOption.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/ConsoleOption.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/Data.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/FormGuid.h [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/UpdatePage.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerLib/Variable.c [deleted file]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BmLib.c [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.vfr [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerStrings.uni [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.uni [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/ConsoleOption.c [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/Data.c [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/FormGuid.h [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c [new file with mode: 0644]
MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c [new file with mode: 0644]

diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BmLib.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/BmLib.c
deleted file mode 100644 (file)
index 0ef9bf0..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/** @file\r
-Utility routines used by boot maintenance modules.\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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
-  Function deletes the variable specified by VarName and VarGuid.\r
-\r
-  @param VarName           A Null-terminated Unicode string that is\r
-                           the name of the vendor's variable.\r
-\r
-  @param VarGuid           A unique identifier for the vendor.\r
-\r
-  @retval  EFI_SUCCESS           The variable was found and removed\r
-  @retval  EFI_UNSUPPORTED       The variable store was inaccessible\r
-  @retval  EFI_NOT_FOUND         The variable was not found\r
-\r
-**/\r
-EFI_STATUS\r
-EfiLibDeleteVariable (\r
-  IN CHAR16   *VarName,\r
-  IN EFI_GUID *VarGuid\r
-  )\r
-{\r
-  return gRT->SetVariable (\r
-                VarName,\r
-                VarGuid,\r
-                0,\r
-                0,\r
-                NULL\r
-                );\r
-}\r
-\r
-/**\r
-  Function is used to determine the number of device path instances\r
-  that exist in a device path.\r
-\r
-\r
-  @param DevicePath      A pointer to a device path data structure.\r
-\r
-  @return This function counts and returns the number of device path instances\r
-          in DevicePath.\r
-\r
-**/\r
-UINTN\r
-EfiDevicePathInstanceCount (\r
-  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
-  )\r
-{\r
-  UINTN Count;\r
-  UINTN Size;\r
-\r
-  Count = 0;\r
-  while (GetNextDevicePathInstance (&DevicePath, &Size) != NULL) {\r
-    Count += 1;\r
-  }\r
-\r
-  return Count;\r
-}\r
-\r
-/**\r
-  Get a string from the Data Hub record based on \r
-  a device path.\r
-\r
-  @param DevPath         The device Path.\r
-\r
-  @return A string located from the Data Hub records based on\r
-          the device path.\r
-  @retval NULL  If failed to get the String from Data Hub.\r
-\r
-**/\r
-UINT16 *\r
-EfiLibStrFromDatahub (\r
-  IN EFI_DEVICE_PATH_PROTOCOL                 *DevPath\r
-  )\r
-{\r
-  return NULL;\r
-}\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenance.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenance.c
deleted file mode 100644 (file)
index 2d52f9b..0000000
+++ /dev/null
@@ -1,1518 +0,0 @@
-/** @file\r
-The functions for Boot Maintainence Main menu.\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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-#define FRONT_PAGE_KEY_OFFSET          0x4000\r
-//\r
-// Boot video resolution and text mode.\r
-//\r
-UINT32    mBmmBootHorizontalResolution    = 0;\r
-UINT32    mBmmBootVerticalResolution      = 0;\r
-UINT32    mBmmBootTextModeColumn          = 0;\r
-UINT32    mBmmBootTextModeRow             = 0;\r
-//\r
-// BIOS setup video resolution and text mode.\r
-//\r
-UINT32    mBmmSetupTextModeColumn         = 0;\r
-UINT32    mBmmSetupTextModeRow            = 0;\r
-UINT32    mBmmSetupHorizontalResolution   = 0;\r
-UINT32    mBmmSetupVerticalResolution     = 0;\r
-\r
-EFI_DEVICE_PATH_PROTOCOL  EndDevicePath[] = {\r
-  {\r
-    END_DEVICE_PATH_TYPE,\r
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    {\r
-      END_DEVICE_PATH_LENGTH,\r
-      0\r
-    }\r
-  }\r
-};\r
-\r
-HII_VENDOR_DEVICE_PATH  mBmmHiiVendorDevicePath = {\r
-  {\r
-    {\r
-      HARDWARE_DEVICE_PATH,\r
-      HW_VENDOR_DP,\r
-      {\r
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
-      }\r
-    },\r
-    //\r
-    // {165A028F-0BB2-4b5f-8747-77592E3F6499}\r
-    //\r
-    { 0x165a028f, 0xbb2, 0x4b5f, { 0x87, 0x47, 0x77, 0x59, 0x2e, 0x3f, 0x64, 0x99 } }\r
-  },\r
-  {\r
-    END_DEVICE_PATH_TYPE,\r
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    { \r
-      (UINT8) (END_DEVICE_PATH_LENGTH),\r
-      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
-    }\r
-  }\r
-};\r
-\r
-EFI_GUID mBootMaintGuid          = BOOT_MAINT_FORMSET_GUID;\r
-\r
-CHAR16  mBootMaintStorageName[]     = L"BmmData";\r
-BMM_CALLBACK_DATA  gBootMaintenancePrivate = {\r
-  BMM_CALLBACK_DATA_SIGNATURE,\r
-  NULL,\r
-  NULL,\r
-  {\r
-    BootMaintExtractConfig,\r
-    BootMaintRouteConfig,\r
-    BootMaintCallback\r
-  }\r
-};\r
-\r
-BMM_CALLBACK_DATA *mBmmCallbackInfo = &gBootMaintenancePrivate;\r
-BOOLEAN  mAllMenuInit               = FALSE;\r
-\r
-/**\r
-  Init all memu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitAllMenu (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-/**\r
-  Free up all Menu Option list.\r
-\r
-**/\r
-VOID\r
-FreeAllMenu (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function will change video resolution and text mode\r
-  according to defined setup mode or defined boot mode  \r
-\r
-  @param  IsSetupMode   Indicate mode is changed to setup mode or boot mode. \r
-\r
-  @retval  EFI_SUCCESS  Mode is changed successfully.\r
-  @retval  Others       Mode failed to be changed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BmmBdsSetConsoleMode (\r
-  BOOLEAN  IsSetupMode\r
-  )\r
-{\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;\r
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL       *SimpleTextOut;\r
-  UINTN                                 SizeOfInfo;\r
-  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;\r
-  UINT32                                MaxGopMode;\r
-  UINT32                                MaxTextMode;\r
-  UINT32                                ModeNumber;\r
-  UINT32                                NewHorizontalResolution;\r
-  UINT32                                NewVerticalResolution;\r
-  UINT32                                NewColumns;\r
-  UINT32                                NewRows;\r
-  UINTN                                 HandleCount;\r
-  EFI_HANDLE                            *HandleBuffer;\r
-  EFI_STATUS                            Status;\r
-  UINTN                                 Index;\r
-  UINTN                                 CurrentColumn;\r
-  UINTN                                 CurrentRow;  \r
-\r
-  MaxGopMode  = 0;\r
-  MaxTextMode = 0;\r
-\r
-  //\r
-  // Get current video resolution and text mode \r
-  //\r
-  Status = gBS->HandleProtocol (\r
-                  gST->ConsoleOutHandle,\r
-                  &gEfiGraphicsOutputProtocolGuid,\r
-                  (VOID**)&GraphicsOutput\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    GraphicsOutput = NULL;\r
-  }\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  gST->ConsoleOutHandle,\r
-                  &gEfiSimpleTextOutProtocolGuid,\r
-                  (VOID**)&SimpleTextOut\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    SimpleTextOut = NULL;\r
-  }  \r
-\r
-  if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (IsSetupMode) {\r
-    //\r
-    // The requried resolution and text mode is setup mode.\r
-    //\r
-    NewHorizontalResolution = mBmmSetupHorizontalResolution;\r
-    NewVerticalResolution   = mBmmSetupVerticalResolution;\r
-    NewColumns              = mBmmSetupTextModeColumn;\r
-    NewRows                 = mBmmSetupTextModeRow;\r
-  } else {\r
-    //\r
-    // The required resolution and text mode is boot mode.\r
-    //\r
-    NewHorizontalResolution = mBmmBootHorizontalResolution;\r
-    NewVerticalResolution   = mBmmBootVerticalResolution;\r
-    NewColumns              = mBmmBootTextModeColumn;\r
-    NewRows                 = mBmmBootTextModeRow;   \r
-  }\r
-\r
-  if (GraphicsOutput != NULL) {\r
-    MaxGopMode  = GraphicsOutput->Mode->MaxMode;\r
-  } \r
-\r
-  if (SimpleTextOut != NULL) {\r
-    MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
-  }\r
-\r
-  //\r
-  // 1. If current video resolution is same with required video resolution,\r
-  //    video resolution need not be changed.\r
-  //    1.1. If current text mode is same with required text mode, text mode need not be changed.\r
-  //    1.2. If current text mode is different from required text mode, text mode need be changed.\r
-  // 2. If current video resolution is different from required video resolution, we need restart whole console drivers.\r
-  //\r
-  for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
-    Status = GraphicsOutput->QueryMode (\r
-                       GraphicsOutput,\r
-                       ModeNumber,\r
-                       &SizeOfInfo,\r
-                       &Info\r
-                       );\r
-    if (!EFI_ERROR (Status)) {\r
-      if ((Info->HorizontalResolution == NewHorizontalResolution) &&\r
-          (Info->VerticalResolution == NewVerticalResolution)) {\r
-        if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&\r
-            (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) {\r
-          //\r
-          // Current resolution is same with required resolution, check if text mode need be set\r
-          //\r
-          Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
-          ASSERT_EFI_ERROR (Status);\r
-          if (CurrentColumn == NewColumns && CurrentRow == NewRows) {\r
-            //\r
-            // If current text mode is same with required text mode. Do nothing\r
-            //\r
-            FreePool (Info);\r
-            return EFI_SUCCESS;\r
-          } else {\r
-            //\r
-            // If current text mode is different from requried text mode.  Set new video mode\r
-            //\r
-            for (Index = 0; Index < MaxTextMode; Index++) {\r
-              Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
-              if (!EFI_ERROR(Status)) {\r
-                if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {\r
-                  //\r
-                  // Required text mode is supported, set it.\r
-                  //\r
-                  Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
-                  ASSERT_EFI_ERROR (Status);\r
-                  //\r
-                  // Update text mode PCD.\r
-                  //\r
-                  Status = PcdSet32S (PcdConOutColumn, mBmmSetupTextModeColumn);\r
-                  ASSERT_EFI_ERROR (Status);\r
-                  Status = PcdSet32S (PcdConOutRow, mBmmSetupTextModeRow);\r
-                  ASSERT_EFI_ERROR (Status);\r
-                  FreePool (Info);\r
-                  return EFI_SUCCESS;\r
-                }\r
-              }\r
-            }\r
-            if (Index == MaxTextMode) {\r
-              //\r
-              // If requried text mode is not supported, return error.\r
-              //\r
-              FreePool (Info);\r
-              return EFI_UNSUPPORTED;\r
-            }\r
-          }\r
-        } else {\r
-          //\r
-          // If current video resolution is not same with the new one, set new video resolution.\r
-          // In this case, the driver which produces simple text out need be restarted.\r
-          //\r
-          Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
-          if (!EFI_ERROR (Status)) {\r
-            FreePool (Info);\r
-            break;\r
-          }\r
-        }\r
-      }\r
-      FreePool (Info);\r
-    }\r
-  }\r
-\r
-  if (ModeNumber == MaxGopMode) {\r
-    //\r
-    // If the resolution is not supported, return error.\r
-    //\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  //\r
-  // Set PCD to Inform GraphicsConsole to change video resolution.\r
-  // Set PCD to Inform Consplitter to change text mode.\r
-  //\r
-  Status = PcdSet32S (PcdVideoHorizontalResolution, NewHorizontalResolution);\r
-  ASSERT_EFI_ERROR (Status);\r
-  Status = PcdSet32S (PcdVideoVerticalResolution, NewVerticalResolution);\r
-  ASSERT_EFI_ERROR (Status);\r
-  Status = PcdSet32S (PcdConOutColumn, NewColumns);\r
-  ASSERT_EFI_ERROR (Status);\r
-  Status = PcdSet32S (PcdConOutRow, NewRows);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // Video mode is changed, so restart graphics console driver and higher level driver.\r
-  // Reconnect graphics console driver and higher level driver.\r
-  // Locate all the handles with GOP protocol and reconnect it.\r
-  //\r
-  Status = gBS->LocateHandleBuffer (\r
-                   ByProtocol,\r
-                   &gEfiSimpleTextOutProtocolGuid,\r
-                   NULL,\r
-                   &HandleCount,\r
-                   &HandleBuffer\r
-                   );\r
-  if (!EFI_ERROR (Status)) {\r
-    for (Index = 0; Index < HandleCount; Index++) {\r
-      gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
-    }\r
-    for (Index = 0; Index < HandleCount; Index++) {\r
-      gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
-    }\r
-    if (HandleBuffer != NULL) {\r
-      FreePool (HandleBuffer);\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function converts an input device structure to a Unicode string.\r
-\r
-  @param DevPath      A pointer to the device path structure.\r
-\r
-  @return             A new allocated Unicode string that represents the device path.\r
-\r
-**/\r
-CHAR16 *\r
-UiDevicePathToStr (\r
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
-  )\r
-{\r
-  EFI_STATUS                       Status;\r
-  CHAR16                           *ToText;\r
-  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
-\r
-  if (DevPath == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiDevicePathToTextProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &DevPathToText\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  ToText = DevPathToText->ConvertDevicePathToText (\r
-                            DevPath,\r
-                            FALSE,\r
-                            TRUE\r
-                            );\r
-  ASSERT (ToText != NULL);\r
-  return ToText;\r
-}\r
-\r
-/**\r
-  Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
-  The caller is responsible for freeing the allocated buffer using FreePool().\r
-\r
-  @param DevicePath       Device path.\r
-\r
-  @return                 A new allocated string that represents the file name.\r
-\r
-**/\r
-CHAR16 *\r
-ExtractFileNameFromDevicePath (\r
-  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
-  )\r
-{\r
-  CHAR16          *String;\r
-  CHAR16          *MatchString;\r
-  CHAR16          *LastMatch;\r
-  CHAR16          *FileName;\r
-  UINTN           Length;\r
-\r
-  ASSERT(DevicePath != NULL);\r
-\r
-  String = UiDevicePathToStr(DevicePath);\r
-  MatchString = String;\r
-  LastMatch   = String;\r
-\r
-  while(MatchString != NULL){\r
-    LastMatch   = MatchString + 1;\r
-    MatchString = StrStr(LastMatch,L"\\");\r
-  }\r
-\r
-  Length = StrLen(LastMatch);\r
-  FileName = AllocateCopyPool ((Length + 1) * sizeof(CHAR16), LastMatch);\r
-  *(FileName + Length) = 0;\r
-\r
-  FreePool(String);\r
-\r
-  return FileName;\r
-}\r
-\r
-/**\r
-  Extract device path for given HII handle and class guid.\r
-\r
-  @param Handle          The HII handle.\r
-\r
-  @retval  NULL          Fail to get the device path string.\r
-  @return  PathString    Get the device path string.\r
-\r
-**/\r
-CHAR16 *\r
-BmmExtractDevicePathFromHiiHandle (\r
-  IN      EFI_HII_HANDLE      Handle\r
-  )\r
-{\r
-  EFI_STATUS                       Status;\r
-  EFI_HANDLE                       DriverHandle;\r
-\r
-  ASSERT (Handle != NULL);\r
-\r
-  if (Handle == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Get device path string.\r
-  //\r
-  return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
-\r
-}\r
-\r
-/**\r
-  This function allows a caller to extract the current configuration for one\r
-  or more named elements from the target driver.\r
-\r
-  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param Request         A null-terminated Unicode string in <ConfigRequest> format.\r
-  @param Progress        On return, points to a character in the Request string.\r
-                         Points to the string's null terminator if request was successful.\r
-                         Points to the most recent '&' before the first failing name/value\r
-                         pair (or the beginning of the string if the failure is in the\r
-                         first name/value pair) if the request was not successful.\r
-  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which\r
-                         has all values filled in for the names in the Request string.\r
-                         String to be allocated by the called function.\r
-\r
-  @retval  EFI_SUCCESS            The Results is filled with the requested values.\r
-  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
-  @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
-  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintExtractConfig (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
-  IN  CONST EFI_STRING                       Request,\r
-  OUT EFI_STRING                             *Progress,\r
-  OUT EFI_STRING                             *Results\r
-  )\r
-{\r
-  EFI_STATUS         Status;\r
-  UINTN              BufferSize;\r
-  BMM_CALLBACK_DATA  *Private;\r
-  EFI_STRING                       ConfigRequestHdr;\r
-  EFI_STRING                       ConfigRequest;\r
-  BOOLEAN                          AllocatedRequest;\r
-  UINTN                            Size;\r
-\r
-  if (Progress == NULL || Results == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  *Progress = Request;\r
-  if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mBootMaintGuid, mBootMaintStorageName)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  ConfigRequestHdr = NULL;\r
-  ConfigRequest    = NULL;\r
-  AllocatedRequest = FALSE;\r
-  Size             = 0;\r
-\r
-  Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
-  //\r
-  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
-  //\r
-  BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
-  ConfigRequest = Request;\r
-  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
-    //\r
-    // Request has no request element, construct full request string.\r
-    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
-    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
-    //\r
-    ConfigRequestHdr = HiiConstructConfigHdr (&mBootMaintGuid, mBootMaintStorageName, Private->BmmDriverHandle);\r
-    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
-    ConfigRequest = AllocateZeroPool (Size);\r
-    ASSERT (ConfigRequest != NULL);\r
-    AllocatedRequest = TRUE;\r
-    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
-    FreePool (ConfigRequestHdr);\r
-  }\r
-\r
-  Status = gHiiConfigRouting->BlockToConfig (\r
-                                gHiiConfigRouting,\r
-                                ConfigRequest,\r
-                                (UINT8 *) &Private->BmmFakeNvData,\r
-                                BufferSize,\r
-                                Results,\r
-                                Progress\r
-                                );\r
-  //\r
-  // Free the allocated config request string.\r
-  //\r
-  if (AllocatedRequest) {\r
-    FreePool (ConfigRequest);\r
-    ConfigRequest = NULL;\r
-  }\r
-  //\r
-  // Set Progress string to the original request string.\r
-  //\r
-  if (Request == NULL) {\r
-    *Progress = NULL;\r
-  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
-    *Progress = Request + StrLen (Request);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  This function applies changes in a driver's configuration.\r
-  Input is a Configuration, which has the routing data for this\r
-  driver followed by name / value configuration pairs. The driver\r
-  must apply those pairs to its configurable storage. If the\r
-  driver's configuration is stored in a linear block of data\r
-  and the driver's name / value pairs are in <BlockConfig>\r
-  format, it may use the ConfigToBlock helper function (above) to\r
-  simplify the job. Currently not implemented.\r
-\r
-  @param[in]  This                Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param[in]  Configuration       A null-terminated Unicode string in\r
-                                  <ConfigString> format.   \r
-  @param[out] Progress            A pointer to a string filled in with the\r
-                                  offset of the most recent '&' before the\r
-                                  first failing name / value pair (or the\r
-                                  beginn ing of the string if the failure\r
-                                  is in the first name / value pair) or\r
-                                  the terminating NULL if all was\r
-                                  successful.\r
-\r
-  @retval EFI_SUCCESS             The results have been distributed or are\r
-                                  awaiting distribution.  \r
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the\r
-                                  parts of the results that must be\r
-                                  stored awaiting possible future\r
-                                  protocols.\r
-  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
-                                  Results parameter would result\r
-                                  in this type of error.\r
-  @retval EFI_NOT_FOUND           Target for the specified routing data\r
-                                  was not found.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintRouteConfig (\r
-  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
-  IN CONST EFI_STRING                     Configuration,\r
-  OUT EFI_STRING                          *Progress\r
-  )\r
-{\r
-  EFI_STATUS                      Status;\r
-  UINTN                           BufferSize;\r
-  EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
-  BMM_FAKE_NV_DATA                *NewBmmData;\r
-  BMM_FAKE_NV_DATA                *OldBmmData;\r
-  BM_CONSOLE_CONTEXT              *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT             *NewTerminalContext;\r
-  BM_MENU_ENTRY                   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT                 *NewLoadContext;\r
-  UINT16                          Index;\r
-  BOOLEAN                         TerminalAttChange;\r
-  BMM_CALLBACK_DATA               *Private; \r
-\r
-  if (Progress == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  *Progress = Configuration;\r
-\r
-  if (Configuration == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Check routing data in <ConfigHdr>.\r
-  // Note: there is no name for Name/Value storage, only GUID will be checked\r
-  //\r
-  if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiConfigRoutingProtocolGuid, \r
-                  NULL, \r
-                  (VOID **)&ConfigRouting\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Private = BMM_CALLBACK_DATA_FROM_THIS (This);  \r
-  //\r
-  // Get Buffer Storage data from EFI variable\r
-  //\r
-  BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
-  OldBmmData = &Private->BmmOldFakeNVData;\r
-  NewBmmData = &Private->BmmFakeNvData;\r
-  //\r
-  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
-  //\r
-  Status = ConfigRouting->ConfigToBlock (\r
-                            ConfigRouting,\r
-                            Configuration,\r
-                            (UINT8 *) NewBmmData,\r
-                            &BufferSize,\r
-                            Progress\r
-                            );\r
-  ASSERT_EFI_ERROR (Status);    \r
-  //\r
-  // Compare new and old BMM configuration data and only do action for modified item to \r
-  // avoid setting unnecessary non-volatile variable\r
-  //\r
-\r
-  //\r
-  // Check data which located in BMM main page and save the settings if need\r
-  //         \r
-  if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) {\r
-    Status = Var_UpdateBootNext (Private);\r
-  }\r
-\r
-  //\r
-  // Check data which located in Boot Options Menu and save the settings if need\r
-  //      \r
-  if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) {  \r
-    for (Index = 0; \r
-         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); \r
-         Index ++) {\r
-      NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
-      NewBmmData->BootOptionDel[Index] = FALSE;\r
-      NewBmmData->BootOptionDelMark[Index] = FALSE;\r
-    }\r
-\r
-    Var_DelBootOption ();\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {\r
-    Status = Var_UpdateBootOrder (Private);\r
-  }\r
-\r
-  if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
-    Status = gRT->SetVariable(\r
-                    L"Timeout",\r
-                    &gEfiGlobalVariableGuid,\r
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                    sizeof(UINT16),\r
-                    &(NewBmmData->BootTimeOut)\r
-                    );\r
-    ASSERT_EFI_ERROR(Status);\r
-\r
-    Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
-  }\r
-\r
-  //\r
-  // Check data which located in Driver Options Menu and save the settings if need\r
-  //              \r
-  if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) {       \r
-    for (Index = 0; \r
-         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); \r
-         Index++) {\r
-      NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
-      NewBmmData->DriverOptionDel[Index] = FALSE;\r
-      NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
-    }\r
-    Var_DelDriverOption ();  \r
-  }\r
-\r
-  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
-    Status = Var_UpdateDriverOrder (Private);\r
-  }\r
-\r
-  if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
-    Var_UpdateConMode(Private);\r
-  }\r
-\r
-  TerminalAttChange = FALSE;\r
-  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-\r
-    //\r
-    // only need update modified items\r
-    //\r
-    if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 &&\r
-         CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 &&\r
-         CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 &&\r
-         CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 &&\r
-         CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 &&\r
-         CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) {\r
-      continue;\r
-    }\r
-\r
-    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-    ASSERT (NewMenuEntry != NULL);\r
-    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-    NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];\r
-    ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
-    NewTerminalContext->BaudRate      = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
-    NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
-    ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
-    NewTerminalContext->DataBits      = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
-    NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
-    ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
-    NewTerminalContext->StopBits      = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
-    NewTerminalContext->ParityIndex   = NewBmmData->COMParity[Index];\r
-    ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
-    NewTerminalContext->Parity        = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value;\r
-    NewTerminalContext->TerminalType  = NewBmmData->COMTerminalType[Index];\r
-    NewTerminalContext->FlowControl   = NewBmmData->COMFlowControl[Index];\r
-    ChangeTerminalDevicePath (\r
-      NewTerminalContext->DevicePath,\r
-      FALSE\r
-      );\r
-    TerminalAttChange = TRUE;\r
-  }\r
-  if (TerminalAttChange) {\r
-    Var_UpdateConsoleInpOption ();\r
-    Var_UpdateConsoleOutOption ();\r
-    Var_UpdateErrorOutOption ();\r
-  }\r
-  //\r
-  // Check data which located in Console Options Menu and save the settings if need\r
-  //\r
-  if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){\r
-    for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
-      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
-      NewConsoleContext           = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
-      ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];\r
-    }\r
-    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
-      NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
-    }\r
-    Var_UpdateConsoleInpOption();\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
-    for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
-      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
-      NewConsoleContext           = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
-      ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];\r
-    }\r
-    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
-      NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
-    }\r
-    Var_UpdateConsoleOutOption();\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
-    for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
-      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
-      NewConsoleContext           = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
-      ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];\r
-    }\r
-    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
-      NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
-    }\r
-    Var_UpdateErrorOutOption();\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->BootDescriptionData, OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) != 0 ||\r
-       CompareMem (NewBmmData->BootOptionalData, OldBmmData->BootOptionalData, sizeof (NewBmmData->BootOptionalData)) != 0) {\r
-    Status = Var_UpdateBootOption (Private);\r
-    NewBmmData->BootOptionChanged = FALSE;\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-    BOpt_GetBootOptions (Private);\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->DriverDescriptionData, OldBmmData->DriverDescriptionData, sizeof (NewBmmData->DriverDescriptionData)) != 0 ||\r
-       CompareMem (NewBmmData->DriverOptionalData, OldBmmData->DriverOptionalData, sizeof (NewBmmData->DriverOptionalData)) != 0) {\r
-    Status = Var_UpdateDriverOption (\r
-              Private,\r
-              Private->BmmHiiHandle,\r
-              NewBmmData->DriverDescriptionData,\r
-              NewBmmData->DriverOptionalData,\r
-              NewBmmData->ForceReconnect\r
-              );\r
-    NewBmmData->DriverOptionChanged = FALSE;\r
-    NewBmmData->ForceReconnect      = TRUE;\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-    BOpt_GetDriverOptions (Private);\r
-  }\r
-\r
-  //\r
-  // After user do the save action, need to update OldBmmData.\r
-  //\r
-  CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function processes the results of changes in configuration.\r
-\r
-\r
-  @param This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param Action             Specifies the type of action taken by the browser.\r
-  @param QuestionId         A unique value which is sent to the original exporting driver\r
-                            so that it can identify the type of data to expect.\r
-  @param Type               The type of value for the question.\r
-  @param Value              A pointer to the data being sent to the original exporting driver.\r
-  @param ActionRequest      On return, points to the action requested by the callback function.\r
-\r
-  @retval EFI_SUCCESS           The callback successfully handled the action.\r
-  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.\r
-  @retval EFI_DEVICE_ERROR      The variable could not be saved.\r
-  @retval EFI_UNSUPPORTED       The specified Action is not supported by the callback.\r
-  @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintCallback (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL         *This,\r
-  IN        EFI_BROWSER_ACTION                     Action,\r
-  IN        EFI_QUESTION_ID                        QuestionId,\r
-  IN        UINT8                                  Type,\r
-  IN        EFI_IFR_TYPE_VALUE                     *Value,\r
-  OUT       EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
-  )\r
-{\r
-  BMM_CALLBACK_DATA *Private;\r
-  BM_MENU_ENTRY     *NewMenuEntry;\r
-  BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
-  UINTN             OldValue;\r
-  UINTN             NewValue;\r
-  UINTN             Number;\r
-  UINTN             Index;\r
-  EFI_DEVICE_PATH_PROTOCOL * File;\r
-\r
-  if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
-    //\r
-    // Do nothing for other UEFI Action. Only do call back when data is changed.\r
-    //\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  OldValue       = 0;\r
-  NewValue       = 0;\r
-  Number         = 0;\r
-\r
-  Private        = BMM_CALLBACK_DATA_FROM_THIS (This);\r
-  //\r
-  // Retrive uncommitted data from Form Browser\r
-  //\r
-  CurrentFakeNVMap = &Private->BmmFakeNvData;\r
-  HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);\r
-\r
-  if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
-    if (Value == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-    \r
-    UpdatePageId (Private, QuestionId);\r
-\r
-    if (QuestionId < FILE_OPTION_OFFSET) {\r
-      if (QuestionId < CONFIG_OPTION_OFFSET) {\r
-        switch (QuestionId) {\r
-        case FORM_BOOT_ADD_ID:\r
-          // Leave BMM and enter FileExplorer. \r
-          ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateBootOptionFromFile, &File);\r
-          break;\r
-\r
-        case FORM_DRV_ADD_FILE_ID:\r
-          // Leave BMM and enter FileExplorer.\r
-          ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateDriverOptionFromFile, &File);\r
-          break;\r
-\r
-        case FORM_DRV_ADD_HANDLE_ID:\r
-          CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
-          UpdateDrvAddHandlePage (Private);\r
-          break;\r
-\r
-        case FORM_BOOT_DEL_ID:\r
-          CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
-          UpdateBootDelPage (Private);\r
-          break;\r
-\r
-        case FORM_BOOT_CHG_ID:\r
-        case FORM_DRV_CHG_ID:\r
-          UpdatePageBody (QuestionId, Private);\r
-          break;\r
-\r
-        case FORM_DRV_DEL_ID:\r
-          CleanUpPage (FORM_DRV_DEL_ID, Private);\r
-          UpdateDrvDelPage (Private);\r
-          break;\r
-\r
-        case FORM_BOOT_NEXT_ID:\r
-          CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
-          UpdateBootNextPage (Private);\r
-          break;\r
-\r
-        case FORM_TIME_OUT_ID:\r
-          CleanUpPage (FORM_TIME_OUT_ID, Private);\r
-          UpdateTimeOutPage (Private);\r
-          break;\r
-\r
-        case FORM_CON_IN_ID:\r
-        case FORM_CON_OUT_ID:\r
-        case FORM_CON_ERR_ID:\r
-          UpdatePageBody (QuestionId, Private);\r
-          break;\r
-\r
-        case FORM_CON_MODE_ID:\r
-          CleanUpPage (FORM_CON_MODE_ID, Private);\r
-          UpdateConModePage (Private);\r
-          break;\r
-\r
-        case FORM_CON_COM_ID:\r
-          CleanUpPage (FORM_CON_COM_ID, Private);\r
-          UpdateConCOMPage (Private);\r
-          break;\r
-\r
-        default:\r
-          break;\r
-        }\r
-      } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < CONSOLE_OPTION_OFFSET)) {\r
-        Index                  = (UINT16) (QuestionId - TERMINAL_OPTION_OFFSET);\r
-        Private->CurrentTerminal  = Index;\r
-\r
-        CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
-        UpdateTerminalPage (Private);\r
-\r
-      } else if (QuestionId >= HANDLE_OPTION_OFFSET) {\r
-        Index                  = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);\r
-\r
-        NewMenuEntry            = BOpt_GetMenuEntry (&DriverMenu, Index);\r
-        ASSERT (NewMenuEntry != NULL);\r
-        Private->HandleContext  = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-        CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
-\r
-        Private->MenuEntry                  = NewMenuEntry;\r
-        Private->LoadContext->FilePathList  = Private->HandleContext->DevicePath;\r
-\r
-        UpdateDriverAddHandleDescPage (Private);\r
-      }\r
-    }\r
-    if (QuestionId == KEY_VALUE_BOOT_FROM_FILE){\r
-      // Leave BMM and enter FileExplorer.\r
-      ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) BootFromFile, &File);\r
-    }\r
-  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
-    if ((Value == NULL) || (ActionRequest == NULL)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-   \r
-    if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
-      CurrentFakeNVMap->BootOptionChanged = FALSE;\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
-    } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
-      CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
-    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
-      //\r
-      // Discard changes and exit formset\r
-      //\r
-      CurrentFakeNVMap->DriverOptionalData[0]     = 0x0000;\r
-      CurrentFakeNVMap->DriverDescriptionData[0]  = 0x0000;\r
-      CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
-      CurrentFakeNVMap->ForceReconnect      = TRUE;\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
-    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
-      //\r
-      // Discard changes and exit formset\r
-      //\r
-      CurrentFakeNVMap->BootOptionalData[0]     = 0x0000;\r
-      CurrentFakeNVMap->BootDescriptionData[0]  = 0x0000;\r
-      CurrentFakeNVMap->BootOptionChanged = FALSE;\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
-    } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
-      CurrentFakeNVMap->BootOptionChanged = TRUE;\r
-    } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
-      CurrentFakeNVMap->DriverOptionChanged = TRUE;\r
-    } \r
-\r
-    if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
-      if (Value->b){\r
-        //\r
-        // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
-        //\r
-        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
-      } else {\r
-        //\r
-        // Means user remove the old check status.\r
-        //\r
-        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
-      }\r
-    } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
-      if (Value->b){\r
-        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
-      } else {\r
-        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
-      }\r
-    } else {\r
-      switch (QuestionId) {\r
-      case KEY_VALUE_SAVE_AND_EXIT:\r
-      case KEY_VALUE_NO_SAVE_AND_EXIT:\r
-        if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
-          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
-        } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
-          DiscardChangeHandler (Private, CurrentFakeNVMap);\r
-          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
-        }\r
-\r
-        break;\r
-\r
-      case FORM_RESET:\r
-        gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
-        return EFI_UNSUPPORTED;\r
-\r
-      default:\r
-        break;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Pass changed uncommitted data back to Form Browser\r
-  //\r
-  HiiSetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Discard all changes done to the BMM pages such as Boot Order change,\r
-  Driver order change.\r
-\r
-  @param Private            The BMM context data.\r
-  @param CurrentFakeNVMap   The current Fack NV Map.\r
-\r
-**/\r
-VOID\r
-DiscardChangeHandler (\r
-  IN  BMM_CALLBACK_DATA               *Private,\r
-  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap\r
-  )\r
-{\r
-  UINT16  Index;\r
-\r
-  switch (Private->BmmPreviousPageId) {\r
-  case FORM_BOOT_CHG_ID:\r
-    CopyMem (CurrentFakeNVMap->BootOptionOrder, Private->BmmOldFakeNVData.BootOptionOrder, sizeof (CurrentFakeNVMap->BootOptionOrder));\r
-    break;\r
-\r
-  case FORM_DRV_CHG_ID:\r
-    CopyMem (CurrentFakeNVMap->DriverOptionOrder, Private->BmmOldFakeNVData.DriverOptionOrder, sizeof (CurrentFakeNVMap->DriverOptionOrder));\r
-    break;\r
-\r
-  case FORM_BOOT_DEL_ID:\r
-    ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
-    for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-      CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
-    }\r
-    break;\r
-\r
-  case FORM_DRV_DEL_ID:\r
-    ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
-    for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
-      CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
-    }\r
-    break;\r
-\r
-  case FORM_BOOT_NEXT_ID:\r
-    CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
-    break;\r
-\r
-  case FORM_TIME_OUT_ID:\r
-    CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
-    break;\r
-\r
-  case FORM_DRV_ADD_HANDLE_DESC_ID:\r
-  case FORM_DRV_ADD_FILE_ID:\r
-  case FORM_DRV_ADD_HANDLE_ID:\r
-    CurrentFakeNVMap->DriverAddHandleDesc[0]          = 0x0000;\r
-    CurrentFakeNVMap->DriverAddHandleOptionalData[0]  = 0x0000;\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-}\r
-\r
-/**\r
-  Create dynamic code for BMM.\r
-\r
-  @param  BmmCallbackInfo        The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitializeDrivers(\r
-  IN BMM_CALLBACK_DATA        *BmmCallbackInfo\r
-  )\r
-{\r
-  EFI_HII_HANDLE              HiiHandle;\r
-  VOID                        *StartOpCodeHandle;\r
-  VOID                        *EndOpCodeHandle;\r
-  EFI_IFR_GUID_LABEL          *StartLabel;\r
-  EFI_IFR_GUID_LABEL          *EndLabel;\r
-  UINTN                       Index;    \r
-  EFI_STRING                  String;\r
-  EFI_STRING_ID               Token;\r
-  EFI_STRING_ID               TokenHelp;  \r
-  EFI_HII_HANDLE              *HiiHandles;\r
-  EFI_GUID                    FormSetGuid;\r
-  CHAR16                      *DevicePathStr;\r
-  EFI_STRING_ID               DevicePathId;\r
-  EFI_IFR_FORM_SET            *Buffer;      \r
-  UINTN                       BufferSize;   \r
-  UINT8                       ClassGuidNum; \r
-  EFI_GUID                    *ClassGuid;   \r
-  UINTN                       TempSize;\r
-  UINT8                       *Ptr;\r
-  EFI_STATUS                  Status;\r
-\r
-  TempSize =0;\r
-  BufferSize = 0;\r
-  Buffer = NULL;\r
-\r
-  HiiHandle = BmmCallbackInfo->BmmHiiHandle;\r
-  //\r
-  // Allocate space for creation of UpdateData Buffer\r
-  //\r
-  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (StartOpCodeHandle != NULL);\r
-\r
-  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (EndOpCodeHandle != NULL);\r
-\r
-  //\r
-  // Create Hii Extend Label OpCode as the start opcode\r
-  //\r
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  StartLabel->Number       = LABEL_BMM_PLATFORM_INFORMATION;\r
-\r
-  //\r
-  // Create Hii Extend Label OpCode as the end opcode\r
-  //\r
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  EndLabel->Number       = LABEL_END;\r
-\r
-  //\r
-  // Get all the Hii handles\r
-  //\r
-  HiiHandles = HiiGetHiiHandles (NULL);\r
-  ASSERT (HiiHandles != NULL);\r
-\r
-  //\r
-  // Search for formset of each class type\r
-  //\r
-  for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
-    Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-\r
-    Ptr = (UINT8 *)Buffer;\r
-    while(TempSize < BufferSize)  {\r
-      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-\r
-      if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
-        Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-        continue;\r
-      }\r
-\r
-      //\r
-      // Find FormSet OpCode\r
-      //\r
-      ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
-      ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
-      while (ClassGuidNum-- > 0) {\r
-        if (CompareGuid (&gEfiIfrBootMaintenanceGuid, ClassGuid) == 0){\r
-          ClassGuid ++;\r
-          continue;\r
-        }\r
-\r
-        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
-        if (String == NULL) {\r
-          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
-          ASSERT (String != NULL);\r
-        }\r
-        Token = HiiSetString (HiiHandle, 0, String, NULL);\r
-        FreePool (String);\r
-\r
-        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
-        if (String == NULL) {\r
-          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
-          ASSERT (String != NULL);\r
-        }\r
-        TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
-        FreePool (String);\r
-\r
-        FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
-\r
-        DevicePathStr = BmmExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
-        DevicePathId  = 0;\r
-        if (DevicePathStr != NULL){\r
-          DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
-          FreePool (DevicePathStr);\r
-        }\r
-         HiiCreateGotoExOpCode (\r
-           StartOpCodeHandle,\r
-           0,\r
-           Token,\r
-           TokenHelp,\r
-           0,\r
-           (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
-           0,\r
-           &FormSetGuid,\r
-           DevicePathId\r
-         );\r
-        break;\r
-      }\r
-      Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-    }\r
-\r
-    FreePool(Buffer);\r
-    Buffer = NULL;\r
-    TempSize = 0;\r
-    BufferSize = 0;\r
-  } \r
-  \r
-  HiiUpdateForm (\r
-    HiiHandle,\r
-    &mBootMaintGuid,\r
-    FORM_MAIN_ID,\r
-    StartOpCodeHandle,\r
-    EndOpCodeHandle\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
-  HiiFreeOpCodeHandle (EndOpCodeHandle);  \r
-  FreePool (HiiHandles);\r
-}\r
-\r
-/**\r
-   Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and\r
-   BmmOldFakeNVData member in BMM context data.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitializeBmmConfig (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          Index;\r
-\r
-  ASSERT (CallbackData != NULL);\r
-\r
-  InitializeDrivers (CallbackData);\r
-\r
-  //\r
-  // Initialize data which located in BMM main page\r
-  //\r
-  CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-    NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    if (NewLoadContext->IsBootNext) {\r
-      CallbackData->BmmFakeNvData.BootNext = Index;\r
-      break;\r
-    }\r
-  }\r
-\r
-  CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
-\r
-  //\r
-  // Initialize data which located in Boot Options Menu\r
-  //\r
-  GetBootOrder (CallbackData);\r
-\r
-  //\r
-  // Initialize data which located in Driver Options Menu\r
-  //\r
-  GetDriverOrder (CallbackData);\r
-\r
-  //\r
-  // Initialize data which located in Console Options Menu\r
-  //\r
-  GetConsoleOutMode (CallbackData);\r
-  GetConsoleInCheck (CallbackData);\r
-  GetConsoleOutCheck (CallbackData);\r
-  GetConsoleErrCheck (CallbackData);\r
-  GetTerminalAttribute (CallbackData);\r
-\r
-  CallbackData->BmmFakeNvData.ForceReconnect = TRUE;\r
-\r
-  //\r
-  // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
-  //\r
-  CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
-}\r
-\r
-/**\r
-  Initialized all Menu Option List.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitAllMenu (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  InitializeListHead (&BootOptionMenu.Head);\r
-  InitializeListHead (&DriverOptionMenu.Head);\r
-  BOpt_GetBootOptions (CallbackData);\r
-  BOpt_GetDriverOptions (CallbackData);\r
-  BOpt_FindDrivers ();\r
-  InitializeListHead (&ConsoleInpMenu.Head);\r
-  InitializeListHead (&ConsoleOutMenu.Head);\r
-  InitializeListHead (&ConsoleErrMenu.Head);\r
-  InitializeListHead (&TerminalMenu.Head);\r
-  LocateSerialIo ();\r
-  GetAllConsoles ();\r
-  mAllMenuInit = TRUE;\r
-}\r
-\r
-/**\r
-  Free up all Menu Option list.\r
-\r
-**/\r
-VOID\r
-FreeAllMenu (\r
-  VOID\r
-  )\r
-{\r
-  if (!mAllMenuInit){\r
-    return;\r
-  }\r
-  BOpt_FreeMenu (&BootOptionMenu);\r
-  BOpt_FreeMenu (&DriverOptionMenu);\r
-  BOpt_FreeMenu (&DriverMenu);\r
-  FreeAllConsoles ();\r
-  mAllMenuInit = FALSE;\r
-}\r
-\r
-/**\r
-\r
-  Install Boot Maintenance Manager Menu driver.\r
-\r
-  @param ImageHandle     The image handle.\r
-  @param SystemTable     The system table.\r
-\r
-  @retval  EFI_SUCEESS  Install Boot manager menu success.\r
-  @retval  Other        Return error status.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintenanceManagerLibConstructor (\r
-  IN EFI_HANDLE                            ImageHandle,\r
-  IN EFI_SYSTEM_TABLE                      *SystemTable\r
-  )\r
-\r
-{\r
-  EFI_STATUS               Status;\r
-  UINT8                    *Ptr;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  //\r
-  // Install Device Path Protocol and Config Access protocol to driver handle\r
-  //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &mBmmCallbackInfo->BmmDriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  &mBmmHiiVendorDevicePath,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  &mBmmCallbackInfo->BmmConfigAccess,\r
-                  NULL\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // Post our Boot Maint VFR binary to the HII database.\r
-  //\r
-  mBmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
-                                    &mBootMaintGuid,\r
-                                    mBmmCallbackInfo->BmmDriverHandle,\r
-                                    BootMaintenanceManagerBin,\r
-                                    BootMaintenanceManagerLibStrings,\r
-                                    NULL\r
-                                    );\r
-  ASSERT (mBmmCallbackInfo->BmmHiiHandle != NULL);\r
-\r
-  //\r
-  // Locate Formbrowser2 protocol\r
-  //\r
-  Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mBmmCallbackInfo->FormBrowser2);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  EfiBootManagerRefreshAllBootOption ();\r
-\r
-  //\r
-  // Create LoadOption in BmmCallbackInfo for Driver Callback\r
-  //\r
-  Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
-  ASSERT (Ptr != NULL);\r
-\r
-  //\r
-  // Initialize Bmm callback data.\r
-  //\r
-  mBmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
-  Ptr += sizeof (BM_LOAD_CONTEXT);\r
-\r
-  mBmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
-  Ptr += sizeof (BM_FILE_CONTEXT);\r
-\r
-  mBmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
-  Ptr += sizeof (BM_HANDLE_CONTEXT);\r
-\r
-  mBmmCallbackInfo->MenuEntry     = (BM_MENU_ENTRY *) Ptr;\r
-\r
-  mBmmCallbackInfo->BmmPreviousPageId  = FORM_MAIN_ID;\r
-  mBmmCallbackInfo->BmmCurrentPageId   = FORM_MAIN_ID;\r
-\r
-  InitAllMenu (mBmmCallbackInfo);\r
-\r
-  CreateUpdateData();\r
-  //\r
-  // Update boot maintenance manager page \r
-  //\r
-  InitializeBmmConfig(mBmmCallbackInfo);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Unloads the application and its installed protocol.\r
-\r
-  @param ImageHandle       Handle that identifies the image to be unloaded.\r
-  @param  SystemTable      The system table.\r
-\r
-  @retval EFI_SUCCESS      The image has been unloaded.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintenanceManagerLibDestructor (\r
-  IN EFI_HANDLE                            ImageHandle,\r
-  IN EFI_SYSTEM_TABLE                      *SystemTable\r
-  )\r
-\r
-{\r
-  if (mStartOpCodeHandle != NULL) {\r
-    HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
-  }\r
-\r
-  if (mEndOpCodeHandle != NULL) {\r
-    HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
-  }\r
-\r
-  FreeAllMenu ();\r
-\r
-  //\r
-  // Remove our IFR data from HII database\r
-  //\r
-  HiiRemovePackages (mBmmCallbackInfo->BmmHiiHandle);\r
-\r
-  gBS->UninstallMultipleProtocolInterfaces (\r
-         mBmmCallbackInfo->BmmDriverHandle,\r
-         &gEfiDevicePathProtocolGuid,\r
-         &mBmmHiiVendorDevicePath,\r
-         &gEfiHiiConfigAccessProtocolGuid,\r
-         &mBmmCallbackInfo->BmmConfigAccess,\r
-         NULL\r
-         );\r
-\r
-  FreePool (mBmmCallbackInfo->LoadContext);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManager.h b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManager.h
deleted file mode 100644 (file)
index 24526e1..0000000
+++ /dev/null
@@ -1,1388 +0,0 @@
-/** @file\r
-Header file for boot maintenance module.\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
-\r
-**/\r
-\r
-#ifndef _BOOT_MAINT_H_\r
-#define _BOOT_MAINT_H_\r
-\r
-#include "FormGuid.h"\r
-\r
-#include <Guid/TtyTerm.h>\r
-#include <Guid/MdeModuleHii.h>\r
-#include <Guid/FileSystemVolumeLabelInfo.h>\r
-#include <Guid/GlobalVariable.h>\r
-#include <Guid/HiiBootMaintenanceFormset.h>\r
-\r
-#include <Protocol/LoadFile.h>\r
-#include <Protocol/HiiConfigAccess.h>\r
-#include <Protocol/SimpleFileSystem.h>\r
-#include <Protocol/SerialIo.h>\r
-#include <Protocol/DevicePathToText.h>\r
-\r
-#include <Library/PrintLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/UefiHiiServicesLib.h>\r
-#include <Library/UefiBootManagerLib.h>\r
-#include <Library/FileExplorerLib.h>\r
-\r
-#pragma pack(1)\r
-\r
-///\r
-/// HII specific Vendor Device Path definition.\r
-///\r
-typedef struct {\r
-  VENDOR_DEVICE_PATH             VendorDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL       End;\r
-} HII_VENDOR_DEVICE_PATH;\r
-#pragma pack()\r
-\r
-//\r
-// Constants which are variable names used to access variables\r
-//\r
-\r
-#define VAR_CON_OUT_MODE L"ConOutMode"\r
-\r
-//\r
-// Variable created with this flag will be "Efi:...."\r
-//\r
-#define VAR_FLAG  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE\r
-\r
-extern EFI_GUID mBootMaintGuid;\r
-extern CHAR16   mBootMaintStorageName[];\r
-//\r
-// These are the VFR compiler generated data representing our VFR data.\r
-//\r
-extern UINT8    BootMaintenanceManagerBin[];\r
-\r
-//\r
-// Below are the number of options in Baudrate, Databits,\r
-// Parity and Stopbits selection for serial ports.\r
-//\r
-#define BM_COM_ATTR_BUADRATE  19\r
-#define BM_COM_ATTR_DATABITS  4\r
-#define BM_COM_ATTR_PARITY    5\r
-#define BM_COM_ATTR_STOPBITS  3\r
-\r
-//\r
-// Callback function helper\r
-//\r
-#define BMM_CALLBACK_DATA_SIGNATURE     SIGNATURE_32 ('C', 'b', 'c', 'k')\r
-#define BMM_CALLBACK_DATA_FROM_THIS(a)  CR (a, BMM_CALLBACK_DATA, BmmConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)\r
-\r
-//\r
-// Enumeration type definition\r
-//\r
-typedef UINT8 BBS_TYPE;\r
-\r
-typedef enum _TYPE_OF_TERMINAL {\r
-  TerminalTypePcAnsi                = 0,\r
-  TerminalTypeVt100,\r
-  TerminalTypeVt100Plus,\r
-  TerminalTypeVtUtf8,\r
-  TerminalTypeTtyTerm\r
-} TYPE_OF_TERMINAL;\r
-\r
-//\r
-// All of the signatures that will be used in list structure\r
-//\r
-#define BM_MENU_OPTION_SIGNATURE      SIGNATURE_32 ('m', 'e', 'n', 'u')\r
-#define BM_LOAD_OPTION_SIGNATURE      SIGNATURE_32 ('l', 'o', 'a', 'd')\r
-#define BM_CONSOLE_OPTION_SIGNATURE   SIGNATURE_32 ('c', 'n', 's', 'l')\r
-#define BM_FILE_OPTION_SIGNATURE      SIGNATURE_32 ('f', 'i', 'l', 'e')\r
-#define BM_HANDLE_OPTION_SIGNATURE    SIGNATURE_32 ('h', 'n', 'd', 'l')\r
-#define BM_TERMINAL_OPTION_SIGNATURE  SIGNATURE_32 ('t', 'r', 'm', 'l')\r
-#define BM_MENU_ENTRY_SIGNATURE       SIGNATURE_32 ('e', 'n', 't', 'r')\r
-\r
-#define BM_LOAD_CONTEXT_SELECT        0x0\r
-#define BM_CONSOLE_CONTEXT_SELECT     0x1\r
-#define BM_FILE_CONTEXT_SELECT        0x2\r
-#define BM_HANDLE_CONTEXT_SELECT      0x3\r
-#define BM_TERMINAL_CONTEXT_SELECT    0x5\r
-\r
-#define BM_CONSOLE_IN_CONTEXT_SELECT  0x6\r
-#define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7\r
-#define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8\r
-\r
-//\r
-// Buffer size for update data\r
-//\r
-#define UPDATE_DATA_SIZE        0x100000\r
-\r
-//\r
-// Namespace of callback keys used in display and file system navigation\r
-//\r
-#define MAX_BBS_OFFSET          0xE000\r
-#define NET_OPTION_OFFSET       0xD800\r
-#define BEV_OPTION_OFFSET       0xD000\r
-#define FD_OPTION_OFFSET        0xC000\r
-#define HD_OPTION_OFFSET        0xB000\r
-#define CD_OPTION_OFFSET        0xA000\r
-#define FILE_OPTION_OFFSET      0x8000\r
-#define FILE_OPTION_MASK        0x7FFF\r
-#define HANDLE_OPTION_OFFSET    0x7000\r
-#define CONSOLE_OPTION_OFFSET   0x6000\r
-#define TERMINAL_OPTION_OFFSET  0x5000\r
-#define CONFIG_OPTION_OFFSET    0x1200\r
-#define KEY_VALUE_OFFSET        0x1100\r
-#define FORM_ID_OFFSET          0x1000\r
-\r
-//\r
-// VarOffset that will be used to create question\r
-// all these values are computed from the structure\r
-// defined below\r
-//\r
-#define VAR_OFFSET(Field)              ((UINT16) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field)))\r
-\r
-//\r
-// Question Id of Zero is invalid, so add an offset to it\r
-//\r
-#define QUESTION_ID(Field)             (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)\r
-\r
-#define BOOT_TIME_OUT_VAR_OFFSET        VAR_OFFSET (BootTimeOut)\r
-#define BOOT_NEXT_VAR_OFFSET            VAR_OFFSET (BootNext)\r
-#define COM1_BAUD_RATE_VAR_OFFSET       VAR_OFFSET (COM1BaudRate)\r
-#define COM1_DATA_RATE_VAR_OFFSET       VAR_OFFSET (COM1DataRate)\r
-#define COM1_STOP_BITS_VAR_OFFSET       VAR_OFFSET (COM1StopBits)\r
-#define COM1_PARITY_VAR_OFFSET          VAR_OFFSET (COM1Parity)\r
-#define COM1_TERMINAL_VAR_OFFSET        VAR_OFFSET (COM2TerminalType)\r
-#define COM2_BAUD_RATE_VAR_OFFSET       VAR_OFFSET (COM2BaudRate)\r
-#define COM2_DATA_RATE_VAR_OFFSET       VAR_OFFSET (COM2DataRate)\r
-#define COM2_STOP_BITS_VAR_OFFSET       VAR_OFFSET (COM2StopBits)\r
-#define COM2_PARITY_VAR_OFFSET          VAR_OFFSET (COM2Parity)\r
-#define COM2_TERMINAL_VAR_OFFSET        VAR_OFFSET (COM2TerminalType)\r
-#define DRV_ADD_HANDLE_DESC_VAR_OFFSET  VAR_OFFSET (DriverAddHandleDesc)\r
-#define DRV_ADD_ACTIVE_VAR_OFFSET       VAR_OFFSET (DriverAddActive)\r
-#define DRV_ADD_RECON_VAR_OFFSET        VAR_OFFSET (DriverAddForceReconnect)\r
-#define CON_IN_COM1_VAR_OFFSET          VAR_OFFSET (ConsoleInputCOM1)\r
-#define CON_IN_COM2_VAR_OFFSET          VAR_OFFSET (ConsoleInputCOM2)\r
-#define CON_OUT_COM1_VAR_OFFSET         VAR_OFFSET (ConsoleOutputCOM1)\r
-#define CON_OUT_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleOutputCOM2)\r
-#define CON_ERR_COM1_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM1)\r
-#define CON_ERR_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM2)\r
-#define CON_MODE_VAR_OFFSET             VAR_OFFSET (ConsoleOutMode)\r
-#define CON_DEVICE_VAR_OFFSET           VAR_OFFSET (ConsoleCheck)\r
-#define CON_IN_DEVICE_VAR_OFFSET        VAR_OFFSET (ConsoleInCheck)\r
-#define CON_OUT_DEVICE_VAR_OFFSET       VAR_OFFSET (ConsoleOutCheck)\r
-#define CON_ERR_DEVICE_VAR_OFFSET       VAR_OFFSET (ConsoleErrCheck)\r
-#define BOOT_OPTION_ORDER_VAR_OFFSET    VAR_OFFSET (BootOptionOrder)\r
-#define DRIVER_OPTION_ORDER_VAR_OFFSET  VAR_OFFSET (DriverOptionOrder)\r
-#define BOOT_OPTION_DEL_VAR_OFFSET      VAR_OFFSET (BootOptionDel)\r
-#define DRIVER_OPTION_DEL_VAR_OFFSET    VAR_OFFSET (DriverOptionDel)\r
-#define DRIVER_ADD_OPTION_VAR_OFFSET    VAR_OFFSET (DriverAddHandleOptionalData)\r
-#define COM_BAUD_RATE_VAR_OFFSET        VAR_OFFSET (COMBaudRate)\r
-#define COM_DATA_RATE_VAR_OFFSET        VAR_OFFSET (COMDataRate)\r
-#define COM_STOP_BITS_VAR_OFFSET        VAR_OFFSET (COMStopBits)\r
-#define COM_PARITY_VAR_OFFSET           VAR_OFFSET (COMParity)\r
-#define COM_TERMINAL_VAR_OFFSET         VAR_OFFSET (COMTerminalType)\r
-#define COM_FLOWCONTROL_VAR_OFFSET      VAR_OFFSET (COMFlowControl)\r
-\r
-#define BOOT_TIME_OUT_QUESTION_ID       QUESTION_ID (BootTimeOut)\r
-#define BOOT_NEXT_QUESTION_ID           QUESTION_ID (BootNext)\r
-#define COM1_BAUD_RATE_QUESTION_ID      QUESTION_ID (COM1BaudRate)\r
-#define COM1_DATA_RATE_QUESTION_ID      QUESTION_ID (COM1DataRate)\r
-#define COM1_STOP_BITS_QUESTION_ID      QUESTION_ID (COM1StopBits)\r
-#define COM1_PARITY_QUESTION_ID         QUESTION_ID (COM1Parity)\r
-#define COM1_TERMINAL_QUESTION_ID       QUESTION_ID (COM2TerminalType)\r
-#define COM2_BAUD_RATE_QUESTION_ID      QUESTION_ID (COM2BaudRate)\r
-#define COM2_DATA_RATE_QUESTION_ID      QUESTION_ID (COM2DataRate)\r
-#define COM2_STOP_BITS_QUESTION_ID      QUESTION_ID (COM2StopBits)\r
-#define COM2_PARITY_QUESTION_ID         QUESTION_ID (COM2Parity)\r
-#define COM2_TERMINAL_QUESTION_ID       QUESTION_ID (COM2TerminalType)\r
-#define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)\r
-#define DRV_ADD_ACTIVE_QUESTION_ID      QUESTION_ID (DriverAddActive)\r
-#define DRV_ADD_RECON_QUESTION_ID       QUESTION_ID (DriverAddForceReconnect)\r
-#define CON_IN_COM1_QUESTION_ID         QUESTION_ID (ConsoleInputCOM1)\r
-#define CON_IN_COM2_QUESTION_ID         QUESTION_ID (ConsoleInputCOM2)\r
-#define CON_OUT_COM1_QUESTION_ID        QUESTION_ID (ConsoleOutputCOM1)\r
-#define CON_OUT_COM2_QUESTION_ID        QUESTION_ID (ConsoleOutputCOM2)\r
-#define CON_ERR_COM1_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM1)\r
-#define CON_ERR_COM2_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM2)\r
-#define CON_MODE_QUESTION_ID            QUESTION_ID (ConsoleOutMode)\r
-#define CON_DEVICE_QUESTION_ID          QUESTION_ID (ConsoleCheck)\r
-#define CON_IN_DEVICE_QUESTION_ID       QUESTION_ID (ConsoleInCheck)\r
-#define CON_OUT_DEVICE_QUESTION_ID      QUESTION_ID (ConsoleOutCheck)\r
-#define CON_ERR_DEVICE_QUESTION_ID      QUESTION_ID (ConsoleErrCheck)\r
-#define BOOT_OPTION_ORDER_QUESTION_ID   QUESTION_ID (BootOptionOrder)\r
-#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
-#define BOOT_OPTION_DEL_QUESTION_ID     QUESTION_ID (BootOptionDel)\r
-#define DRIVER_OPTION_DEL_QUESTION_ID   QUESTION_ID (DriverOptionDel)\r
-#define DRIVER_ADD_OPTION_QUESTION_ID   QUESTION_ID (DriverAddHandleOptionalData)\r
-#define COM_BAUD_RATE_QUESTION_ID       QUESTION_ID (COMBaudRate)\r
-#define COM_DATA_RATE_QUESTION_ID       QUESTION_ID (COMDataRate)\r
-#define COM_STOP_BITS_QUESTION_ID       QUESTION_ID (COMStopBits)\r
-#define COM_PARITY_QUESTION_ID          QUESTION_ID (COMParity)\r
-#define COM_TERMINAL_QUESTION_ID        QUESTION_ID (COMTerminalType)\r
-#define COM_FLOWCONTROL_QUESTION_ID     QUESTION_ID (COMFlowControl)\r
-\r
-#define STRING_DEPOSITORY_NUMBER        8\r
-\r
-#define NONE_BOOTNEXT_VALUE             (0xFFFF + 1)\r
-\r
-///\r
-/// Serial Ports attributes, first one is the value for\r
-/// return from callback function, stringtoken is used to\r
-/// display the value properly\r
-///\r
-typedef struct {\r
-  UINTN   Value;\r
-  UINT16  StringToken;\r
-} COM_ATTR;\r
-\r
-typedef struct {\r
-  UINT64                    BaudRate;\r
-  UINT8                     DataBits;\r
-  UINT8                     Parity;\r
-  UINT8                     StopBits;\r
-\r
-  UINT8                     BaudRateIndex;\r
-  UINT8                     DataBitsIndex;\r
-  UINT8                     ParityIndex;\r
-  UINT8                     StopBitsIndex;\r
-\r
-  UINT8                     FlowControl;\r
-\r
-  UINT8                     IsConIn;\r
-  UINT8                     IsConOut;\r
-  UINT8                     IsStdErr;\r
-  UINT8                     TerminalType;\r
-\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-} BM_TERMINAL_CONTEXT;\r
-\r
-typedef struct {\r
-  BOOLEAN                   IsBootNext;\r
-  BOOLEAN                   LoadOptionModified;\r
-  BOOLEAN                   Deleted;\r
-\r
-  BOOLEAN                   IsLegacy;\r
-  BOOLEAN                   IsActive;\r
-  BOOLEAN                   ForceReconnect;\r
-  UINTN                     OptionalDataSize;\r
-\r
-  UINTN                     LoadOptionSize;\r
-  UINT8                     *LoadOption;\r
-\r
-  UINT32                    Attributes;\r
-  UINT16                    FilePathListLength;\r
-  UINT16                    *Description;\r
-  EFI_DEVICE_PATH_PROTOCOL  *FilePathList;\r
-  UINT8                     *OptionalData;\r
-\r
-  UINT16                    BbsIndex;\r
-} BM_LOAD_CONTEXT;\r
-\r
-typedef struct {\r
-\r
-  BOOLEAN                   IsActive;\r
-\r
-  BOOLEAN                   IsTerminal;\r
-\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-} BM_CONSOLE_CONTEXT;\r
-\r
-typedef struct {\r
-  UINTN   Column;\r
-  UINTN   Row;\r
-} CONSOLE_OUT_MODE;\r
-\r
-typedef struct {\r
-  EFI_HANDLE                        Handle;\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;\r
-  EFI_FILE_HANDLE                   FHandle;\r
-  UINT16                            *FileName;\r
-  EFI_FILE_SYSTEM_VOLUME_LABEL      *Info;\r
-\r
-  BOOLEAN                           IsRoot;\r
-  BOOLEAN                           IsDir;\r
-  BOOLEAN                           IsRemovableMedia;\r
-  BOOLEAN                           IsLoadFile;\r
-  BOOLEAN                           IsBootLegacy;\r
-} BM_FILE_CONTEXT;\r
-\r
-typedef struct {\r
-  EFI_HANDLE                Handle;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-} BM_HANDLE_CONTEXT;\r
-\r
-typedef struct {\r
-  UINTN           Signature;\r
-  LIST_ENTRY      Head;\r
-  UINTN           MenuNumber;\r
-} BM_MENU_OPTION;\r
-\r
-typedef struct {\r
-  UINTN           Signature;\r
-  LIST_ENTRY      Link;\r
-  UINTN           OptionNumber;\r
-  UINT16          *DisplayString;\r
-  UINT16          *HelpString;\r
-  EFI_STRING_ID   DisplayStringToken;\r
-  EFI_STRING_ID   HelpStringToken;\r
-  UINTN           ContextSelection;\r
-  VOID            *VariableContext;\r
-} BM_MENU_ENTRY;\r
-\r
-typedef struct {\r
-  \r
-  UINTN                          Signature;\r
-\r
-  EFI_HII_HANDLE                 BmmHiiHandle;\r
-  EFI_HANDLE                     BmmDriverHandle;\r
-  ///\r
-  /// Boot Maintenance  Manager Produced protocols\r
-  ///\r
-  EFI_HII_CONFIG_ACCESS_PROTOCOL BmmConfigAccess;\r
-  EFI_FORM_BROWSER2_PROTOCOL     *FormBrowser2;\r
-\r
-  BM_MENU_ENTRY                  *MenuEntry;\r
-  BM_HANDLE_CONTEXT              *HandleContext;\r
-  BM_FILE_CONTEXT                *FileContext;\r
-  BM_LOAD_CONTEXT                *LoadContext;\r
-  BM_TERMINAL_CONTEXT            *TerminalContext;\r
-  UINTN                          CurrentTerminal;\r
-  BBS_TYPE                       BbsType;\r
-\r
-  //\r
-  // BMM main formset callback data.\r
-  //\r
-  \r
-  EFI_FORM_ID                    BmmCurrentPageId;\r
-  EFI_FORM_ID                    BmmPreviousPageId;\r
-  BOOLEAN                        BmmAskSaveOrNot;\r
-  BMM_FAKE_NV_DATA               BmmFakeNvData;\r
-  BMM_FAKE_NV_DATA               BmmOldFakeNVData;\r
-\r
-} BMM_CALLBACK_DATA;\r
-\r
-/**\r
-\r
-  Find drivers that will be added as Driver#### variables from handles\r
-  in current system environment\r
-  All valid handles in the system except those consume SimpleFs, LoadFile\r
-  are stored in DriverMenu for future use.\r
-\r
-  @retval EFI_SUCCESS The function complets successfully.\r
-  @return Other value if failed to build the DriverMenu.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_FindDrivers (\r
-  VOID\r
-  );\r
-\r
-/**\r
-\r
-  Build the BootOptionMenu according to BootOrder Variable.\r
-  This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
-\r
-  @param CallbackData The BMM context data.\r
-\r
-  @return The number of the Var Boot####.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetBootOptions (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData\r
-  );\r
-\r
-/**\r
-\r
-  Build up all DriverOptionMenu\r
-\r
-  @param CallbackData The BMM context data.\r
-\r
-  @return EFI_SUCESS The functin completes successfully.\r
-  @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
-  \r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetDriverOptions (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData\r
-  );\r
-\r
-/**\r
-  Free resources allocated in Allocate Rountine.\r
-\r
-  @param FreeMenu        Menu to be freed\r
-\r
-**/\r
-VOID\r
-BOpt_FreeMenu (\r
-  BM_MENU_OPTION        *FreeMenu\r
-  );\r
-\r
-/**\r
-\r
-  Get the Option Number that has not been allocated for use.\r
-\r
-  @param Type  The type of Option.\r
-\r
-  @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetOptionNumber (\r
-  CHAR16        *Type\r
-  );\r
-\r
-/**\r
-\r
-  Get the Option Number for Boot#### that does not used.\r
-\r
-  @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetBootOptionNumber (\r
-  VOID\r
-  );\r
-\r
-/**\r
-\r
-Get the Option Number for Driver#### that does not used.\r
-\r
-@return The unused Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetDriverOptionNumber (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Create a menu entry give a Menu type.\r
-\r
-  @param MenuType        The Menu type to be created.\r
-\r
-\r
-  @retval NULL           If failed to create the menu.\r
-  @return                The menu.\r
-\r
-**/\r
-BM_MENU_ENTRY                     *\r
-BOpt_CreateMenuEntry (\r
-  UINTN           MenuType\r
-  );\r
-\r
-/**\r
-  Free up all resource allocated for a BM_MENU_ENTRY.\r
-\r
-  @param MenuEntry   A pointer to BM_MENU_ENTRY.\r
-\r
-**/\r
-VOID\r
-BOpt_DestroyMenuEntry (\r
-  BM_MENU_ENTRY         *MenuEntry\r
-  );\r
-\r
-/**\r
-  Get the Menu Entry from the list in Menu Entry List.\r
-\r
-  If MenuNumber is great or equal to the number of Menu\r
-  Entry in the list, then ASSERT.\r
-\r
-  @param MenuOption      The Menu Entry List to read the menu entry.\r
-  @param MenuNumber      The index of Menu Entry.\r
-\r
-  @return The Menu Entry.\r
-\r
-**/\r
-BM_MENU_ENTRY                     *\r
-BOpt_GetMenuEntry (\r
-  BM_MENU_OPTION      *MenuOption,\r
-  UINTN               MenuNumber\r
-  );\r
-\r
-/**\r
-  Get option number according to Boot#### and BootOrder variable. \r
-  The value is saved as #### + 1.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID  \r
-GetBootOrder (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-/**\r
-  Get driver option order from globalc DriverOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  \r
-**/\r
-VOID  \r
-GetDriverOrder (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-//\r
-// Locate all serial io devices for console\r
-//\r
-/**\r
-  Build a list containing all serial devices.\r
-\r
-  @retval EFI_SUCCESS The function complete successfully.\r
-  @retval EFI_UNSUPPORTED No serial ports present.\r
-\r
-**/\r
-EFI_STATUS\r
-LocateSerialIo (\r
-  VOID\r
-  );\r
-\r
-//\r
-// Initializing Console menu\r
-//\r
-/**\r
-  Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
-  @retval EFI_SUCCESS    The function always complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-GetAllConsoles(\r
-  VOID\r
-  );\r
-\r
-//\r
-// Get current mode information\r
-//\r
-/**\r
-  Get mode number according to column and row\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-GetConsoleOutMode (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-//\r
-// Cleaning up console menu\r
-//\r
-/**\r
-  Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
-  @retval EFI_SUCCESS    The function always complete successfully.\r
-**/\r
-EFI_STATUS\r
-FreeAllConsoles (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Update the device path that describing a terminal device\r
-  based on the new BaudRate, Data Bits, parity and Stop Bits\r
-  set.\r
-\r
-  @param DevicePath     The devicepath protocol instance wanted to be updated.\r
-\r
-**/\r
-VOID\r
-ChangeVariableDevicePath (\r
-  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
-  );\r
-\r
-/**\r
-  Update the multi-instance device path of Terminal Device based on\r
-  the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
-  device path in the Terminal Device in TerminalMenu is also updated.\r
-\r
-  @param DevicePath      The multi-instance device path.\r
-  @param ChangeTerminal  TRUE, then device path in the Terminal Device \r
-                         in TerminalMenu is also updated; FALSE, no update.\r
-\r
-  @return EFI_SUCCESS    The function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-ChangeTerminalDevicePath (\r
-  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
-  IN BOOLEAN                   ChangeTerminal\r
-  );\r
-\r
-//\r
-// Variable operation by menu selection\r
-//\r
-/**\r
-  This function create a currently loaded Boot Option from \r
-  the BMM. It then appends this Boot Option to the end of \r
-  the "BootOrder" list. It also append this Boot Opotion to the end\r
-  of BootOptionMenu.\r
-\r
-  @param CallbackData           The BMM context data.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES  If not enought memory to complete the operation.\r
-  @retval EFI_SUCCESS           If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
-  IN  BMM_CALLBACK_DATA                   *CallbackData\r
-  );\r
-\r
-/**\r
-  Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
-  After deleting this boot option, call Var_ChangeBootOrder to\r
-  make sure BootOrder is in valid state.\r
-\r
-  @retval EFI_SUCCESS   If all boot load option EFI Variables corresponding to  \r
-                        BM_LOAD_CONTEXT marked for deletion is deleted\r
-  @return Others        If failed to update the "BootOrder" variable after deletion. \r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelBootOption (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  After any operation on Boot####, there will be a discrepancy in BootOrder.\r
-  Since some are missing but in BootOrder, while some are present but are\r
-  not reflected by BootOrder. Then a function rebuild BootOrder from\r
-  scratch by content from BootOptionMenu is needed.\r
-\r
-  @retval  EFI_SUCCESS  The boot order is updated successfully.\r
-  @return  other than EFI_SUCCESS if failed to change the "BootOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function create a currently loaded Drive Option from \r
-  the BMM. It then appends this Driver Option to the end of \r
-  the "DriverOrder" list. It append this Driver Opotion to the end\r
-  of DriverOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  @param HiiHandle       The HII handle associated with the BMM formset.\r
-  @param DescriptionData The description of this driver option.\r
-  @param OptionalData    The optional load option.\r
-  @param ForceReconnect  If to force reconnect.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
-  @retval EFI_SUCCESS          If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData,\r
-  IN  EFI_HII_HANDLE            HiiHandle,\r
-  IN  UINT16                    *DescriptionData,\r
-  IN  UINT16                    *OptionalData,\r
-  IN  UINT8                     ForceReconnect\r
-  );\r
-\r
-/**\r
-  Delete Load Option that represent a Deleted state in BootOptionMenu.\r
-  After deleting this Driver option, call Var_ChangeDriverOrder to\r
-  make sure DriverOrder is in valid state.\r
-\r
-  @retval EFI_SUCCESS Load Option is successfully updated.\r
-  @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
-          Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  After any operation on Driver####, there will be a discrepancy in\r
-  DriverOrder. Since some are missing but in DriverOrder, while some\r
-  are present but are not reflected by DriverOrder. Then a function\r
-  rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
-  needed.\r
-\r
-  @retval  EFI_SUCCESS  The driver order is updated successfully.\r
-  @return  other than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function delete and build multi-instance device path ConIn\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function delete and build multi-instance device path ConOut console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function delete and build multi-instance device path ErrOut console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function delete and build Out of Band console device.\r
-  \r
-  @param   MenuIndex   Menu index which user select in the terminal menu list.\r
-  \r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.  \r
-**/\r
-EFI_STATUS\r
-Var_UpdateOutOfBandOption (\r
-  IN  UINT16           MenuIndex\r
-  );\r
-\r
-/**\r
-  Update the device path of "ConOut", "ConIn" and "ErrOut" based on the new BaudRate, Data Bits, \r
-  parity and stop Bits set.\r
-\r
-**/\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function update the "BootNext" EFI Variable. If there is no "BootNex" specified in BMM, \r
-  this EFI Variable is deleted.\r
-  It also update the BMM context data specified the "BootNext" value.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  );\r
-\r
-/**\r
-  This function update the "BootOrder" EFI Variable based on BMM Formset's NV map. It then refresh \r
-  BootOptionMenu with the new "BootOrder" list.\r
-\r
-  @param CallbackData           The BMM context data.\r
-\r
-  @retval EFI_SUCCESS           The function complete successfully.\r
-  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
-  @return not The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  );\r
-\r
-/**\r
-  This function update the "DriverOrder" EFI Variable based on\r
-  BMM Formset's NV map. It then refresh DriverOptionMenu\r
-  with the new "DriverOrder" list.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS           The function complete successfully.\r
-  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  );\r
-\r
-/**\r
-  Update the Text Mode of Console.\r
-\r
-  @param CallbackData  The context data for BMM.\r
-\r
-  @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
-  @return Other value if the Text Mode of Console is not updated.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConMode (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  );\r
-\r
-//\r
-// Following are page create and refresh functions\r
-//\r
-/**\r
- Create the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-CreateUpdateData (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Refresh the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-RefreshUpdateData (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Clean up the dynamic opcode at label and form specified by\r
-  both LabelId. \r
-\r
-  @param LabelId         It is both the Form ID and Label ID for\r
-                         opcode deletion.\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-CleanUpPage (\r
-  IN UINT16                           LabelId,\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create a lit of boot option from global BootOptionMenu. It\r
-  allow user to delete the boot option.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootDelPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create a lit of driver option from global DriverMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateDrvAddHandlePage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create a lit of driver option from global DriverOptionMenu. It\r
-  allow user to delete the driver option.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateDrvDelPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Prepare the page to allow user to add description for a Driver Option.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Dispatch the correct update page function to call based on the UpdatePageId.\r
-\r
-  @param UpdatePageId    The form ID.\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdatePageBody (\r
-  IN UINT16                           UpdatePageId,\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create the dynamic page to allow user to set the "BootNext" vaule.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateBootNextPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create the dynamic page to allow user to set the "TimeOut" vaule.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateTimeOutPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
-  Parity, Stop Bits, Terminal Type.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateTerminalPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Refresh the text mode page\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateConModePage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
-  Create a list of Goto Opcode for all terminal devices logged\r
-  by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateConCOMPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  );\r
-\r
-/**\r
- Update add boot/driver option page.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  @param FormId             The form ID to be updated.\r
-  @param DevicePath       Device path.\r
-\r
-**/\r
-VOID\r
-UpdateOptionPage(\r
-  IN   BMM_CALLBACK_DATA        *CallbackData,\r
-  IN   EFI_FORM_ID              FormId,\r
-  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
-  );\r
-\r
-/**\r
-  Function deletes the variable specified by VarName and VarGuid.\r
-\r
-\r
-  @param VarName            A Null-terminated Unicode string that is\r
-                            the name of the vendor's variable.\r
-                         \r
-  @param VarGuid            A unique identifier for the vendor.\r
-\r
-  @retval  EFI_SUCCESS           The variable was found and removed\r
-  @retval  EFI_UNSUPPORTED       The variable store was inaccessible\r
-  @retval  EFI_OUT_OF_RESOURCES  The temporary buffer was not available\r
-  @retval  EFI_NOT_FOUND         The variable was not found\r
-\r
-**/\r
-EFI_STATUS\r
-EfiLibDeleteVariable (\r
-  IN CHAR16   *VarName,\r
-  IN EFI_GUID *VarGuid\r
-  );\r
-\r
-/**\r
-  Function is used to determine the number of device path instances\r
-  that exist in a device path.\r
-\r
-\r
-  @param DevicePath      A pointer to a device path data structure.\r
-\r
-  @return This function counts and returns the number of device path instances\r
-          in DevicePath.\r
-\r
-**/\r
-UINTN\r
-EfiDevicePathInstanceCount (\r
-  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
-  );\r
-\r
-/**\r
-  Get a string from the Data Hub record based on \r
-  a device path.\r
-\r
-  @param DevPath         The device Path.\r
-\r
-  @return A string located from the Data Hub records based on\r
-          the device path.\r
-  @retval NULL  If failed to get the String from Data Hub.\r
-\r
-**/\r
-UINT16 *\r
-EfiLibStrFromDatahub (\r
-  IN EFI_DEVICE_PATH_PROTOCOL                 *DevPath\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
-/**\r
-  Discard all changes done to the BMM pages such as Boot Order change,\r
-  Driver order change.\r
-\r
-  @param Private         The BMM context data.\r
-  @param CurrentFakeNVMap The current Fack NV Map.\r
-\r
-**/\r
-VOID\r
-DiscardChangeHandler (\r
-  IN  BMM_CALLBACK_DATA               *Private,\r
-  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap\r
-  );\r
-\r
-/**\r
-  Dispatch the display to the next page based on NewPageId.\r
-\r
-  @param Private         The BMM context data.\r
-  @param NewPageId       The original page ID.\r
-\r
-**/\r
-VOID\r
-UpdatePageId (\r
-  BMM_CALLBACK_DATA              *Private,\r
-  UINT16                         NewPageId\r
-  );\r
-\r
-/**\r
-  Remove the installed BootMaint and FileExplorer HiiPackages.\r
-\r
-**/\r
-VOID\r
-FreeBMPackage(\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Install BootMaint and FileExplorer HiiPackages.\r
-\r
-**/\r
-VOID\r
-InitBootMaintenance(\r
-  VOID\r
-  );\r
-\r
-/**\r
-\r
-  Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
-  in BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/  \r
-VOID  \r
-GetConsoleInCheck (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-/**\r
-\r
-  Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
-  in BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-GetConsoleOutCheck (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-/**\r
-\r
-  Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
-  in BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/        \r
-VOID\r
-GetConsoleErrCheck (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-/**\r
-\r
-  Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
-  to BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-GetTerminalAttribute (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  );\r
-\r
-/**\r
-  This function will change video resolution and text mode\r
-  according to defined setup mode or defined boot mode  \r
-\r
-  @param  IsSetupMode   Indicate mode is changed to setup mode or boot mode. \r
-\r
-  @retval  EFI_SUCCESS  Mode is changed successfully.\r
-  @retval  Others             Mode failed to be changed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BmmBdsSetConsoleMode (\r
-  BOOLEAN  IsSetupMode\r
-  );\r
-\r
-\r
-/**\r
-  This function converts an input device structure to a Unicode string.\r
-\r
-  @param DevPath       A pointer to the device path structure.\r
-\r
-  @return              A new allocated Unicode string that represents the device path.\r
-\r
-**/\r
-CHAR16 *\r
-UiDevicePathToStr (\r
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
-  );\r
-\r
-/**\r
-  Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
-  The caller is responsible for freeing the allocated buffer using FreePool().\r
-\r
-  @param DevicePath      Device path.\r
-\r
-  @return                A new allocated string that represents the file name.\r
-\r
-**/\r
-CHAR16 *\r
-ExtractFileNameFromDevicePath (\r
-  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
-  );\r
-\r
-/**\r
-  This function allows a caller to extract the current configuration for one\r
-  or more named elements from the target driver.\r
-\r
-  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param Request         A null-terminated Unicode string in <ConfigRequest> format.\r
-  @param Progress        On return, points to a character in the Request string.\r
-                         Points to the string's null terminator if request was successful.\r
-                         Points to the most recent '&' before the first failing name/value\r
-                         pair (or the beginning of the string if the failure is in the\r
-                         first name/value pair) if the request was not successful.\r
-  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which\r
-                         has all values filled in for the names in the Request string.\r
-                         String to be allocated by the called function.\r
-\r
-  @retval  EFI_SUCCESS            The Results is filled with the requested values.\r
-  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
-  @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
-  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintExtractConfig (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
-  IN  CONST EFI_STRING                       Request,\r
-  OUT EFI_STRING                             *Progress,\r
-  OUT EFI_STRING                             *Results\r
-  );\r
-\r
-/**\r
-  This function applies changes in a driver's configuration.\r
-  Input is a Configuration, which has the routing data for this\r
-  driver followed by name / value configuration pairs. The driver\r
-  must apply those pairs to its configurable storage. If the\r
-  driver's configuration is stored in a linear block of data\r
-  and the driver's name / value pairs are in <BlockConfig>\r
-  format, it may use the ConfigToBlock helper function (above) to\r
-  simplify the job. Currently not implemented.\r
-\r
-  @param[in]  This                Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param[in]  Configuration       A null-terminated Unicode string in\r
-                                  <ConfigString> format.   \r
-  @param[out] Progress            A pointer to a string filled in with the\r
-                                  offset of the most recent '&' before the\r
-                                  first failing name / value pair (or the\r
-                                  beginn ing of the string if the failure\r
-                                  is in the first name / value pair) or\r
-                                  the terminating NULL if all was\r
-                                  successful.\r
-\r
-  @retval EFI_SUCCESS             The results have been distributed or are\r
-                                  awaiting distribution.  \r
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the\r
-                                  parts of the results that must be\r
-                                  stored awaiting possible future\r
-                                  protocols.\r
-  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
-                                  Results parameter would result\r
-                                  in this type of error.\r
-  @retval EFI_NOT_FOUND           Target for the specified routing data\r
-                                  was not found.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintRouteConfig (\r
-  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
-  IN CONST EFI_STRING                     Configuration,\r
-  OUT EFI_STRING                          *Progress\r
-  );\r
-\r
-/**\r
-  This function processes the results of changes in configuration.\r
-\r
-\r
-  @param This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param Action             Specifies the type of action taken by the browser.\r
-  @param QuestionId         A unique value which is sent to the original exporting driver\r
-                            so that it can identify the type of data to expect.\r
-  @param Type               The type of value for the question.\r
-  @param Value              A pointer to the data being sent to the original exporting driver.\r
-  @param ActionRequest      On return, points to the action requested by the callback function.\r
-\r
-  @retval EFI_SUCCESS           The callback successfully handled the action.\r
-  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.\r
-  @retval EFI_DEVICE_ERROR      The variable could not be saved.\r
-  @retval EFI_UNSUPPORTED       The specified Action is not supported by the callback.\r
-  @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintCallback (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL         *This,\r
-  IN        EFI_BROWSER_ACTION                     Action,\r
-  IN        EFI_QUESTION_ID                        QuestionId,\r
-  IN        UINT8                                  Type,\r
-  IN        EFI_IFR_TYPE_VALUE                     *Value,\r
-  OUT       EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
-  );\r
-\r
-/**\r
-  Create boot option base on the input file path info.\r
-\r
-  @param FilePath    Point to the file path.\r
-\r
-  @retval TRUE   Exit caller function.\r
-  @retval FALSE  Not exit caller function.\r
-\r
-**/\r
-BOOLEAN \r
-CreateBootOptionFromFile (\r
-  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
-  );\r
-\r
-/**\r
-  Create driver option base on the input file path info.\r
-\r
-  @param FilePath    Point to the file path.\r
-\r
-  @retval TRUE   Exit caller function.\r
-  @retval FALSE  Not exit caller function.\r
-**/\r
-BOOLEAN \r
-CreateDriverOptionFromFile (\r
-  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
-  );\r
-\r
-/**\r
-  Boot the file specified by the input file path info.\r
-\r
-  @param FilePath    Point to the file path.\r
-\r
-  @retval TRUE   Exit caller function.\r
-  @retval FALSE  Not exit caller function.\r
-  \r
-**/\r
-BOOLEAN \r
-BootFromFile (\r
-  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
-  );\r
-\r
-//\r
-// Global variable in this program (defined in data.c)\r
-//\r
-extern BM_MENU_OPTION             BootOptionMenu;\r
-extern BM_MENU_OPTION             DriverOptionMenu;\r
-extern BM_MENU_OPTION             ConsoleInpMenu;\r
-extern BM_MENU_OPTION             ConsoleOutMenu;\r
-extern BM_MENU_OPTION             ConsoleErrMenu;\r
-extern BM_MENU_OPTION             DriverMenu;\r
-extern BM_MENU_OPTION             TerminalMenu;\r
-extern UINT16                     TerminalType[5];\r
-extern COM_ATTR                   BaudRateList[19];\r
-extern COM_ATTR                   DataBitsList[4];\r
-extern COM_ATTR                   ParityList[5];\r
-extern COM_ATTR                   StopBitsList[3];\r
-extern EFI_GUID                   TerminalTypeGuid[5];\r
-extern EFI_DEVICE_PATH_PROTOCOL   EndDevicePath[];\r
-extern UINT16                     mFlowControlType[2];\r
-extern UINT32                     mFlowControlValue[2];\r
-\r
-//\r
-// Shared IFR form update data\r
-//\r
-extern VOID                        *mStartOpCodeHandle;\r
-extern VOID                        *mEndOpCodeHandle;\r
-extern EFI_IFR_GUID_LABEL          *mStartLabel;\r
-extern EFI_IFR_GUID_LABEL          *mEndLabel;\r
-extern BMM_CALLBACK_DATA           gBootMaintenancePrivate;\r
-extern BMM_CALLBACK_DATA           *mBmmCallbackInfo;\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManager.vfr b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManager.vfr
deleted file mode 100644 (file)
index afce340..0000000
+++ /dev/null
@@ -1,440 +0,0 @@
-///** @file\r
-//  Boot Maintenance Utility Formset\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
-//  \r
-//**/\r
-\r
-#include "FormGuid.h"\r
-\r
-formset\r
-  guid = BOOT_MAINT_FORMSET_GUID,\r
-  title = STRING_TOKEN(STR_FORM_MAIN_TITLE),\r
-  help = STRING_TOKEN(STR_BOOT_MAINT_MANAGER_HELP),\r
-  classguid = gEfiIfrFrontPageGuid,\r
-\r
-  varstore BMM_FAKE_NV_DATA,\r
-    varid = VARSTORE_ID_BOOT_MAINT,\r
-    name = BmmData,\r
-    guid = BOOT_MAINT_FORMSET_GUID;\r
-\r
-  form formid = FORM_MAIN_ID,\r
-       title = STRING_TOKEN(STR_FORM_MAIN_TITLE);\r
-\r
-    goto FORM_BOOT_SETUP_ID,\r
-         prompt = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE),\r
-         help = STRING_TOKEN(STR_FORM_BOOT_SETUP_HELP),\r
-         flags = INTERACTIVE,\r
-         key = FORM_BOOT_SETUP_ID;\r
-\r
-    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-    goto FORM_DRIVER_SETUP_ID,\r
-         prompt = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE),\r
-         help = STRING_TOKEN(STR_FORM_DRIVER_SETUP_HELP),\r
-         flags = INTERACTIVE,\r
-         key = FORM_DRIVER_SETUP_ID;\r
-\r
-    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-    goto FORM_CON_MAIN_ID,\r
-         prompt = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE),\r
-         help = STRING_TOKEN(STR_FORM_CON_MAIN_HELP),\r
-         flags = INTERACTIVE,\r
-         key = FORM_CON_MAIN_ID;\r
-\r
-    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-    goto FORM_MAIN_ID,\r
-         prompt = STRING_TOKEN(STR_BOOT_FROM_FILE),\r
-         help = STRING_TOKEN(STR_BOOT_FROM_FILE_HELP),\r
-         flags = INTERACTIVE,\r
-         key = KEY_VALUE_BOOT_FROM_FILE;\r
-\r
-    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-//    label FORM_MAIN_ID;\r
-\r
-    goto FORM_BOOT_NEXT_ID,\r
-         prompt = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE),\r
-         help = STRING_TOKEN(STR_FORM_BOOT_NEXT_HELP),\r
-         flags = INTERACTIVE,\r
-         key = FORM_BOOT_NEXT_ID;\r
-\r
-    goto FORM_TIME_OUT_ID,\r
-         prompt = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE),\r
-         help = STRING_TOKEN(STR_FORM_TIME_OUT_HELP),\r
-         flags = INTERACTIVE,\r
-         key = FORM_TIME_OUT_ID;\r
-\r
-    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-    text\r
-         help   = STRING_TOKEN(STR_RESET),\r
-         text   = STRING_TOKEN(STR_RESET),\r
-         flags  = INTERACTIVE,\r
-         key    = FORM_RESET;\r
-         \r
-    label LABEL_BMM_PLATFORM_INFORMATION;\r
-    //\r
-    // This is where we will dynamically add a Action type op-code to show \r
-    // the platform information.\r
-    //\r
-    \r
-    //\r
-    // This is where we will dynamically add a Action type op-code to show \r
-    // the advanced menu.\r
-    //\r
-    \r
-    //\r
-    // This is where we will dynamically add a Action type op-code to show \r
-    // the intel test menu.\r
-    //\r
-    label LABEL_END; \r
-  endform;\r
-\r
-  form formid = FORM_BOOT_SETUP_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);\r
-\r
-       goto FORM_MAIN_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
-            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
-            //flags = INTERACTIVE,\r
-            //key = FORM_MAIN_ID;\r
-\r
-       goto FORM_BOOT_SETUP_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),\r
-            flags = INTERACTIVE,\r
-            key = FORM_BOOT_ADD_ID;\r
-\r
-       goto FORM_BOOT_DEL_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
-            flags = INTERACTIVE,\r
-            key = FORM_BOOT_DEL_ID;\r
-\r
-       goto FORM_BOOT_CHG_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
-            flags = INTERACTIVE,\r
-            key = FORM_BOOT_CHG_ID;\r
-  endform;\r
-\r
-  form formid = FORM_DRIVER_SETUP_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE);\r
-\r
-       goto FORM_MAIN_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
-            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
-            //help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
-            //flags = INTERACTIVE,\r
-            //key = FORM_MAIN_ID;\r
-\r
-       goto FORM_DRV_ADD_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_DRV_ADD_HELP),\r
-            flags = INTERACTIVE,\r
-            key = FORM_DRV_ADD_ID;\r
-\r
-       goto FORM_DRV_DEL_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
-            flags = INTERACTIVE,\r
-            key = FORM_DRV_DEL_ID;\r
-\r
-       goto FORM_DRV_CHG_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
-            flags = INTERACTIVE,\r
-            key = FORM_DRV_CHG_ID;\r
-  endform;\r
-\r
-   form formid = FORM_BOOT_ADD_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_ADD_DESC_TITLE);\r
-\r
-       label FORM_BOOT_ADD_ID;\r
-       label LABEL_END;\r
-\r
-       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-       string    varid    = BmmData.BootDescriptionData,\r
-                 questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
-                 prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
-                 help     = STRING_TOKEN(STR_NULL_STRING),\r
-                 flags    = INTERACTIVE,\r
-                 minsize  = 6,\r
-                 maxsize  = 75,\r
-       endstring;\r
-\r
-       string    varid    = BmmData.BootOptionalData,\r
-                 questionid = KEY_VALUE_BOOT_OPTION,\r
-                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
-                 help     = STRING_TOKEN(STR_NULL_STRING),\r
-                 flags    = INTERACTIVE,\r
-                 minsize  = 0,\r
-                 maxsize  = 120,\r
-       endstring;\r
-\r
-       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-       text\r
-         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
-         text   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
-         flags  = INTERACTIVE,\r
-         key    = KEY_VALUE_SAVE_AND_EXIT_BOOT;\r
-\r
-       text\r
-         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
-         text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
-         flags  = INTERACTIVE,\r
-         key    = KEY_VALUE_NO_SAVE_AND_EXIT_BOOT;\r
-         \r
-  endform;\r
-\r
-  form formid = FORM_BOOT_DEL_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE);\r
-\r
-       label FORM_BOOT_DEL_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_BOOT_CHG_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE);\r
-\r
-       label FORM_BOOT_CHG_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_BOOT_NEXT_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE);\r
-\r
-       label FORM_BOOT_NEXT_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_TIME_OUT_ID,\r
-       title = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE);\r
-\r
-       label FORM_TIME_OUT_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_MEMORY_CHECK_ID,\r
-       title = STRING_TOKEN(STR_FORM_MEMORY_CHECK_TITLE);\r
-\r
-       label FORM_MEMORY_CHECK_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_UEFI_OPTIMIZED_BOOT_ID,\r
-       title = STRING_TOKEN(STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE);\r
-\r
-       label FORM_UEFI_OPTIMIZED_BOOT_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_DRV_ADD_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE);\r
-\r
-       goto FORM_MAIN_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
-            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
-            //flags = INTERACTIVE,\r
-            //key = FORM_MAIN_ID;\r
-\r
-       goto FORM_DRIVER_SETUP_ID,\r
-            prompt = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
-            help = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
-            flags = INTERACTIVE,\r
-            key = FORM_DRV_ADD_FILE_ID;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_DRV_ADD_FILE_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
-       \r
-       label FORM_DRV_ADD_FILE_ID;\r
-       label LABEL_END;\r
-\r
-       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-       string    varid    = BmmData.DriverDescriptionData,\r
-                 questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
-                 prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
-                 help     = STRING_TOKEN(STR_NULL_STRING),\r
-                 flags    = INTERACTIVE,\r
-                 minsize  = 6,\r
-                 maxsize  = 75,\r
-       endstring;\r
-\r
-       string    varid    = BmmData.DriverOptionalData,\r
-                 questionid = KEY_VALUE_DRIVER_OPTION,\r
-                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
-                 help     = STRING_TOKEN(STR_NULL_STRING),\r
-                 flags    = INTERACTIVE,\r
-                 minsize  = 0,\r
-                 maxsize  = 120,\r
-       endstring;\r
-\r
-       checkbox varid    = BmmData.ForceReconnect,\r
-               prompt   = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
-               help     = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
-               flags    = CHECKBOX_DEFAULT,\r
-               key      = 0,\r
-       endcheckbox;\r
-\r
-       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-       text\r
-         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
-         text   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
-         flags  = INTERACTIVE,\r
-         key    = KEY_VALUE_SAVE_AND_EXIT_DRIVER;  //BUGBUB: allow duplicate key in one formset???\r
-\r
-       text\r
-         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
-         text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
-         flags  = INTERACTIVE,\r
-         key    = KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER;\r
-  endform;\r
-\r
-  form formid = FORM_DRV_DEL_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE);\r
-\r
-       label FORM_DRV_DEL_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_DRV_CHG_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE);\r
-\r
-       label FORM_DRV_CHG_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_CON_MAIN_ID,\r
-       title = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE);\r
-\r
-       goto FORM_MAIN_ID,\r
-       prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
-       help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
-       //flags = INTERACTIVE,\r
-       //key = FORM_MAIN_ID;\r
-\r
-       goto FORM_CON_IN_ID,\r
-       prompt = STRING_TOKEN(STR_FORM_CON_IN_TITLE),\r
-       help = STRING_TOKEN(STR_FORM_CON_IN_HELP),\r
-       flags = INTERACTIVE,\r
-       key = FORM_CON_IN_ID;\r
-\r
-       goto FORM_CON_OUT_ID,\r
-       prompt = STRING_TOKEN(STR_FORM_CON_OUT_TITLE),\r
-       help = STRING_TOKEN(STR_FORM_CON_OUT_HELP),\r
-       flags = INTERACTIVE,\r
-       key = FORM_CON_OUT_ID;\r
-\r
-       goto FORM_CON_ERR_ID,\r
-       prompt = STRING_TOKEN(STR_FORM_STD_ERR_TITLE),\r
-       help = STRING_TOKEN(STR_FORM_STD_ERR_HELP),\r
-       flags = INTERACTIVE,\r
-       key = FORM_CON_ERR_ID;\r
-\r
-       goto FORM_CON_MODE_ID,\r
-       prompt = STRING_TOKEN(STR_FORM_MODE_TITLE),\r
-       help = STRING_TOKEN(STR_FORM_MODE_HELP),\r
-       flags = INTERACTIVE,\r
-       key = FORM_CON_MODE_ID;\r
-\r
-       goto FORM_CON_COM_ID,\r
-       prompt = STRING_TOKEN(STR_FORM_COM_TITLE),\r
-       help = STRING_TOKEN(STR_FORM_COM_HELP),\r
-       flags = INTERACTIVE,\r
-       key = FORM_CON_COM_ID;\r
-  endform;\r
-\r
-  form formid = FORM_CON_MODE_ID,\r
-       title = STRING_TOKEN(STR_FORM_MODE_TITLE);\r
-\r
-       label FORM_CON_MODE_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_CON_COM_ID,\r
-       title = STRING_TOKEN(STR_FORM_COM_TITLE);\r
-\r
-       label FORM_CON_COM_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_CON_COM_SETUP_ID,\r
-       title = STRING_TOKEN(STR_CON_COM_SETUP);\r
-\r
-       label FORM_CON_COM_SETUP_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_FILE_SEEK_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
-       label FORM_FILE_SEEK_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_FILE_NEW_SEEK_ID,\r
-       title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
-       label FORM_FILE_NEW_SEEK_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_DRV_ADD_HANDLE_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRV_ADD_HANDLE_TITLE);\r
-\r
-       label FORM_DRV_ADD_HANDLE_ID;\r
-       label LABEL_END;\r
-  endform;\r
-\r
-  form formid = FORM_DRV_ADD_HANDLE_DESC_ID,\r
-       title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
-\r
-       label FORM_DRV_ADD_HANDLE_DESC_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_CON_IN_ID,\r
-       title = STRING_TOKEN(STR_FORM_CON_IN_TITLE);\r
-\r
-       label FORM_CON_IN_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_CON_OUT_ID,\r
-       title = STRING_TOKEN(STR_FORM_CON_OUT_TITLE);\r
-\r
-       label FORM_CON_OUT_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-  form formid = FORM_CON_ERR_ID,\r
-       title = STRING_TOKEN(STR_FORM_STD_ERR_TITLE);\r
-\r
-       label FORM_CON_ERR_ID;\r
-       label LABEL_END;\r
-\r
-  endform;\r
-\r
-endformset;\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerLib.inf b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerLib.inf
deleted file mode 100644 (file)
index 302cb90..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-## @file\r
-#  Boot Maintenance Manager Library used by UiApp.\r
-#\r
-#  Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
-#  This program and the accompanying materials are licensed and made available under\r
-#  the terms and conditions of the BSD License that accompanies this distribution.\r
-#  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
-#  \r
-##\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = BootMaintenanceManagerLib\r
-  MODULE_UNI_FILE                = BootMaintenanceManagerLib.uni\r
-  FILE_GUID                      = CA9E4824-4198-4715-AA22-E2935E703A07\r
-  MODULE_TYPE                    = DXE_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION\r
-  CONSTRUCTOR                    = BootMaintenanceManagerLibConstructor\r
-  DESTRUCTOR                     = BootMaintenanceManagerLibDestructor\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources]\r
-  BootMaintenanceManager.h\r
-  BootMaintenanceManager.vfr\r
-  BootMaintenanceManagerStrings.uni\r
-  BootMaintenance.c\r
-  FormGuid.h\r
-  BootOption.c\r
-  ConsoleOption.c\r
-  Data.c\r
-  Variable.c\r
-  UpdatePage.c\r
-  BmLib.c\r
-\r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-\r
-[LibraryClasses]\r
-  DevicePathLib\r
-  BaseLib\r
-  UefiRuntimeServicesTableLib\r
-  MemoryAllocationLib\r
-  UefiLib\r
-  UefiBootServicesTableLib\r
-  BaseMemoryLib\r
-  DebugLib\r
-  PrintLib\r
-  HiiLib\r
-  UefiHiiServicesLib\r
-  UefiBootManagerLib\r
-  FileExplorerLib\r
-  \r
-[Guids]\r
-  gEfiGlobalVariableGuid                        ## SOMETIMES_PRODUCES ## Variable:L"BootNext" (The number of next boot option)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"BootXX" (Boot option variable)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" (Platform supported languange in Rfc4646 format)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"Lang" (Platform supported languange in Iso639 format)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"KeyXX" (Hotkey option variable)\r
-                                                ## PRODUCES           ## Variable:L"HwErrRecSupport" (The level of platform supported hardware Error Record Persistence)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"BootOptionSupport" (The feature supported in boot option menu, value could be: EFI_BOOT_OPTION_SUPPORT_KEY, EFI_BOOT_OPTION_SUPPORT_APP\r
-                                                ## SOMETIMES_PRODUCES (not PcdUefiVariableDefaultLangDeprecate)## Variable:L"LangCodes" (Value of PcdUefiVariableDefaultLangCodes)\r
-                                                ## PRODUCES           ## Variable:L"PlatformLangCodes" (Value of PcdUefiVariableDefaultPlatformLangCodes)\r
-                                                ## PRODUCES           ## Variable:L"Timeout" (The time out value in second of showing progress bar)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"BootOrder" (The boot option array)\r
-                                                ## SOMETIMES_PRODUCES ## Variable:L"DriverOrder" (The driver order list)\r
-                                                ## SOMETIMES_CONSUMES ## Variable:L"ConIn" (The device path of console in device)\r
-                                                ## SOMETIMES_CONSUMES ## Variable:L"ConOut" (The device path of console out device)\r
-                                                ## SOMETIMES_CONSUMES ## Variable:L"ErrOut" (The device path of error out device)\r
-  gEfiFileSystemVolumeLabelInfoIdGuid           ## CONSUMES ## GUID (Indicate the information type is volume)\r
-  gEfiFileInfoGuid                              ## CONSUMES ## GUID (Indicate the information type is file)\r
-  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)\r
-  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID\r
-  gEfiIfrBootMaintenanceGuid                    ## CONSUMES ## GUID\r
\r
-[Protocols]\r
-  gEfiSimpleFileSystemProtocolGuid              ## CONSUMES\r
-  gEfiLoadFileProtocolGuid                      ## CONSUMES\r
-  gEfiHiiConfigAccessProtocolGuid               ## CONSUMES\r
-  gEfiSerialIoProtocolGuid                      ## CONSUMES\r
-  gEfiDevicePathToTextProtocolGuid              ## CONSUMES\r
-\r
-[FeaturePcd]\r
-\r
-[Pcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow                  ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn               ## CONSUMES\r
-  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut              ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution  ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution    ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn          ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow             ## CONSUMES
\ No newline at end of file
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerLib.uni b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerLib.uni
deleted file mode 100644 (file)
index 44411c8..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-// /** @file\r
-// Boot Maintenance Manager Library used by UiApp.\r
-//\r
-// Boot Maintenance Manager Library used by UiApp.\r
-//\r
-// Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
-//\r
-// This program and the accompanying materials are licensed and made available under\r
-// the terms and conditions of the BSD License that accompanies this distribution.\r
-// 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
-//\r
-// **/\r
-\r
-#string STR_MODULE_ABSTRACT\r
-#language en-US\r
-"Boot Maintenance Manager Library used by UiApp."\r
-\r
-#string STR_MODULE_DESCRIPTION\r
-#language en-US\r
-"Boot Maintenance Manager Library used by UiApp."\r
-\r
-\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerStrings.uni b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootMaintenanceManagerStrings.uni
deleted file mode 100644 (file)
index af0ea5e..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-///** @file\r
-//  String definitions for Boot Maintenance Utility.\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
-//  \r
-//**/\r
-\r
-/=#\r
-\r
-#langdef   en-US "English"\r
-#langdef   fr-FR "Français"\r
-\r
-#string STR_NULL_STRING                #language en-US  " "\r
-                                       #language fr-FR  " "\r
-#string STR_NONE                       #language en-US  "NONE"\r
-                                       #language fr-FR  "NONE"\r
-#string STR_MISSING_STRING             #language en-US  "Missing String"\r
-                                       #language fr-FR  "Missing String"\r
-#string STR_FORM_MAIN_TITLE            #language en-US  "Boot Maintenance Manager"\r
-                                       #language fr-FR  "Boot Maintenance Manager"\r
-#string STR_FORM_BOOT_SETUP_TITLE      #language en-US  "Boot Options"\r
-                                       #language fr-FR  "Boot Options"\r
-#string STR_BOOT_MAINT_MANAGER_HELP    #language en-US  "This selection will take you to the Boot Maintenance Manager"\r
-                                       #language fr-FR  "This selection will take you to the Boot Maintenance Manager"\r
-#string STR_FORM_BOOT_SETUP_HELP       #language en-US  "Modify system boot options"\r
-                                       #language fr-FR  "Modify system boot options"\r
-#string STR_FORM_DRIVER_SETUP_TITLE    #language en-US  "Driver Options"\r
-                                       #language fr-FR  "Driver Options"\r
-#string STR_FORM_DRIVER_SETUP_HELP     #language en-US  "Modify boot driver options"\r
-                                       #language fr-FR  "Modify boot driver options"\r
-#string STR_FORM_BOOT_ADD_TITLE        #language en-US  "Add Boot Option"\r
-                                       #language fr-FR  "Add Boot Option"\r
-#string STR_FORM_BOOT_ADD_HELP         #language en-US  "Add EFI Application or Removable Fs as Boot Option"\r
-                                       #language fr-FR  "Add EFI Application or Removable Fs as Boot Option"\r
-#string STR_FORM_BOOT_DEL_TITLE        #language en-US  "Delete Boot Option"\r
-                                       #language fr-FR  "Delete Boot Option"\r
-#string STR_FORM_BOOT_IMMEDIATE_HELP   #language en-US  "Will be valid immediately"\r
-                                       #language fr-FR  "Will be valid immediately"\r
-#string STR_FORM_BOOT_CHG_TITLE        #language en-US  "Change Boot Order"\r
-                                       #language fr-FR  "Change Boot Order"\r
-#string STR_FORM_DRV_ADD_TITLE         #language en-US  "Add Driver Option"\r
-                                       #language fr-FR  "Add Driver Option"\r
-#string STR_FORM_DRV_ADD_HELP          #language en-US  "Add .EFI Driver as Driver Option"\r
-                                       #language fr-FR  "Add .EFI Driver as Driver Option"\r
-#string STR_FORM_DRV_DEL_TITLE         #language en-US  "Delete Driver Option"\r
-                                       #language fr-FR  "Delete Driver Option"\r
-#string STR_FORM_DRV_CHG_TITLE         #language en-US  "Change Driver Order"\r
-                                       #language fr-FR  "Change Driver Order"\r
-#string STR_FORM_NEXT_BOOT_HELP        #language en-US  "Will be valid on next boot"\r
-                                       #language fr-FR  "Will be valid on next boot"\r
-#string STR_FORM_BOOT_NEXT_TITLE       #language en-US  "Set Boot Next Value"\r
-                                       #language fr-FR  "Set Boot Next Value"\r
-#string STR_FORM_BOOT_NEXT_HELP        #language en-US  "Modify next boot behavior"\r
-                                       #language fr-FR  "Modify next boot behavior"\r
-#string STR_FORM_TIME_OUT_TITLE        #language en-US  "Set Time Out Value"\r
-                                       #language fr-FR  "Set Time Out Value"\r
-#string STR_FORM_TIME_OUT_HELP         #language en-US  "Modify automatic boot time-out value"\r
-                                       #language fr-FR  "Modify automatic boot time-out value"\r
-#string STR_FORM_MEMORY_CHECK_TITLE    #language en-US  "Set Memory Check Type"\r
-                                       #language fr-FR  "Set Memory Check Type"\r
-#string STR_FORM_MEMORY_CHECK_HELP     #language en-US  "Modify the type of memory checking"\r
-                                       #language fr-FR  "Modify the type of memory checking"\r
-#string STR_MEMORY_CHECK_SETUP         #language en-US  "Memory Check Type"\r
-                                       #language fr-FR  "Memory Check Type"\r
-#string STR_MEMORY_CHECK_SETUP_HELP    #language en-US  "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
-                                       #language fr-FR  "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
-#string STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE #language en-US "UEFI Optimized Boot"\r
-                                           #language fr-FR "UEFI Optimized Boot"\r
-#string STR_FORM_UEFI_OPTIMIZED_BOOT_HELP  #language en-US "Modify the UEFI Optimized Boot setting"\r
-                                           #language fr-FR "Modify the UEFI Optimized Boot setting"\r
-#string UEFI_OPTIMIZED_BOOT_DESCRIPTION           #language en-US "UEFI Optimized Boot"\r
-                                           #language fr-FR "UEFI Optimized Boot"\r
-#string UEFI_OPTIMIZED_BOOT_HELP              #language en-US "Check to enable UEFI Optimized Boot"\r
-                                           #language fr-FR "Check to enable UEFI Optimized Boot"\r
-#string STR_FORM_CON_MAIN_TITLE        #language en-US  "Console Options"\r
-                                       #language fr-FR  "Console Options"\r
-#string STR_FORM_CON_MAIN_HELP         #language en-US  "Modify system console options"\r
-                                       #language fr-FR  "Modify system console options"\r
-#string STR_FORM_CON_IN_TITLE          #language en-US  "Console Input Device Select"\r
-                                       #language fr-FR  "Console Input Device Select"\r
-#string STR_FORM_CON_IN_HELP           #language en-US  "Enable console device as ConIn"\r
-                                       #language fr-FR  "Enable console device as ConIn"\r
-#string STR_FORM_SET_FD_ORDER_TITLE    #language en-US  "Set Legacy Floppy Drive Order"\r
-                                       #language fr-FR  "Set Legacy Floppy Drive Order"\r
-#string STR_FORM_SET_HD_ORDER_TITLE    #language en-US  "Set Legacy HardDisk Drive Order"\r
-                                       #language fr-FR  "Set Legacy HardDisk Drive Order"\r
-#string STR_FORM_SET_CD_ORDER_TITLE    #language en-US  "Set Legacy CD-ROM Drive Order"\r
-                                       #language fr-FR  "Set Legacy CD-ROM Drive Order"\r
-#string STR_FORM_SET_NET_ORDER_TITLE   #language en-US  "Set Legacy NET Drive Order"\r
-                                       #language fr-FR  "Set Legacy NET Drive Order"\r
-#string STR_FORM_SET_BEV_ORDER_TITLE   #language en-US  "Set Legacy BEV Drive Order"\r
-                                       #language fr-FR  "Set Legacy BEV Drive Order"\r
-#string STR_FORM_GOTO_SETTING          #language en-US  "Go Back To Setting Page"\r
-                                       #language fr-FR  "Go Back To Setting Page"\r
-#string STR_COM1                       #language en-US  "COM1"\r
-                                       #language fr-FR  "COM1"\r
-#string STR_COM2                       #language en-US  "COM2"\r
-                                       #language fr-FR  "COM2"\r
-#string STR_COM_AS_CONSOLE_OPTION      #language en-US  "Select this COM port as Console"\r
-                                       #language fr-FR  "Select this COM port as Console"\r
-#string STR_FORM_CON_OUT_TITLE         #language en-US  "Console Output Device Select"\r
-                                       #language fr-FR  "Console Output Device Select"\r
-#string STR_FORM_CON_OUT_HELP          #language en-US  "Enable console device as ConOut"\r
-                                       #language fr-FR  "Enable console device as ConOut"\r
-#string STR_FORM_STD_ERR_TITLE         #language en-US  "Console Standard Error Device Select"\r
-                                       #language fr-FR  "Console Standard Error Device Select"\r
-#string STR_FORM_STD_ERR_HELP          #language en-US  "Enable console device as StdErr"\r
-                                       #language fr-FR  "Enable console device as StdErr"\r
-#string STR_FORM_MODE_TITLE            #language en-US  "Console Output Mode Select"\r
-                                       #language fr-FR  "Console Output Mode Select"\r
-#string STR_FORM_MODE_HELP             #language en-US  "Select Console Output Mode: 80x25, 100x31, etc."\r
-                                       #language fr-FR  "Select Console Output Mode: 80x25, 100x31, etc."\r
-#string STR_FORM_COM_TITLE             #language en-US  "COM Attribute Setup Page"\r
-                                       #language fr-FR  "COM Attribute Setup Page"\r
-#string STR_FORM_COM_HELP              #language en-US  "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
-                                       #language fr-FR  "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
-#string STR_FORM_DRV_ADD_FILE_TITLE    #language en-US  "Add Driver Option Using File"\r
-                                       #language fr-FR  "Add Driver Option Using File"\r
-#string STR_FORM_DRV_ADD_HANDLE_TITLE  #language en-US  "Add Driver Option Using Handle"\r
-                                       #language fr-FR  "Add Driver Option Using Handle"\r
-#string STR_FORM_BOOT_ADD_DESC_TITLE   #language en-US  "Modify Boot Option Description"\r
-                                       #language fr-FR  "Modify Boot Option Description"\r
-#string STR_FORM_DRV_ADD_DESC_TITLE    #language en-US  "Modify Driver Option Description"\r
-                                       #language fr-FR  "Modify Driver Option Description"\r
-#string STR_NUM_AUTO_BOOT              #language en-US  "Auto Boot Time-out"\r
-                                       #language fr-FR  "Auto Boot Time-out"\r
-#string STR_HLP_AUTO_BOOT              #language en-US  "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
-                                       #language fr-FR  "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
-#string STR_BOOT_NEXT                  #language en-US  "Boot Next Value"\r
-                                       #language fr-FR  "Boot Next Value"\r
-#string STR_BOOT_NEXT_HELP             #language en-US  "Next boot use this boot option"\r
-                                       #language fr-FR  "Next boot use this boot option"\r
-#string STR_LOAD_OPTION_DEVPATH        #language en-US  "This is the devicepath"\r
-                                       #language fr-FR  "This is the devicepath"\r
-#string STR_LOAD_OPTION_DESC           #language en-US  "Input the description"\r
-                                       #language fr-FR  "Input the description"\r
-#string STR_LOAD_OPTION_ACTIVE         #language en-US  "Load Option Active"\r
-                                       #language fr-FR  "Load Option Active"\r
-#string STR_LOAD_OPTION_FORCE_RECON    #language en-US  "Load Option Reconnect"\r
-                                       #language fr-FR  "Load Option Reconnect"\r
-#string STR_SAVE_AND_EXIT              #language en-US  "Commit Changes and Exit"\r
-                                       #language fr-FR  "Commit Changes and Exit"\r
-#string STR_NO_SAVE_AND_EXIT           #language en-US  "Discard Changes and Exit"\r
-                                       #language fr-FR  "Discard Changes and Exit"\r
-#string STR_CON_IN_SETUP               #language en-US  "Set Console Input Device"\r
-                                       #language fr-FR  "Set Console Input Device"\r
-#string STR_CON_OUT_SETUP              #language en-US  "Set Console Output Device"\r
-                                       #language fr-FR  "Set Console Output Device"\r
-#string STR_CON_ERR_SETUP              #language en-US  "Set Error Output Device"\r
-                                       #language fr-FR  "Set Error Output Device"\r
-#string STR_CON_MODE_SETUP             #language en-US  "Set Console Output Mode"\r
-                                       #language fr-FR  "Set Console Output Mode"\r
-#string STR_CON_COM_SETUP              #language en-US  "Set COM Attributes"\r
-                                       #language fr-FR  "Set COM Attributes"\r
-#string STR_COM_TERMI_TYPE             #language en-US  "Set COM Terminal Type"\r
-                                       #language fr-FR  "Set COM Terminal Type"\r
-#string STR_COM_FLOW_CONTROL           #language en-US  "Set COM Flow Control"\r
-                                       #language fr-FR  "Set COM Flow Control"\r
-#string STR_COM_BAUD_RATE              #language en-US  "Set COM Baud Rate"\r
-                                       #language fr-FR  "Set COM Baud Rate"\r
-#string STR_COM_DATA_BITS              #language en-US  "Set COM Data Bits"\r
-                                       #language fr-FR  "Set COM Data Bits"\r
-#string STR_COM_PARITY                 #language en-US  "Set COM Parity"\r
-                                       #language fr-FR  "Set COM Parity"\r
-#string STR_COM_STOP_BITS              #language en-US  "Set COM Stop Bits"\r
-                                       #language fr-FR  "Set COM Stop Bits"\r
-#string STR_COM_BAUD_RATE_0            #language en-US  "115200"\r
-                                       #language fr-FR  "115200"\r
-#string STR_COM_BAUD_RATE_1            #language en-US  "57600"\r
-                                       #language fr-FR  "57600"\r
-#string STR_COM_BAUD_RATE_2            #language en-US  "38400"\r
-                                       #language fr-FR  "38400"\r
-#string STR_COM_BAUD_RATE_3            #language en-US  "19200"\r
-                                       #language fr-FR  "19200"\r
-#string STR_COM_BAUD_RATE_4            #language en-US  "9600"\r
-                                       #language fr-FR  "9600"\r
-#string STR_COM_BAUD_RATE_5            #language en-US  "7200"\r
-                                       #language fr-FR  "7200"\r
-#string STR_COM_BAUD_RATE_6            #language en-US  "4800"\r
-                                       #language fr-FR  "4800"\r
-#string STR_COM_BAUD_RATE_7            #language en-US  "3600"\r
-                                       #language fr-FR  "3600"\r
-#string STR_COM_BAUD_RATE_8            #language en-US  "2400"\r
-                                       #language fr-FR  "2400"\r
-#string STR_COM_BAUD_RATE_9            #language en-US  "2000"\r
-                                       #language fr-FR  "2000"\r
-#string STR_COM_BAUD_RATE_10           #language en-US  "1800"\r
-                                       #language fr-FR  "1800"\r
-#string STR_COM_BAUD_RATE_11           #language en-US  "1200"\r
-                                       #language fr-FR  "1200"\r
-#string STR_COM_BAUD_RATE_12           #language en-US  "600"\r
-                                       #language fr-FR  "600"\r
-#string STR_COM_BAUD_RATE_13           #language en-US  "300"\r
-                                       #language fr-FR  "300"\r
-#string STR_COM_BAUD_RATE_14           #language en-US  "150"\r
-                                       #language fr-FR  "150"\r
-#string STR_COM_BAUD_RATE_15           #language en-US  "134"\r
-                                       #language fr-FR  "134"\r
-#string STR_COM_BAUD_RATE_16           #language en-US  "110"\r
-                                       #language fr-FR  "110"\r
-#string STR_COM_BAUD_RATE_17           #language en-US  "75"\r
-                                       #language fr-FR  "75"\r
-#string STR_COM_BAUD_RATE_18           #language en-US  "50"\r
-                                       #language fr-FR  "50"\r
-#string STR_COM_DATA_BITS_0            #language en-US  "5"\r
-                                       #language fr-FR  "5"\r
-#string STR_COM_DATA_BITS_1            #language en-US  "6"\r
-                                       #language fr-FR  "6"\r
-#string STR_COM_DATA_BITS_2            #language en-US  "7"\r
-                                       #language fr-FR  "7"\r
-#string STR_COM_DATA_BITS_3            #language en-US  "8"\r
-                                       #language fr-FR  "8"\r
-#string STR_COM_PAR_0                  #language en-US  "None"\r
-                                       #language fr-FR  "None"\r
-#string STR_COM_PAR_1                  #language en-US  "Even"\r
-                                       #language fr-FR  "Even"\r
-#string STR_COM_PAR_2                  #language en-US  "Odd"\r
-                                       #language fr-FR  "Odd"\r
-#string STR_COM_PAR_3                  #language en-US  "Mark"\r
-                                       #language fr-FR  "Mark"\r
-#string STR_COM_PAR_4                  #language en-US  "Space"\r
-                                       #language fr-FR  "Space"\r
-#string STR_COM_STOP_BITS_0            #language en-US  "One"\r
-                                       #language fr-FR  "One"\r
-#string STR_COM_STOP_BITS_1            #language en-US  "One And A Half"\r
-                                       #language fr-FR  "One And A Half"\r
-#string STR_COM_STOP_BITS_2            #language en-US  "Two"\r
-                                       #language fr-FR  "Two"\r
-#string STR_COM_TYPE_0                 #language en-US  "PC_ANSI"\r
-                                       #language fr-FR  "PC_ANSI"\r
-#string STR_COM_TYPE_1                 #language en-US  "VT_100"\r
-                                       #language fr-FR  "VT_100"\r
-#string STR_COM_TYPE_2                 #language en-US  "VT_100_PLUS"\r
-                                       #language fr-FR  "VT_100_PLUS"\r
-#string STR_COM_TYPE_3                 #language en-US  "VT_UTF8"\r
-                                       #language fr-FR  "VT_UTF8"\r
-#string STR_COM_TYPE_4                 #language en-US  "TTY_TERM"\r
-                                       #language fr-FR  "TTY_TERM"\r
-#string STR_RESET                      #language en-US  "Reset System"\r
-                                       #language fr-FR  "Reset System"\r
-#string STR_FORM_GOTO_MAIN             #language en-US  "Go Back To Main Page"\r
-                                       #language fr-FR  "Go Back To Main Page"\r
-#string STR_BOOT_FROM_FILE             #language en-US  "Boot From File"\r
-                                       #language fr-FR  "Boot From File"\r
-#string STR_BOOT_FROM_FILE_HELP        #language en-US  "Boot system from a file or device"\r
-                                       #language fr-FR  "Boot system from a file or device"\r
-#string STR_OPTIONAL_DATA              #language en-US  "Input Optional Data"\r
-                                       #language fr-FR  "Input Optional Data"\r
-#string STR_CHANGE_ORDER               #language en-US  "Change the order"\r
-                                       #language fr-FR  "Change the order"\r
-#string STR_BOOT_LEGACY                #language en-US  "Boot Legacy System"\r
-                                       #language fr-FR  "Boot Legacy System"\r
-#string STR_BOOT_LEGACY_HELP           #language en-US  "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
-                                       #language fr-FR  "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
-#string STR_BOOT_LEGACY_FLOPPY         #language en-US  "Boot From Floppy"\r
-                                       #language fr-FR  "Boot From Floppy"\r
-#string STR_BOOT_LEGACY_HARDDRIVE      #language en-US  "Boot From Hard Drive"\r
-                                       #language fr-FR  "Boot From Hard Drive"\r
-#string STR_BOOT_LEGACY_CDROM          #language en-US  "Boot From CD Rom"\r
-                                       #language fr-FR  "Boot From CD Rom"\r
-#string STR_BOOT_LEGACY_PCMCIA         #language en-US  "Boot From PCMCIA"\r
-                                       #language fr-FR  "Boot From PCMCIA"\r
-#string STR_BOOT_LEGACY_USB            #language en-US  "Boot From USB Device"\r
-                                       #language fr-FR  "Boot From USB Device"\r
-#string STR_BOOT_LEGACY_NETWORK        #language en-US  "Boot From Network"\r
-                                       #language fr-FR  "Boot From Network"\r
-#string STR_DISABLE_LEGACY_DEVICE      #language en-US  "Disabled"\r
-                                       #language fr-FR  "Disabled"\r
-#string STR_FILE_EXPLORER_TITLE        #language en-US  "File Explorer"\r
-                                       #language fr-FR  "File Explorer"\r
-#string STR_OUT_OF_BAND_PORT           #language fr-FR  "Out-Of-Band Mgmt Port"\r
-                                       #language en-US  "Out-Of-Band Mgmt Port"\r
-#string STR_HARDWARE_FLOW_CONTROL      #language fr-FR  "Hardware"\r
-                                       #language en-US  "Hardware"\r
-#string STR_NONE_FLOW_CONTROL          #language fr-FR  "None"\r
-                                       #language en-US  "None"\r
-//\r
-// BugBug : need someone to translate these strings to french\r
-//\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/BootOption.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/BootOption.c
deleted file mode 100644 (file)
index a375d61..0000000
+++ /dev/null
@@ -1,984 +0,0 @@
-/** @file\r
-  Provide boot option support for Application "BootMaint"\r
-\r
-  Include file system navigation, system handle selection\r
-\r
-  Boot option manipulation\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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-///\r
-/// Define the maximum characters that will be accepted.\r
-///\r
-#define MAX_CHAR            480\r
-\r
-/**\r
-  Create a menu entry by given menu type.\r
-\r
-  @param MenuType        The Menu type to be created.\r
-\r
-  @retval NULL           If failed to create the menu.\r
-  @return the new menu entry.\r
-\r
-**/\r
-BM_MENU_ENTRY *\r
-BOpt_CreateMenuEntry (\r
-  UINTN           MenuType\r
-  )\r
-{\r
-  BM_MENU_ENTRY *MenuEntry;\r
-  UINTN         ContextSize;\r
-\r
-  //\r
-  // Get context size according to menu type\r
-  //\r
-  switch (MenuType) {\r
-  case BM_LOAD_CONTEXT_SELECT:\r
-    ContextSize = sizeof (BM_LOAD_CONTEXT);\r
-    break;\r
-\r
-  case BM_FILE_CONTEXT_SELECT:\r
-    ContextSize = sizeof (BM_FILE_CONTEXT);\r
-    break;\r
-\r
-  case BM_CONSOLE_CONTEXT_SELECT:\r
-    ContextSize = sizeof (BM_CONSOLE_CONTEXT);\r
-    break;\r
-\r
-  case BM_TERMINAL_CONTEXT_SELECT:\r
-    ContextSize = sizeof (BM_TERMINAL_CONTEXT);\r
-    break;\r
-\r
-  case BM_HANDLE_CONTEXT_SELECT:\r
-    ContextSize = sizeof (BM_HANDLE_CONTEXT);\r
-    break;\r
-\r
-  default:\r
-    ContextSize = 0;\r
-    break;\r
-  }\r
-\r
-  if (ContextSize == 0) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Create new menu entry\r
-  //\r
-  MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY));\r
-  if (MenuEntry == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  MenuEntry->VariableContext = AllocateZeroPool (ContextSize);\r
-  if (MenuEntry->VariableContext == NULL) {\r
-    FreePool (MenuEntry);\r
-    return NULL;\r
-  }\r
-\r
-  MenuEntry->Signature        = BM_MENU_ENTRY_SIGNATURE;\r
-  MenuEntry->ContextSelection = MenuType;\r
-  return MenuEntry;\r
-}\r
-\r
-/**\r
-  Free up all resource allocated for a BM_MENU_ENTRY.\r
-\r
-  @param MenuEntry   A pointer to BM_MENU_ENTRY.\r
-\r
-**/\r
-VOID\r
-BOpt_DestroyMenuEntry (\r
-  BM_MENU_ENTRY         *MenuEntry\r
-  )\r
-{\r
-  BM_LOAD_CONTEXT           *LoadContext;\r
-  BM_FILE_CONTEXT           *FileContext;\r
-  BM_CONSOLE_CONTEXT        *ConsoleContext;\r
-  BM_TERMINAL_CONTEXT       *TerminalContext;\r
-  BM_HANDLE_CONTEXT         *HandleContext;\r
-\r
-  //\r
-  //  Select by the type in Menu entry for current context type\r
-  //\r
-  switch (MenuEntry->ContextSelection) {\r
-  case BM_LOAD_CONTEXT_SELECT:\r
-    LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext;\r
-    FreePool (LoadContext->FilePathList);\r
-    FreePool (LoadContext->LoadOption);\r
-    if (LoadContext->OptionalData != NULL) {\r
-      FreePool (LoadContext->OptionalData);\r
-    }\r
-    FreePool (LoadContext);\r
-    break;\r
-\r
-  case BM_FILE_CONTEXT_SELECT:\r
-    FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
-\r
-    if (!FileContext->IsRoot) {\r
-      FreePool (FileContext->DevicePath);\r
-    } else {\r
-      if (FileContext->FHandle != NULL) {\r
-        FileContext->FHandle->Close (FileContext->FHandle);\r
-      }\r
-    }\r
-\r
-    if (FileContext->FileName != NULL) {\r
-      FreePool (FileContext->FileName);\r
-    }\r
-    if (FileContext->Info != NULL) {\r
-      FreePool (FileContext->Info);\r
-    }\r
-    FreePool (FileContext);\r
-    break;\r
-\r
-  case BM_CONSOLE_CONTEXT_SELECT:\r
-    ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext;\r
-    FreePool (ConsoleContext->DevicePath);\r
-    FreePool (ConsoleContext);\r
-    break;\r
-\r
-  case BM_TERMINAL_CONTEXT_SELECT:\r
-    TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext;\r
-    FreePool (TerminalContext->DevicePath);\r
-    FreePool (TerminalContext);\r
-    break;\r
-\r
-  case BM_HANDLE_CONTEXT_SELECT:\r
-    HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext;\r
-    FreePool (HandleContext);\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-\r
-  FreePool (MenuEntry->DisplayString);\r
-  if (MenuEntry->HelpString != NULL) {\r
-    FreePool (MenuEntry->HelpString);\r
-  }\r
-\r
-  FreePool (MenuEntry);\r
-}\r
-\r
-/**\r
-  Get the Menu Entry from the list in Menu Entry List.\r
-\r
-  If MenuNumber is great or equal to the number of Menu\r
-  Entry in the list, then ASSERT.\r
-\r
-  @param MenuOption      The Menu Entry List to read the menu entry.\r
-  @param MenuNumber      The index of Menu Entry.\r
-\r
-  @return The Menu Entry.\r
-\r
-**/\r
-BM_MENU_ENTRY *\r
-BOpt_GetMenuEntry (\r
-  BM_MENU_OPTION      *MenuOption,\r
-  UINTN               MenuNumber\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  UINTN           Index;\r
-  LIST_ENTRY      *List;\r
-\r
-  ASSERT (MenuNumber < MenuOption->MenuNumber);\r
-\r
-  List = MenuOption->Head.ForwardLink;\r
-  for (Index = 0; Index < MenuNumber; Index++) {\r
-    List = List->ForwardLink;\r
-  }\r
-\r
-  NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE);\r
-\r
-  return NewMenuEntry;\r
-}\r
-\r
-/**\r
-  Free resources allocated in Allocate Rountine.\r
-\r
-  @param FreeMenu        Menu to be freed\r
-**/\r
-VOID\r
-BOpt_FreeMenu (\r
-  BM_MENU_OPTION        *FreeMenu\r
-  )\r
-{\r
-  BM_MENU_ENTRY *MenuEntry;\r
-  while (!IsListEmpty (&FreeMenu->Head)) {\r
-    MenuEntry = CR (\r
-                  FreeMenu->Head.ForwardLink,\r
-                  BM_MENU_ENTRY,\r
-                  Link,\r
-                  BM_MENU_ENTRY_SIGNATURE\r
-                  );\r
-    RemoveEntryList (&MenuEntry->Link);\r
-    BOpt_DestroyMenuEntry (MenuEntry);\r
-  }\r
-  FreeMenu->MenuNumber = 0;\r
-}\r
-\r
-/**\r
-\r
-  Build the BootOptionMenu according to BootOrder Variable.\r
-  This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
-\r
-  @param CallbackData The BMM context data.\r
-\r
-  @return EFI_NOT_FOUND Fail to find "BootOrder" variable.\r
-  @return EFI_SUCESS    Success build boot option menu.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetBootOptions (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData\r
-  )\r
-{\r
-  UINTN                         Index;\r
-  UINT16                        BootString[10];\r
-  UINT8                         *LoadOptionFromVar;\r
-  UINT8                         *LoadOption;\r
-  UINTN                         BootOptionSize;\r
-  BOOLEAN                       BootNextFlag;\r
-  UINT16                        *BootOrderList;\r
-  UINTN                         BootOrderListSize;\r
-  UINT16                        *BootNext;\r
-  UINTN                         BootNextSize;\r
-  BM_MENU_ENTRY                 *NewMenuEntry;\r
-  BM_LOAD_CONTEXT               *NewLoadContext;\r
-  UINT8                         *LoadOptionPtr;\r
-  UINTN                         StringSize;\r
-  UINTN                         OptionalDataSize;\r
-  UINT8                         *LoadOptionEnd;\r
-  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;\r
-  UINTN                         MenuCount;\r
-  UINT8                         *Ptr;\r
-  EFI_BOOT_MANAGER_LOAD_OPTION  *BootOption;\r
-  UINTN                         BootOptionCount;  \r
-  \r
-  MenuCount         = 0;\r
-  BootOrderListSize = 0;\r
-  BootNextSize      = 0;\r
-  BootOrderList     = NULL;\r
-  BootNext          = NULL;\r
-  LoadOptionFromVar = NULL;\r
-  BOpt_FreeMenu (&BootOptionMenu);\r
-  InitializeListHead (&BootOptionMenu.Head);\r
-\r
-  //\r
-  // Get the BootOrder from the Var\r
-  //\r
-  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
-  if (BootOrderList == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-  \r
-  //\r
-  // Get the BootNext from the Var\r
-  //\r
-  GetEfiGlobalVariable2 (L"BootNext", (VOID **) &BootNext, &BootNextSize);\r
-  if (BootNext != NULL) {\r
-    if (BootNextSize != sizeof (UINT16)) {\r
-      FreePool (BootNext);\r
-      BootNext = NULL;\r
-    }\r
-  }\r
-  BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);\r
-  for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
-    //\r
-    // Don't display the hidden/inactive boot option\r
-    //\r
-    if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) {\r
-      continue;\r
-    }\r
-      \r
-    UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);\r
-    //\r
-    //  Get all loadoptions from the VAR\r
-    //\r
-    GetEfiGlobalVariable2 (BootString, (VOID **) &LoadOptionFromVar, &BootOptionSize);\r
-    if (LoadOptionFromVar == NULL) {\r
-      continue;\r
-    }\r
-\r
-    LoadOption = AllocateZeroPool (BootOptionSize);\r
-    if (LoadOption == NULL) {\r
-      continue;\r
-    }\r
-\r
-    CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);\r
-    FreePool (LoadOptionFromVar);\r
-\r
-    if (BootNext != NULL) {\r
-      BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);\r
-    } else {\r
-      BootNextFlag = FALSE;\r
-    }\r
-\r
-    NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
-    ASSERT (NULL != NewMenuEntry);\r
-\r
-    NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    LoadOptionPtr                       = LoadOption;\r
-    LoadOptionEnd                       = LoadOption + BootOptionSize;\r
-\r
-    NewMenuEntry->OptionNumber          = BootOrderList[Index];\r
-    NewLoadContext->LoadOptionModified  = FALSE;\r
-    NewLoadContext->Deleted             = FALSE;\r
-    NewLoadContext->IsBootNext          = BootNextFlag;\r
-\r
-    //\r
-    // Is a Legacy Device?\r
-    //\r
-    Ptr = (UINT8 *) LoadOption;\r
-\r
-    //\r
-    // Attribute = *(UINT32 *)Ptr;\r
-    //\r
-    Ptr += sizeof (UINT32);\r
-\r
-    //\r
-    // FilePathSize = *(UINT16 *)Ptr;\r
-    //\r
-    Ptr += sizeof (UINT16);\r
-\r
-    //\r
-    // Description = (CHAR16 *)Ptr;\r
-    //\r
-    Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
-    //\r
-    // Now Ptr point to Device Path\r
-    //\r
-    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
-    if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {\r
-      NewLoadContext->IsLegacy = TRUE;\r
-    } else {\r
-      NewLoadContext->IsLegacy = FALSE;\r
-    }\r
-    //\r
-    // LoadOption is a pointer type of UINT8\r
-    // for easy use with following LOAD_OPTION\r
-    // embedded in this struct\r
-    //\r
-    NewLoadContext->LoadOption      = LoadOption;\r
-    NewLoadContext->LoadOptionSize  = BootOptionSize;\r
-\r
-    NewLoadContext->Attributes      = *(UINT32 *) LoadOptionPtr;\r
-    NewLoadContext->IsActive        = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
-\r
-    NewLoadContext->ForceReconnect  = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-    LoadOptionPtr += sizeof (UINT32);\r
-\r
-    NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
-    LoadOptionPtr += sizeof (UINT16);\r
-    \r
-    StringSize = StrSize((UINT16*)LoadOptionPtr);\r
-\r
-    NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr));\r
-    ASSERT (NewLoadContext->Description != NULL);\r
-    StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr);\r
-    \r
-    ASSERT (NewLoadContext->Description != NULL);\r
-    NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-    NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
-    LoadOptionPtr += StringSize;\r
-\r
-    NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
-    ASSERT (NewLoadContext->FilePathList != NULL);\r
-    CopyMem (\r
-      NewLoadContext->FilePathList,\r
-      (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
-      NewLoadContext->FilePathListLength\r
-      );\r
-\r
-    NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
-    NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
-\r
-    LoadOptionPtr += NewLoadContext->FilePathListLength;\r
-\r
-    if (LoadOptionPtr < LoadOptionEnd) {\r
-      OptionalDataSize = BootOptionSize -\r
-        sizeof (UINT32) -\r
-        sizeof (UINT16) -\r
-        StringSize -\r
-        NewLoadContext->FilePathListLength;\r
-\r
-      NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
-      ASSERT (NewLoadContext->OptionalData != NULL);\r
-      CopyMem (\r
-        NewLoadContext->OptionalData,\r
-        LoadOptionPtr,\r
-        OptionalDataSize\r
-        );\r
-\r
-      NewLoadContext->OptionalDataSize = OptionalDataSize;\r
-    }\r
-\r
-    InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
-    MenuCount++;\r
-  }\r
-  EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);\r
-\r
-  if (BootNext != NULL) {\r
-    FreePool (BootNext);\r
-  }\r
-  if (BootOrderList != NULL) {\r
-    FreePool (BootOrderList);\r
-  }\r
-  BootOptionMenu.MenuNumber = MenuCount;\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
-  Find drivers that will be added as Driver#### variables from handles\r
-  in current system environment\r
-  All valid handles in the system except those consume SimpleFs, LoadFile\r
-  are stored in DriverMenu for future use.\r
-\r
-  @retval EFI_SUCCESS The function complets successfully.\r
-  @return Other value if failed to build the DriverMenu.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_FindDrivers (\r
-  VOID\r
-  )\r
-{\r
-  UINTN                           NoDevicePathHandles;\r
-  EFI_HANDLE                      *DevicePathHandle;\r
-  UINTN                           Index;\r
-  EFI_STATUS                      Status;\r
-  BM_MENU_ENTRY                   *NewMenuEntry;\r
-  BM_HANDLE_CONTEXT               *NewHandleContext;\r
-  EFI_HANDLE                      CurHandle;\r
-  UINTN                           OptionNumber;\r
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
-  EFI_LOAD_FILE_PROTOCOL          *LoadFile;\r
-\r
-  SimpleFs  = NULL;\r
-  LoadFile  = NULL;\r
-\r
-  InitializeListHead (&DriverMenu.Head);\r
-\r
-  //\r
-  // At first, get all handles that support Device Path\r
-  // protocol which is the basic requirement for\r
-  // Driver####\r
-  //\r
-  Status = gBS->LocateHandleBuffer (\r
-                  ByProtocol,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  NULL,\r
-                  &NoDevicePathHandles,\r
-                  &DevicePathHandle\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  OptionNumber = 0;\r
-  for (Index = 0; Index < NoDevicePathHandles; Index++) {\r
-    CurHandle = DevicePathHandle[Index];\r
-\r
-    Status = gBS->HandleProtocol (\r
-                    CurHandle,\r
-                    &gEfiSimpleFileSystemProtocolGuid,\r
-                    (VOID **) &SimpleFs\r
-                    );\r
-    if (Status == EFI_SUCCESS) {\r
-      continue;\r
-    }\r
-\r
-    Status = gBS->HandleProtocol (\r
-                    CurHandle,\r
-                    &gEfiLoadFileProtocolGuid,\r
-                    (VOID **) &LoadFile\r
-                    );\r
-    if (Status == EFI_SUCCESS) {\r
-      continue;\r
-    }\r
-\r
-    NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT);\r
-    if (NULL == NewMenuEntry) {\r
-      FreePool (DevicePathHandle);\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    NewHandleContext              = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    NewHandleContext->Handle      = CurHandle;\r
-    NewHandleContext->DevicePath  = DevicePathFromHandle (CurHandle);\r
-    NewMenuEntry->DisplayString = UiDevicePathToStr (NewHandleContext->DevicePath);\r
-    NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle,0,NewMenuEntry->DisplayString,NULL);\r
-    NewMenuEntry->HelpString    = NULL;\r
-    NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
-    NewMenuEntry->OptionNumber  = OptionNumber;\r
-    OptionNumber++;\r
-    InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link);\r
-\r
-  }\r
-\r
-  if (DevicePathHandle != NULL) {\r
-    FreePool (DevicePathHandle);\r
-  }\r
-\r
-  DriverMenu.MenuNumber = OptionNumber;\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
-  Get the Option Number that has not been allocated for use.\r
-\r
-  @param Type  The type of Option.\r
-\r
-  @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetOptionNumber (\r
-  CHAR16        *Type\r
-  )\r
-{\r
-  UINT16        *OrderList;\r
-  UINTN         OrderListSize;\r
-  UINTN         Index;\r
-  CHAR16        StrTemp[20];\r
-  UINT16        *OptionBuffer;\r
-  UINT16        OptionNumber;\r
-  UINTN         OptionSize;\r
-\r
-  OrderListSize = 0;\r
-  OrderList     = NULL;\r
-  OptionNumber  = 0;\r
-  Index         = 0;\r
-\r
-  UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type);\r
-\r
-  GetEfiGlobalVariable2 (StrTemp, (VOID **) &OrderList, &OrderListSize);\r
-  for (OptionNumber = 0; ; OptionNumber++) {\r
-    if (OrderList != NULL) {\r
-      for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) {\r
-        if (OptionNumber == OrderList[Index]) {\r
-          break;\r
-        }\r
-      }\r
-    }\r
-\r
-    if (Index < OrderListSize / sizeof (UINT16)) {\r
-      //\r
-      // The OptionNumber occurs in the OrderList, continue to use next one\r
-      //\r
-      continue;\r
-    }\r
-    UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber);\r
-    DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp));\r
-    GetEfiGlobalVariable2 (StrTemp, (VOID **) &OptionBuffer, &OptionSize);\r
-    if (NULL == OptionBuffer) {\r
-      //\r
-      // The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it\r
-      //\r
-      break;\r
-    }\r
-  }\r
-\r
-  return OptionNumber;\r
-}\r
-\r
-/**\r
-\r
-  Get the Option Number for Boot#### that does not used.\r
-\r
-  @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetBootOptionNumber (\r
-  VOID\r
-  )\r
-{\r
-  return BOpt_GetOptionNumber (L"Boot");\r
-}\r
-\r
-/**\r
-\r
-  Get the Option Number for Driver#### that does not used.\r
-\r
-  @return The unused Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetDriverOptionNumber (\r
-  VOID\r
-  )\r
-{\r
-  return BOpt_GetOptionNumber (L"Driver");\r
-}\r
-\r
-/**\r
-\r
-  Build up all DriverOptionMenu\r
-\r
-  @param CallbackData The BMM context data.\r
-\r
-  @retval EFI_SUCESS           The functin completes successfully.\r
-  @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
-  @retval EFI_NOT_FOUND        Fail to get "DriverOrder" variable.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetDriverOptions (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData\r
-  )\r
-{\r
-  UINTN           Index;\r
-  UINT16          DriverString[12];\r
-  UINT8           *LoadOptionFromVar;\r
-  UINT8           *LoadOption;\r
-  UINTN           DriverOptionSize;\r
-\r
-  UINT16          *DriverOrderList;\r
-  UINTN           DriverOrderListSize;\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT8           *LoadOptionPtr;\r
-  UINTN           StringSize;\r
-  UINTN           OptionalDataSize;\r
-  UINT8           *LoadOptionEnd;\r
-\r
-  DriverOrderListSize = 0;\r
-  DriverOrderList     = NULL;\r
-  DriverOptionSize    = 0;\r
-  LoadOptionFromVar   = NULL;\r
-  BOpt_FreeMenu (&DriverOptionMenu);\r
-  InitializeListHead (&DriverOptionMenu.Head);\r
-  //\r
-  // Get the DriverOrder from the Var\r
-  //\r
-  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
-  if (DriverOrderList == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-  \r
-  for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
-    UnicodeSPrint (\r
-      DriverString,\r
-      sizeof (DriverString),\r
-      L"Driver%04x",\r
-      DriverOrderList[Index]\r
-      );\r
-    //\r
-    //  Get all loadoptions from the VAR\r
-    //\r
-    GetEfiGlobalVariable2 (DriverString, (VOID **) &LoadOptionFromVar, &DriverOptionSize);\r
-    if (LoadOptionFromVar == NULL) {\r
-      continue;\r
-    }\r
-\r
-    LoadOption = AllocateZeroPool (DriverOptionSize);\r
-    if (LoadOption == NULL) {\r
-      continue;\r
-    }\r
-\r
-    CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);\r
-    FreePool (LoadOptionFromVar);\r
-\r
-    NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    LoadOptionPtr                       = LoadOption;\r
-    LoadOptionEnd                       = LoadOption + DriverOptionSize;\r
-    NewMenuEntry->OptionNumber          = DriverOrderList[Index];\r
-    NewLoadContext->LoadOptionModified  = FALSE;\r
-    NewLoadContext->Deleted             = FALSE;\r
-    NewLoadContext->IsLegacy            = FALSE;\r
-\r
-    //\r
-    // LoadOption is a pointer type of UINT8\r
-    // for easy use with following LOAD_OPTION\r
-    // embedded in this struct\r
-    //\r
-    NewLoadContext->LoadOption      = LoadOption;\r
-    NewLoadContext->LoadOptionSize  = DriverOptionSize;\r
-\r
-    NewLoadContext->Attributes      = *(UINT32 *) LoadOptionPtr;\r
-    NewLoadContext->IsActive        = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
-\r
-    NewLoadContext->ForceReconnect  = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-    LoadOptionPtr += sizeof (UINT32);\r
-\r
-    NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
-    LoadOptionPtr += sizeof (UINT16);\r
-\r
-    StringSize                  = StrSize ((UINT16 *) LoadOptionPtr);\r
-    NewLoadContext->Description = AllocateZeroPool (StringSize);\r
-    ASSERT (NewLoadContext->Description != NULL);\r
-    CopyMem (\r
-      NewLoadContext->Description,\r
-      (UINT16 *) LoadOptionPtr,\r
-      StringSize\r
-      );\r
-    NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-    NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
-    LoadOptionPtr += StringSize;\r
-\r
-    NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
-    ASSERT (NewLoadContext->FilePathList != NULL);\r
-    CopyMem (\r
-      NewLoadContext->FilePathList,\r
-      (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
-      NewLoadContext->FilePathListLength\r
-      );\r
-\r
-    NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
-    NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
-\r
-    LoadOptionPtr += NewLoadContext->FilePathListLength;\r
-\r
-    if (LoadOptionPtr < LoadOptionEnd) {\r
-      OptionalDataSize = DriverOptionSize -\r
-        sizeof (UINT32) -\r
-        sizeof (UINT16) -\r
-        StringSize -\r
-        NewLoadContext->FilePathListLength;\r
-\r
-      NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
-      ASSERT (NewLoadContext->OptionalData != NULL);\r
-      CopyMem (\r
-        NewLoadContext->OptionalData,\r
-        LoadOptionPtr,\r
-        OptionalDataSize\r
-        );\r
-\r
-      NewLoadContext->OptionalDataSize = OptionalDataSize;\r
-    }\r
-\r
-    InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
-\r
-  }\r
-\r
-  if (DriverOrderList != NULL) {\r
-    FreePool (DriverOrderList);\r
-  }\r
-  DriverOptionMenu.MenuNumber = Index;\r
-  return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
-  Get option number according to Boot#### and BootOrder variable. \r
-  The value is saved as #### + 1.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID  \r
-GetBootOrder (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  BMM_FAKE_NV_DATA          *BmmConfig;\r
-  UINT16                    Index;\r
-  UINT16                    OptionOrderIndex; \r
-  UINTN                     DeviceType;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_LOAD_CONTEXT           *NewLoadContext;  \r
-\r
-  ASSERT (CallbackData != NULL);\r
-  \r
-  DeviceType = (UINTN) -1;   \r
-  BmmConfig  = &CallbackData->BmmFakeNvData;  \r
-  ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder));\r
-  \r
-  for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) &&\r
-       (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0]))));\r
-       Index++) {\r
-    NewMenuEntry   = BOpt_GetMenuEntry (&BootOptionMenu, 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
-      }\r
-    }\r
-    BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
-  }  \r
-}\r
-\r
-/**\r
-  Get driver option order from globalc DriverOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  \r
-**/\r
-VOID  \r
-GetDriverOrder (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  BMM_FAKE_NV_DATA          *BmmConfig;\r
-  UINT16                    Index;\r
-  UINT16                    OptionOrderIndex; \r
-  UINTN                     DeviceType;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_LOAD_CONTEXT           *NewLoadContext;  \r
-\r
-\r
-  ASSERT (CallbackData != NULL);\r
-  \r
-  DeviceType = (UINTN) -1;   \r
-  BmmConfig  = &CallbackData->BmmFakeNvData;  \r
-  ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder));\r
-  \r
-  for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) &&\r
-       (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0]))));\r
-       Index++) {\r
-    NewMenuEntry   = BOpt_GetMenuEntry (&DriverOptionMenu, 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
-      }\r
-    }\r
-    BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
-  }  \r
-}  \r
-\r
-/**\r
-  Boot the file specified by the input file path info.\r
-\r
-  @param FilePath    Point to the file path.\r
-\r
-  @retval TRUE   Exit caller function.\r
-  @retval FALSE  Not exit caller function.\r
-**/\r
-BOOLEAN \r
-BootFromFile (\r
-  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
-  )\r
-{\r
-  EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
-  CHAR16                       *FileName;\r
-\r
-  FileName = ExtractFileNameFromDevicePath(FilePath);\r
-  EfiBootManagerInitializeLoadOption (\r
-    &BootOption,\r
-    0,\r
-    LoadOptionTypeBoot,\r
-    LOAD_OPTION_ACTIVE,\r
-    FileName,\r
-    FilePath,\r
-    NULL,\r
-    0\r
-    );\r
-  //\r
-  // Since current no boot from removable media directly is allowed */\r
-  //\r
-  gST->ConOut->ClearScreen (gST->ConOut);\r
-\r
-  BmmBdsSetConsoleMode (FALSE);\r
-  EfiBootManagerBoot (&BootOption);\r
-  BmmBdsSetConsoleMode (TRUE);\r
-\r
-  FreePool(FileName);\r
-\r
-  EfiBootManagerFreeLoadOption (&BootOption);\r
-\r
-  return FALSE;\r
-}\r
-\r
-/**\r
-  Display the form base on the selected file.\r
-\r
-  @param FilePath   Point to the file path.\r
-  @param FormId     The form need to display.\r
-\r
-**/\r
-BOOLEAN\r
-ReSendForm(\r
-  IN  EFI_DEVICE_PATH_PROTOCOL  *FilePath,\r
-  IN  EFI_FORM_ID               FormId\r
-  )\r
-{\r
-  gBootMaintenancePrivate.LoadContext->FilePathList = FilePath;\r
-\r
-  UpdateOptionPage(&gBootMaintenancePrivate, FormId, FilePath);\r
-\r
-  gBootMaintenancePrivate.FormBrowser2->SendForm (\r
-                         gBootMaintenancePrivate.FormBrowser2,\r
-                         &gBootMaintenancePrivate.BmmHiiHandle,\r
-                         1,\r
-                         &mBootMaintGuid,\r
-                         FormId,\r
-                         NULL,\r
-                         NULL\r
-                         );\r
-  return TRUE;\r
-}\r
-\r
-/**\r
-  Create boot option base on the input file path info.\r
-\r
-  @param FilePath    Point to the file path.\r
-\r
-  @retval TRUE   Exit caller function.\r
-  @retval FALSE  Not exit caller function.\r
-**/\r
-BOOLEAN \r
-CreateBootOptionFromFile (\r
-  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
-  )\r
-{\r
-  return ReSendForm(FilePath, FORM_BOOT_ADD_ID);\r
-}\r
-\r
-/**\r
-  Create driver option base on the input file path info.\r
-\r
-  @param FilePath    Point to the file path.\r
-\r
-  @retval TRUE   Exit caller function.\r
-  @retval FALSE  Not exit caller function.\r
-\r
-**/\r
-BOOLEAN \r
-CreateDriverOptionFromFile (\r
-  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
-  )\r
-{\r
-  return ReSendForm(FilePath, FORM_DRV_ADD_FILE_ID);\r
-}\r
-\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/ConsoleOption.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/ConsoleOption.c
deleted file mode 100644 (file)
index fd48d5d..0000000
+++ /dev/null
@@ -1,1162 +0,0 @@
-/** @file\r
-handles console redirection from boot manager\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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
-  Function compares a device path data structure to that of all the nodes of a\r
-  second device path instance.\r
-\r
-  @param  Multi                 A pointer to a multi-instance device path data\r
-                                structure.\r
-  @param  Single                A pointer to a single-instance device path data\r
-                                structure.\r
-\r
-  @retval TRUE                  If the Single device path is contained within Multi device path.\r
-  @retval FALSE                 The Single device path is not match within Multi device path.\r
-\r
-**/\r
-BOOLEAN\r
-MatchDevicePaths (\r
-  IN  EFI_DEVICE_PATH_PROTOCOL  *Multi,\r
-  IN  EFI_DEVICE_PATH_PROTOCOL  *Single\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathInst;\r
-  UINTN                     Size;\r
-\r
-  if (Multi == NULL || Single  == NULL) {\r
-    return FALSE;\r
-  }\r
-\r
-  DevicePath     = Multi;\r
-  DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
-\r
-  //\r
-  // Search for the match of 'Single' in 'Multi'\r
-  //\r
-  while (DevicePathInst != NULL) {\r
-    //\r
-    // If the single device path is found in multiple device paths,\r
-    // return success\r
-    //\r
-    if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
-      FreePool (DevicePathInst);\r
-      return TRUE;\r
-    }\r
-\r
-    FreePool (DevicePathInst);\r
-    DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/**\r
-  Check whether the device path node is ISA Serial Node.\r
-\r
-  @param Acpi           Device path node to be checked\r
-\r
-  @retval TRUE          It's ISA Serial Node.\r
-  @retval FALSE         It's NOT ISA Serial Node.\r
-\r
-**/\r
-BOOLEAN\r
-IsIsaSerialNode (\r
-  IN ACPI_HID_DEVICE_PATH *Acpi\r
-  )\r
-{\r
-  return (BOOLEAN) (\r
-      (DevicePathType (Acpi) == ACPI_DEVICE_PATH) &&\r
-      (DevicePathSubType (Acpi) == ACPI_DP) &&\r
-      (ReadUnaligned32 (&Acpi->HID) == EISA_PNP_ID (0x0501))\r
-      );\r
-}\r
-\r
-/**\r
-  Update Com Ports attributes from DevicePath\r
-\r
-  @param DevicePath      DevicePath that contains Com ports\r
-\r
-  @retval EFI_SUCCESS   The update is successful.\r
-\r
-**/\r
-EFI_STATUS\r
-UpdateComAttributeFromVariable (\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
-  );\r
-\r
-/**\r
-  Update the multi-instance device path of Terminal Device based on\r
-  the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
-  device path in the Terminal Device in TerminalMenu is also updated.\r
-\r
-  @param DevicePath      The multi-instance device path.\r
-  @param ChangeTerminal  TRUE, then device path in the Terminal Device \r
-                         in TerminalMenu is also updated; FALSE, no update.\r
-\r
-  @return EFI_SUCCESS    The function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-ChangeTerminalDevicePath (\r
-  IN OUT    EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
-  IN        BOOLEAN                   ChangeTerminal\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Node1;\r
-  ACPI_HID_DEVICE_PATH      *Acpi;\r
-  UART_DEVICE_PATH          *Uart;\r
-  UART_DEVICE_PATH          *Uart1;\r
-  UINTN                     Com;\r
-  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-\r
-  Node  = DevicePath;\r
-  Node  = NextDevicePathNode (Node);\r
-  Com   = 0;\r
-  while (!IsDevicePathEnd (Node)) {\r
-    Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
-    if (IsIsaSerialNode (Acpi)) {\r
-      CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
-    }\r
-\r
-    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Com);\r
-\r
-    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
-      Uart = (UART_DEVICE_PATH *) Node;\r
-      CopyMem (\r
-        &Uart->BaudRate,\r
-        &NewTerminalContext->BaudRate,\r
-        sizeof (UINT64)\r
-        );\r
-\r
-      CopyMem (\r
-        &Uart->DataBits,\r
-        &NewTerminalContext->DataBits,\r
-        sizeof (UINT8)\r
-        );\r
-\r
-      CopyMem (\r
-        &Uart->Parity,\r
-        &NewTerminalContext->Parity,\r
-        sizeof (UINT8)\r
-        );\r
-\r
-      CopyMem (\r
-        &Uart->StopBits,\r
-        &NewTerminalContext->StopBits,\r
-        sizeof (UINT8)\r
-        );\r
-      //\r
-      // Change the device path in the ComPort\r
-      //\r
-      if (ChangeTerminal) {\r
-        Node1 = NewTerminalContext->DevicePath;\r
-        Node1 = NextDevicePathNode (Node1);\r
-        while (!IsDevicePathEnd (Node1)) {\r
-          if ((DevicePathType (Node1) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node1) == MSG_UART_DP)) {\r
-            Uart1 = (UART_DEVICE_PATH *) Node1;\r
-            CopyMem (\r
-              &Uart1->BaudRate,\r
-              &NewTerminalContext->BaudRate,\r
-              sizeof (UINT64)\r
-              );\r
-\r
-            CopyMem (\r
-              &Uart1->DataBits,\r
-              &NewTerminalContext->DataBits,\r
-              sizeof (UINT8)\r
-              );\r
-\r
-            CopyMem (\r
-              &Uart1->Parity,\r
-              &NewTerminalContext->Parity,\r
-              sizeof (UINT8)\r
-              );\r
-\r
-            CopyMem (\r
-              &Uart1->StopBits,\r
-              &NewTerminalContext->StopBits,\r
-              sizeof (UINT8)\r
-              );\r
-            break;\r
-          }\r
-          //\r
-          // end if\r
-          //\r
-          Node1 = NextDevicePathNode (Node1);\r
-        }\r
-        //\r
-        // end while\r
-        //\r
-        break;\r
-      }\r
-    }\r
-\r
-    Node = NextDevicePathNode (Node);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
-  Update the device path that describing a terminal device\r
-  based on the new BaudRate, Data Bits, parity and Stop Bits\r
-  set.\r
-\r
-  @param DevicePath terminal device's path\r
-\r
-**/\r
-VOID\r
-ChangeVariableDevicePath (\r
-  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
-  ACPI_HID_DEVICE_PATH      *Acpi;\r
-  UART_DEVICE_PATH          *Uart;\r
-  UINTN                     Com;\r
-  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-\r
-  Node  = DevicePath;\r
-  Node  = NextDevicePathNode (Node);\r
-  Com   = 0;\r
-  while (!IsDevicePathEnd (Node)) {\r
-    Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
-    if (IsIsaSerialNode (Acpi)) {\r
-      CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
-    }\r
-\r
-    if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
-      NewMenuEntry = BOpt_GetMenuEntry (\r
-                      &TerminalMenu,\r
-                      Com\r
-                      );\r
-      ASSERT (NewMenuEntry != NULL);\r
-      NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      Uart                = (UART_DEVICE_PATH *) Node;\r
-      CopyMem (\r
-        &Uart->BaudRate,\r
-        &NewTerminalContext->BaudRate,\r
-        sizeof (UINT64)\r
-        );\r
-\r
-      CopyMem (\r
-        &Uart->DataBits,\r
-        &NewTerminalContext->DataBits,\r
-        sizeof (UINT8)\r
-        );\r
-\r
-      CopyMem (\r
-        &Uart->Parity,\r
-        &NewTerminalContext->Parity,\r
-        sizeof (UINT8)\r
-        );\r
-\r
-      CopyMem (\r
-        &Uart->StopBits,\r
-        &NewTerminalContext->StopBits,\r
-        sizeof (UINT8)\r
-        );\r
-    }\r
-\r
-    Node = NextDevicePathNode (Node);\r
-  }\r
-}\r
-\r
-/**\r
-  Retrieve ACPI UID of UART from device path\r
-\r
-  @param Handle          The handle for the UART device.\r
-  @param AcpiUid         The ACPI UID on output.\r
-\r
-  @retval  TRUE   Find valid UID from device path\r
-  @retval  FALSE  Can't find\r
-\r
-**/\r
-BOOLEAN\r
-RetrieveUartUid (\r
-  IN EFI_HANDLE   Handle,\r
-  IN OUT UINT32   *AcpiUid\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  ACPI_HID_DEVICE_PATH      *Acpi;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  Handle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &DevicePath\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return FALSE;\r
-  }\r
-\r
-  Acpi = NULL;\r
-  for (; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {\r
-    if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (DevicePath) == MSG_UART_DP)) {\r
-      break;\r
-    }\r
-    //\r
-    // Acpi points to the node before the Uart node\r
-    //\r
-    Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;\r
-  }\r
-\r
-  if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
-    if (AcpiUid != NULL) {\r
-      CopyMem (AcpiUid, &Acpi->UID, sizeof (UINT32));\r
-    }\r
-    return TRUE;\r
-  } else {\r
-    return FALSE;\r
-  }\r
-}\r
-\r
-/**\r
-  Sort Uart handles array with Acpi->UID from low to high.\r
-\r
-  @param Handles         EFI_SERIAL_IO_PROTOCOL handle buffer\r
-  @param NoHandles       EFI_SERIAL_IO_PROTOCOL handle count\r
-**/\r
-VOID\r
-SortedUartHandle (\r
-  IN  EFI_HANDLE *Handles,\r
-  IN  UINTN      NoHandles\r
-  )\r
-{\r
-  UINTN       Index1;\r
-  UINTN       Index2;\r
-  UINTN       Position;\r
-  UINT32      AcpiUid1;\r
-  UINT32      AcpiUid2;\r
-  UINT32      TempAcpiUid;\r
-  EFI_HANDLE  TempHandle;\r
-\r
-  for (Index1 = 0; Index1 < NoHandles-1; Index1++) {\r
-    if (!RetrieveUartUid (Handles[Index1], &AcpiUid1)) {\r
-      continue;\r
-    }\r
-    TempHandle  = Handles[Index1];\r
-    Position    = Index1;\r
-    TempAcpiUid = AcpiUid1;\r
-\r
-    for (Index2 = Index1+1; Index2 < NoHandles; Index2++) {\r
-      if (!RetrieveUartUid (Handles[Index2], &AcpiUid2)) {\r
-        continue;\r
-      }\r
-      if (AcpiUid2 < TempAcpiUid) {\r
-        TempAcpiUid = AcpiUid2;\r
-        TempHandle  = Handles[Index2];\r
-        Position    = Index2;\r
-      }\r
-    }\r
-    Handles[Position] = Handles[Index1];\r
-    Handles[Index1]   = TempHandle;\r
-  }\r
-}\r
-\r
-/**\r
-  Test whether DevicePath is a valid Terminal\r
-\r
-\r
-  @param DevicePath      DevicePath to be checked\r
-  @param Termi           If DevicePath is valid Terminal, terminal type is returned.\r
-  @param Com             If DevicePath is valid Terminal, Com Port type is returned.\r
-\r
-  @retval  TRUE         If DevicePath point to a Terminal.\r
-  @retval  FALSE        If DevicePath does not point to a Terminal.\r
-\r
-**/\r
-BOOLEAN\r
-IsTerminalDevicePath (\r
-  IN  EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
-  OUT TYPE_OF_TERMINAL         *Termi,\r
-  OUT UINTN                    *Com\r
-  );\r
-\r
-/**\r
-  Build a list containing all serial devices.\r
-\r
-\r
-  @retval EFI_SUCCESS The function complete successfully.\r
-  @retval EFI_UNSUPPORTED No serial ports present.\r
-\r
-**/\r
-EFI_STATUS\r
-LocateSerialIo (\r
-  VOID\r
-  )\r
-{\r
-  UINTN                     Index;\r
-  UINTN                     Index2;\r
-  UINTN                     NoHandles;\r
-  EFI_HANDLE                *Handles;\r
-  EFI_STATUS                Status;\r
-  ACPI_HID_DEVICE_PATH      *Acpi;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  EFI_SERIAL_IO_PROTOCOL    *SerialIo;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
-  EFI_DEVICE_PATH_PROTOCOL  *OutDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *InpDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *ErrDevicePath;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
-  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;\r
-  VENDOR_DEVICE_PATH        Vendor;\r
-\r
-  //\r
-  // Get all handles that have SerialIo protocol installed\r
-  //\r
-  InitializeListHead (&TerminalMenu.Head);\r
-  TerminalMenu.MenuNumber = 0;\r
-  Status = gBS->LocateHandleBuffer (\r
-                  ByProtocol,\r
-                  &gEfiSerialIoProtocolGuid,\r
-                  NULL,\r
-                  &NoHandles,\r
-                  &Handles\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // No serial ports present\r
-    //\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  //\r
-  // Sort Uart handles array with Acpi->UID from low to high\r
-  // then Terminal menu can be built from low Acpi->UID to high Acpi->UID\r
-  //\r
-  SortedUartHandle (Handles, NoHandles);\r
-\r
-  for (Index = 0; Index < NoHandles; Index++) {\r
-    //\r
-    // Check to see whether the handle has DevicePath Protocol installed\r
-    //\r
-    gBS->HandleProtocol (\r
-          Handles[Index],\r
-          &gEfiDevicePathProtocolGuid,\r
-          (VOID **) &DevicePath\r
-          );\r
-\r
-    Acpi = NULL;\r
-    for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
-      if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
-        break;\r
-      }\r
-      //\r
-      // Acpi points to the node before Uart node\r
-      //\r
-      Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
-    }\r
-\r
-    if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
-      NewMenuEntry = BOpt_CreateMenuEntry (BM_TERMINAL_CONTEXT_SELECT);\r
-      if (NewMenuEntry == NULL) {\r
-        FreePool (Handles);\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-\r
-      NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      CopyMem (&NewMenuEntry->OptionNumber, &Acpi->UID, sizeof (UINT32));\r
-      NewTerminalContext->DevicePath = DuplicateDevicePath (DevicePath);\r
-      //\r
-      // BugBug: I have no choice, calling EfiLibStrFromDatahub will hang the system!\r
-      // coz' the misc data for each platform is not correct, actually it's the device path stored in\r
-      // datahub which is not completed, so a searching for end of device path will enter a\r
-      // dead-loop.\r
-      //\r
-      NewMenuEntry->DisplayString = EfiLibStrFromDatahub (DevicePath);\r
-      if (NULL == NewMenuEntry->DisplayString) {\r
-        NewMenuEntry->DisplayString = UiDevicePathToStr (DevicePath);\r
-      }\r
-\r
-      NewMenuEntry->HelpString = NULL;\r
-\r
-      NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
-      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
-\r
-      gBS->HandleProtocol (\r
-            Handles[Index],\r
-            &gEfiSerialIoProtocolGuid,\r
-            (VOID **) &SerialIo\r
-            );\r
-\r
-      CopyMem (\r
-        &NewTerminalContext->BaudRate,\r
-        &SerialIo->Mode->BaudRate,\r
-        sizeof (UINT64)\r
-        );\r
-\r
-      CopyMem (\r
-        &NewTerminalContext->DataBits,\r
-        &SerialIo->Mode->DataBits,\r
-        sizeof (UINT8)\r
-        );\r
-\r
-      CopyMem (\r
-        &NewTerminalContext->Parity,\r
-        &SerialIo->Mode->Parity,\r
-        sizeof (UINT8)\r
-        );\r
-\r
-      CopyMem (\r
-        &NewTerminalContext->StopBits,\r
-        &SerialIo->Mode->StopBits,\r
-        sizeof (UINT8)\r
-        );\r
-      InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
-      TerminalMenu.MenuNumber++;\r
-    }\r
-  }\r
-  if (Handles != NULL) {\r
-    FreePool (Handles);\r
-  }\r
-\r
-  //\r
-  // Get L"ConOut", L"ConIn" and L"ErrOut" from the Var\r
-  //\r
-  GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
-  GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
-  GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
-  if (OutDevicePath != NULL) {\r
-    UpdateComAttributeFromVariable (OutDevicePath);\r
-  }\r
-\r
-  if (InpDevicePath != NULL) {\r
-    UpdateComAttributeFromVariable (InpDevicePath);\r
-  }\r
-\r
-  if (ErrDevicePath != NULL) {\r
-    UpdateComAttributeFromVariable (ErrDevicePath);\r
-  }\r
-\r
-  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    NewTerminalContext                = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    NewTerminalContext->TerminalType  = 0;\r
-    NewTerminalContext->IsConIn       = FALSE;\r
-    NewTerminalContext->IsConOut      = FALSE;\r
-    NewTerminalContext->IsStdErr      = FALSE;\r
-\r
-    Vendor.Header.Type                = MESSAGING_DEVICE_PATH;\r
-    Vendor.Header.SubType             = MSG_VENDOR_DP;\r
-\r
-    for (Index2 = 0; Index2 < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])); Index2++) {\r
-      CopyMem (&Vendor.Guid, &TerminalTypeGuid[Index2], sizeof (EFI_GUID));\r
-      SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
-      NewDevicePath = AppendDevicePathNode (\r
-                        NewTerminalContext->DevicePath,\r
-                        (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
-                        );\r
-      if (NewMenuEntry->HelpString != NULL) {\r
-        FreePool (NewMenuEntry->HelpString);\r
-      }\r
-      //\r
-      // NewMenuEntry->HelpString = UiDevicePathToStr (NewDevicePath);\r
-      // NewMenuEntry->DisplayString = NewMenuEntry->HelpString;\r
-      //\r
-      NewMenuEntry->HelpString = NULL;\r
-\r
-      NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
-      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
-\r
-      if (MatchDevicePaths (OutDevicePath, NewDevicePath)) {\r
-        NewTerminalContext->IsConOut      = TRUE;\r
-        NewTerminalContext->TerminalType  = (UINT8) Index2;\r
-      }\r
-\r
-      if (MatchDevicePaths (InpDevicePath, NewDevicePath)) {\r
-        NewTerminalContext->IsConIn       = TRUE;\r
-        NewTerminalContext->TerminalType  = (UINT8) Index2;\r
-      }\r
-\r
-      if (MatchDevicePaths (ErrDevicePath, NewDevicePath)) {\r
-        NewTerminalContext->IsStdErr      = TRUE;\r
-        NewTerminalContext->TerminalType  = (UINT8) Index2;\r
-      }\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Update Com Ports attributes from DevicePath\r
-\r
-  @param DevicePath      DevicePath that contains Com ports\r
-\r
-  @retval EFI_SUCCESS   The update is successful.\r
-  @retval EFI_NOT_FOUND Can not find specific menu entry\r
-**/\r
-EFI_STATUS\r
-UpdateComAttributeFromVariable (\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
-  EFI_DEVICE_PATH_PROTOCOL  *SerialNode;\r
-  ACPI_HID_DEVICE_PATH      *Acpi;\r
-  UART_DEVICE_PATH          *Uart;\r
-  UART_DEVICE_PATH          *Uart1;\r
-  UINTN                     TerminalNumber;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
-  UINTN                     Index;\r
-\r
-  Node            = DevicePath;\r
-  Node            = NextDevicePathNode (Node);\r
-  TerminalNumber  = 0;\r
-  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-    while (!IsDevicePathEnd (Node)) {\r
-      Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
-      if (IsIsaSerialNode (Acpi)) {\r
-        CopyMem (&TerminalNumber, &Acpi->UID, sizeof (UINT32));\r
-      }\r
-\r
-      if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
-        Uart          = (UART_DEVICE_PATH *) Node;\r
-        NewMenuEntry  = BOpt_GetMenuEntry (&TerminalMenu, TerminalNumber);\r
-        if (NULL == NewMenuEntry) {\r
-          return EFI_NOT_FOUND;\r
-        }\r
-\r
-        NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-        CopyMem (\r
-          &NewTerminalContext->BaudRate,\r
-          &Uart->BaudRate,\r
-          sizeof (UINT64)\r
-          );\r
-\r
-        CopyMem (\r
-          &NewTerminalContext->DataBits,\r
-          &Uart->DataBits,\r
-          sizeof (UINT8)\r
-          );\r
-\r
-        CopyMem (\r
-          &NewTerminalContext->Parity,\r
-          &Uart->Parity,\r
-          sizeof (UINT8)\r
-          );\r
-\r
-        CopyMem (\r
-          &NewTerminalContext->StopBits,\r
-          &Uart->StopBits,\r
-          sizeof (UINT8)\r
-          );\r
-\r
-        SerialNode  = NewTerminalContext->DevicePath;\r
-        SerialNode  = NextDevicePathNode (SerialNode);\r
-        while (!IsDevicePathEnd (SerialNode)) {\r
-          if ((DevicePathType (SerialNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (SerialNode) == MSG_UART_DP)) {\r
-            //\r
-            // Update following device paths according to\r
-            // previous acquired uart attributes\r
-            //\r
-            Uart1 = (UART_DEVICE_PATH *) SerialNode;\r
-            CopyMem (\r
-              &Uart1->BaudRate,\r
-              &NewTerminalContext->BaudRate,\r
-              sizeof (UINT64)\r
-              );\r
-\r
-            CopyMem (\r
-              &Uart1->DataBits,\r
-              &NewTerminalContext->DataBits,\r
-              sizeof (UINT8)\r
-              );\r
-            CopyMem (\r
-              &Uart1->Parity,\r
-              &NewTerminalContext->Parity,\r
-              sizeof (UINT8)\r
-              );\r
-            CopyMem (\r
-              &Uart1->StopBits,\r
-              &NewTerminalContext->StopBits,\r
-              sizeof (UINT8)\r
-              );\r
-\r
-            break;\r
-          }\r
-\r
-          SerialNode = NextDevicePathNode (SerialNode);\r
-        }\r
-        //\r
-        // end while\r
-        //\r
-      }\r
-\r
-      Node = NextDevicePathNode (Node);\r
-    }\r
-    //\r
-    // end while\r
-    //\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Build up Console Menu based on types passed in. The type can\r
-  be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
-  and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
-\r
-  @param ConsoleMenuType Can be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
-                         and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
-\r
-  @retval EFI_UNSUPPORTED The type passed in is not in the 3 types defined.\r
-  @retval EFI_NOT_FOUND   If the EFI Variable defined in UEFI spec with name "ConOutDev", \r
-                          "ConInDev" or "ConErrDev" doesn't exists.\r
-  @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operations.\r
-  @retval EFI_SUCCESS          Function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-GetConsoleMenu (\r
-  IN UINTN              ConsoleMenuType\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *AllDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *MultiDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePathInst;\r
-  UINTN                     Size;\r
-  UINTN                     AllCount;\r
-  UINTN                     Index;\r
-  UINTN                     Index2;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_CONSOLE_CONTEXT        *NewConsoleContext;\r
-  TYPE_OF_TERMINAL          Terminal;\r
-  UINTN                     Com;\r
-  BM_MENU_OPTION            *ConsoleMenu;\r
-\r
-  DevicePath    = NULL;\r
-  AllDevicePath = NULL;\r
-  AllCount      = 0;\r
-  switch (ConsoleMenuType) {\r
-  case BM_CONSOLE_IN_CONTEXT_SELECT:\r
-    ConsoleMenu   = &ConsoleInpMenu;\r
-    GetEfiGlobalVariable2 (L"ConIn", (VOID**)&DevicePath, NULL);\r
-    GetEfiGlobalVariable2 (L"ConInDev", (VOID**)&AllDevicePath, NULL);\r
-    break;\r
-\r
-  case BM_CONSOLE_OUT_CONTEXT_SELECT:\r
-    ConsoleMenu   = &ConsoleOutMenu;\r
-    GetEfiGlobalVariable2 (L"ConOut", (VOID**)&DevicePath, NULL);\r
-    GetEfiGlobalVariable2 (L"ConOutDev", (VOID**)&AllDevicePath, NULL);\r
-    break;\r
-\r
-  case BM_CONSOLE_ERR_CONTEXT_SELECT:\r
-    ConsoleMenu   = &ConsoleErrMenu;\r
-    GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&DevicePath, NULL);\r
-    GetEfiGlobalVariable2 (L"ErrOutDev", (VOID**)&AllDevicePath, NULL);\r
-    break;\r
-\r
-  default:\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (NULL == AllDevicePath) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  InitializeListHead (&ConsoleMenu->Head);\r
-\r
-  AllCount                = EfiDevicePathInstanceCount (AllDevicePath);\r
-  ConsoleMenu->MenuNumber = 0;\r
-  //\r
-  // Following is menu building up for Console Devices selected.\r
-  //\r
-  MultiDevicePath = AllDevicePath;\r
-  Index2          = 0;\r
-  for (Index = 0; Index < AllCount; Index++) {\r
-    DevicePathInst  = GetNextDevicePathInstance (&MultiDevicePath, &Size);\r
-\r
-    NewMenuEntry    = BOpt_CreateMenuEntry (BM_CONSOLE_CONTEXT_SELECT);\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    NewConsoleContext             = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    NewMenuEntry->OptionNumber    = Index2;\r
-\r
-    NewConsoleContext->DevicePath = DuplicateDevicePath (DevicePathInst);\r
-    ASSERT (NewConsoleContext->DevicePath != NULL);\r
-    NewMenuEntry->DisplayString   = EfiLibStrFromDatahub (NewConsoleContext->DevicePath);\r
-    if (NULL == NewMenuEntry->DisplayString) {\r
-      NewMenuEntry->DisplayString = UiDevicePathToStr (NewConsoleContext->DevicePath);\r
-    }\r
-\r
-    NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
-    if (NULL == NewMenuEntry->HelpString) {\r
-      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
-    } else {\r
-      NewMenuEntry->HelpStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
-    }\r
-\r
-    NewConsoleContext->IsTerminal = IsTerminalDevicePath (\r
-                                      NewConsoleContext->DevicePath,\r
-                                      &Terminal,\r
-                                      &Com\r
-                                      );\r
-\r
-    NewConsoleContext->IsActive = MatchDevicePaths (\r
-                                    DevicePath,\r
-                                    NewConsoleContext->DevicePath\r
-                                    );\r
-\r
-    if (NewConsoleContext->IsTerminal) {\r
-      BOpt_DestroyMenuEntry (NewMenuEntry);\r
-    } else {\r
-      Index2++;\r
-      ConsoleMenu->MenuNumber++;\r
-      InsertTailList (&ConsoleMenu->Head, &NewMenuEntry->Link);\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
-  @retval EFI_SUCCESS    The function always complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-GetAllConsoles (\r
-  VOID\r
-  )\r
-{\r
-  GetConsoleMenu (BM_CONSOLE_IN_CONTEXT_SELECT);\r
-  GetConsoleMenu (BM_CONSOLE_OUT_CONTEXT_SELECT);\r
-  GetConsoleMenu (BM_CONSOLE_ERR_CONTEXT_SELECT);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
-  @retval EFI_SUCCESS    The function always complete successfully.\r
-**/\r
-EFI_STATUS\r
-FreeAllConsoles (\r
-  VOID\r
-  )\r
-{\r
-  BOpt_FreeMenu (&ConsoleOutMenu);\r
-  BOpt_FreeMenu (&ConsoleInpMenu);\r
-  BOpt_FreeMenu (&ConsoleErrMenu);\r
-  BOpt_FreeMenu (&TerminalMenu);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Test whether DevicePath is a valid Terminal\r
-\r
-\r
-  @param DevicePath      DevicePath to be checked\r
-  @param Termi           If DevicePath is valid Terminal, terminal type is returned.\r
-  @param Com             If DevicePath is valid Terminal, Com Port type is returned.\r
-\r
-  @retval  TRUE         If DevicePath point to a Terminal.\r
-  @retval  FALSE        If DevicePath does not point to a Terminal.\r
-\r
-**/\r
-BOOLEAN\r
-IsTerminalDevicePath (\r
-  IN  EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
-  OUT TYPE_OF_TERMINAL         *Termi,\r
-  OUT UINTN                    *Com\r
-  )\r
-{\r
-  BOOLEAN                   IsTerminal;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
-  VENDOR_DEVICE_PATH        *Vendor;\r
-  UART_DEVICE_PATH          *Uart;\r
-  ACPI_HID_DEVICE_PATH      *Acpi;\r
-\r
-  IsTerminal = FALSE;\r
-\r
-  Uart   = NULL;\r
-  Vendor = NULL;\r
-  Acpi   = NULL;\r
-  for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
-    //\r
-    // Vendor points to the node before the End node\r
-    //\r
-    Vendor = (VENDOR_DEVICE_PATH *) Node;\r
-\r
-    if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
-      Uart = (UART_DEVICE_PATH *) Node;\r
-    }\r
-\r
-    if (Uart == NULL) {\r
-      //\r
-      // Acpi points to the node before the UART node\r
-      //\r
-      Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
-    }\r
-  }\r
-\r
-  if (Vendor == NULL ||\r
-      DevicePathType (Vendor) != MESSAGING_DEVICE_PATH ||\r
-      DevicePathSubType (Vendor) != MSG_VENDOR_DP ||\r
-      Uart == NULL) {\r
-    return FALSE;\r
-  }\r
-\r
-  //\r
-  // There are four kinds of Terminal types\r
-  // check to see whether this devicepath\r
-  // is one of that type\r
-  //\r
-  if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[0])) {\r
-    *Termi      = TerminalTypePcAnsi;\r
-    IsTerminal  = TRUE;\r
-  } else {\r
-    if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[1])) {\r
-      *Termi      = TerminalTypeVt100;\r
-      IsTerminal  = TRUE;\r
-    } else {\r
-      if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[2])) {\r
-        *Termi      = TerminalTypeVt100Plus;\r
-        IsTerminal  = TRUE;\r
-      } else {\r
-        if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[3])) {\r
-          *Termi      = TerminalTypeVtUtf8;\r
-          IsTerminal  = TRUE;\r
-        } else {\r
-          if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[4])) {\r
-            *Termi      = TerminalTypeTtyTerm;\r
-            IsTerminal  = TRUE;\r
-          } else {\r
-            IsTerminal = FALSE;\r
-          }\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  if (!IsTerminal) {\r
-    return FALSE;\r
-  }\r
-\r
-  if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
-    CopyMem (Com, &Acpi->UID, sizeof (UINT32));\r
-  } else {\r
-    return FALSE;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-/**\r
-  Get mode number according to column and row\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-GetConsoleOutMode (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  UINTN                         Col;\r
-  UINTN                         Row;\r
-  UINTN                         CurrentCol;\r
-  UINTN                         CurrentRow;\r
-  UINTN                         Mode;\r
-  UINTN                         MaxMode;\r
-  EFI_STATUS                    Status;\r
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;\r
-\r
-  ConOut   = gST->ConOut;\r
-  MaxMode  = (UINTN) (ConOut->Mode->MaxMode);\r
-\r
-  CurrentCol = PcdGet32 (PcdSetupConOutColumn);\r
-  CurrentRow = PcdGet32 (PcdSetupConOutRow);\r
-  for (Mode = 0; Mode < MaxMode; Mode++) {\r
-    Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
-    if (!EFI_ERROR(Status)) {\r
-      if (CurrentCol == Col && CurrentRow == Row) {\r
-        CallbackData->BmmFakeNvData.ConsoleOutMode = (UINT16) Mode;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-\r
-  Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
-  in BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/  \r
-VOID  \r
-GetConsoleInCheck (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  UINT16              Index;\r
-  BM_MENU_ENTRY       *NewMenuEntry; \r
-  UINT8               *ConInCheck;\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-\r
-  ASSERT (CallbackData != NULL);\r
-\r
-  ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
-  for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
-       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
-    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
-    ConInCheck[Index] = NewConsoleContext->IsActive;\r
-  }\r
-}\r
-\r
-/**\r
-\r
-  Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
-  in BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/      \r
-VOID    \r
-GetConsoleOutCheck (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  UINT16              Index;\r
-  BM_MENU_ENTRY       *NewMenuEntry; \r
-  UINT8               *ConOutCheck;\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-  \r
-  ASSERT (CallbackData != NULL);\r
-  ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
-  for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
-       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
-    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
-    ConOutCheck[Index] = NewConsoleContext->IsActive;\r
-  }\r
-}\r
-\r
-/**\r
-\r
-  Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
-  in BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/        \r
-VOID  \r
-GetConsoleErrCheck (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  UINT16              Index;\r
-  BM_MENU_ENTRY       *NewMenuEntry; \r
-  UINT8               *ConErrCheck;\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-\r
-  ASSERT (CallbackData != NULL);\r
-  ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
-  for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
-       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
-    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
-    ConErrCheck[Index] = NewConsoleContext->IsActive;\r
-  }\r
-}\r
-\r
-/**\r
-\r
-  Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
-  to BMM_FAKE_NV_DATA structure.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID  \r
-GetTerminalAttribute (\r
-  IN  BMM_CALLBACK_DATA    *CallbackData\r
-  )\r
-{\r
-  BMM_FAKE_NV_DATA     *CurrentFakeNVMap;\r
-  BM_MENU_ENTRY        *NewMenuEntry;\r
-  BM_TERMINAL_CONTEXT  *NewTerminalContext;    \r
-  UINT16               TerminalIndex;  \r
-  UINT8                AttributeIndex;\r
-\r
-  ASSERT (CallbackData != NULL);\r
-\r
-  CurrentFakeNVMap = &CallbackData->BmmFakeNvData;     \r
-  for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
-       (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) {  \r
-    NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
-    NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-    for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
-      if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
-        NewTerminalContext->BaudRateIndex = AttributeIndex;\r
-        break;\r
-      }\r
-    }\r
-    for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) {\r
-      if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
-        NewTerminalContext->DataBitsIndex = AttributeIndex;\r
-        break;\r
-      }\r
-    }    \r
-\r
-    for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) {\r
-      if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
-        NewTerminalContext->ParityIndex = AttributeIndex;\r
-        break;\r
-      }\r
-    }\r
-\r
-    for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) {\r
-      if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
-        NewTerminalContext->StopBitsIndex = AttributeIndex;\r
-        break;\r
-      }\r
-    }\r
-    CurrentFakeNVMap->COMBaudRate[TerminalIndex]     = NewTerminalContext->BaudRateIndex;\r
-    CurrentFakeNVMap->COMDataRate[TerminalIndex]     = NewTerminalContext->DataBitsIndex;\r
-    CurrentFakeNVMap->COMStopBits[TerminalIndex]     = NewTerminalContext->StopBitsIndex;\r
-    CurrentFakeNVMap->COMParity[TerminalIndex]       = NewTerminalContext->ParityIndex; \r
-    CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
-    CurrentFakeNVMap->COMFlowControl[TerminalIndex]  = NewTerminalContext->FlowControl;\r
-  }\r
-}\r
-\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/Data.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/Data.c
deleted file mode 100644 (file)
index 4257e1a..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-/** @file\r
-Define some data used for Boot Maint\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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-VOID                *mStartOpCodeHandle = NULL;\r
-VOID                *mEndOpCodeHandle = NULL;\r
-EFI_IFR_GUID_LABEL  *mStartLabel = NULL;\r
-EFI_IFR_GUID_LABEL  *mEndLabel = NULL;\r
-\r
-///\r
-/// Terminal type string token storage\r
-///\r
-UINT16              TerminalType[] = {\r
-  STRING_TOKEN(STR_COM_TYPE_0),\r
-  STRING_TOKEN(STR_COM_TYPE_1),\r
-  STRING_TOKEN(STR_COM_TYPE_2),\r
-  STRING_TOKEN(STR_COM_TYPE_3),\r
-  STRING_TOKEN(STR_COM_TYPE_4),\r
-};\r
-\r
-///\r
-/// Flow Control type string token storage\r
-///\r
-UINT16              mFlowControlType[2] = {\r
-  STRING_TOKEN(STR_NONE_FLOW_CONTROL),\r
-  STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL)\r
-};\r
-\r
-UINT32              mFlowControlValue[2] = {\r
-  0,\r
-  UART_FLOW_CONTROL_HARDWARE\r
-};\r
-\r
-///\r
-/// Console Input Device Selection Menu\r
-///\r
-BM_MENU_OPTION      ConsoleInpMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-///\r
-/// Console Output Device Selection Menu\r
-///\r
-BM_MENU_OPTION      ConsoleOutMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-///\r
-/// Error Output Device Selection Menu\r
-///\r
-BM_MENU_OPTION      ConsoleErrMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-///\r
-/// Boot Option from variable Menu\r
-///\r
-BM_MENU_OPTION      BootOptionMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-///\r
-/// Driver Option from variable menu\r
-///\r
-BM_MENU_OPTION      DriverOptionMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-///\r
-/// Handles in current system selection menu\r
-///\r
-BM_MENU_OPTION      DriverMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-BM_MENU_OPTION      TerminalMenu = {\r
-  BM_MENU_OPTION_SIGNATURE,\r
-  {NULL},\r
-  0\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for BaudRate\r
-///\r
-COM_ATTR            BaudRateList[19] = {\r
-  {\r
-    115200,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_0)\r
-  },\r
-  {\r
-    57600,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_1)\r
-  },\r
-  {\r
-    38400,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_2)\r
-  },\r
-  {\r
-    19200,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_3)\r
-  },\r
-  {\r
-    9600,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_4)\r
-  },\r
-  {\r
-    7200,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_5)\r
-  },\r
-  {\r
-    4800,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_6)\r
-  },\r
-  {\r
-    3600,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_7)\r
-  },\r
-  {\r
-    2400,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_8)\r
-  },\r
-  {\r
-    2000,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_9)\r
-  },\r
-  {\r
-    1800,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_10)\r
-  },\r
-  {\r
-    1200,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_11)\r
-  },\r
-  {\r
-    600,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_12)\r
-  },\r
-  {\r
-    300,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_13)\r
-  },\r
-  {\r
-    150,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_14)\r
-  },\r
-  {\r
-    134,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_15)\r
-  },\r
-  {\r
-    110,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_16)\r
-  },\r
-  {\r
-    75,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_17)\r
-  },\r
-  {\r
-    50,\r
-    STRING_TOKEN(STR_COM_BAUD_RATE_18)\r
-  }\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for DataBits\r
-///\r
-COM_ATTR            DataBitsList[4] = {\r
-  {\r
-    5,\r
-    STRING_TOKEN(STR_COM_DATA_BITS_0)\r
-  },\r
-  {\r
-    6,\r
-    STRING_TOKEN(STR_COM_DATA_BITS_1)\r
-  },\r
-  {\r
-    7,\r
-    STRING_TOKEN(STR_COM_DATA_BITS_2)\r
-  },\r
-  {\r
-    8,\r
-    STRING_TOKEN(STR_COM_DATA_BITS_3)\r
-  }\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for Parity\r
-///\r
-COM_ATTR            ParityList[5] = {\r
-  {\r
-    NoParity,\r
-    STRING_TOKEN(STR_COM_PAR_0)\r
-  },\r
-  {\r
-    EvenParity,\r
-    STRING_TOKEN(STR_COM_PAR_1)\r
-  },\r
-  {\r
-    OddParity,\r
-    STRING_TOKEN(STR_COM_PAR_2)\r
-  },\r
-  {\r
-    MarkParity,\r
-    STRING_TOKEN(STR_COM_PAR_3)\r
-  },\r
-  {\r
-    SpaceParity,\r
-    STRING_TOKEN(STR_COM_PAR_4)\r
-  }\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for Baudreate\r
-///\r
-COM_ATTR            StopBitsList[3] = {\r
-  {\r
-    OneStopBit,\r
-    STRING_TOKEN(STR_COM_STOP_BITS_0)\r
-  },\r
-  {\r
-    OneFiveStopBits,\r
-    STRING_TOKEN(STR_COM_STOP_BITS_1)\r
-  },\r
-  {\r
-    TwoStopBits,\r
-    STRING_TOKEN(STR_COM_STOP_BITS_2)\r
-  }\r
-};\r
-\r
-///\r
-/// Guid for messaging path, used in Serial port setting.\r
-///\r
-EFI_GUID            TerminalTypeGuid[] = {\r
-  DEVICE_PATH_MESSAGING_PC_ANSI,\r
-  DEVICE_PATH_MESSAGING_VT_100,\r
-  DEVICE_PATH_MESSAGING_VT_100_PLUS,\r
-  DEVICE_PATH_MESSAGING_VT_UTF8,\r
-  EFI_TTY_TERM_GUID\r
-};\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/FormGuid.h b/MdeModulePkg/Library/BootMaintenanceManagerLib/FormGuid.h
deleted file mode 100644 (file)
index cf14b40..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/** @file\r
-Formset guids, form id and VarStore data structure for Boot Maintenance Manager.\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
-\r
-**/\r
-#ifndef _FORM_GUID_H_\r
-#define _FORM_GUID_H_\r
-\r
-#define BOOT_MAINT_FORMSET_GUID \\r
-  { \\r
-  0x642237c7, 0x35d4, 0x472d, {0x83, 0x65, 0x12, 0xe0, 0xcc, 0xf2, 0x7a, 0x22} \\r
-  }\r
-\r
-#define FORM_MAIN_ID                         0x1001\r
-#define FORM_BOOT_ADD_ID                     0x1002\r
-#define FORM_BOOT_DEL_ID                     0x1003\r
-#define FORM_BOOT_CHG_ID                     0x1004\r
-#define FORM_DRV_ADD_ID                      0x1005\r
-#define FORM_DRV_DEL_ID                      0x1006\r
-#define FORM_DRV_CHG_ID                      0x1007\r
-#define FORM_CON_MAIN_ID                     0x1008\r
-#define FORM_CON_IN_ID                       0x1009\r
-#define FORM_CON_OUT_ID                      0x100A\r
-#define FORM_CON_ERR_ID                      0x100B\r
-#define FORM_FILE_SEEK_ID                    0x100C\r
-#define FORM_FILE_NEW_SEEK_ID                0x100D\r
-#define FORM_DRV_ADD_FILE_ID                 0x100E\r
-#define FORM_DRV_ADD_HANDLE_ID               0x100F\r
-#define FORM_DRV_ADD_HANDLE_DESC_ID          0x1010\r
-#define FORM_BOOT_NEXT_ID                    0x1011\r
-#define FORM_TIME_OUT_ID                     0x1012\r
-#define FORM_BOOT_SETUP_ID                   0x1014\r
-#define FORM_DRIVER_SETUP_ID                 0x1015\r
-#define FORM_BOOT_LEGACY_DEVICE_ID           0x1016\r
-#define FORM_CON_COM_ID                      0x1017\r
-#define FORM_CON_COM_SETUP_ID                0x1018\r
-#define FORM_BOOT_ADD_DESCRIPTION_ID         0x101F\r
-#define FORM_DRIVER_ADD_FILE_DESCRIPTION_ID  0x1020\r
-#define FORM_CON_MODE_ID                     0x1021\r
-#define FORM_MEMORY_CHECK_ID                 0x1022\r
-#define FORM_UEFI_OPTIMIZED_BOOT_ID          0x1023\r
-#define FORM_BOOT_FROM_FILE_ID               0x1024\r
-\r
-\r
-#define MAXIMUM_FORM_ID                      0x10FF\r
-\r
-#define KEY_VALUE_COM_SET_BAUD_RATE          0x1101\r
-#define KEY_VALUE_COM_SET_DATA_BITS          0x1102\r
-#define KEY_VALUE_COM_SET_STOP_BITS          0x1103\r
-#define KEY_VALUE_COM_SET_PARITY             0x1104\r
-#define KEY_VALUE_COM_SET_TERMI_TYPE         0x1105\r
-#define KEY_VALUE_MAIN_BOOT_NEXT             0x1106\r
-#define KEY_VALUE_BOOT_ADD_DESC_DATA         0x1107\r
-#define KEY_VALUE_BOOT_ADD_OPT_DATA          0x1108\r
-#define KEY_VALUE_DRIVER_ADD_DESC_DATA       0x1109\r
-#define KEY_VALUE_DRIVER_ADD_OPT_DATA        0x110A\r
-#define KEY_VALUE_SAVE_AND_EXIT              0x110B\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT           0x110C\r
-#define KEY_VALUE_BOOT_FROM_FILE             0x110D\r
-#define FORM_RESET                           0x110E\r
-#define KEY_VALUE_BOOT_DESCRIPTION           0x110F\r
-#define KEY_VALUE_BOOT_OPTION                0x1110\r
-#define KEY_VALUE_DRIVER_DESCRIPTION         0x1111\r
-#define KEY_VALUE_DRIVER_OPTION              0x1112\r
-#define KEY_VALUE_SAVE_AND_EXIT_BOOT         0x1113\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT_BOOT      0x1114\r
-#define KEY_VALUE_SAVE_AND_EXIT_DRIVER       0x1115\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER    0x1116\r
-\r
-#define MAXIMUM_NORMAL_KEY_VALUE             0x11FF\r
-\r
-//\r
-// Varstore ID defined for Buffer Storage\r
-//\r
-#define VARSTORE_ID_BOOT_MAINT               0x1000\r
-\r
-//\r
-// End Label\r
-//\r
-#define LABEL_BMM_PLATFORM_INFORMATION       0xfffe\r
-#define LABEL_END                            0xffff\r
-#define MAX_MENU_NUMBER                      100\r
-\r
-///\r
-/// This is the structure that will be used to store the\r
-/// question's current value. Use it at initialize time to\r
-/// set default value for each question. When using at run\r
-/// time, this map is returned by the callback function,\r
-/// so dynamically changing the question's value will be\r
-/// possible through this mechanism\r
-///\r
-typedef struct {\r
-  //\r
-  // Three questions displayed at the main page\r
-  // for Timeout, BootNext, Variables respectively\r
-  //\r
-  UINT16  BootTimeOut;\r
-  UINT32  BootNext;\r
-\r
-  //\r
-  // This is the COM1 Attributes value storage\r
-  //\r
-  UINT8   COM1BaudRate;\r
-  UINT8   COM1DataRate;\r
-  UINT8   COM1StopBits;\r
-  UINT8   COM1Parity;\r
-  UINT8   COM1TerminalType;\r
-\r
-  //\r
-  // This is the COM2 Attributes value storage\r
-  //\r
-  UINT8   COM2BaudRate;\r
-  UINT8   COM2DataRate;\r
-  UINT8   COM2StopBits;\r
-  UINT8   COM2Parity;\r
-  UINT8   COM2TerminalType;\r
-\r
-  //\r
-  // Driver Option Add Handle page storage\r
-  //\r
-  UINT16  DriverAddHandleDesc[MAX_MENU_NUMBER];\r
-  UINT16  DriverAddHandleOptionalData[MAX_MENU_NUMBER];\r
-  UINT8   DriverAddActive;\r
-  UINT8   DriverAddForceReconnect;\r
-\r
-  //\r
-  // Console Input/Output/Errorout using COM port check storage\r
-  //\r
-  UINT8   ConsoleInputCOM1;\r
-  UINT8   ConsoleInputCOM2;\r
-  UINT8   ConsoleOutputCOM1;\r
-  UINT8   ConsoleOutputCOM2;\r
-  UINT8   ConsoleErrorCOM1;\r
-  UINT8   ConsoleErrorCOM2;\r
-\r
-  //\r
-  // At most 100 input/output/errorout device for console storage\r
-  //\r
-  UINT8   ConsoleCheck[MAX_MENU_NUMBER];\r
-  \r
-  //\r
-  // At most 100 input/output/errorout device for console storage\r
-  //\r
-  UINT8   ConsoleInCheck[MAX_MENU_NUMBER];\r
-  UINT8   ConsoleOutCheck[MAX_MENU_NUMBER];\r
-  UINT8   ConsoleErrCheck[MAX_MENU_NUMBER];\r
-\r
-  //\r
-  // Boot or Driver Option Order storage\r
-  // The value is the OptionNumber+1 because the order list value cannot be 0\r
-  // Use UINT32 to hold the potential value 0xFFFF+1=0x10000\r
-  //\r
-  UINT32  BootOptionOrder[MAX_MENU_NUMBER];\r
-  UINT32  DriverOptionOrder[MAX_MENU_NUMBER];\r
-  //\r
-  // Boot or Driver Option Delete storage\r
-  //\r
-  BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
-  BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
-  BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
-  BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
-\r
-  //\r
-  // This is the Terminal Attributes value storage\r
-  //\r
-  UINT8   COMBaudRate[MAX_MENU_NUMBER];\r
-  UINT8   COMDataRate[MAX_MENU_NUMBER];\r
-  UINT8   COMStopBits[MAX_MENU_NUMBER];\r
-  UINT8   COMParity[MAX_MENU_NUMBER];\r
-  UINT8   COMTerminalType[MAX_MENU_NUMBER];\r
-  UINT8   COMFlowControl[MAX_MENU_NUMBER];\r
-\r
-  //\r
-  // We use DisableMap array to record the enable/disable state of each boot device\r
-  // It should be taken as a bit array, from left to right there are totally 256 bits\r
-  // the most left one stands for BBS table item 0, and the most right one stands for item 256\r
-  // If the bit is 1, it means the boot device has been disabled.\r
-  //\r
-  UINT8   DisableMap[32];\r
-\r
-  //\r
-  // Console Output Text Mode\r
-  //\r
-  UINT16  ConsoleOutMode;\r
-\r
-  //\r
-  //  UINT16                    PadArea[10];\r
-  //\r
-\r
-  UINT16  BootDescriptionData[MAX_MENU_NUMBER];\r
-  UINT16  BootOptionalData[127];\r
-  UINT16  DriverDescriptionData[MAX_MENU_NUMBER];\r
-  UINT16  DriverOptionalData[127];\r
-  BOOLEAN BootOptionChanged;\r
-  BOOLEAN DriverOptionChanged;\r
-  UINT8   Active;\r
-  UINT8   ForceReconnect;\r
-} BMM_FAKE_NV_DATA;\r
-\r
-#endif\r
-\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/UpdatePage.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/UpdatePage.c
deleted file mode 100644 (file)
index cd1756a..0000000
+++ /dev/null
@@ -1,1272 +0,0 @@
-/** @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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
- Create the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-CreateUpdateData (\r
-  VOID\r
-  )\r
-{\r
-  //\r
-  // Init OpCode Handle and Allocate space for creation of Buffer\r
-  //\r
-  mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (mStartOpCodeHandle != NULL);\r
-  \r
-  mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (mEndOpCodeHandle != NULL);\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
-  // Create Hii Extend Label OpCode as the end opcode\r
-  //\r
-  mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  mEndLabel->Number       = LABEL_END;\r
-}\r
-\r
-/**\r
-  Refresh the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-RefreshUpdateData (\r
-  VOID\r
-  )\r
-{\r
-  //\r
-  // Free current updated date\r
-  //  \r
-  if (mStartOpCodeHandle != NULL) {\r
-    HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
-  }\r
-\r
-  //\r
-  // Create new OpCode Handle\r
-  //\r
-  mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\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
-/**\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
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageStart (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  RefreshUpdateData ();\r
-  mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
-\r
-  if (!(CallbackData->BmmAskSaveOrNot)) {\r
-    //\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
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_MAIN_ID,\r
-      STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
-      STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
-      0,\r
-      FORM_MAIN_ID\r
-      );\r
-  }\r
-}\r
-\r
-/**\r
-  Create the "Apply changes" and "Discard changes" tags. And\r
-  ensure user can return to the main page.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageEnd (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  //\r
-  // Create the "Apply changes" and "Discard changes" tags.\r
-  //\r
-  if (CallbackData->BmmAskSaveOrNot) {\r
-    HiiCreateSubTitleOpCode (\r
-      mStartOpCodeHandle,\r
-      STRING_TOKEN (STR_NULL_STRING),\r
-      0,\r
-      0,\r
-      0\r
-      );\r
-\r
-    HiiCreateActionOpCode (\r
-      mStartOpCodeHandle,\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
-      0\r
-      );\r
-  }\r
-\r
-  //\r
-  // Ensure user can return to the main page.\r
-  //\r
-  HiiCreateActionOpCode (\r
-    mStartOpCodeHandle,\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
-    0\r
-    );\r
-\r
-  HiiUpdateForm (\r
-    CallbackData->BmmHiiHandle,\r
-    &mBootMaintGuid,\r
-    CallbackData->BmmCurrentPageId,\r
-    mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
-    mEndOpCodeHandle    // LABEL_END\r
-    );\r
-}\r
-\r
-/**\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
-\r
-**/\r
-VOID\r
-CleanUpPage (\r
-  IN UINT16                           LabelId,\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  RefreshUpdateData ();\r
-\r
-  //\r
-  // Remove all op-codes from dynamic page\r
-  //\r
-  mStartLabel->Number = LabelId;\r
-  HiiUpdateForm (\r
-    CallbackData->BmmHiiHandle,\r
-    &mBootMaintGuid,\r
-    LabelId,\r
-    mStartOpCodeHandle, // Label LabelId\r
-    mEndOpCodeHandle    // LABEL_END\r
-    );\r
-}\r
-\r
-/**\r
-  Create a list of Goto Opcode for all terminal devices logged\r
-  by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
-\r
-  @param CallbackData    The BMM context data.\r
-**/\r
-VOID\r
-UpdateConCOMPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY       *NewMenuEntry;\r
-  UINT16              Index;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_CON_COM_SETUP_ID,\r
-      NewMenuEntry->DisplayStringToken,\r
-      STRING_TOKEN (STR_NULL_STRING),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
-      );\r
-  }\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-\r
-/**\r
-  Create a list of boot option from global BootOptionMenu. It\r
-  allow user to delete the boot option.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootDelPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          Index;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\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
-    if (NewLoadContext->IsLegacy) {\r
-      continue;\r
-    }\r
-\r
-    NewLoadContext->Deleted = FALSE;\r
-\r
-    if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
-      //\r
-      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
-      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
-      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
-      // through HiiSetBrowserData function.\r
-      //\r
-      CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
-    }\r
-    \r
-    HiiCreateCheckBoxOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
-      NewMenuEntry->DisplayStringToken,\r
-      NewMenuEntry->HelpStringToken,\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      0,\r
-      NULL\r
-      );\r
-  }\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
-  Create a lit of driver option from global DriverMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDrvAddHandlePage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-  UINT16        Index;\r
-\r
-  CallbackData->BmmAskSaveOrNot = FALSE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
-\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_DRV_ADD_HANDLE_DESC_ID,\r
-      NewMenuEntry->DisplayStringToken,\r
-      STRING_TOKEN (STR_NULL_STRING),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
-      );\r
-  }\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
-  Create a lit of driver option from global DriverOptionMenu. It\r
-  allow user to delete the driver option.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDrvDelPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          Index;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\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
-\r
-    if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
-      //\r
-      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
-      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
-      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
-      // through HiiSetBrowserData function.\r
-      //\r
-      CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
-    }\r
-    HiiCreateCheckBoxOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
-      NewMenuEntry->DisplayStringToken,\r
-      NewMenuEntry->HelpStringToken,\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      0,\r
-      NULL\r
-      );\r
-  }\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
-  Prepare the page to allow user to add description for \r
-  a Driver Option.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-\r
-  CallbackData->BmmFakeNvData.DriverAddActive          = 0x01;\r
-  CallbackData->BmmFakeNvData.DriverAddForceReconnect  = 0x00;\r
-  CallbackData->BmmAskSaveOrNot                        = TRUE;\r
-  NewMenuEntry = CallbackData->MenuEntry;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  HiiCreateSubTitleOpCode (\r
-    mStartOpCodeHandle,\r
-    NewMenuEntry->DisplayStringToken,\r
-    0,\r
-    0,\r
-    0\r
-    );\r
-\r
-  HiiCreateStringOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
-    STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
-    STRING_TOKEN (STR_NULL_STRING),\r
-    0,\r
-    0,\r
-    6,\r
-    75,\r
-    NULL\r
-    );\r
-\r
-  HiiCreateCheckBoxOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    DRV_ADD_RECON_VAR_OFFSET,\r
-    STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
-    STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
-    0,\r
-    0,\r
-    NULL\r
-    );\r
-\r
-  HiiCreateStringOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    DRIVER_ADD_OPTION_VAR_OFFSET,\r
-    STRING_TOKEN (STR_OPTIONAL_DATA),\r
-    STRING_TOKEN (STR_NULL_STRING),\r
-    0,\r
-    0,\r
-    6,\r
-    75,\r
-    NULL\r
-    );\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
-  Update console page.\r
-\r
-  @param UpdatePageId    The form ID to be updated.\r
-  @param ConsoleMenu     The console menu list.\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateConsolePage (\r
-  IN UINT16                           UpdatePageId,\r
-  IN BM_MENU_OPTION                   *ConsoleMenu,\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\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
-  UINT8               *ConsoleCheck;\r
-  UINT8               *OldConsoleCheck;\r
-  UINTN               ConsoleCheckSize;\r
-  EFI_QUESTION_ID     QuestionIdBase;\r
-  UINT16              VariableOffsetBase;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  ConsoleCheck       = NULL;\r
-  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
-  }\r
-  ASSERT (ConsoleCheck != NULL);\r
-\r
-  for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
-       (Index < MAX_MENU_NUMBER)) ; Index++) {\r
-    CheckFlags = 0;\r
-    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (NewConsoleContext->IsActive) {\r
-      CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      ConsoleCheck[Index] = TRUE;\r
-    } else {\r
-      ConsoleCheck[Index] = FALSE;\r
-    }\r
-    HiiCreateCheckBoxOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (VariableOffsetBase + Index),\r
-      NewMenuEntry->DisplayStringToken,\r
-      NewMenuEntry->HelpStringToken,\r
-      0,\r
-      CheckFlags,\r
-      NULL\r
-      );\r
-  }\r
-\r
-  for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
-       (Index2 < MAX_MENU_NUMBER)); 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
-      CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      ConsoleCheck[Index] = TRUE;\r
-    } else {\r
-      ConsoleCheck[Index] = FALSE;\r
-    }\r
-    HiiCreateCheckBoxOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (VariableOffsetBase + Index),\r
-      NewMenuEntry->DisplayStringToken,\r
-      NewMenuEntry->HelpStringToken,\r
-      0,\r
-      CheckFlags,\r
-      NULL\r
-      );\r
-\r
-    Index++;\r
-  }\r
-\r
-  CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
-  Update the page's NV Map if user has changed the order\r
-  a list. This list can be Boot Order or Driver Order.\r
-\r
-  @param UpdatePageId    The form ID to be updated.\r
-  @param OptionMenu      The new list.\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateOrderPage (\r
-  IN UINT16                           UpdatePageId,\r
-  IN BM_MENU_OPTION                   *OptionMenu,\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY     *NewMenuEntry;\r
-  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
-  UINT16            VarOffset;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-  UpdatePageStart (CallbackData);\r
-\r
-  OptionOrder = NULL;\r
-  QuestionId = 0;\r
-  VarOffset = 0;\r
-  switch (UpdatePageId) { \r
-  \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
-  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
-      }\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
-    }\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
-      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
-      );\r
-  }\r
-\r
-  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
-  UpdatePageEnd (CallbackData);\r
-\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
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateConModePage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  UINTN                         Mode;\r
-  UINTN                         Index;\r
-  UINTN                         Col;\r
-  UINTN                         Row;\r
-  CHAR16                        ModeString[50];\r
-  CHAR16                        *PStr;\r
-  UINTN                         MaxMode;\r
-  UINTN                         ValidMode;\r
-  EFI_STRING_ID                 *ModeToken;\r
-  EFI_STATUS                    Status;\r
-  VOID                          *OptionsOpCodeHandle;\r
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;\r
-\r
-  ConOut    = gST->ConOut;\r
-  Index     = 0;\r
-  ValidMode = 0;\r
-  MaxMode   = (UINTN) (ConOut->Mode->MaxMode);\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  //\r
-  // Check valid mode\r
-  //\r
-  for (Mode = 0; Mode < MaxMode; Mode++) {\r
-    Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-    ValidMode++;\r
-  }\r
-\r
-  if (ValidMode == 0) {\r
-    return;\r
-  }\r
-\r
-  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
-  ModeToken           = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
-  ASSERT(ModeToken != NULL);\r
-\r
-  //\r
-  // Determin which mode should be the first entry in menu\r
-  //\r
-  GetConsoleOutMode (CallbackData);\r
-\r
-  //\r
-  // Build text mode options\r
-  //\r
-  for (Mode = 0; Mode < MaxMode; Mode++) {\r
-    Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-    \r
-    //\r
-    // Build mode string Column x Row\r
-    //\r
-    UnicodeValueToString (ModeString, 0, Col, 0);\r
-    PStr = &ModeString[0];\r
-    StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
-    PStr = PStr + StrLen (PStr);\r
-    UnicodeValueToString (PStr , 0, Row, 0);\r
-\r
-    ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
-\r
-    if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        ModeToken[Index],\r
-        EFI_IFR_OPTION_DEFAULT,\r
-        EFI_IFR_TYPE_NUM_SIZE_16,\r
-        (UINT16) Mode\r
-        );\r
-    } else {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        ModeToken[Index],\r
-        0,\r
-        EFI_IFR_TYPE_NUM_SIZE_16,\r
-        (UINT16) Mode\r
-        );\r
-    }\r
-    Index++;\r
-  }\r
-\r
-  HiiCreateOneOfOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    CON_MODE_VAR_OFFSET,\r
-    STRING_TOKEN (STR_CON_MODE_SETUP),\r
-    STRING_TOKEN (STR_CON_MODE_SETUP),\r
-    EFI_IFR_FLAG_RESET_REQUIRED,\r
-    EFI_IFR_NUMERIC_SIZE_2,\r
-    OptionsOpCodeHandle,\r
-    NULL\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-  FreePool (ModeToken);\r
-\r
-  UpdatePageEnd (CallbackData);\r
-}\r
-\r
- /**\r
-  Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
-  Parity, Stop Bits, Terminal Type.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateTerminalPage (\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  UINT8               Index;\r
-  UINT8               CheckFlags;\r
-  BM_MENU_ENTRY       *NewMenuEntry;\r
-  VOID                *OptionsOpCodeHandle;\r
-  UINTN               CurrentTerminal;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
-  UpdatePageStart (CallbackData);\r
-\r
-  CurrentTerminal = CallbackData->CurrentTerminal;\r
-  NewMenuEntry = BOpt_GetMenuEntry (\r
-                  &TerminalMenu,\r
-                  CurrentTerminal\r
-                  );\r
-\r
-  if (NewMenuEntry == NULL) {\r
-    return ;\r
-  }\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 (BaudRateList[Index].Value == 115200) {\r
-      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-    }\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      BaudRateList[Index].StringToken,\r
-      CheckFlags,\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 + CurrentTerminal),\r
-    VARSTORE_ID_BOOT_MAINT,\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
-    EFI_IFR_NUMERIC_SIZE_1,\r
-    OptionsOpCodeHandle,\r
-    NULL\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
-    CheckFlags = 0;\r
-\r
-    if (DataBitsList[Index].Value == 8) {\r
-      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-    }\r
-\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      DataBitsList[Index].StringToken,\r
-      CheckFlags,\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 + CurrentTerminal),\r
-    VARSTORE_ID_BOOT_MAINT,\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
-    EFI_IFR_NUMERIC_SIZE_1,\r
-    OptionsOpCodeHandle,\r
-    NULL\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
-  for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
-    CheckFlags = 0;\r
-    if (ParityList[Index].Value ==  NoParity) {\r
-      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-    }\r
-\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      ParityList[Index].StringToken,\r
-      CheckFlags,\r
-      EFI_IFR_TYPE_NUM_SIZE_8,\r
-      Index\r
-      );\r
-  }\r
-\r
-  HiiCreateOneOfOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
-    STRING_TOKEN (STR_COM_PARITY),\r
-    STRING_TOKEN (STR_COM_PARITY),\r
-    0,\r
-    EFI_IFR_NUMERIC_SIZE_1,\r
-    OptionsOpCodeHandle,\r
-    NULL\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
-  for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
-    CheckFlags = 0;\r
-    if (StopBitsList[Index].Value == OneStopBit) {\r
-      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-    }\r
-\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      StopBitsList[Index].StringToken,\r
-      CheckFlags,\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 + CurrentTerminal),\r
-    VARSTORE_ID_BOOT_MAINT,\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
-    EFI_IFR_NUMERIC_SIZE_1,\r
-    OptionsOpCodeHandle,\r
-    NULL\r
-    );\r
-\r
-  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
-  for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
-    CheckFlags = 0;\r
-    if (Index == 0) {\r
-      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-    }\r
-\r
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      (EFI_STRING_ID) TerminalType[Index],\r
-      CheckFlags,\r
-      EFI_IFR_TYPE_NUM_SIZE_8,\r
-      Index\r
-      );\r
-  }\r
-\r
-  HiiCreateOneOfOpCode (\r
-    mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
-    VARSTORE_ID_BOOT_MAINT,\r
-    (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_NUMERIC_SIZE_1,\r
-    OptionsOpCodeHandle,\r
-    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
-}\r
\r
-/**\r
-Update add boot/driver option page.\r
-\r
-@param CallbackData    The BMM context data.\r
-@param FormId             The form ID to be updated.\r
-@param DevicePath       Device path.\r
-\r
-**/\r
-VOID\r
-UpdateOptionPage(\r
-  IN   BMM_CALLBACK_DATA        *CallbackData,\r
-  IN   EFI_FORM_ID              FormId,\r
-  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
-  )\r
-{\r
-  CHAR16                *String;\r
-  EFI_STRING_ID         StringToken;\r
-\r
-  if (DevicePath != NULL){\r
-    String = ExtractFileNameFromDevicePath(DevicePath);\r
-    StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
-    FreePool(String);\r
-  } else {\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
-  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
-    }\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
-    }\r
-  }\r
-\r
-  RefreshUpdateData();\r
-  mStartLabel->Number = FormId;\r
-\r
-  HiiCreateSubTitleOpCode (\r
-    mStartOpCodeHandle,\r
-    StringToken,\r
-    0,\r
-    0,\r
-    0\r
-    );\r
-\r
-  HiiUpdateForm (\r
-    CallbackData->BmmHiiHandle,\r
-    &mBootMaintGuid,\r
-    FormId,\r
-    mStartOpCodeHandle,// Label FormId\r
-    mEndOpCodeHandle   // LABEL_END\r
-    );\r
-}\r
-\r
-/**\r
-  Dispatch the correct update page function to call based on\r
-  the UpdatePageId.\r
-\r
-  @param UpdatePageId    The form ID.\r
-  @param CallbackData    The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageBody (\r
-  IN UINT16                           UpdatePageId,\r
-  IN BMM_CALLBACK_DATA                *CallbackData\r
-  )\r
-{\r
-  CleanUpPage (UpdatePageId, CallbackData);\r
-  switch (UpdatePageId) {\r
-  case FORM_CON_IN_ID:\r
-    UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
-    break;\r
-\r
-  case FORM_CON_OUT_ID:\r
-    UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
-    break;\r
-\r
-  case FORM_CON_ERR_ID:\r
-    UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
-    break;\r
-\r
-  case FORM_BOOT_CHG_ID:\r
-    UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
-    break;\r
-\r
-  case FORM_DRV_CHG_ID:\r
-    UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-}\r
-\r
-/**\r
-  Dispatch the display to the next page based on NewPageId.\r
-\r
-  @param Private         The BMM context data.\r
-  @param NewPageId       The original page ID.\r
-\r
-**/\r
-VOID\r
-UpdatePageId (\r
-  BMM_CALLBACK_DATA              *Private,\r
-  UINT16                         NewPageId\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
-    //\r
-    NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
-  } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
-    //\r
-    // Return to main page after "Save Changes" or "Discard Changes".\r
-    //\r
-    NewPageId = FORM_MAIN_ID;\r
-  } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
-    NewPageId = FORM_CON_COM_SETUP_ID;\r
-  }\r
-\r
-  if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
-    Private->BmmPreviousPageId  = Private->BmmCurrentPageId;\r
-    Private->BmmCurrentPageId   = NewPageId;\r
-  }\r
-}\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerLib/Variable.c b/MdeModulePkg/Library/BootMaintenanceManagerLib/Variable.c
deleted file mode 100644 (file)
index a276cae..0000000
+++ /dev/null
@@ -1,1051 +0,0 @@
-/** @file\r
-Variable operation that will be used by bootmaint\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
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
-  Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
-  After deleting this boot option, call Var_ChangeBootOrder to\r
-  make sure BootOrder is in valid state.\r
-\r
-  @retval EFI_SUCCESS   If all boot load option EFI Variables corresponding to  \r
-                        BM_LOAD_CONTEXT marked for deletion is deleted.\r
-  @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.\r
-  @return Others        If failed to update the "BootOrder" variable after deletion. \r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelBootOption (\r
-  VOID\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          BootString[10];\r
-  EFI_STATUS      Status;\r
-  UINTN           Index;\r
-  UINTN           Index2;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Index2  = 0;\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (!NewLoadContext->Deleted) {\r
-      continue;\r
-    }\r
-\r
-    UnicodeSPrint (\r
-      BootString,\r
-      sizeof (BootString),\r
-      L"Boot%04x",\r
-      NewMenuEntry->OptionNumber\r
-      );\r
-\r
-    EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
-    Index2++;\r
-    //\r
-    // If current Load Option is the same as BootNext,\r
-    // must delete BootNext in order to make sure\r
-    // there will be no panic on next boot\r
-    //\r
-    if (NewLoadContext->IsBootNext) {\r
-      EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
-    }\r
-\r
-    RemoveEntryList (&NewMenuEntry->Link);\r
-    BOpt_DestroyMenuEntry (NewMenuEntry);\r
-    NewMenuEntry = NULL;\r
-  }\r
-\r
-  BootOptionMenu.MenuNumber -= Index2;\r
-\r
-  Status = Var_ChangeBootOrder ();\r
-  return Status;\r
-}\r
-\r
-/**\r
-  After any operation on Boot####, there will be a discrepancy in BootOrder.\r
-  Since some are missing but in BootOrder, while some are present but are\r
-  not reflected by BootOrder. Then a function rebuild BootOrder from\r
-  scratch by content from BootOptionMenu is needed.\r
-\r
-\r
-  \r
-\r
-  @retval  EFI_SUCCESS  The boot order is updated successfully.\r
-  @return               EFI_STATUS other than EFI_SUCCESS if failed to\r
-                        Set the "BootOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
-  VOID\r
-  )\r
-{\r
-\r
-  EFI_STATUS    Status;\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-  UINT16        *BootOrderList;\r
-  UINT16        *BootOrderListPtr;\r
-  UINTN         BootOrderListSize;\r
-  UINTN         Index;\r
-\r
-  BootOrderList     = NULL;\r
-  BootOrderListSize = 0;\r
-  //\r
-  // First check whether BootOrder is present in current configuration\r
-  //\r
-  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
-\r
-  //\r
-  // If exists, delete it to hold new BootOrder\r
-  //\r
-  if (BootOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (BootOrderList);\r
-    BootOrderList = NULL;\r
-  }\r
-  //\r
-  // Maybe here should be some check method to ensure that\r
-  // no new added boot options will be added\r
-  // but the setup engine now will give only one callback\r
-  // that is to say, user are granted only one chance to\r
-  // decide whether the boot option will be added or not\r
-  // there should be no indictor to show whether this\r
-  // is a "new" boot option\r
-  //\r
-  BootOrderListSize = BootOptionMenu.MenuNumber;\r
-\r
-  if (BootOrderListSize > 0) {\r
-    BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
-    ASSERT (BootOrderList != NULL);\r
-    BootOrderListPtr = BootOrderList;\r
-\r
-    //\r
-    // Get all current used Boot#### from BootOptionMenu.\r
-    // OptionNumber in each BM_LOAD_OPTION is really its\r
-    // #### value.\r
-    //\r
-    for (Index = 0; Index < BootOrderListSize; Index++) {\r
-      NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-      *BootOrderList  = (UINT16) NewMenuEntry->OptionNumber;\r
-      BootOrderList++;\r
-    }\r
-\r
-    BootOrderList = BootOrderListPtr;\r
-\r
-    //\r
-    // After building the BootOrderList, write it back\r
-    //\r
-    Status = gRT->SetVariable (\r
-                    L"BootOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    BootOrderListSize * sizeof (UINT16),\r
-                    BootOrderList\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Delete Load Option that represent a Deleted state in BootOptionMenu.\r
-  After deleting this Driver option, call Var_ChangeDriverOrder to\r
-  make sure DriverOrder is in valid state.\r
-\r
-  @retval EFI_SUCCESS       Load Option is successfully updated.\r
-  @retval EFI_NOT_FOUND     Fail to find the driver option want to be deleted.\r
-  @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
-          Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
-  VOID\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          DriverString[12];\r
-  EFI_STATUS      Status;\r
-  UINTN           Index;\r
-  UINTN           Index2;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Index2  = 0;\r
-  for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (!NewLoadContext->Deleted) {\r
-      continue;\r
-    }\r
-\r
-    UnicodeSPrint (\r
-      DriverString,\r
-      sizeof (DriverString),\r
-      L"Driver%04x",\r
-      NewMenuEntry->OptionNumber\r
-      );\r
-\r
-    EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
-    Index2++;\r
-\r
-    RemoveEntryList (&NewMenuEntry->Link);\r
-    BOpt_DestroyMenuEntry (NewMenuEntry);\r
-    NewMenuEntry = NULL;\r
-  }\r
-\r
-  DriverOptionMenu.MenuNumber -= Index2;\r
-\r
-  Status = Var_ChangeDriverOrder ();\r
-  return Status;\r
-}\r
-\r
-/**\r
-  After any operation on Driver####, there will be a discrepancy in\r
-  DriverOrder. Since some are missing but in DriverOrder, while some\r
-  are present but are not reflected by DriverOrder. Then a function\r
-  rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
-  needed.\r
-\r
-  @retval  EFI_SUCCESS  The driver order is updated successfully.\r
-  @return  Other status than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS    Status;\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-  UINT16        *DriverOrderList;\r
-  UINT16        *DriverOrderListPtr;\r
-  UINTN         DriverOrderListSize;\r
-  UINTN         Index;\r
-\r
-  DriverOrderList     = NULL;\r
-  DriverOrderListSize = 0;\r
-\r
-  //\r
-  // First check whether DriverOrder is present in current configuration\r
-  //\r
-  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
-  //\r
-  // If exists, delete it to hold new DriverOrder\r
-  //\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (DriverOrderList);\r
-    DriverOrderList = NULL;\r
-  }\r
-\r
-  DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
-\r
-  if (DriverOrderListSize > 0) {\r
-    DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
-    ASSERT (DriverOrderList != NULL);\r
-    DriverOrderListPtr = DriverOrderList;\r
-\r
-    //\r
-    // Get all current used Driver#### from DriverOptionMenu.\r
-    // OptionNumber in each BM_LOAD_OPTION is really its\r
-    // #### value.\r
-    //\r
-    for (Index = 0; Index < DriverOrderListSize; Index++) {\r
-      NewMenuEntry      = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-      *DriverOrderList  = (UINT16) NewMenuEntry->OptionNumber;\r
-      DriverOrderList++;\r
-    }\r
-\r
-    DriverOrderList = DriverOrderListPtr;\r
-\r
-    //\r
-    // After building the DriverOrderList, write it back\r
-    //\r
-    Status = gRT->SetVariable (\r
-                    L"DriverOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    DriverOrderListSize * sizeof (UINT16),\r
-                    DriverOrderList\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Update the device path of "ConOut", "ConIn" and "ErrOut" \r
-  based on the new BaudRate, Data Bits, parity and Stop Bits\r
-  set.\r
-\r
-**/\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
-  VOID\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *OutDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *InpDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *ErrDevicePath;\r
-  EFI_STATUS                Status;\r
-\r
-  GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
-  GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
-  GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
-  if (OutDevicePath != NULL) {\r
-    ChangeVariableDevicePath (OutDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ConOut",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (OutDevicePath),\r
-                    OutDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-\r
-  if (InpDevicePath != NULL) {\r
-    ChangeVariableDevicePath (InpDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ConIn",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (InpDevicePath),\r
-                    InpDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-\r
-  if (ErrDevicePath != NULL) {\r
-    ChangeVariableDevicePath (ErrDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ErrOut",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (ErrDevicePath),\r
-                    ErrDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path for\r
-  specified type of console device.\r
-\r
-  This function clear the EFI variable defined by ConsoleName and\r
-  gEfiGlobalVariableGuid. It then build the multi-instance device\r
-  path by appending the device path of the Console (In/Out/Err) instance \r
-  in ConsoleMenu. Then it scan all corresponding console device by\r
-  scanning Terminal (built from device supporting Serial I/O instances)\r
-  devices in TerminalMenu. At last, it save a EFI variable specifed\r
-  by ConsoleName and gEfiGlobalVariableGuid.\r
-\r
-  @param ConsoleName     The name for the console device type. They are\r
-                         usually "ConIn", "ConOut" and "ErrOut".\r
-  @param ConsoleMenu     The console memu which is a list of console devices.\r
-  @param UpdatePageId    The flag specifying which type of console device\r
-                         to be processed.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOption (\r
-  IN UINT16                     *ConsoleName,\r
-  IN BM_MENU_OPTION             *ConsoleMenu,\r
-  IN UINT16                     UpdatePageId\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *ConDevicePath;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_CONSOLE_CONTEXT        *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
-  EFI_STATUS                Status;\r
-  VENDOR_DEVICE_PATH        Vendor;\r
-  EFI_DEVICE_PATH_PROTOCOL  *TerminalDevicePath;\r
-  UINTN                     Index;\r
-\r
-  GetEfiGlobalVariable2 (ConsoleName, (VOID**)&ConDevicePath, NULL);\r
-  if (ConDevicePath != NULL) {\r
-    EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
-    FreePool (ConDevicePath);\r
-    ConDevicePath = NULL;\r
-  };\r
-\r
-  //\r
-  // First add all console input device from console input menu\r
-  //\r
-  for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
-\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (NewConsoleContext->IsActive) {\r
-      ConDevicePath = AppendDevicePathInstance (\r
-                        ConDevicePath,\r
-                        NewConsoleContext->DevicePath\r
-                        );\r
-    }\r
-  }\r
-\r
-  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
-    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\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
-      Vendor.Header.Type    = MESSAGING_DEVICE_PATH;\r
-      Vendor.Header.SubType = MSG_VENDOR_DP;\r
-      \r
-      ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
-      CopyMem (\r
-        &Vendor.Guid,\r
-        &TerminalTypeGuid[NewTerminalContext->TerminalType],\r
-        sizeof (EFI_GUID)\r
-        );\r
-      SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
-      TerminalDevicePath = AppendDevicePathNode (\r
-                            NewTerminalContext->DevicePath,\r
-                            (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
-                            );\r
-      ASSERT (TerminalDevicePath != NULL);\r
-      ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
-      ConDevicePath = AppendDevicePathInstance (\r
-                        ConDevicePath,\r
-                        TerminalDevicePath\r
-                        );\r
-    }\r
-  }\r
-\r
-  if (ConDevicePath != NULL) {\r
-    Status = gRT->SetVariable (\r
-                    ConsoleName,\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (ConDevicePath),\r
-                    ConDevicePath\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path ConIn\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path ConOut\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path ErrOut\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.  \r
-**/\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
-}\r
-\r
-/**\r
-  This function create a currently loaded Drive Option from \r
-  the BMM. It then appends this Driver Option to the end of \r
-  the "DriverOrder" list. It append this Driver Opotion to the end\r
-  of DriverOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  @param HiiHandle       The HII handle associated with the BMM formset.\r
-  @param DescriptionData The description of this driver option.\r
-  @param OptionalData    The optional load option.\r
-  @param ForceReconnect  If to force reconnect.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
-  @retval EFI_SUCCESS          If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData,\r
-  IN  EFI_HII_HANDLE            HiiHandle,\r
-  IN  UINT16                    *DescriptionData,\r
-  IN  UINT16                    *OptionalData,\r
-  IN  UINT8                     ForceReconnect\r
-  )\r
-{\r
-  UINT16          Index;\r
-  UINT16          *DriverOrderList;\r
-  UINT16          *NewDriverOrderList;\r
-  UINT16          DriverString[12];\r
-  UINTN           DriverOrderListSize;\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  BOOLEAN         OptionalDataExist;\r
-  EFI_STATUS      Status;\r
-\r
-  OptionalDataExist = FALSE;\r
-\r
-  Index             = BOpt_GetDriverOptionNumber ();\r
-  UnicodeSPrint (\r
-    DriverString,\r
-    sizeof (DriverString),\r
-    L"Driver%04x",\r
-    Index\r
-    );\r
-\r
-  if (*DescriptionData == 0x0000) {\r
-    StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
-  }\r
-\r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-  if (*OptionalData != 0x0000) {\r
-    OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (OptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
-  if (NULL == NewMenuEntry) {\r
-    FreePool (Buffer);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-  NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
-  Ptr += sizeof (UINT16);\r
-  CopyMem (\r
-    Ptr,\r
-    DescriptionData,\r
-    StrSize (DescriptionData)\r
-    );\r
-\r
-  NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
-  ASSERT (NewLoadContext->Description != NULL);\r
-  NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-  CopyMem (\r
-    NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
-    StrSize (DescriptionData)\r
-    );\r
-\r
-  Ptr += StrSize (DescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
-  ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
-  CopyMem (\r
-    NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewMenuEntry->HelpString    = UiDevicePathToStr (NewLoadContext->FilePathList);\r
-  NewMenuEntry->OptionNumber  = Index;\r
-  NewMenuEntry->DisplayStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-  NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
-\r
-  if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-    CopyMem (\r
-      Ptr,\r
-      OptionalData,\r
-      StrSize (OptionalData)\r
-      );\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  DriverString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
-  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewDriverOrderList != NULL);\r
-  if (DriverOrderList != NULL){\r
-    CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
-  }\r
-  NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"DriverOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  DriverOrderListSize + sizeof (UINT16),\r
-                  NewDriverOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (DriverOrderList != NULL) {\r
-    FreePool (DriverOrderList);\r
-  }\r
-  DriverOrderList = NULL;\r
-  FreePool (NewDriverOrderList);\r
-  InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
-  DriverOptionMenu.MenuNumber++;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function create a currently loaded Boot Option from \r
-  the BMM. It then appends this Boot Option to the end of \r
-  the "BootOrder" list. It also append this Boot Opotion to the end\r
-  of BootOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
-  @retval EFI_SUCCESS          If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
-  IN  BMM_CALLBACK_DATA              *CallbackData\r
-  )\r
-{\r
-  UINT16          *BootOrderList;\r
-  UINT16          *NewBootOrderList;\r
-  UINTN           BootOrderListSize;\r
-  UINT16          BootString[10];\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
-  UINT16          Index;\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  BOOLEAN         OptionalDataExist;\r
-  EFI_STATUS      Status;\r
-  BMM_FAKE_NV_DATA  *NvRamMap;\r
-\r
-  OptionalDataExist = FALSE;\r
-  NvRamMap = &CallbackData->BmmFakeNvData;\r
-\r
-  Index = BOpt_GetBootOptionNumber () ;\r
-  UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
-\r
-  if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
-    StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
-  }\r
-\r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-  if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
-    OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (NvRamMap->BootOptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
-  if (NULL == NewMenuEntry) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-  NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-  Ptr += sizeof (UINT16);\r
-\r
-  CopyMem (\r
-    Ptr,\r
-    NvRamMap->BootDescriptionData,\r
-    StrSize (NvRamMap->BootDescriptionData)\r
-    );\r
-\r
-  NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
-  ASSERT (NewLoadContext->Description != NULL);\r
-\r
-  NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-  CopyMem (\r
-    NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
-    StrSize (NvRamMap->BootDescriptionData)\r
-    );\r
-\r
-  Ptr += StrSize (NvRamMap->BootDescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
-  ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
-  CopyMem (\r
-    NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewMenuEntry->HelpString    = UiDevicePathToStr (NewLoadContext->FilePathList);\r
-  NewMenuEntry->OptionNumber  = Index;\r
-  NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-  NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
-\r
-  if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-    CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  BootString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
-  NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewBootOrderList != NULL);\r
-  if (BootOrderList != NULL){\r
-    CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
-  }\r
-  NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
-  if (BootOrderList != NULL) {\r
-    FreePool (BootOrderList);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderListSize + sizeof (UINT16),\r
-                  NewBootOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  FreePool (NewBootOrderList);\r
-  NewBootOrderList = NULL;\r
-  InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
-  BootOptionMenu.MenuNumber++;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function update the "BootNext" EFI Variable. If there is \r
-  no "BootNext" specified in BMM, this EFI Variable is deleted.\r
-  It also update the BMM context data specified the "BootNext"\r
-  vaule.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return                The EFI variable can be saved. See gRT->SetVariable \r
-                         for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY     *NewMenuEntry;\r
-  BM_LOAD_CONTEXT   *NewLoadContext;\r
-  BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
-  UINT16            Index;\r
-  EFI_STATUS        Status;\r
-\r
-  Status            = EFI_SUCCESS;\r
-  CurrentFakeNVMap  = &CallbackData->BmmFakeNvData;\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-    ASSERT (NULL != NewMenuEntry);\r
-\r
-    NewLoadContext              = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    NewLoadContext->IsBootNext  = FALSE;\r
-  }\r
-\r
-  if (CurrentFakeNVMap->BootNext == NONE_BOOTNEXT_VALUE) {\r
-    EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  NewMenuEntry = BOpt_GetMenuEntry (\r
-                  &BootOptionMenu,\r
-                  CurrentFakeNVMap->BootNext\r
-                  );\r
-  ASSERT (NewMenuEntry != NULL);\r
-\r
-  NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-  Status = gRT->SetVariable (\r
-                  L"BootNext",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  sizeof (UINT16),\r
-                  &NewMenuEntry->OptionNumber\r
-                  );\r
-  NewLoadContext->IsBootNext              = TRUE;\r
-  CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
-  return Status;\r
-}\r
-\r
-/**\r
-  This function update the "BootOrder" EFI Variable based on\r
-  BMM Formset's NV map. It then refresh BootOptionMenu\r
-  with the new "BootOrder" list.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS             The function complete successfully.\r
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to complete the function.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT16      Index;\r
-  UINT16      OrderIndex;\r
-  UINT16      *BootOrder;\r
-  UINTN       BootOrderSize;\r
-  UINT16      OptionNumber;\r
-\r
-  //\r
-  // First check whether BootOrder is present in current configuration\r
-  //\r
-  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &BootOrderSize);\r
-  if (BootOrder == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionOrder) / sizeof (CallbackData->BmmFakeNvData.BootOptionOrder[0])));\r
-\r
-  //\r
-  // OptionOrder is subset of BootOrder\r
-  //\r
-  for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] != 0); OrderIndex++) {\r
-    for (Index = OrderIndex; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
-      if ((BootOrder[Index] == (UINT16) (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
-        OptionNumber = BootOrder[Index];\r
-        CopyMem (&BootOrder[OrderIndex + 1], &BootOrder[OrderIndex], (Index - OrderIndex) * sizeof (UINT16));\r
-        BootOrder[OrderIndex] = OptionNumber;\r
-      }\r
-    }\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderSize,\r
-                  BootOrder\r
-                  );\r
-  FreePool (BootOrder);\r
-  \r
-  BOpt_FreeMenu (&BootOptionMenu);\r
-  BOpt_GetBootOptions (CallbackData);\r
-\r
-  return Status;\r
-\r
-}\r
-\r
-/**\r
-  This function update the "DriverOrder" EFI Variable based on\r
-  BMM Formset's NV map. It then refresh DriverOptionMenu\r
-  with the new "DriverOrder" list.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS           The function complete successfully.\r
-  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT16      Index;\r
-  UINT16      *DriverOrderList;\r
-  UINT16      *NewDriverOrderList;\r
-  UINTN       DriverOrderListSize;\r
-\r
-  DriverOrderList     = NULL;\r
-  DriverOrderListSize = 0;\r
-\r
-  //\r
-  // First check whether DriverOrder is present in current configuration\r
-  //\r
-  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
-  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
-\r
-  if (NewDriverOrderList == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // If exists, delete it to hold new DriverOrder\r
-  //\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (DriverOrderList);\r
-  }\r
-\r
-  ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder) / sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder[0])));\r
-  for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
-    NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] - 1);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"DriverOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  DriverOrderListSize,\r
-                  NewDriverOrderList\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  BOpt_FreeMenu (&DriverOptionMenu);\r
-  BOpt_GetDriverOptions (CallbackData);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Update the Text Mode of Console.\r
-\r
-  @param CallbackData  The context data for BMM.\r
-\r
-  @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
-  @return Other value if the Text Mode of Console is not updated.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConMode (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  EFI_STATUS        Status;\r
-  UINTN             Mode;\r
-  CONSOLE_OUT_MODE  ModeInfo;\r
-\r
-  Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
-\r
-  Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
-  if (!EFI_ERROR(Status)) {\r
-    Status = PcdSet32S (PcdSetupConOutColumn, (UINT32) ModeInfo.Column);\r
-    if (!EFI_ERROR (Status)) {\r
-      Status = PcdSet32S (PcdSetupConOutRow, (UINT32) ModeInfo.Row);\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BmLib.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BmLib.c
new file mode 100644 (file)
index 0000000..0ef9bf0
--- /dev/null
@@ -0,0 +1,89 @@
+/** @file\r
+Utility routines used by boot maintenance modules.\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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+  Function deletes the variable specified by VarName and VarGuid.\r
+\r
+  @param VarName           A Null-terminated Unicode string that is\r
+                           the name of the vendor's variable.\r
+\r
+  @param VarGuid           A unique identifier for the vendor.\r
+\r
+  @retval  EFI_SUCCESS           The variable was found and removed\r
+  @retval  EFI_UNSUPPORTED       The variable store was inaccessible\r
+  @retval  EFI_NOT_FOUND         The variable was not found\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibDeleteVariable (\r
+  IN CHAR16   *VarName,\r
+  IN EFI_GUID *VarGuid\r
+  )\r
+{\r
+  return gRT->SetVariable (\r
+                VarName,\r
+                VarGuid,\r
+                0,\r
+                0,\r
+                NULL\r
+                );\r
+}\r
+\r
+/**\r
+  Function is used to determine the number of device path instances\r
+  that exist in a device path.\r
+\r
+\r
+  @param DevicePath      A pointer to a device path data structure.\r
+\r
+  @return This function counts and returns the number of device path instances\r
+          in DevicePath.\r
+\r
+**/\r
+UINTN\r
+EfiDevicePathInstanceCount (\r
+  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
+  )\r
+{\r
+  UINTN Count;\r
+  UINTN Size;\r
+\r
+  Count = 0;\r
+  while (GetNextDevicePathInstance (&DevicePath, &Size) != NULL) {\r
+    Count += 1;\r
+  }\r
+\r
+  return Count;\r
+}\r
+\r
+/**\r
+  Get a string from the Data Hub record based on \r
+  a device path.\r
+\r
+  @param DevPath         The device Path.\r
+\r
+  @return A string located from the Data Hub records based on\r
+          the device path.\r
+  @retval NULL  If failed to get the String from Data Hub.\r
+\r
+**/\r
+UINT16 *\r
+EfiLibStrFromDatahub (\r
+  IN EFI_DEVICE_PATH_PROTOCOL                 *DevPath\r
+  )\r
+{\r
+  return NULL;\r
+}\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c
new file mode 100644 (file)
index 0000000..2d52f9b
--- /dev/null
@@ -0,0 +1,1518 @@
+/** @file\r
+The functions for Boot Maintainence Main menu.\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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+#define FRONT_PAGE_KEY_OFFSET          0x4000\r
+//\r
+// Boot video resolution and text mode.\r
+//\r
+UINT32    mBmmBootHorizontalResolution    = 0;\r
+UINT32    mBmmBootVerticalResolution      = 0;\r
+UINT32    mBmmBootTextModeColumn          = 0;\r
+UINT32    mBmmBootTextModeRow             = 0;\r
+//\r
+// BIOS setup video resolution and text mode.\r
+//\r
+UINT32    mBmmSetupTextModeColumn         = 0;\r
+UINT32    mBmmSetupTextModeRow            = 0;\r
+UINT32    mBmmSetupHorizontalResolution   = 0;\r
+UINT32    mBmmSetupVerticalResolution     = 0;\r
+\r
+EFI_DEVICE_PATH_PROTOCOL  EndDevicePath[] = {\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    {\r
+      END_DEVICE_PATH_LENGTH,\r
+      0\r
+    }\r
+  }\r
+};\r
+\r
+HII_VENDOR_DEVICE_PATH  mBmmHiiVendorDevicePath = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    //\r
+    // {165A028F-0BB2-4b5f-8747-77592E3F6499}\r
+    //\r
+    { 0x165a028f, 0xbb2, 0x4b5f, { 0x87, 0x47, 0x77, 0x59, 0x2e, 0x3f, 0x64, 0x99 } }\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
+EFI_GUID mBootMaintGuid          = BOOT_MAINT_FORMSET_GUID;\r
+\r
+CHAR16  mBootMaintStorageName[]     = L"BmmData";\r
+BMM_CALLBACK_DATA  gBootMaintenancePrivate = {\r
+  BMM_CALLBACK_DATA_SIGNATURE,\r
+  NULL,\r
+  NULL,\r
+  {\r
+    BootMaintExtractConfig,\r
+    BootMaintRouteConfig,\r
+    BootMaintCallback\r
+  }\r
+};\r
+\r
+BMM_CALLBACK_DATA *mBmmCallbackInfo = &gBootMaintenancePrivate;\r
+BOOLEAN  mAllMenuInit               = FALSE;\r
+\r
+/**\r
+  Init all memu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitAllMenu (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+  Free up all Menu Option list.\r
+\r
+**/\r
+VOID\r
+FreeAllMenu (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function will change video resolution and text mode\r
+  according to defined setup mode or defined boot mode  \r
+\r
+  @param  IsSetupMode   Indicate mode is changed to setup mode or boot mode. \r
+\r
+  @retval  EFI_SUCCESS  Mode is changed successfully.\r
+  @retval  Others       Mode failed to be changed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BmmBdsSetConsoleMode (\r
+  BOOLEAN  IsSetupMode\r
+  )\r
+{\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL       *SimpleTextOut;\r
+  UINTN                                 SizeOfInfo;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;\r
+  UINT32                                MaxGopMode;\r
+  UINT32                                MaxTextMode;\r
+  UINT32                                ModeNumber;\r
+  UINT32                                NewHorizontalResolution;\r
+  UINT32                                NewVerticalResolution;\r
+  UINT32                                NewColumns;\r
+  UINT32                                NewRows;\r
+  UINTN                                 HandleCount;\r
+  EFI_HANDLE                            *HandleBuffer;\r
+  EFI_STATUS                            Status;\r
+  UINTN                                 Index;\r
+  UINTN                                 CurrentColumn;\r
+  UINTN                                 CurrentRow;  \r
+\r
+  MaxGopMode  = 0;\r
+  MaxTextMode = 0;\r
+\r
+  //\r
+  // Get current video resolution and text mode \r
+  //\r
+  Status = gBS->HandleProtocol (\r
+                  gST->ConsoleOutHandle,\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  (VOID**)&GraphicsOutput\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    GraphicsOutput = NULL;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  gST->ConsoleOutHandle,\r
+                  &gEfiSimpleTextOutProtocolGuid,\r
+                  (VOID**)&SimpleTextOut\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    SimpleTextOut = NULL;\r
+  }  \r
+\r
+  if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (IsSetupMode) {\r
+    //\r
+    // The requried resolution and text mode is setup mode.\r
+    //\r
+    NewHorizontalResolution = mBmmSetupHorizontalResolution;\r
+    NewVerticalResolution   = mBmmSetupVerticalResolution;\r
+    NewColumns              = mBmmSetupTextModeColumn;\r
+    NewRows                 = mBmmSetupTextModeRow;\r
+  } else {\r
+    //\r
+    // The required resolution and text mode is boot mode.\r
+    //\r
+    NewHorizontalResolution = mBmmBootHorizontalResolution;\r
+    NewVerticalResolution   = mBmmBootVerticalResolution;\r
+    NewColumns              = mBmmBootTextModeColumn;\r
+    NewRows                 = mBmmBootTextModeRow;   \r
+  }\r
+\r
+  if (GraphicsOutput != NULL) {\r
+    MaxGopMode  = GraphicsOutput->Mode->MaxMode;\r
+  } \r
+\r
+  if (SimpleTextOut != NULL) {\r
+    MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
+  }\r
+\r
+  //\r
+  // 1. If current video resolution is same with required video resolution,\r
+  //    video resolution need not be changed.\r
+  //    1.1. If current text mode is same with required text mode, text mode need not be changed.\r
+  //    1.2. If current text mode is different from required text mode, text mode need be changed.\r
+  // 2. If current video resolution is different from required video resolution, we need restart whole console drivers.\r
+  //\r
+  for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
+    Status = GraphicsOutput->QueryMode (\r
+                       GraphicsOutput,\r
+                       ModeNumber,\r
+                       &SizeOfInfo,\r
+                       &Info\r
+                       );\r
+    if (!EFI_ERROR (Status)) {\r
+      if ((Info->HorizontalResolution == NewHorizontalResolution) &&\r
+          (Info->VerticalResolution == NewVerticalResolution)) {\r
+        if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&\r
+            (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) {\r
+          //\r
+          // Current resolution is same with required resolution, check if text mode need be set\r
+          //\r
+          Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
+          ASSERT_EFI_ERROR (Status);\r
+          if (CurrentColumn == NewColumns && CurrentRow == NewRows) {\r
+            //\r
+            // If current text mode is same with required text mode. Do nothing\r
+            //\r
+            FreePool (Info);\r
+            return EFI_SUCCESS;\r
+          } else {\r
+            //\r
+            // If current text mode is different from requried text mode.  Set new video mode\r
+            //\r
+            for (Index = 0; Index < MaxTextMode; Index++) {\r
+              Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
+              if (!EFI_ERROR(Status)) {\r
+                if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {\r
+                  //\r
+                  // Required text mode is supported, set it.\r
+                  //\r
+                  Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
+                  ASSERT_EFI_ERROR (Status);\r
+                  //\r
+                  // Update text mode PCD.\r
+                  //\r
+                  Status = PcdSet32S (PcdConOutColumn, mBmmSetupTextModeColumn);\r
+                  ASSERT_EFI_ERROR (Status);\r
+                  Status = PcdSet32S (PcdConOutRow, mBmmSetupTextModeRow);\r
+                  ASSERT_EFI_ERROR (Status);\r
+                  FreePool (Info);\r
+                  return EFI_SUCCESS;\r
+                }\r
+              }\r
+            }\r
+            if (Index == MaxTextMode) {\r
+              //\r
+              // If requried text mode is not supported, return error.\r
+              //\r
+              FreePool (Info);\r
+              return EFI_UNSUPPORTED;\r
+            }\r
+          }\r
+        } else {\r
+          //\r
+          // If current video resolution is not same with the new one, set new video resolution.\r
+          // In this case, the driver which produces simple text out need be restarted.\r
+          //\r
+          Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
+          if (!EFI_ERROR (Status)) {\r
+            FreePool (Info);\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      FreePool (Info);\r
+    }\r
+  }\r
+\r
+  if (ModeNumber == MaxGopMode) {\r
+    //\r
+    // If the resolution is not supported, return error.\r
+    //\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  //\r
+  // Set PCD to Inform GraphicsConsole to change video resolution.\r
+  // Set PCD to Inform Consplitter to change text mode.\r
+  //\r
+  Status = PcdSet32S (PcdVideoHorizontalResolution, NewHorizontalResolution);\r
+  ASSERT_EFI_ERROR (Status);\r
+  Status = PcdSet32S (PcdVideoVerticalResolution, NewVerticalResolution);\r
+  ASSERT_EFI_ERROR (Status);\r
+  Status = PcdSet32S (PcdConOutColumn, NewColumns);\r
+  ASSERT_EFI_ERROR (Status);\r
+  Status = PcdSet32S (PcdConOutRow, NewRows);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Video mode is changed, so restart graphics console driver and higher level driver.\r
+  // Reconnect graphics console driver and higher level driver.\r
+  // Locate all the handles with GOP protocol and reconnect it.\r
+  //\r
+  Status = gBS->LocateHandleBuffer (\r
+                   ByProtocol,\r
+                   &gEfiSimpleTextOutProtocolGuid,\r
+                   NULL,\r
+                   &HandleCount,\r
+                   &HandleBuffer\r
+                   );\r
+  if (!EFI_ERROR (Status)) {\r
+    for (Index = 0; Index < HandleCount; Index++) {\r
+      gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
+    }\r
+    for (Index = 0; Index < HandleCount; Index++) {\r
+      gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
+    }\r
+    if (HandleBuffer != NULL) {\r
+      FreePool (HandleBuffer);\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  This function converts an input device structure to a Unicode string.\r
+\r
+  @param DevPath      A pointer to the device path structure.\r
+\r
+  @return             A new allocated Unicode string that represents the device path.\r
+\r
+**/\r
+CHAR16 *\r
+UiDevicePathToStr (\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  CHAR16                           *ToText;\r
+  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
+\r
+  if (DevPath == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiDevicePathToTextProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &DevPathToText\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+  ToText = DevPathToText->ConvertDevicePathToText (\r
+                            DevPath,\r
+                            FALSE,\r
+                            TRUE\r
+                            );\r
+  ASSERT (ToText != NULL);\r
+  return ToText;\r
+}\r
+\r
+/**\r
+  Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
+  The caller is responsible for freeing the allocated buffer using FreePool().\r
+\r
+  @param DevicePath       Device path.\r
+\r
+  @return                 A new allocated string that represents the file name.\r
+\r
+**/\r
+CHAR16 *\r
+ExtractFileNameFromDevicePath (\r
+  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+  )\r
+{\r
+  CHAR16          *String;\r
+  CHAR16          *MatchString;\r
+  CHAR16          *LastMatch;\r
+  CHAR16          *FileName;\r
+  UINTN           Length;\r
+\r
+  ASSERT(DevicePath != NULL);\r
+\r
+  String = UiDevicePathToStr(DevicePath);\r
+  MatchString = String;\r
+  LastMatch   = String;\r
+\r
+  while(MatchString != NULL){\r
+    LastMatch   = MatchString + 1;\r
+    MatchString = StrStr(LastMatch,L"\\");\r
+  }\r
+\r
+  Length = StrLen(LastMatch);\r
+  FileName = AllocateCopyPool ((Length + 1) * sizeof(CHAR16), LastMatch);\r
+  *(FileName + Length) = 0;\r
+\r
+  FreePool(String);\r
+\r
+  return FileName;\r
+}\r
+\r
+/**\r
+  Extract device path for given HII handle and class guid.\r
+\r
+  @param Handle          The HII handle.\r
+\r
+  @retval  NULL          Fail to get the device path string.\r
+  @return  PathString    Get the device path string.\r
+\r
+**/\r
+CHAR16 *\r
+BmmExtractDevicePathFromHiiHandle (\r
+  IN      EFI_HII_HANDLE      Handle\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  EFI_HANDLE                       DriverHandle;\r
+\r
+  ASSERT (Handle != NULL);\r
+\r
+  if (Handle == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Get device path string.\r
+  //\r
+  return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
+\r
+}\r
+\r
+/**\r
+  This function allows a caller to extract the current configuration for one\r
+  or more named elements from the target driver.\r
+\r
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param Request         A null-terminated Unicode string in <ConfigRequest> format.\r
+  @param Progress        On return, points to a character in the Request string.\r
+                         Points to the string's null terminator if request was successful.\r
+                         Points to the most recent '&' before the first failing name/value\r
+                         pair (or the beginning of the string if the failure is in the\r
+                         first name/value pair) if the request was not successful.\r
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which\r
+                         has all values filled in for the names in the Request string.\r
+                         String to be allocated by the called function.\r
+\r
+  @retval  EFI_SUCCESS            The Results is filled with the requested values.\r
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
+  @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  )\r
+{\r
+  EFI_STATUS         Status;\r
+  UINTN              BufferSize;\r
+  BMM_CALLBACK_DATA  *Private;\r
+  EFI_STRING                       ConfigRequestHdr;\r
+  EFI_STRING                       ConfigRequest;\r
+  BOOLEAN                          AllocatedRequest;\r
+  UINTN                            Size;\r
+\r
+  if (Progress == NULL || Results == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  *Progress = Request;\r
+  if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mBootMaintGuid, mBootMaintStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  ConfigRequestHdr = NULL;\r
+  ConfigRequest    = NULL;\r
+  AllocatedRequest = FALSE;\r
+  Size             = 0;\r
+\r
+  Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
+  //\r
+  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
+  //\r
+  BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
+  ConfigRequest = Request;\r
+  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+    //\r
+    // Request has no request element, construct full request string.\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+    //\r
+    ConfigRequestHdr = HiiConstructConfigHdr (&mBootMaintGuid, mBootMaintStorageName, Private->BmmDriverHandle);\r
+    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (Size);\r
+    ASSERT (ConfigRequest != NULL);\r
+    AllocatedRequest = TRUE;\r
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+    FreePool (ConfigRequestHdr);\r
+  }\r
+\r
+  Status = gHiiConfigRouting->BlockToConfig (\r
+                                gHiiConfigRouting,\r
+                                ConfigRequest,\r
+                                (UINT8 *) &Private->BmmFakeNvData,\r
+                                BufferSize,\r
+                                Results,\r
+                                Progress\r
+                                );\r
+  //\r
+  // Free the allocated config request string.\r
+  //\r
+  if (AllocatedRequest) {\r
+    FreePool (ConfigRequest);\r
+    ConfigRequest = NULL;\r
+  }\r
+  //\r
+  // Set Progress string to the original request string.\r
+  //\r
+  if (Request == NULL) {\r
+    *Progress = NULL;\r
+  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+    *Progress = Request + StrLen (Request);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  This function applies changes in a driver's configuration.\r
+  Input is a Configuration, which has the routing data for this\r
+  driver followed by name / value configuration pairs. The driver\r
+  must apply those pairs to its configurable storage. If the\r
+  driver's configuration is stored in a linear block of data\r
+  and the driver's name / value pairs are in <BlockConfig>\r
+  format, it may use the ConfigToBlock helper function (above) to\r
+  simplify the job. Currently not implemented.\r
+\r
+  @param[in]  This                Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param[in]  Configuration       A null-terminated Unicode string in\r
+                                  <ConfigString> format.   \r
+  @param[out] Progress            A pointer to a string filled in with the\r
+                                  offset of the most recent '&' before the\r
+                                  first failing name / value pair (or the\r
+                                  beginn ing of the string if the failure\r
+                                  is in the first name / value pair) or\r
+                                  the terminating NULL if all was\r
+                                  successful.\r
+\r
+  @retval EFI_SUCCESS             The results have been distributed or are\r
+                                  awaiting distribution.  \r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the\r
+                                  parts of the results that must be\r
+                                  stored awaiting possible future\r
+                                  protocols.\r
+  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
+                                  Results parameter would result\r
+                                  in this type of error.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data\r
+                                  was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintRouteConfig (\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+  IN CONST EFI_STRING                     Configuration,\r
+  OUT EFI_STRING                          *Progress\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  UINTN                           BufferSize;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
+  BMM_FAKE_NV_DATA                *NewBmmData;\r
+  BMM_FAKE_NV_DATA                *OldBmmData;\r
+  BM_CONSOLE_CONTEXT              *NewConsoleContext;\r
+  BM_TERMINAL_CONTEXT             *NewTerminalContext;\r
+  BM_MENU_ENTRY                   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT                 *NewLoadContext;\r
+  UINT16                          Index;\r
+  BOOLEAN                         TerminalAttChange;\r
+  BMM_CALLBACK_DATA               *Private; \r
+\r
+  if (Progress == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  *Progress = Configuration;\r
+\r
+  if (Configuration == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Check routing data in <ConfigHdr>.\r
+  // Note: there is no name for Name/Value storage, only GUID will be checked\r
+  //\r
+  if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiConfigRoutingProtocolGuid, \r
+                  NULL, \r
+                  (VOID **)&ConfigRouting\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Private = BMM_CALLBACK_DATA_FROM_THIS (This);  \r
+  //\r
+  // Get Buffer Storage data from EFI variable\r
+  //\r
+  BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
+  OldBmmData = &Private->BmmOldFakeNVData;\r
+  NewBmmData = &Private->BmmFakeNvData;\r
+  //\r
+  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
+  //\r
+  Status = ConfigRouting->ConfigToBlock (\r
+                            ConfigRouting,\r
+                            Configuration,\r
+                            (UINT8 *) NewBmmData,\r
+                            &BufferSize,\r
+                            Progress\r
+                            );\r
+  ASSERT_EFI_ERROR (Status);    \r
+  //\r
+  // Compare new and old BMM configuration data and only do action for modified item to \r
+  // avoid setting unnecessary non-volatile variable\r
+  //\r
+\r
+  //\r
+  // Check data which located in BMM main page and save the settings if need\r
+  //         \r
+  if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) {\r
+    Status = Var_UpdateBootNext (Private);\r
+  }\r
+\r
+  //\r
+  // Check data which located in Boot Options Menu and save the settings if need\r
+  //      \r
+  if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) {  \r
+    for (Index = 0; \r
+         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); \r
+         Index ++) {\r
+      NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+      NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
+      NewBmmData->BootOptionDel[Index] = FALSE;\r
+      NewBmmData->BootOptionDelMark[Index] = FALSE;\r
+    }\r
+\r
+    Var_DelBootOption ();\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {\r
+    Status = Var_UpdateBootOrder (Private);\r
+  }\r
+\r
+  if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
+    Status = gRT->SetVariable(\r
+                    L"Timeout",\r
+                    &gEfiGlobalVariableGuid,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    sizeof(UINT16),\r
+                    &(NewBmmData->BootTimeOut)\r
+                    );\r
+    ASSERT_EFI_ERROR(Status);\r
+\r
+    Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
+  }\r
+\r
+  //\r
+  // Check data which located in Driver Options Menu and save the settings if need\r
+  //              \r
+  if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) {       \r
+    for (Index = 0; \r
+         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); \r
+         Index++) {\r
+      NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
+      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+      NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
+      NewBmmData->DriverOptionDel[Index] = FALSE;\r
+      NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
+    }\r
+    Var_DelDriverOption ();  \r
+  }\r
+\r
+  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
+    Status = Var_UpdateDriverOrder (Private);\r
+  }\r
+\r
+  if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
+    Var_UpdateConMode(Private);\r
+  }\r
+\r
+  TerminalAttChange = FALSE;\r
+  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+\r
+    //\r
+    // only need update modified items\r
+    //\r
+    if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 &&\r
+         CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) {\r
+      continue;\r
+    }\r
+\r
+    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+    ASSERT (NewMenuEntry != NULL);\r
+    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+    NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];\r
+    ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
+    NewTerminalContext->BaudRate      = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
+    NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
+    ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
+    NewTerminalContext->DataBits      = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
+    NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
+    ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
+    NewTerminalContext->StopBits      = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
+    NewTerminalContext->ParityIndex   = NewBmmData->COMParity[Index];\r
+    ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
+    NewTerminalContext->Parity        = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value;\r
+    NewTerminalContext->TerminalType  = NewBmmData->COMTerminalType[Index];\r
+    NewTerminalContext->FlowControl   = NewBmmData->COMFlowControl[Index];\r
+    ChangeTerminalDevicePath (\r
+      NewTerminalContext->DevicePath,\r
+      FALSE\r
+      );\r
+    TerminalAttChange = TRUE;\r
+  }\r
+  if (TerminalAttChange) {\r
+    Var_UpdateConsoleInpOption ();\r
+    Var_UpdateConsoleOutOption ();\r
+    Var_UpdateErrorOutOption ();\r
+  }\r
+  //\r
+  // Check data which located in Console Options Menu and save the settings if need\r
+  //\r
+  if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){\r
+    for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
+      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
+      NewConsoleContext           = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+      ASSERT (Index < MAX_MENU_NUMBER);\r
+      NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];\r
+    }\r
+    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+      ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
+      NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
+    }\r
+    Var_UpdateConsoleInpOption();\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
+    for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
+      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
+      NewConsoleContext           = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+      ASSERT (Index < MAX_MENU_NUMBER);\r
+      NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];\r
+    }\r
+    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+      ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
+      NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
+    }\r
+    Var_UpdateConsoleOutOption();\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
+    for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
+      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
+      NewConsoleContext           = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+      ASSERT (Index < MAX_MENU_NUMBER);\r
+      NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];\r
+    }\r
+    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+      ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
+      NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
+    }\r
+    Var_UpdateErrorOutOption();\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->BootDescriptionData, OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) != 0 ||\r
+       CompareMem (NewBmmData->BootOptionalData, OldBmmData->BootOptionalData, sizeof (NewBmmData->BootOptionalData)) != 0) {\r
+    Status = Var_UpdateBootOption (Private);\r
+    NewBmmData->BootOptionChanged = FALSE;\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+    BOpt_GetBootOptions (Private);\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->DriverDescriptionData, OldBmmData->DriverDescriptionData, sizeof (NewBmmData->DriverDescriptionData)) != 0 ||\r
+       CompareMem (NewBmmData->DriverOptionalData, OldBmmData->DriverOptionalData, sizeof (NewBmmData->DriverOptionalData)) != 0) {\r
+    Status = Var_UpdateDriverOption (\r
+              Private,\r
+              Private->BmmHiiHandle,\r
+              NewBmmData->DriverDescriptionData,\r
+              NewBmmData->DriverOptionalData,\r
+              NewBmmData->ForceReconnect\r
+              );\r
+    NewBmmData->DriverOptionChanged = FALSE;\r
+    NewBmmData->ForceReconnect      = TRUE;\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    BOpt_GetDriverOptions (Private);\r
+  }\r
+\r
+  //\r
+  // After user do the save action, need to update OldBmmData.\r
+  //\r
+  CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  This function processes the results of changes in configuration.\r
+\r
+\r
+  @param This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param Action             Specifies the type of action taken by the browser.\r
+  @param QuestionId         A unique value which is sent to the original exporting driver\r
+                            so that it can identify the type of data to expect.\r
+  @param Type               The type of value for the question.\r
+  @param Value              A pointer to the data being sent to the original exporting driver.\r
+  @param ActionRequest      On return, points to the action requested by the callback function.\r
+\r
+  @retval EFI_SUCCESS           The callback successfully handled the action.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.\r
+  @retval EFI_DEVICE_ERROR      The variable could not be saved.\r
+  @retval EFI_UNSUPPORTED       The specified Action is not supported by the callback.\r
+  @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL         *This,\r
+  IN        EFI_BROWSER_ACTION                     Action,\r
+  IN        EFI_QUESTION_ID                        QuestionId,\r
+  IN        UINT8                                  Type,\r
+  IN        EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT       EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  )\r
+{\r
+  BMM_CALLBACK_DATA *Private;\r
+  BM_MENU_ENTRY     *NewMenuEntry;\r
+  BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
+  UINTN             OldValue;\r
+  UINTN             NewValue;\r
+  UINTN             Number;\r
+  UINTN             Index;\r
+  EFI_DEVICE_PATH_PROTOCOL * File;\r
+\r
+  if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
+    //\r
+    // Do nothing for other UEFI Action. Only do call back when data is changed.\r
+    //\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  OldValue       = 0;\r
+  NewValue       = 0;\r
+  Number         = 0;\r
+\r
+  Private        = BMM_CALLBACK_DATA_FROM_THIS (This);\r
+  //\r
+  // Retrive uncommitted data from Form Browser\r
+  //\r
+  CurrentFakeNVMap = &Private->BmmFakeNvData;\r
+  HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);\r
+\r
+  if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+    if (Value == NULL) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+    \r
+    UpdatePageId (Private, QuestionId);\r
+\r
+    if (QuestionId < FILE_OPTION_OFFSET) {\r
+      if (QuestionId < CONFIG_OPTION_OFFSET) {\r
+        switch (QuestionId) {\r
+        case FORM_BOOT_ADD_ID:\r
+          // Leave BMM and enter FileExplorer. \r
+          ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateBootOptionFromFile, &File);\r
+          break;\r
+\r
+        case FORM_DRV_ADD_FILE_ID:\r
+          // Leave BMM and enter FileExplorer.\r
+          ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateDriverOptionFromFile, &File);\r
+          break;\r
+\r
+        case FORM_DRV_ADD_HANDLE_ID:\r
+          CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
+          UpdateDrvAddHandlePage (Private);\r
+          break;\r
+\r
+        case FORM_BOOT_DEL_ID:\r
+          CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
+          UpdateBootDelPage (Private);\r
+          break;\r
+\r
+        case FORM_BOOT_CHG_ID:\r
+        case FORM_DRV_CHG_ID:\r
+          UpdatePageBody (QuestionId, Private);\r
+          break;\r
+\r
+        case FORM_DRV_DEL_ID:\r
+          CleanUpPage (FORM_DRV_DEL_ID, Private);\r
+          UpdateDrvDelPage (Private);\r
+          break;\r
+\r
+        case FORM_BOOT_NEXT_ID:\r
+          CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
+          UpdateBootNextPage (Private);\r
+          break;\r
+\r
+        case FORM_TIME_OUT_ID:\r
+          CleanUpPage (FORM_TIME_OUT_ID, Private);\r
+          UpdateTimeOutPage (Private);\r
+          break;\r
+\r
+        case FORM_CON_IN_ID:\r
+        case FORM_CON_OUT_ID:\r
+        case FORM_CON_ERR_ID:\r
+          UpdatePageBody (QuestionId, Private);\r
+          break;\r
+\r
+        case FORM_CON_MODE_ID:\r
+          CleanUpPage (FORM_CON_MODE_ID, Private);\r
+          UpdateConModePage (Private);\r
+          break;\r
+\r
+        case FORM_CON_COM_ID:\r
+          CleanUpPage (FORM_CON_COM_ID, Private);\r
+          UpdateConCOMPage (Private);\r
+          break;\r
+\r
+        default:\r
+          break;\r
+        }\r
+      } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < CONSOLE_OPTION_OFFSET)) {\r
+        Index                  = (UINT16) (QuestionId - TERMINAL_OPTION_OFFSET);\r
+        Private->CurrentTerminal  = Index;\r
+\r
+        CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
+        UpdateTerminalPage (Private);\r
+\r
+      } else if (QuestionId >= HANDLE_OPTION_OFFSET) {\r
+        Index                  = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);\r
+\r
+        NewMenuEntry            = BOpt_GetMenuEntry (&DriverMenu, Index);\r
+        ASSERT (NewMenuEntry != NULL);\r
+        Private->HandleContext  = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+        CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
+\r
+        Private->MenuEntry                  = NewMenuEntry;\r
+        Private->LoadContext->FilePathList  = Private->HandleContext->DevicePath;\r
+\r
+        UpdateDriverAddHandleDescPage (Private);\r
+      }\r
+    }\r
+    if (QuestionId == KEY_VALUE_BOOT_FROM_FILE){\r
+      // Leave BMM and enter FileExplorer.\r
+      ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) BootFromFile, &File);\r
+    }\r
+  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
+    if ((Value == NULL) || (ActionRequest == NULL)) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+   \r
+    if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
+      CurrentFakeNVMap->BootOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+    } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
+      CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
+      //\r
+      // Discard changes and exit formset\r
+      //\r
+      CurrentFakeNVMap->DriverOptionalData[0]     = 0x0000;\r
+      CurrentFakeNVMap->DriverDescriptionData[0]  = 0x0000;\r
+      CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
+      CurrentFakeNVMap->ForceReconnect      = TRUE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
+      //\r
+      // Discard changes and exit formset\r
+      //\r
+      CurrentFakeNVMap->BootOptionalData[0]     = 0x0000;\r
+      CurrentFakeNVMap->BootDescriptionData[0]  = 0x0000;\r
+      CurrentFakeNVMap->BootOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+    } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
+      CurrentFakeNVMap->BootOptionChanged = TRUE;\r
+    } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
+      CurrentFakeNVMap->DriverOptionChanged = TRUE;\r
+    } \r
+\r
+    if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      if (Value->b){\r
+        //\r
+        // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
+        //\r
+        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
+      } else {\r
+        //\r
+        // Means user remove the old check status.\r
+        //\r
+        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
+      }\r
+    } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      if (Value->b){\r
+        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
+      } else {\r
+        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
+      }\r
+    } else {\r
+      switch (QuestionId) {\r
+      case KEY_VALUE_SAVE_AND_EXIT:\r
+      case KEY_VALUE_NO_SAVE_AND_EXIT:\r
+        if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
+          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+        } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
+          DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+        }\r
+\r
+        break;\r
+\r
+      case FORM_RESET:\r
+        gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+        return EFI_UNSUPPORTED;\r
+\r
+      default:\r
+        break;\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // Pass changed uncommitted data back to Form Browser\r
+  //\r
+  HiiSetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Discard all changes done to the BMM pages such as Boot Order change,\r
+  Driver order change.\r
+\r
+  @param Private            The BMM context data.\r
+  @param CurrentFakeNVMap   The current Fack NV Map.\r
+\r
+**/\r
+VOID\r
+DiscardChangeHandler (\r
+  IN  BMM_CALLBACK_DATA               *Private,\r
+  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap\r
+  )\r
+{\r
+  UINT16  Index;\r
+\r
+  switch (Private->BmmPreviousPageId) {\r
+  case FORM_BOOT_CHG_ID:\r
+    CopyMem (CurrentFakeNVMap->BootOptionOrder, Private->BmmOldFakeNVData.BootOptionOrder, sizeof (CurrentFakeNVMap->BootOptionOrder));\r
+    break;\r
+\r
+  case FORM_DRV_CHG_ID:\r
+    CopyMem (CurrentFakeNVMap->DriverOptionOrder, Private->BmmOldFakeNVData.DriverOptionOrder, sizeof (CurrentFakeNVMap->DriverOptionOrder));\r
+    break;\r
+\r
+  case FORM_BOOT_DEL_ID:\r
+    ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
+    for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+      CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
+    }\r
+    break;\r
+\r
+  case FORM_DRV_DEL_ID:\r
+    ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
+    for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+      CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
+    }\r
+    break;\r
+\r
+  case FORM_BOOT_NEXT_ID:\r
+    CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
+    break;\r
+\r
+  case FORM_TIME_OUT_ID:\r
+    CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
+    break;\r
+\r
+  case FORM_DRV_ADD_HANDLE_DESC_ID:\r
+  case FORM_DRV_ADD_FILE_ID:\r
+  case FORM_DRV_ADD_HANDLE_ID:\r
+    CurrentFakeNVMap->DriverAddHandleDesc[0]          = 0x0000;\r
+    CurrentFakeNVMap->DriverAddHandleOptionalData[0]  = 0x0000;\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+}\r
+\r
+/**\r
+  Create dynamic code for BMM.\r
+\r
+  @param  BmmCallbackInfo        The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitializeDrivers(\r
+  IN BMM_CALLBACK_DATA        *BmmCallbackInfo\r
+  )\r
+{\r
+  EFI_HII_HANDLE              HiiHandle;\r
+  VOID                        *StartOpCodeHandle;\r
+  VOID                        *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL          *StartLabel;\r
+  EFI_IFR_GUID_LABEL          *EndLabel;\r
+  UINTN                       Index;    \r
+  EFI_STRING                  String;\r
+  EFI_STRING_ID               Token;\r
+  EFI_STRING_ID               TokenHelp;  \r
+  EFI_HII_HANDLE              *HiiHandles;\r
+  EFI_GUID                    FormSetGuid;\r
+  CHAR16                      *DevicePathStr;\r
+  EFI_STRING_ID               DevicePathId;\r
+  EFI_IFR_FORM_SET            *Buffer;      \r
+  UINTN                       BufferSize;   \r
+  UINT8                       ClassGuidNum; \r
+  EFI_GUID                    *ClassGuid;   \r
+  UINTN                       TempSize;\r
+  UINT8                       *Ptr;\r
+  EFI_STATUS                  Status;\r
+\r
+  TempSize =0;\r
+  BufferSize = 0;\r
+  Buffer = NULL;\r
+\r
+  HiiHandle = BmmCallbackInfo->BmmHiiHandle;\r
+  //\r
+  // Allocate space for creation of UpdateData Buffer\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number       = LABEL_BMM_PLATFORM_INFORMATION;\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = LABEL_END;\r
+\r
+  //\r
+  // Get all the Hii handles\r
+  //\r
+  HiiHandles = HiiGetHiiHandles (NULL);\r
+  ASSERT (HiiHandles != NULL);\r
+\r
+  //\r
+  // Search for formset of each class type\r
+  //\r
+  for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
+    Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+\r
+    Ptr = (UINT8 *)Buffer;\r
+    while(TempSize < BufferSize)  {\r
+      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+\r
+      if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
+        Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+        continue;\r
+      }\r
+\r
+      //\r
+      // Find FormSet OpCode\r
+      //\r
+      ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
+      ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
+      while (ClassGuidNum-- > 0) {\r
+        if (CompareGuid (&gEfiIfrBootMaintenanceGuid, ClassGuid) == 0){\r
+          ClassGuid ++;\r
+          continue;\r
+        }\r
+\r
+        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
+        if (String == NULL) {\r
+          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
+          ASSERT (String != NULL);\r
+        }\r
+        Token = HiiSetString (HiiHandle, 0, String, NULL);\r
+        FreePool (String);\r
+\r
+        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
+        if (String == NULL) {\r
+          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
+          ASSERT (String != NULL);\r
+        }\r
+        TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
+        FreePool (String);\r
+\r
+        FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
+\r
+        DevicePathStr = BmmExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
+        DevicePathId  = 0;\r
+        if (DevicePathStr != NULL){\r
+          DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
+          FreePool (DevicePathStr);\r
+        }\r
+         HiiCreateGotoExOpCode (\r
+           StartOpCodeHandle,\r
+           0,\r
+           Token,\r
+           TokenHelp,\r
+           0,\r
+           (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
+           0,\r
+           &FormSetGuid,\r
+           DevicePathId\r
+         );\r
+        break;\r
+      }\r
+      Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+    }\r
+\r
+    FreePool(Buffer);\r
+    Buffer = NULL;\r
+    TempSize = 0;\r
+    BufferSize = 0;\r
+  } \r
+  \r
+  HiiUpdateForm (\r
+    HiiHandle,\r
+    &mBootMaintGuid,\r
+    FORM_MAIN_ID,\r
+    StartOpCodeHandle,\r
+    EndOpCodeHandle\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);  \r
+  FreePool (HiiHandles);\r
+}\r
+\r
+/**\r
+   Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and\r
+   BmmOldFakeNVData member in BMM context data.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitializeBmmConfig (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT16          Index;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+\r
+  InitializeDrivers (CallbackData);\r
+\r
+  //\r
+  // Initialize data which located in BMM main page\r
+  //\r
+  CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
+  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+    NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+    NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+    if (NewLoadContext->IsBootNext) {\r
+      CallbackData->BmmFakeNvData.BootNext = Index;\r
+      break;\r
+    }\r
+  }\r
+\r
+  CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
+\r
+  //\r
+  // Initialize data which located in Boot Options Menu\r
+  //\r
+  GetBootOrder (CallbackData);\r
+\r
+  //\r
+  // Initialize data which located in Driver Options Menu\r
+  //\r
+  GetDriverOrder (CallbackData);\r
+\r
+  //\r
+  // Initialize data which located in Console Options Menu\r
+  //\r
+  GetConsoleOutMode (CallbackData);\r
+  GetConsoleInCheck (CallbackData);\r
+  GetConsoleOutCheck (CallbackData);\r
+  GetConsoleErrCheck (CallbackData);\r
+  GetTerminalAttribute (CallbackData);\r
+\r
+  CallbackData->BmmFakeNvData.ForceReconnect = TRUE;\r
+\r
+  //\r
+  // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
+  //\r
+  CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
+}\r
+\r
+/**\r
+  Initialized all Menu Option List.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitAllMenu (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  InitializeListHead (&BootOptionMenu.Head);\r
+  InitializeListHead (&DriverOptionMenu.Head);\r
+  BOpt_GetBootOptions (CallbackData);\r
+  BOpt_GetDriverOptions (CallbackData);\r
+  BOpt_FindDrivers ();\r
+  InitializeListHead (&ConsoleInpMenu.Head);\r
+  InitializeListHead (&ConsoleOutMenu.Head);\r
+  InitializeListHead (&ConsoleErrMenu.Head);\r
+  InitializeListHead (&TerminalMenu.Head);\r
+  LocateSerialIo ();\r
+  GetAllConsoles ();\r
+  mAllMenuInit = TRUE;\r
+}\r
+\r
+/**\r
+  Free up all Menu Option list.\r
+\r
+**/\r
+VOID\r
+FreeAllMenu (\r
+  VOID\r
+  )\r
+{\r
+  if (!mAllMenuInit){\r
+    return;\r
+  }\r
+  BOpt_FreeMenu (&BootOptionMenu);\r
+  BOpt_FreeMenu (&DriverOptionMenu);\r
+  BOpt_FreeMenu (&DriverMenu);\r
+  FreeAllConsoles ();\r
+  mAllMenuInit = FALSE;\r
+}\r
+\r
+/**\r
+\r
+  Install Boot Maintenance Manager Menu driver.\r
+\r
+  @param ImageHandle     The image handle.\r
+  @param SystemTable     The system table.\r
+\r
+  @retval  EFI_SUCEESS  Install Boot manager menu success.\r
+  @retval  Other        Return error status.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintenanceManagerLibConstructor (\r
+  IN EFI_HANDLE                            ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                      *SystemTable\r
+  )\r
+\r
+{\r
+  EFI_STATUS               Status;\r
+  UINT8                    *Ptr;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  //\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mBmmCallbackInfo->BmmDriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mBmmHiiVendorDevicePath,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  &mBmmCallbackInfo->BmmConfigAccess,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Post our Boot Maint VFR binary to the HII database.\r
+  //\r
+  mBmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
+                                    &mBootMaintGuid,\r
+                                    mBmmCallbackInfo->BmmDriverHandle,\r
+                                    BootMaintenanceManagerBin,\r
+                                    BootMaintenanceManagerLibStrings,\r
+                                    NULL\r
+                                    );\r
+  ASSERT (mBmmCallbackInfo->BmmHiiHandle != NULL);\r
+\r
+  //\r
+  // Locate Formbrowser2 protocol\r
+  //\r
+  Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mBmmCallbackInfo->FormBrowser2);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  EfiBootManagerRefreshAllBootOption ();\r
+\r
+  //\r
+  // Create LoadOption in BmmCallbackInfo for Driver Callback\r
+  //\r
+  Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
+  ASSERT (Ptr != NULL);\r
+\r
+  //\r
+  // Initialize Bmm callback data.\r
+  //\r
+  mBmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
+  Ptr += sizeof (BM_LOAD_CONTEXT);\r
+\r
+  mBmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
+  Ptr += sizeof (BM_FILE_CONTEXT);\r
+\r
+  mBmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
+  Ptr += sizeof (BM_HANDLE_CONTEXT);\r
+\r
+  mBmmCallbackInfo->MenuEntry     = (BM_MENU_ENTRY *) Ptr;\r
+\r
+  mBmmCallbackInfo->BmmPreviousPageId  = FORM_MAIN_ID;\r
+  mBmmCallbackInfo->BmmCurrentPageId   = FORM_MAIN_ID;\r
+\r
+  InitAllMenu (mBmmCallbackInfo);\r
+\r
+  CreateUpdateData();\r
+  //\r
+  // Update boot maintenance manager page \r
+  //\r
+  InitializeBmmConfig(mBmmCallbackInfo);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Unloads the application and its installed protocol.\r
+\r
+  @param ImageHandle       Handle that identifies the image to be unloaded.\r
+  @param  SystemTable      The system table.\r
+\r
+  @retval EFI_SUCCESS      The image has been unloaded.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintenanceManagerLibDestructor (\r
+  IN EFI_HANDLE                            ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                      *SystemTable\r
+  )\r
+\r
+{\r
+  if (mStartOpCodeHandle != NULL) {\r
+    HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
+  }\r
+\r
+  if (mEndOpCodeHandle != NULL) {\r
+    HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
+  }\r
+\r
+  FreeAllMenu ();\r
+\r
+  //\r
+  // Remove our IFR data from HII database\r
+  //\r
+  HiiRemovePackages (mBmmCallbackInfo->BmmHiiHandle);\r
+\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         mBmmCallbackInfo->BmmDriverHandle,\r
+         &gEfiDevicePathProtocolGuid,\r
+         &mBmmHiiVendorDevicePath,\r
+         &gEfiHiiConfigAccessProtocolGuid,\r
+         &mBmmCallbackInfo->BmmConfigAccess,\r
+         NULL\r
+         );\r
+\r
+  FreePool (mBmmCallbackInfo->LoadContext);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h
new file mode 100644 (file)
index 0000000..24526e1
--- /dev/null
@@ -0,0 +1,1388 @@
+/** @file\r
+Header file for boot maintenance module.\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
+\r
+**/\r
+\r
+#ifndef _BOOT_MAINT_H_\r
+#define _BOOT_MAINT_H_\r
+\r
+#include "FormGuid.h"\r
+\r
+#include <Guid/TtyTerm.h>\r
+#include <Guid/MdeModuleHii.h>\r
+#include <Guid/FileSystemVolumeLabelInfo.h>\r
+#include <Guid/GlobalVariable.h>\r
+#include <Guid/HiiBootMaintenanceFormset.h>\r
+\r
+#include <Protocol/LoadFile.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/SimpleFileSystem.h>\r
+#include <Protocol/SerialIo.h>\r
+#include <Protocol/DevicePathToText.h>\r
+\r
+#include <Library/PrintLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/UefiHiiServicesLib.h>\r
+#include <Library/UefiBootManagerLib.h>\r
+#include <Library/FileExplorerLib.h>\r
+\r
+#pragma pack(1)\r
+\r
+///\r
+/// HII specific Vendor Device Path definition.\r
+///\r
+typedef struct {\r
+  VENDOR_DEVICE_PATH             VendorDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL       End;\r
+} HII_VENDOR_DEVICE_PATH;\r
+#pragma pack()\r
+\r
+//\r
+// Constants which are variable names used to access variables\r
+//\r
+\r
+#define VAR_CON_OUT_MODE L"ConOutMode"\r
+\r
+//\r
+// Variable created with this flag will be "Efi:...."\r
+//\r
+#define VAR_FLAG  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE\r
+\r
+extern EFI_GUID mBootMaintGuid;\r
+extern CHAR16   mBootMaintStorageName[];\r
+//\r
+// These are the VFR compiler generated data representing our VFR data.\r
+//\r
+extern UINT8    BootMaintenanceManagerBin[];\r
+\r
+//\r
+// Below are the number of options in Baudrate, Databits,\r
+// Parity and Stopbits selection for serial ports.\r
+//\r
+#define BM_COM_ATTR_BUADRATE  19\r
+#define BM_COM_ATTR_DATABITS  4\r
+#define BM_COM_ATTR_PARITY    5\r
+#define BM_COM_ATTR_STOPBITS  3\r
+\r
+//\r
+// Callback function helper\r
+//\r
+#define BMM_CALLBACK_DATA_SIGNATURE     SIGNATURE_32 ('C', 'b', 'c', 'k')\r
+#define BMM_CALLBACK_DATA_FROM_THIS(a)  CR (a, BMM_CALLBACK_DATA, BmmConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)\r
+\r
+//\r
+// Enumeration type definition\r
+//\r
+typedef UINT8 BBS_TYPE;\r
+\r
+typedef enum _TYPE_OF_TERMINAL {\r
+  TerminalTypePcAnsi                = 0,\r
+  TerminalTypeVt100,\r
+  TerminalTypeVt100Plus,\r
+  TerminalTypeVtUtf8,\r
+  TerminalTypeTtyTerm\r
+} TYPE_OF_TERMINAL;\r
+\r
+//\r
+// All of the signatures that will be used in list structure\r
+//\r
+#define BM_MENU_OPTION_SIGNATURE      SIGNATURE_32 ('m', 'e', 'n', 'u')\r
+#define BM_LOAD_OPTION_SIGNATURE      SIGNATURE_32 ('l', 'o', 'a', 'd')\r
+#define BM_CONSOLE_OPTION_SIGNATURE   SIGNATURE_32 ('c', 'n', 's', 'l')\r
+#define BM_FILE_OPTION_SIGNATURE      SIGNATURE_32 ('f', 'i', 'l', 'e')\r
+#define BM_HANDLE_OPTION_SIGNATURE    SIGNATURE_32 ('h', 'n', 'd', 'l')\r
+#define BM_TERMINAL_OPTION_SIGNATURE  SIGNATURE_32 ('t', 'r', 'm', 'l')\r
+#define BM_MENU_ENTRY_SIGNATURE       SIGNATURE_32 ('e', 'n', 't', 'r')\r
+\r
+#define BM_LOAD_CONTEXT_SELECT        0x0\r
+#define BM_CONSOLE_CONTEXT_SELECT     0x1\r
+#define BM_FILE_CONTEXT_SELECT        0x2\r
+#define BM_HANDLE_CONTEXT_SELECT      0x3\r
+#define BM_TERMINAL_CONTEXT_SELECT    0x5\r
+\r
+#define BM_CONSOLE_IN_CONTEXT_SELECT  0x6\r
+#define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7\r
+#define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8\r
+\r
+//\r
+// Buffer size for update data\r
+//\r
+#define UPDATE_DATA_SIZE        0x100000\r
+\r
+//\r
+// Namespace of callback keys used in display and file system navigation\r
+//\r
+#define MAX_BBS_OFFSET          0xE000\r
+#define NET_OPTION_OFFSET       0xD800\r
+#define BEV_OPTION_OFFSET       0xD000\r
+#define FD_OPTION_OFFSET        0xC000\r
+#define HD_OPTION_OFFSET        0xB000\r
+#define CD_OPTION_OFFSET        0xA000\r
+#define FILE_OPTION_OFFSET      0x8000\r
+#define FILE_OPTION_MASK        0x7FFF\r
+#define HANDLE_OPTION_OFFSET    0x7000\r
+#define CONSOLE_OPTION_OFFSET   0x6000\r
+#define TERMINAL_OPTION_OFFSET  0x5000\r
+#define CONFIG_OPTION_OFFSET    0x1200\r
+#define KEY_VALUE_OFFSET        0x1100\r
+#define FORM_ID_OFFSET          0x1000\r
+\r
+//\r
+// VarOffset that will be used to create question\r
+// all these values are computed from the structure\r
+// defined below\r
+//\r
+#define VAR_OFFSET(Field)              ((UINT16) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field)))\r
+\r
+//\r
+// Question Id of Zero is invalid, so add an offset to it\r
+//\r
+#define QUESTION_ID(Field)             (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)\r
+\r
+#define BOOT_TIME_OUT_VAR_OFFSET        VAR_OFFSET (BootTimeOut)\r
+#define BOOT_NEXT_VAR_OFFSET            VAR_OFFSET (BootNext)\r
+#define COM1_BAUD_RATE_VAR_OFFSET       VAR_OFFSET (COM1BaudRate)\r
+#define COM1_DATA_RATE_VAR_OFFSET       VAR_OFFSET (COM1DataRate)\r
+#define COM1_STOP_BITS_VAR_OFFSET       VAR_OFFSET (COM1StopBits)\r
+#define COM1_PARITY_VAR_OFFSET          VAR_OFFSET (COM1Parity)\r
+#define COM1_TERMINAL_VAR_OFFSET        VAR_OFFSET (COM2TerminalType)\r
+#define COM2_BAUD_RATE_VAR_OFFSET       VAR_OFFSET (COM2BaudRate)\r
+#define COM2_DATA_RATE_VAR_OFFSET       VAR_OFFSET (COM2DataRate)\r
+#define COM2_STOP_BITS_VAR_OFFSET       VAR_OFFSET (COM2StopBits)\r
+#define COM2_PARITY_VAR_OFFSET          VAR_OFFSET (COM2Parity)\r
+#define COM2_TERMINAL_VAR_OFFSET        VAR_OFFSET (COM2TerminalType)\r
+#define DRV_ADD_HANDLE_DESC_VAR_OFFSET  VAR_OFFSET (DriverAddHandleDesc)\r
+#define DRV_ADD_ACTIVE_VAR_OFFSET       VAR_OFFSET (DriverAddActive)\r
+#define DRV_ADD_RECON_VAR_OFFSET        VAR_OFFSET (DriverAddForceReconnect)\r
+#define CON_IN_COM1_VAR_OFFSET          VAR_OFFSET (ConsoleInputCOM1)\r
+#define CON_IN_COM2_VAR_OFFSET          VAR_OFFSET (ConsoleInputCOM2)\r
+#define CON_OUT_COM1_VAR_OFFSET         VAR_OFFSET (ConsoleOutputCOM1)\r
+#define CON_OUT_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleOutputCOM2)\r
+#define CON_ERR_COM1_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM1)\r
+#define CON_ERR_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM2)\r
+#define CON_MODE_VAR_OFFSET             VAR_OFFSET (ConsoleOutMode)\r
+#define CON_DEVICE_VAR_OFFSET           VAR_OFFSET (ConsoleCheck)\r
+#define CON_IN_DEVICE_VAR_OFFSET        VAR_OFFSET (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_VAR_OFFSET       VAR_OFFSET (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_VAR_OFFSET       VAR_OFFSET (ConsoleErrCheck)\r
+#define BOOT_OPTION_ORDER_VAR_OFFSET    VAR_OFFSET (BootOptionOrder)\r
+#define DRIVER_OPTION_ORDER_VAR_OFFSET  VAR_OFFSET (DriverOptionOrder)\r
+#define BOOT_OPTION_DEL_VAR_OFFSET      VAR_OFFSET (BootOptionDel)\r
+#define DRIVER_OPTION_DEL_VAR_OFFSET    VAR_OFFSET (DriverOptionDel)\r
+#define DRIVER_ADD_OPTION_VAR_OFFSET    VAR_OFFSET (DriverAddHandleOptionalData)\r
+#define COM_BAUD_RATE_VAR_OFFSET        VAR_OFFSET (COMBaudRate)\r
+#define COM_DATA_RATE_VAR_OFFSET        VAR_OFFSET (COMDataRate)\r
+#define COM_STOP_BITS_VAR_OFFSET        VAR_OFFSET (COMStopBits)\r
+#define COM_PARITY_VAR_OFFSET           VAR_OFFSET (COMParity)\r
+#define COM_TERMINAL_VAR_OFFSET         VAR_OFFSET (COMTerminalType)\r
+#define COM_FLOWCONTROL_VAR_OFFSET      VAR_OFFSET (COMFlowControl)\r
+\r
+#define BOOT_TIME_OUT_QUESTION_ID       QUESTION_ID (BootTimeOut)\r
+#define BOOT_NEXT_QUESTION_ID           QUESTION_ID (BootNext)\r
+#define COM1_BAUD_RATE_QUESTION_ID      QUESTION_ID (COM1BaudRate)\r
+#define COM1_DATA_RATE_QUESTION_ID      QUESTION_ID (COM1DataRate)\r
+#define COM1_STOP_BITS_QUESTION_ID      QUESTION_ID (COM1StopBits)\r
+#define COM1_PARITY_QUESTION_ID         QUESTION_ID (COM1Parity)\r
+#define COM1_TERMINAL_QUESTION_ID       QUESTION_ID (COM2TerminalType)\r
+#define COM2_BAUD_RATE_QUESTION_ID      QUESTION_ID (COM2BaudRate)\r
+#define COM2_DATA_RATE_QUESTION_ID      QUESTION_ID (COM2DataRate)\r
+#define COM2_STOP_BITS_QUESTION_ID      QUESTION_ID (COM2StopBits)\r
+#define COM2_PARITY_QUESTION_ID         QUESTION_ID (COM2Parity)\r
+#define COM2_TERMINAL_QUESTION_ID       QUESTION_ID (COM2TerminalType)\r
+#define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)\r
+#define DRV_ADD_ACTIVE_QUESTION_ID      QUESTION_ID (DriverAddActive)\r
+#define DRV_ADD_RECON_QUESTION_ID       QUESTION_ID (DriverAddForceReconnect)\r
+#define CON_IN_COM1_QUESTION_ID         QUESTION_ID (ConsoleInputCOM1)\r
+#define CON_IN_COM2_QUESTION_ID         QUESTION_ID (ConsoleInputCOM2)\r
+#define CON_OUT_COM1_QUESTION_ID        QUESTION_ID (ConsoleOutputCOM1)\r
+#define CON_OUT_COM2_QUESTION_ID        QUESTION_ID (ConsoleOutputCOM2)\r
+#define CON_ERR_COM1_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM1)\r
+#define CON_ERR_COM2_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM2)\r
+#define CON_MODE_QUESTION_ID            QUESTION_ID (ConsoleOutMode)\r
+#define CON_DEVICE_QUESTION_ID          QUESTION_ID (ConsoleCheck)\r
+#define CON_IN_DEVICE_QUESTION_ID       QUESTION_ID (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_QUESTION_ID      QUESTION_ID (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_QUESTION_ID      QUESTION_ID (ConsoleErrCheck)\r
+#define BOOT_OPTION_ORDER_QUESTION_ID   QUESTION_ID (BootOptionOrder)\r
+#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
+#define BOOT_OPTION_DEL_QUESTION_ID     QUESTION_ID (BootOptionDel)\r
+#define DRIVER_OPTION_DEL_QUESTION_ID   QUESTION_ID (DriverOptionDel)\r
+#define DRIVER_ADD_OPTION_QUESTION_ID   QUESTION_ID (DriverAddHandleOptionalData)\r
+#define COM_BAUD_RATE_QUESTION_ID       QUESTION_ID (COMBaudRate)\r
+#define COM_DATA_RATE_QUESTION_ID       QUESTION_ID (COMDataRate)\r
+#define COM_STOP_BITS_QUESTION_ID       QUESTION_ID (COMStopBits)\r
+#define COM_PARITY_QUESTION_ID          QUESTION_ID (COMParity)\r
+#define COM_TERMINAL_QUESTION_ID        QUESTION_ID (COMTerminalType)\r
+#define COM_FLOWCONTROL_QUESTION_ID     QUESTION_ID (COMFlowControl)\r
+\r
+#define STRING_DEPOSITORY_NUMBER        8\r
+\r
+#define NONE_BOOTNEXT_VALUE             (0xFFFF + 1)\r
+\r
+///\r
+/// Serial Ports attributes, first one is the value for\r
+/// return from callback function, stringtoken is used to\r
+/// display the value properly\r
+///\r
+typedef struct {\r
+  UINTN   Value;\r
+  UINT16  StringToken;\r
+} COM_ATTR;\r
+\r
+typedef struct {\r
+  UINT64                    BaudRate;\r
+  UINT8                     DataBits;\r
+  UINT8                     Parity;\r
+  UINT8                     StopBits;\r
+\r
+  UINT8                     BaudRateIndex;\r
+  UINT8                     DataBitsIndex;\r
+  UINT8                     ParityIndex;\r
+  UINT8                     StopBitsIndex;\r
+\r
+  UINT8                     FlowControl;\r
+\r
+  UINT8                     IsConIn;\r
+  UINT8                     IsConOut;\r
+  UINT8                     IsStdErr;\r
+  UINT8                     TerminalType;\r
+\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+} BM_TERMINAL_CONTEXT;\r
+\r
+typedef struct {\r
+  BOOLEAN                   IsBootNext;\r
+  BOOLEAN                   LoadOptionModified;\r
+  BOOLEAN                   Deleted;\r
+\r
+  BOOLEAN                   IsLegacy;\r
+  BOOLEAN                   IsActive;\r
+  BOOLEAN                   ForceReconnect;\r
+  UINTN                     OptionalDataSize;\r
+\r
+  UINTN                     LoadOptionSize;\r
+  UINT8                     *LoadOption;\r
+\r
+  UINT32                    Attributes;\r
+  UINT16                    FilePathListLength;\r
+  UINT16                    *Description;\r
+  EFI_DEVICE_PATH_PROTOCOL  *FilePathList;\r
+  UINT8                     *OptionalData;\r
+\r
+  UINT16                    BbsIndex;\r
+} BM_LOAD_CONTEXT;\r
+\r
+typedef struct {\r
+\r
+  BOOLEAN                   IsActive;\r
+\r
+  BOOLEAN                   IsTerminal;\r
+\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+} BM_CONSOLE_CONTEXT;\r
+\r
+typedef struct {\r
+  UINTN   Column;\r
+  UINTN   Row;\r
+} CONSOLE_OUT_MODE;\r
+\r
+typedef struct {\r
+  EFI_HANDLE                        Handle;\r
+  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;\r
+  EFI_FILE_HANDLE                   FHandle;\r
+  UINT16                            *FileName;\r
+  EFI_FILE_SYSTEM_VOLUME_LABEL      *Info;\r
+\r
+  BOOLEAN                           IsRoot;\r
+  BOOLEAN                           IsDir;\r
+  BOOLEAN                           IsRemovableMedia;\r
+  BOOLEAN                           IsLoadFile;\r
+  BOOLEAN                           IsBootLegacy;\r
+} BM_FILE_CONTEXT;\r
+\r
+typedef struct {\r
+  EFI_HANDLE                Handle;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+} BM_HANDLE_CONTEXT;\r
+\r
+typedef struct {\r
+  UINTN           Signature;\r
+  LIST_ENTRY      Head;\r
+  UINTN           MenuNumber;\r
+} BM_MENU_OPTION;\r
+\r
+typedef struct {\r
+  UINTN           Signature;\r
+  LIST_ENTRY      Link;\r
+  UINTN           OptionNumber;\r
+  UINT16          *DisplayString;\r
+  UINT16          *HelpString;\r
+  EFI_STRING_ID   DisplayStringToken;\r
+  EFI_STRING_ID   HelpStringToken;\r
+  UINTN           ContextSelection;\r
+  VOID            *VariableContext;\r
+} BM_MENU_ENTRY;\r
+\r
+typedef struct {\r
+  \r
+  UINTN                          Signature;\r
+\r
+  EFI_HII_HANDLE                 BmmHiiHandle;\r
+  EFI_HANDLE                     BmmDriverHandle;\r
+  ///\r
+  /// Boot Maintenance  Manager Produced protocols\r
+  ///\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL BmmConfigAccess;\r
+  EFI_FORM_BROWSER2_PROTOCOL     *FormBrowser2;\r
+\r
+  BM_MENU_ENTRY                  *MenuEntry;\r
+  BM_HANDLE_CONTEXT              *HandleContext;\r
+  BM_FILE_CONTEXT                *FileContext;\r
+  BM_LOAD_CONTEXT                *LoadContext;\r
+  BM_TERMINAL_CONTEXT            *TerminalContext;\r
+  UINTN                          CurrentTerminal;\r
+  BBS_TYPE                       BbsType;\r
+\r
+  //\r
+  // BMM main formset callback data.\r
+  //\r
+  \r
+  EFI_FORM_ID                    BmmCurrentPageId;\r
+  EFI_FORM_ID                    BmmPreviousPageId;\r
+  BOOLEAN                        BmmAskSaveOrNot;\r
+  BMM_FAKE_NV_DATA               BmmFakeNvData;\r
+  BMM_FAKE_NV_DATA               BmmOldFakeNVData;\r
+\r
+} BMM_CALLBACK_DATA;\r
+\r
+/**\r
+\r
+  Find drivers that will be added as Driver#### variables from handles\r
+  in current system environment\r
+  All valid handles in the system except those consume SimpleFs, LoadFile\r
+  are stored in DriverMenu for future use.\r
+\r
+  @retval EFI_SUCCESS The function complets successfully.\r
+  @return Other value if failed to build the DriverMenu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindDrivers (\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+  Build the BootOptionMenu according to BootOrder Variable.\r
+  This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
+\r
+  @param CallbackData The BMM context data.\r
+\r
+  @return The number of the Var Boot####.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetBootOptions (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Build up all DriverOptionMenu\r
+\r
+  @param CallbackData The BMM context data.\r
+\r
+  @return EFI_SUCESS The functin completes successfully.\r
+  @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
+  \r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetDriverOptions (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData\r
+  );\r
+\r
+/**\r
+  Free resources allocated in Allocate Rountine.\r
+\r
+  @param FreeMenu        Menu to be freed\r
+\r
+**/\r
+VOID\r
+BOpt_FreeMenu (\r
+  BM_MENU_OPTION        *FreeMenu\r
+  );\r
+\r
+/**\r
+\r
+  Get the Option Number that has not been allocated for use.\r
+\r
+  @param Type  The type of Option.\r
+\r
+  @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetOptionNumber (\r
+  CHAR16        *Type\r
+  );\r
+\r
+/**\r
+\r
+  Get the Option Number for Boot#### that does not used.\r
+\r
+  @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetBootOptionNumber (\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+Get the Option Number for Driver#### that does not used.\r
+\r
+@return The unused Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetDriverOptionNumber (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Create a menu entry give a Menu type.\r
+\r
+  @param MenuType        The Menu type to be created.\r
+\r
+\r
+  @retval NULL           If failed to create the menu.\r
+  @return                The menu.\r
+\r
+**/\r
+BM_MENU_ENTRY                     *\r
+BOpt_CreateMenuEntry (\r
+  UINTN           MenuType\r
+  );\r
+\r
+/**\r
+  Free up all resource allocated for a BM_MENU_ENTRY.\r
+\r
+  @param MenuEntry   A pointer to BM_MENU_ENTRY.\r
+\r
+**/\r
+VOID\r
+BOpt_DestroyMenuEntry (\r
+  BM_MENU_ENTRY         *MenuEntry\r
+  );\r
+\r
+/**\r
+  Get the Menu Entry from the list in Menu Entry List.\r
+\r
+  If MenuNumber is great or equal to the number of Menu\r
+  Entry in the list, then ASSERT.\r
+\r
+  @param MenuOption      The Menu Entry List to read the menu entry.\r
+  @param MenuNumber      The index of Menu Entry.\r
+\r
+  @return The Menu Entry.\r
+\r
+**/\r
+BM_MENU_ENTRY                     *\r
+BOpt_GetMenuEntry (\r
+  BM_MENU_OPTION      *MenuOption,\r
+  UINTN               MenuNumber\r
+  );\r
+\r
+/**\r
+  Get option number according to Boot#### and BootOrder variable. \r
+  The value is saved as #### + 1.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID  \r
+GetBootOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+  Get driver option order from globalc DriverOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  \r
+**/\r
+VOID  \r
+GetDriverOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+//\r
+// Locate all serial io devices for console\r
+//\r
+/**\r
+  Build a list containing all serial devices.\r
+\r
+  @retval EFI_SUCCESS The function complete successfully.\r
+  @retval EFI_UNSUPPORTED No serial ports present.\r
+\r
+**/\r
+EFI_STATUS\r
+LocateSerialIo (\r
+  VOID\r
+  );\r
+\r
+//\r
+// Initializing Console menu\r
+//\r
+/**\r
+  Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+  @retval EFI_SUCCESS    The function always complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetAllConsoles(\r
+  VOID\r
+  );\r
+\r
+//\r
+// Get current mode information\r
+//\r
+/**\r
+  Get mode number according to column and row\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+GetConsoleOutMode (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+//\r
+// Cleaning up console menu\r
+//\r
+/**\r
+  Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+  @retval EFI_SUCCESS    The function always complete successfully.\r
+**/\r
+EFI_STATUS\r
+FreeAllConsoles (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Update the device path that describing a terminal device\r
+  based on the new BaudRate, Data Bits, parity and Stop Bits\r
+  set.\r
+\r
+  @param DevicePath     The devicepath protocol instance wanted to be updated.\r
+\r
+**/\r
+VOID\r
+ChangeVariableDevicePath (\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  );\r
+\r
+/**\r
+  Update the multi-instance device path of Terminal Device based on\r
+  the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
+  device path in the Terminal Device in TerminalMenu is also updated.\r
+\r
+  @param DevicePath      The multi-instance device path.\r
+  @param ChangeTerminal  TRUE, then device path in the Terminal Device \r
+                         in TerminalMenu is also updated; FALSE, no update.\r
+\r
+  @return EFI_SUCCESS    The function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+ChangeTerminalDevicePath (\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
+  IN BOOLEAN                   ChangeTerminal\r
+  );\r
+\r
+//\r
+// Variable operation by menu selection\r
+//\r
+/**\r
+  This function create a currently loaded Boot Option from \r
+  the BMM. It then appends this Boot Option to the end of \r
+  the "BootOrder" list. It also append this Boot Opotion to the end\r
+  of BootOptionMenu.\r
+\r
+  @param CallbackData           The BMM context data.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  If not enought memory to complete the operation.\r
+  @retval EFI_SUCCESS           If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOption (\r
+  IN  BMM_CALLBACK_DATA                   *CallbackData\r
+  );\r
+\r
+/**\r
+  Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
+  After deleting this boot option, call Var_ChangeBootOrder to\r
+  make sure BootOrder is in valid state.\r
+\r
+  @retval EFI_SUCCESS   If all boot load option EFI Variables corresponding to  \r
+                        BM_LOAD_CONTEXT marked for deletion is deleted\r
+  @return Others        If failed to update the "BootOrder" variable after deletion. \r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelBootOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  After any operation on Boot####, there will be a discrepancy in BootOrder.\r
+  Since some are missing but in BootOrder, while some are present but are\r
+  not reflected by BootOrder. Then a function rebuild BootOrder from\r
+  scratch by content from BootOptionMenu is needed.\r
+\r
+  @retval  EFI_SUCCESS  The boot order is updated successfully.\r
+  @return  other than EFI_SUCCESS if failed to change the "BootOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeBootOrder (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function create a currently loaded Drive Option from \r
+  the BMM. It then appends this Driver Option to the end of \r
+  the "DriverOrder" list. It append this Driver Opotion to the end\r
+  of DriverOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  @param HiiHandle       The HII handle associated with the BMM formset.\r
+  @param DescriptionData The description of this driver option.\r
+  @param OptionalData    The optional load option.\r
+  @param ForceReconnect  If to force reconnect.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+  @retval EFI_SUCCESS          If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOption (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData,\r
+  IN  EFI_HII_HANDLE            HiiHandle,\r
+  IN  UINT16                    *DescriptionData,\r
+  IN  UINT16                    *OptionalData,\r
+  IN  UINT8                     ForceReconnect\r
+  );\r
+\r
+/**\r
+  Delete Load Option that represent a Deleted state in BootOptionMenu.\r
+  After deleting this Driver option, call Var_ChangeDriverOrder to\r
+  make sure DriverOrder is in valid state.\r
+\r
+  @retval EFI_SUCCESS Load Option is successfully updated.\r
+  @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
+          Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelDriverOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  After any operation on Driver####, there will be a discrepancy in\r
+  DriverOrder. Since some are missing but in DriverOrder, while some\r
+  are present but are not reflected by DriverOrder. Then a function\r
+  rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
+  needed.\r
+\r
+  @retval  EFI_SUCCESS  The driver order is updated successfully.\r
+  @return  other than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeDriverOrder (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build multi-instance device path ConIn\r
+  console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleInpOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build multi-instance device path ConOut console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOutOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build multi-instance device path ErrOut console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateErrorOutOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build Out of Band console device.\r
+  \r
+  @param   MenuIndex   Menu index which user select in the terminal menu list.\r
+  \r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.  \r
+**/\r
+EFI_STATUS\r
+Var_UpdateOutOfBandOption (\r
+  IN  UINT16           MenuIndex\r
+  );\r
+\r
+/**\r
+  Update the device path of "ConOut", "ConIn" and "ErrOut" based on the new BaudRate, Data Bits, \r
+  parity and stop Bits set.\r
+\r
+**/\r
+VOID\r
+Var_UpdateAllConsoleOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function update the "BootNext" EFI Variable. If there is no "BootNex" specified in BMM, \r
+  this EFI Variable is deleted.\r
+  It also update the BMM context data specified the "BootNext" value.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootNext (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+/**\r
+  This function update the "BootOrder" EFI Variable based on BMM Formset's NV map. It then refresh \r
+  BootOptionMenu with the new "BootOrder" list.\r
+\r
+  @param CallbackData           The BMM context data.\r
+\r
+  @retval EFI_SUCCESS           The function complete successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
+  @return not The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOrder (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+/**\r
+  This function update the "DriverOrder" EFI Variable based on\r
+  BMM Formset's NV map. It then refresh DriverOptionMenu\r
+  with the new "DriverOrder" list.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS           The function complete successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOrder (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+/**\r
+  Update the Text Mode of Console.\r
+\r
+  @param CallbackData  The context data for BMM.\r
+\r
+  @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
+  @return Other value if the Text Mode of Console is not updated.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConMode (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+//\r
+// Following are page create and refresh functions\r
+//\r
+/**\r
+ Create the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+CreateUpdateData (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Refresh the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+RefreshUpdateData (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Clean up the dynamic opcode at label and form specified by\r
+  both LabelId. \r
+\r
+  @param LabelId         It is both the Form ID and Label ID for\r
+                         opcode deletion.\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+CleanUpPage (\r
+  IN UINT16                           LabelId,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a lit of boot option from global BootOptionMenu. It\r
+  allow user to delete the boot option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateBootDelPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a lit of driver option from global DriverMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateDrvAddHandlePage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a lit of driver option from global DriverOptionMenu. It\r
+  allow user to delete the driver option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateDrvDelPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Prepare the page to allow user to add description for a Driver Option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateDriverAddHandleDescPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Dispatch the correct update page function to call based on the UpdatePageId.\r
+\r
+  @param UpdatePageId    The form ID.\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdatePageBody (\r
+  IN UINT16                           UpdatePageId,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create the dynamic page to allow user to set the "BootNext" vaule.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateBootNextPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create the dynamic page to allow user to set the "TimeOut" vaule.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateTimeOutPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
+  Parity, Stop Bits, Terminal Type.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateTerminalPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Refresh the text mode page\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateConModePage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a list of Goto Opcode for all terminal devices logged\r
+  by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateConCOMPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+ Update add boot/driver option page.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  @param FormId             The form ID to be updated.\r
+  @param DevicePath       Device path.\r
+\r
+**/\r
+VOID\r
+UpdateOptionPage(\r
+  IN   BMM_CALLBACK_DATA        *CallbackData,\r
+  IN   EFI_FORM_ID              FormId,\r
+  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+  );\r
+\r
+/**\r
+  Function deletes the variable specified by VarName and VarGuid.\r
+\r
+\r
+  @param VarName            A Null-terminated Unicode string that is\r
+                            the name of the vendor's variable.\r
+                         \r
+  @param VarGuid            A unique identifier for the vendor.\r
+\r
+  @retval  EFI_SUCCESS           The variable was found and removed\r
+  @retval  EFI_UNSUPPORTED       The variable store was inaccessible\r
+  @retval  EFI_OUT_OF_RESOURCES  The temporary buffer was not available\r
+  @retval  EFI_NOT_FOUND         The variable was not found\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibDeleteVariable (\r
+  IN CHAR16   *VarName,\r
+  IN EFI_GUID *VarGuid\r
+  );\r
+\r
+/**\r
+  Function is used to determine the number of device path instances\r
+  that exist in a device path.\r
+\r
+\r
+  @param DevicePath      A pointer to a device path data structure.\r
+\r
+  @return This function counts and returns the number of device path instances\r
+          in DevicePath.\r
+\r
+**/\r
+UINTN\r
+EfiDevicePathInstanceCount (\r
+  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
+  );\r
+\r
+/**\r
+  Get a string from the Data Hub record based on \r
+  a device path.\r
+\r
+  @param DevPath         The device Path.\r
+\r
+  @return A string located from the Data Hub records based on\r
+          the device path.\r
+  @retval NULL  If failed to get the String from Data Hub.\r
+\r
+**/\r
+UINT16 *\r
+EfiLibStrFromDatahub (\r
+  IN EFI_DEVICE_PATH_PROTOCOL                 *DevPath\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
+/**\r
+  Discard all changes done to the BMM pages such as Boot Order change,\r
+  Driver order change.\r
+\r
+  @param Private         The BMM context data.\r
+  @param CurrentFakeNVMap The current Fack NV Map.\r
+\r
+**/\r
+VOID\r
+DiscardChangeHandler (\r
+  IN  BMM_CALLBACK_DATA               *Private,\r
+  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap\r
+  );\r
+\r
+/**\r
+  Dispatch the display to the next page based on NewPageId.\r
+\r
+  @param Private         The BMM context data.\r
+  @param NewPageId       The original page ID.\r
+\r
+**/\r
+VOID\r
+UpdatePageId (\r
+  BMM_CALLBACK_DATA              *Private,\r
+  UINT16                         NewPageId\r
+  );\r
+\r
+/**\r
+  Remove the installed BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+FreeBMPackage(\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Install BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+InitBootMaintenance(\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+  Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/  \r
+VOID  \r
+GetConsoleInCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+GetConsoleOutCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/        \r
+VOID\r
+GetConsoleErrCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+  to BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+GetTerminalAttribute (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+  This function will change video resolution and text mode\r
+  according to defined setup mode or defined boot mode  \r
+\r
+  @param  IsSetupMode   Indicate mode is changed to setup mode or boot mode. \r
+\r
+  @retval  EFI_SUCCESS  Mode is changed successfully.\r
+  @retval  Others             Mode failed to be changed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BmmBdsSetConsoleMode (\r
+  BOOLEAN  IsSetupMode\r
+  );\r
+\r
+\r
+/**\r
+  This function converts an input device structure to a Unicode string.\r
+\r
+  @param DevPath       A pointer to the device path structure.\r
+\r
+  @return              A new allocated Unicode string that represents the device path.\r
+\r
+**/\r
+CHAR16 *\r
+UiDevicePathToStr (\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
+  );\r
+\r
+/**\r
+  Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
+  The caller is responsible for freeing the allocated buffer using FreePool().\r
+\r
+  @param DevicePath      Device path.\r
+\r
+  @return                A new allocated string that represents the file name.\r
+\r
+**/\r
+CHAR16 *\r
+ExtractFileNameFromDevicePath (\r
+  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+  );\r
+\r
+/**\r
+  This function allows a caller to extract the current configuration for one\r
+  or more named elements from the target driver.\r
+\r
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param Request         A null-terminated Unicode string in <ConfigRequest> format.\r
+  @param Progress        On return, points to a character in the Request string.\r
+                         Points to the string's null terminator if request was successful.\r
+                         Points to the most recent '&' before the first failing name/value\r
+                         pair (or the beginning of the string if the failure is in the\r
+                         first name/value pair) if the request was not successful.\r
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which\r
+                         has all values filled in for the names in the Request string.\r
+                         String to be allocated by the called function.\r
+\r
+  @retval  EFI_SUCCESS            The Results is filled with the requested values.\r
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
+  @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.\r
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  );\r
+\r
+/**\r
+  This function applies changes in a driver's configuration.\r
+  Input is a Configuration, which has the routing data for this\r
+  driver followed by name / value configuration pairs. The driver\r
+  must apply those pairs to its configurable storage. If the\r
+  driver's configuration is stored in a linear block of data\r
+  and the driver's name / value pairs are in <BlockConfig>\r
+  format, it may use the ConfigToBlock helper function (above) to\r
+  simplify the job. Currently not implemented.\r
+\r
+  @param[in]  This                Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param[in]  Configuration       A null-terminated Unicode string in\r
+                                  <ConfigString> format.   \r
+  @param[out] Progress            A pointer to a string filled in with the\r
+                                  offset of the most recent '&' before the\r
+                                  first failing name / value pair (or the\r
+                                  beginn ing of the string if the failure\r
+                                  is in the first name / value pair) or\r
+                                  the terminating NULL if all was\r
+                                  successful.\r
+\r
+  @retval EFI_SUCCESS             The results have been distributed or are\r
+                                  awaiting distribution.  \r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the\r
+                                  parts of the results that must be\r
+                                  stored awaiting possible future\r
+                                  protocols.\r
+  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
+                                  Results parameter would result\r
+                                  in this type of error.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data\r
+                                  was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintRouteConfig (\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+  IN CONST EFI_STRING                     Configuration,\r
+  OUT EFI_STRING                          *Progress\r
+  );\r
+\r
+/**\r
+  This function processes the results of changes in configuration.\r
+\r
+\r
+  @param This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param Action             Specifies the type of action taken by the browser.\r
+  @param QuestionId         A unique value which is sent to the original exporting driver\r
+                            so that it can identify the type of data to expect.\r
+  @param Type               The type of value for the question.\r
+  @param Value              A pointer to the data being sent to the original exporting driver.\r
+  @param ActionRequest      On return, points to the action requested by the callback function.\r
+\r
+  @retval EFI_SUCCESS           The callback successfully handled the action.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.\r
+  @retval EFI_DEVICE_ERROR      The variable could not be saved.\r
+  @retval EFI_UNSUPPORTED       The specified Action is not supported by the callback.\r
+  @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL         *This,\r
+  IN        EFI_BROWSER_ACTION                     Action,\r
+  IN        EFI_QUESTION_ID                        QuestionId,\r
+  IN        UINT8                                  Type,\r
+  IN        EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT       EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  );\r
+\r
+/**\r
+  Create boot option base on the input file path info.\r
+\r
+  @param FilePath    Point to the file path.\r
+\r
+  @retval TRUE   Exit caller function.\r
+  @retval FALSE  Not exit caller function.\r
+\r
+**/\r
+BOOLEAN \r
+CreateBootOptionFromFile (\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
+  );\r
+\r
+/**\r
+  Create driver option base on the input file path info.\r
+\r
+  @param FilePath    Point to the file path.\r
+\r
+  @retval TRUE   Exit caller function.\r
+  @retval FALSE  Not exit caller function.\r
+**/\r
+BOOLEAN \r
+CreateDriverOptionFromFile (\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
+  );\r
+\r
+/**\r
+  Boot the file specified by the input file path info.\r
+\r
+  @param FilePath    Point to the file path.\r
+\r
+  @retval TRUE   Exit caller function.\r
+  @retval FALSE  Not exit caller function.\r
+  \r
+**/\r
+BOOLEAN \r
+BootFromFile (\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
+  );\r
+\r
+//\r
+// Global variable in this program (defined in data.c)\r
+//\r
+extern BM_MENU_OPTION             BootOptionMenu;\r
+extern BM_MENU_OPTION             DriverOptionMenu;\r
+extern BM_MENU_OPTION             ConsoleInpMenu;\r
+extern BM_MENU_OPTION             ConsoleOutMenu;\r
+extern BM_MENU_OPTION             ConsoleErrMenu;\r
+extern BM_MENU_OPTION             DriverMenu;\r
+extern BM_MENU_OPTION             TerminalMenu;\r
+extern UINT16                     TerminalType[5];\r
+extern COM_ATTR                   BaudRateList[19];\r
+extern COM_ATTR                   DataBitsList[4];\r
+extern COM_ATTR                   ParityList[5];\r
+extern COM_ATTR                   StopBitsList[3];\r
+extern EFI_GUID                   TerminalTypeGuid[5];\r
+extern EFI_DEVICE_PATH_PROTOCOL   EndDevicePath[];\r
+extern UINT16                     mFlowControlType[2];\r
+extern UINT32                     mFlowControlValue[2];\r
+\r
+//\r
+// Shared IFR form update data\r
+//\r
+extern VOID                        *mStartOpCodeHandle;\r
+extern VOID                        *mEndOpCodeHandle;\r
+extern EFI_IFR_GUID_LABEL          *mStartLabel;\r
+extern EFI_IFR_GUID_LABEL          *mEndLabel;\r
+extern BMM_CALLBACK_DATA           gBootMaintenancePrivate;\r
+extern BMM_CALLBACK_DATA           *mBmmCallbackInfo;\r
+\r
+#endif\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.vfr b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.vfr
new file mode 100644 (file)
index 0000000..afce340
--- /dev/null
@@ -0,0 +1,440 @@
+///** @file\r
+//  Boot Maintenance Utility Formset\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
+//  \r
+//**/\r
+\r
+#include "FormGuid.h"\r
+\r
+formset\r
+  guid = BOOT_MAINT_FORMSET_GUID,\r
+  title = STRING_TOKEN(STR_FORM_MAIN_TITLE),\r
+  help = STRING_TOKEN(STR_BOOT_MAINT_MANAGER_HELP),\r
+  classguid = gEfiIfrFrontPageGuid,\r
+\r
+  varstore BMM_FAKE_NV_DATA,\r
+    varid = VARSTORE_ID_BOOT_MAINT,\r
+    name = BmmData,\r
+    guid = BOOT_MAINT_FORMSET_GUID;\r
+\r
+  form formid = FORM_MAIN_ID,\r
+       title = STRING_TOKEN(STR_FORM_MAIN_TITLE);\r
+\r
+    goto FORM_BOOT_SETUP_ID,\r
+         prompt = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE),\r
+         help = STRING_TOKEN(STR_FORM_BOOT_SETUP_HELP),\r
+         flags = INTERACTIVE,\r
+         key = FORM_BOOT_SETUP_ID;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+    goto FORM_DRIVER_SETUP_ID,\r
+         prompt = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE),\r
+         help = STRING_TOKEN(STR_FORM_DRIVER_SETUP_HELP),\r
+         flags = INTERACTIVE,\r
+         key = FORM_DRIVER_SETUP_ID;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+    goto FORM_CON_MAIN_ID,\r
+         prompt = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE),\r
+         help = STRING_TOKEN(STR_FORM_CON_MAIN_HELP),\r
+         flags = INTERACTIVE,\r
+         key = FORM_CON_MAIN_ID;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+    goto FORM_MAIN_ID,\r
+         prompt = STRING_TOKEN(STR_BOOT_FROM_FILE),\r
+         help = STRING_TOKEN(STR_BOOT_FROM_FILE_HELP),\r
+         flags = INTERACTIVE,\r
+         key = KEY_VALUE_BOOT_FROM_FILE;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+//    label FORM_MAIN_ID;\r
+\r
+    goto FORM_BOOT_NEXT_ID,\r
+         prompt = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE),\r
+         help = STRING_TOKEN(STR_FORM_BOOT_NEXT_HELP),\r
+         flags = INTERACTIVE,\r
+         key = FORM_BOOT_NEXT_ID;\r
+\r
+    goto FORM_TIME_OUT_ID,\r
+         prompt = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE),\r
+         help = STRING_TOKEN(STR_FORM_TIME_OUT_HELP),\r
+         flags = INTERACTIVE,\r
+         key = FORM_TIME_OUT_ID;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+    text\r
+         help   = STRING_TOKEN(STR_RESET),\r
+         text   = STRING_TOKEN(STR_RESET),\r
+         flags  = INTERACTIVE,\r
+         key    = FORM_RESET;\r
+         \r
+    label LABEL_BMM_PLATFORM_INFORMATION;\r
+    //\r
+    // This is where we will dynamically add a Action type op-code to show \r
+    // the platform information.\r
+    //\r
+    \r
+    //\r
+    // This is where we will dynamically add a Action type op-code to show \r
+    // the advanced menu.\r
+    //\r
+    \r
+    //\r
+    // This is where we will dynamically add a Action type op-code to show \r
+    // the intel test menu.\r
+    //\r
+    label LABEL_END; \r
+  endform;\r
+\r
+  form formid = FORM_BOOT_SETUP_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);\r
+\r
+       goto FORM_MAIN_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+            //flags = INTERACTIVE,\r
+            //key = FORM_MAIN_ID;\r
+\r
+       goto FORM_BOOT_SETUP_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),\r
+            flags = INTERACTIVE,\r
+            key = FORM_BOOT_ADD_ID;\r
+\r
+       goto FORM_BOOT_DEL_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
+            flags = INTERACTIVE,\r
+            key = FORM_BOOT_DEL_ID;\r
+\r
+       goto FORM_BOOT_CHG_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
+            flags = INTERACTIVE,\r
+            key = FORM_BOOT_CHG_ID;\r
+  endform;\r
+\r
+  form formid = FORM_DRIVER_SETUP_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE);\r
+\r
+       goto FORM_MAIN_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+            //help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+            //flags = INTERACTIVE,\r
+            //key = FORM_MAIN_ID;\r
+\r
+       goto FORM_DRV_ADD_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_DRV_ADD_HELP),\r
+            flags = INTERACTIVE,\r
+            key = FORM_DRV_ADD_ID;\r
+\r
+       goto FORM_DRV_DEL_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
+            flags = INTERACTIVE,\r
+            key = FORM_DRV_DEL_ID;\r
+\r
+       goto FORM_DRV_CHG_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
+            flags = INTERACTIVE,\r
+            key = FORM_DRV_CHG_ID;\r
+  endform;\r
+\r
+   form formid = FORM_BOOT_ADD_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_ADD_DESC_TITLE);\r
+\r
+       label FORM_BOOT_ADD_ID;\r
+       label LABEL_END;\r
+\r
+       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+       string    varid    = BmmData.BootDescriptionData,\r
+                 questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
+                 prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
+                 help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
+                 minsize  = 6,\r
+                 maxsize  = 75,\r
+       endstring;\r
+\r
+       string    varid    = BmmData.BootOptionalData,\r
+                 questionid = KEY_VALUE_BOOT_OPTION,\r
+                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+                 help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
+                 minsize  = 0,\r
+                 maxsize  = 120,\r
+       endstring;\r
+\r
+       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+       text\r
+         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         text   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_SAVE_AND_EXIT_BOOT;\r
+\r
+       text\r
+         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_NO_SAVE_AND_EXIT_BOOT;\r
+         \r
+  endform;\r
+\r
+  form formid = FORM_BOOT_DEL_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE);\r
+\r
+       label FORM_BOOT_DEL_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_BOOT_CHG_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE);\r
+\r
+       label FORM_BOOT_CHG_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_BOOT_NEXT_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE);\r
+\r
+       label FORM_BOOT_NEXT_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_TIME_OUT_ID,\r
+       title = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE);\r
+\r
+       label FORM_TIME_OUT_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_MEMORY_CHECK_ID,\r
+       title = STRING_TOKEN(STR_FORM_MEMORY_CHECK_TITLE);\r
+\r
+       label FORM_MEMORY_CHECK_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_UEFI_OPTIMIZED_BOOT_ID,\r
+       title = STRING_TOKEN(STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE);\r
+\r
+       label FORM_UEFI_OPTIMIZED_BOOT_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_DRV_ADD_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE);\r
+\r
+       goto FORM_MAIN_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+            //flags = INTERACTIVE,\r
+            //key = FORM_MAIN_ID;\r
+\r
+       goto FORM_DRIVER_SETUP_ID,\r
+            prompt = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
+            help = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
+            flags = INTERACTIVE,\r
+            key = FORM_DRV_ADD_FILE_ID;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_DRV_ADD_FILE_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
+       \r
+       label FORM_DRV_ADD_FILE_ID;\r
+       label LABEL_END;\r
+\r
+       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+       string    varid    = BmmData.DriverDescriptionData,\r
+                 questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
+                 prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
+                 help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
+                 minsize  = 6,\r
+                 maxsize  = 75,\r
+       endstring;\r
+\r
+       string    varid    = BmmData.DriverOptionalData,\r
+                 questionid = KEY_VALUE_DRIVER_OPTION,\r
+                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+                 help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
+                 minsize  = 0,\r
+                 maxsize  = 120,\r
+       endstring;\r
+\r
+       checkbox varid    = BmmData.ForceReconnect,\r
+               prompt   = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
+               help     = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
+               flags    = CHECKBOX_DEFAULT,\r
+               key      = 0,\r
+       endcheckbox;\r
+\r
+       subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+       text\r
+         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         text   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_SAVE_AND_EXIT_DRIVER;  //BUGBUB: allow duplicate key in one formset???\r
+\r
+       text\r
+         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER;\r
+  endform;\r
+\r
+  form formid = FORM_DRV_DEL_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE);\r
+\r
+       label FORM_DRV_DEL_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_DRV_CHG_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE);\r
+\r
+       label FORM_DRV_CHG_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_CON_MAIN_ID,\r
+       title = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE);\r
+\r
+       goto FORM_MAIN_ID,\r
+       prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+       help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+       //flags = INTERACTIVE,\r
+       //key = FORM_MAIN_ID;\r
+\r
+       goto FORM_CON_IN_ID,\r
+       prompt = STRING_TOKEN(STR_FORM_CON_IN_TITLE),\r
+       help = STRING_TOKEN(STR_FORM_CON_IN_HELP),\r
+       flags = INTERACTIVE,\r
+       key = FORM_CON_IN_ID;\r
+\r
+       goto FORM_CON_OUT_ID,\r
+       prompt = STRING_TOKEN(STR_FORM_CON_OUT_TITLE),\r
+       help = STRING_TOKEN(STR_FORM_CON_OUT_HELP),\r
+       flags = INTERACTIVE,\r
+       key = FORM_CON_OUT_ID;\r
+\r
+       goto FORM_CON_ERR_ID,\r
+       prompt = STRING_TOKEN(STR_FORM_STD_ERR_TITLE),\r
+       help = STRING_TOKEN(STR_FORM_STD_ERR_HELP),\r
+       flags = INTERACTIVE,\r
+       key = FORM_CON_ERR_ID;\r
+\r
+       goto FORM_CON_MODE_ID,\r
+       prompt = STRING_TOKEN(STR_FORM_MODE_TITLE),\r
+       help = STRING_TOKEN(STR_FORM_MODE_HELP),\r
+       flags = INTERACTIVE,\r
+       key = FORM_CON_MODE_ID;\r
+\r
+       goto FORM_CON_COM_ID,\r
+       prompt = STRING_TOKEN(STR_FORM_COM_TITLE),\r
+       help = STRING_TOKEN(STR_FORM_COM_HELP),\r
+       flags = INTERACTIVE,\r
+       key = FORM_CON_COM_ID;\r
+  endform;\r
+\r
+  form formid = FORM_CON_MODE_ID,\r
+       title = STRING_TOKEN(STR_FORM_MODE_TITLE);\r
+\r
+       label FORM_CON_MODE_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_CON_COM_ID,\r
+       title = STRING_TOKEN(STR_FORM_COM_TITLE);\r
+\r
+       label FORM_CON_COM_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_CON_COM_SETUP_ID,\r
+       title = STRING_TOKEN(STR_CON_COM_SETUP);\r
+\r
+       label FORM_CON_COM_SETUP_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_FILE_SEEK_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
+\r
+       label FORM_FILE_SEEK_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_FILE_NEW_SEEK_ID,\r
+       title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
+\r
+       label FORM_FILE_NEW_SEEK_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_DRV_ADD_HANDLE_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_HANDLE_TITLE);\r
+\r
+       label FORM_DRV_ADD_HANDLE_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  form formid = FORM_DRV_ADD_HANDLE_DESC_ID,\r
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
+\r
+       label FORM_DRV_ADD_HANDLE_DESC_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_CON_IN_ID,\r
+       title = STRING_TOKEN(STR_FORM_CON_IN_TITLE);\r
+\r
+       label FORM_CON_IN_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_CON_OUT_ID,\r
+       title = STRING_TOKEN(STR_FORM_CON_OUT_TITLE);\r
+\r
+       label FORM_CON_OUT_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+  form formid = FORM_CON_ERR_ID,\r
+       title = STRING_TOKEN(STR_FORM_STD_ERR_TITLE);\r
+\r
+       label FORM_CON_ERR_ID;\r
+       label LABEL_END;\r
+\r
+  endform;\r
+\r
+endformset;\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerStrings.uni b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerStrings.uni
new file mode 100644 (file)
index 0000000..af0ea5e
--- /dev/null
@@ -0,0 +1,286 @@
+///** @file\r
+//  String definitions for Boot Maintenance Utility.\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
+//  \r
+//**/\r
+\r
+/=#\r
+\r
+#langdef   en-US "English"\r
+#langdef   fr-FR "Français"\r
+\r
+#string STR_NULL_STRING                #language en-US  " "\r
+                                       #language fr-FR  " "\r
+#string STR_NONE                       #language en-US  "NONE"\r
+                                       #language fr-FR  "NONE"\r
+#string STR_MISSING_STRING             #language en-US  "Missing String"\r
+                                       #language fr-FR  "Missing String"\r
+#string STR_FORM_MAIN_TITLE            #language en-US  "Boot Maintenance Manager"\r
+                                       #language fr-FR  "Boot Maintenance Manager"\r
+#string STR_FORM_BOOT_SETUP_TITLE      #language en-US  "Boot Options"\r
+                                       #language fr-FR  "Boot Options"\r
+#string STR_BOOT_MAINT_MANAGER_HELP    #language en-US  "This selection will take you to the Boot Maintenance Manager"\r
+                                       #language fr-FR  "This selection will take you to the Boot Maintenance Manager"\r
+#string STR_FORM_BOOT_SETUP_HELP       #language en-US  "Modify system boot options"\r
+                                       #language fr-FR  "Modify system boot options"\r
+#string STR_FORM_DRIVER_SETUP_TITLE    #language en-US  "Driver Options"\r
+                                       #language fr-FR  "Driver Options"\r
+#string STR_FORM_DRIVER_SETUP_HELP     #language en-US  "Modify boot driver options"\r
+                                       #language fr-FR  "Modify boot driver options"\r
+#string STR_FORM_BOOT_ADD_TITLE        #language en-US  "Add Boot Option"\r
+                                       #language fr-FR  "Add Boot Option"\r
+#string STR_FORM_BOOT_ADD_HELP         #language en-US  "Add EFI Application or Removable Fs as Boot Option"\r
+                                       #language fr-FR  "Add EFI Application or Removable Fs as Boot Option"\r
+#string STR_FORM_BOOT_DEL_TITLE        #language en-US  "Delete Boot Option"\r
+                                       #language fr-FR  "Delete Boot Option"\r
+#string STR_FORM_BOOT_IMMEDIATE_HELP   #language en-US  "Will be valid immediately"\r
+                                       #language fr-FR  "Will be valid immediately"\r
+#string STR_FORM_BOOT_CHG_TITLE        #language en-US  "Change Boot Order"\r
+                                       #language fr-FR  "Change Boot Order"\r
+#string STR_FORM_DRV_ADD_TITLE         #language en-US  "Add Driver Option"\r
+                                       #language fr-FR  "Add Driver Option"\r
+#string STR_FORM_DRV_ADD_HELP          #language en-US  "Add .EFI Driver as Driver Option"\r
+                                       #language fr-FR  "Add .EFI Driver as Driver Option"\r
+#string STR_FORM_DRV_DEL_TITLE         #language en-US  "Delete Driver Option"\r
+                                       #language fr-FR  "Delete Driver Option"\r
+#string STR_FORM_DRV_CHG_TITLE         #language en-US  "Change Driver Order"\r
+                                       #language fr-FR  "Change Driver Order"\r
+#string STR_FORM_NEXT_BOOT_HELP        #language en-US  "Will be valid on next boot"\r
+                                       #language fr-FR  "Will be valid on next boot"\r
+#string STR_FORM_BOOT_NEXT_TITLE       #language en-US  "Set Boot Next Value"\r
+                                       #language fr-FR  "Set Boot Next Value"\r
+#string STR_FORM_BOOT_NEXT_HELP        #language en-US  "Modify next boot behavior"\r
+                                       #language fr-FR  "Modify next boot behavior"\r
+#string STR_FORM_TIME_OUT_TITLE        #language en-US  "Set Time Out Value"\r
+                                       #language fr-FR  "Set Time Out Value"\r
+#string STR_FORM_TIME_OUT_HELP         #language en-US  "Modify automatic boot time-out value"\r
+                                       #language fr-FR  "Modify automatic boot time-out value"\r
+#string STR_FORM_MEMORY_CHECK_TITLE    #language en-US  "Set Memory Check Type"\r
+                                       #language fr-FR  "Set Memory Check Type"\r
+#string STR_FORM_MEMORY_CHECK_HELP     #language en-US  "Modify the type of memory checking"\r
+                                       #language fr-FR  "Modify the type of memory checking"\r
+#string STR_MEMORY_CHECK_SETUP         #language en-US  "Memory Check Type"\r
+                                       #language fr-FR  "Memory Check Type"\r
+#string STR_MEMORY_CHECK_SETUP_HELP    #language en-US  "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
+                                       #language fr-FR  "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
+#string STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE #language en-US "UEFI Optimized Boot"\r
+                                           #language fr-FR "UEFI Optimized Boot"\r
+#string STR_FORM_UEFI_OPTIMIZED_BOOT_HELP  #language en-US "Modify the UEFI Optimized Boot setting"\r
+                                           #language fr-FR "Modify the UEFI Optimized Boot setting"\r
+#string UEFI_OPTIMIZED_BOOT_DESCRIPTION           #language en-US "UEFI Optimized Boot"\r
+                                           #language fr-FR "UEFI Optimized Boot"\r
+#string UEFI_OPTIMIZED_BOOT_HELP              #language en-US "Check to enable UEFI Optimized Boot"\r
+                                           #language fr-FR "Check to enable UEFI Optimized Boot"\r
+#string STR_FORM_CON_MAIN_TITLE        #language en-US  "Console Options"\r
+                                       #language fr-FR  "Console Options"\r
+#string STR_FORM_CON_MAIN_HELP         #language en-US  "Modify system console options"\r
+                                       #language fr-FR  "Modify system console options"\r
+#string STR_FORM_CON_IN_TITLE          #language en-US  "Console Input Device Select"\r
+                                       #language fr-FR  "Console Input Device Select"\r
+#string STR_FORM_CON_IN_HELP           #language en-US  "Enable console device as ConIn"\r
+                                       #language fr-FR  "Enable console device as ConIn"\r
+#string STR_FORM_SET_FD_ORDER_TITLE    #language en-US  "Set Legacy Floppy Drive Order"\r
+                                       #language fr-FR  "Set Legacy Floppy Drive Order"\r
+#string STR_FORM_SET_HD_ORDER_TITLE    #language en-US  "Set Legacy HardDisk Drive Order"\r
+                                       #language fr-FR  "Set Legacy HardDisk Drive Order"\r
+#string STR_FORM_SET_CD_ORDER_TITLE    #language en-US  "Set Legacy CD-ROM Drive Order"\r
+                                       #language fr-FR  "Set Legacy CD-ROM Drive Order"\r
+#string STR_FORM_SET_NET_ORDER_TITLE   #language en-US  "Set Legacy NET Drive Order"\r
+                                       #language fr-FR  "Set Legacy NET Drive Order"\r
+#string STR_FORM_SET_BEV_ORDER_TITLE   #language en-US  "Set Legacy BEV Drive Order"\r
+                                       #language fr-FR  "Set Legacy BEV Drive Order"\r
+#string STR_FORM_GOTO_SETTING          #language en-US  "Go Back To Setting Page"\r
+                                       #language fr-FR  "Go Back To Setting Page"\r
+#string STR_COM1                       #language en-US  "COM1"\r
+                                       #language fr-FR  "COM1"\r
+#string STR_COM2                       #language en-US  "COM2"\r
+                                       #language fr-FR  "COM2"\r
+#string STR_COM_AS_CONSOLE_OPTION      #language en-US  "Select this COM port as Console"\r
+                                       #language fr-FR  "Select this COM port as Console"\r
+#string STR_FORM_CON_OUT_TITLE         #language en-US  "Console Output Device Select"\r
+                                       #language fr-FR  "Console Output Device Select"\r
+#string STR_FORM_CON_OUT_HELP          #language en-US  "Enable console device as ConOut"\r
+                                       #language fr-FR  "Enable console device as ConOut"\r
+#string STR_FORM_STD_ERR_TITLE         #language en-US  "Console Standard Error Device Select"\r
+                                       #language fr-FR  "Console Standard Error Device Select"\r
+#string STR_FORM_STD_ERR_HELP          #language en-US  "Enable console device as StdErr"\r
+                                       #language fr-FR  "Enable console device as StdErr"\r
+#string STR_FORM_MODE_TITLE            #language en-US  "Console Output Mode Select"\r
+                                       #language fr-FR  "Console Output Mode Select"\r
+#string STR_FORM_MODE_HELP             #language en-US  "Select Console Output Mode: 80x25, 100x31, etc."\r
+                                       #language fr-FR  "Select Console Output Mode: 80x25, 100x31, etc."\r
+#string STR_FORM_COM_TITLE             #language en-US  "COM Attribute Setup Page"\r
+                                       #language fr-FR  "COM Attribute Setup Page"\r
+#string STR_FORM_COM_HELP              #language en-US  "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
+                                       #language fr-FR  "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
+#string STR_FORM_DRV_ADD_FILE_TITLE    #language en-US  "Add Driver Option Using File"\r
+                                       #language fr-FR  "Add Driver Option Using File"\r
+#string STR_FORM_DRV_ADD_HANDLE_TITLE  #language en-US  "Add Driver Option Using Handle"\r
+                                       #language fr-FR  "Add Driver Option Using Handle"\r
+#string STR_FORM_BOOT_ADD_DESC_TITLE   #language en-US  "Modify Boot Option Description"\r
+                                       #language fr-FR  "Modify Boot Option Description"\r
+#string STR_FORM_DRV_ADD_DESC_TITLE    #language en-US  "Modify Driver Option Description"\r
+                                       #language fr-FR  "Modify Driver Option Description"\r
+#string STR_NUM_AUTO_BOOT              #language en-US  "Auto Boot Time-out"\r
+                                       #language fr-FR  "Auto Boot Time-out"\r
+#string STR_HLP_AUTO_BOOT              #language en-US  "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
+                                       #language fr-FR  "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
+#string STR_BOOT_NEXT                  #language en-US  "Boot Next Value"\r
+                                       #language fr-FR  "Boot Next Value"\r
+#string STR_BOOT_NEXT_HELP             #language en-US  "Next boot use this boot option"\r
+                                       #language fr-FR  "Next boot use this boot option"\r
+#string STR_LOAD_OPTION_DEVPATH        #language en-US  "This is the devicepath"\r
+                                       #language fr-FR  "This is the devicepath"\r
+#string STR_LOAD_OPTION_DESC           #language en-US  "Input the description"\r
+                                       #language fr-FR  "Input the description"\r
+#string STR_LOAD_OPTION_ACTIVE         #language en-US  "Load Option Active"\r
+                                       #language fr-FR  "Load Option Active"\r
+#string STR_LOAD_OPTION_FORCE_RECON    #language en-US  "Load Option Reconnect"\r
+                                       #language fr-FR  "Load Option Reconnect"\r
+#string STR_SAVE_AND_EXIT              #language en-US  "Commit Changes and Exit"\r
+                                       #language fr-FR  "Commit Changes and Exit"\r
+#string STR_NO_SAVE_AND_EXIT           #language en-US  "Discard Changes and Exit"\r
+                                       #language fr-FR  "Discard Changes and Exit"\r
+#string STR_CON_IN_SETUP               #language en-US  "Set Console Input Device"\r
+                                       #language fr-FR  "Set Console Input Device"\r
+#string STR_CON_OUT_SETUP              #language en-US  "Set Console Output Device"\r
+                                       #language fr-FR  "Set Console Output Device"\r
+#string STR_CON_ERR_SETUP              #language en-US  "Set Error Output Device"\r
+                                       #language fr-FR  "Set Error Output Device"\r
+#string STR_CON_MODE_SETUP             #language en-US  "Set Console Output Mode"\r
+                                       #language fr-FR  "Set Console Output Mode"\r
+#string STR_CON_COM_SETUP              #language en-US  "Set COM Attributes"\r
+                                       #language fr-FR  "Set COM Attributes"\r
+#string STR_COM_TERMI_TYPE             #language en-US  "Set COM Terminal Type"\r
+                                       #language fr-FR  "Set COM Terminal Type"\r
+#string STR_COM_FLOW_CONTROL           #language en-US  "Set COM Flow Control"\r
+                                       #language fr-FR  "Set COM Flow Control"\r
+#string STR_COM_BAUD_RATE              #language en-US  "Set COM Baud Rate"\r
+                                       #language fr-FR  "Set COM Baud Rate"\r
+#string STR_COM_DATA_BITS              #language en-US  "Set COM Data Bits"\r
+                                       #language fr-FR  "Set COM Data Bits"\r
+#string STR_COM_PARITY                 #language en-US  "Set COM Parity"\r
+                                       #language fr-FR  "Set COM Parity"\r
+#string STR_COM_STOP_BITS              #language en-US  "Set COM Stop Bits"\r
+                                       #language fr-FR  "Set COM Stop Bits"\r
+#string STR_COM_BAUD_RATE_0            #language en-US  "115200"\r
+                                       #language fr-FR  "115200"\r
+#string STR_COM_BAUD_RATE_1            #language en-US  "57600"\r
+                                       #language fr-FR  "57600"\r
+#string STR_COM_BAUD_RATE_2            #language en-US  "38400"\r
+                                       #language fr-FR  "38400"\r
+#string STR_COM_BAUD_RATE_3            #language en-US  "19200"\r
+                                       #language fr-FR  "19200"\r
+#string STR_COM_BAUD_RATE_4            #language en-US  "9600"\r
+                                       #language fr-FR  "9600"\r
+#string STR_COM_BAUD_RATE_5            #language en-US  "7200"\r
+                                       #language fr-FR  "7200"\r
+#string STR_COM_BAUD_RATE_6            #language en-US  "4800"\r
+                                       #language fr-FR  "4800"\r
+#string STR_COM_BAUD_RATE_7            #language en-US  "3600"\r
+                                       #language fr-FR  "3600"\r
+#string STR_COM_BAUD_RATE_8            #language en-US  "2400"\r
+                                       #language fr-FR  "2400"\r
+#string STR_COM_BAUD_RATE_9            #language en-US  "2000"\r
+                                       #language fr-FR  "2000"\r
+#string STR_COM_BAUD_RATE_10           #language en-US  "1800"\r
+                                       #language fr-FR  "1800"\r
+#string STR_COM_BAUD_RATE_11           #language en-US  "1200"\r
+                                       #language fr-FR  "1200"\r
+#string STR_COM_BAUD_RATE_12           #language en-US  "600"\r
+                                       #language fr-FR  "600"\r
+#string STR_COM_BAUD_RATE_13           #language en-US  "300"\r
+                                       #language fr-FR  "300"\r
+#string STR_COM_BAUD_RATE_14           #language en-US  "150"\r
+                                       #language fr-FR  "150"\r
+#string STR_COM_BAUD_RATE_15           #language en-US  "134"\r
+                                       #language fr-FR  "134"\r
+#string STR_COM_BAUD_RATE_16           #language en-US  "110"\r
+                                       #language fr-FR  "110"\r
+#string STR_COM_BAUD_RATE_17           #language en-US  "75"\r
+                                       #language fr-FR  "75"\r
+#string STR_COM_BAUD_RATE_18           #language en-US  "50"\r
+                                       #language fr-FR  "50"\r
+#string STR_COM_DATA_BITS_0            #language en-US  "5"\r
+                                       #language fr-FR  "5"\r
+#string STR_COM_DATA_BITS_1            #language en-US  "6"\r
+                                       #language fr-FR  "6"\r
+#string STR_COM_DATA_BITS_2            #language en-US  "7"\r
+                                       #language fr-FR  "7"\r
+#string STR_COM_DATA_BITS_3            #language en-US  "8"\r
+                                       #language fr-FR  "8"\r
+#string STR_COM_PAR_0                  #language en-US  "None"\r
+                                       #language fr-FR  "None"\r
+#string STR_COM_PAR_1                  #language en-US  "Even"\r
+                                       #language fr-FR  "Even"\r
+#string STR_COM_PAR_2                  #language en-US  "Odd"\r
+                                       #language fr-FR  "Odd"\r
+#string STR_COM_PAR_3                  #language en-US  "Mark"\r
+                                       #language fr-FR  "Mark"\r
+#string STR_COM_PAR_4                  #language en-US  "Space"\r
+                                       #language fr-FR  "Space"\r
+#string STR_COM_STOP_BITS_0            #language en-US  "One"\r
+                                       #language fr-FR  "One"\r
+#string STR_COM_STOP_BITS_1            #language en-US  "One And A Half"\r
+                                       #language fr-FR  "One And A Half"\r
+#string STR_COM_STOP_BITS_2            #language en-US  "Two"\r
+                                       #language fr-FR  "Two"\r
+#string STR_COM_TYPE_0                 #language en-US  "PC_ANSI"\r
+                                       #language fr-FR  "PC_ANSI"\r
+#string STR_COM_TYPE_1                 #language en-US  "VT_100"\r
+                                       #language fr-FR  "VT_100"\r
+#string STR_COM_TYPE_2                 #language en-US  "VT_100_PLUS"\r
+                                       #language fr-FR  "VT_100_PLUS"\r
+#string STR_COM_TYPE_3                 #language en-US  "VT_UTF8"\r
+                                       #language fr-FR  "VT_UTF8"\r
+#string STR_COM_TYPE_4                 #language en-US  "TTY_TERM"\r
+                                       #language fr-FR  "TTY_TERM"\r
+#string STR_RESET                      #language en-US  "Reset System"\r
+                                       #language fr-FR  "Reset System"\r
+#string STR_FORM_GOTO_MAIN             #language en-US  "Go Back To Main Page"\r
+                                       #language fr-FR  "Go Back To Main Page"\r
+#string STR_BOOT_FROM_FILE             #language en-US  "Boot From File"\r
+                                       #language fr-FR  "Boot From File"\r
+#string STR_BOOT_FROM_FILE_HELP        #language en-US  "Boot system from a file or device"\r
+                                       #language fr-FR  "Boot system from a file or device"\r
+#string STR_OPTIONAL_DATA              #language en-US  "Input Optional Data"\r
+                                       #language fr-FR  "Input Optional Data"\r
+#string STR_CHANGE_ORDER               #language en-US  "Change the order"\r
+                                       #language fr-FR  "Change the order"\r
+#string STR_BOOT_LEGACY                #language en-US  "Boot Legacy System"\r
+                                       #language fr-FR  "Boot Legacy System"\r
+#string STR_BOOT_LEGACY_HELP           #language en-US  "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
+                                       #language fr-FR  "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
+#string STR_BOOT_LEGACY_FLOPPY         #language en-US  "Boot From Floppy"\r
+                                       #language fr-FR  "Boot From Floppy"\r
+#string STR_BOOT_LEGACY_HARDDRIVE      #language en-US  "Boot From Hard Drive"\r
+                                       #language fr-FR  "Boot From Hard Drive"\r
+#string STR_BOOT_LEGACY_CDROM          #language en-US  "Boot From CD Rom"\r
+                                       #language fr-FR  "Boot From CD Rom"\r
+#string STR_BOOT_LEGACY_PCMCIA         #language en-US  "Boot From PCMCIA"\r
+                                       #language fr-FR  "Boot From PCMCIA"\r
+#string STR_BOOT_LEGACY_USB            #language en-US  "Boot From USB Device"\r
+                                       #language fr-FR  "Boot From USB Device"\r
+#string STR_BOOT_LEGACY_NETWORK        #language en-US  "Boot From Network"\r
+                                       #language fr-FR  "Boot From Network"\r
+#string STR_DISABLE_LEGACY_DEVICE      #language en-US  "Disabled"\r
+                                       #language fr-FR  "Disabled"\r
+#string STR_FILE_EXPLORER_TITLE        #language en-US  "File Explorer"\r
+                                       #language fr-FR  "File Explorer"\r
+#string STR_OUT_OF_BAND_PORT           #language fr-FR  "Out-Of-Band Mgmt Port"\r
+                                       #language en-US  "Out-Of-Band Mgmt Port"\r
+#string STR_HARDWARE_FLOW_CONTROL      #language fr-FR  "Hardware"\r
+                                       #language en-US  "Hardware"\r
+#string STR_NONE_FLOW_CONTROL          #language fr-FR  "None"\r
+                                       #language en-US  "None"\r
+//\r
+// BugBug : need someone to translate these strings to french\r
+//\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
new file mode 100644 (file)
index 0000000..302cb90
--- /dev/null
@@ -0,0 +1,100 @@
+## @file\r
+#  Boot Maintenance Manager Library used by UiApp.\r
+#\r
+#  Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials are licensed and made available under\r
+#  the terms and conditions of the BSD License that accompanies this distribution.\r
+#  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
+#  \r
+##\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BootMaintenanceManagerLib\r
+  MODULE_UNI_FILE                = BootMaintenanceManagerLib.uni\r
+  FILE_GUID                      = CA9E4824-4198-4715-AA22-E2935E703A07\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION\r
+  CONSTRUCTOR                    = BootMaintenanceManagerLibConstructor\r
+  DESTRUCTOR                     = BootMaintenanceManagerLibDestructor\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources]\r
+  BootMaintenanceManager.h\r
+  BootMaintenanceManager.vfr\r
+  BootMaintenanceManagerStrings.uni\r
+  BootMaintenance.c\r
+  FormGuid.h\r
+  BootOption.c\r
+  ConsoleOption.c\r
+  Data.c\r
+  Variable.c\r
+  UpdatePage.c\r
+  BmLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+\r
+[LibraryClasses]\r
+  DevicePathLib\r
+  BaseLib\r
+  UefiRuntimeServicesTableLib\r
+  MemoryAllocationLib\r
+  UefiLib\r
+  UefiBootServicesTableLib\r
+  BaseMemoryLib\r
+  DebugLib\r
+  PrintLib\r
+  HiiLib\r
+  UefiHiiServicesLib\r
+  UefiBootManagerLib\r
+  FileExplorerLib\r
+  \r
+[Guids]\r
+  gEfiGlobalVariableGuid                        ## SOMETIMES_PRODUCES ## Variable:L"BootNext" (The number of next boot option)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"BootXX" (Boot option variable)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" (Platform supported languange in Rfc4646 format)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"Lang" (Platform supported languange in Iso639 format)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"KeyXX" (Hotkey option variable)\r
+                                                ## PRODUCES           ## Variable:L"HwErrRecSupport" (The level of platform supported hardware Error Record Persistence)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"BootOptionSupport" (The feature supported in boot option menu, value could be: EFI_BOOT_OPTION_SUPPORT_KEY, EFI_BOOT_OPTION_SUPPORT_APP\r
+                                                ## SOMETIMES_PRODUCES (not PcdUefiVariableDefaultLangDeprecate)## Variable:L"LangCodes" (Value of PcdUefiVariableDefaultLangCodes)\r
+                                                ## PRODUCES           ## Variable:L"PlatformLangCodes" (Value of PcdUefiVariableDefaultPlatformLangCodes)\r
+                                                ## PRODUCES           ## Variable:L"Timeout" (The time out value in second of showing progress bar)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"BootOrder" (The boot option array)\r
+                                                ## SOMETIMES_PRODUCES ## Variable:L"DriverOrder" (The driver order list)\r
+                                                ## SOMETIMES_CONSUMES ## Variable:L"ConIn" (The device path of console in device)\r
+                                                ## SOMETIMES_CONSUMES ## Variable:L"ConOut" (The device path of console out device)\r
+                                                ## SOMETIMES_CONSUMES ## Variable:L"ErrOut" (The device path of error out device)\r
+  gEfiFileSystemVolumeLabelInfoIdGuid           ## CONSUMES ## GUID (Indicate the information type is volume)\r
+  gEfiFileInfoGuid                              ## CONSUMES ## GUID (Indicate the information type is file)\r
+  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)\r
+  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID\r
+  gEfiIfrBootMaintenanceGuid                    ## CONSUMES ## GUID\r
\r
+[Protocols]\r
+  gEfiSimpleFileSystemProtocolGuid              ## CONSUMES\r
+  gEfiLoadFileProtocolGuid                      ## CONSUMES\r
+  gEfiHiiConfigAccessProtocolGuid               ## CONSUMES\r
+  gEfiSerialIoProtocolGuid                      ## CONSUMES\r
+  gEfiDevicePathToTextProtocolGuid              ## CONSUMES\r
+\r
+[FeaturePcd]\r
+\r
+[Pcd]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow                  ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn               ## CONSUMES\r
+  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut              ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution  ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution    ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn          ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow             ## CONSUMES
\ No newline at end of file
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.uni b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.uni
new file mode 100644 (file)
index 0000000..44411c8
--- /dev/null
@@ -0,0 +1,26 @@
+// /** @file\r
+// Boot Maintenance Manager Library used by UiApp.\r
+//\r
+// Boot Maintenance Manager Library used by UiApp.\r
+//\r
+// Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// This program and the accompanying materials are licensed and made available under\r
+// the terms and conditions of the BSD License that accompanies this distribution.\r
+// 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
+//\r
+// **/\r
+\r
+#string STR_MODULE_ABSTRACT\r
+#language en-US\r
+"Boot Maintenance Manager Library used by UiApp."\r
+\r
+#string STR_MODULE_DESCRIPTION\r
+#language en-US\r
+"Boot Maintenance Manager Library used by UiApp."\r
+\r
+\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c
new file mode 100644 (file)
index 0000000..a375d61
--- /dev/null
@@ -0,0 +1,984 @@
+/** @file\r
+  Provide boot option support for Application "BootMaint"\r
+\r
+  Include file system navigation, system handle selection\r
+\r
+  Boot option manipulation\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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+///\r
+/// Define the maximum characters that will be accepted.\r
+///\r
+#define MAX_CHAR            480\r
+\r
+/**\r
+  Create a menu entry by given menu type.\r
+\r
+  @param MenuType        The Menu type to be created.\r
+\r
+  @retval NULL           If failed to create the menu.\r
+  @return the new menu entry.\r
+\r
+**/\r
+BM_MENU_ENTRY *\r
+BOpt_CreateMenuEntry (\r
+  UINTN           MenuType\r
+  )\r
+{\r
+  BM_MENU_ENTRY *MenuEntry;\r
+  UINTN         ContextSize;\r
+\r
+  //\r
+  // Get context size according to menu type\r
+  //\r
+  switch (MenuType) {\r
+  case BM_LOAD_CONTEXT_SELECT:\r
+    ContextSize = sizeof (BM_LOAD_CONTEXT);\r
+    break;\r
+\r
+  case BM_FILE_CONTEXT_SELECT:\r
+    ContextSize = sizeof (BM_FILE_CONTEXT);\r
+    break;\r
+\r
+  case BM_CONSOLE_CONTEXT_SELECT:\r
+    ContextSize = sizeof (BM_CONSOLE_CONTEXT);\r
+    break;\r
+\r
+  case BM_TERMINAL_CONTEXT_SELECT:\r
+    ContextSize = sizeof (BM_TERMINAL_CONTEXT);\r
+    break;\r
+\r
+  case BM_HANDLE_CONTEXT_SELECT:\r
+    ContextSize = sizeof (BM_HANDLE_CONTEXT);\r
+    break;\r
+\r
+  default:\r
+    ContextSize = 0;\r
+    break;\r
+  }\r
+\r
+  if (ContextSize == 0) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Create new menu entry\r
+  //\r
+  MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY));\r
+  if (MenuEntry == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  MenuEntry->VariableContext = AllocateZeroPool (ContextSize);\r
+  if (MenuEntry->VariableContext == NULL) {\r
+    FreePool (MenuEntry);\r
+    return NULL;\r
+  }\r
+\r
+  MenuEntry->Signature        = BM_MENU_ENTRY_SIGNATURE;\r
+  MenuEntry->ContextSelection = MenuType;\r
+  return MenuEntry;\r
+}\r
+\r
+/**\r
+  Free up all resource allocated for a BM_MENU_ENTRY.\r
+\r
+  @param MenuEntry   A pointer to BM_MENU_ENTRY.\r
+\r
+**/\r
+VOID\r
+BOpt_DestroyMenuEntry (\r
+  BM_MENU_ENTRY         *MenuEntry\r
+  )\r
+{\r
+  BM_LOAD_CONTEXT           *LoadContext;\r
+  BM_FILE_CONTEXT           *FileContext;\r
+  BM_CONSOLE_CONTEXT        *ConsoleContext;\r
+  BM_TERMINAL_CONTEXT       *TerminalContext;\r
+  BM_HANDLE_CONTEXT         *HandleContext;\r
+\r
+  //\r
+  //  Select by the type in Menu entry for current context type\r
+  //\r
+  switch (MenuEntry->ContextSelection) {\r
+  case BM_LOAD_CONTEXT_SELECT:\r
+    LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext;\r
+    FreePool (LoadContext->FilePathList);\r
+    FreePool (LoadContext->LoadOption);\r
+    if (LoadContext->OptionalData != NULL) {\r
+      FreePool (LoadContext->OptionalData);\r
+    }\r
+    FreePool (LoadContext);\r
+    break;\r
+\r
+  case BM_FILE_CONTEXT_SELECT:\r
+    FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
+\r
+    if (!FileContext->IsRoot) {\r
+      FreePool (FileContext->DevicePath);\r
+    } else {\r
+      if (FileContext->FHandle != NULL) {\r
+        FileContext->FHandle->Close (FileContext->FHandle);\r
+      }\r
+    }\r
+\r
+    if (FileContext->FileName != NULL) {\r
+      FreePool (FileContext->FileName);\r
+    }\r
+    if (FileContext->Info != NULL) {\r
+      FreePool (FileContext->Info);\r
+    }\r
+    FreePool (FileContext);\r
+    break;\r
+\r
+  case BM_CONSOLE_CONTEXT_SELECT:\r
+    ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext;\r
+    FreePool (ConsoleContext->DevicePath);\r
+    FreePool (ConsoleContext);\r
+    break;\r
+\r
+  case BM_TERMINAL_CONTEXT_SELECT:\r
+    TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext;\r
+    FreePool (TerminalContext->DevicePath);\r
+    FreePool (TerminalContext);\r
+    break;\r
+\r
+  case BM_HANDLE_CONTEXT_SELECT:\r
+    HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext;\r
+    FreePool (HandleContext);\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+\r
+  FreePool (MenuEntry->DisplayString);\r
+  if (MenuEntry->HelpString != NULL) {\r
+    FreePool (MenuEntry->HelpString);\r
+  }\r
+\r
+  FreePool (MenuEntry);\r
+}\r
+\r
+/**\r
+  Get the Menu Entry from the list in Menu Entry List.\r
+\r
+  If MenuNumber is great or equal to the number of Menu\r
+  Entry in the list, then ASSERT.\r
+\r
+  @param MenuOption      The Menu Entry List to read the menu entry.\r
+  @param MenuNumber      The index of Menu Entry.\r
+\r
+  @return The Menu Entry.\r
+\r
+**/\r
+BM_MENU_ENTRY *\r
+BOpt_GetMenuEntry (\r
+  BM_MENU_OPTION      *MenuOption,\r
+  UINTN               MenuNumber\r
+  )\r
+{\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  UINTN           Index;\r
+  LIST_ENTRY      *List;\r
+\r
+  ASSERT (MenuNumber < MenuOption->MenuNumber);\r
+\r
+  List = MenuOption->Head.ForwardLink;\r
+  for (Index = 0; Index < MenuNumber; Index++) {\r
+    List = List->ForwardLink;\r
+  }\r
+\r
+  NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE);\r
+\r
+  return NewMenuEntry;\r
+}\r
+\r
+/**\r
+  Free resources allocated in Allocate Rountine.\r
+\r
+  @param FreeMenu        Menu to be freed\r
+**/\r
+VOID\r
+BOpt_FreeMenu (\r
+  BM_MENU_OPTION        *FreeMenu\r
+  )\r
+{\r
+  BM_MENU_ENTRY *MenuEntry;\r
+  while (!IsListEmpty (&FreeMenu->Head)) {\r
+    MenuEntry = CR (\r
+                  FreeMenu->Head.ForwardLink,\r
+                  BM_MENU_ENTRY,\r
+                  Link,\r
+                  BM_MENU_ENTRY_SIGNATURE\r
+                  );\r
+    RemoveEntryList (&MenuEntry->Link);\r
+    BOpt_DestroyMenuEntry (MenuEntry);\r
+  }\r
+  FreeMenu->MenuNumber = 0;\r
+}\r
+\r
+/**\r
+\r
+  Build the BootOptionMenu according to BootOrder Variable.\r
+  This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
+\r
+  @param CallbackData The BMM context data.\r
+\r
+  @return EFI_NOT_FOUND Fail to find "BootOrder" variable.\r
+  @return EFI_SUCESS    Success build boot option menu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetBootOptions (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData\r
+  )\r
+{\r
+  UINTN                         Index;\r
+  UINT16                        BootString[10];\r
+  UINT8                         *LoadOptionFromVar;\r
+  UINT8                         *LoadOption;\r
+  UINTN                         BootOptionSize;\r
+  BOOLEAN                       BootNextFlag;\r
+  UINT16                        *BootOrderList;\r
+  UINTN                         BootOrderListSize;\r
+  UINT16                        *BootNext;\r
+  UINTN                         BootNextSize;\r
+  BM_MENU_ENTRY                 *NewMenuEntry;\r
+  BM_LOAD_CONTEXT               *NewLoadContext;\r
+  UINT8                         *LoadOptionPtr;\r
+  UINTN                         StringSize;\r
+  UINTN                         OptionalDataSize;\r
+  UINT8                         *LoadOptionEnd;\r
+  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;\r
+  UINTN                         MenuCount;\r
+  UINT8                         *Ptr;\r
+  EFI_BOOT_MANAGER_LOAD_OPTION  *BootOption;\r
+  UINTN                         BootOptionCount;  \r
+  \r
+  MenuCount         = 0;\r
+  BootOrderListSize = 0;\r
+  BootNextSize      = 0;\r
+  BootOrderList     = NULL;\r
+  BootNext          = NULL;\r
+  LoadOptionFromVar = NULL;\r
+  BOpt_FreeMenu (&BootOptionMenu);\r
+  InitializeListHead (&BootOptionMenu.Head);\r
+\r
+  //\r
+  // Get the BootOrder from the Var\r
+  //\r
+  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
+  if (BootOrderList == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
+  //\r
+  // Get the BootNext from the Var\r
+  //\r
+  GetEfiGlobalVariable2 (L"BootNext", (VOID **) &BootNext, &BootNextSize);\r
+  if (BootNext != NULL) {\r
+    if (BootNextSize != sizeof (UINT16)) {\r
+      FreePool (BootNext);\r
+      BootNext = NULL;\r
+    }\r
+  }\r
+  BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);\r
+  for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
+    //\r
+    // Don't display the hidden/inactive boot option\r
+    //\r
+    if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) {\r
+      continue;\r
+    }\r
+      \r
+    UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);\r
+    //\r
+    //  Get all loadoptions from the VAR\r
+    //\r
+    GetEfiGlobalVariable2 (BootString, (VOID **) &LoadOptionFromVar, &BootOptionSize);\r
+    if (LoadOptionFromVar == NULL) {\r
+      continue;\r
+    }\r
+\r
+    LoadOption = AllocateZeroPool (BootOptionSize);\r
+    if (LoadOption == NULL) {\r
+      continue;\r
+    }\r
+\r
+    CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);\r
+    FreePool (LoadOptionFromVar);\r
+\r
+    if (BootNext != NULL) {\r
+      BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);\r
+    } else {\r
+      BootNextFlag = FALSE;\r
+    }\r
+\r
+    NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+    ASSERT (NULL != NewMenuEntry);\r
+\r
+    NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+    LoadOptionPtr                       = LoadOption;\r
+    LoadOptionEnd                       = LoadOption + BootOptionSize;\r
+\r
+    NewMenuEntry->OptionNumber          = BootOrderList[Index];\r
+    NewLoadContext->LoadOptionModified  = FALSE;\r
+    NewLoadContext->Deleted             = FALSE;\r
+    NewLoadContext->IsBootNext          = BootNextFlag;\r
+\r
+    //\r
+    // Is a Legacy Device?\r
+    //\r
+    Ptr = (UINT8 *) LoadOption;\r
+\r
+    //\r
+    // Attribute = *(UINT32 *)Ptr;\r
+    //\r
+    Ptr += sizeof (UINT32);\r
+\r
+    //\r
+    // FilePathSize = *(UINT16 *)Ptr;\r
+    //\r
+    Ptr += sizeof (UINT16);\r
+\r
+    //\r
+    // Description = (CHAR16 *)Ptr;\r
+    //\r
+    Ptr += StrSize ((CHAR16 *) Ptr);\r
+\r
+    //\r
+    // Now Ptr point to Device Path\r
+    //\r
+    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
+    if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {\r
+      NewLoadContext->IsLegacy = TRUE;\r
+    } else {\r
+      NewLoadContext->IsLegacy = FALSE;\r
+    }\r
+    //\r
+    // LoadOption is a pointer type of UINT8\r
+    // for easy use with following LOAD_OPTION\r
+    // embedded in this struct\r
+    //\r
+    NewLoadContext->LoadOption      = LoadOption;\r
+    NewLoadContext->LoadOptionSize  = BootOptionSize;\r
+\r
+    NewLoadContext->Attributes      = *(UINT32 *) LoadOptionPtr;\r
+    NewLoadContext->IsActive        = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
+\r
+    NewLoadContext->ForceReconnect  = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+    LoadOptionPtr += sizeof (UINT32);\r
+\r
+    NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
+    LoadOptionPtr += sizeof (UINT16);\r
+    \r
+    StringSize = StrSize((UINT16*)LoadOptionPtr);\r
+\r
+    NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr));\r
+    ASSERT (NewLoadContext->Description != NULL);\r
+    StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr);\r
+    \r
+    ASSERT (NewLoadContext->Description != NULL);\r
+    NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+    NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+    LoadOptionPtr += StringSize;\r
+\r
+    NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
+    ASSERT (NewLoadContext->FilePathList != NULL);\r
+    CopyMem (\r
+      NewLoadContext->FilePathList,\r
+      (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
+      NewLoadContext->FilePathListLength\r
+      );\r
+\r
+    NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+    NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
+\r
+    LoadOptionPtr += NewLoadContext->FilePathListLength;\r
+\r
+    if (LoadOptionPtr < LoadOptionEnd) {\r
+      OptionalDataSize = BootOptionSize -\r
+        sizeof (UINT32) -\r
+        sizeof (UINT16) -\r
+        StringSize -\r
+        NewLoadContext->FilePathListLength;\r
+\r
+      NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
+      ASSERT (NewLoadContext->OptionalData != NULL);\r
+      CopyMem (\r
+        NewLoadContext->OptionalData,\r
+        LoadOptionPtr,\r
+        OptionalDataSize\r
+        );\r
+\r
+      NewLoadContext->OptionalDataSize = OptionalDataSize;\r
+    }\r
+\r
+    InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
+    MenuCount++;\r
+  }\r
+  EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);\r
+\r
+  if (BootNext != NULL) {\r
+    FreePool (BootNext);\r
+  }\r
+  if (BootOrderList != NULL) {\r
+    FreePool (BootOrderList);\r
+  }\r
+  BootOptionMenu.MenuNumber = MenuCount;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+  Find drivers that will be added as Driver#### variables from handles\r
+  in current system environment\r
+  All valid handles in the system except those consume SimpleFs, LoadFile\r
+  are stored in DriverMenu for future use.\r
+\r
+  @retval EFI_SUCCESS The function complets successfully.\r
+  @return Other value if failed to build the DriverMenu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindDrivers (\r
+  VOID\r
+  )\r
+{\r
+  UINTN                           NoDevicePathHandles;\r
+  EFI_HANDLE                      *DevicePathHandle;\r
+  UINTN                           Index;\r
+  EFI_STATUS                      Status;\r
+  BM_MENU_ENTRY                   *NewMenuEntry;\r
+  BM_HANDLE_CONTEXT               *NewHandleContext;\r
+  EFI_HANDLE                      CurHandle;\r
+  UINTN                           OptionNumber;\r
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
+  EFI_LOAD_FILE_PROTOCOL          *LoadFile;\r
+\r
+  SimpleFs  = NULL;\r
+  LoadFile  = NULL;\r
+\r
+  InitializeListHead (&DriverMenu.Head);\r
+\r
+  //\r
+  // At first, get all handles that support Device Path\r
+  // protocol which is the basic requirement for\r
+  // Driver####\r
+  //\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  NULL,\r
+                  &NoDevicePathHandles,\r
+                  &DevicePathHandle\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  OptionNumber = 0;\r
+  for (Index = 0; Index < NoDevicePathHandles; Index++) {\r
+    CurHandle = DevicePathHandle[Index];\r
+\r
+    Status = gBS->HandleProtocol (\r
+                    CurHandle,\r
+                    &gEfiSimpleFileSystemProtocolGuid,\r
+                    (VOID **) &SimpleFs\r
+                    );\r
+    if (Status == EFI_SUCCESS) {\r
+      continue;\r
+    }\r
+\r
+    Status = gBS->HandleProtocol (\r
+                    CurHandle,\r
+                    &gEfiLoadFileProtocolGuid,\r
+                    (VOID **) &LoadFile\r
+                    );\r
+    if (Status == EFI_SUCCESS) {\r
+      continue;\r
+    }\r
+\r
+    NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT);\r
+    if (NULL == NewMenuEntry) {\r
+      FreePool (DevicePathHandle);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    NewHandleContext              = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+    NewHandleContext->Handle      = CurHandle;\r
+    NewHandleContext->DevicePath  = DevicePathFromHandle (CurHandle);\r
+    NewMenuEntry->DisplayString = UiDevicePathToStr (NewHandleContext->DevicePath);\r
+    NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle,0,NewMenuEntry->DisplayString,NULL);\r
+    NewMenuEntry->HelpString    = NULL;\r
+    NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+    NewMenuEntry->OptionNumber  = OptionNumber;\r
+    OptionNumber++;\r
+    InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link);\r
+\r
+  }\r
+\r
+  if (DevicePathHandle != NULL) {\r
+    FreePool (DevicePathHandle);\r
+  }\r
+\r
+  DriverMenu.MenuNumber = OptionNumber;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+  Get the Option Number that has not been allocated for use.\r
+\r
+  @param Type  The type of Option.\r
+\r
+  @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetOptionNumber (\r
+  CHAR16        *Type\r
+  )\r
+{\r
+  UINT16        *OrderList;\r
+  UINTN         OrderListSize;\r
+  UINTN         Index;\r
+  CHAR16        StrTemp[20];\r
+  UINT16        *OptionBuffer;\r
+  UINT16        OptionNumber;\r
+  UINTN         OptionSize;\r
+\r
+  OrderListSize = 0;\r
+  OrderList     = NULL;\r
+  OptionNumber  = 0;\r
+  Index         = 0;\r
+\r
+  UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type);\r
+\r
+  GetEfiGlobalVariable2 (StrTemp, (VOID **) &OrderList, &OrderListSize);\r
+  for (OptionNumber = 0; ; OptionNumber++) {\r
+    if (OrderList != NULL) {\r
+      for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) {\r
+        if (OptionNumber == OrderList[Index]) {\r
+          break;\r
+        }\r
+      }\r
+    }\r
+\r
+    if (Index < OrderListSize / sizeof (UINT16)) {\r
+      //\r
+      // The OptionNumber occurs in the OrderList, continue to use next one\r
+      //\r
+      continue;\r
+    }\r
+    UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber);\r
+    DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp));\r
+    GetEfiGlobalVariable2 (StrTemp, (VOID **) &OptionBuffer, &OptionSize);\r
+    if (NULL == OptionBuffer) {\r
+      //\r
+      // The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it\r
+      //\r
+      break;\r
+    }\r
+  }\r
+\r
+  return OptionNumber;\r
+}\r
+\r
+/**\r
+\r
+  Get the Option Number for Boot#### that does not used.\r
+\r
+  @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetBootOptionNumber (\r
+  VOID\r
+  )\r
+{\r
+  return BOpt_GetOptionNumber (L"Boot");\r
+}\r
+\r
+/**\r
+\r
+  Get the Option Number for Driver#### that does not used.\r
+\r
+  @return The unused Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetDriverOptionNumber (\r
+  VOID\r
+  )\r
+{\r
+  return BOpt_GetOptionNumber (L"Driver");\r
+}\r
+\r
+/**\r
+\r
+  Build up all DriverOptionMenu\r
+\r
+  @param CallbackData The BMM context data.\r
+\r
+  @retval EFI_SUCESS           The functin completes successfully.\r
+  @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
+  @retval EFI_NOT_FOUND        Fail to get "DriverOrder" variable.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetDriverOptions (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData\r
+  )\r
+{\r
+  UINTN           Index;\r
+  UINT16          DriverString[12];\r
+  UINT8           *LoadOptionFromVar;\r
+  UINT8           *LoadOption;\r
+  UINTN           DriverOptionSize;\r
+\r
+  UINT16          *DriverOrderList;\r
+  UINTN           DriverOrderListSize;\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT8           *LoadOptionPtr;\r
+  UINTN           StringSize;\r
+  UINTN           OptionalDataSize;\r
+  UINT8           *LoadOptionEnd;\r
+\r
+  DriverOrderListSize = 0;\r
+  DriverOrderList     = NULL;\r
+  DriverOptionSize    = 0;\r
+  LoadOptionFromVar   = NULL;\r
+  BOpt_FreeMenu (&DriverOptionMenu);\r
+  InitializeListHead (&DriverOptionMenu.Head);\r
+  //\r
+  // Get the DriverOrder from the Var\r
+  //\r
+  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+  if (DriverOrderList == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
+  for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
+    UnicodeSPrint (\r
+      DriverString,\r
+      sizeof (DriverString),\r
+      L"Driver%04x",\r
+      DriverOrderList[Index]\r
+      );\r
+    //\r
+    //  Get all loadoptions from the VAR\r
+    //\r
+    GetEfiGlobalVariable2 (DriverString, (VOID **) &LoadOptionFromVar, &DriverOptionSize);\r
+    if (LoadOptionFromVar == NULL) {\r
+      continue;\r
+    }\r
+\r
+    LoadOption = AllocateZeroPool (DriverOptionSize);\r
+    if (LoadOption == NULL) {\r
+      continue;\r
+    }\r
+\r
+    CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);\r
+    FreePool (LoadOptionFromVar);\r
+\r
+    NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+    if (NULL == NewMenuEntry) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+    LoadOptionPtr                       = LoadOption;\r
+    LoadOptionEnd                       = LoadOption + DriverOptionSize;\r
+    NewMenuEntry->OptionNumber          = DriverOrderList[Index];\r
+    NewLoadContext->LoadOptionModified  = FALSE;\r
+    NewLoadContext->Deleted             = FALSE;\r
+    NewLoadContext->IsLegacy            = FALSE;\r
+\r
+    //\r
+    // LoadOption is a pointer type of UINT8\r
+    // for easy use with following LOAD_OPTION\r
+    // embedded in this struct\r
+    //\r
+    NewLoadContext->LoadOption      = LoadOption;\r
+    NewLoadContext->LoadOptionSize  = DriverOptionSize;\r
+\r
+    NewLoadContext->Attributes      = *(UINT32 *) LoadOptionPtr;\r
+    NewLoadContext->IsActive        = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
+\r
+    NewLoadContext->ForceReconnect  = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+    LoadOptionPtr += sizeof (UINT32);\r
+\r
+    NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
+    LoadOptionPtr += sizeof (UINT16);\r
+\r
+    StringSize                  = StrSize ((UINT16 *) LoadOptionPtr);\r
+    NewLoadContext->Description = AllocateZeroPool (StringSize);\r
+    ASSERT (NewLoadContext->Description != NULL);\r
+    CopyMem (\r
+      NewLoadContext->Description,\r
+      (UINT16 *) LoadOptionPtr,\r
+      StringSize\r
+      );\r
+    NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+    NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+    LoadOptionPtr += StringSize;\r
+\r
+    NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
+    ASSERT (NewLoadContext->FilePathList != NULL);\r
+    CopyMem (\r
+      NewLoadContext->FilePathList,\r
+      (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
+      NewLoadContext->FilePathListLength\r
+      );\r
+\r
+    NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+    NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
+\r
+    LoadOptionPtr += NewLoadContext->FilePathListLength;\r
+\r
+    if (LoadOptionPtr < LoadOptionEnd) {\r
+      OptionalDataSize = DriverOptionSize -\r
+        sizeof (UINT32) -\r
+        sizeof (UINT16) -\r
+        StringSize -\r
+        NewLoadContext->FilePathListLength;\r
+\r
+      NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
+      ASSERT (NewLoadContext->OptionalData != NULL);\r
+      CopyMem (\r
+        NewLoadContext->OptionalData,\r
+        LoadOptionPtr,\r
+        OptionalDataSize\r
+        );\r
+\r
+      NewLoadContext->OptionalDataSize = OptionalDataSize;\r
+    }\r
+\r
+    InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
+\r
+  }\r
+\r
+  if (DriverOrderList != NULL) {\r
+    FreePool (DriverOrderList);\r
+  }\r
+  DriverOptionMenu.MenuNumber = Index;\r
+  return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+  Get option number according to Boot#### and BootOrder variable. \r
+  The value is saved as #### + 1.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID  \r
+GetBootOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  BMM_FAKE_NV_DATA          *BmmConfig;\r
+  UINT16                    Index;\r
+  UINT16                    OptionOrderIndex; \r
+  UINTN                     DeviceType;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+  BM_LOAD_CONTEXT           *NewLoadContext;  \r
+\r
+  ASSERT (CallbackData != NULL);\r
+  \r
+  DeviceType = (UINTN) -1;   \r
+  BmmConfig  = &CallbackData->BmmFakeNvData;  \r
+  ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder));\r
+  \r
+  for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) &&\r
+       (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0]))));\r
+       Index++) {\r
+    NewMenuEntry   = BOpt_GetMenuEntry (&BootOptionMenu, 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
+      }\r
+    }\r
+    BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+  }  \r
+}\r
+\r
+/**\r
+  Get driver option order from globalc DriverOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  \r
+**/\r
+VOID  \r
+GetDriverOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  BMM_FAKE_NV_DATA          *BmmConfig;\r
+  UINT16                    Index;\r
+  UINT16                    OptionOrderIndex; \r
+  UINTN                     DeviceType;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+  BM_LOAD_CONTEXT           *NewLoadContext;  \r
+\r
+\r
+  ASSERT (CallbackData != NULL);\r
+  \r
+  DeviceType = (UINTN) -1;   \r
+  BmmConfig  = &CallbackData->BmmFakeNvData;  \r
+  ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder));\r
+  \r
+  for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) &&\r
+       (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0]))));\r
+       Index++) {\r
+    NewMenuEntry   = BOpt_GetMenuEntry (&DriverOptionMenu, 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
+      }\r
+    }\r
+    BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+  }  \r
+}  \r
+\r
+/**\r
+  Boot the file specified by the input file path info.\r
+\r
+  @param FilePath    Point to the file path.\r
+\r
+  @retval TRUE   Exit caller function.\r
+  @retval FALSE  Not exit caller function.\r
+**/\r
+BOOLEAN \r
+BootFromFile (\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
+  )\r
+{\r
+  EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
+  CHAR16                       *FileName;\r
+\r
+  FileName = ExtractFileNameFromDevicePath(FilePath);\r
+  EfiBootManagerInitializeLoadOption (\r
+    &BootOption,\r
+    0,\r
+    LoadOptionTypeBoot,\r
+    LOAD_OPTION_ACTIVE,\r
+    FileName,\r
+    FilePath,\r
+    NULL,\r
+    0\r
+    );\r
+  //\r
+  // Since current no boot from removable media directly is allowed */\r
+  //\r
+  gST->ConOut->ClearScreen (gST->ConOut);\r
+\r
+  BmmBdsSetConsoleMode (FALSE);\r
+  EfiBootManagerBoot (&BootOption);\r
+  BmmBdsSetConsoleMode (TRUE);\r
+\r
+  FreePool(FileName);\r
+\r
+  EfiBootManagerFreeLoadOption (&BootOption);\r
+\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Display the form base on the selected file.\r
+\r
+  @param FilePath   Point to the file path.\r
+  @param FormId     The form need to display.\r
+\r
+**/\r
+BOOLEAN\r
+ReSendForm(\r
+  IN  EFI_DEVICE_PATH_PROTOCOL  *FilePath,\r
+  IN  EFI_FORM_ID               FormId\r
+  )\r
+{\r
+  gBootMaintenancePrivate.LoadContext->FilePathList = FilePath;\r
+\r
+  UpdateOptionPage(&gBootMaintenancePrivate, FormId, FilePath);\r
+\r
+  gBootMaintenancePrivate.FormBrowser2->SendForm (\r
+                         gBootMaintenancePrivate.FormBrowser2,\r
+                         &gBootMaintenancePrivate.BmmHiiHandle,\r
+                         1,\r
+                         &mBootMaintGuid,\r
+                         FormId,\r
+                         NULL,\r
+                         NULL\r
+                         );\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Create boot option base on the input file path info.\r
+\r
+  @param FilePath    Point to the file path.\r
+\r
+  @retval TRUE   Exit caller function.\r
+  @retval FALSE  Not exit caller function.\r
+**/\r
+BOOLEAN \r
+CreateBootOptionFromFile (\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
+  )\r
+{\r
+  return ReSendForm(FilePath, FORM_BOOT_ADD_ID);\r
+}\r
+\r
+/**\r
+  Create driver option base on the input file path info.\r
+\r
+  @param FilePath    Point to the file path.\r
+\r
+  @retval TRUE   Exit caller function.\r
+  @retval FALSE  Not exit caller function.\r
+\r
+**/\r
+BOOLEAN \r
+CreateDriverOptionFromFile (\r
+  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath\r
+  )\r
+{\r
+  return ReSendForm(FilePath, FORM_DRV_ADD_FILE_ID);\r
+}\r
+\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/ConsoleOption.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/ConsoleOption.c
new file mode 100644 (file)
index 0000000..fd48d5d
--- /dev/null
@@ -0,0 +1,1162 @@
+/** @file\r
+handles console redirection from boot manager\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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+  Function compares a device path data structure to that of all the nodes of a\r
+  second device path instance.\r
+\r
+  @param  Multi                 A pointer to a multi-instance device path data\r
+                                structure.\r
+  @param  Single                A pointer to a single-instance device path data\r
+                                structure.\r
+\r
+  @retval TRUE                  If the Single device path is contained within Multi device path.\r
+  @retval FALSE                 The Single device path is not match within Multi device path.\r
+\r
+**/\r
+BOOLEAN\r
+MatchDevicePaths (\r
+  IN  EFI_DEVICE_PATH_PROTOCOL  *Multi,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL  *Single\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePathInst;\r
+  UINTN                     Size;\r
+\r
+  if (Multi == NULL || Single  == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  DevicePath     = Multi;\r
+  DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
+\r
+  //\r
+  // Search for the match of 'Single' in 'Multi'\r
+  //\r
+  while (DevicePathInst != NULL) {\r
+    //\r
+    // If the single device path is found in multiple device paths,\r
+    // return success\r
+    //\r
+    if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
+      FreePool (DevicePathInst);\r
+      return TRUE;\r
+    }\r
+\r
+    FreePool (DevicePathInst);\r
+    DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Check whether the device path node is ISA Serial Node.\r
+\r
+  @param Acpi           Device path node to be checked\r
+\r
+  @retval TRUE          It's ISA Serial Node.\r
+  @retval FALSE         It's NOT ISA Serial Node.\r
+\r
+**/\r
+BOOLEAN\r
+IsIsaSerialNode (\r
+  IN ACPI_HID_DEVICE_PATH *Acpi\r
+  )\r
+{\r
+  return (BOOLEAN) (\r
+      (DevicePathType (Acpi) == ACPI_DEVICE_PATH) &&\r
+      (DevicePathSubType (Acpi) == ACPI_DP) &&\r
+      (ReadUnaligned32 (&Acpi->HID) == EISA_PNP_ID (0x0501))\r
+      );\r
+}\r
+\r
+/**\r
+  Update Com Ports attributes from DevicePath\r
+\r
+  @param DevicePath      DevicePath that contains Com ports\r
+\r
+  @retval EFI_SUCCESS   The update is successful.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdateComAttributeFromVariable (\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  );\r
+\r
+/**\r
+  Update the multi-instance device path of Terminal Device based on\r
+  the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
+  device path in the Terminal Device in TerminalMenu is also updated.\r
+\r
+  @param DevicePath      The multi-instance device path.\r
+  @param ChangeTerminal  TRUE, then device path in the Terminal Device \r
+                         in TerminalMenu is also updated; FALSE, no update.\r
+\r
+  @return EFI_SUCCESS    The function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+ChangeTerminalDevicePath (\r
+  IN OUT    EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
+  IN        BOOLEAN                   ChangeTerminal\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
+  EFI_DEVICE_PATH_PROTOCOL  *Node1;\r
+  ACPI_HID_DEVICE_PATH      *Acpi;\r
+  UART_DEVICE_PATH          *Uart;\r
+  UART_DEVICE_PATH          *Uart1;\r
+  UINTN                     Com;\r
+  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+\r
+  Node  = DevicePath;\r
+  Node  = NextDevicePathNode (Node);\r
+  Com   = 0;\r
+  while (!IsDevicePathEnd (Node)) {\r
+    Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+    if (IsIsaSerialNode (Acpi)) {\r
+      CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
+    }\r
+\r
+    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Com);\r
+\r
+    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+    if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+      Uart = (UART_DEVICE_PATH *) Node;\r
+      CopyMem (\r
+        &Uart->BaudRate,\r
+        &NewTerminalContext->BaudRate,\r
+        sizeof (UINT64)\r
+        );\r
+\r
+      CopyMem (\r
+        &Uart->DataBits,\r
+        &NewTerminalContext->DataBits,\r
+        sizeof (UINT8)\r
+        );\r
+\r
+      CopyMem (\r
+        &Uart->Parity,\r
+        &NewTerminalContext->Parity,\r
+        sizeof (UINT8)\r
+        );\r
+\r
+      CopyMem (\r
+        &Uart->StopBits,\r
+        &NewTerminalContext->StopBits,\r
+        sizeof (UINT8)\r
+        );\r
+      //\r
+      // Change the device path in the ComPort\r
+      //\r
+      if (ChangeTerminal) {\r
+        Node1 = NewTerminalContext->DevicePath;\r
+        Node1 = NextDevicePathNode (Node1);\r
+        while (!IsDevicePathEnd (Node1)) {\r
+          if ((DevicePathType (Node1) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node1) == MSG_UART_DP)) {\r
+            Uart1 = (UART_DEVICE_PATH *) Node1;\r
+            CopyMem (\r
+              &Uart1->BaudRate,\r
+              &NewTerminalContext->BaudRate,\r
+              sizeof (UINT64)\r
+              );\r
+\r
+            CopyMem (\r
+              &Uart1->DataBits,\r
+              &NewTerminalContext->DataBits,\r
+              sizeof (UINT8)\r
+              );\r
+\r
+            CopyMem (\r
+              &Uart1->Parity,\r
+              &NewTerminalContext->Parity,\r
+              sizeof (UINT8)\r
+              );\r
+\r
+            CopyMem (\r
+              &Uart1->StopBits,\r
+              &NewTerminalContext->StopBits,\r
+              sizeof (UINT8)\r
+              );\r
+            break;\r
+          }\r
+          //\r
+          // end if\r
+          //\r
+          Node1 = NextDevicePathNode (Node1);\r
+        }\r
+        //\r
+        // end while\r
+        //\r
+        break;\r
+      }\r
+    }\r
+\r
+    Node = NextDevicePathNode (Node);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+  Update the device path that describing a terminal device\r
+  based on the new BaudRate, Data Bits, parity and Stop Bits\r
+  set.\r
+\r
+  @param DevicePath terminal device's path\r
+\r
+**/\r
+VOID\r
+ChangeVariableDevicePath (\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
+  ACPI_HID_DEVICE_PATH      *Acpi;\r
+  UART_DEVICE_PATH          *Uart;\r
+  UINTN                     Com;\r
+  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+\r
+  Node  = DevicePath;\r
+  Node  = NextDevicePathNode (Node);\r
+  Com   = 0;\r
+  while (!IsDevicePathEnd (Node)) {\r
+    Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+    if (IsIsaSerialNode (Acpi)) {\r
+      CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
+    }\r
+\r
+    if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+      NewMenuEntry = BOpt_GetMenuEntry (\r
+                      &TerminalMenu,\r
+                      Com\r
+                      );\r
+      ASSERT (NewMenuEntry != NULL);\r
+      NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+      Uart                = (UART_DEVICE_PATH *) Node;\r
+      CopyMem (\r
+        &Uart->BaudRate,\r
+        &NewTerminalContext->BaudRate,\r
+        sizeof (UINT64)\r
+        );\r
+\r
+      CopyMem (\r
+        &Uart->DataBits,\r
+        &NewTerminalContext->DataBits,\r
+        sizeof (UINT8)\r
+        );\r
+\r
+      CopyMem (\r
+        &Uart->Parity,\r
+        &NewTerminalContext->Parity,\r
+        sizeof (UINT8)\r
+        );\r
+\r
+      CopyMem (\r
+        &Uart->StopBits,\r
+        &NewTerminalContext->StopBits,\r
+        sizeof (UINT8)\r
+        );\r
+    }\r
+\r
+    Node = NextDevicePathNode (Node);\r
+  }\r
+}\r
+\r
+/**\r
+  Retrieve ACPI UID of UART from device path\r
+\r
+  @param Handle          The handle for the UART device.\r
+  @param AcpiUid         The ACPI UID on output.\r
+\r
+  @retval  TRUE   Find valid UID from device path\r
+  @retval  FALSE  Can't find\r
+\r
+**/\r
+BOOLEAN\r
+RetrieveUartUid (\r
+  IN EFI_HANDLE   Handle,\r
+  IN OUT UINT32   *AcpiUid\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  ACPI_HID_DEVICE_PATH      *Acpi;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  Handle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID **) &DevicePath\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return FALSE;\r
+  }\r
+\r
+  Acpi = NULL;\r
+  for (; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {\r
+    if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (DevicePath) == MSG_UART_DP)) {\r
+      break;\r
+    }\r
+    //\r
+    // Acpi points to the node before the Uart node\r
+    //\r
+    Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;\r
+  }\r
+\r
+  if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
+    if (AcpiUid != NULL) {\r
+      CopyMem (AcpiUid, &Acpi->UID, sizeof (UINT32));\r
+    }\r
+    return TRUE;\r
+  } else {\r
+    return FALSE;\r
+  }\r
+}\r
+\r
+/**\r
+  Sort Uart handles array with Acpi->UID from low to high.\r
+\r
+  @param Handles         EFI_SERIAL_IO_PROTOCOL handle buffer\r
+  @param NoHandles       EFI_SERIAL_IO_PROTOCOL handle count\r
+**/\r
+VOID\r
+SortedUartHandle (\r
+  IN  EFI_HANDLE *Handles,\r
+  IN  UINTN      NoHandles\r
+  )\r
+{\r
+  UINTN       Index1;\r
+  UINTN       Index2;\r
+  UINTN       Position;\r
+  UINT32      AcpiUid1;\r
+  UINT32      AcpiUid2;\r
+  UINT32      TempAcpiUid;\r
+  EFI_HANDLE  TempHandle;\r
+\r
+  for (Index1 = 0; Index1 < NoHandles-1; Index1++) {\r
+    if (!RetrieveUartUid (Handles[Index1], &AcpiUid1)) {\r
+      continue;\r
+    }\r
+    TempHandle  = Handles[Index1];\r
+    Position    = Index1;\r
+    TempAcpiUid = AcpiUid1;\r
+\r
+    for (Index2 = Index1+1; Index2 < NoHandles; Index2++) {\r
+      if (!RetrieveUartUid (Handles[Index2], &AcpiUid2)) {\r
+        continue;\r
+      }\r
+      if (AcpiUid2 < TempAcpiUid) {\r
+        TempAcpiUid = AcpiUid2;\r
+        TempHandle  = Handles[Index2];\r
+        Position    = Index2;\r
+      }\r
+    }\r
+    Handles[Position] = Handles[Index1];\r
+    Handles[Index1]   = TempHandle;\r
+  }\r
+}\r
+\r
+/**\r
+  Test whether DevicePath is a valid Terminal\r
+\r
+\r
+  @param DevicePath      DevicePath to be checked\r
+  @param Termi           If DevicePath is valid Terminal, terminal type is returned.\r
+  @param Com             If DevicePath is valid Terminal, Com Port type is returned.\r
+\r
+  @retval  TRUE         If DevicePath point to a Terminal.\r
+  @retval  FALSE        If DevicePath does not point to a Terminal.\r
+\r
+**/\r
+BOOLEAN\r
+IsTerminalDevicePath (\r
+  IN  EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+  OUT TYPE_OF_TERMINAL         *Termi,\r
+  OUT UINTN                    *Com\r
+  );\r
+\r
+/**\r
+  Build a list containing all serial devices.\r
+\r
+\r
+  @retval EFI_SUCCESS The function complete successfully.\r
+  @retval EFI_UNSUPPORTED No serial ports present.\r
+\r
+**/\r
+EFI_STATUS\r
+LocateSerialIo (\r
+  VOID\r
+  )\r
+{\r
+  UINTN                     Index;\r
+  UINTN                     Index2;\r
+  UINTN                     NoHandles;\r
+  EFI_HANDLE                *Handles;\r
+  EFI_STATUS                Status;\r
+  ACPI_HID_DEVICE_PATH      *Acpi;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  EFI_SERIAL_IO_PROTOCOL    *SerialIo;\r
+  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
+  EFI_DEVICE_PATH_PROTOCOL  *OutDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *InpDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *ErrDevicePath;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
+  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;\r
+  VENDOR_DEVICE_PATH        Vendor;\r
+\r
+  //\r
+  // Get all handles that have SerialIo protocol installed\r
+  //\r
+  InitializeListHead (&TerminalMenu.Head);\r
+  TerminalMenu.MenuNumber = 0;\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiSerialIoProtocolGuid,\r
+                  NULL,\r
+                  &NoHandles,\r
+                  &Handles\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // No serial ports present\r
+    //\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  //\r
+  // Sort Uart handles array with Acpi->UID from low to high\r
+  // then Terminal menu can be built from low Acpi->UID to high Acpi->UID\r
+  //\r
+  SortedUartHandle (Handles, NoHandles);\r
+\r
+  for (Index = 0; Index < NoHandles; Index++) {\r
+    //\r
+    // Check to see whether the handle has DevicePath Protocol installed\r
+    //\r
+    gBS->HandleProtocol (\r
+          Handles[Index],\r
+          &gEfiDevicePathProtocolGuid,\r
+          (VOID **) &DevicePath\r
+          );\r
+\r
+    Acpi = NULL;\r
+    for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
+      if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+        break;\r
+      }\r
+      //\r
+      // Acpi points to the node before Uart node\r
+      //\r
+      Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+    }\r
+\r
+    if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
+      NewMenuEntry = BOpt_CreateMenuEntry (BM_TERMINAL_CONTEXT_SELECT);\r
+      if (NewMenuEntry == NULL) {\r
+        FreePool (Handles);\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+\r
+      NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+      CopyMem (&NewMenuEntry->OptionNumber, &Acpi->UID, sizeof (UINT32));\r
+      NewTerminalContext->DevicePath = DuplicateDevicePath (DevicePath);\r
+      //\r
+      // BugBug: I have no choice, calling EfiLibStrFromDatahub will hang the system!\r
+      // coz' the misc data for each platform is not correct, actually it's the device path stored in\r
+      // datahub which is not completed, so a searching for end of device path will enter a\r
+      // dead-loop.\r
+      //\r
+      NewMenuEntry->DisplayString = EfiLibStrFromDatahub (DevicePath);\r
+      if (NULL == NewMenuEntry->DisplayString) {\r
+        NewMenuEntry->DisplayString = UiDevicePathToStr (DevicePath);\r
+      }\r
+\r
+      NewMenuEntry->HelpString = NULL;\r
+\r
+      NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+\r
+      gBS->HandleProtocol (\r
+            Handles[Index],\r
+            &gEfiSerialIoProtocolGuid,\r
+            (VOID **) &SerialIo\r
+            );\r
+\r
+      CopyMem (\r
+        &NewTerminalContext->BaudRate,\r
+        &SerialIo->Mode->BaudRate,\r
+        sizeof (UINT64)\r
+        );\r
+\r
+      CopyMem (\r
+        &NewTerminalContext->DataBits,\r
+        &SerialIo->Mode->DataBits,\r
+        sizeof (UINT8)\r
+        );\r
+\r
+      CopyMem (\r
+        &NewTerminalContext->Parity,\r
+        &SerialIo->Mode->Parity,\r
+        sizeof (UINT8)\r
+        );\r
+\r
+      CopyMem (\r
+        &NewTerminalContext->StopBits,\r
+        &SerialIo->Mode->StopBits,\r
+        sizeof (UINT8)\r
+        );\r
+      InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
+      TerminalMenu.MenuNumber++;\r
+    }\r
+  }\r
+  if (Handles != NULL) {\r
+    FreePool (Handles);\r
+  }\r
+\r
+  //\r
+  // Get L"ConOut", L"ConIn" and L"ErrOut" from the Var\r
+  //\r
+  GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
+  GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
+  GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
+  if (OutDevicePath != NULL) {\r
+    UpdateComAttributeFromVariable (OutDevicePath);\r
+  }\r
+\r
+  if (InpDevicePath != NULL) {\r
+    UpdateComAttributeFromVariable (InpDevicePath);\r
+  }\r
+\r
+  if (ErrDevicePath != NULL) {\r
+    UpdateComAttributeFromVariable (ErrDevicePath);\r
+  }\r
+\r
+  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+    if (NULL == NewMenuEntry) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
+    NewTerminalContext                = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+    NewTerminalContext->TerminalType  = 0;\r
+    NewTerminalContext->IsConIn       = FALSE;\r
+    NewTerminalContext->IsConOut      = FALSE;\r
+    NewTerminalContext->IsStdErr      = FALSE;\r
+\r
+    Vendor.Header.Type                = MESSAGING_DEVICE_PATH;\r
+    Vendor.Header.SubType             = MSG_VENDOR_DP;\r
+\r
+    for (Index2 = 0; Index2 < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])); Index2++) {\r
+      CopyMem (&Vendor.Guid, &TerminalTypeGuid[Index2], sizeof (EFI_GUID));\r
+      SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
+      NewDevicePath = AppendDevicePathNode (\r
+                        NewTerminalContext->DevicePath,\r
+                        (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
+                        );\r
+      if (NewMenuEntry->HelpString != NULL) {\r
+        FreePool (NewMenuEntry->HelpString);\r
+      }\r
+      //\r
+      // NewMenuEntry->HelpString = UiDevicePathToStr (NewDevicePath);\r
+      // NewMenuEntry->DisplayString = NewMenuEntry->HelpString;\r
+      //\r
+      NewMenuEntry->HelpString = NULL;\r
+\r
+      NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+\r
+      if (MatchDevicePaths (OutDevicePath, NewDevicePath)) {\r
+        NewTerminalContext->IsConOut      = TRUE;\r
+        NewTerminalContext->TerminalType  = (UINT8) Index2;\r
+      }\r
+\r
+      if (MatchDevicePaths (InpDevicePath, NewDevicePath)) {\r
+        NewTerminalContext->IsConIn       = TRUE;\r
+        NewTerminalContext->TerminalType  = (UINT8) Index2;\r
+      }\r
+\r
+      if (MatchDevicePaths (ErrDevicePath, NewDevicePath)) {\r
+        NewTerminalContext->IsStdErr      = TRUE;\r
+        NewTerminalContext->TerminalType  = (UINT8) Index2;\r
+      }\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Update Com Ports attributes from DevicePath\r
+\r
+  @param DevicePath      DevicePath that contains Com ports\r
+\r
+  @retval EFI_SUCCESS   The update is successful.\r
+  @retval EFI_NOT_FOUND Can not find specific menu entry\r
+**/\r
+EFI_STATUS\r
+UpdateComAttributeFromVariable (\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
+  EFI_DEVICE_PATH_PROTOCOL  *SerialNode;\r
+  ACPI_HID_DEVICE_PATH      *Acpi;\r
+  UART_DEVICE_PATH          *Uart;\r
+  UART_DEVICE_PATH          *Uart1;\r
+  UINTN                     TerminalNumber;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
+  UINTN                     Index;\r
+\r
+  Node            = DevicePath;\r
+  Node            = NextDevicePathNode (Node);\r
+  TerminalNumber  = 0;\r
+  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+    while (!IsDevicePathEnd (Node)) {\r
+      Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+      if (IsIsaSerialNode (Acpi)) {\r
+        CopyMem (&TerminalNumber, &Acpi->UID, sizeof (UINT32));\r
+      }\r
+\r
+      if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+        Uart          = (UART_DEVICE_PATH *) Node;\r
+        NewMenuEntry  = BOpt_GetMenuEntry (&TerminalMenu, TerminalNumber);\r
+        if (NULL == NewMenuEntry) {\r
+          return EFI_NOT_FOUND;\r
+        }\r
+\r
+        NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+        CopyMem (\r
+          &NewTerminalContext->BaudRate,\r
+          &Uart->BaudRate,\r
+          sizeof (UINT64)\r
+          );\r
+\r
+        CopyMem (\r
+          &NewTerminalContext->DataBits,\r
+          &Uart->DataBits,\r
+          sizeof (UINT8)\r
+          );\r
+\r
+        CopyMem (\r
+          &NewTerminalContext->Parity,\r
+          &Uart->Parity,\r
+          sizeof (UINT8)\r
+          );\r
+\r
+        CopyMem (\r
+          &NewTerminalContext->StopBits,\r
+          &Uart->StopBits,\r
+          sizeof (UINT8)\r
+          );\r
+\r
+        SerialNode  = NewTerminalContext->DevicePath;\r
+        SerialNode  = NextDevicePathNode (SerialNode);\r
+        while (!IsDevicePathEnd (SerialNode)) {\r
+          if ((DevicePathType (SerialNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (SerialNode) == MSG_UART_DP)) {\r
+            //\r
+            // Update following device paths according to\r
+            // previous acquired uart attributes\r
+            //\r
+            Uart1 = (UART_DEVICE_PATH *) SerialNode;\r
+            CopyMem (\r
+              &Uart1->BaudRate,\r
+              &NewTerminalContext->BaudRate,\r
+              sizeof (UINT64)\r
+              );\r
+\r
+            CopyMem (\r
+              &Uart1->DataBits,\r
+              &NewTerminalContext->DataBits,\r
+              sizeof (UINT8)\r
+              );\r
+            CopyMem (\r
+              &Uart1->Parity,\r
+              &NewTerminalContext->Parity,\r
+              sizeof (UINT8)\r
+              );\r
+            CopyMem (\r
+              &Uart1->StopBits,\r
+              &NewTerminalContext->StopBits,\r
+              sizeof (UINT8)\r
+              );\r
+\r
+            break;\r
+          }\r
+\r
+          SerialNode = NextDevicePathNode (SerialNode);\r
+        }\r
+        //\r
+        // end while\r
+        //\r
+      }\r
+\r
+      Node = NextDevicePathNode (Node);\r
+    }\r
+    //\r
+    // end while\r
+    //\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Build up Console Menu based on types passed in. The type can\r
+  be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
+  and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
+\r
+  @param ConsoleMenuType Can be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
+                         and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
+\r
+  @retval EFI_UNSUPPORTED The type passed in is not in the 3 types defined.\r
+  @retval EFI_NOT_FOUND   If the EFI Variable defined in UEFI spec with name "ConOutDev", \r
+                          "ConInDev" or "ConErrDev" doesn't exists.\r
+  @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operations.\r
+  @retval EFI_SUCCESS          Function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetConsoleMenu (\r
+  IN UINTN              ConsoleMenuType\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *AllDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *MultiDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePathInst;\r
+  UINTN                     Size;\r
+  UINTN                     AllCount;\r
+  UINTN                     Index;\r
+  UINTN                     Index2;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+  BM_CONSOLE_CONTEXT        *NewConsoleContext;\r
+  TYPE_OF_TERMINAL          Terminal;\r
+  UINTN                     Com;\r
+  BM_MENU_OPTION            *ConsoleMenu;\r
+\r
+  DevicePath    = NULL;\r
+  AllDevicePath = NULL;\r
+  AllCount      = 0;\r
+  switch (ConsoleMenuType) {\r
+  case BM_CONSOLE_IN_CONTEXT_SELECT:\r
+    ConsoleMenu   = &ConsoleInpMenu;\r
+    GetEfiGlobalVariable2 (L"ConIn", (VOID**)&DevicePath, NULL);\r
+    GetEfiGlobalVariable2 (L"ConInDev", (VOID**)&AllDevicePath, NULL);\r
+    break;\r
+\r
+  case BM_CONSOLE_OUT_CONTEXT_SELECT:\r
+    ConsoleMenu   = &ConsoleOutMenu;\r
+    GetEfiGlobalVariable2 (L"ConOut", (VOID**)&DevicePath, NULL);\r
+    GetEfiGlobalVariable2 (L"ConOutDev", (VOID**)&AllDevicePath, NULL);\r
+    break;\r
+\r
+  case BM_CONSOLE_ERR_CONTEXT_SELECT:\r
+    ConsoleMenu   = &ConsoleErrMenu;\r
+    GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&DevicePath, NULL);\r
+    GetEfiGlobalVariable2 (L"ErrOutDev", (VOID**)&AllDevicePath, NULL);\r
+    break;\r
+\r
+  default:\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (NULL == AllDevicePath) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  InitializeListHead (&ConsoleMenu->Head);\r
+\r
+  AllCount                = EfiDevicePathInstanceCount (AllDevicePath);\r
+  ConsoleMenu->MenuNumber = 0;\r
+  //\r
+  // Following is menu building up for Console Devices selected.\r
+  //\r
+  MultiDevicePath = AllDevicePath;\r
+  Index2          = 0;\r
+  for (Index = 0; Index < AllCount; Index++) {\r
+    DevicePathInst  = GetNextDevicePathInstance (&MultiDevicePath, &Size);\r
+\r
+    NewMenuEntry    = BOpt_CreateMenuEntry (BM_CONSOLE_CONTEXT_SELECT);\r
+    if (NULL == NewMenuEntry) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    NewConsoleContext             = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+    NewMenuEntry->OptionNumber    = Index2;\r
+\r
+    NewConsoleContext->DevicePath = DuplicateDevicePath (DevicePathInst);\r
+    ASSERT (NewConsoleContext->DevicePath != NULL);\r
+    NewMenuEntry->DisplayString   = EfiLibStrFromDatahub (NewConsoleContext->DevicePath);\r
+    if (NULL == NewMenuEntry->DisplayString) {\r
+      NewMenuEntry->DisplayString = UiDevicePathToStr (NewConsoleContext->DevicePath);\r
+    }\r
+\r
+    NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+    if (NULL == NewMenuEntry->HelpString) {\r
+      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+    } else {\r
+      NewMenuEntry->HelpStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
+    }\r
+\r
+    NewConsoleContext->IsTerminal = IsTerminalDevicePath (\r
+                                      NewConsoleContext->DevicePath,\r
+                                      &Terminal,\r
+                                      &Com\r
+                                      );\r
+\r
+    NewConsoleContext->IsActive = MatchDevicePaths (\r
+                                    DevicePath,\r
+                                    NewConsoleContext->DevicePath\r
+                                    );\r
+\r
+    if (NewConsoleContext->IsTerminal) {\r
+      BOpt_DestroyMenuEntry (NewMenuEntry);\r
+    } else {\r
+      Index2++;\r
+      ConsoleMenu->MenuNumber++;\r
+      InsertTailList (&ConsoleMenu->Head, &NewMenuEntry->Link);\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+  @retval EFI_SUCCESS    The function always complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetAllConsoles (\r
+  VOID\r
+  )\r
+{\r
+  GetConsoleMenu (BM_CONSOLE_IN_CONTEXT_SELECT);\r
+  GetConsoleMenu (BM_CONSOLE_OUT_CONTEXT_SELECT);\r
+  GetConsoleMenu (BM_CONSOLE_ERR_CONTEXT_SELECT);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+  @retval EFI_SUCCESS    The function always complete successfully.\r
+**/\r
+EFI_STATUS\r
+FreeAllConsoles (\r
+  VOID\r
+  )\r
+{\r
+  BOpt_FreeMenu (&ConsoleOutMenu);\r
+  BOpt_FreeMenu (&ConsoleInpMenu);\r
+  BOpt_FreeMenu (&ConsoleErrMenu);\r
+  BOpt_FreeMenu (&TerminalMenu);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Test whether DevicePath is a valid Terminal\r
+\r
+\r
+  @param DevicePath      DevicePath to be checked\r
+  @param Termi           If DevicePath is valid Terminal, terminal type is returned.\r
+  @param Com             If DevicePath is valid Terminal, Com Port type is returned.\r
+\r
+  @retval  TRUE         If DevicePath point to a Terminal.\r
+  @retval  FALSE        If DevicePath does not point to a Terminal.\r
+\r
+**/\r
+BOOLEAN\r
+IsTerminalDevicePath (\r
+  IN  EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+  OUT TYPE_OF_TERMINAL         *Termi,\r
+  OUT UINTN                    *Com\r
+  )\r
+{\r
+  BOOLEAN                   IsTerminal;\r
+  EFI_DEVICE_PATH_PROTOCOL  *Node;\r
+  VENDOR_DEVICE_PATH        *Vendor;\r
+  UART_DEVICE_PATH          *Uart;\r
+  ACPI_HID_DEVICE_PATH      *Acpi;\r
+\r
+  IsTerminal = FALSE;\r
+\r
+  Uart   = NULL;\r
+  Vendor = NULL;\r
+  Acpi   = NULL;\r
+  for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
+    //\r
+    // Vendor points to the node before the End node\r
+    //\r
+    Vendor = (VENDOR_DEVICE_PATH *) Node;\r
+\r
+    if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+      Uart = (UART_DEVICE_PATH *) Node;\r
+    }\r
+\r
+    if (Uart == NULL) {\r
+      //\r
+      // Acpi points to the node before the UART node\r
+      //\r
+      Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+    }\r
+  }\r
+\r
+  if (Vendor == NULL ||\r
+      DevicePathType (Vendor) != MESSAGING_DEVICE_PATH ||\r
+      DevicePathSubType (Vendor) != MSG_VENDOR_DP ||\r
+      Uart == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  //\r
+  // There are four kinds of Terminal types\r
+  // check to see whether this devicepath\r
+  // is one of that type\r
+  //\r
+  if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[0])) {\r
+    *Termi      = TerminalTypePcAnsi;\r
+    IsTerminal  = TRUE;\r
+  } else {\r
+    if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[1])) {\r
+      *Termi      = TerminalTypeVt100;\r
+      IsTerminal  = TRUE;\r
+    } else {\r
+      if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[2])) {\r
+        *Termi      = TerminalTypeVt100Plus;\r
+        IsTerminal  = TRUE;\r
+      } else {\r
+        if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[3])) {\r
+          *Termi      = TerminalTypeVtUtf8;\r
+          IsTerminal  = TRUE;\r
+        } else {\r
+          if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[4])) {\r
+            *Termi      = TerminalTypeTtyTerm;\r
+            IsTerminal  = TRUE;\r
+          } else {\r
+            IsTerminal = FALSE;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  if (!IsTerminal) {\r
+    return FALSE;\r
+  }\r
+\r
+  if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
+    CopyMem (Com, &Acpi->UID, sizeof (UINT32));\r
+  } else {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Get mode number according to column and row\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+GetConsoleOutMode (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINTN                         Col;\r
+  UINTN                         Row;\r
+  UINTN                         CurrentCol;\r
+  UINTN                         CurrentRow;\r
+  UINTN                         Mode;\r
+  UINTN                         MaxMode;\r
+  EFI_STATUS                    Status;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;\r
+\r
+  ConOut   = gST->ConOut;\r
+  MaxMode  = (UINTN) (ConOut->Mode->MaxMode);\r
+\r
+  CurrentCol = PcdGet32 (PcdSetupConOutColumn);\r
+  CurrentRow = PcdGet32 (PcdSetupConOutRow);\r
+  for (Mode = 0; Mode < MaxMode; Mode++) {\r
+    Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
+    if (!EFI_ERROR(Status)) {\r
+      if (CurrentCol == Col && CurrentRow == Row) {\r
+        CallbackData->BmmFakeNvData.ConsoleOutMode = (UINT16) Mode;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/  \r
+VOID  \r
+GetConsoleInCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINT16              Index;\r
+  BM_MENU_ENTRY       *NewMenuEntry; \r
+  UINT8               *ConInCheck;\r
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+\r
+  ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+  for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
+    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
+    ConInCheck[Index] = NewConsoleContext->IsActive;\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/      \r
+VOID    \r
+GetConsoleOutCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINT16              Index;\r
+  BM_MENU_ENTRY       *NewMenuEntry; \r
+  UINT8               *ConOutCheck;\r
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
+  \r
+  ASSERT (CallbackData != NULL);\r
+  ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+  for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
+    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
+    ConOutCheck[Index] = NewConsoleContext->IsActive;\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+  in BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/        \r
+VOID  \r
+GetConsoleErrCheck (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINT16              Index;\r
+  BM_MENU_ENTRY       *NewMenuEntry; \r
+  UINT8               *ConErrCheck;\r
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+  ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+  for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {  \r
+    NewMenuEntry      = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;  \r
+    ConErrCheck[Index] = NewConsoleContext->IsActive;\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+  to BMM_FAKE_NV_DATA structure.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID  \r
+GetTerminalAttribute (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  BMM_FAKE_NV_DATA     *CurrentFakeNVMap;\r
+  BM_MENU_ENTRY        *NewMenuEntry;\r
+  BM_TERMINAL_CONTEXT  *NewTerminalContext;    \r
+  UINT16               TerminalIndex;  \r
+  UINT8                AttributeIndex;\r
+\r
+  ASSERT (CallbackData != NULL);\r
+\r
+  CurrentFakeNVMap = &CallbackData->BmmFakeNvData;     \r
+  for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
+       (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) {  \r
+    NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
+    NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
+      if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
+        NewTerminalContext->BaudRateIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) {\r
+      if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
+        NewTerminalContext->DataBitsIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }    \r
+\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) {\r
+      if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
+        NewTerminalContext->ParityIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }\r
+\r
+    for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) {\r
+      if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
+        NewTerminalContext->StopBitsIndex = AttributeIndex;\r
+        break;\r
+      }\r
+    }\r
+    CurrentFakeNVMap->COMBaudRate[TerminalIndex]     = NewTerminalContext->BaudRateIndex;\r
+    CurrentFakeNVMap->COMDataRate[TerminalIndex]     = NewTerminalContext->DataBitsIndex;\r
+    CurrentFakeNVMap->COMStopBits[TerminalIndex]     = NewTerminalContext->StopBitsIndex;\r
+    CurrentFakeNVMap->COMParity[TerminalIndex]       = NewTerminalContext->ParityIndex; \r
+    CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
+    CurrentFakeNVMap->COMFlowControl[TerminalIndex]  = NewTerminalContext->FlowControl;\r
+  }\r
+}\r
+\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Data.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Data.c
new file mode 100644 (file)
index 0000000..4257e1a
--- /dev/null
@@ -0,0 +1,263 @@
+/** @file\r
+Define some data used for Boot Maint\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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+VOID                *mStartOpCodeHandle = NULL;\r
+VOID                *mEndOpCodeHandle = NULL;\r
+EFI_IFR_GUID_LABEL  *mStartLabel = NULL;\r
+EFI_IFR_GUID_LABEL  *mEndLabel = NULL;\r
+\r
+///\r
+/// Terminal type string token storage\r
+///\r
+UINT16              TerminalType[] = {\r
+  STRING_TOKEN(STR_COM_TYPE_0),\r
+  STRING_TOKEN(STR_COM_TYPE_1),\r
+  STRING_TOKEN(STR_COM_TYPE_2),\r
+  STRING_TOKEN(STR_COM_TYPE_3),\r
+  STRING_TOKEN(STR_COM_TYPE_4),\r
+};\r
+\r
+///\r
+/// Flow Control type string token storage\r
+///\r
+UINT16              mFlowControlType[2] = {\r
+  STRING_TOKEN(STR_NONE_FLOW_CONTROL),\r
+  STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL)\r
+};\r
+\r
+UINT32              mFlowControlValue[2] = {\r
+  0,\r
+  UART_FLOW_CONTROL_HARDWARE\r
+};\r
+\r
+///\r
+/// Console Input Device Selection Menu\r
+///\r
+BM_MENU_OPTION      ConsoleInpMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+///\r
+/// Console Output Device Selection Menu\r
+///\r
+BM_MENU_OPTION      ConsoleOutMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+///\r
+/// Error Output Device Selection Menu\r
+///\r
+BM_MENU_OPTION      ConsoleErrMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+///\r
+/// Boot Option from variable Menu\r
+///\r
+BM_MENU_OPTION      BootOptionMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+///\r
+/// Driver Option from variable menu\r
+///\r
+BM_MENU_OPTION      DriverOptionMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+///\r
+/// Handles in current system selection menu\r
+///\r
+BM_MENU_OPTION      DriverMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+BM_MENU_OPTION      TerminalMenu = {\r
+  BM_MENU_OPTION_SIGNATURE,\r
+  {NULL},\r
+  0\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for BaudRate\r
+///\r
+COM_ATTR            BaudRateList[19] = {\r
+  {\r
+    115200,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_0)\r
+  },\r
+  {\r
+    57600,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_1)\r
+  },\r
+  {\r
+    38400,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_2)\r
+  },\r
+  {\r
+    19200,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_3)\r
+  },\r
+  {\r
+    9600,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_4)\r
+  },\r
+  {\r
+    7200,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_5)\r
+  },\r
+  {\r
+    4800,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_6)\r
+  },\r
+  {\r
+    3600,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_7)\r
+  },\r
+  {\r
+    2400,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_8)\r
+  },\r
+  {\r
+    2000,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_9)\r
+  },\r
+  {\r
+    1800,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_10)\r
+  },\r
+  {\r
+    1200,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_11)\r
+  },\r
+  {\r
+    600,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_12)\r
+  },\r
+  {\r
+    300,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_13)\r
+  },\r
+  {\r
+    150,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_14)\r
+  },\r
+  {\r
+    134,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_15)\r
+  },\r
+  {\r
+    110,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_16)\r
+  },\r
+  {\r
+    75,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_17)\r
+  },\r
+  {\r
+    50,\r
+    STRING_TOKEN(STR_COM_BAUD_RATE_18)\r
+  }\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for DataBits\r
+///\r
+COM_ATTR            DataBitsList[4] = {\r
+  {\r
+    5,\r
+    STRING_TOKEN(STR_COM_DATA_BITS_0)\r
+  },\r
+  {\r
+    6,\r
+    STRING_TOKEN(STR_COM_DATA_BITS_1)\r
+  },\r
+  {\r
+    7,\r
+    STRING_TOKEN(STR_COM_DATA_BITS_2)\r
+  },\r
+  {\r
+    8,\r
+    STRING_TOKEN(STR_COM_DATA_BITS_3)\r
+  }\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for Parity\r
+///\r
+COM_ATTR            ParityList[5] = {\r
+  {\r
+    NoParity,\r
+    STRING_TOKEN(STR_COM_PAR_0)\r
+  },\r
+  {\r
+    EvenParity,\r
+    STRING_TOKEN(STR_COM_PAR_1)\r
+  },\r
+  {\r
+    OddParity,\r
+    STRING_TOKEN(STR_COM_PAR_2)\r
+  },\r
+  {\r
+    MarkParity,\r
+    STRING_TOKEN(STR_COM_PAR_3)\r
+  },\r
+  {\r
+    SpaceParity,\r
+    STRING_TOKEN(STR_COM_PAR_4)\r
+  }\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for Baudreate\r
+///\r
+COM_ATTR            StopBitsList[3] = {\r
+  {\r
+    OneStopBit,\r
+    STRING_TOKEN(STR_COM_STOP_BITS_0)\r
+  },\r
+  {\r
+    OneFiveStopBits,\r
+    STRING_TOKEN(STR_COM_STOP_BITS_1)\r
+  },\r
+  {\r
+    TwoStopBits,\r
+    STRING_TOKEN(STR_COM_STOP_BITS_2)\r
+  }\r
+};\r
+\r
+///\r
+/// Guid for messaging path, used in Serial port setting.\r
+///\r
+EFI_GUID            TerminalTypeGuid[] = {\r
+  DEVICE_PATH_MESSAGING_PC_ANSI,\r
+  DEVICE_PATH_MESSAGING_VT_100,\r
+  DEVICE_PATH_MESSAGING_VT_100_PLUS,\r
+  DEVICE_PATH_MESSAGING_VT_UTF8,\r
+  EFI_TTY_TERM_GUID\r
+};\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/FormGuid.h b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/FormGuid.h
new file mode 100644 (file)
index 0000000..cf14b40
--- /dev/null
@@ -0,0 +1,209 @@
+/** @file\r
+Formset guids, form id and VarStore data structure for Boot Maintenance Manager.\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
+\r
+**/\r
+#ifndef _FORM_GUID_H_\r
+#define _FORM_GUID_H_\r
+\r
+#define BOOT_MAINT_FORMSET_GUID \\r
+  { \\r
+  0x642237c7, 0x35d4, 0x472d, {0x83, 0x65, 0x12, 0xe0, 0xcc, 0xf2, 0x7a, 0x22} \\r
+  }\r
+\r
+#define FORM_MAIN_ID                         0x1001\r
+#define FORM_BOOT_ADD_ID                     0x1002\r
+#define FORM_BOOT_DEL_ID                     0x1003\r
+#define FORM_BOOT_CHG_ID                     0x1004\r
+#define FORM_DRV_ADD_ID                      0x1005\r
+#define FORM_DRV_DEL_ID                      0x1006\r
+#define FORM_DRV_CHG_ID                      0x1007\r
+#define FORM_CON_MAIN_ID                     0x1008\r
+#define FORM_CON_IN_ID                       0x1009\r
+#define FORM_CON_OUT_ID                      0x100A\r
+#define FORM_CON_ERR_ID                      0x100B\r
+#define FORM_FILE_SEEK_ID                    0x100C\r
+#define FORM_FILE_NEW_SEEK_ID                0x100D\r
+#define FORM_DRV_ADD_FILE_ID                 0x100E\r
+#define FORM_DRV_ADD_HANDLE_ID               0x100F\r
+#define FORM_DRV_ADD_HANDLE_DESC_ID          0x1010\r
+#define FORM_BOOT_NEXT_ID                    0x1011\r
+#define FORM_TIME_OUT_ID                     0x1012\r
+#define FORM_BOOT_SETUP_ID                   0x1014\r
+#define FORM_DRIVER_SETUP_ID                 0x1015\r
+#define FORM_BOOT_LEGACY_DEVICE_ID           0x1016\r
+#define FORM_CON_COM_ID                      0x1017\r
+#define FORM_CON_COM_SETUP_ID                0x1018\r
+#define FORM_BOOT_ADD_DESCRIPTION_ID         0x101F\r
+#define FORM_DRIVER_ADD_FILE_DESCRIPTION_ID  0x1020\r
+#define FORM_CON_MODE_ID                     0x1021\r
+#define FORM_MEMORY_CHECK_ID                 0x1022\r
+#define FORM_UEFI_OPTIMIZED_BOOT_ID          0x1023\r
+#define FORM_BOOT_FROM_FILE_ID               0x1024\r
+\r
+\r
+#define MAXIMUM_FORM_ID                      0x10FF\r
+\r
+#define KEY_VALUE_COM_SET_BAUD_RATE          0x1101\r
+#define KEY_VALUE_COM_SET_DATA_BITS          0x1102\r
+#define KEY_VALUE_COM_SET_STOP_BITS          0x1103\r
+#define KEY_VALUE_COM_SET_PARITY             0x1104\r
+#define KEY_VALUE_COM_SET_TERMI_TYPE         0x1105\r
+#define KEY_VALUE_MAIN_BOOT_NEXT             0x1106\r
+#define KEY_VALUE_BOOT_ADD_DESC_DATA         0x1107\r
+#define KEY_VALUE_BOOT_ADD_OPT_DATA          0x1108\r
+#define KEY_VALUE_DRIVER_ADD_DESC_DATA       0x1109\r
+#define KEY_VALUE_DRIVER_ADD_OPT_DATA        0x110A\r
+#define KEY_VALUE_SAVE_AND_EXIT              0x110B\r
+#define KEY_VALUE_NO_SAVE_AND_EXIT           0x110C\r
+#define KEY_VALUE_BOOT_FROM_FILE             0x110D\r
+#define FORM_RESET                           0x110E\r
+#define KEY_VALUE_BOOT_DESCRIPTION           0x110F\r
+#define KEY_VALUE_BOOT_OPTION                0x1110\r
+#define KEY_VALUE_DRIVER_DESCRIPTION         0x1111\r
+#define KEY_VALUE_DRIVER_OPTION              0x1112\r
+#define KEY_VALUE_SAVE_AND_EXIT_BOOT         0x1113\r
+#define KEY_VALUE_NO_SAVE_AND_EXIT_BOOT      0x1114\r
+#define KEY_VALUE_SAVE_AND_EXIT_DRIVER       0x1115\r
+#define KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER    0x1116\r
+\r
+#define MAXIMUM_NORMAL_KEY_VALUE             0x11FF\r
+\r
+//\r
+// Varstore ID defined for Buffer Storage\r
+//\r
+#define VARSTORE_ID_BOOT_MAINT               0x1000\r
+\r
+//\r
+// End Label\r
+//\r
+#define LABEL_BMM_PLATFORM_INFORMATION       0xfffe\r
+#define LABEL_END                            0xffff\r
+#define MAX_MENU_NUMBER                      100\r
+\r
+///\r
+/// This is the structure that will be used to store the\r
+/// question's current value. Use it at initialize time to\r
+/// set default value for each question. When using at run\r
+/// time, this map is returned by the callback function,\r
+/// so dynamically changing the question's value will be\r
+/// possible through this mechanism\r
+///\r
+typedef struct {\r
+  //\r
+  // Three questions displayed at the main page\r
+  // for Timeout, BootNext, Variables respectively\r
+  //\r
+  UINT16  BootTimeOut;\r
+  UINT32  BootNext;\r
+\r
+  //\r
+  // This is the COM1 Attributes value storage\r
+  //\r
+  UINT8   COM1BaudRate;\r
+  UINT8   COM1DataRate;\r
+  UINT8   COM1StopBits;\r
+  UINT8   COM1Parity;\r
+  UINT8   COM1TerminalType;\r
+\r
+  //\r
+  // This is the COM2 Attributes value storage\r
+  //\r
+  UINT8   COM2BaudRate;\r
+  UINT8   COM2DataRate;\r
+  UINT8   COM2StopBits;\r
+  UINT8   COM2Parity;\r
+  UINT8   COM2TerminalType;\r
+\r
+  //\r
+  // Driver Option Add Handle page storage\r
+  //\r
+  UINT16  DriverAddHandleDesc[MAX_MENU_NUMBER];\r
+  UINT16  DriverAddHandleOptionalData[MAX_MENU_NUMBER];\r
+  UINT8   DriverAddActive;\r
+  UINT8   DriverAddForceReconnect;\r
+\r
+  //\r
+  // Console Input/Output/Errorout using COM port check storage\r
+  //\r
+  UINT8   ConsoleInputCOM1;\r
+  UINT8   ConsoleInputCOM2;\r
+  UINT8   ConsoleOutputCOM1;\r
+  UINT8   ConsoleOutputCOM2;\r
+  UINT8   ConsoleErrorCOM1;\r
+  UINT8   ConsoleErrorCOM2;\r
+\r
+  //\r
+  // At most 100 input/output/errorout device for console storage\r
+  //\r
+  UINT8   ConsoleCheck[MAX_MENU_NUMBER];\r
+  \r
+  //\r
+  // At most 100 input/output/errorout device for console storage\r
+  //\r
+  UINT8   ConsoleInCheck[MAX_MENU_NUMBER];\r
+  UINT8   ConsoleOutCheck[MAX_MENU_NUMBER];\r
+  UINT8   ConsoleErrCheck[MAX_MENU_NUMBER];\r
+\r
+  //\r
+  // Boot or Driver Option Order storage\r
+  // The value is the OptionNumber+1 because the order list value cannot be 0\r
+  // Use UINT32 to hold the potential value 0xFFFF+1=0x10000\r
+  //\r
+  UINT32  BootOptionOrder[MAX_MENU_NUMBER];\r
+  UINT32  DriverOptionOrder[MAX_MENU_NUMBER];\r
+  //\r
+  // Boot or Driver Option Delete storage\r
+  //\r
+  BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
+  BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
+  BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
+  BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
+\r
+  //\r
+  // This is the Terminal Attributes value storage\r
+  //\r
+  UINT8   COMBaudRate[MAX_MENU_NUMBER];\r
+  UINT8   COMDataRate[MAX_MENU_NUMBER];\r
+  UINT8   COMStopBits[MAX_MENU_NUMBER];\r
+  UINT8   COMParity[MAX_MENU_NUMBER];\r
+  UINT8   COMTerminalType[MAX_MENU_NUMBER];\r
+  UINT8   COMFlowControl[MAX_MENU_NUMBER];\r
+\r
+  //\r
+  // We use DisableMap array to record the enable/disable state of each boot device\r
+  // It should be taken as a bit array, from left to right there are totally 256 bits\r
+  // the most left one stands for BBS table item 0, and the most right one stands for item 256\r
+  // If the bit is 1, it means the boot device has been disabled.\r
+  //\r
+  UINT8   DisableMap[32];\r
+\r
+  //\r
+  // Console Output Text Mode\r
+  //\r
+  UINT16  ConsoleOutMode;\r
+\r
+  //\r
+  //  UINT16                    PadArea[10];\r
+  //\r
+\r
+  UINT16  BootDescriptionData[MAX_MENU_NUMBER];\r
+  UINT16  BootOptionalData[127];\r
+  UINT16  DriverDescriptionData[MAX_MENU_NUMBER];\r
+  UINT16  DriverOptionalData[127];\r
+  BOOLEAN BootOptionChanged;\r
+  BOOLEAN DriverOptionChanged;\r
+  UINT8   Active;\r
+  UINT8   ForceReconnect;\r
+} BMM_FAKE_NV_DATA;\r
+\r
+#endif\r
+\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
new file mode 100644 (file)
index 0000000..cd1756a
--- /dev/null
@@ -0,0 +1,1272 @@
+/** @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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+ Create the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+CreateUpdateData (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Init OpCode Handle and Allocate space for creation of Buffer\r
+  //\r
+  mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (mStartOpCodeHandle != NULL);\r
+  \r
+  mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (mEndOpCodeHandle != NULL);\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
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  mEndLabel->Number       = LABEL_END;\r
+}\r
+\r
+/**\r
+  Refresh the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+RefreshUpdateData (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Free current updated date\r
+  //  \r
+  if (mStartOpCodeHandle != NULL) {\r
+    HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
+  }\r
+\r
+  //\r
+  // Create new OpCode Handle\r
+  //\r
+  mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\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
+/**\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
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdatePageStart (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  RefreshUpdateData ();\r
+  mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
+\r
+  if (!(CallbackData->BmmAskSaveOrNot)) {\r
+    //\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
+    HiiCreateGotoOpCode (\r
+      mStartOpCodeHandle,\r
+      FORM_MAIN_ID,\r
+      STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
+      STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
+      0,\r
+      FORM_MAIN_ID\r
+      );\r
+  }\r
+}\r
+\r
+/**\r
+  Create the "Apply changes" and "Discard changes" tags. And\r
+  ensure user can return to the main page.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdatePageEnd (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  //\r
+  // Create the "Apply changes" and "Discard changes" tags.\r
+  //\r
+  if (CallbackData->BmmAskSaveOrNot) {\r
+    HiiCreateSubTitleOpCode (\r
+      mStartOpCodeHandle,\r
+      STRING_TOKEN (STR_NULL_STRING),\r
+      0,\r
+      0,\r
+      0\r
+      );\r
+\r
+    HiiCreateActionOpCode (\r
+      mStartOpCodeHandle,\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
+      0\r
+      );\r
+  }\r
+\r
+  //\r
+  // Ensure user can return to the main page.\r
+  //\r
+  HiiCreateActionOpCode (\r
+    mStartOpCodeHandle,\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
+    0\r
+    );\r
+\r
+  HiiUpdateForm (\r
+    CallbackData->BmmHiiHandle,\r
+    &mBootMaintGuid,\r
+    CallbackData->BmmCurrentPageId,\r
+    mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
+    mEndOpCodeHandle    // LABEL_END\r
+    );\r
+}\r
+\r
+/**\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
+\r
+**/\r
+VOID\r
+CleanUpPage (\r
+  IN UINT16                           LabelId,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  RefreshUpdateData ();\r
+\r
+  //\r
+  // Remove all op-codes from dynamic page\r
+  //\r
+  mStartLabel->Number = LabelId;\r
+  HiiUpdateForm (\r
+    CallbackData->BmmHiiHandle,\r
+    &mBootMaintGuid,\r
+    LabelId,\r
+    mStartOpCodeHandle, // Label LabelId\r
+    mEndOpCodeHandle    // LABEL_END\r
+    );\r
+}\r
+\r
+/**\r
+  Create a list of Goto Opcode for all terminal devices logged\r
+  by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateConCOMPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY       *NewMenuEntry;\r
+  UINT16              Index;\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\r
+  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+\r
+    HiiCreateGotoOpCode (\r
+      mStartOpCodeHandle,\r
+      FORM_CON_COM_SETUP_ID,\r
+      NewMenuEntry->DisplayStringToken,\r
+      STRING_TOKEN (STR_NULL_STRING),\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
+      );\r
+  }\r
+\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+\r
+/**\r
+  Create a list of boot option from global BootOptionMenu. It\r
+  allow user to delete the boot option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateBootDelPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT16          Index;\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\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
+    if (NewLoadContext->IsLegacy) {\r
+      continue;\r
+    }\r
+\r
+    NewLoadContext->Deleted = FALSE;\r
+\r
+    if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
+      //\r
+      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+      // through HiiSetBrowserData function.\r
+      //\r
+      CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+    }\r
+    \r
+    HiiCreateCheckBoxOpCode (\r
+      mStartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
+      VARSTORE_ID_BOOT_MAINT,\r
+      (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
+      NewMenuEntry->DisplayStringToken,\r
+      NewMenuEntry->HelpStringToken,\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      0,\r
+      NULL\r
+      );\r
+  }\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+  Create a lit of driver option from global DriverMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateDrvAddHandlePage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY *NewMenuEntry;\r
+  UINT16        Index;\r
+\r
+  CallbackData->BmmAskSaveOrNot = FALSE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\r
+  for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
+\r
+    HiiCreateGotoOpCode (\r
+      mStartOpCodeHandle,\r
+      FORM_DRV_ADD_HANDLE_DESC_ID,\r
+      NewMenuEntry->DisplayStringToken,\r
+      STRING_TOKEN (STR_NULL_STRING),\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
+      );\r
+  }\r
+\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+  Create a lit of driver option from global DriverOptionMenu. It\r
+  allow user to delete the driver option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateDrvDelPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT16          Index;\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\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
+\r
+    if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
+      //\r
+      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+      // through HiiSetBrowserData function.\r
+      //\r
+      CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+    }\r
+    HiiCreateCheckBoxOpCode (\r
+      mStartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
+      VARSTORE_ID_BOOT_MAINT,\r
+      (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
+      NewMenuEntry->DisplayStringToken,\r
+      NewMenuEntry->HelpStringToken,\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      0,\r
+      NULL\r
+      );\r
+  }\r
+\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+  Prepare the page to allow user to add description for \r
+  a Driver Option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateDriverAddHandleDescPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+  CallbackData->BmmFakeNvData.DriverAddActive          = 0x01;\r
+  CallbackData->BmmFakeNvData.DriverAddForceReconnect  = 0x00;\r
+  CallbackData->BmmAskSaveOrNot                        = TRUE;\r
+  NewMenuEntry = CallbackData->MenuEntry;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\r
+  HiiCreateSubTitleOpCode (\r
+    mStartOpCodeHandle,\r
+    NewMenuEntry->DisplayStringToken,\r
+    0,\r
+    0,\r
+    0\r
+    );\r
+\r
+  HiiCreateStringOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
+    STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
+    STRING_TOKEN (STR_NULL_STRING),\r
+    0,\r
+    0,\r
+    6,\r
+    75,\r
+    NULL\r
+    );\r
+\r
+  HiiCreateCheckBoxOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    DRV_ADD_RECON_VAR_OFFSET,\r
+    STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
+    STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
+    0,\r
+    0,\r
+    NULL\r
+    );\r
+\r
+  HiiCreateStringOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    DRIVER_ADD_OPTION_VAR_OFFSET,\r
+    STRING_TOKEN (STR_OPTIONAL_DATA),\r
+    STRING_TOKEN (STR_NULL_STRING),\r
+    0,\r
+    0,\r
+    6,\r
+    75,\r
+    NULL\r
+    );\r
+\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+  Update console page.\r
+\r
+  @param UpdatePageId    The form ID to be updated.\r
+  @param ConsoleMenu     The console menu list.\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateConsolePage (\r
+  IN UINT16                           UpdatePageId,\r
+  IN BM_MENU_OPTION                   *ConsoleMenu,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\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
+  UINT8               *ConsoleCheck;\r
+  UINT8               *OldConsoleCheck;\r
+  UINTN               ConsoleCheckSize;\r
+  EFI_QUESTION_ID     QuestionIdBase;\r
+  UINT16              VariableOffsetBase;\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\r
+  ConsoleCheck       = NULL;\r
+  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
+  }\r
+  ASSERT (ConsoleCheck != NULL);\r
+\r
+  for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+    CheckFlags = 0;\r
+    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+    if (NewConsoleContext->IsActive) {\r
+      CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
+      ConsoleCheck[Index] = TRUE;\r
+    } else {\r
+      ConsoleCheck[Index] = FALSE;\r
+    }\r
+    HiiCreateCheckBoxOpCode (\r
+      mStartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
+      VARSTORE_ID_BOOT_MAINT,\r
+      (UINT16) (VariableOffsetBase + Index),\r
+      NewMenuEntry->DisplayStringToken,\r
+      NewMenuEntry->HelpStringToken,\r
+      0,\r
+      CheckFlags,\r
+      NULL\r
+      );\r
+  }\r
+\r
+  for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
+       (Index2 < MAX_MENU_NUMBER)); 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
+      CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
+      ConsoleCheck[Index] = TRUE;\r
+    } else {\r
+      ConsoleCheck[Index] = FALSE;\r
+    }\r
+    HiiCreateCheckBoxOpCode (\r
+      mStartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
+      VARSTORE_ID_BOOT_MAINT,\r
+      (UINT16) (VariableOffsetBase + Index),\r
+      NewMenuEntry->DisplayStringToken,\r
+      NewMenuEntry->HelpStringToken,\r
+      0,\r
+      CheckFlags,\r
+      NULL\r
+      );\r
+\r
+    Index++;\r
+  }\r
+\r
+  CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
+\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+  Update the page's NV Map if user has changed the order\r
+  a list. This list can be Boot Order or Driver Order.\r
+\r
+  @param UpdatePageId    The form ID to be updated.\r
+  @param OptionMenu      The new list.\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateOrderPage (\r
+  IN UINT16                           UpdatePageId,\r
+  IN BM_MENU_OPTION                   *OptionMenu,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY     *NewMenuEntry;\r
+  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
+  UINT16            VarOffset;\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+  UpdatePageStart (CallbackData);\r
+\r
+  OptionOrder = NULL;\r
+  QuestionId = 0;\r
+  VarOffset = 0;\r
+  switch (UpdatePageId) { \r
+  \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
+  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
+      }\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
+    }\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
+      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
+      );\r
+  }\r
+\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+\r
+  UpdatePageEnd (CallbackData);\r
+\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
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateConModePage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  UINTN                         Mode;\r
+  UINTN                         Index;\r
+  UINTN                         Col;\r
+  UINTN                         Row;\r
+  CHAR16                        ModeString[50];\r
+  CHAR16                        *PStr;\r
+  UINTN                         MaxMode;\r
+  UINTN                         ValidMode;\r
+  EFI_STRING_ID                 *ModeToken;\r
+  EFI_STATUS                    Status;\r
+  VOID                          *OptionsOpCodeHandle;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;\r
+\r
+  ConOut    = gST->ConOut;\r
+  Index     = 0;\r
+  ValidMode = 0;\r
+  MaxMode   = (UINTN) (ConOut->Mode->MaxMode);\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\r
+  //\r
+  // Check valid mode\r
+  //\r
+  for (Mode = 0; Mode < MaxMode; Mode++) {\r
+    Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+    ValidMode++;\r
+  }\r
+\r
+  if (ValidMode == 0) {\r
+    return;\r
+  }\r
+\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  ModeToken           = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
+  ASSERT(ModeToken != NULL);\r
+\r
+  //\r
+  // Determin which mode should be the first entry in menu\r
+  //\r
+  GetConsoleOutMode (CallbackData);\r
+\r
+  //\r
+  // Build text mode options\r
+  //\r
+  for (Mode = 0; Mode < MaxMode; Mode++) {\r
+    Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+    \r
+    //\r
+    // Build mode string Column x Row\r
+    //\r
+    UnicodeValueToString (ModeString, 0, Col, 0);\r
+    PStr = &ModeString[0];\r
+    StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
+    PStr = PStr + StrLen (PStr);\r
+    UnicodeValueToString (PStr , 0, Row, 0);\r
+\r
+    ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
+\r
+    if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
+      HiiCreateOneOfOptionOpCode (\r
+        OptionsOpCodeHandle,\r
+        ModeToken[Index],\r
+        EFI_IFR_OPTION_DEFAULT,\r
+        EFI_IFR_TYPE_NUM_SIZE_16,\r
+        (UINT16) Mode\r
+        );\r
+    } else {\r
+      HiiCreateOneOfOptionOpCode (\r
+        OptionsOpCodeHandle,\r
+        ModeToken[Index],\r
+        0,\r
+        EFI_IFR_TYPE_NUM_SIZE_16,\r
+        (UINT16) Mode\r
+        );\r
+    }\r
+    Index++;\r
+  }\r
+\r
+  HiiCreateOneOfOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    CON_MODE_VAR_OFFSET,\r
+    STRING_TOKEN (STR_CON_MODE_SETUP),\r
+    STRING_TOKEN (STR_CON_MODE_SETUP),\r
+    EFI_IFR_FLAG_RESET_REQUIRED,\r
+    EFI_IFR_NUMERIC_SIZE_2,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  FreePool (ModeToken);\r
+\r
+  UpdatePageEnd (CallbackData);\r
+}\r
+\r
+ /**\r
+  Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
+  Parity, Stop Bits, Terminal Type.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateTerminalPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  UINT8               Index;\r
+  UINT8               CheckFlags;\r
+  BM_MENU_ENTRY       *NewMenuEntry;\r
+  VOID                *OptionsOpCodeHandle;\r
+  UINTN               CurrentTerminal;\r
+\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+  UpdatePageStart (CallbackData);\r
+\r
+  CurrentTerminal = CallbackData->CurrentTerminal;\r
+  NewMenuEntry = BOpt_GetMenuEntry (\r
+                  &TerminalMenu,\r
+                  CurrentTerminal\r
+                  );\r
+\r
+  if (NewMenuEntry == NULL) {\r
+    return ;\r
+  }\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 (BaudRateList[Index].Value == 115200) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      BaudRateList[Index].StringToken,\r
+      CheckFlags,\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 + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\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
+    EFI_IFR_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    NULL\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
+    CheckFlags = 0;\r
+\r
+    if (DataBitsList[Index].Value == 8) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      DataBitsList[Index].StringToken,\r
+      CheckFlags,\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 + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\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
+    EFI_IFR_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
+    CheckFlags = 0;\r
+    if (ParityList[Index].Value ==  NoParity) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      ParityList[Index].StringToken,\r
+      CheckFlags,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
+      Index\r
+      );\r
+  }\r
+\r
+  HiiCreateOneOfOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
+    STRING_TOKEN (STR_COM_PARITY),\r
+    STRING_TOKEN (STR_COM_PARITY),\r
+    0,\r
+    EFI_IFR_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
+    CheckFlags = 0;\r
+    if (StopBitsList[Index].Value == OneStopBit) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      StopBitsList[Index].StringToken,\r
+      CheckFlags,\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 + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\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
+    EFI_IFR_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
+    CheckFlags = 0;\r
+    if (Index == 0) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      (EFI_STRING_ID) TerminalType[Index],\r
+      CheckFlags,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
+      Index\r
+      );\r
+  }\r
+\r
+  HiiCreateOneOfOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    (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_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    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
+}\r
\r
+/**\r
+Update add boot/driver option page.\r
+\r
+@param CallbackData    The BMM context data.\r
+@param FormId             The form ID to be updated.\r
+@param DevicePath       Device path.\r
+\r
+**/\r
+VOID\r
+UpdateOptionPage(\r
+  IN   BMM_CALLBACK_DATA        *CallbackData,\r
+  IN   EFI_FORM_ID              FormId,\r
+  IN   EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+  )\r
+{\r
+  CHAR16                *String;\r
+  EFI_STRING_ID         StringToken;\r
+\r
+  if (DevicePath != NULL){\r
+    String = ExtractFileNameFromDevicePath(DevicePath);\r
+    StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
+    FreePool(String);\r
+  } else {\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
+  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
+    }\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
+    }\r
+  }\r
+\r
+  RefreshUpdateData();\r
+  mStartLabel->Number = FormId;\r
+\r
+  HiiCreateSubTitleOpCode (\r
+    mStartOpCodeHandle,\r
+    StringToken,\r
+    0,\r
+    0,\r
+    0\r
+    );\r
+\r
+  HiiUpdateForm (\r
+    CallbackData->BmmHiiHandle,\r
+    &mBootMaintGuid,\r
+    FormId,\r
+    mStartOpCodeHandle,// Label FormId\r
+    mEndOpCodeHandle   // LABEL_END\r
+    );\r
+}\r
+\r
+/**\r
+  Dispatch the correct update page function to call based on\r
+  the UpdatePageId.\r
+\r
+  @param UpdatePageId    The form ID.\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdatePageBody (\r
+  IN UINT16                           UpdatePageId,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  )\r
+{\r
+  CleanUpPage (UpdatePageId, CallbackData);\r
+  switch (UpdatePageId) {\r
+  case FORM_CON_IN_ID:\r
+    UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
+    break;\r
+\r
+  case FORM_CON_OUT_ID:\r
+    UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
+    break;\r
+\r
+  case FORM_CON_ERR_ID:\r
+    UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
+    break;\r
+\r
+  case FORM_BOOT_CHG_ID:\r
+    UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
+    break;\r
+\r
+  case FORM_DRV_CHG_ID:\r
+    UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+}\r
+\r
+/**\r
+  Dispatch the display to the next page based on NewPageId.\r
+\r
+  @param Private         The BMM context data.\r
+  @param NewPageId       The original page ID.\r
+\r
+**/\r
+VOID\r
+UpdatePageId (\r
+  BMM_CALLBACK_DATA              *Private,\r
+  UINT16                         NewPageId\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
+    //\r
+    NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
+  } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
+    //\r
+    // Return to main page after "Save Changes" or "Discard Changes".\r
+    //\r
+    NewPageId = FORM_MAIN_ID;\r
+  } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
+    NewPageId = FORM_CON_COM_SETUP_ID;\r
+  }\r
+\r
+  if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
+    Private->BmmPreviousPageId  = Private->BmmCurrentPageId;\r
+    Private->BmmCurrentPageId   = NewPageId;\r
+  }\r
+}\r
diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c
new file mode 100644 (file)
index 0000000..a276cae
--- /dev/null
@@ -0,0 +1,1051 @@
+/** @file\r
+Variable operation that will be used by bootmaint\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
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+  Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
+  After deleting this boot option, call Var_ChangeBootOrder to\r
+  make sure BootOrder is in valid state.\r
+\r
+  @retval EFI_SUCCESS   If all boot load option EFI Variables corresponding to  \r
+                        BM_LOAD_CONTEXT marked for deletion is deleted.\r
+  @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.\r
+  @return Others        If failed to update the "BootOrder" variable after deletion. \r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelBootOption (\r
+  VOID\r
+  )\r
+{\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT16          BootString[10];\r
+  EFI_STATUS      Status;\r
+  UINTN           Index;\r
+  UINTN           Index2;\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Index2  = 0;\r
+  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
+    if (NULL == NewMenuEntry) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
+    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+    if (!NewLoadContext->Deleted) {\r
+      continue;\r
+    }\r
+\r
+    UnicodeSPrint (\r
+      BootString,\r
+      sizeof (BootString),\r
+      L"Boot%04x",\r
+      NewMenuEntry->OptionNumber\r
+      );\r
+\r
+    EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
+    Index2++;\r
+    //\r
+    // If current Load Option is the same as BootNext,\r
+    // must delete BootNext in order to make sure\r
+    // there will be no panic on next boot\r
+    //\r
+    if (NewLoadContext->IsBootNext) {\r
+      EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
+    }\r
+\r
+    RemoveEntryList (&NewMenuEntry->Link);\r
+    BOpt_DestroyMenuEntry (NewMenuEntry);\r
+    NewMenuEntry = NULL;\r
+  }\r
+\r
+  BootOptionMenu.MenuNumber -= Index2;\r
+\r
+  Status = Var_ChangeBootOrder ();\r
+  return Status;\r
+}\r
+\r
+/**\r
+  After any operation on Boot####, there will be a discrepancy in BootOrder.\r
+  Since some are missing but in BootOrder, while some are present but are\r
+  not reflected by BootOrder. Then a function rebuild BootOrder from\r
+  scratch by content from BootOptionMenu is needed.\r
+\r
+\r
+  \r
+\r
+  @retval  EFI_SUCCESS  The boot order is updated successfully.\r
+  @return               EFI_STATUS other than EFI_SUCCESS if failed to\r
+                        Set the "BootOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeBootOrder (\r
+  VOID\r
+  )\r
+{\r
+\r
+  EFI_STATUS    Status;\r
+  BM_MENU_ENTRY *NewMenuEntry;\r
+  UINT16        *BootOrderList;\r
+  UINT16        *BootOrderListPtr;\r
+  UINTN         BootOrderListSize;\r
+  UINTN         Index;\r
+\r
+  BootOrderList     = NULL;\r
+  BootOrderListSize = 0;\r
+  //\r
+  // First check whether BootOrder is present in current configuration\r
+  //\r
+  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
+\r
+  //\r
+  // If exists, delete it to hold new BootOrder\r
+  //\r
+  if (BootOrderList != NULL) {\r
+    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
+    FreePool (BootOrderList);\r
+    BootOrderList = NULL;\r
+  }\r
+  //\r
+  // Maybe here should be some check method to ensure that\r
+  // no new added boot options will be added\r
+  // but the setup engine now will give only one callback\r
+  // that is to say, user are granted only one chance to\r
+  // decide whether the boot option will be added or not\r
+  // there should be no indictor to show whether this\r
+  // is a "new" boot option\r
+  //\r
+  BootOrderListSize = BootOptionMenu.MenuNumber;\r
+\r
+  if (BootOrderListSize > 0) {\r
+    BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
+    ASSERT (BootOrderList != NULL);\r
+    BootOrderListPtr = BootOrderList;\r
+\r
+    //\r
+    // Get all current used Boot#### from BootOptionMenu.\r
+    // OptionNumber in each BM_LOAD_OPTION is really its\r
+    // #### value.\r
+    //\r
+    for (Index = 0; Index < BootOrderListSize; Index++) {\r
+      NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+      *BootOrderList  = (UINT16) NewMenuEntry->OptionNumber;\r
+      BootOrderList++;\r
+    }\r
+\r
+    BootOrderList = BootOrderListPtr;\r
+\r
+    //\r
+    // After building the BootOrderList, write it back\r
+    //\r
+    Status = gRT->SetVariable (\r
+                    L"BootOrder",\r
+                    &gEfiGlobalVariableGuid,\r
+                    VAR_FLAG,\r
+                    BootOrderListSize * sizeof (UINT16),\r
+                    BootOrderList\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Delete Load Option that represent a Deleted state in BootOptionMenu.\r
+  After deleting this Driver option, call Var_ChangeDriverOrder to\r
+  make sure DriverOrder is in valid state.\r
+\r
+  @retval EFI_SUCCESS       Load Option is successfully updated.\r
+  @retval EFI_NOT_FOUND     Fail to find the driver option want to be deleted.\r
+  @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
+          Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelDriverOption (\r
+  VOID\r
+  )\r
+{\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  UINT16          DriverString[12];\r
+  EFI_STATUS      Status;\r
+  UINTN           Index;\r
+  UINTN           Index2;\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Index2  = 0;\r
+  for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
+    if (NULL == NewMenuEntry) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
+    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+    if (!NewLoadContext->Deleted) {\r
+      continue;\r
+    }\r
+\r
+    UnicodeSPrint (\r
+      DriverString,\r
+      sizeof (DriverString),\r
+      L"Driver%04x",\r
+      NewMenuEntry->OptionNumber\r
+      );\r
+\r
+    EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
+    Index2++;\r
+\r
+    RemoveEntryList (&NewMenuEntry->Link);\r
+    BOpt_DestroyMenuEntry (NewMenuEntry);\r
+    NewMenuEntry = NULL;\r
+  }\r
+\r
+  DriverOptionMenu.MenuNumber -= Index2;\r
+\r
+  Status = Var_ChangeDriverOrder ();\r
+  return Status;\r
+}\r
+\r
+/**\r
+  After any operation on Driver####, there will be a discrepancy in\r
+  DriverOrder. Since some are missing but in DriverOrder, while some\r
+  are present but are not reflected by DriverOrder. Then a function\r
+  rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
+  needed.\r
+\r
+  @retval  EFI_SUCCESS  The driver order is updated successfully.\r
+  @return  Other status than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeDriverOrder (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS    Status;\r
+  BM_MENU_ENTRY *NewMenuEntry;\r
+  UINT16        *DriverOrderList;\r
+  UINT16        *DriverOrderListPtr;\r
+  UINTN         DriverOrderListSize;\r
+  UINTN         Index;\r
+\r
+  DriverOrderList     = NULL;\r
+  DriverOrderListSize = 0;\r
+\r
+  //\r
+  // First check whether DriverOrder is present in current configuration\r
+  //\r
+  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+  //\r
+  // If exists, delete it to hold new DriverOrder\r
+  //\r
+  if (DriverOrderList != NULL) {\r
+    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
+    FreePool (DriverOrderList);\r
+    DriverOrderList = NULL;\r
+  }\r
+\r
+  DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
+\r
+  if (DriverOrderListSize > 0) {\r
+    DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
+    ASSERT (DriverOrderList != NULL);\r
+    DriverOrderListPtr = DriverOrderList;\r
+\r
+    //\r
+    // Get all current used Driver#### from DriverOptionMenu.\r
+    // OptionNumber in each BM_LOAD_OPTION is really its\r
+    // #### value.\r
+    //\r
+    for (Index = 0; Index < DriverOrderListSize; Index++) {\r
+      NewMenuEntry      = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
+      *DriverOrderList  = (UINT16) NewMenuEntry->OptionNumber;\r
+      DriverOrderList++;\r
+    }\r
+\r
+    DriverOrderList = DriverOrderListPtr;\r
+\r
+    //\r
+    // After building the DriverOrderList, write it back\r
+    //\r
+    Status = gRT->SetVariable (\r
+                    L"DriverOrder",\r
+                    &gEfiGlobalVariableGuid,\r
+                    VAR_FLAG,\r
+                    DriverOrderListSize * sizeof (UINT16),\r
+                    DriverOrderList\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Update the device path of "ConOut", "ConIn" and "ErrOut" \r
+  based on the new BaudRate, Data Bits, parity and Stop Bits\r
+  set.\r
+\r
+**/\r
+VOID\r
+Var_UpdateAllConsoleOption (\r
+  VOID\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *OutDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *InpDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *ErrDevicePath;\r
+  EFI_STATUS                Status;\r
+\r
+  GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
+  GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
+  GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
+  if (OutDevicePath != NULL) {\r
+    ChangeVariableDevicePath (OutDevicePath);\r
+    Status = gRT->SetVariable (\r
+                    L"ConOut",\r
+                    &gEfiGlobalVariableGuid,\r
+                    VAR_FLAG,\r
+                    GetDevicePathSize (OutDevicePath),\r
+                    OutDevicePath\r
+                    );\r
+    ASSERT (!EFI_ERROR (Status));\r
+  }\r
+\r
+  if (InpDevicePath != NULL) {\r
+    ChangeVariableDevicePath (InpDevicePath);\r
+    Status = gRT->SetVariable (\r
+                    L"ConIn",\r
+                    &gEfiGlobalVariableGuid,\r
+                    VAR_FLAG,\r
+                    GetDevicePathSize (InpDevicePath),\r
+                    InpDevicePath\r
+                    );\r
+    ASSERT (!EFI_ERROR (Status));\r
+  }\r
+\r
+  if (ErrDevicePath != NULL) {\r
+    ChangeVariableDevicePath (ErrDevicePath);\r
+    Status = gRT->SetVariable (\r
+                    L"ErrOut",\r
+                    &gEfiGlobalVariableGuid,\r
+                    VAR_FLAG,\r
+                    GetDevicePathSize (ErrDevicePath),\r
+                    ErrDevicePath\r
+                    );\r
+    ASSERT (!EFI_ERROR (Status));\r
+  }\r
+}\r
+\r
+/**\r
+  This function delete and build multi-instance device path for\r
+  specified type of console device.\r
+\r
+  This function clear the EFI variable defined by ConsoleName and\r
+  gEfiGlobalVariableGuid. It then build the multi-instance device\r
+  path by appending the device path of the Console (In/Out/Err) instance \r
+  in ConsoleMenu. Then it scan all corresponding console device by\r
+  scanning Terminal (built from device supporting Serial I/O instances)\r
+  devices in TerminalMenu. At last, it save a EFI variable specifed\r
+  by ConsoleName and gEfiGlobalVariableGuid.\r
+\r
+  @param ConsoleName     The name for the console device type. They are\r
+                         usually "ConIn", "ConOut" and "ErrOut".\r
+  @param ConsoleMenu     The console memu which is a list of console devices.\r
+  @param UpdatePageId    The flag specifying which type of console device\r
+                         to be processed.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOption (\r
+  IN UINT16                     *ConsoleName,\r
+  IN BM_MENU_OPTION             *ConsoleMenu,\r
+  IN UINT16                     UpdatePageId\r
+  )\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL  *ConDevicePath;\r
+  BM_MENU_ENTRY             *NewMenuEntry;\r
+  BM_CONSOLE_CONTEXT        *NewConsoleContext;\r
+  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
+  EFI_STATUS                Status;\r
+  VENDOR_DEVICE_PATH        Vendor;\r
+  EFI_DEVICE_PATH_PROTOCOL  *TerminalDevicePath;\r
+  UINTN                     Index;\r
+\r
+  GetEfiGlobalVariable2 (ConsoleName, (VOID**)&ConDevicePath, NULL);\r
+  if (ConDevicePath != NULL) {\r
+    EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
+    FreePool (ConDevicePath);\r
+    ConDevicePath = NULL;\r
+  };\r
+\r
+  //\r
+  // First add all console input device from console input menu\r
+  //\r
+  for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+\r
+    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+    if (NewConsoleContext->IsActive) {\r
+      ConDevicePath = AppendDevicePathInstance (\r
+                        ConDevicePath,\r
+                        NewConsoleContext->DevicePath\r
+                        );\r
+    }\r
+  }\r
+\r
+  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+\r
+    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\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
+      Vendor.Header.Type    = MESSAGING_DEVICE_PATH;\r
+      Vendor.Header.SubType = MSG_VENDOR_DP;\r
+      \r
+      ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
+      CopyMem (\r
+        &Vendor.Guid,\r
+        &TerminalTypeGuid[NewTerminalContext->TerminalType],\r
+        sizeof (EFI_GUID)\r
+        );\r
+      SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
+      TerminalDevicePath = AppendDevicePathNode (\r
+                            NewTerminalContext->DevicePath,\r
+                            (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
+                            );\r
+      ASSERT (TerminalDevicePath != NULL);\r
+      ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
+      ConDevicePath = AppendDevicePathInstance (\r
+                        ConDevicePath,\r
+                        TerminalDevicePath\r
+                        );\r
+    }\r
+  }\r
+\r
+  if (ConDevicePath != NULL) {\r
+    Status = gRT->SetVariable (\r
+                    ConsoleName,\r
+                    &gEfiGlobalVariableGuid,\r
+                    VAR_FLAG,\r
+                    GetDevicePathSize (ConDevicePath),\r
+                    ConDevicePath\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+  This function delete and build multi-instance device path ConIn\r
+  console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleInpOption (\r
+  VOID\r
+  )\r
+{\r
+  return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
+}\r
+\r
+/**\r
+  This function delete and build multi-instance device path ConOut\r
+  console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOutOption (\r
+  VOID\r
+  )\r
+{\r
+  return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
+}\r
+\r
+/**\r
+  This function delete and build multi-instance device path ErrOut\r
+  console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.  \r
+**/\r
+EFI_STATUS\r
+Var_UpdateErrorOutOption (\r
+  VOID\r
+  )\r
+{\r
+  return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
+}\r
+\r
+/**\r
+  This function create a currently loaded Drive Option from \r
+  the BMM. It then appends this Driver Option to the end of \r
+  the "DriverOrder" list. It append this Driver Opotion to the end\r
+  of DriverOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  @param HiiHandle       The HII handle associated with the BMM formset.\r
+  @param DescriptionData The description of this driver option.\r
+  @param OptionalData    The optional load option.\r
+  @param ForceReconnect  If to force reconnect.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+  @retval EFI_SUCCESS          If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOption (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData,\r
+  IN  EFI_HII_HANDLE            HiiHandle,\r
+  IN  UINT16                    *DescriptionData,\r
+  IN  UINT16                    *OptionalData,\r
+  IN  UINT8                     ForceReconnect\r
+  )\r
+{\r
+  UINT16          Index;\r
+  UINT16          *DriverOrderList;\r
+  UINT16          *NewDriverOrderList;\r
+  UINT16          DriverString[12];\r
+  UINTN           DriverOrderListSize;\r
+  VOID            *Buffer;\r
+  UINTN           BufferSize;\r
+  UINT8           *Ptr;\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  BOOLEAN         OptionalDataExist;\r
+  EFI_STATUS      Status;\r
+\r
+  OptionalDataExist = FALSE;\r
+\r
+  Index             = BOpt_GetDriverOptionNumber ();\r
+  UnicodeSPrint (\r
+    DriverString,\r
+    sizeof (DriverString),\r
+    L"Driver%04x",\r
+    Index\r
+    );\r
+\r
+  if (*DescriptionData == 0x0000) {\r
+    StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
+  }\r
+\r
+  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
+  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+  if (*OptionalData != 0x0000) {\r
+    OptionalDataExist = TRUE;\r
+    BufferSize += StrSize (OptionalData);\r
+  }\r
+\r
+  Buffer = AllocateZeroPool (BufferSize);\r
+  if (NULL == Buffer) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+  if (NULL == NewMenuEntry) {\r
+    FreePool (Buffer);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+  NewLoadContext->Deleted         = FALSE;\r
+  NewLoadContext->LoadOptionSize  = BufferSize;\r
+  Ptr = (UINT8 *) Buffer;\r
+  NewLoadContext->LoadOption = Ptr;\r
+  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
+  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
+  NewLoadContext->IsActive = TRUE;\r
+  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+  Ptr += sizeof (UINT32);\r
+  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
+\r
+  Ptr += sizeof (UINT16);\r
+  CopyMem (\r
+    Ptr,\r
+    DescriptionData,\r
+    StrSize (DescriptionData)\r
+    );\r
+\r
+  NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
+  ASSERT (NewLoadContext->Description != NULL);\r
+  NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+  CopyMem (\r
+    NewLoadContext->Description,\r
+    (VOID *) Ptr,\r
+    StrSize (DescriptionData)\r
+    );\r
+\r
+  Ptr += StrSize (DescriptionData);\r
+  CopyMem (\r
+    Ptr,\r
+    CallbackData->LoadContext->FilePathList,\r
+    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+    );\r
+\r
+  NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
+  ASSERT (NewLoadContext->FilePathList != NULL);\r
+\r
+  CopyMem (\r
+    NewLoadContext->FilePathList,\r
+    (VOID *) Ptr,\r
+    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+    );\r
+\r
+  NewMenuEntry->HelpString    = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+  NewMenuEntry->OptionNumber  = Index;\r
+  NewMenuEntry->DisplayStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+  NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
+\r
+  if (OptionalDataExist) {\r
+    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+    CopyMem (\r
+      Ptr,\r
+      OptionalData,\r
+      StrSize (OptionalData)\r
+      );\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  DriverString,\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  BufferSize,\r
+                  Buffer\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
+  ASSERT (NewDriverOrderList != NULL);\r
+  if (DriverOrderList != NULL){\r
+    CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
+  }\r
+  NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
+  if (DriverOrderList != NULL) {\r
+    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  L"DriverOrder",\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  DriverOrderListSize + sizeof (UINT16),\r
+                  NewDriverOrderList\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+  if (DriverOrderList != NULL) {\r
+    FreePool (DriverOrderList);\r
+  }\r
+  DriverOrderList = NULL;\r
+  FreePool (NewDriverOrderList);\r
+  InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
+  DriverOptionMenu.MenuNumber++;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  This function create a currently loaded Boot Option from \r
+  the BMM. It then appends this Boot Option to the end of \r
+  the "BootOrder" list. It also append this Boot Opotion to the end\r
+  of BootOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+  @retval EFI_SUCCESS          If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOption (\r
+  IN  BMM_CALLBACK_DATA              *CallbackData\r
+  )\r
+{\r
+  UINT16          *BootOrderList;\r
+  UINT16          *NewBootOrderList;\r
+  UINTN           BootOrderListSize;\r
+  UINT16          BootString[10];\r
+  VOID            *Buffer;\r
+  UINTN           BufferSize;\r
+  UINT8           *Ptr;\r
+  UINT16          Index;\r
+  BM_MENU_ENTRY   *NewMenuEntry;\r
+  BM_LOAD_CONTEXT *NewLoadContext;\r
+  BOOLEAN         OptionalDataExist;\r
+  EFI_STATUS      Status;\r
+  BMM_FAKE_NV_DATA  *NvRamMap;\r
+\r
+  OptionalDataExist = FALSE;\r
+  NvRamMap = &CallbackData->BmmFakeNvData;\r
+\r
+  Index = BOpt_GetBootOptionNumber () ;\r
+  UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
+\r
+  if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
+    StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
+  }\r
+\r
+  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
+  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+  if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
+    OptionalDataExist = TRUE;\r
+    BufferSize += StrSize (NvRamMap->BootOptionalData);\r
+  }\r
+\r
+  Buffer = AllocateZeroPool (BufferSize);\r
+  if (NULL == Buffer) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+  if (NULL == NewMenuEntry) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+  NewLoadContext->Deleted         = FALSE;\r
+  NewLoadContext->LoadOptionSize  = BufferSize;\r
+  Ptr = (UINT8 *) Buffer;\r
+  NewLoadContext->LoadOption = Ptr;\r
+  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
+  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
+  NewLoadContext->IsActive = TRUE;\r
+  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+  Ptr += sizeof (UINT32);\r
+  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
+  Ptr += sizeof (UINT16);\r
+\r
+  CopyMem (\r
+    Ptr,\r
+    NvRamMap->BootDescriptionData,\r
+    StrSize (NvRamMap->BootDescriptionData)\r
+    );\r
+\r
+  NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
+  ASSERT (NewLoadContext->Description != NULL);\r
+\r
+  NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+  CopyMem (\r
+    NewLoadContext->Description,\r
+    (VOID *) Ptr,\r
+    StrSize (NvRamMap->BootDescriptionData)\r
+    );\r
+\r
+  Ptr += StrSize (NvRamMap->BootDescriptionData);\r
+  CopyMem (\r
+    Ptr,\r
+    CallbackData->LoadContext->FilePathList,\r
+    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+    );\r
+\r
+  NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
+  ASSERT (NewLoadContext->FilePathList != NULL);\r
+\r
+  CopyMem (\r
+    NewLoadContext->FilePathList,\r
+    (VOID *) Ptr,\r
+    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+    );\r
+\r
+  NewMenuEntry->HelpString    = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+  NewMenuEntry->OptionNumber  = Index;\r
+  NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+  NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
+\r
+  if (OptionalDataExist) {\r
+    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+    CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  BootString,\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  BufferSize,\r
+                  Buffer\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
+  NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
+  ASSERT (NewBootOrderList != NULL);\r
+  if (BootOrderList != NULL){\r
+    CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
+  }\r
+  NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
+\r
+  if (BootOrderList != NULL) {\r
+    FreePool (BootOrderList);\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  L"BootOrder",\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  BootOrderListSize + sizeof (UINT16),\r
+                  NewBootOrderList\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  FreePool (NewBootOrderList);\r
+  NewBootOrderList = NULL;\r
+  InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
+  BootOptionMenu.MenuNumber++;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  This function update the "BootNext" EFI Variable. If there is \r
+  no "BootNext" specified in BMM, this EFI Variable is deleted.\r
+  It also update the BMM context data specified the "BootNext"\r
+  vaule.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return                The EFI variable can be saved. See gRT->SetVariable \r
+                         for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootNext (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  )\r
+{\r
+  BM_MENU_ENTRY     *NewMenuEntry;\r
+  BM_LOAD_CONTEXT   *NewLoadContext;\r
+  BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
+  UINT16            Index;\r
+  EFI_STATUS        Status;\r
+\r
+  Status            = EFI_SUCCESS;\r
+  CurrentFakeNVMap  = &CallbackData->BmmFakeNvData;\r
+  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+    NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+    ASSERT (NULL != NewMenuEntry);\r
+\r
+    NewLoadContext              = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+    NewLoadContext->IsBootNext  = FALSE;\r
+  }\r
+\r
+  if (CurrentFakeNVMap->BootNext == NONE_BOOTNEXT_VALUE) {\r
+    EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  NewMenuEntry = BOpt_GetMenuEntry (\r
+                  &BootOptionMenu,\r
+                  CurrentFakeNVMap->BootNext\r
+                  );\r
+  ASSERT (NewMenuEntry != NULL);\r
+\r
+  NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+  Status = gRT->SetVariable (\r
+                  L"BootNext",\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  sizeof (UINT16),\r
+                  &NewMenuEntry->OptionNumber\r
+                  );\r
+  NewLoadContext->IsBootNext              = TRUE;\r
+  CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
+  return Status;\r
+}\r
+\r
+/**\r
+  This function update the "BootOrder" EFI Variable based on\r
+  BMM Formset's NV map. It then refresh BootOptionMenu\r
+  with the new "BootOrder" list.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS             The function complete successfully.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to complete the function.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOrder (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT16      Index;\r
+  UINT16      OrderIndex;\r
+  UINT16      *BootOrder;\r
+  UINTN       BootOrderSize;\r
+  UINT16      OptionNumber;\r
+\r
+  //\r
+  // First check whether BootOrder is present in current configuration\r
+  //\r
+  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &BootOrderSize);\r
+  if (BootOrder == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionOrder) / sizeof (CallbackData->BmmFakeNvData.BootOptionOrder[0])));\r
+\r
+  //\r
+  // OptionOrder is subset of BootOrder\r
+  //\r
+  for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] != 0); OrderIndex++) {\r
+    for (Index = OrderIndex; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
+      if ((BootOrder[Index] == (UINT16) (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
+        OptionNumber = BootOrder[Index];\r
+        CopyMem (&BootOrder[OrderIndex + 1], &BootOrder[OrderIndex], (Index - OrderIndex) * sizeof (UINT16));\r
+        BootOrder[OrderIndex] = OptionNumber;\r
+      }\r
+    }\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  L"BootOrder",\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  BootOrderSize,\r
+                  BootOrder\r
+                  );\r
+  FreePool (BootOrder);\r
+  \r
+  BOpt_FreeMenu (&BootOptionMenu);\r
+  BOpt_GetBootOptions (CallbackData);\r
+\r
+  return Status;\r
+\r
+}\r
+\r
+/**\r
+  This function update the "DriverOrder" EFI Variable based on\r
+  BMM Formset's NV map. It then refresh DriverOptionMenu\r
+  with the new "DriverOrder" list.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS           The function complete successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOrder (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT16      Index;\r
+  UINT16      *DriverOrderList;\r
+  UINT16      *NewDriverOrderList;\r
+  UINTN       DriverOrderListSize;\r
+\r
+  DriverOrderList     = NULL;\r
+  DriverOrderListSize = 0;\r
+\r
+  //\r
+  // First check whether DriverOrder is present in current configuration\r
+  //\r
+  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
+\r
+  if (NewDriverOrderList == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  //\r
+  // If exists, delete it to hold new DriverOrder\r
+  //\r
+  if (DriverOrderList != NULL) {\r
+    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
+    FreePool (DriverOrderList);\r
+  }\r
+\r
+  ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder) / sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder[0])));\r
+  for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+    NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] - 1);\r
+  }\r
+\r
+  Status = gRT->SetVariable (\r
+                  L"DriverOrder",\r
+                  &gEfiGlobalVariableGuid,\r
+                  VAR_FLAG,\r
+                  DriverOrderListSize,\r
+                  NewDriverOrderList\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  BOpt_FreeMenu (&DriverOptionMenu);\r
+  BOpt_GetDriverOptions (CallbackData);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Update the Text Mode of Console.\r
+\r
+  @param CallbackData  The context data for BMM.\r
+\r
+  @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
+  @return Other value if the Text Mode of Console is not updated.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConMode (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  )\r
+{\r
+  EFI_STATUS        Status;\r
+  UINTN             Mode;\r
+  CONSOLE_OUT_MODE  ModeInfo;\r
+\r
+  Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
+\r
+  Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
+  if (!EFI_ERROR(Status)) {\r
+    Status = PcdSet32S (PcdSetupConOutColumn, (UINT32) ModeInfo.Column);\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = PcdSet32S (PcdSetupConOutRow, (UINT32) ModeInfo.Row);\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r