| /**@file | |
| Dynamically Update the pages. | |
| Copyright (c) 2006 - 2007 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. | |
| **/ | |
| #include "Bds.h" | |
| #include "BootMaint.h" | |
| EFI_GUID gTerminalDriverGuid = { | |
| 0x9E863906, 0xA40F, 0x4875, {0x97, 0x7F, 0x5B, 0x93, 0xFF, 0x23, 0x7F, 0xC6} | |
| }; | |
| 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; | |
| } | |
| } |