]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Support RouteConfig function for BdsDxe driver.
authorEric Dong <eric.dong@intel.com>
Wed, 18 Jun 2014 02:19:50 +0000 (02:19 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 18 Jun 2014 02:19:50 +0000 (02:19 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Gao, Liming <liming,gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15563 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BmLib.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.h
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootOption.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/ConsoleOption.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FE.vfr
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FormGuid.h
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Variable.c
IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c

index 5fe5388f9e5add1f31b45f2517a129da23034718..4424831859bdcfadae5efa233f048a3f5924f680 100644 (file)
@@ -378,3 +378,34 @@ EfiLibStrFromDatahub (
 {\r
   return NULL;\r
 }\r
+\r
+/**\r
+\r
+  Find the first instance of this Protocol\r
+  in the system and return it's interface.\r
+\r
+\r
+  @param ProtocolGuid    Provides the protocol to search for\r
+  @param Interface       On return, a pointer to the first interface\r
+                         that matches ProtocolGuid\r
+\r
+  @retval  EFI_SUCCESS      A protocol instance matching ProtocolGuid was found\r
+  @retval  EFI_NOT_FOUND    No protocol instances were found that match ProtocolGuid\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibLocateProtocol (\r
+  IN  EFI_GUID    *ProtocolGuid,\r
+  OUT VOID        **Interface\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  ProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) Interface\r
+                  );\r
+  return Status;\r
+}\r
+\r
index b974a67ea53402b4c8a850278858b6ff1c680ed1..6f5b56ec8afc09be79fb4f6d247e305e5b1feebc 100644 (file)
@@ -74,6 +74,7 @@ HII_VENDOR_DEVICE_PATH  mFeHiiVendorDevicePath = {
 \r
 CHAR16  mBootMaintStorageName[]     = L"BmmData";\r
 CHAR16  mFileExplorerStorageName[]  = L"FeData";\r
+BMM_CALLBACK_DATA *mBmmCallbackInfo = NULL;\r
 \r
 /**\r
   Init all memu.\r
@@ -95,6 +96,66 @@ FreeAllMenu (
   VOID\r
   );\r
 \r
+/**\r
+  Initialize all of BMM configuration data in BmmFakeNvData and BmmOldFakeNVData member\r
+  in BMM context data and create all of dynamic OP code for BMM.\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
+  //\r
+  // Initialize data which located in BMM main page\r
+  //\r
+  CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\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
+  GetLegacyDeviceOrder (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
+  //\r
+  // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
+  //\r
+  CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
+}\r
+\r
 /**\r
   Create string tokens for a menu from its help strings and display strings\r
 \r
@@ -241,6 +302,353 @@ BootMaintExtractConfig (
   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, &gBootMaintFormSetGuid, mBootMaintStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiConfigRoutingProtocolGuid, \r
+                  NULL, \r
+                  &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->LegacyFD, OldBmmData->LegacyFD, sizeof (NewBmmData->LegacyFD)) != 0) {\r
+    Var_UpdateBBSOption (Private, FORM_SET_FD_ORDER_ID);\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->LegacyHD, OldBmmData->LegacyHD, sizeof (NewBmmData->LegacyHD)) != 0) {\r
+    Var_UpdateBBSOption (Private, FORM_SET_HD_ORDER_ID);\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->LegacyCD, OldBmmData->LegacyCD, sizeof (NewBmmData->LegacyCD)) != 0) {\r
+    Var_UpdateBBSOption (Private, FORM_SET_CD_ORDER_ID);\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->LegacyNET, OldBmmData->LegacyNET, sizeof (NewBmmData->LegacyNET)) != 0) {\r
+    Var_UpdateBBSOption (Private, FORM_SET_NET_ORDER_ID);\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->LegacyBEV, OldBmmData->LegacyBEV, sizeof (NewBmmData->LegacyBEV)) != 0) {\r
+    Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID);\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
+    }\r
+\r
+    Var_DelBootOption ();\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
+    }\r
+    Var_DelDriverOption ();\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {  \r
+    Status = Var_UpdateBootOrder (Private);\r
+  }\r
+\r
+  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
+    Status = Var_UpdateDriverOrder (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
+    //\r
+    // Bugbug: code not exit in UiApp but in IntelFrameworkModulePkg, need do more check.\r
+    //\r
+    Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut; \r
+  }\r
+\r
+  if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) {\r
+    Status = Var_UpdateBootNext (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
+  //\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
+\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
+\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
+\r
+    Var_UpdateErrorOutOption ();\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
+  Create GoTo OP code into FORM_BOOT_LEGACY_DEVICE label for legacy boot option.\r
+\r
+**/\r
+EFI_STATUS\r
+InitializeLegacyBootOption (\r
+  VOID\r
+  )\r
+{\r
+  RefreshUpdateData ();\r
+  mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID;\r
+  \r
+  //\r
+  // If LegacyBios Protocol is installed, add 3 tags about legacy boot option\r
+  // in BootOption form: legacy FD/HD/CD/NET/BEV\r
+  //\r
+  HiiCreateGotoOpCode (\r
+    mStartOpCodeHandle,\r
+    FORM_SET_FD_ORDER_ID,\r
+    STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
+    STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
+    EFI_IFR_FLAG_CALLBACK,\r
+    FORM_SET_FD_ORDER_ID\r
+    );\r
+\r
+  HiiCreateGotoOpCode (\r
+    mStartOpCodeHandle,\r
+    FORM_SET_HD_ORDER_ID,\r
+    STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
+    STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
+    EFI_IFR_FLAG_CALLBACK,\r
+    FORM_SET_HD_ORDER_ID\r
+    );\r
+\r
+  HiiCreateGotoOpCode (\r
+    mStartOpCodeHandle,\r
+    FORM_SET_CD_ORDER_ID,\r
+    STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
+    STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
+    EFI_IFR_FLAG_CALLBACK,\r
+    FORM_SET_CD_ORDER_ID\r
+    );\r
+\r
+  HiiCreateGotoOpCode (\r
+    mStartOpCodeHandle,\r
+    FORM_SET_NET_ORDER_ID,\r
+    STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
+    STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
+    EFI_IFR_FLAG_CALLBACK,\r
+    FORM_SET_NET_ORDER_ID\r
+    );\r
+\r
+  HiiCreateGotoOpCode (\r
+    mStartOpCodeHandle,\r
+    FORM_SET_BEV_ORDER_ID,\r
+    STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
+    STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
+    EFI_IFR_FLAG_CALLBACK,\r
+    FORM_SET_BEV_ORDER_ID\r
+    );\r
+  \r
+  HiiUpdateForm (\r
+    mBmmCallbackInfo->BmmHiiHandle,\r
+    &gBootMaintFormSetGuid,\r
+    FORM_BOOT_SETUP_ID,\r
+    mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID\r
+    mEndOpCodeHandle    // LABEL_END\r
+    );\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This function processes the results of changes in configuration.\r
 \r
@@ -286,6 +694,20 @@ BootMaintCallback (
   UINT8             *OldLegacyDev;\r
   UINT8             *NewLegacyDev;\r
   UINT8             *DisMap;\r
+  EFI_LEGACY_BIOS_PROTOCOL    *LegacyBios;\r
+\r
+  Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
+  if (Action == EFI_BROWSER_ACTION_FORM_OPEN && QuestionId == FORM_BOOT_SETUP_ID) {\r
+    //\r
+    // Initilize Form for legacy boot option.\r
+    //\r
+    Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID **) &LegacyBios);\r
+    if (!EFI_ERROR (Status)) {\r
+      InitializeLegacyBootOption ();\r
+    }\r
+    \r
+    return EFI_SUCCESS;\r
+  }\r
 \r
   if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {    \r
     //\r
@@ -636,16 +1058,16 @@ ApplyChangeHandler (
   case FORM_SET_CD_ORDER_ID:\r
   case FORM_SET_NET_ORDER_ID:\r
   case FORM_SET_BEV_ORDER_ID:\r
-    Var_UpdateBBSOption (Private);\r
+    Var_UpdateBBSOption (Private, FormId);\r
     break;\r
 \r
   case FORM_BOOT_DEL_ID:\r
     for (Index = 0; \r
-         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])))); \r
+         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])))); \r
          Index ++) {\r
       NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
       NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = CurrentFakeNVMap->OptionDel[Index];\r
+      NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
     }\r
 \r
     Var_DelBootOption ();\r
@@ -653,11 +1075,11 @@ ApplyChangeHandler (
 \r
   case FORM_DRV_DEL_ID:\r
     for (Index = 0; \r
-         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])))); \r
+         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])))); \r
          Index++) {\r
       NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
       NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = CurrentFakeNVMap->OptionDel[Index];\r
+      NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
     }\r
 \r
     Var_DelDriverOption ();\r
@@ -692,26 +1114,27 @@ ApplyChangeHandler (
     break;\r
 \r
   case FORM_CON_COM_SETUP_ID:\r
-    NewMenuEntry                      = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
+    Index         = (UINT16)Private->CurrentTerminal;\r
+    NewMenuEntry                      = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
 \r
     ASSERT (NewMenuEntry != NULL);\r
 \r
     NewTerminalContext                = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
 \r
-    NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
-    ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
-    NewTerminalContext->BaudRate      = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
-    NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
-    ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
-    NewTerminalContext->DataBits      = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
-    NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
-    ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
-    NewTerminalContext->StopBits      = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
-    NewTerminalContext->ParityIndex   = CurrentFakeNVMap->COMParity;\r
-    ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0])));\r
-    NewTerminalContext->Parity        = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
-    NewTerminalContext->TerminalType  = CurrentFakeNVMap->COMTerminalType;\r
-    NewTerminalContext->FlowControl   = CurrentFakeNVMap->COMFlowControl;\r
+    NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate[Index];\r
+    ASSERT (CurrentFakeNVMap->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
+    NewTerminalContext->BaudRate      = BaudRateList[CurrentFakeNVMap->COMBaudRate[Index]].Value;\r
+    NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate[Index];\r
+    ASSERT (CurrentFakeNVMap->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
+    NewTerminalContext->DataBits      = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate[Index]].Value;\r
+    NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits[Index];\r
+    ASSERT (CurrentFakeNVMap->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
+    NewTerminalContext->StopBits      = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits[Index]].Value;\r
+    NewTerminalContext->ParityIndex   = CurrentFakeNVMap->COMParity[Index];\r
+    ASSERT (CurrentFakeNVMap->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
+    NewTerminalContext->Parity        = (UINT8) ParityList[CurrentFakeNVMap->COMParity[Index]].Value;\r
+    NewTerminalContext->TerminalType  = CurrentFakeNVMap->COMTerminalType[Index];\r
+    NewTerminalContext->FlowControl   = CurrentFakeNVMap->COMFlowControl[Index];\r
 \r
     ChangeTerminalDevicePath (\r
       &(NewTerminalContext->DevicePath),\r
@@ -728,14 +1151,14 @@ ApplyChangeHandler (
       NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
       NewConsoleContext           = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
       ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
+      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleInCheck[Index];\r
     }\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 = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
+      NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
     }\r
 \r
     Var_UpdateConsoleInpOption ();\r
@@ -746,14 +1169,14 @@ ApplyChangeHandler (
       NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
       NewConsoleContext           = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
       ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
+      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleOutCheck[Index];\r
     }\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  = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
+      NewTerminalContext->IsConOut  = CurrentFakeNVMap->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
     }\r
 \r
     Var_UpdateConsoleOutOption ();\r
@@ -764,14 +1187,14 @@ ApplyChangeHandler (
       NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
       NewConsoleContext           = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
       ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
+      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleErrCheck[Index];\r
     }\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  = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
+      NewTerminalContext->IsStdErr  = CurrentFakeNVMap->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
     }\r
 \r
     Var_UpdateErrorOutOption ();\r
@@ -819,21 +1242,24 @@ DiscardChangeHandler (
 \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->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, sizeof (CurrentFakeNVMap->OptionOrder));\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->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])));\r
+    ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
     for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-      CurrentFakeNVMap->OptionDel[Index] = FALSE;\r
+      CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
     }\r
     break;\r
 \r
   case FORM_DRV_DEL_ID:\r
-    ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])));\r
+    ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
     for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
-      CurrentFakeNVMap->OptionDel[Index] = FALSE;\r
+      CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
     }\r
     break;\r
 \r
@@ -870,109 +1296,78 @@ InitializeBM (
   VOID\r
   )\r
 {\r
-  EFI_LEGACY_BIOS_PROTOCOL    *LegacyBios;\r
   BMM_CALLBACK_DATA           *BmmCallbackInfo;\r
   EFI_STATUS                  Status;\r
-  UINT8                       *Ptr;\r
+  EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
+  UINT32                      Length;\r
+  UINT8                       *Data;\r
 \r
   Status = EFI_SUCCESS;\r
+  BmmCallbackInfo = mBmmCallbackInfo;  \r
+\r
+  BmmCallbackInfo->BmmPreviousPageId             = FORM_MAIN_ID;\r
+  BmmCallbackInfo->BmmCurrentPageId              = FORM_MAIN_ID;\r
+  BmmCallbackInfo->FeCurrentState                = FileExplorerStateInActive;\r
+  BmmCallbackInfo->FeDisplayContext              = FileExplorerDisplayUnknown;\r
 \r
   //\r
-  // Create CallbackData structures for Driver Callback\r
+  // Reinstall String packages to include more new strings.\r
   //\r
-  BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
-  if (BmmCallbackInfo == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
+  \r
   //\r
-  // Create LoadOption in BmmCallbackInfo for Driver Callback\r
+  // String package size\r
   //\r
-  Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
-  if (Ptr == NULL) {\r
-    FreePool (BmmCallbackInfo);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
+  Length = ReadUnaligned32 ((UINT32 *) BdsDxeStrings) - sizeof (UINT32);\r
 \r
   //\r
-  // Initialize Bmm callback data.\r
+  // Add the length of the Package List Header and the terminating Package Header \r
   //\r
-  BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
-  Ptr += sizeof (BM_LOAD_CONTEXT);\r
-\r
-  BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
-  Ptr += sizeof (BM_FILE_CONTEXT);\r
-\r
-  BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
-  Ptr += sizeof (BM_HANDLE_CONTEXT);\r
-\r
-  BmmCallbackInfo->MenuEntry      = (BM_MENU_ENTRY *) Ptr;\r
-\r
-  BmmCallbackInfo->Signature                     = BMM_CALLBACK_DATA_SIGNATURE;\r
-  BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;\r
-  BmmCallbackInfo->BmmConfigAccess.RouteConfig   = FakeRouteConfig;\r
-  BmmCallbackInfo->BmmConfigAccess.Callback      = BootMaintCallback;\r
-  BmmCallbackInfo->BmmPreviousPageId             = FORM_MAIN_ID;\r
-  BmmCallbackInfo->BmmCurrentPageId              = FORM_MAIN_ID;\r
-  BmmCallbackInfo->FeConfigAccess.ExtractConfig  = FakeExtractConfig;\r
-  BmmCallbackInfo->FeConfigAccess.RouteConfig    = FakeRouteConfig;\r
-  BmmCallbackInfo->FeConfigAccess.Callback       = FileExplorerCallback;\r
-  BmmCallbackInfo->FeCurrentState                = FileExplorerStateInActive;\r
-  BmmCallbackInfo->FeDisplayContext              = FileExplorerDisplayUnknown;\r
+  Length += sizeof (EFI_HII_PACKAGE_LIST_HEADER) + sizeof (EFI_HII_PACKAGE_HEADER);\r
+  \r
+  //\r
+  // Allocate the storage for the entire Package List\r
+  //\r
+  PackageListHeader = AllocateZeroPool (Length);\r
 \r
   //\r
-  // Install Device Path Protocol and Config Access protocol to driver handle\r
+  // If the Package List can not be allocated, then return a NULL HII Handle\r
   //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &BmmCallbackInfo->BmmDriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  &mBmmHiiVendorDevicePath,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  &BmmCallbackInfo->BmmConfigAccess,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto Exit;\r
+  if (PackageListHeader == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   //\r
-  // Install Device Path Protocol and Config Access protocol to driver handle\r
+  // Fill in the GUID and Length of the Package List Header\r
   //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &BmmCallbackInfo->FeDriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  &mFeHiiVendorDevicePath,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  &BmmCallbackInfo->FeConfigAccess,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto Exit;\r
-  }\r
+  PackageListHeader->PackageLength = Length;\r
 \r
   //\r
-  // Post our Boot Maint VFR binary to the HII database.\r
+  // Copy String Data into Package list. \r
   //\r
-  BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
-                                    &gBootMaintFormSetGuid,\r
-                                    BmmCallbackInfo->BmmDriverHandle,\r
-                                    BmBin,\r
-                                    BdsDxeStrings,\r
-                                    NULL\r
-                                    );\r
-  ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);\r
+  Data = (UINT8 *)(PackageListHeader + 1);\r
+  Length = ReadUnaligned32 ((UINT32 *) BdsDxeStrings) - sizeof (UINT32);\r
+  CopyMem (Data, (UINT8 *) BdsDxeStrings + sizeof (UINT32), Length);\r
+  \r
+  //\r
+  // Add End type HII package.\r
+  //\r
+  Data += Length;\r
+  ((EFI_HII_PACKAGE_HEADER *) Data)->Type   = EFI_HII_PACKAGE_END;\r
+  ((EFI_HII_PACKAGE_HEADER *) Data)->Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
 \r
   //\r
-  // Post our File Explorer VFR binary to the HII database.\r
+  // Update String package for BM\r
   //\r
-  BmmCallbackInfo->FeHiiHandle = HiiAddPackages (\r
-                                   &gFileExploreFormSetGuid,\r
-                                   BmmCallbackInfo->FeDriverHandle,\r
-                                   FEBin,\r
-                                   BdsDxeStrings,\r
-                                   NULL\r
-                                   );\r
-  ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);\r
+  CopyGuid (&PackageListHeader->PackageListGuid, &gBootMaintFormSetGuid);\r
+  Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, BmmCallbackInfo->BmmHiiHandle, PackageListHeader);\r
+  \r
+  //\r
+  // Update String package for FE.\r
+  //\r
+  CopyGuid (&PackageListHeader->PackageListGuid, &gFileExploreFormSetGuid);\r
+  Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, BmmCallbackInfo->FeHiiHandle, PackageListHeader);\r
+  \r
+  FreePool (PackageListHeader);\r
 \r
   //\r
   // Init OpCode Handle and Allocate space for creation of Buffer\r
@@ -1013,77 +1408,8 @@ InitializeBM (
   CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);\r
   CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);\r
   CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);\r
-\r
-  UpdateBootDelPage (BmmCallbackInfo);\r
-  UpdateDrvDelPage (BmmCallbackInfo);\r
-\r
-  if (TerminalMenu.MenuNumber > 0) {\r
-    BmmCallbackInfo->CurrentTerminal = 0;\r
-    UpdateTerminalPage (BmmCallbackInfo);\r
-  }\r
-\r
-  Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);\r
-  if (!EFI_ERROR (Status)) {\r
-    RefreshUpdateData ();\r
-    mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID;\r
-\r
-    //\r
-    // If LegacyBios Protocol is installed, add 3 tags about legacy boot option\r
-    // in BootOption form: legacy FD/HD/CD/NET/BEV\r
-    //\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_SET_FD_ORDER_ID,\r
-      STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
-      STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      FORM_SET_FD_ORDER_ID\r
-      );\r
-\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_SET_HD_ORDER_ID,\r
-      STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
-      STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      FORM_SET_HD_ORDER_ID\r
-      );\r
-\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_SET_CD_ORDER_ID,\r
-      STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
-      STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      FORM_SET_CD_ORDER_ID\r
-      );\r
-\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_SET_NET_ORDER_ID,\r
-      STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
-      STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      FORM_SET_NET_ORDER_ID\r
-      );\r
-\r
-    HiiCreateGotoOpCode (\r
-      mStartOpCodeHandle,\r
-      FORM_SET_BEV_ORDER_ID,\r
-      STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
-      STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
-      EFI_IFR_FLAG_CALLBACK,\r
-      FORM_SET_BEV_ORDER_ID\r
-      );\r
-    \r
-    HiiUpdateForm (\r
-      BmmCallbackInfo->BmmHiiHandle,\r
-      &gBootMaintFormSetGuid,\r
-      FORM_BOOT_SETUP_ID,\r
-      mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID\r
-      mEndOpCodeHandle    // LABEL_END\r
-      );\r
-  }\r
+  \r
+  InitializeBmmConfig (BmmCallbackInfo);\r
 \r
   //\r
   // Dispatch BMM main formset and File Explorer formset.\r
@@ -1091,13 +1417,10 @@ InitializeBM (
   FormSetDispatcher (BmmCallbackInfo);\r
 \r
   //\r
-  // Remove our IFR data from HII database\r
+  // Clean up.\r
   //\r
-  HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);\r
-  HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);\r
-\r
   CleanUpStringDepository ();\r
-\r
+  \r
   FreeAllMenu ();\r
 \r
 Exit:\r
@@ -1109,34 +1432,10 @@ Exit:
     HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
   }\r
 \r
-  if (BmmCallbackInfo->FeDriverHandle != NULL) {\r
-    gBS->UninstallMultipleProtocolInterfaces (\r
-           BmmCallbackInfo->FeDriverHandle,\r
-           &gEfiDevicePathProtocolGuid,\r
-           &mFeHiiVendorDevicePath,\r
-           &gEfiHiiConfigAccessProtocolGuid,\r
-           &BmmCallbackInfo->FeConfigAccess,\r
-           NULL\r
-           );\r
-  }\r
-\r
-  if (BmmCallbackInfo->BmmDriverHandle != NULL) {\r
-    gBS->UninstallMultipleProtocolInterfaces (\r
-           BmmCallbackInfo->BmmDriverHandle,\r
-           &gEfiDevicePathProtocolGuid,\r
-           &mBmmHiiVendorDevicePath,\r
-           &gEfiHiiConfigAccessProtocolGuid,\r
-           &BmmCallbackInfo->BmmConfigAccess,\r
-           NULL\r
-           );\r
-  }\r
-\r
-  FreePool (BmmCallbackInfo->LoadContext);\r
-  FreePool (BmmCallbackInfo);\r
-\r
   return Status;\r
 }\r
 \r
+\r
 /**\r
   Initialized all Menu Option List.\r
 \r
@@ -1415,3 +1714,159 @@ FormSetDispatcher (
   return Status;\r
 }\r
 \r
+/**\r
+  Intall BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+EFI_STATUS\r
+InitBMPackage (\r
+  VOID\r
+  )\r
+{\r
+  BMM_CALLBACK_DATA           *BmmCallbackInfo;\r
+  EFI_STATUS                  Status;\r
+  UINT8                       *Ptr;\r
+  \r
+  //\r
+  // Create CallbackData structures for Driver Callback\r
+  //\r
+  BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
+  if (BmmCallbackInfo == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\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
+  if (Ptr == NULL) {\r
+    FreePool (BmmCallbackInfo);\r
+    BmmCallbackInfo = NULL;\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  //\r
+  // Initialize Bmm callback data.\r
+  //\r
+  BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
+  Ptr += sizeof (BM_LOAD_CONTEXT);\r
+\r
+  BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
+  Ptr += sizeof (BM_FILE_CONTEXT);\r
+\r
+  BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
+  Ptr += sizeof (BM_HANDLE_CONTEXT);\r
+\r
+  BmmCallbackInfo->MenuEntry      = (BM_MENU_ENTRY *) Ptr;\r
+\r
+  BmmCallbackInfo->Signature                     = BMM_CALLBACK_DATA_SIGNATURE;\r
+  BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;\r
+  BmmCallbackInfo->BmmConfigAccess.RouteConfig   = BootMaintRouteConfig;\r
+  BmmCallbackInfo->BmmConfigAccess.Callback      = BootMaintCallback;\r
+  BmmCallbackInfo->FeConfigAccess.ExtractConfig  = FakeExtractConfig;\r
+  BmmCallbackInfo->FeConfigAccess.RouteConfig    = FileExplorerRouteConfig;\r
+  BmmCallbackInfo->FeConfigAccess.Callback       = FileExplorerCallback;\r
+\r
+  //\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &BmmCallbackInfo->BmmDriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mBmmHiiVendorDevicePath,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  &BmmCallbackInfo->BmmConfigAccess,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &BmmCallbackInfo->FeDriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mFeHiiVendorDevicePath,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  &BmmCallbackInfo->FeConfigAccess,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Post our Boot Maint VFR binary to the HII database.\r
+  //\r
+  BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
+                                    &gBootMaintFormSetGuid,\r
+                                    BmmCallbackInfo->BmmDriverHandle,\r
+                                    BmBin,\r
+                                    BdsDxeStrings,\r
+                                    NULL\r
+                                    );\r
+  ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);\r
+\r
+  //\r
+  // Post our File Explorer VFR binary to the HII database.\r
+  //\r
+  BmmCallbackInfo->FeHiiHandle = HiiAddPackages (\r
+                                   &gFileExploreFormSetGuid,\r
+                                   BmmCallbackInfo->FeDriverHandle,\r
+                                   FEBin,\r
+                                   BdsDxeStrings,\r
+                                   NULL\r
+                                   );\r
+  ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);\r
+  \r
+  mBmmCallbackInfo = BmmCallbackInfo;\r
+  \r
+  return EFI_SUCCESS; \r
+}\r
+\r
+/**\r
+  Remvoe the intalled BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+FreeBMPackage (\r
+  VOID\r
+  )\r
+{\r
+  BMM_CALLBACK_DATA           *BmmCallbackInfo;\r
+\r
+  BmmCallbackInfo = mBmmCallbackInfo;\r
+\r
+  //\r
+  // Remove our IFR data from HII database\r
+  //\r
+  HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);\r
+  HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);\r
+\r
+  if (BmmCallbackInfo->FeDriverHandle != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           BmmCallbackInfo->FeDriverHandle,\r
+           &gEfiDevicePathProtocolGuid,\r
+           &mFeHiiVendorDevicePath,\r
+           &gEfiHiiConfigAccessProtocolGuid,\r
+           &BmmCallbackInfo->FeConfigAccess,\r
+           NULL\r
+           );\r
+  }\r
+\r
+  if (BmmCallbackInfo->BmmDriverHandle != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           BmmCallbackInfo->BmmDriverHandle,\r
+           &gEfiDevicePathProtocolGuid,\r
+           &mBmmHiiVendorDevicePath,\r
+           &gEfiHiiConfigAccessProtocolGuid,\r
+           &BmmCallbackInfo->BmmConfigAccess,\r
+           NULL\r
+           );\r
+  }\r
+\r
+  FreePool (BmmCallbackInfo->LoadContext);\r
+  FreePool (BmmCallbackInfo);\r
+\r
+  mBmmCallbackInfo = NULL; \r
+  \r
+  return;\r
+}\r
+\r
index f9be0308eea3a05bfde64e49dcab8404e1ed7f28..35cb3262a7a003c763d6384c1dd61c254597a9b3 100644 (file)
@@ -168,9 +168,13 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {
 #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 OPTION_ORDER_VAR_OFFSET         VAR_OFFSET (OptionOrder)\r
-#define OPTION_DEL_VAR_OFFSET           VAR_OFFSET (OptionDel)\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
@@ -206,9 +210,13 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {
 #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 OPTION_ORDER_QUESTION_ID        QUESTION_ID (OptionOrder)\r
-#define OPTION_DEL_QUESTION_ID          QUESTION_ID (OptionDel)\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
@@ -939,7 +947,8 @@ Var_UpdateDriverOrder (
 **/\r
 EFI_STATUS\r
 Var_UpdateBBSOption (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
+  IN BMM_CALLBACK_DATA            *CallbackData,\r
+  IN EFI_FORM_ID                  FormId\r
   );\r
 \r
 /**\r
@@ -1247,23 +1256,6 @@ EfiLibStrFromDatahub (
   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
   Initialize the Boot Maintenance Utitliy.\r
 \r
@@ -1445,6 +1437,47 @@ FileExplorerCallback (
   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\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
+FileExplorerRouteConfig (\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+  IN CONST EFI_STRING                     Configuration,\r
+  OUT EFI_STRING                          *Progress\r
+  );\r
+\r
 /**\r
   Dispatch BMM formset and FileExplorer formset.\r
 \r
@@ -1478,6 +1511,129 @@ EfiLibGetVariable (
   IN EFI_GUID             *VendorGuid\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
+  Intall BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+EFI_STATUS\r
+InitBMPackage (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Remvoe the intalled BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+FreeBMPackage (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  According to LegacyDevOrder variable to get legacy FD\HD\CD\NET\BEV\r
+  devices list .\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+GetLegacyDeviceOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\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
+\r
+  Find the first instance of this Protocol\r
+  in the system and return it's interface.\r
+\r
+\r
+  @param ProtocolGuid    Provides the protocol to search for\r
+  @param Interface       On return, a pointer to the first interface\r
+                         that matches ProtocolGuid\r
+\r
+  @retval  EFI_SUCCESS      A protocol instance matching ProtocolGuid was found\r
+  @retval  EFI_NOT_FOUND    No protocol instances were found that match ProtocolGuid\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibLocateProtocol (\r
+  IN  EFI_GUID    *ProtocolGuid,\r
+  OUT VOID        **Interface\r
+  );\r
+\r
 //\r
 // Global variable in this program (defined in data.c)\r
 //\r
index 37d2350d563753a5839cc468a9224cdec34c55e5..591f884a944b329f4b2059ed81dac3c839e3457c 100644 (file)
@@ -5,7 +5,7 @@
 \r
   Boot option manipulation\r
 \r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, 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
@@ -1621,3 +1621,207 @@ BOpt_GetDriverOptions (
 \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
+  According to LegacyDevOrder variable to get legacy FD\HD\CD\NET\BEV\r
+  devices list .\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+GetLegacyDeviceOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  )\r
+{\r
+  UINTN                     Index;\r
+  UINTN                     OptionIndex;\r
+  UINT16                    PageIdList [] = {FORM_SET_FD_ORDER_ID, FORM_SET_HD_ORDER_ID,\r
+                                             FORM_SET_CD_ORDER_ID, FORM_SET_NET_ORDER_ID,\r
+                                             FORM_SET_BEV_ORDER_ID};\r
+  UINTN                     PageNum;  \r
+  UINTN                     VarSize;\r
+  UINT8                     *VarData;     \r
+  UINT8                     *WorkingVarData; \r
+  LEGACY_DEV_ORDER_ENTRY    *DevOrder;\r
+  UINT16                    VarDevOrder;  \r
+  UINT8                     *DisMap;  \r
+  BM_MENU_OPTION            *OptionMenu;\r
+  BBS_TYPE                  BbsType;\r
+  UINT8                     *LegacyOrder;\r
+  UINT8                     *OldData;  \r
+  UINTN                     Pos;\r
+  UINTN                     Bit;\r
+  \r
+  ASSERT (CallbackData != NULL);\r
+  \r
+  OptionMenu  = NULL;\r
+  BbsType     = 0;\r
+  LegacyOrder = NULL;\r
+  OldData     = NULL;\r
+  DisMap      = ZeroMem (CallbackData->BmmFakeNvData.DisableMap, sizeof (CallbackData->BmmFakeNvData.DisableMap));\r
+  PageNum     = sizeof (PageIdList) / sizeof (PageIdList[0]);\r
+  VarData     = BdsLibGetVariableAndSize (\r
+                  VAR_LEGACY_DEV_ORDER,\r
+                  &gEfiLegacyDevOrderVariableGuid,\r
+                  &VarSize\r
+                  );\r
+\r
+  for (Index = 0; Index < PageNum; Index++) {\r
+    switch (PageIdList[Index]) {\r
+      \r
+    case FORM_SET_FD_ORDER_ID:\r
+      OptionMenu  = (BM_MENU_OPTION *) &LegacyFDMenu;\r
+      BbsType     = BBS_FLOPPY;\r
+      LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
+      OldData     = CallbackData->BmmOldFakeNVData.LegacyFD;\r
+      break;\r
+\r
+    case FORM_SET_HD_ORDER_ID:\r
+      OptionMenu  = (BM_MENU_OPTION *) &LegacyHDMenu;\r
+      BbsType     = BBS_HARDDISK;\r
+      LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
+      OldData     = CallbackData->BmmOldFakeNVData.LegacyHD;\r
+      break;\r
+    \r
+    case FORM_SET_CD_ORDER_ID:\r
+      OptionMenu  = (BM_MENU_OPTION *) &LegacyCDMenu;\r
+      BbsType     = BBS_CDROM;\r
+      LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
+      OldData     = CallbackData->BmmOldFakeNVData.LegacyCD;\r
+      break;\r
+    \r
+    case FORM_SET_NET_ORDER_ID:\r
+      OptionMenu  = (BM_MENU_OPTION *) &LegacyNETMenu;\r
+      BbsType     = BBS_EMBED_NETWORK;\r
+      LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
+      OldData     = CallbackData->BmmOldFakeNVData.LegacyNET;\r
+      break;\r
+    \r
+    case FORM_SET_BEV_ORDER_ID:\r
+      OptionMenu  = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
+      BbsType     = BBS_BEV_DEVICE;\r
+      LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
+      OldData     = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
+      break;\r
+      \r
+    default:\r
+      DEBUG ((DEBUG_ERROR, "Invalid command ID for updating page!\n"));\r
+      break;\r
+    }\r
+    \r
+    if (NULL != VarData) {\r
+      WorkingVarData = VarData;\r
+      DevOrder    = (LEGACY_DEV_ORDER_ENTRY *) WorkingVarData;\r
+      while (WorkingVarData < VarData + VarSize) {\r
+        if (DevOrder->BbsType == BbsType) {\r
+          break;\r
+        }\r
+    \r
+        WorkingVarData += sizeof (BBS_TYPE);\r
+        WorkingVarData += *(UINT16 *) WorkingVarData;\r
+        DevOrder = (LEGACY_DEV_ORDER_ENTRY *) WorkingVarData;\r
+      } \r
+      for (OptionIndex = 0; OptionIndex < OptionMenu->MenuNumber; OptionIndex++) {\r
+        VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + OptionIndex * sizeof (UINT16));\r
+         if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
+          LegacyOrder[OptionIndex]  = 0xFF;\r
+          Pos                       = (VarDevOrder & 0xFF) / 8;\r
+          Bit                       = 7 - ((VarDevOrder & 0xFF) % 8);\r
+          DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
+        } else {\r
+          LegacyOrder[OptionIndex] = (UINT8) (VarDevOrder & 0xFF);\r
+        }\r
+      } \r
+      CopyMem (OldData, LegacyOrder, 100);\r
+    }\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
+  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
index f216b4a03f0c4737bac1b8de5fcdfaf83c1c4c25..1854b98c360fdd45ba00cee2c1c3aa6e5e9e38da 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   handles console redirection from boot manager\r
 \r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, 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
@@ -1049,3 +1049,150 @@ GetConsoleOutMode (
     }\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
index 40fa01baf6dbbe6032de937268a14b23b98a2995..ee181babca96b22cbd52141e8bd6d94884e935fd 100644 (file)
@@ -2,7 +2,7 @@
 //  \r
 //    File Explorer Formset\r
 //  \r
-//  Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>\r
+//  Copyright (c) 2004 - 2014, 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
@@ -43,14 +43,14 @@ formset
 \r
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
 \r
-       string    varid    = FeData.DescriptionData,\r
+       string    varid    = FeData.BootDescriptionData,\r
                  prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
                  minsize  = 6,\r
                  maxsize  = 75,\r
        endstring;\r
 \r
-       string    varid    = FeData.OptionalData,\r
+       string    varid    = FeData.BootOptionalData,\r
                        prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
                        help     = STRING_TOKEN(STR_NULL_STRING),\r
                        minsize  = 0,\r
@@ -83,14 +83,14 @@ formset
 \r
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
 \r
-       string    varid    = FeData.DescriptionData,\r
+       string    varid    = FeData.DriverDescriptionData,\r
                  prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
                  minsize  = 6,\r
                  maxsize  = 75,\r
        endstring;\r
 \r
-       string    varid    = FeData.OptionalData,\r
+       string    varid    = FeData.DriverOptionalData,\r
                  prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
                  minsize  = 0,\r
index 72a5e2daa70ff69b5fa02965f9ac4fd4eb604c57..2d728cbb7f3fc0c7241a0d94c4a28ebb2ff150e4 100644 (file)
@@ -216,6 +216,127 @@ UpdateFileExplorer (
   return ExitFileExplorer;\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
+FileExplorerRouteConfig (\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
+  FILE_EXPLORER_NV_DATA           *FeData;\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, &gFileExploreFormSetGuid, mFileExplorerStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiConfigRoutingProtocolGuid, \r
+                  NULL, \r
+                  &ConfigRouting\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
+  //\r
+  // Get Buffer Storage data from EFI variable\r
+  //\r
+  BufferSize = sizeof (FILE_EXPLORER_NV_DATA );\r
+  FeData = &Private->FeFakeNvData;\r
+\r
+  //\r
+  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
+  //\r
+  Status = ConfigRouting->ConfigToBlock (\r
+                            ConfigRouting,\r
+                            Configuration,\r
+                            (UINT8 *) FeData,\r
+                            &BufferSize,\r
+                            Progress\r
+                            );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (FeData->BootDescriptionData[0] != 0x00 || FeData->BootOptionalData[0] != 0x00) {\r
+    Status = Var_UpdateBootOption (Private, FeData);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    BOpt_GetBootOptions (Private);\r
+    CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
+  }\r
+\r
+  if (FeData->DriverDescriptionData[0] != 0x00 || FeData->DriverOptionalData[0] != 0x00) {\r
+    Status = Var_UpdateDriverOption (\r
+              Private,\r
+              Private->FeHiiHandle,\r
+              FeData->DriverDescriptionData,\r
+              FeData->DriverOptionalData,\r
+              FeData->ForceReconnect\r
+              );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    BOpt_GetDriverOptions (Private);\r
+    CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This function processes the results of changes in configuration.\r
   When user select a interactive opcode, this callback will be triggered.\r
@@ -295,8 +416,8 @@ FileExplorerCallback (
         Status = Var_UpdateDriverOption (\r
                   Private,\r
                   Private->FeHiiHandle,\r
-                  NvRamMap->DescriptionData,\r
-                  NvRamMap->OptionalData,\r
+                  NvRamMap->DriverDescriptionData,\r
+                  NvRamMap->DriverOptionalData,\r
                   NvRamMap->ForceReconnect\r
                   );\r
         if (EFI_ERROR (Status)) {\r
@@ -308,14 +429,21 @@ FileExplorerCallback (
       }\r
 \r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
+    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
+      //\r
+      // Discard changes and exit formset\r
+      //\r
+      NvRamMap->DriverOptionalData[0]     = 0x0000;\r
+      NvRamMap->DriverDescriptionData[0]  = 0x0000;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
       //\r
       // Discard changes and exit formset\r
       //\r
-      NvRamMap->OptionalData[0]     = 0x0000;\r
-      NvRamMap->DescriptionData[0]  = 0x0000;\r
+      NvRamMap->BootOptionalData[0]     = 0x0000;\r
+      NvRamMap->BootDescriptionData[0]  = 0x0000;\r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-    } else if (QuestionId < FILE_OPTION_OFFSET) {\r
+    }else if (QuestionId < FILE_OPTION_OFFSET) {\r
       //\r
       // Exit File Explorer formset\r
       //\r
index f0049a30433c1b165cf0764399c2f63ce0b7c635..6f65307d061089710cc1f2657442a0d2b8529735 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Formset guids, form id and VarStore data structure for Boot Maintenance Manager.\r
 \r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, 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
@@ -137,28 +137,46 @@ typedef struct {
   // At most 100 input/output/errorout device for console storage\r
   //\r
   UINT8   ConsoleCheck[MAX_MENU_NUMBER];\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
+  // Boot 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  OptionOrder[MAX_MENU_NUMBER];\r
+  UINT32  BootOptionOrder[MAX_MENU_NUMBER];\r
+\r
+  //\r
+  // 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  DriverOptionOrder[MAX_MENU_NUMBER];\r
+\r
+  //\r
+  // Boot Option Delete storage\r
+  //\r
+  BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
 \r
   //\r
-  // Boot or Driver Option Delete storage\r
+  // Driver Option Delete storage\r
   //\r
-  BOOLEAN OptionDel[MAX_MENU_NUMBER];\r
+  BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
 \r
   //\r
   // This is the Terminal Attributes value storage\r
   //\r
-  UINT8   COMBaudRate;\r
-  UINT8   COMDataRate;\r
-  UINT8   COMStopBits;\r
-  UINT8   COMParity;\r
-  UINT8   COMTerminalType;\r
-  UINT8   COMFlowControl;\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
   // Legacy Device Order Selection Storage\r
@@ -199,8 +217,10 @@ typedef struct {
 /// This is the data structure used by File Explorer formset\r
 ///\r
 typedef struct {\r
-  UINT16  DescriptionData[75];\r
-  UINT16  OptionalData[127];\r
+  UINT16  BootDescriptionData[75];\r
+  UINT16  BootOptionalData[127];\r
+  UINT16  DriverDescriptionData[75];\r
+  UINT16  DriverOptionalData[127];\r
   UINT8   Active;\r
   UINT8   ForceReconnect;\r
 } FILE_EXPLORER_NV_DATA;\r
index 7317767c005f50e0c4f897fa7aa5334668ae4780..91a38ec702a1e56e0c366db0e4a08d68a924a92e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Dynamically update the pages.\r
 \r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, 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
@@ -254,7 +254,7 @@ UpdateBootDelPage (
   UpdatePageStart (CallbackData);\r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
 \r
-  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0])));\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
@@ -263,13 +263,13 @@ UpdateBootDelPage (
     }\r
 \r
     NewLoadContext->Deleted = FALSE;\r
-    CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;\r
+    //CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
 \r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (OPTION_DEL_VAR_OFFSET + Index),\r
+      (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
@@ -337,19 +337,19 @@ UpdateDrvDelPage (
 \r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
   \r
-  ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0])));\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
-    CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;\r
+    //CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
 \r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (OPTION_DEL_VAR_OFFSET + Index),\r
+      (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
@@ -449,71 +449,57 @@ UpdateConsolePage (
   )\r
 {\r
   BM_MENU_ENTRY       *NewMenuEntry;\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
   UINT16              Index;\r
-  UINT16              Index2;\r
   UINT8               CheckFlags;\r
\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
+  UINT8               *ConsoleCheck;\r
+  EFI_QUESTION_ID     QuestionIdBase;\r
+  UINT16              VariableOffsetBase;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
-  for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
-       (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {\r
-    NewMenuEntry      = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    CheckFlags        = 0;\r
-    if (NewConsoleContext->IsActive) {\r
-      CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
-    } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
-    }\r
+  ConsoleCheck       = NULL;\r
+  QuestionIdBase     = 0;\r
+  VariableOffsetBase = 0;\r
 \r
-    HiiCreateCheckBoxOpCode (\r
-      mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
-      VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
-      NewMenuEntry->DisplayStringToken,\r
-      NewMenuEntry->HelpStringToken,\r
-      0,\r
-      CheckFlags,\r
-      NULL\r
-      );\r
+  switch (UpdatePageId) {\r
+  case FORM_CON_IN_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+    QuestionIdBase     = CON_IN_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_CON_OUT_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+    QuestionIdBase     = CON_OUT_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_CON_ERR_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+    QuestionIdBase     = CON_ERR_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
+    break;\r
   }\r
+  ASSERT (ConsoleCheck != NULL);\r
 \r
-  for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
-       (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {\r
-    CheckFlags          = 0;\r
-    NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
-    NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    ASSERT (Index < MAX_MENU_NUMBER);\r
-    if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
-        ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
-        ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
-        ) {\r
+  for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+    CheckFlags = 0;\r
+    if (UpdatePageId != FORM_CON_ERR_ID) {\r
       CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
-    } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
     }\r
-\r
+    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+      (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
       CheckFlags,\r
       NULL\r
       );\r
-\r
-    Index++;\r
   }\r
 \r
   UpdatePageEnd (CallbackData);\r
@@ -535,68 +521,73 @@ UpdateOrderPage (
   IN BMM_CALLBACK_DATA                *CallbackData\r
   )\r
 {\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  UINT16          Index;\r
-  UINT16          OptionOrderIndex;\r
-  VOID            *OptionsOpCodeHandle;\r
-  UINTN           DeviceType;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\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
-  DeviceType                    = (UINTN) -1;\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
+  \r
+  OptionOrder = NULL;\r
+  QuestionId = 0;\r
+  VarOffset = 0;\r
+  switch (UpdatePageId) { \r
 \r
-  ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, sizeof (CallbackData->BmmFakeNvData.OptionOrder));\r
+  case FORM_BOOT_CHG_ID:\r
+    //GetBootOrder (CallbackData);\r
+    OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
+    QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
+    VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_DRV_CHG_ID:\r
+    //GetDriverOrder (CallbackData);\r
+    OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
+    QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
+    VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
+    break;\r
+  }  \r
+  ASSERT (OptionOrder != NULL);\r
 \r
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
   \r
-  for (\r
-        Index = 0, OptionOrderIndex = 0;\r
-        (\r
-          (Index < OptionMenu->MenuNumber) &&\r
-          (OptionOrderIndex <\r
-            (\r
-              sizeof (CallbackData->BmmFakeNvData.OptionOrder) /\r
-              sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])\r
-            )\r
-          )\r
-        );\r
-        Index++\r
-      ) {\r
-    NewMenuEntry   = BOpt_GetMenuEntry (OptionMenu, 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
+  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
-    HiiCreateOneOfOptionOpCode (\r
-      OptionsOpCodeHandle,\r
-      NewMenuEntry->DisplayStringToken,\r
-      0,\r
-      EFI_IFR_TYPE_NUM_SIZE_32,\r
-      (UINT32) (NewMenuEntry->OptionNumber + 1)\r
-      );\r
-    CallbackData->BmmFakeNvData.OptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\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
+  \r
   if (OptionMenu->MenuNumber > 0) {\r
     HiiCreateOrderedListOpCode (                   \r
       mStartOpCodeHandle,                          // Container for dynamic created opcodes     \r
-      (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID,  // Question ID                               \r
+      QuestionId,                                  // Question ID                               \r
       VARSTORE_ID_BOOT_MAINT,                      // VarStore ID                               \r
-      OPTION_ORDER_VAR_OFFSET,                     // Offset in Buffer Storage                  \r
+      VarOffset,                                   // Offset in Buffer Storage                  \r
       STRING_TOKEN (STR_CHANGE_ORDER),             // Question prompt text                      \r
       STRING_TOKEN (STR_CHANGE_ORDER),             // Question help text                        \r
       0,                                           // Question flag                             \r
@@ -611,12 +602,6 @@ UpdateOrderPage (
   HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
 \r
   UpdatePageEnd (CallbackData);\r
-\r
-  CopyMem (\r
-    CallbackData->BmmOldFakeNVData.OptionOrder,\r
-    CallbackData->BmmFakeNvData.OptionOrder,\r
-    sizeof (CallbackData->BmmOldFakeNVData.OptionOrder)\r
-    );\r
 }\r
 \r
 /**\r
@@ -647,7 +632,7 @@ UpdateBootNextPage (
     OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
     ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-    CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
+    //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
 \r
     for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
       NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
@@ -661,7 +646,7 @@ UpdateBootNextPage (
           EFI_IFR_TYPE_NUM_SIZE_16,\r
           Index\r
           );\r
-        CallbackData->BmmFakeNvData.BootNext = Index;\r
+        //CallbackData->BmmFakeNvData.BootNext = Index;\r
       } else {\r
         HiiCreateOneOfOptionOpCode (\r
           OptionsOpCodeHandle,\r
@@ -751,7 +736,7 @@ UpdateTimeOutPage (
   \r
   HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
 \r
-  CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
+  //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
 \r
   UpdatePageEnd (CallbackData);\r
 }\r
@@ -813,7 +798,7 @@ UpdateConModePage (
   //\r
   // Determin which mode should be the first entry in menu\r
   //\r
-  GetConsoleOutMode (CallbackData);\r
+  // GetConsoleOutMode (CallbackData);\r
 \r
   //\r
   // Build text mode options\r
@@ -891,14 +876,14 @@ UpdateTerminalPage (
   BM_MENU_ENTRY       *NewMenuEntry;\r
   BM_TERMINAL_CONTEXT *NewTerminalContext;\r
   VOID                *OptionsOpCodeHandle;\r
-\r
-  CallbackData->BmmAskSaveOrNot = TRUE;\r
+  UINTN               CurrentTerminal;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
+  CurrentTerminal = CallbackData->CurrentTerminal;\r
   NewMenuEntry = BOpt_GetMenuEntry (\r
                   &TerminalMenu,\r
-                  CallbackData->CurrentTerminal\r
+                  CurrentTerminal\r
                   );\r
 \r
   if (NewMenuEntry == NULL) {\r
@@ -912,12 +897,9 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
+    if (BaudRateList[Index].Value == 115200) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->BaudRateIndex         = Index;\r
-      CallbackData->BmmFakeNvData.COMBaudRate  = NewTerminalContext->BaudRateIndex;\r
     }\r
-\r
     HiiCreateOneOfOptionOpCode (\r
       OptionsOpCodeHandle,\r
       BaudRateList[Index].StringToken,\r
@@ -929,9 +911,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_BAUD_RATE_VAR_OFFSET,\r
+    (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     0,\r
@@ -947,9 +929,7 @@ UpdateTerminalPage (
   for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
     CheckFlags = 0;\r
 \r
-    if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
-      NewTerminalContext->DataBitsIndex         = Index;\r
-      CallbackData->BmmFakeNvData.COMDataRate  = NewTerminalContext->DataBitsIndex;\r
+    if (DataBitsList[Index].Value == 8) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
     }\r
 \r
@@ -964,9 +944,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_DATA_RATE_VAR_OFFSET,\r
+    (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     0,\r
@@ -981,10 +961,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
+    if (ParityList[Index].Value ==  NoParity) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->ParityIndex         = (UINT8) Index;\r
-      CallbackData->BmmFakeNvData.COMParity  = NewTerminalContext->ParityIndex;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -998,9 +976,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_PARITY_VAR_OFFSET,\r
+    (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     0,\r
@@ -1015,10 +993,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
+    if (StopBitsList[Index].Value == OneStopBit) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->StopBitsIndex         = (UINT8) Index;\r
-      CallbackData->BmmFakeNvData.COMStopBits  = NewTerminalContext->StopBitsIndex;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1032,9 +1008,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_STOP_BITS_VAR_OFFSET,\r
+    (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     0,\r
@@ -1049,9 +1025,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < 4; Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->TerminalType == Index) {\r
+    if (Index == 0) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1065,9 +1040,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_TERMINAL_VAR_OFFSET,\r
+    (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     0,\r
@@ -1080,12 +1055,15 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  CallbackData->BmmFakeNvData.COMFlowControl = NewTerminalContext->FlowControl;\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
-      0,\r
+      CheckFlags,\r
       EFI_IFR_TYPE_NUM_SIZE_8,\r
       mFlowControlValue[Index]\r
       );\r
@@ -1093,9 +1071,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_FLOWCONTROL_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_FLOWCONTROL_VAR_OFFSET,\r
+    (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
     STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
     0,\r
@@ -1150,92 +1128,6 @@ UpdatePageBody (
   }\r
 }\r
 \r
-/**\r
-  Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
-  specified by DeviceType.\r
-\r
-  @param DeviceType      The legacy device type. It can be floppy, network, harddisk, cdrom,\r
-                         etc.\r
-  @param OptionIndex     Returns the index number (#### in Boot####).\r
-  @param OptionSize      Return the size of the Boot### variable.\r
-\r
-**/\r
-VOID *\r
-GetLegacyBootOptionVar (\r
-  IN  UINTN                            DeviceType,\r
-  OUT UINTN                            *OptionIndex,\r
-  OUT UINTN                            *OptionSize\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  VOID                      *OptionBuffer;\r
-  UINTN                     OrderSize;\r
-  UINTN                     Index;\r
-  UINT16                    *OrderBuffer;\r
-  CHAR16                    StrTemp[100];\r
-  UINT16                    FilePathSize;\r
-  UINT8                     *Ptr;\r
-  UINT8                     *OptionalData;\r
-\r
-  //\r
-  // Get Boot Option number from the size of BootOrder\r
-  //\r
-  OrderBuffer = BdsLibGetVariableAndSize (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  &OrderSize\r
-                  );\r
-                  \r
-  if (OrderBuffer == NULL) {\r
-    return NULL;\r
-  }\r
-  \r
-  for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {\r
-    UnicodeSPrint (StrTemp, sizeof (StrTemp), L"Boot%04x", OrderBuffer[Index]);\r
-    OptionBuffer = BdsLibGetVariableAndSize (\r
-                    StrTemp,\r
-                    &gEfiGlobalVariableGuid,\r
-                    OptionSize\r
-                    );\r
-    if (NULL == OptionBuffer) {\r
-      continue;\r
-    }\r
-\r
-    Ptr       = (UINT8 *) OptionBuffer;\r
-    Ptr += sizeof (UINT32);\r
-\r
-    FilePathSize = *(UINT16 *) Ptr;\r
-    Ptr += sizeof (UINT16);\r
-\r
-    Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
-    //\r
-    // Now Ptr point to Device Path\r
-    //\r
-    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
-    Ptr += FilePathSize;\r
-\r
-    //\r
-    // Now Ptr point to Optional Data\r
-    //\r
-    OptionalData = Ptr;\r
-\r
-    if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&\r
-        (BBS_DEVICE_PATH == DevicePath->Type) &&\r
-        (BBS_BBS_DP == DevicePath->SubType)\r
-        ) {\r
-      *OptionIndex = OrderBuffer[Index];\r
-      FreePool (OrderBuffer);\r
-      return OptionBuffer;\r
-    } else {\r
-      FreePool (OptionBuffer);\r
-    }\r
-  }\r
-\r
-  FreePool (OrderBuffer);\r
-  return NULL;\r
-}\r
-\r
 /**\r
   Create a dynamic page so that Legacy Device boot order\r
   can be set for specified device type.\r
@@ -1443,6 +1335,7 @@ UpdateSetLegacyDeviceOrderPage (
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
+\r
 /**\r
   Dispatch the display to the next page based on NewPageId.\r
 \r
index 529fdaea2a722ad9454e8b26450126a0af9ebd25..63eeb54ccf886bacc2ebf4e0e709ee44ea178634 100644 (file)
@@ -752,16 +752,16 @@ Var_UpdateBootOption (
   Index = BOpt_GetBootOptionNumber () ;\r
   UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
 \r
-  if (NvRamMap->DescriptionData[0] == 0x0000) {\r
-    StrCpy (NvRamMap->DescriptionData, BootString);\r
+  if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
+    StrCpy (NvRamMap->BootDescriptionData, BootString);\r
   }\r
 \r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData);\r
+  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
   BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
 \r
-  if (NvRamMap->OptionalData[0] != 0x0000) {\r
+  if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
     OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (NvRamMap->OptionalData);\r
+    BufferSize += StrSize (NvRamMap->BootOptionalData);\r
   }\r
 \r
   Buffer = AllocateZeroPool (BufferSize);\r
@@ -791,21 +791,21 @@ Var_UpdateBootOption (
 \r
   CopyMem (\r
     Ptr,\r
-    NvRamMap->DescriptionData,\r
-    StrSize (NvRamMap->DescriptionData)\r
+    NvRamMap->BootDescriptionData,\r
+    StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
-  NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData));\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->DescriptionData)\r
+    StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
-  Ptr += StrSize (NvRamMap->DescriptionData);\r
+  Ptr += StrSize (NvRamMap->BootDescriptionData);\r
   CopyMem (\r
     Ptr,\r
     CallbackData->LoadContext->FilePathList,\r
@@ -838,7 +838,7 @@ Var_UpdateBootOption (
   if (OptionalDataExist) {\r
     Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
 \r
-    CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
+    CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
   }\r
 \r
   Status = gRT->SetVariable (\r
@@ -879,8 +879,8 @@ Var_UpdateBootOption (
       InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
       BootOptionMenu.MenuNumber++;\r
 \r
-      NvRamMap->DescriptionData[0]  = 0x0000;\r
-      NvRamMap->OptionalData[0]     = 0x0000;\r
+      NvRamMap->BootDescriptionData[0]  = 0x0000;\r
+      NvRamMap->BootOptionalData[0]     = 0x0000;\r
     }\r
   }\r
   return EFI_SUCCESS;\r
@@ -983,11 +983,11 @@ Var_UpdateBootOrder (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])));\r
+  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionOrder) / sizeof (CallbackData->BmmFakeNvData.BootOptionOrder[0])));\r
 \r
-  for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.OptionOrder[OrderIndex] != 0); OrderIndex++) {\r
+  for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] != 0); OrderIndex++) {\r
     for (Index = OrderIndex; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
-      if ((BootOrderList[Index] == (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
+      if ((BootOrderList[Index] == (UINT16) (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
         OptionNumber = BootOrderList[Index];\r
         CopyMem (&BootOrderList[OrderIndex + 1], &BootOrderList[OrderIndex], (Index - OrderIndex) * sizeof (UINT16));\r
         BootOrderList[OrderIndex] = OptionNumber;\r
@@ -1065,9 +1065,9 @@ Var_UpdateDriverOrder (
     FreePool (DriverOrderList);\r
   }\r
 \r
-  ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])));\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.OptionOrder[Index] - 1);\r
+    NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] - 1);\r
   }\r
 \r
   Status = gRT->SetVariable (\r
@@ -1100,7 +1100,8 @@ Var_UpdateDriverOrder (
 **/\r
 EFI_STATUS\r
 Var_UpdateBBSOption (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
+  IN BMM_CALLBACK_DATA            *CallbackData,\r
+  IN EFI_FORM_ID                  FormId\r
   )\r
 {\r
   UINTN                       Index;\r
@@ -1129,7 +1130,7 @@ Var_UpdateBBSOption (
   DisMap              = NULL;\r
   NewOrder            = NULL;\r
 \r
-  switch (CallbackData->BmmPreviousPageId) {\r
+  switch (FormId) {\r
     case FORM_SET_FD_ORDER_ID:\r
       OptionMenu            = (BM_MENU_OPTION *) &LegacyFDMenu;\r
       LegacyDev             = CallbackData->BmmFakeNvData.LegacyFD;\r
index 3bbe71a8fe7c0082d80648022f30f4615f3a6c18..aaada9738fb69edcef6213bf0716156f75dae152 100644 (file)
@@ -1144,6 +1144,12 @@ PlatformBdsEnterFrontPage (
     BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
   }\r
 \r
+  //\r
+  // Install BM HiiPackages. \r
+  // Keep BootMaint HiiPackage, so that it can be covered by global setting. \r
+  //\r
+  InitBMPackage ();\r
+\r
   Status = EFI_SUCCESS;\r
   do {\r
     //\r
@@ -1199,10 +1205,20 @@ PlatformBdsEnterFrontPage (
       break;\r
 \r
     case FRONT_PAGE_KEY_BOOT_MANAGER:\r
+      //\r
+      // Remove the installed BootMaint HiiPackages when exit.\r
+      //\r
+      FreeBMPackage ();\r
+\r
       //\r
       // User chose to run the Boot Manager\r
       //\r
       CallBootManager ();\r
+\r
+      //\r
+      // Reinstall BootMaint HiiPackages after exiting from Boot Manager.\r
+      //\r
+      InitBMPackage ();\r
       break;\r
 \r
     case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
@@ -1233,6 +1249,11 @@ PlatformBdsEnterFrontPage (
   //\r
   SetupResetReminder ();\r
 \r
+  //\r
+  // Remove the installed BootMaint HiiPackages when exit.\r
+  //\r
+  FreeBMPackage ();\r
+\r
 Exit:\r
   //\r
   // Automatically load current entry\r