This is the legacy part of the old BdsDxe driver.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.d...@intel.com>
---
 .../IntelFrameworkModulePkg.dsc                    |    1 +
 .../LegacyBootMaintUiLib/LegacyBootMaintUi.c       | 1464 ++++++++++++++++++++
 .../LegacyBootMaintUiLib/LegacyBootMaintUi.h       |  254 ++++
 .../LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf  |   68 +
 .../LegacyBootMaintUiStrings.uni                   |  Bin 0 -> 6318 bytes
 .../LegacyBootMaintUiLib/LegacyBootMaintUiVfr.Vfr  |   74 +
 .../LegacyBootMaintUiLib/LegacyBootMaintUiVfr.h    |   84 ++
 7 files changed, 1945 insertions(+)
 create mode 100644 
IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.c
 create mode 100644 
IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.h
 create mode 100644 
IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf
 create mode 100644 
IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiStrings.uni
 create mode 100644 
IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.Vfr
 create mode 100644 
IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.h

diff --git a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc 
b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
index 20e016d..3e1297c 100644
--- a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
+++ b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
@@ -138,10 +138,11 @@
   
IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
   IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
   IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   IntelFrameworkModulePkg/Library/DxeCapsuleLib/DxeCapsuleLib.inf
   IntelFrameworkModulePkg/Library/LegacyBootManagerLib/LegacyBootManagerLib.inf
+  IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf
 
   IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
   IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
   IntelFrameworkModulePkg/Bus/Isa/IsaIoDxe/IsaIoDxe.inf
   IntelFrameworkModulePkg/Bus/Isa/IsaFloppyPei/IsaFloppyPei.inf
diff --git 
a/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.c 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.c
new file mode 100644
index 0000000..26d6586
--- /dev/null
+++ b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.c
@@ -0,0 +1,1464 @@
+/** @file
+  The platform boot manager reference implementation
+
+  Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
+  This software and associated documentation (if any) is furnished
+  under a license and may only be used or copied in accordance
+  with the terms of the license. Except as permitted by such
+  license, no part of this software or documentation may be
+  reproduced, stored in a retrieval system, or transmitted in any
+  form or by any means without the express written consent of
+  Intel Corporation.
+
+**/
+
+#include "LegacyBootMaintUi.h"
+
+LEGACY_BOOT_OPTION_CALLBACK_DATA  *mLegacyBootOptionPrivate;
+EFI_GUID  mLegacyBootOptionGuid     = LEGACY_BOOT_OPTION_FORMSET_GUID;
+CHAR16    mLegacyBootStorageName[]  = L"LegacyBootData";
+BBS_TYPE  mBbsType[] = {BBS_FLOPPY, BBS_HARDDISK, BBS_CDROM, 
BBS_EMBED_NETWORK, BBS_BEV_DEVICE, BBS_UNKNOWN};
+
+
+///
+/// Legacy FD Info from LegacyBios.GetBbsInfo()
+///
+LEGACY_MENU_OPTION      LegacyFDMenu = {
+  LEGACY_MENU_OPTION_SIGNATURE,
+  {NULL},
+  0
+};
+
+///
+/// Legacy HD Info from LegacyBios.GetBbsInfo()
+///
+LEGACY_MENU_OPTION      LegacyHDMenu = {
+  LEGACY_MENU_OPTION_SIGNATURE,
+  {NULL},
+  0
+};
+
+///
+/// Legacy CD Info from LegacyBios.GetBbsInfo()
+///
+LEGACY_MENU_OPTION      LegacyCDMenu = {
+  LEGACY_MENU_OPTION_SIGNATURE,
+  {NULL},
+  0
+};
+
+///
+/// Legacy NET Info from LegacyBios.GetBbsInfo()
+///
+LEGACY_MENU_OPTION      LegacyNETMenu = {
+  LEGACY_MENU_OPTION_SIGNATURE,
+  {NULL},
+  0
+};
+
+///
+/// Legacy NET Info from LegacyBios.GetBbsInfo()
+///
+LEGACY_MENU_OPTION      LegacyBEVMenu = {
+  LEGACY_MENU_OPTION_SIGNATURE,
+  {NULL},
+  0
+};
+
+
+VOID                *mLegacyStartOpCodeHandle = NULL;
+VOID                *mLegacyEndOpCodeHandle = NULL;
+EFI_IFR_GUID_LABEL  *mLegacyStartLabel = NULL;
+EFI_IFR_GUID_LABEL  *mLegacyEndLabel = NULL;
+
+
+HII_VENDOR_DEVICE_PATH  mLegacyBootOptionHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    }, 
+    { 0x6bc75598, 0x89b4, 0x483d, { 0x91, 0x60, 0x7f, 0x46, 0x9a, 0x96, 0x35, 
0x31 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+
+/**
+  Re-order the Boot Option according to the DevOrder.
+
+  The routine re-orders the Boot Option in BootOption array according to
+  the order specified by DevOrder.
+
+  @param DevOrder           Pointer to buffer containing the BBS Index,
+                            high 8-bit value 0xFF indicating a disabled boot 
option
+  @param DevOrderCount      Count of the BBS Index
+  @param EnBootOption       Callee allocated buffer containing the enabled 
Boot Option Numbers
+  @param EnBootOptionCount  Count of the enabled Boot Option Numbers
+  @param DisBootOption      Callee allocated buffer containing the disabled 
Boot Option Numbers
+  @param DisBootOptionCount Count of the disabled Boot Option Numbers
+**/
+VOID
+OrderLegacyBootOption4SameType (
+  UINT16                   *DevOrder,
+  UINTN                    DevOrderCount,
+  UINT16                   **EnBootOption,
+  UINTN                    *EnBootOptionCount,
+  UINT16                   **DisBootOption,
+  UINTN                    *DisBootOptionCount
+  )
+{
+  EFI_STATUS               Status;
+  UINT16                   *NewBootOption;
+  UINT16                   *BootOrder;
+  UINTN                    BootOrderSize;
+  UINTN                    Index;
+  UINTN                    StartPosition;
+  
+  EFI_BOOT_MANAGER_LOAD_OPTION    BootOption;
+  
+  CHAR16                           OptionName[sizeof ("Boot####")];
+  UINT16                   *BbsIndexArray;
+  UINT16                   *DeviceTypeArray;
+
+  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &BootOrderSize);
+  ASSERT (BootOrder != NULL);
+
+  BbsIndexArray       = AllocatePool (BootOrderSize);
+  DeviceTypeArray     = AllocatePool (BootOrderSize);
+  *EnBootOption       = AllocatePool (BootOrderSize);
+  *DisBootOption      = AllocatePool (BootOrderSize);
+  *DisBootOptionCount = 0;
+  *EnBootOptionCount  = 0;
+  Index               = 0;
+
+  ASSERT (*EnBootOption != NULL);
+  ASSERT (*DisBootOption != NULL);
+
+  for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
+  
+    UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", 
BootOrder[Index]);
+    Status = EfiBootManagerVariableToLoadOption (OptionName, &BootOption);
+    ASSERT_EFI_ERROR (Status);
+    
+    if ((DevicePathType (BootOption.FilePath) == BBS_DEVICE_PATH) &&
+        (DevicePathSubType (BootOption.FilePath) == BBS_BBS_DP)) {
+      //
+      // Legacy Boot Option
+      //
+      ASSERT (BootOption.OptionalDataSize == sizeof 
(LEGACY_BOOT_OPTION_BBS_DATA));
+
+      DeviceTypeArray[Index] = ((BBS_BBS_DEVICE_PATH *) 
BootOption.FilePath)->DeviceType;
+      BbsIndexArray  [Index] = ((LEGACY_BOOT_OPTION_BBS_DATA *) 
BootOption.OptionalData)->BbsIndex;
+    } else {
+      DeviceTypeArray[Index] = BBS_TYPE_UNKNOWN;
+      BbsIndexArray  [Index] = 0xFFFF;
+    }
+    EfiBootManagerFreeLoadOption (&BootOption);
+  }
+
+  //
+  // Record the corresponding Boot Option Numbers according to the DevOrder
+  // Record the EnBootOption and DisBootOption according to the DevOrder
+  //
+  StartPosition = BootOrderSize / sizeof (UINT16);
+  NewBootOption = AllocatePool (DevOrderCount * sizeof (UINT16));
+  while (DevOrderCount-- != 0) {
+    for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
+      if (BbsIndexArray[Index] == (DevOrder[DevOrderCount] & 0xFF)) {
+        StartPosition = MIN (StartPosition, Index);
+        NewBootOption[DevOrderCount] = BootOrder[Index];
+        
+        if ((DevOrder[DevOrderCount] & 0xFF00) == 0xFF00) {
+          (*DisBootOption)[*DisBootOptionCount] = BootOrder[Index];
+          (*DisBootOptionCount)++;
+        } else {
+          (*EnBootOption)[*EnBootOptionCount] = BootOrder[Index];
+          (*EnBootOptionCount)++;
+        }
+        break;
+      }
+    }
+  }
+
+  //
+  // Overwrite the old BootOption
+  //
+  CopyMem (&BootOrder[StartPosition], NewBootOption, (*DisBootOptionCount + 
*EnBootOptionCount) * sizeof (UINT16));
+  Status = gRT->SetVariable (
+                  L"BootOrder",
+                  &gEfiGlobalVariableGuid,
+                  VAR_FLAG,
+                  BootOrderSize,
+                  BootOrder
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  FreePool (NewBootOption);
+  FreePool (DeviceTypeArray);
+  FreePool (BbsIndexArray);
+}
+
+/**
+  Update the legacy BBS boot option. L"LegacyDevOrder" and 
gEfiLegacyDevOrderVariableGuid EFI Variable
+  is udpated with the new Legacy Boot order. The EFI Variable of "Boot####" 
and gEfiGlobalVariableGuid
+  is also updated.
+
+  @param CallbackData    The context data for BMM.
+
+  @return EFI_SUCCESS           The function completed successfully.
+  @retval EFI_NOT_FOUND         If L"LegacyDevOrder" and 
gEfiLegacyDevOrderVariableGuid EFI Variable can be found.
+  @retval EFI_OUT_OF_RESOURCES  Fail to allocate memory resource
+**/
+EFI_STATUS
+UpdateBBSOption (
+  IN LEGACY_BOOT_NV_DATA            *NVMapData
+  )
+{
+  UINTN                       Index;
+  UINTN                       Index2;
+  UINTN                       CurrentType;
+  VOID                        *BootOptionVar;
+  CHAR16                      VarName[100];
+  UINTN                       OptionSize;
+  EFI_STATUS                  Status;
+  UINT32                      *Attribute;
+  LEGACY_MENU_OPTION          *OptionMenu;
+  UINT16                      *LegacyDev;
+  UINT16                      *InitialLegacyDev;
+  UINT8                       *VarData;
+  UINTN                       VarSize;
+  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
+  UINT8                       *OriginalPtr;
+  UINT8                       *DisMap;
+  UINTN                       Pos;
+  UINTN                       Bit;
+  UINT16                      *NewOrder;
+  UINT16                      Tmp;
+  UINT16                      *EnBootOption;
+  UINTN                       EnBootOptionCount;
+  UINT16                      *DisBootOption;
+  UINTN                       DisBootOptionCount;
+  UINTN                       BufferSize;
+  
+
+  DisMap              = NULL;
+  NewOrder            = NULL;
+  CurrentType         = 0;
+
+  
+  DisMap  = mLegacyBootOptionPrivate->MaintainMapData->DisableMap;
+  Status  = EFI_SUCCESS;
+
+  //
+  // Update the Variable "LegacyDevOrder"
+  //
+  GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID 
**) &VarData, &VarSize);
+  if (VarData == NULL) {
+    return EFI_NOT_FOUND;
+  }
+  OriginalPtr = VarData;
+
+  while (mBbsType[CurrentType] != BBS_UNKNOWN) {
+    switch (mBbsType[CurrentType]) {
+    case BBS_FLOPPY:
+      OptionMenu            = (LEGACY_MENU_OPTION *) &LegacyFDMenu;
+      LegacyDev             = NVMapData->LegacyFD;
+      InitialLegacyDev     = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyFD;
+      BufferSize            = sizeof (NVMapData->LegacyFD);
+      break;
+
+    case BBS_HARDDISK:
+      OptionMenu            = (LEGACY_MENU_OPTION *) &LegacyHDMenu;
+      LegacyDev             = NVMapData->LegacyHD;
+      InitialLegacyDev     = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyHD;
+
+      BufferSize            = sizeof (NVMapData->LegacyHD);
+      break;
+
+    case BBS_CDROM:
+      OptionMenu            = (LEGACY_MENU_OPTION *) &LegacyCDMenu;
+      LegacyDev             = NVMapData->LegacyCD;
+      InitialLegacyDev     = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyCD;
+      BufferSize            = sizeof (NVMapData->LegacyCD);
+      break;
+
+    case BBS_EMBED_NETWORK:
+      OptionMenu            = (LEGACY_MENU_OPTION *) &LegacyNETMenu;
+      LegacyDev             = NVMapData->LegacyNET;
+      InitialLegacyDev     = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyNET;
+      BufferSize            = sizeof (NVMapData->LegacyNET);
+      break;
+
+    default:
+      ASSERT (mBbsType[CurrentType] == BBS_BEV_DEVICE);
+      OptionMenu            = (LEGACY_MENU_OPTION *) &LegacyBEVMenu;
+      LegacyDev             = NVMapData->LegacyBEV;
+      InitialLegacyDev     = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyBEV;
+      BufferSize            = sizeof (NVMapData->LegacyBEV);
+      break;
+    }
+
+    //
+    // Check whether has value changed.
+    //
+    if (CompareMem (LegacyDev, InitialLegacyDev, BufferSize) == 0) {
+      CurrentType++;
+      continue;
+    }
+
+    DevOrder    = (LEGACY_DEV_ORDER_ENTRY *) OriginalPtr;
+    while (VarData < OriginalPtr + VarSize) {
+      if (DevOrder->BbsType == mBbsType[CurrentType]) {
+        break;
+      }
+
+      VarData += sizeof (BBS_TYPE) + DevOrder->Length;
+      DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;
+    }
+
+    if (VarData >= OriginalPtr + VarSize) {
+      FreePool (OriginalPtr);
+      return EFI_NOT_FOUND;
+    }
+
+    NewOrder = AllocateZeroPool (DevOrder->Length - sizeof (DevOrder->Length));
+    if (NewOrder == NULL) {
+      FreePool (OriginalPtr);
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
+      if (0xFF == LegacyDev[Index]) {
+        break;
+      }
+
+      NewOrder[Index] = LegacyDev[Index];
+    }
+
+    //
+    // Only the enable/disable state of each boot device with same device type 
can be changed,
+    // so we can count on the index information in DevOrder.
+    // DisMap bit array is the only reliable source to check a device's en/dis 
state,
+    // so we use DisMap to set en/dis state of each item in NewOrder array
+    //
+    for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) {
+      Tmp = (UINT16) (DevOrder->Data[Index2] & 0xFF);
+      Pos = Tmp / 8;
+      Bit = 7 - (Tmp % 8);
+      if ((DisMap[Pos] & (1 << Bit)) != 0) {
+        NewOrder[Index] = (UINT16) (0xFF00 | Tmp);
+        Index++;
+      }
+    }
+
+    CopyMem (
+      DevOrder->Data,
+      NewOrder,
+      DevOrder->Length - sizeof (DevOrder->Length)
+      );
+    FreePool (NewOrder);
+
+    //
+    // Update BootOrder and Boot####.Attribute
+    //
+    // 1. Re-order the Option Number in BootOrder according to Legacy Dev Order
+    //
+    ASSERT (OptionMenu->MenuNumber == DevOrder->Length / sizeof (UINT16) - 1);
+
+    OrderLegacyBootOption4SameType (
+      DevOrder->Data,
+      DevOrder->Length / sizeof (UINT16) - 1,
+      &EnBootOption,
+      &EnBootOptionCount,
+      &DisBootOption,
+      &DisBootOptionCount
+      );
+
+    //
+    // 2. Deactivate the DisBootOption and activate the EnBootOption
+    //
+    for (Index = 0; Index < DisBootOptionCount; Index++) {
+      UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", 
DisBootOption[Index]);
+      GetEfiGlobalVariable2 (VarName, (VOID **) &BootOptionVar, &OptionSize);
+      if (BootOptionVar != NULL) {
+        Attribute   = (UINT32 *) BootOptionVar;
+        *Attribute &= ~LOAD_OPTION_ACTIVE;
+
+        Status = gRT->SetVariable (
+                        VarName,
+                        &gEfiGlobalVariableGuid,
+                        VAR_FLAG,
+                        OptionSize,
+                        BootOptionVar
+                        );
+
+        FreePool (BootOptionVar);
+      }
+    }
+
+    for (Index = 0; Index < EnBootOptionCount; Index++) {
+      UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", 
EnBootOption[Index]);
+      GetEfiGlobalVariable2 (VarName, (VOID **) &BootOptionVar, &OptionSize);
+      if (BootOptionVar != NULL) {
+        Attribute   = (UINT32 *) BootOptionVar;
+        *Attribute |= LOAD_OPTION_ACTIVE;
+
+        Status = gRT->SetVariable (
+                        VarName,
+                        &gEfiGlobalVariableGuid,
+                        VAR_FLAG,
+                        OptionSize,
+                        BootOptionVar
+                        );
+
+        FreePool (BootOptionVar);
+      }
+    }
+
+
+    FreePool (EnBootOption);
+    FreePool (DisBootOption);
+
+    CurrentType++;
+  }
+  
+  Status = gRT->SetVariable (
+                  VAR_LEGACY_DEV_ORDER,
+                  &gEfiLegacyDevOrderVariableGuid,
+                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+                  VarSize,
+                  OriginalPtr
+                  );
+
+  FreePool (OriginalPtr);
+  return Status;
+}
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         A null-terminated Unicode string in <ConfigRequest> 
format.
+  @param Progress        On return, points to a character in the Request 
string.
+                         Points to the string's null terminator if request was 
successful.
+                         Points to the most recent '&' before the first 
failing name/value
+                         pair (or the beginning of the string if the failure 
is in the
+                         first name/value pair) if the request was not 
successful.
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> 
format which
+                         has all values filled in for the names in the Request 
string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_SUCCESS            The Results is filled with the requested 
values.
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
+  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootOptionExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT EFI_STRING                             *Progress,
+  OUT EFI_STRING                             *Results
+  )
+{
+  if (Progress == NULL || Results == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  *Progress = Request;
+  return EFI_NOT_FOUND;
+}
+
+/**
+  This function processes the results of changes in configuration.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Configuration   A null-terminated Unicode string in <ConfigResp> 
format.
+  @param Progress        A pointer to a string filled in with the offset of 
the most
+                         recent '&' before the first failing name/value pair 
(or the
+                         beginning of the string if the failure is in the first
+                         name/value pair) or the terminating NULL if all was 
successful.
+
+  @retval  EFI_SUCCESS            The Results is processed successfully.
+  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootOptionRouteConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Configuration,
+  OUT       EFI_STRING                       *Progress
+  )
+{
+  EFI_STATUS                      Status;
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
+  LEGACY_BOOT_NV_DATA             *CurrentNVMapData;
+  UINTN                           BufferSize;
+
+
+  if (Configuration == NULL || Progress == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Check routing data in <ConfigHdr>.
+  // Note: there is no name for Name/Value storage, only GUID will be checked
+  //
+  if (!HiiIsConfigHdrMatch (Configuration, &mLegacyBootOptionGuid, 
mLegacyBootStorageName)) {
+    return EFI_NOT_FOUND;
+  }
+
+  Status = gBS->LocateProtocol (
+                  &gEfiHiiConfigRoutingProtocolGuid, 
+                  NULL, 
+                  &ConfigRouting
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
+  //
+  CurrentNVMapData = &mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData;
+  Status = ConfigRouting->ConfigToBlock (
+                            ConfigRouting,
+                            Configuration,
+                            (UINT8 *) CurrentNVMapData,
+                            &BufferSize,
+                            Progress
+                            );
+  ASSERT_EFI_ERROR (Status);    
+
+  Status = UpdateBBSOption (CurrentNVMapData);
+
+  return Status;
+}
+
+/**
+  Refresh the global UpdateData structure.
+
+**/
+VOID
+RefreshLegacyUpdateData (
+  VOID
+  )
+{
+  //
+  // Free current updated date
+  //
+  if (mLegacyStartOpCodeHandle != NULL) {
+    HiiFreeOpCodeHandle (mLegacyStartOpCodeHandle);
+  }
+  if (mLegacyEndOpCodeHandle != NULL) {
+    HiiFreeOpCodeHandle (mLegacyEndOpCodeHandle);
+  }
+
+  //
+  // Create new OpCode Handle
+  //
+  mLegacyStartOpCodeHandle = HiiAllocateOpCodeHandle ();
+  mLegacyEndOpCodeHandle = HiiAllocateOpCodeHandle ();
+
+  //
+  // Create Hii Extend Label OpCode as the start opcode
+  //
+  mLegacyStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
+                                         mLegacyStartOpCodeHandle,
+                                         &gEfiIfrTianoGuid,
+                                         NULL,
+                                         sizeof (EFI_IFR_GUID_LABEL)
+                                         );
+  mLegacyStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+
+  mLegacyStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID;
+
+  //
+  // Create Hii Extend Label OpCode as the start opcode
+  //
+  mLegacyEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
+                                         mLegacyEndOpCodeHandle,
+                                         &gEfiIfrTianoGuid,
+                                         NULL,
+                                         sizeof (EFI_IFR_GUID_LABEL)
+                                         );
+  mLegacyEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+
+  mLegacyEndLabel->Number = FORM_BOOT_LEGACY_LABEL_END;
+
+}
+
+/**
+  Get the Menu Entry from the list in Menu Entry List.
+
+  If MenuNumber is great or equal to the number of Menu
+  Entry in the list, then ASSERT.
+
+  @param MenuOption      The Menu Entry List to read the menu entry.
+  @param MenuNumber      The index of Menu Entry.
+
+  @return The Menu Entry.
+
+**/
+LEGACY_MENU_ENTRY *
+GetMenuEntry (
+  LEGACY_MENU_OPTION      *MenuOption,
+  UINTN                   MenuNumber
+  )
+{
+  LEGACY_MENU_ENTRY   *NewMenuEntry;
+  UINTN               Index;
+  LIST_ENTRY          *List;
+
+  ASSERT (MenuNumber < MenuOption->MenuNumber);
+
+  List = MenuOption->Head.ForwardLink;
+  for (Index = 0; Index < MenuNumber; Index++) {
+    List = List->ForwardLink;
+  }
+
+  NewMenuEntry = CR (List, LEGACY_MENU_ENTRY, Link, 
LEGACY_MENU_ENTRY_SIGNATURE);
+
+  return NewMenuEntry;
+}
+
+/**
+  Create string tokens for a menu from its help strings and display strings
+  
+  @param HiiHandle          Hii Handle of the package to be updated.
+  @param MenuOption         The Menu whose string tokens need to be created
+
+  @retval  EFI_SUCCESS      String tokens created successfully
+  @retval  others           contain some errors
+**/
+VOID
+CreateLegacyMenuStringToken (
+  IN EFI_HII_HANDLE                   HiiHandle,
+  IN LEGACY_MENU_OPTION               *MenuOption
+  )
+{
+  LEGACY_MENU_ENTRY *NewMenuEntry;
+  UINTN             Index;
+
+  for (Index = 0; Index < MenuOption->MenuNumber; Index++) {
+    NewMenuEntry = GetMenuEntry (MenuOption, Index);
+
+    NewMenuEntry->DisplayStringToken = HiiSetString (
+                                         HiiHandle,
+                                         0,
+                                         NewMenuEntry->DisplayString,
+                                         NULL
+                                         );
+
+    if (NULL == NewMenuEntry->HelpString) {
+      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;
+    } else {
+      NewMenuEntry->HelpStringToken = HiiSetString (
+                                        HiiHandle,
+                                        0,
+                                        NewMenuEntry->HelpString,
+                                        NULL
+                                        );
+    }
+  }
+}
+
+/**
+  Create a dynamic page so that Legacy Device boot order
+  can be set for specified device type.
+
+  @param UpdatePageId    The form ID. It also spefies the legacy device type.
+
+
+**/
+VOID
+UpdateLegacyDeviceOrderPage (
+  IN UINT16                           UpdatePageId
+  )
+{
+  LEGACY_MENU_OPTION          *OptionMenu;
+  LEGACY_MENU_ENTRY           *NewMenuEntry;
+  EFI_STRING_ID               StrRef;
+  EFI_STRING_ID               StrRefHelp;
+  BBS_TYPE                    BbsType;
+  UINT16                      *Default;
+  UINT16                      Index;
+  UINT16                      Key;
+  CHAR16                      String[100];
+  CHAR16                      *TypeStr;
+  CHAR16                      *TypeStrHelp;
+  CHAR16                      *FormTitle;
+  VOID                        *OptionsOpCodeHandle;
+  VOID                        *DefaultOpCodeHandle;
+
+  Key         = 0;
+  StrRef      = 0;
+  StrRefHelp  = 0;
+  OptionMenu  = NULL;
+  TypeStr     = NULL;
+  TypeStrHelp = NULL;
+  Default     = NULL;
+  BbsType     = BBS_FLOPPY;
+
+  RefreshLegacyUpdateData();
+
+  //
+  // Create oneof option list
+  //
+  switch (UpdatePageId) {
+  case FORM_FLOPPY_BOOT_ID:
+    OptionMenu  = (LEGACY_MENU_OPTION *) &LegacyFDMenu;
+    Key         = (UINT16) LEGACY_FD_QUESTION_ID;
+    TypeStr     = STR_FLOPPY;
+    TypeStrHelp = STR_FLOPPY_HELP;
+    FormTitle   = STR_FLOPPY_TITLE;
+    BbsType     = BBS_FLOPPY;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData.LegacyFD;
+    break;
+
+  case FORM_HARDDISK_BOOT_ID:
+    OptionMenu  = (LEGACY_MENU_OPTION *) &LegacyHDMenu;
+    Key         = (UINT16) LEGACY_HD_QUESTION_ID;
+    TypeStr     = STR_HARDDISK;
+    TypeStrHelp = STR_HARDDISK_HELP;
+    FormTitle   = STR_HARDDISK_TITLE;
+    BbsType     = BBS_HARDDISK;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData.LegacyHD;
+    break;
+
+  case FORM_CDROM_BOOT_ID:
+    OptionMenu  = (LEGACY_MENU_OPTION *) &LegacyCDMenu;
+    Key         = (UINT16) LEGACY_CD_QUESTION_ID;
+    TypeStr     = STR_CDROM;
+    TypeStrHelp = STR_CDROM_HELP;
+    FormTitle   = STR_CDROM_TITLE;
+    BbsType     = BBS_CDROM;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData.LegacyCD;
+    break;
+
+  case FORM_NET_BOOT_ID:
+    OptionMenu  = (LEGACY_MENU_OPTION *) &LegacyNETMenu;
+    Key         = (UINT16) LEGACY_NET_QUESTION_ID;
+    TypeStr     = STR_NET;
+    TypeStrHelp = STR_NET_HELP;
+    FormTitle   = STR_NET_TITLE;
+    BbsType     = BBS_EMBED_NETWORK;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData.LegacyNET;
+    break;
+
+  case FORM_BEV_BOOT_ID:
+    OptionMenu  = (LEGACY_MENU_OPTION *) &LegacyBEVMenu;
+    Key         = (UINT16) LEGACY_BEV_QUESTION_ID;
+    TypeStr     = STR_BEV;
+    TypeStrHelp = STR_BEV_HELP;
+    FormTitle   = STR_BEV_TITLE;
+    BbsType     = BBS_BEV_DEVICE;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData.LegacyBEV;
+    break;
+
+  default:
+    DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));
+    return;
+  }
+  
+  HiiSetString (mLegacyBootOptionPrivate->HiiHandle, 
STRING_TOKEN(STR_ORDER_CHANGE_PROMPT), FormTitle, NULL);
+
+  CreateLegacyMenuStringToken (mLegacyBootOptionPrivate->HiiHandle, 
OptionMenu);
+
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (OptionsOpCodeHandle != NULL);
+
+
+  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
+    NewMenuEntry = GetMenuEntry (OptionMenu, Index);
+    //
+    // Create OneOf for each legacy device
+    //
+    HiiCreateOneOfOptionOpCode (
+      OptionsOpCodeHandle,
+      NewMenuEntry->DisplayStringToken,
+      0,
+      EFI_IFR_TYPE_NUM_SIZE_16,
+      ((LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex
+      );
+  }
+
+  //
+  // Create OneOf for item "Disabled"
+  //
+  HiiCreateOneOfOptionOpCode (
+    OptionsOpCodeHandle,
+    STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),
+    0,
+    EFI_IFR_TYPE_NUM_SIZE_16,
+    0xFF
+    );
+
+  //
+  // Create oneof tag here for FD/HD/CD #1 #2
+  //
+  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
+    DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
+    ASSERT (DefaultOpCodeHandle != NULL);
+
+    HiiCreateDefaultOpCode (
+      DefaultOpCodeHandle, 
+      EFI_HII_DEFAULT_CLASS_STANDARD, 
+      EFI_IFR_TYPE_NUM_SIZE_16, 
+      *Default++
+      );
+  
+    //
+    // Create the string for oneof tag
+    //
+    UnicodeSPrint (String, sizeof (String), TypeStr, Index);
+    StrRef = HiiSetString (mLegacyBootOptionPrivate->HiiHandle, 0, String, 
NULL);
+
+    UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);
+    StrRefHelp = HiiSetString (mLegacyBootOptionPrivate->HiiHandle, 0, String, 
NULL);
+
+    HiiCreateOneOfOpCode (
+      mLegacyStartOpCodeHandle,
+      (EFI_QUESTION_ID) (Key + Index),
+      VARSTORE_ID_LEGACY_BOOT,
+      (UINT16) (Key + Index * 2 - CONFIG_OPTION_OFFSET),
+      StrRef,
+      StrRefHelp,
+      EFI_IFR_FLAG_CALLBACK,
+      EFI_IFR_NUMERIC_SIZE_2,
+      OptionsOpCodeHandle,
+      DefaultOpCodeHandle //NULL //
+      );
+      
+    HiiFreeOpCodeHandle (DefaultOpCodeHandle);
+  }
+
+  HiiUpdateForm (
+    mLegacyBootOptionPrivate->HiiHandle,
+    &mLegacyBootOptionGuid,
+    LEGACY_ORDER_CHANGE_FORM_ID,
+    mLegacyStartOpCodeHandle, 
+    mLegacyEndOpCodeHandle   
+    );
+
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);
+}
+
+
+/**
+  Adjust question value when one question value has been changed.
+
+  @param QuestionId    The question id for the value changed question.
+  @param Value         The value for the changed question.
+
+**/
+VOID
+AdjustOptionValue (
+  IN  UINT16                                 QuestionId,
+  IN  EFI_IFR_TYPE_VALUE                     *Value
+  )
+{
+  UINTN                       Number;
+  BBS_TYPE                    BbsType;
+  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
+  UINT16                      *Default;
+  LEGACY_BOOT_NV_DATA         *CurrentNVMap;
+  UINT16                      *CurrentVal;
+  UINTN                       Index;
+  UINTN                       Index2;
+  UINTN                       Index3;
+  UINTN                       NewValuePos;
+  UINTN                       OldValue;
+  UINTN                       NewValue;
+  UINT8                       *DisMap;
+  UINTN                       Pos;
+  UINTN                       Bit;
+
+  Number = 0;
+  BbsType = BBS_UNKNOWN;
+  CurrentVal = 0;
+  DevOrder = NULL;
+  Default = NULL;
+  NewValue = 0;
+  NewValuePos = 0;
+
+  //
+  // Update Select FD/HD/CD/NET/BEV Order Form
+  //
+  ASSERT ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < 
LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER));
+
+  CurrentNVMap = &mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData;
+  HiiGetBrowserData (&mLegacyBootOptionGuid, mLegacyBootStorageName, sizeof 
(LEGACY_BOOT_NV_DATA), (UINT8 *) CurrentNVMap);
+  DisMap  = mLegacyBootOptionPrivate->MaintainMapData->DisableMap;
+
+  if (QuestionId >= LEGACY_FD_QUESTION_ID && QuestionId < 
LEGACY_FD_QUESTION_ID + MAX_MENU_NUMBER) {
+    Number      = (UINT16) LegacyFDMenu.MenuNumber;
+    BbsType     = BBS_FLOPPY;
+    CurrentVal  = CurrentNVMap->LegacyFD;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyFD;
+  } else if (QuestionId >= LEGACY_HD_QUESTION_ID && QuestionId < 
LEGACY_HD_QUESTION_ID + MAX_MENU_NUMBER) {
+    Number      = (UINT16) LegacyHDMenu.MenuNumber;
+    BbsType     = BBS_HARDDISK;
+    CurrentVal  = CurrentNVMap->LegacyHD;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyHD;
+  } else if (QuestionId >= LEGACY_CD_QUESTION_ID && QuestionId < 
LEGACY_CD_QUESTION_ID + MAX_MENU_NUMBER) {
+    Number      = (UINT16) LegacyCDMenu.MenuNumber;
+    BbsType     = BBS_CDROM;
+    CurrentVal  = CurrentNVMap->LegacyCD;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyCD;
+  } else if (QuestionId >= LEGACY_NET_QUESTION_ID && QuestionId < 
LEGACY_NET_QUESTION_ID + MAX_MENU_NUMBER) {
+    Number      = (UINT16) LegacyNETMenu.MenuNumber;
+    BbsType     = BBS_EMBED_NETWORK;
+    CurrentVal  = CurrentNVMap->LegacyNET;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyNET;
+  } else if (QuestionId >= LEGACY_BEV_QUESTION_ID && QuestionId < 
LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER) {
+    Number      = (UINT16) LegacyBEVMenu.MenuNumber;
+    BbsType     = BBS_BEV_DEVICE;
+    CurrentVal  = CurrentNVMap->LegacyBEV;
+    Default     = 
mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyBEV;
+  }
+  
+  //
+  //  First, find the different position
+  //  if there is change, it should be only one
+  //
+  for (Index = 0; Index < Number; Index++) {
+    if (CurrentVal[Index] != Default[Index]) {
+      OldValue  = Default[Index];
+      NewValue  = CurrentVal[Index];
+      break;
+    }
+  }
+
+  if (Index != Number) {
+    //
+    // there is change, now process
+    //
+    if (0xFF == NewValue) {
+      //
+      // This item will be disable
+      // Just move the items behind this forward to overlap it
+      //
+      Pos = OldValue / 8;
+      Bit = 7 - (OldValue % 8);
+      DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));
+      for (Index2 = Index; Index2 < Number - 1; Index2++) {
+        CurrentVal[Index2] = CurrentVal[Index2 + 1];
+      }
+
+      CurrentVal[Index2] = 0xFF;
+    } else {
+      for (Index2 = 0; Index2 < Number; Index2++) {
+        if (Index2 == Index) {
+          continue;
+        }
+
+        if (Default[Index2] == NewValue) {
+          //
+          // If NewValue is in OldLegacyDev array
+          // remember its old position
+          //
+          NewValuePos = Index2;
+          break;
+        }
+      }
+
+      if (Index2 != Number) {
+        //
+        // We will change current item to an existing item
+        // (It's hard to describe here, please read code, it's like a 
cycle-moving)
+        //
+        for (Index2 = NewValuePos; Index2 != Index;) {
+          if (NewValuePos < Index) {
+            CurrentVal[Index2] = Default[Index2 + 1];
+            Index2++;
+          } else {
+            CurrentVal[Index2] = Default[Index2 - 1];
+            Index2--;
+          }
+        }
+      } else {
+        //
+        // If NewValue is not in OldlegacyDev array, we are changing to a 
disabled item
+        // so we should modify DisMap to reflect the change
+        //
+        Pos = NewValue / 8;
+        Bit = 7 - (NewValue % 8);
+        DisMap[Pos] = (UINT8) (DisMap[Pos] & (~ (UINT8) (1 << Bit)));
+        if (0xFF != OldValue) {
+          //
+          // Because NewValue is a item that was disabled before
+          // so after changing the OldValue should be disabled
+          // actually we are doing a swap of enable-disable states of two items
+          //
+          Pos = OldValue / 8;
+          Bit = 7 - (OldValue % 8);
+          DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));
+        }
+      }
+    }
+    //
+    // To prevent DISABLE appears in the middle of the list
+    // we should perform a re-ordering
+    //
+    Index3 = Index;
+    Index = 0;
+    while (Index < Number) {
+      if (0xFF != CurrentVal[Index]) {
+        Index++;
+        continue;
+      }
+
+      Index2 = Index;
+      Index2++;
+      while (Index2 < Number) {
+        if (0xFF != CurrentVal[Index2]) {
+          break;
+        }
+
+        Index2++;
+      }
+
+      if (Index2 < Number) {
+        CurrentVal[Index]   = CurrentVal[Index2];
+        CurrentVal[Index2]  = 0xFF;
+      }
+
+      Index++;
+    }
+
+    //
+    // Return correct question value.
+    //
+    Value->u16 = CurrentVal[Index3];
+    CopyMem (Default, CurrentVal, sizeof (UINT16) * Number);
+  }
+
+  //
+  // Pass changed uncommitted data back to Form Browser
+  //
+  HiiSetBrowserData (&mLegacyBootOptionGuid, mLegacyBootStorageName, sizeof 
(LEGACY_BOOT_NV_DATA), (UINT8 *) CurrentNVMap, NULL);
+}
+
+/**
+  This call back function is registered with Boot Manager formset.
+  When user selects a boot option, this call back function will
+  be triggered. The boot option is saved for later processing.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action          Specifies the type of action taken by the browser.
+  @param QuestionId      A unique value which is sent to the original 
exporting driver
+                         so that it can identify the type of data to expect.
+  @param Type            The type of value for the question.
+  @param Value           A pointer to the data being sent to the original 
exporting driver.
+  @param ActionRequest   On return, points to the action requested by the 
callback function.
+
+  @retval  EFI_SUCCESS           The callback successfully handled the action.
+  @retval  EFI_INVALID_PARAMETER The setup browser call this function with 
invalid parameters.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootOptionCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  EFI_BROWSER_ACTION                     Action,
+  IN  EFI_QUESTION_ID                        QuestionId,
+  IN  UINT8                                  Type,
+  IN  EFI_IFR_TYPE_VALUE                     *Value,
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
+  )
+{
+  if (Action != EFI_BROWSER_ACTION_CHANGED && Action != 
EFI_BROWSER_ACTION_CHANGING) {
+    //
+    // Do nothing for other UEFI Action. Only do call back when data is 
changed.
+    //
+    return EFI_UNSUPPORTED;
+  }
+
+  if ((Value == NULL) || (ActionRequest == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Action == EFI_BROWSER_ACTION_CHANGING) {
+    switch (QuestionId) {
+    case FORM_FLOPPY_BOOT_ID:
+    case FORM_HARDDISK_BOOT_ID:
+    case FORM_CDROM_BOOT_ID:
+    case FORM_NET_BOOT_ID:
+    case FORM_BEV_BOOT_ID:
+      UpdateLegacyDeviceOrderPage (QuestionId);
+      break;
+
+    default:
+      break;
+    }
+  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
+    if ((Value == NULL) || (ActionRequest == NULL)) {
+      return EFI_INVALID_PARAMETER;
+    }
+
+    if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < 
LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {
+      AdjustOptionValue(QuestionId, Value);
+    }
+  }
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Create a menu entry by given menu type.
+
+  @param MenuType        The Menu type to be created.
+
+  @retval NULL           If failed to create the menu.
+  @return the new menu entry.
+
+**/
+LEGACY_MENU_ENTRY *
+CreateMenuEntry (
+  VOID
+  )
+{
+  LEGACY_MENU_ENTRY *MenuEntry;
+
+  //
+  // Create new menu entry
+  //
+  MenuEntry = AllocateZeroPool (sizeof (LEGACY_MENU_ENTRY));
+  if (MenuEntry == NULL) {
+    return NULL;
+  }
+
+  MenuEntry->VariableContext = AllocateZeroPool (sizeof 
(LEGACY_DEVICE_CONTEXT));
+  if (MenuEntry->VariableContext == NULL) {
+    FreePool (MenuEntry);
+    return NULL;
+  }
+
+  MenuEntry->Signature        = LEGACY_MENU_ENTRY_SIGNATURE;
+  return MenuEntry;
+}
+
+/**
+
+  Base on the L"LegacyDevOrder" variable to build the current order data.
+
+**/
+VOID
+GetLegacyOptionsOrder (
+  VOID
+  )
+{
+  UINTN                       VarSize;
+  UINT8                       *VarData;
+  UINT8                       *VarTmp;
+  LEGACY_DEV_ORDER_ENTRY      *DevOrder;
+  UINT16                      *LegacyDev;
+  UINTN                       Index;
+  LEGACY_MENU_OPTION          *OptionMenu;
+  UINT16                      VarDevOrder;
+  UINTN                       Pos;
+  UINTN                       Bit;
+  UINT8                       *DisMap;
+
+  DisMap = ZeroMem (mLegacyBootOptionPrivate->MaintainMapData->DisableMap, 
sizeof (mLegacyBootOptionPrivate->MaintainMapData->DisableMap));
+
+  //
+  // Get Device Order from variable
+  //
+  GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID 
**) &VarData, &VarSize);
+  VarTmp = VarData;
+  if (NULL != VarData) {
+    DevOrder    = (LEGACY_DEV_ORDER_ENTRY *) VarData;
+    while (VarData < VarTmp + VarSize) {
+      switch (DevOrder->BbsType) {
+      case BBS_FLOPPY:
+        LegacyDev = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyFD;
+        OptionMenu = &LegacyFDMenu;
+        break;
+      
+      case BBS_HARDDISK:
+        LegacyDev = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyHD;
+        OptionMenu = &LegacyHDMenu;
+        break;
+      
+      case BBS_CDROM:
+        LegacyDev = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyCD;
+        OptionMenu = &LegacyCDMenu;
+        break;
+      
+      case BBS_EMBED_NETWORK:
+        LegacyDev = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyNET;
+        OptionMenu = &LegacyNETMenu;
+        break;
+      
+      case BBS_BEV_DEVICE:
+        LegacyDev = 
mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyBEV;
+        OptionMenu = &LegacyBEVMenu;
+        break;
+      
+      case BBS_UNKNOWN:
+      default:
+        ASSERT (FALSE);
+        DEBUG ((DEBUG_ERROR, "Unsupported device type found!\n"));
+        break;
+      }
+
+      //
+      // Create oneof tag here for FD/HD/CD #1 #2
+      //
+      for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {  
+        VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + 
sizeof (UINT16) + Index * sizeof (UINT16));
+      
+        if (0xFF00 == (VarDevOrder & 0xFF00)) {
+          LegacyDev[Index]  = 0xFF;
+          Pos               = (VarDevOrder & 0xFF) / 8;
+          Bit               = 7 - ((VarDevOrder & 0xFF) % 8);
+          DisMap[Pos]       = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));
+        } else {
+          LegacyDev[Index] = VarDevOrder & 0xFF;
+        }
+      }
+
+      VarData += sizeof (BBS_TYPE);
+      VarData += *(UINT16 *) VarData;
+      DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;
+    }
+  }
+
+  CopyMem (&mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData, 
&mLegacyBootOptionPrivate->MaintainMapData->InitialNvData, sizeof 
(LEGACY_BOOT_NV_DATA));
+  CopyMem (&mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData, 
&mLegacyBootOptionPrivate->MaintainMapData->InitialNvData, sizeof 
(LEGACY_BOOT_NV_DATA));
+}
+
+/**
+
+  Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to 
LegacyBios.GetBbsInfo().
+
+**/
+VOID
+GetLegacyOptions (
+  VOID
+  )
+{
+  LEGACY_MENU_ENTRY             *NewMenuEntry;
+  LEGACY_DEVICE_CONTEXT         *NewLegacyDevContext;
+  EFI_BOOT_MANAGER_LOAD_OPTION  *BootOption;
+  UINTN                         BootOptionCount;
+  UINT16                        Index;
+  UINTN                         FDNum;
+  UINTN                         HDNum;
+  UINTN                         CDNum;
+  UINTN                         NETNum;
+  UINTN                         BEVNum;
+
+  //
+  // Initialize Bbs Table Context from BBS info data
+  //
+  InitializeListHead (&LegacyFDMenu.Head);
+  InitializeListHead (&LegacyHDMenu.Head);
+  InitializeListHead (&LegacyCDMenu.Head);
+  InitializeListHead (&LegacyNETMenu.Head);
+  InitializeListHead (&LegacyBEVMenu.Head);
+
+  FDNum   = 0;
+  HDNum   = 0;
+  CDNum   = 0;
+  NETNum  = 0;
+  BEVNum  = 0;
+
+  EfiBootManagerConnectAll ();
+  
+  //
+  // for better user experience
+  // 1. User changes HD configuration (e.g.: unplug HDD), here we have a 
chance to remove the HDD boot option
+  // 2. User enables/disables UEFI PXE, here we have a chance to add/remove 
EFI Network boot option
+  //
+  EfiBootManagerRefreshAllBootOption ();
+
+  BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, 
LoadOptionTypeBoot);
+  for (Index = 0; Index < BootOptionCount; Index++) {
+    if ((DevicePathType (BootOption[Index].FilePath) != BBS_DEVICE_PATH) ||
+        (DevicePathSubType (BootOption[Index].FilePath) != BBS_BBS_DP)
+       ) {
+      continue;
+    }
+    ASSERT (BootOption[Index].OptionalDataSize == sizeof 
(LEGACY_BOOT_OPTION_BBS_DATA));
+    NewMenuEntry = CreateMenuEntry ();
+    ASSERT (NewMenuEntry != NULL);
+
+    NewLegacyDevContext              = (LEGACY_DEVICE_CONTEXT *) 
NewMenuEntry->VariableContext;
+    NewLegacyDevContext->BbsIndex    = ((LEGACY_BOOT_OPTION_BBS_DATA *) 
BootOption[Index].OptionalData)->BbsIndex;
+    NewLegacyDevContext->Description = AllocateCopyPool (StrSize 
(BootOption[Index].Description), BootOption[Index].Description);
+    ASSERT (NewLegacyDevContext->Description != NULL);
+
+    NewMenuEntry->DisplayString = NewLegacyDevContext->Description;
+    NewMenuEntry->HelpString    = NULL;
+
+    switch (((BBS_BBS_DEVICE_PATH *) BootOption[Index].FilePath)->DeviceType) {
+    case BBS_TYPE_FLOPPY:
+      InsertTailList (&LegacyFDMenu.Head, &NewMenuEntry->Link);
+      FDNum++;
+      break;
+
+    case BBS_TYPE_HARDDRIVE:
+      InsertTailList (&LegacyHDMenu.Head, &NewMenuEntry->Link);
+      HDNum++;
+      break;
+
+    case BBS_TYPE_CDROM:
+      InsertTailList (&LegacyCDMenu.Head, &NewMenuEntry->Link);
+      CDNum++;
+      break;
+
+    case BBS_TYPE_EMBEDDED_NETWORK:
+      InsertTailList (&LegacyNETMenu.Head, &NewMenuEntry->Link);
+      NETNum++;
+      break;
+
+    case BBS_TYPE_BEV:
+      InsertTailList (&LegacyBEVMenu.Head, &NewMenuEntry->Link);
+      BEVNum++;
+      break;
+    }
+  }
+
+  EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);
+
+  LegacyFDMenu.MenuNumber   = FDNum;
+  LegacyHDMenu.MenuNumber   = HDNum;
+  LegacyCDMenu.MenuNumber   = CDNum;
+  LegacyNETMenu.MenuNumber  = NETNum;
+  LegacyBEVMenu.MenuNumber  = BEVNum;
+}
+
+
+/**
+
+  Install Boot Manager Menu driver.
+
+  @param ImageHandle     The image handle.
+  @param SystemTable     The system table.
+
+  @retval  EFI_SUCEESS  Install Boot manager menu success.
+  @retval  Other        Return error status.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootMaintUiLibConstructor (
+  IN EFI_HANDLE                            ImageHandle,
+  IN EFI_SYSTEM_TABLE                      *SystemTable
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_LEGACY_BIOS_PROTOCOL          *LegacyBios;
+  LEGACY_BOOT_OPTION_CALLBACK_DATA  *LegacyBootOptionData;
+
+  Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) 
&LegacyBios);
+  if (!EFI_ERROR (Status)) {
+    //
+    // Create LegacyBootOptionData structures for Driver Callback
+    //
+    LegacyBootOptionData = AllocateZeroPool (sizeof 
(LEGACY_BOOT_OPTION_CALLBACK_DATA));
+    ASSERT (LegacyBootOptionData != NULL);
+    
+    LegacyBootOptionData->MaintainMapData = AllocateZeroPool (sizeof 
(LEGACY_BOOT_MAINTAIN_DATA));
+    ASSERT (LegacyBootOptionData->MaintainMapData != NULL);
+
+    LegacyBootOptionData->ConfigAccess.ExtractConfig = 
LegacyBootOptionExtractConfig;
+    LegacyBootOptionData->ConfigAccess.RouteConfig   = 
LegacyBootOptionRouteConfig;
+    LegacyBootOptionData->ConfigAccess.Callback      = 
LegacyBootOptionCallback;
+
+    //
+    // Install Device Path Protocol and Config Access protocol to driver handle
+    //
+    Status = gBS->InstallMultipleProtocolInterfaces (
+                    &LegacyBootOptionData->DriverHandle,
+                    &gEfiDevicePathProtocolGuid,
+                    &mLegacyBootOptionHiiVendorDevicePath,
+                    &gEfiHiiConfigAccessProtocolGuid,
+                    &LegacyBootOptionData->ConfigAccess,
+                    NULL
+                    );
+    ASSERT_EFI_ERROR (Status);
+
+    //
+    // Publish our HII data
+    //
+    LegacyBootOptionData->HiiHandle = HiiAddPackages (
+                                      &mLegacyBootOptionGuid,
+                                      LegacyBootOptionData->DriverHandle,
+                                      LegacyBootMaintUiVfrBin,
+                                      LegacyBootMaintUiLibStrings,
+                                      NULL
+                                      );
+    ASSERT (LegacyBootOptionData->HiiHandle != NULL);
+
+    mLegacyBootOptionPrivate = LegacyBootOptionData;
+
+    GetLegacyOptions ();
+
+    GetLegacyOptionsOrder();
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Destructor of Customized Display Library Instance.
+
+  @param  ImageHandle   The firmware allocated handle for the EFI image.
+  @param  SystemTable   A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS   The destructor completed successfully.
+  @retval Other value   The destructor did not complete successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootMaintUiLibDestructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  EFI_STATUS    Status;
+
+  if (mLegacyBootOptionPrivate->DriverHandle != NULL) {
+    Status = gBS->UninstallMultipleProtocolInterfaces (
+                    mLegacyBootOptionPrivate->DriverHandle,
+                    &gEfiDevicePathProtocolGuid,
+                    &mLegacyBootOptionHiiVendorDevicePath,
+                    &gEfiHiiConfigAccessProtocolGuid,
+                    &mLegacyBootOptionPrivate->ConfigAccess,
+                    NULL
+                    );
+    ASSERT_EFI_ERROR (Status);
+    
+    HiiRemovePackages (mLegacyBootOptionPrivate->HiiHandle);
+
+    FreePool (mLegacyBootOptionPrivate->MaintainMapData);
+    FreePool (mLegacyBootOptionPrivate);
+  }
+
+  return EFI_SUCCESS;
+}
+
diff --git 
a/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.h 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.h
new file mode 100644
index 0000000..1d88eed
--- /dev/null
+++ b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUi.h
@@ -0,0 +1,254 @@
+/** @file
+  The platform boot manager reference implement
+
+  Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
+  This software and associated documentation (if any) is furnished
+  under a license and may only be used or copied in accordance
+  with the terms of the license. Except as permitted by such
+  license, no part of this software or documentation may be
+  reproduced, stored in a retrieval system, or transmitted in any
+  form or by any means without the express written consent of
+  Intel Corporation.
+
+**/
+
+#ifndef _EFI_LEGACY_BOOT_OPTION_H_
+#define _EFI_LEGACY_BOOT_OPTION_H_
+
+#include <PiDxe.h>
+
+
+#include <Guid/GlobalVariable.h>
+#include <Guid/LegacyDevOrder.h>
+#include <Guid/MdeModuleHii.h>
+
+#include <Protocol/HiiConfigAccess.h>
+#include <Protocol/HiiConfigRouting.h>
+
+#include <Protocol/HiiDatabase.h>
+#include <Protocol/LegacyBios.h>
+
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/DebugLib.h>
+#include <Library/HiiLib.h>
+#include <Library/UefiBootManagerLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiLib.h>
+#include <Library/PrintLib.h>
+#include <Library/BaseMemoryLib.h>
+
+#include "LegacyBootMaintUiVfr.h"
+
+#define CONFIG_OPTION_OFFSET    0x1200
+
+//
+// VarOffset that will be used to create question
+// all these values are computed from the structure
+// defined below
+//
+#define VAR_OFFSET(Field)              ((UINT16) ((UINTN) 
&(((LEGACY_BOOT_NV_DATA *) 0)->Field)))
+
+//
+// Question Id of Zero is invalid, so add an offset to it
+//
+#define QUESTION_ID(Field)             (VAR_OFFSET (Field) + 
CONFIG_OPTION_OFFSET)
+
+
+#define LEGACY_FD_QUESTION_ID           QUESTION_ID (LegacyFD)
+#define LEGACY_HD_QUESTION_ID           QUESTION_ID (LegacyHD)
+#define LEGACY_CD_QUESTION_ID           QUESTION_ID (LegacyCD)
+#define LEGACY_NET_QUESTION_ID          QUESTION_ID (LegacyNET)
+#define LEGACY_BEV_QUESTION_ID          QUESTION_ID (LegacyBEV)
+
+
+//
+// String Contant
+//
+#define STR_FLOPPY          L"Floppy Drive #%02x"
+#define STR_HARDDISK        L"HardDisk Drive #%02x"
+#define STR_CDROM           L"ATAPI CDROM Drive #%02x"
+#define STR_NET             L"NET Drive #%02x"
+#define STR_BEV             L"BEV Drive #%02x"
+
+#define STR_FLOPPY_HELP     L"Select Floppy Drive #%02x"
+#define STR_HARDDISK_HELP   L"Select HardDisk Drive #%02x"
+#define STR_CDROM_HELP      L"Select ATAPI CDROM Drive #%02x"
+#define STR_NET_HELP        L"NET Drive #%02x"
+#define STR_BEV_HELP        L"BEV Drive #%02x"
+
+#define STR_FLOPPY_TITLE    L"Set Legacy Floppy Drive Order"
+#define STR_HARDDISK_TITLE  L"Set Legacy HardDisk Drive Order"
+#define STR_CDROM_TITLE     L"Set Legacy CDROM Drive Order"
+#define STR_NET_TITLE       L"Set Legacy NET Drive Order"
+#define STR_BEV_TITLE       L"Set Legacy BEV Drive Order"
+
+//
+// These are the VFR compiler generated data representing our VFR data.
+//
+extern UINT8 LegacyBootMaintUiVfrBin[];
+
+#pragma pack(1)
+
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+
+
+//
+// Variable created with this flag will be "Efi:...."
+//
+#define VAR_FLAG  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE
+
+
+#define LEGACY_BOOT_OPTION_CALLBACK_DATA_SIGNATURE  SIGNATURE_32 ('L', 'G', 
'C', 'B')
+
+typedef struct {
+  UINTN                            Signature;
+
+  //
+  // HII relative handles
+  //
+  EFI_HII_HANDLE                   HiiHandle;
+  EFI_HANDLE                       DriverHandle;
+
+  //
+  // Produced protocols
+  //
+  EFI_HII_CONFIG_ACCESS_PROTOCOL   ConfigAccess;
+
+  //
+  // Maintain the data.
+  //
+  LEGACY_BOOT_MAINTAIN_DATA        *MaintainMapData;
+} LEGACY_BOOT_OPTION_CALLBACK_DATA;
+
+//
+// All of the signatures that will be used in list structure
+//
+#define LEGACY_MENU_OPTION_SIGNATURE      SIGNATURE_32 ('m', 'e', 'n', 'u')
+#define LEGACY_MENU_ENTRY_SIGNATURE       SIGNATURE_32 ('e', 'n', 't', 'r')
+
+#define LEGACY_LEGACY_DEV_CONTEXT_SELECT  0x9
+
+typedef struct {
+  UINTN           Signature;
+  LIST_ENTRY      Head;
+  UINTN           MenuNumber;
+} LEGACY_MENU_OPTION;
+
+typedef struct {
+  UINT16    BbsIndex;
+  CHAR16    *Description;
+} LEGACY_DEVICE_CONTEXT;
+
+typedef struct {
+  UINTN           Signature;
+  LIST_ENTRY      Link;
+  UINTN           OptionNumber;
+  UINT16          *DisplayString;
+  UINT16          *HelpString;
+  EFI_STRING_ID   DisplayStringToken;
+  EFI_STRING_ID   HelpStringToken;
+  VOID            *VariableContext;
+} LEGACY_MENU_ENTRY;
+
+typedef struct {
+  UINT16     BbsIndex;
+} LEGACY_BOOT_OPTION_BBS_DATA;
+
+#pragma pack()
+
+/**
+  This call back function is registered with Boot Manager formset.
+  When user selects a boot option, this call back function will
+  be triggered. The boot option is saved for later processing.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action          Specifies the type of action taken by the browser.
+  @param QuestionId      A unique value which is sent to the original 
exporting driver
+                         so that it can identify the type of data to expect.
+  @param Type            The type of value for the question.
+  @param Value           A pointer to the data being sent to the original 
exporting driver.
+  @param ActionRequest   On return, points to the action requested by the 
callback function.
+
+  @retval  EFI_SUCCESS           The callback successfully handled the action.
+  @retval  EFI_INVALID_PARAMETER The setup browser call this function with 
invalid parameters.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootOptionCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  EFI_BROWSER_ACTION                     Action,
+  IN  EFI_QUESTION_ID                        QuestionId,
+  IN  UINT8                                  Type,
+  IN  EFI_IFR_TYPE_VALUE                     *Value,
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
+  );
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         - A null-terminated Unicode string in <ConfigRequest> 
format.
+  @param Progress        - On return, points to a character in the Request 
string.
+                         Points to the string's null terminator if request was 
successful.
+                         Points to the most recent '&' before the first 
failing name/value
+                         pair (or the beginning of the string if the failure 
is in the
+                         first name/value pair) if the request was not 
successful.
+  @param Results         - A null-terminated Unicode string in <ConfigAltResp> 
format which
+                         has all values filled in for the names in the Request 
string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_SUCCESS            The Results is filled with the requested 
values.
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
+  @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown 
name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootOptionExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT EFI_STRING                             *Progress,
+  OUT EFI_STRING                             *Results
+  );
+
+/**
+  This function processes the results of changes in configuration.
+
+
+  @param This            - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Configuration   - A null-terminated Unicode string in <ConfigResp> 
format.
+  @param Progress        - A pointer to a string filled in with the offset of 
the most
+                         recent '&' before the first failing name/value pair 
(or the
+                         beginning of the string if the failure is in the first
+                         name/value pair) or the terminating NULL if all was 
successful.
+
+  @retval  EFI_SUCCESS            The Results is processed successfully.
+  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+LegacyBootOptionRouteConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Configuration,
+  OUT EFI_STRING                             *Progress
+  );
+
+#endif
diff --git 
a/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf
new file mode 100644
index 0000000..d2ac07e
--- /dev/null
+++ 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf
@@ -0,0 +1,68 @@
+## @file
+#
+#  
+#  Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
+#  This software and associated documentation (if any) is furnished
+#  under a license and may only be used or copied in accordance
+#  with the terms of the license. Except as permitted by such
+#  license, no part of this software or documentation may be
+#  reproduced, stored in a retrieval system, or transmitted in any
+#  form or by any means without the express written consent of
+#  Intel Corporation.
+#  
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = LegacyBootMaintUiLib
+  FILE_GUID                      = e6f7f038-3ed9-401a-af1f-5ea7bf644d34
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION
+  CONSTRUCTOR                    = LegacyBootMaintUiLibConstructor
+  DESTRUCTOR                     = LegacyBootMaintUiLibDestructor
+#
+# The following information is for reference only and not required by the 
build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources]
+  LegacyBootMaintUiVfr.h
+  LegacyBootMaintUi.h
+  LegacyBootMaintUiVfr.Vfr
+  LegacyBootMaintUiStrings.uni
+  LegacyBootMaintUi.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
+  IntelFrameworkPkg/IntelFrameworkPkg.dec
+
+[LibraryClasses]
+  DevicePathLib
+  BaseLib
+  UefiRuntimeServicesTableLib
+  UefiBootServicesTableLib
+  DebugLib
+  HiiLib
+  MemoryAllocationLib
+  UefiBootManagerLib
+  UefiLib
+  PrintLib
+  BaseMemoryLib
+
+[Guids]
+  gEfiIfrTianoGuid
+  gEfiIfrBootMaintenanceGuid
+  gEfiLegacyDevOrderVariableGuid
+
+[Protocols]
+  gEfiHiiConfigAccessProtocolGuid               ## PROTOCOL CONSUMES
+  gEfiLegacyBiosProtocolGuid
+  gEfiHiiConfigRoutingProtocolGuid
+
+[Depex]
+  gEfiHiiDatabaseProtocolGuid
+
diff --git 
a/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiStrings.uni
 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiStrings.uni
new file mode 100644
index 
0000000000000000000000000000000000000000..311df4b7fd5e1ae83d10e1d1fee88287d39b2196
GIT binary patch
literal 6318
zcmdT|+iuf95S`~r{DalL0HQ5IJn#UBCTS=ly{HM5c&ggm8mYO+PAK_e{sK5>r<+|{
zo5ppMMv;~5dM`6)&YWG_`|t0*@Oq6ak}uMcp4>`XUdWbdkI?GZd0&^Y#27b_F78?w
z%~=Ed#`q0UOVHjyEk;?wh(yj{^$Pvk+Mo6J(bq=%UdoH_u?#ySnHrB>xxv^-UP@D5
zp?oKAalJ=vcXszd-k|;sD8{gSi#jdDu)%*~P>g%%IY2*0FdDT@<T2(ERV=^o-vYLe
zh~iv6r!Y2vrDq~dV7UXkcd*X65y}DPu}p9cfwpHn(;69L%S8GZOOy^1BkRGIT9}#`
z)kg>8V~pnAjX~veG%@~&m@^~9)Po0FXB-YsAH7rDGe@_kc5V76W*o6;&YCDku%URF
zTiR&iVt)(ufwAvnxWo7{utnydUdexqD9I@qay@B$%*3JmHWo*iMPHmVx}Q(Gv_*W^
z26X~9n(*cOPurvh2JlKN%nGeK4D<4)(La<Q%OH94y)*A4_!$Bvu@NmXB=AhDX(m-;
zx{BIR*_BaYg4j5|4bC`M(Qp*`PSENzVY4#8EFXzmVLD$KqXlN3np0~L^r{&f0x|hv
z_L#Rea=}=*3YdpG)U9VKfhtgCQN7Bmk08(5<M^!^Ztgz&re$9~$&P8~h#l}kv|X^t
zU52|4@eQ!ve_$VqWE;w1KeNx3v2Est=XDUru2iv-Ij?%p>mPXFT%D<2nFY7Q)un+s
zmr{eTuh=un@)LI@ImOjL?F_xAa*VQJ@F`0B@32hZsSEV!2#BSI)-HORCPyXkJ2cFm
zA`f=IVkVAF?2~(}*28kj5Kf=5;y8D}?qm2o0?#$D8ICK2(^mv>9vjst+uRfRM05OJ
z&-mpo=ku#;it9jkh?Y?Sp8_$S0;-TOs-mr-XtJ!YGMah0sY21`;PDdcq=xz#uC(eK
zc*Zu&nsBj)qRHl_4mP=Kq%~hfj+hNT=_9FlyhrfPXAX0)t_(aKb8((St6|kVuTSew
zVcMcz%=Hm=@pGuG0u9&Ydulh&>bf}BSudNS>&N1L8sAxcKL_7dDQ@RlMlFOqyO)Rc
zou6@wd@<)`s9WDl{CAbCx;5?)@_hTY^Rg-G&X2e#$5}-`2gg<y%h0j25z<9IMdxAJ
zVqVPi3El|#rtRLj!#XDN5axVZRxg{P<9uj~a2wX|YPq#qaN1i&Eu@8f`d!4X#k-i_
z6101<a_y>@P0?;Xv_-gGg?1OAwOUw)Vx5iR+Rcl19>4tZt3b6p^C%17O-^v`afrKz
zPC7z(v-@rtU)Fk_!&8v-SDt_BVZZm*$81rg^ElNnjRQQvc#4!gOCsAB_!cRnbPCA#
WEUTEaiYuIq@|2^swr}L;!0{h?qi#O{

literal 0
HcmV?d00001

diff --git 
a/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.Vfr 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.Vfr
new file mode 100644
index 0000000..d4ac5a0
--- /dev/null
+++ 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.Vfr
@@ -0,0 +1,74 @@
+///** @file
+//  
+//    Browser formset.
+//  
+//  Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
+//  This software and associated documentation (if any) is furnished
+//  under a license and may only be used or copied in accordance
+//  with the terms of the license. Except as permitted by such
+//  license, no part of this software or documentation may be
+//  reproduced, stored in a retrieval system, or transmitted in any
+//  form or by any means without the express written consent of
+//  Intel Corporation.
+
+
+//**/
+
+#include "LegacyBootMaintUiVfr.h"
+
+
+formset
+  guid      = LEGACY_BOOT_OPTION_FORMSET_GUID,
+  title     = STRING_TOKEN(STR_LEGACY_BOOT_PROMPT),
+  help      = STRING_TOKEN(STR_LEGACY_BOOT_HELP),
+  classguid = EFI_IFR_BOOT_MAINTENANCE_GUID,
+  
+  varstore LEGACY_BOOT_NV_DATA,
+    varid = VARSTORE_ID_LEGACY_BOOT,
+    name = LegacyBootData,
+    guid = LEGACY_BOOT_OPTION_FORMSET_GUID;
+    
+  form formid = LEGACY_BOOT_FORM_ID,
+       title  = STRING_TOKEN(STR_LEGACY_BOOT_PROMPT);
+       
+    goto LEGACY_ORDER_CHANGE_FORM_ID,
+         prompt = STRING_TOKEN(STR_FORM_FLOPPY_BOOT_TITLE),
+         help = STRING_TOKEN(STR_FORM_FLOPPY_BOOT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_FLOPPY_BOOT_ID;
+
+    goto LEGACY_ORDER_CHANGE_FORM_ID,
+         prompt = STRING_TOKEN(STR_FORM_HARDDISK_BOOT_TITLE),
+         help = STRING_TOKEN(STR_FORM_HARDDISK_BOOT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_HARDDISK_BOOT_ID;
+
+    goto LEGACY_ORDER_CHANGE_FORM_ID,
+         prompt = STRING_TOKEN(STR_FORM_CDROM_BOOT_TITLE),
+         help = STRING_TOKEN(STR_FORM_CDROM_BOOT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_CDROM_BOOT_ID;
+
+    goto LEGACY_ORDER_CHANGE_FORM_ID,
+         prompt = STRING_TOKEN(STR_FORM_NET_BOOT_TITLE),
+         help = STRING_TOKEN(STR_FORM_NET_BOOT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_NET_BOOT_ID;
+
+    goto LEGACY_ORDER_CHANGE_FORM_ID,
+         prompt = STRING_TOKEN(STR_FORM_BEV_BOOT_TITLE),
+         help = STRING_TOKEN(STR_FORM_BEV_BOOT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_BEV_BOOT_ID;
+         
+  endform;
+
+  form formid = LEGACY_ORDER_CHANGE_FORM_ID,
+       title  = STRING_TOKEN(STR_ORDER_CHANGE_PROMPT);
+       
+       label FORM_BOOT_LEGACY_DEVICE_ID;
+       label FORM_BOOT_LEGACY_LABEL_END;
+         
+  endform;
+
+endformset;
diff --git 
a/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.h 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.h
new file mode 100644
index 0000000..e421aab
--- /dev/null
+++ 
b/IntelFrameworkModulePkg/Library/LegacyBootMaintUiLib/LegacyBootMaintUiVfr.h
@@ -0,0 +1,84 @@
+/** @file
+  The platform boot manager reference implement
+
+  Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
+  This software and associated documentation (if any) is furnished
+  under a license and may only be used or copied in accordance
+  with the terms of the license. Except as permitted by such
+  license, no part of this software or documentation may be
+  reproduced, stored in a retrieval system, or transmitted in any
+  form or by any means without the express written consent of
+  Intel Corporation.
+
+**/
+
+#ifndef _EFI_LEGACY_BOOT_OPTION_VFR_H_
+#define _EFI_LEGACY_BOOT_OPTION_VFR_H_
+
+#include <Guid/HiiBootMaintenanceFormset.h>
+
+#define MAX_MENU_NUMBER 100
+
+#define LEGACY_BOOT_OPTION_FORMSET_GUID  { 0x6bc75598, 0x89b4, 0x483d, 0x91, 
0x60, 0x7f, 0x46, 0x9a, 0x96, 0x35, 0x31 }
+
+#define VARSTORE_ID_LEGACY_BOOT      0x0001
+
+
+#define LEGACY_BOOT_FORM_ID          0x1000
+#define LEGACY_ORDER_CHANGE_FORM_ID  0x1001
+
+
+#define FORM_FLOPPY_BOOT_ID          0x2000
+#define FORM_HARDDISK_BOOT_ID        0x2001
+#define FORM_CDROM_BOOT_ID           0x2002
+#define FORM_NET_BOOT_ID             0x2003
+#define FORM_BEV_BOOT_ID             0x2004
+
+
+
+#define FORM_BOOT_LEGACY_DEVICE_ID   0x9000
+#define FORM_BOOT_LEGACY_LABEL_END   0x9001
+
+
+#pragma pack(1)
+
+///
+/// This is the structure that will be used to store the
+/// question's current value. Use it at initialize time to
+/// set default value for each question. When using at run
+/// time, this map is returned by the callback function,
+/// so dynamically changing the question's value will be
+/// possible through this mechanism
+///
+typedef struct {
+  //
+  // Legacy Device Order Selection Storage
+  //
+  UINT16   LegacyFD[MAX_MENU_NUMBER];
+  UINT16   LegacyHD[MAX_MENU_NUMBER];
+  UINT16   LegacyCD[MAX_MENU_NUMBER];
+  UINT16   LegacyNET[MAX_MENU_NUMBER];
+  UINT16   LegacyBEV[MAX_MENU_NUMBER];
+} LEGACY_BOOT_NV_DATA;
+
+///
+/// This is the structure that will be used to store the
+/// question's current value. Use it at initialize time to
+/// set default value for each question. When using at run
+/// time, this map is returned by the callback function,
+/// so dynamically changing the question's value will be
+/// possible through this mechanism
+///
+typedef struct {
+  //
+  // Legacy Device Order Selection Storage
+  //
+  LEGACY_BOOT_NV_DATA   InitialNvData;
+  LEGACY_BOOT_NV_DATA   CurrentNvData;
+  LEGACY_BOOT_NV_DATA   LastTimeNvData;
+  UINT8                 DisableMap[32];
+} LEGACY_BOOT_MAINTAIN_DATA;
+
+#pragma pack()
+
+#endif
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to