+++ /dev/null
-/** @file\r
-Dynamically update the pages.\r
-\r
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "BootMaint.h"\r
-\r
-/**\r
- Refresh the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-RefreshUpdateData (\r
- VOID\r
- )\r
-{\r
- //\r
- // Free current updated date\r
- //\r
- if (mStartOpCodeHandle != NULL) {\r
- HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
- }\r
-\r
- //\r
- // Create new OpCode Handle\r
- //\r
- mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-\r
- //\r
- // Create Hii Extend Label OpCode as the start opcode\r
- //\r
- mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
- mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-\r
-}\r
-\r
-/**\r
- Add a "Go back to main page" tag in front of the form when there are no\r
- "Apply changes" and "Discard changes" tags in the end of the form.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageStart (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- RefreshUpdateData ();\r
- mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
-\r
- if (!(CallbackData->BmmAskSaveOrNot)) {\r
- //\r
- // Add a "Go back to main page" tag in front of the form when there are no\r
- // "Apply changes" and "Discard changes" tags in the end of the form.\r
- //\r
- HiiCreateGotoOpCode (\r
- mStartOpCodeHandle,\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
- STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
- 0,\r
- FORM_MAIN_ID\r
- );\r
- }\r
-\r
-}\r
-\r
-/**\r
- Create the "Apply changes" and "Discard changes" tags. And\r
- ensure user can return to the main page.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageEnd (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- //\r
- // Create the "Apply changes" and "Discard changes" tags.\r
- //\r
- if (CallbackData->BmmAskSaveOrNot) {\r
- HiiCreateSubTitleOpCode (\r
- mStartOpCodeHandle,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- HiiCreateActionOpCode (\r
- mStartOpCodeHandle,\r
- KEY_VALUE_SAVE_AND_EXIT,\r
- STRING_TOKEN (STR_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0\r
- );\r
- }\r
-\r
- //\r
- // Ensure user can return to the main page.\r
- //\r
- HiiCreateActionOpCode (\r
- mStartOpCodeHandle,\r
- KEY_VALUE_NO_SAVE_AND_EXIT,\r
- STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0\r
- );\r
-\r
- HiiUpdateForm (\r
- CallbackData->BmmHiiHandle,\r
- &gBootMaintFormSetGuid,\r
- CallbackData->BmmCurrentPageId,\r
- mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
- mEndOpCodeHandle // LABEL_END\r
- );\r
-}\r
-\r
-/**\r
- Clean up the dynamic opcode at label and form specified by both LabelId.\r
-\r
- @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-CleanUpPage (\r
- IN UINT16 LabelId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- RefreshUpdateData ();\r
-\r
- //\r
- // Remove all op-codes from dynamic page\r
- //\r
- mStartLabel->Number = LabelId;\r
- HiiUpdateForm (\r
- CallbackData->BmmHiiHandle,\r
- &gBootMaintFormSetGuid,\r
- LabelId,\r
- mStartOpCodeHandle, // Label LabelId\r
- mEndOpCodeHandle // LABEL_END\r
- );\r
-}\r
-\r
-/**\r
- Boot a file selected by user at File Expoloer of BMM.\r
-\r
- @param FileContext The file context data, which contains the device path\r
- of the file to be boot from.\r
-\r
- @retval EFI_SUCCESS The function completed successfull.\r
- @return Other value if the boot from the file fails.\r
-\r
-**/\r
-EFI_STATUS\r
-BootThisFile (\r
- IN BM_FILE_CONTEXT *FileContext\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN ExitDataSize;\r
- CHAR16 *ExitData;\r
- BDS_COMMON_OPTION *Option;\r
-\r
- Option = (BDS_COMMON_OPTION *) AllocatePool (sizeof (BDS_COMMON_OPTION));\r
- ASSERT (Option != NULL);\r
- Option->Description = (CHAR16 *) AllocateCopyPool (StrSize (FileContext->FileName), FileContext->FileName);\r
- Option->DevicePath = FileContext->DevicePath;\r
- Option->LoadOptionsSize = 0;\r
- Option->LoadOptions = NULL;\r
-\r
- //\r
- // Since current no boot from removable media directly is allowed */\r
- //\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
-\r
- ExitDataSize = 0;\r
-\r
- Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);\r
-\r
- return Status;\r
-\r
-}\r
-\r
-/**\r
- Create a list of Goto Opcode for all terminal devices logged\r
- by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateConCOMPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = FALSE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
- HiiCreateGotoOpCode (\r
- mStartOpCodeHandle,\r
- FORM_CON_COM_SETUP_ID,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create a lit of boot option from global BootOptionMenu. It\r
- allow user to delete the boot option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
-\r
- ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewLoadContext->IsLegacy) {\r
- continue;\r
- }\r
-\r
- NewLoadContext->Deleted = FALSE;\r
-\r
- if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
- //\r
- // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
- // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
- // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
- // through HiiSetBrowserData function.\r
- //\r
- CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
- }\r
-\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0,\r
- NULL\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create a lit of driver option from global DriverMenu.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDrvAddHandlePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = FALSE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
-\r
- HiiCreateGotoOpCode (\r
- mStartOpCodeHandle,\r
- FORM_DRV_ADD_HANDLE_DESC_ID,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create a lit of driver option from global DriverOptionMenu. It\r
- allow user to delete the driver option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDrvDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
-\r
- ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
-\r
- if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
- //\r
- // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
- // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
- // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
- // through HiiSetBrowserData function.\r
- //\r
- CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
- }\r
-\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0,\r
- NULL\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Prepare the page to allow user to add description for\r
- a Driver Option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
-\r
- CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
- CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
- NewMenuEntry = CallbackData->MenuEntry;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- HiiCreateSubTitleOpCode (\r
- mStartOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- HiiCreateStringOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
- STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 0,\r
- 0,\r
- 6,\r
- 75,\r
- NULL\r
- );\r
-\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- DRV_ADD_RECON_VAR_OFFSET,\r
- STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
- STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
- 0,\r
- 0,\r
- NULL\r
- );\r
-\r
- HiiCreateStringOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- DRIVER_ADD_OPTION_VAR_OFFSET,\r
- STRING_TOKEN (STR_OPTIONAL_DATA),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 0,\r
- 0,\r
- 6,\r
- 75,\r
- NULL\r
- );\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Update console page.\r
-\r
- @param UpdatePageId The form ID to be updated.\r
- @param ConsoleMenu The console menu list.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateConsolePage (\r
- IN UINT16 UpdatePageId,\r
- IN BM_MENU_OPTION *ConsoleMenu,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
- UINT8 CheckFlags;\r
- UINT8 *ConsoleCheck;\r
- EFI_QUESTION_ID QuestionIdBase;\r
- UINT16 VariableOffsetBase;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- ConsoleCheck = NULL;\r
- QuestionIdBase = 0;\r
- VariableOffsetBase = 0;\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 (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
- }\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (VariableOffsetBase + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- 0,\r
- CheckFlags,\r
- NULL\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Update the page's NV Map if user has changed the order\r
- a list. This list can be Boot Order or Driver Order.\r
-\r
- @param UpdatePageId The form ID to be updated.\r
- @param OptionMenu The new list.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateOrderPage (\r
- IN UINT16 UpdatePageId,\r
- IN BM_MENU_OPTION *OptionMenu,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
- UINT16 OptionIndex;\r
- VOID *OptionsOpCodeHandle;\r
- BOOLEAN BootOptionFound;\r
- UINT32 *OptionOrder;\r
- EFI_QUESTION_ID QuestionId;\r
- UINT16 VarOffset;\r
-\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
- case FORM_BOOT_CHG_ID:\r
- //\r
- // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
- // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.\r
- // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,\r
- // so we should not get the data from BootOptionMenu to show it.\r
- //\r
- if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {\r
- GetBootOrder (CallbackData);\r
- }\r
- OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
- QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
- VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- //\r
- // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
- // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.\r
- // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,\r
- // so we should not get the data from DriverOptionMenu to show it.\r
- //\r
- if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {\r
- GetDriverOrder (CallbackData);\r
- }\r
- OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
- QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
- VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
- break;\r
- }\r
- ASSERT (OptionOrder != NULL);\r
-\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- NewMenuEntry = NULL;\r
- for (OptionIndex = 0; (OptionIndex < MAX_MENU_NUMBER && OptionOrder[OptionIndex] != 0); OptionIndex++) {\r
- BootOptionFound = FALSE;\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
- BootOptionFound = TRUE;\r
- break;\r
- }\r
- }\r
- if (BootOptionFound) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_32,\r
- OptionOrder[OptionIndex]\r
- );\r
- }\r
- }\r
-\r
- if (OptionMenu->MenuNumber > 0) {\r
- HiiCreateOrderedListOpCode (\r
- mStartOpCodeHandle, // Container for dynamic created opcodes\r
- QuestionId, // Question ID\r
- VARSTORE_ID_BOOT_MAINT, // VarStore ID\r
- VarOffset, // Offset in Buffer Storage\r
- STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text\r
- STRING_TOKEN (STR_CHANGE_ORDER), // Question help text\r
- 0, // Question flag\r
- 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
- EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value\r
- 100, // Maximum container\r
- OptionsOpCodeHandle, // Option Opcode list\r
- NULL // Default Opcode is NULL\r
- );\r
- }\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create the dynamic page to allow user to set\r
- the "BootNext" value.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootNextPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINTN NumberOfOptions;\r
- UINT16 Index;\r
- VOID *OptionsOpCodeHandle;\r
-\r
- NumberOfOptions = BootOptionMenu.MenuNumber;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
-\r
- if (NumberOfOptions > 0) {\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
-\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewLoadContext->IsBootNext) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- EFI_IFR_OPTION_DEFAULT,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- Index\r
- );\r
- //CallbackData->BmmFakeNvData.BootNext = Index;\r
- } else {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- Index\r
- );\r
- }\r
- }\r
-\r
- if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NONE),\r
- EFI_IFR_OPTION_DEFAULT,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- Index\r
- );\r
- } else {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NONE),\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- BOOT_NEXT_VAR_OFFSET,\r
- STRING_TOKEN (STR_BOOT_NEXT),\r
- STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_2,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create the dynamic page to allow user to set the "TimeOut" value.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateTimeOutPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT16 BootTimeOut;\r
- VOID *DefaultOpCodeHandle;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
-\r
- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (DefaultOpCodeHandle != NULL);\r
- HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
-\r
- HiiCreateNumericOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- BOOT_TIME_OUT_VAR_OFFSET,\r
- STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
- STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
- 0,\r
- 65535,\r
- 0,\r
- DefaultOpCodeHandle\r
- );\r
-\r
- HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
-\r
- //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Refresh the text mode page.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateConModePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Mode;\r
- UINTN Index;\r
- UINTN Col;\r
- UINTN Row;\r
- CHAR16 ModeString[50];\r
- CHAR16 *PStr;\r
- UINTN MaxMode;\r
- UINTN ValidMode;\r
- EFI_STRING_ID *ModeToken;\r
- EFI_STATUS Status;\r
- VOID *OptionsOpCodeHandle;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
-\r
- ConOut = gST->ConOut;\r
- Index = 0;\r
- ValidMode = 0;\r
- MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- //\r
- // Check valid mode\r
- //\r
- for (Mode = 0; Mode < MaxMode; Mode++) {\r
- Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- ValidMode++;\r
- }\r
-\r
- if (ValidMode == 0) {\r
- return;\r
- }\r
-\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
- ASSERT(ModeToken != NULL);\r
-\r
- //\r
- // Determin which mode should be the first entry in menu\r
- //\r
- // GetConsoleOutMode (CallbackData);\r
-\r
- //\r
- // Build text mode options\r
- //\r
- for (Mode = 0; Mode < MaxMode; Mode++) {\r
- Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- //\r
- // Build mode string Column x Row\r
- //\r
- UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
- PStr = &ModeString[0];\r
- StrCatS (PStr, ARRAY_SIZE (ModeString), L" x ");\r
- PStr = PStr + StrLen (PStr);\r
- UnicodeValueToStringS (\r
- PStr,\r
- sizeof (ModeString) - ((UINTN)PStr - (UINTN)&ModeString[0]),\r
- 0,\r
- Row,\r
- 0\r
- );\r
-\r
- ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
-\r
- if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ModeToken[Index],\r
- EFI_IFR_OPTION_DEFAULT,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- (UINT16) Mode\r
- );\r
- } else {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ModeToken[Index],\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- (UINT16) Mode\r
- );\r
- }\r
- Index++;\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- CON_MODE_VAR_OFFSET,\r
- STRING_TOKEN (STR_CON_MODE_SETUP),\r
- STRING_TOKEN (STR_CON_MODE_SETUP),\r
- EFI_IFR_FLAG_RESET_REQUIRED,\r
- EFI_IFR_NUMERIC_SIZE_2,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- FreePool (ModeToken);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
- Parity, Stop Bits, Terminal Type.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateTerminalPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT8 Index;\r
- UINT8 CheckFlags;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- VOID *OptionsOpCodeHandle;\r
- UINTN CurrentTerminal;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- CurrentTerminal = CallbackData->CurrentTerminal;\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &TerminalMenu,\r
- CurrentTerminal\r
- );\r
-\r
- if (NewMenuEntry == NULL) {\r
- return ;\r
- }\r
-\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
- CheckFlags = 0;\r
- if (BaudRateList[Index].Value == 115200) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- BaudRateList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_BAUD_RATE),\r
- STRING_TOKEN (STR_COM_BAUD_RATE),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
- CheckFlags = 0;\r
-\r
- if (DataBitsList[Index].Value == 8) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- DataBitsList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_DATA_BITS),\r
- STRING_TOKEN (STR_COM_DATA_BITS),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
- CheckFlags = 0;\r
- if (ParityList[Index].Value == NoParity) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ParityList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_PARITY),\r
- STRING_TOKEN (STR_COM_PARITY),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
- CheckFlags = 0;\r
- if (StopBitsList[Index].Value == OneStopBit) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- StopBitsList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_STOP_BITS),\r
- STRING_TOKEN (STR_COM_STOP_BITS),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < 4; Index++) {\r
- CheckFlags = 0;\r
- if (Index == 0) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- (EFI_STRING_ID) TerminalType[Index],\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_TERMI_TYPE),\r
- STRING_TOKEN (STR_COM_TERMI_TYPE),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
- CheckFlags = 0;\r
- if (Index == 0) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- (EFI_STRING_ID) mFlowControlType[Index],\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- mFlowControlValue[Index]\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
- STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Dispatch the correct update page function to call based on\r
- the UpdatePageId.\r
-\r
- @param UpdatePageId The form ID.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageBody (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- CleanUpPage (UpdatePageId, CallbackData);\r
- switch (UpdatePageId) {\r
- case FORM_CON_IN_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-/**\r
- Create a dynamic page so that Legacy Device boot order\r
- can be set for specified device type.\r
-\r
- @param UpdatePageId The form ID. It also spefies the legacy device type.\r
- @param CallbackData The BMM context data.\r
-\r
-\r
-**/\r
-VOID\r
-UpdateSetLegacyDeviceOrderPage (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
- BM_MENU_OPTION *OptionMenu;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- EFI_STRING_ID StrRef;\r
- EFI_STRING_ID StrRefHelp;\r
- BBS_TYPE BbsType;\r
- UINTN VarSize;\r
- UINTN Pos;\r
- UINTN Bit;\r
- UINT16 Index;\r
- UINT16 Key;\r
- CHAR16 String[100];\r
- CHAR16 *TypeStr;\r
- CHAR16 *TypeStrHelp;\r
- UINT16 VarDevOrder;\r
- UINT8 *VarData;\r
- UINT8 *LegacyOrder;\r
- UINT8 *OldData;\r
- UINT8 *DisMap;\r
- VOID *OptionsOpCodeHandle;\r
-\r
- OptionMenu = NULL;\r
- Key = 0;\r
- StrRef = 0;\r
- StrRefHelp = 0;\r
- TypeStr = NULL;\r
- TypeStrHelp = NULL;\r
- BbsType = BBS_FLOPPY;\r
- LegacyOrder = NULL;\r
- OldData = NULL;\r
- DisMap = NULL;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
- UpdatePageStart (CallbackData);\r
-\r
- DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
-\r
- //\r
- // Create oneof option list\r
- //\r
- switch (UpdatePageId) {\r
- case FORM_SET_FD_ORDER_ID:\r
- OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
- Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
- TypeStr = STR_FLOPPY;\r
- TypeStrHelp = STR_FLOPPY_HELP;\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
- Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
- TypeStr = STR_HARDDISK;\r
- TypeStrHelp = STR_HARDDISK_HELP;\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
- Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
- TypeStr = STR_CDROM;\r
- TypeStrHelp = STR_CDROM_HELP;\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
- Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
- TypeStr = STR_NET;\r
- TypeStrHelp = STR_NET_HELP;\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
- Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
- TypeStr = STR_BEV;\r
- TypeStrHelp = STR_BEV_HELP;\r
- BbsType = BBS_BEV_DEVICE;\r
- LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
- OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
- break;\r
-\r
- default:\r
- DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
- return;\r
- }\r
-\r
- CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
-\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- //\r
- // Create OneOf for each legacy device\r
- //\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
- );\r
- }\r
-\r
- //\r
- // Create OneOf for item "Disabled"\r
- //\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- 0xFF\r
- );\r
-\r
- //\r
- // Get Device Order from variable\r
- //\r
- VarData = BdsLibGetVariableAndSize (\r
- VAR_LEGACY_DEV_ORDER,\r
- &gEfiLegacyDevOrderVariableGuid,\r
- &VarSize\r
- );\r
-\r
- if (NULL != VarData) {\r
- DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
- while (VarData < VarData + VarSize) {\r
- if (DevOrder->BbsType == BbsType) {\r
- break;\r
- }\r
-\r
- VarData = (UINT8 *)((UINTN)VarData + sizeof (BBS_TYPE));\r
- VarData += *(UINT16 *) VarData;\r
- DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
- }\r
- //\r
- // Create oneof tag here for FD/HD/CD #1 #2\r
- //\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- //\r
- // Create the string for oneof tag\r
- //\r
- UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
- StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
-\r
- UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
- StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (Key + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
- StrRef,\r
- StrRefHelp,\r
- EFI_IFR_FLAG_CALLBACK,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
-\r
- if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
- LegacyOrder[Index] = 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[Index] = (UINT8) (VarDevOrder & 0xFF);\r
- }\r
- }\r
- }\r
-\r
- CopyMem (OldData, LegacyOrder, 100);\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-\r
-/**\r
- Dispatch the display to the next page based on NewPageId.\r
-\r
- @param Private The BMM context data.\r
- @param NewPageId The original page ID.\r
-\r
-**/\r
-VOID\r
-UpdatePageId (\r
- BMM_CALLBACK_DATA *Private,\r
- UINT16 NewPageId\r
- )\r
-{\r
- //\r
- // For the question don't impact the page update, just ignore it.\r
- //\r
- if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
- ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
- return;\r
- }\r
-\r
- if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
- //\r
- // If we select a handle to add driver option, advance to the add handle description page.\r
- //\r
- NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
- } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
- //\r
- // Return to main page after "Save Changes" or "Discard Changes".\r
- //\r
- NewPageId = FORM_MAIN_ID;\r
- } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
- NewPageId = FORM_CON_COM_SETUP_ID;\r
- }\r
-\r
- if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
- Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
- Private->BmmCurrentPageId = NewPageId;\r
- }\r
-}\r