From 52657feb150f316c79052a0e134cc57cfb6384ae Mon Sep 17 00:00:00 2001 From: tgingold Date: Mon, 12 Feb 2007 23:40:29 +0000 Subject: EdkGenericPlatformBdsLib added git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2368 6f19259b-4bc3-4df7-8a09-765794883524 --- .../BootMaint/UpdatePage.c | 1274 ++++++++++++++++++++ 1 file changed, 1274 insertions(+) create mode 100644 EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/UpdatePage.c (limited to 'EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/UpdatePage.c') diff --git a/EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/UpdatePage.c b/EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/UpdatePage.c new file mode 100644 index 0000000000..dfc12dca93 --- /dev/null +++ b/EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/UpdatePage.c @@ -0,0 +1,1274 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + UpdatePage.c + +AgBStract: + + Dynamically Update the pages + +--*/ + +#include "Bds.h" +#include "BootMaint.h" + +EFI_GUID gTerminalDriverGuid = { + 0x10634d8e, 0x1c05, 0x46cb, {0xbb, 0xc, 0x5a, 0xfd, 0xc8, 0x29, 0xa8, 0xc8} +}; + +VOID +RefreshUpdateData ( + IN BOOLEAN FormSetUpdate, + IN EFI_PHYSICAL_ADDRESS FormCallbackHandle, + IN BOOLEAN FormUpdate, + IN STRING_REF FormTitle, + IN UINT16 DataCount + ) +/*++ +Routine Description: + Refresh the global UpdateData structure. + +Arguments: + FormSetUpdate - If TRUE, next variable is significant + FormCallbackHandle - If not 0, will update FormSet with this info + FormUpdate - If TRUE, next variable is significant + FormTitle - If not 0, will update Form with this info + DataCount - The number of Data entries in this structure + +Returns: + None. +--*/ +{ + UpdateData->FormSetUpdate = FormSetUpdate; + if (FormSetUpdate) { + ASSERT (0 != FormCallbackHandle); + UpdateData->FormCallbackHandle = FormCallbackHandle; + } + + UpdateData->FormUpdate = FALSE; + UpdateData->FormTitle = FormTitle; + UpdateData->DataCount = DataCount; +} + +VOID +UpdatePageStart ( + IN BMM_CALLBACK_DATA *CallbackData, + IN OUT UINT8 **CurrentLocation + ) +{ + RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->BmmCallbackHandle, FALSE, 0, 0); + + if (!(CallbackData->BmmAskSaveOrNot)) { + // + // Add a "Go back to main page" tag in front of the form when there are no + // "Apply changes" and "Discard changes" tags in the end of the form. + // + CreateGotoOpCode ( + FORM_MAIN_ID, + STRING_TOKEN (STR_FORM_GOTO_MAIN), + STRING_TOKEN (STR_FORM_GOTO_MAIN), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + FORM_MAIN_ID, + *CurrentLocation + ); + + UpdateData->DataCount++; + + *CurrentLocation = *CurrentLocation + ((EFI_IFR_OP_HEADER *) (*CurrentLocation))->Length; + } + +} + +VOID +UpdatePageEnd ( + IN BMM_CALLBACK_DATA *CallbackData, + IN UINT8 *CurrentLocation + ) +{ + // + // Create the "Apply changes" and "Discard changes" tags. + // + if (CallbackData->BmmAskSaveOrNot) { + CreateGotoOpCode ( + FORM_MAIN_ID, + STRING_TOKEN (STR_SAVE_AND_EXIT), + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_SAVE_AND_EXIT, + CurrentLocation + ); + + UpdateData->DataCount++; + + CurrentLocation = CurrentLocation + ((EFI_IFR_OP_HEADER *) CurrentLocation)->Length; + + CreateGotoOpCode ( + FORM_MAIN_ID, + STRING_TOKEN (STR_NO_SAVE_AND_EXIT), + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_NO_SAVE_AND_EXIT, + CurrentLocation + ); + + UpdateData->DataCount++; + } + // + // Ensure user can return to the main page. + // + if (0 == UpdateData->DataCount) { + CreateGotoOpCode ( + FORM_MAIN_ID, + STRING_TOKEN (STR_NO_SAVE_AND_EXIT), + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_NO_SAVE_AND_EXIT, + CurrentLocation + ); + + UpdateData->DataCount++; + } + + CallbackData->Hii->UpdateForm ( + CallbackData->Hii, + CallbackData->BmmHiiHandle, + CallbackData->BmmCurrentPageId, + TRUE, + UpdateData + ); +} + +VOID +CleanUpPage ( + IN EFI_FORM_LABEL LabelId, + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + RefreshUpdateData (FALSE, 0, FALSE, 0, 0xff); + + // + // Remove all op-codes from dynamic page + // + CallbackData->Hii->UpdateForm ( + CallbackData->Hii, + CallbackData->BmmHiiHandle, + LabelId, + FALSE, + UpdateData + ); +} + +EFI_STATUS +BootThisFile ( + IN BM_FILE_CONTEXT *FileContext + ) +{ + EFI_STATUS Status; + UINTN ExitDataSize; + CHAR16 *ExitData; + BDS_COMMON_OPTION *Option; + + Status = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID**) &Option); + Option->Description = FileContext->FileName; + Option->DevicePath = FileContext->DevicePath; + Option->LoadOptionsSize = 0; + Option->LoadOptions = NULL; + + // + // Since current no boot from removable media directly is allowed */ + // + gST->ConOut->ClearScreen (gST->ConOut); + + ExitDataSize = 0; + + Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData); + + return Status; + +} + +VOID +UpdateConCOMPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + UINT16 Index; + UINT8 *Location; + EFI_STATUS Status; + VOID *Interface; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = FALSE; + + UpdatePageStart (CallbackData, &Location); + + Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface); + if (!EFI_ERROR (Status)) { + for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); + + CreateGotoOpCode ( + FORM_CON_COM_SETUP_ID, + NewMenuEntry->DisplayStringToken, + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + (UINT16) (TERMINAL_OPTION_OFFSET + Index), + Location + ); + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + } + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateBootDelPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + UINT16 Index; + UINT8 *Location; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); + + for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + if (NewLoadContext->IsLegacy) { + continue; + } + + NewLoadContext->Deleted = FALSE; + CallbackData->BmmFakeNvData->BootOptionDel[Index] = 0x00; + + CreateCheckBoxOpCode ( + (UINT16) (BOOT_OPTION_DEL_QUESTION_ID + Index), + (UINT8) 1, + NewMenuEntry->DisplayStringToken, + NewMenuEntry->HelpStringToken, + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + (UINT16) BOOT_OPTION_DEL_QUESTION_ID, + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateDrvAddHandlePage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + UINT16 Index; + UINT8 *Location; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = FALSE; + + UpdatePageStart (CallbackData, &Location); + + for (Index = 0; Index < DriverMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index); + + CreateGotoOpCode ( + FORM_DRV_ADD_HANDLE_DESC_ID, + NewMenuEntry->DisplayStringToken, + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + (UINT16) (HANDLE_OPTION_OFFSET + Index), + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateDrvDelPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + UINT16 Index; + UINT8 *Location; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + + CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu); + + for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); + + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + NewLoadContext->Deleted = FALSE; + CallbackData->BmmFakeNvData->DriverOptionDel[Index] = 0x00; + + CreateCheckBoxOpCode ( + (UINT16) (DRIVER_OPTION_DEL_QUESTION_ID + Index), + (UINT8) 1, + NewMenuEntry->DisplayStringToken, + NewMenuEntry->HelpStringToken, + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + (UINT16) DRIVER_OPTION_DEL_QUESTION_ID, + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateDriverAddHandleDescPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + UINT8 *Location; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmFakeNvData->DriverAddActive = 0x01; + CallbackData->BmmFakeNvData->DriverAddForceReconnect = 0x00; + CallbackData->BmmAskSaveOrNot = TRUE; + NewMenuEntry = CallbackData->MenuEntry; + + UpdatePageStart (CallbackData, &Location); + + UpdateData->DataCount += (UINT16) 4; + + CreateSubTitleOpCode ( + NewMenuEntry->DisplayStringToken, + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + + CreateStringOpCode ( + DRV_ADD_HANDLE_DESC_QUESTION_ID, + (UINT8) 150, + STRING_TOKEN (STR_LOAD_OPTION_DESC), + STRING_TOKEN (STR_NULL_STRING), + 6, + 75, + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_DRIVER_ADD_DESC_DATA, + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + + CreateCheckBoxOpCode ( + DRV_ADD_RECON_QUESTION_ID, + (UINT8) 1, + STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON), + STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + DRV_ADD_RECON_QUESTION_ID, + Location + ); + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + + CreateStringOpCode ( + DRIVER_ADD_OPTION_QUESTION_ID, + (UINT8) 150, + STRING_TOKEN (STR_OPTIONAL_DATA), + STRING_TOKEN (STR_NULL_STRING), + 6, + 75, + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_DRIVER_ADD_OPT_DATA, + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateConsolePage ( + IN UINT16 UpdatePageId, + IN BM_MENU_OPTION *ConsoleMenu, + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + BM_CONSOLE_CONTEXT *NewConsoleContext; + BM_TERMINAL_CONTEXT *NewTerminalContext; + UINT16 Index; + UINT16 Index2; + UINT8 *Location; + UINT8 CheckFlags; + EFI_STATUS Status; + VOID *Interface; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + + for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); + NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + if (NewConsoleContext->IsActive) { + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE; + } else { + CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE; + } + + CreateCheckBoxOpCode ( + (UINT16) (CON_DEVICE_QUESTION_ID + Index), + (UINT8) 1, + NewMenuEntry->DisplayStringToken, + NewMenuEntry->HelpStringToken, + CheckFlags, + (UINT16) (CONSOLE_OPTION_OFFSET + Index), + Location + ); + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + } + + Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface); + if (!EFI_ERROR (Status)) { + for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) { + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2); + NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; + + if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) || + (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) || + (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID)) + ) { + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE; + } else { + CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE; + } + + CreateCheckBoxOpCode ( + (UINT16) (CON_DEVICE_QUESTION_ID + Index), + (UINT8) 1, + NewMenuEntry->DisplayStringToken, + NewMenuEntry->HelpStringToken, + CheckFlags, + (UINT16) (CONSOLE_OPTION_OFFSET + Index), + Location + ); + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + Index++; + } + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateOrderPage ( + IN UINT16 UpdatePageId, + IN BM_MENU_OPTION *OptionMenu, + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + UINT16 Index; + UINT8 *Location; + IFR_OPTION *IfrOptionList; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + + CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); + + ZeroMem (CallbackData->BmmFakeNvData->OptionOrder, 100); + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber); + if (NULL == IfrOptionList) { + return ; + } + + for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); + IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken; + IfrOptionList[Index].Value = (UINT16) (NewMenuEntry->OptionNumber + 1); + IfrOptionList[Index].OptionString = NULL; + CallbackData->BmmFakeNvData->OptionOrder[Index] = (UINT8) (IfrOptionList[Index].Value); + } + + if (OptionMenu->MenuNumber > 0) { + CreateOrderedListOpCode ( + (UINT16) OPTION_ORDER_QUESTION_ID, + (UINT8) 100, + STRING_TOKEN (STR_CHANGE_ORDER), + STRING_TOKEN (STR_CHANGE_ORDER), + IfrOptionList, + OptionMenu->MenuNumber, + Location + ); + + for (Index = 0; Index < OptionMenu->MenuNumber + 2; Index++) { + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + } + + UpdateData->DataCount = (UINT16) (UpdateData->DataCount + OptionMenu->MenuNumber + 2); + } + + SafeFreePool (IfrOptionList); + + UpdatePageEnd (CallbackData, Location); + + CopyMem ( + CallbackData->BmmOldFakeNVData.OptionOrder, + CallbackData->BmmFakeNvData->OptionOrder, + 100 + ); +} + +VOID +UpdateBootNextPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINT8 *Location; + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + IFR_OPTION *IfrOptionList; + UINTN NumberOfOptions; + UINT16 Index; + + Location = (UINT8 *) &UpdateData->Data; + IfrOptionList = NULL; + NumberOfOptions = BootOptionMenu.MenuNumber; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); + + if (NumberOfOptions > 0) { + UpdateData->DataCount = (UINT8) (UpdateData->DataCount + NumberOfOptions); + IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION)); + + ASSERT (IfrOptionList); + + CallbackData->BmmFakeNvData->BootNext = (UINT16) (BootOptionMenu.MenuNumber); + + for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + if (NewLoadContext->IsBootNext) { + IfrOptionList[Index].Flags = EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_INTERACTIVE; + CallbackData->BmmFakeNvData->BootNext = Index; + } else { + IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE; + } + + IfrOptionList[Index].Key = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT; + IfrOptionList[Index].Value = Index; + IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken; + IfrOptionList[Index].OptionString = NULL; + } + + IfrOptionList[Index].Key = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT; + IfrOptionList[Index].Value = Index; + IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE); + IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE; + if (CallbackData->BmmFakeNvData->BootNext == Index) { + IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT; + } + + IfrOptionList[Index].OptionString = NULL; + + CreateOneOfOpCode ( + (UINT16) BOOT_NEXT_QUESTION_ID, + (UINT8) 2, + STRING_TOKEN (STR_BOOT_NEXT), + STRING_TOKEN (STR_BOOT_NEXT_HELP), + IfrOptionList, + (UINTN) (NumberOfOptions + 1), + Location + ); + Location = Location + (NumberOfOptions + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + + UpdateData->DataCount += 3; + SafeFreePool (IfrOptionList); + IfrOptionList = NULL; + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateTimeOutPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINT8 *Location; + UINT16 BootTimeOut; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + + BootTimeOut = BdsLibGetTimeout (); + + CreateNumericOpCode ( + (UINT16) BOOT_TIME_OUT_QUESTION_ID, + (UINT8) 2, + STRING_TOKEN (STR_NUM_AUTO_BOOT), + STRING_TOKEN (STR_HLP_AUTO_BOOT), + 0, + 65535, + 0, + 10, + 0, + 0, + Location + ); + + CallbackData->BmmFakeNvData->BootTimeOut = (UINT16) BootTimeOut; + UpdateData->DataCount++; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdateTerminalPage ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINT16 Index; + UINT8 *Location; + UINT8 CheckFlags; + IFR_OPTION *IfrOptionList; + BM_MENU_ENTRY *NewMenuEntry; + BM_TERMINAL_CONTEXT *NewTerminalContext; + + ZeroMem (UpdateData, UPDATE_DATA_SIZE); + Location = (UINT8 *) &UpdateData->Data; + UpdatePageStart (CallbackData, &Location); + + NewMenuEntry = BOpt_GetMenuEntry ( + &TerminalMenu, + CallbackData->CurrentTerminal + ); + + if (!NewMenuEntry) { + return ; + } + + NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 19); + if (!IfrOptionList) { + return ; + } + + for (Index = 0; Index < 19; Index++) { + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) { + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + NewTerminalContext->BaudRateIndex = (UINT8) Index; + CallbackData->BmmFakeNvData->COMBaudRate = NewTerminalContext->BaudRateIndex; + } + + IfrOptionList[Index].Flags = CheckFlags; + IfrOptionList[Index].Key = KEY_VALUE_COM_SET_BAUD_RATE; + IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken; + IfrOptionList[Index].Value = Index; + } + + CreateOneOfOpCode ( + (UINT16) COM_BAUD_RATE_QUESTION_ID, + (UINT8) 1, + STRING_TOKEN (STR_COM_BAUD_RATE), + STRING_TOKEN (STR_COM_BAUD_RATE), + IfrOptionList, + 19, + Location + ); + + Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index); + UpdateData->DataCount += 2; + + SafeFreePool (IfrOptionList); + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 4); + if (!IfrOptionList) { + return ; + } + + for (Index = 0; Index < 4; Index++) { + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + + if (NewTerminalContext->DataBits == DataBitsList[Index].Value) { + NewTerminalContext->DataBitsIndex = (UINT8) Index; + CallbackData->BmmFakeNvData->COMDataRate = NewTerminalContext->DataBitsIndex; + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + } + + IfrOptionList[Index].Flags = CheckFlags; + IfrOptionList[Index].Key = KEY_VALUE_COM_SET_DATA_BITS; + IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken; + IfrOptionList[Index].Value = Index; + } + + CreateOneOfOpCode ( + (UINT16) COM_DATA_RATE_QUESTION_ID, + (UINT8) 1, + STRING_TOKEN (STR_COM_DATA_BITS), + STRING_TOKEN (STR_COM_DATA_BITS), + IfrOptionList, + 4, + Location + ); + + Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index); + UpdateData->DataCount += 2; + + SafeFreePool (IfrOptionList); + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 5); + if (!IfrOptionList) { + return ; + } + + for (Index = 0; Index < 5; Index++) { + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + if (NewTerminalContext->Parity == ParityList[Index].Value) { + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + NewTerminalContext->ParityIndex = (UINT8) Index; + CallbackData->BmmFakeNvData->COMParity = NewTerminalContext->ParityIndex; + } + + IfrOptionList[Index].Flags = CheckFlags; + IfrOptionList[Index].Key = KEY_VALUE_COM_SET_PARITY; + IfrOptionList[Index].StringToken = ParityList[Index].StringToken; + IfrOptionList[Index].Value = Index; + } + + CreateOneOfOpCode ( + (UINT16) COM_PARITY_QUESTION_ID, + (UINT8) 1, + STRING_TOKEN (STR_COM_PARITY), + STRING_TOKEN (STR_COM_PARITY), + IfrOptionList, + 5, + Location + ); + + Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index); + UpdateData->DataCount += 2; + + SafeFreePool (IfrOptionList); + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 3); + if (!IfrOptionList) { + return ; + } + + for (Index = 0; Index < 3; Index++) { + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + if (NewTerminalContext->StopBits == StopBitsList[Index].Value) { + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + NewTerminalContext->StopBitsIndex = (UINT8) Index; + CallbackData->BmmFakeNvData->COMStopBits = NewTerminalContext->StopBitsIndex; + } + + IfrOptionList[Index].Flags = CheckFlags; + IfrOptionList[Index].Key = KEY_VALUE_COM_SET_STOP_BITS; + IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken; + IfrOptionList[Index].Value = Index; + } + + CreateOneOfOpCode ( + (UINT16) COM_STOP_BITS_QUESTION_ID, + (UINT8) 1, + STRING_TOKEN (STR_COM_STOP_BITS), + STRING_TOKEN (STR_COM_STOP_BITS), + IfrOptionList, + 3, + Location + ); + + Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index); + UpdateData->DataCount += 2; + + SafeFreePool (IfrOptionList); + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 4); + if (!IfrOptionList) { + return ; + } + + for (Index = 0; Index < 4; Index++) { + CheckFlags = EFI_IFR_FLAG_INTERACTIVE; + if (NewTerminalContext->TerminalType == Index) { + CheckFlags |= EFI_IFR_FLAG_DEFAULT; + CallbackData->BmmFakeNvData->COMTerminalType = NewTerminalContext->TerminalType; + } + + IfrOptionList[Index].Flags = CheckFlags; + IfrOptionList[Index].Key = KEY_VALUE_COM_SET_TERMI_TYPE; + IfrOptionList[Index].StringToken = (STRING_REF) TerminalType[Index]; + IfrOptionList[Index].Value = Index; + } + + CreateOneOfOpCode ( + (UINT16) COM_TERMINAL_QUESTION_ID, + (UINT8) 1, + STRING_TOKEN (STR_COM_TERMI_TYPE), + STRING_TOKEN (STR_COM_TERMI_TYPE), + IfrOptionList, + 4, + Location + ); + + Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index); + UpdateData->DataCount += 2; + + SafeFreePool (IfrOptionList); + + CreateGotoOpCode ( + FORM_MAIN_ID, + STRING_TOKEN (STR_SAVE_AND_EXIT), + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_SAVE_AND_EXIT, + Location + ); + + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount++; + + CreateGotoOpCode ( + FORM_MAIN_ID, + STRING_TOKEN (STR_NO_SAVE_AND_EXIT), + STRING_TOKEN (STR_NULL_STRING), + EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS, + KEY_VALUE_NO_SAVE_AND_EXIT, + Location + ); + + UpdateData->DataCount++; + + CallbackData->Hii->UpdateForm ( + CallbackData->Hii, + CallbackData->BmmHiiHandle, + (EFI_FORM_LABEL) FORM_CON_COM_SETUP_ID, + TRUE, + UpdateData + ); + +} + +VOID +UpdatePageBody ( + IN UINT16 UpdatePageId, + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + CleanUpPage (UpdatePageId, CallbackData); + switch (UpdatePageId) { + case FORM_CON_IN_ID: + UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData); + break; + + case FORM_CON_OUT_ID: + UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData); + break; + + case FORM_CON_ERR_ID: + UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData); + break; + + case FORM_BOOT_CHG_ID: + UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData); + break; + + case FORM_DRV_CHG_ID: + UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData); + break; + + default: + break; + } +} + +VOID * +GetLegacyBootOptionVar ( + IN UINTN DeviceType, + OUT UINTN *OptionIndex, + OUT UINTN *OptionSize + ) +{ + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + VOID *OptionBuffer; + UINTN OrderSize; + UINTN Index; + UINT32 Attribute; + UINT16 *OrderBuffer; + CHAR16 StrTemp[100]; + UINT16 FilePathSize; + CHAR16 *Description; + UINT8 *Ptr; + UINT8 *OptionalData; + + // + // Get Boot Option number from the size of BootOrder + // + OrderBuffer = BdsLibGetVariableAndSize ( + L"BootOrder", + &gEfiGlobalVariableGuid, + &OrderSize + ); + + for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) { + UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]); + OptionBuffer = BdsLibGetVariableAndSize ( + StrTemp, + &gEfiGlobalVariableGuid, + OptionSize + ); + if (NULL == OptionBuffer) { + continue; + } + + Ptr = (UINT8 *) OptionBuffer; + Attribute = *(UINT32 *) Ptr; + Ptr += sizeof (UINT32); + + FilePathSize = *(UINT16 *) Ptr; + Ptr += sizeof (UINT16); + + Description = (CHAR16 *) Ptr; + Ptr += StrSize ((CHAR16 *) Ptr); + + // + // Now Ptr point to Device Path + // + DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr; + Ptr += FilePathSize; + + // + // Now Ptr point to Optional Data + // + OptionalData = Ptr; + + if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) && + (BBS_DEVICE_PATH == DevicePath->Type) && + (BBS_BBS_DP == DevicePath->SubType) + ) { + *OptionIndex = OrderBuffer[Index]; + SafeFreePool (OrderBuffer); + return OptionBuffer; + } else { + SafeFreePool (OptionBuffer); + } + } + + SafeFreePool (OrderBuffer); + return NULL; +} + +VOID +UpdateSetLegacyDeviceOrderPage ( + IN UINT16 UpdatePageId, + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder; + BM_MENU_OPTION *OptionMenu; + BM_MENU_ENTRY *NewMenuEntry; + IFR_OPTION *IfrOptionList; + STRING_REF StrRef; + STRING_REF StrRefHelp; + BBS_TYPE BbsType; + UINTN VarSize; + UINTN Pos; + UINTN Bit; + UINT16 Index; + UINT16 Index2; + UINT16 Key; + CHAR16 String[100]; + CHAR16 *TypeStr; + CHAR16 *TypeStrHelp; + UINT16 VarDevOrder; + UINT8 *Location; + UINT8 *VarData; + UINT8 *OriginalPtr; + UINT8 *LegacyOrder; + UINT8 *OldData; + UINT8 *DisMap; + + OptionMenu = NULL; + Key = 0; + StrRef = 0; + StrRefHelp = 0; + TypeStr = NULL; + TypeStrHelp = NULL; + BbsType = BBS_FLOPPY; + LegacyOrder = NULL; + OldData = NULL; + DisMap = NULL; + + Location = (UINT8 *) &UpdateData->Data; + CallbackData->BmmAskSaveOrNot = TRUE; + + UpdatePageStart (CallbackData, &Location); + + DisMap = CallbackData->BmmOldFakeNVData.DisableMap; + + SetMem (DisMap, 32, 0); + // + // Create oneof option list + // + switch (UpdatePageId) { + case FORM_SET_FD_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu; + Key = LEGACY_FD_QUESTION_ID; + TypeStr = StrFloppy; + TypeStrHelp = StrFloppyHelp; + BbsType = BBS_FLOPPY; + LegacyOrder = CallbackData->BmmFakeNvData->LegacyFD; + OldData = CallbackData->BmmOldFakeNVData.LegacyFD; + break; + + case FORM_SET_HD_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu; + Key = LEGACY_HD_QUESTION_ID; + TypeStr = StrHardDisk; + TypeStrHelp = StrHardDiskHelp; + BbsType = BBS_HARDDISK; + LegacyOrder = CallbackData->BmmFakeNvData->LegacyHD; + OldData = CallbackData->BmmOldFakeNVData.LegacyHD; + break; + + case FORM_SET_CD_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu; + Key = LEGACY_CD_QUESTION_ID; + TypeStr = StrCDROM; + TypeStrHelp = StrCDROMHelp; + BbsType = BBS_CDROM; + LegacyOrder = CallbackData->BmmFakeNvData->LegacyCD; + OldData = CallbackData->BmmOldFakeNVData.LegacyCD; + break; + + case FORM_SET_NET_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu; + Key = LEGACY_NET_QUESTION_ID; + TypeStr = StrNET; + TypeStrHelp = StrNETHelp; + BbsType = BBS_EMBED_NETWORK; + LegacyOrder = CallbackData->BmmFakeNvData->LegacyNET; + OldData = CallbackData->BmmOldFakeNVData.LegacyNET; + break; + + case FORM_SET_BEV_ORDER_ID: + OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu; + Key = LEGACY_BEV_QUESTION_ID; + TypeStr = StrBEV; + TypeStrHelp = StrBEVHelp; + BbsType = BBS_BEV_DEVICE; + LegacyOrder = CallbackData->BmmFakeNvData->LegacyBEV; + OldData = CallbackData->BmmOldFakeNVData.LegacyBEV; + break; + + } + + CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); + + IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1)); + if (NULL == IfrOptionList) { + return ; + } + + for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); + IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE; + if (0 == Index) { + IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT; + } + + IfrOptionList[Index].Key = Key; + IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken; + IfrOptionList[Index].Value = (UINT16) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index; + IfrOptionList[Index].OptionString = NULL; + } + // + // for item "Disabled" + // + IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE; + IfrOptionList[Index].Key = Key; + IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE); + IfrOptionList[Index].Value = 0xFF; + IfrOptionList[Index].OptionString = NULL; + + // + // Get Device Order from variable + // + VarData = BdsLibGetVariableAndSize ( + VarLegacyDevOrder, + &EfiLegacyDevOrderGuid, + &VarSize + ); + + if (NULL != VarData) { + OriginalPtr = VarData; + DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData; + while (VarData < VarData + VarSize) { + if (DevOrder->BbsType == BbsType) { + break; + } + + VarData += sizeof (BBS_TYPE); + VarData += *(UINT16 *) VarData; + DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData; + } + // + // Create oneof tag here for FD/HD/CD #1 #2 + // + for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { + for (Index2 = 0; Index2 <= OptionMenu->MenuNumber; Index2++) { + IfrOptionList[Index2].Key = (UINT16) (Key + Index); + } + // + // Create the string for oneof tag + // + UnicodeSPrint (String, sizeof (String), TypeStr, Index); + StrRef = 0; + CallbackData->Hii->NewString ( + CallbackData->Hii, + NULL, + CallbackData->BmmHiiHandle, + &StrRef, + String + ); + + UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index); + StrRefHelp = 0; + CallbackData->Hii->NewString ( + CallbackData->Hii, + NULL, + CallbackData->BmmHiiHandle, + &StrRefHelp, + String + ); + + CreateOneOfOpCode ( + (UINT16) (Key + Index), + (UINT8) 1, + StrRef, + StrRefHelp, + IfrOptionList, + OptionMenu->MenuNumber + 1, + Location + ); + + VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16)); + + if (0xFF00 == (VarDevOrder & 0xFF00)) { + LegacyOrder[Index] = 0xFF; + Pos = (VarDevOrder & 0xFF) / 8; + Bit = 7 - ((VarDevOrder & 0xFF) % 8); + DisMap[Pos] |= (UINT8) (1 << Bit); + } else { + LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF); + } + + Location = Location + (OptionMenu->MenuNumber + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length; + Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length; + UpdateData->DataCount = (UINT16) (UpdateData->DataCount + (OptionMenu->MenuNumber + 3)); + } + } + + CopyMem ( + OldData, + LegacyOrder, + 100 + ); + + if (IfrOptionList != NULL) { + SafeFreePool (IfrOptionList); + IfrOptionList = NULL; + } + + UpdatePageEnd (CallbackData, Location); +} + +VOID +UpdatePageId ( + BMM_CALLBACK_DATA *Private, + UINT16 NewPageId + ) +{ + UINT16 FileOptionMask; + + FileOptionMask = (UINT16) (FILE_OPTION_MASK & NewPageId); + + if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) { + // + // If we select a handle to add driver option, advance to the add handle description page. + // + NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID; + } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) { + // + // Return to main page after "Save Changes" or "Discard Changes". + // + NewPageId = FORM_MAIN_ID; + } + + if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) { + Private->BmmPreviousPageId = Private->BmmCurrentPageId; + Private->BmmCurrentPageId = NewPageId; + } +} -- cgit v1.2.3