VOID UpdateConCOMPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; EFI_STATUS Status; VOID *Interface; CallbackData->BmmAskSaveOrNot = FALSE; UpdatePageStart (CallbackData); 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_CALLBACK, (UINT16) (TERMINAL_OPTION_OFFSET + Index), &gUpdateData ); } } UpdatePageEnd (CallbackData); }
VOID UpdateTimeOutPage ( IN BMM_CALLBACK_DATA *CallbackData ) { UINT16 BootTimeOut; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); BootTimeOut = BdsLibGetTimeout (); CreateNumericOpCode ( BOOT_TIME_OUT_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, BOOT_TIME_OUT_VAR_OFFSET, STRING_TOKEN (STR_NUM_AUTO_BOOT), STRING_TOKEN (STR_HLP_AUTO_BOOT), 0, EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC, 0, 65535, 0, BootTimeOut, &gUpdateData ); CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut; UpdatePageEnd (CallbackData); }
/** Create a list of Goto Opcode for all terminal devices logged by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID. @param CallbackData The BMM context data. **/ VOID UpdateConCOMPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; CallbackData->BmmAskSaveOrNot = FALSE; UpdatePageStart (CallbackData); for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_CON_COM_SETUP_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (TERMINAL_OPTION_OFFSET + Index) ); } UpdatePageEnd (CallbackData); }
/** Create a lit of driver option from global DriverMenu. @param CallbackData The BMM context data. **/ VOID UpdateDrvAddHandlePage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; CallbackData->BmmAskSaveOrNot = FALSE; UpdatePageStart (CallbackData); for (Index = 0; Index < DriverMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_DRV_ADD_HANDLE_DESC_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (HANDLE_OPTION_OFFSET + Index) ); } UpdatePageEnd (CallbackData); }
/** Create the dynamic page to allow user to set the "TimeOut" value. @param CallbackData The BMM context data. **/ VOID UpdateTimeOutPage ( IN BMM_CALLBACK_DATA *CallbackData ) { VOID *DefaultOpCodeHandle; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); DefaultOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (DefaultOpCodeHandle != NULL); HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, CallbackData->BmmFakeNvData.BootTimeOut); HiiCreateNumericOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, BOOT_TIME_OUT_VAR_OFFSET, STRING_TOKEN (STR_NUM_AUTO_BOOT), STRING_TOKEN (STR_HLP_AUTO_BOOT), 0, EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC, 0, 65535, 0, DefaultOpCodeHandle ); HiiFreeOpCodeHandle (DefaultOpCodeHandle); UpdatePageEnd (CallbackData); }
VOID UpdateOrderPage ( IN UINT16 UpdatePageId, IN BM_MENU_OPTION *OptionMenu, IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; IFR_OPTION *IfrOptionList; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); EfiZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100); IfrOptionList = EfiAllocateZeroPool (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.u8 = (UINT8) (NewMenuEntry->OptionNumber + 1); IfrOptionList[Index].Flags = 0; CallbackData->BmmFakeNvData.OptionOrder[Index] = IfrOptionList[Index].Value.u8; } if (OptionMenu->MenuNumber > 0) { CreateOrderedListOpCode ( OPTION_ORDER_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, OPTION_ORDER_VAR_OFFSET, STRING_TOKEN (STR_CHANGE_ORDER), STRING_TOKEN (STR_CHANGE_ORDER), 0, 0, EFI_IFR_NUMERIC_SIZE_1, 100, IfrOptionList, OptionMenu->MenuNumber, &gUpdateData ); } SafeFreePool (IfrOptionList); UpdatePageEnd (CallbackData); EfiCopyMem ( CallbackData->BmmOldFakeNVData.OptionOrder, CallbackData->BmmFakeNvData.OptionOrder, 100 ); }
/** Create a lit of boot option from global BootOptionMenu. It allow user to delete the boot option. @param CallbackData The BMM context data. **/ VOID UpdateBootDelPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; UINT16 Index; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0]))); 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; if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) { // // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser // through HiiSetBrowserData function. // CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE; } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, EFI_IFR_FLAG_CALLBACK, 0, NULL ); } UpdatePageEnd (CallbackData); }
/** Create a list of boot option from global BootOptionMenu. It allow user to delete the boot option. @param CallbackData The BMM context data. **/ VOID UpdateBootDelPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; UINT16 Index; //CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0]))); for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; if (NewLoadContext->IsLegacy) { continue; } // // Check to see if the current boot option devicepath is the ShellDevice // path. If it is keep only UEFI Shell in the delete boot option list // or else continue // //if ((NULL != NewLoadContext->FilePathList) && (TRUE == IsShellNodeDevicePath(NewLoadContext->FilePathList))) { // NewLoadContext->Deleted = FALSE; // CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE; HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, 0, NULL ); //} else { // continue; //} } UpdatePageEnd (CallbackData); }
/** Create a lit of boot option from global BootOptionMenu. It allow user to delete the boot option. @param CallbackData The BMM context data. **/ VOID UpdateBootDelPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; UINT16 Index; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0]))); 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.OptionDel[Index] = FALSE; HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, 0, NULL ); } UpdatePageEnd (CallbackData); }
VOID UpdateDrvDelPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; UINT16 Index; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); 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 ( DRIVER_OPTION_DEL_QUESTION_ID + Index, VARSTORE_ID_BOOT_MAINT, DRIVER_OPTION_DEL_VAR_OFFSET + Index, NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, 0, &gUpdateData ); } UpdatePageEnd (CallbackData); }
/** Update console page. @param UpdatePageId The form ID to be updated. @param ConsoleMenu The console menu list. @param CallbackData The BMM context data. **/ 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 CheckFlags; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \ (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) { NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; CheckFlags = 0; if (NewConsoleContext->IsActive) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE; } else { CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE; } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (CON_DEVICE_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); } for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \ (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) { CheckFlags = 0; NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2); NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; ASSERT (Index < MAX_MENU_NUMBER); if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) || ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) || ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID)) ) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE; } else { CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE; } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (CON_DEVICE_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); Index++; } UpdatePageEnd (CallbackData); }
/** Prepare the page to allow user to add description for a Driver Option. @param CallbackData The BMM context data. **/ VOID UpdateDriverAddHandleDescPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; CallbackData->BmmFakeNvData.DriverAddActive = 0x01; CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00; CallbackData->BmmAskSaveOrNot = TRUE; NewMenuEntry = CallbackData->MenuEntry; UpdatePageStart (CallbackData); HiiCreateSubTitleOpCode ( mStartOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, 0, 0 ); HiiCreateStringOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, DRV_ADD_HANDLE_DESC_VAR_OFFSET, STRING_TOKEN (STR_LOAD_OPTION_DESC), STRING_TOKEN (STR_NULL_STRING), 0, 0, 6, 75, NULL ); HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, DRV_ADD_RECON_VAR_OFFSET, STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON), STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON), 0, 0, NULL ); HiiCreateStringOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, DRIVER_ADD_OPTION_VAR_OFFSET, STRING_TOKEN (STR_OPTIONAL_DATA), STRING_TOKEN (STR_NULL_STRING), 0, 0, 6, 75, NULL ); UpdatePageEnd (CallbackData); }
/** Create a dynamic page so that Legacy Device boot order can be set for specified device type. @param UpdatePageId The form ID. It also spefies the legacy device type. @param CallbackData The BMM context data. **/ VOID UpdateSetLegacyDeviceOrderPage ( IN UINT16 UpdatePageId, IN BMM_CALLBACK_DATA *CallbackData ) { LEGACY_DEV_ORDER_ENTRY *DevOrder; BM_MENU_OPTION *OptionMenu; BM_MENU_ENTRY *NewMenuEntry; EFI_STRING_ID StrRef; EFI_STRING_ID StrRefHelp; BBS_TYPE BbsType; UINTN VarSize; UINTN Pos; UINTN Bit; UINT16 Index; UINT16 Key; CHAR16 String[100]; CHAR16 *TypeStr; CHAR16 *TypeStrHelp; UINT16 VarDevOrder; UINT8 *VarData; UINT8 *LegacyOrder; UINT8 *OldData; UINT8 *DisMap; VOID *OptionsOpCodeHandle; OptionMenu = NULL; Key = 0; StrRef = 0; StrRefHelp = 0; TypeStr = NULL; TypeStrHelp = NULL; BbsType = BBS_FLOPPY; LegacyOrder = NULL; OldData = NULL; DisMap = NULL; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap)); // // Create oneof option list // switch (UpdatePageId) { case FORM_SET_FD_ORDER_ID: OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu; Key = (UINT16) LEGACY_FD_QUESTION_ID; TypeStr = STR_FLOPPY; TypeStrHelp = STR_FLOPPY_HELP; BbsType = BBS_FLOPPY; LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD; OldData = CallbackData->BmmOldFakeNVData.LegacyFD; break; case FORM_SET_HD_ORDER_ID: OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu; Key = (UINT16) LEGACY_HD_QUESTION_ID; TypeStr = STR_HARDDISK; TypeStrHelp = STR_HARDDISK_HELP; BbsType = BBS_HARDDISK; LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD; OldData = CallbackData->BmmOldFakeNVData.LegacyHD; break; case FORM_SET_CD_ORDER_ID: OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu; Key = (UINT16) LEGACY_CD_QUESTION_ID; TypeStr = STR_CDROM; TypeStrHelp = STR_CDROM_HELP; BbsType = BBS_CDROM; LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD; OldData = CallbackData->BmmOldFakeNVData.LegacyCD; break; case FORM_SET_NET_ORDER_ID: OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu; Key = (UINT16) LEGACY_NET_QUESTION_ID; TypeStr = STR_NET; TypeStrHelp = STR_NET_HELP; 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 = (UINT16) LEGACY_BEV_QUESTION_ID; TypeStr = STR_BEV; TypeStrHelp = STR_BEV_HELP; BbsType = BBS_BEV_DEVICE; LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV; OldData = CallbackData->BmmOldFakeNVData.LegacyBEV; break; default: DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n")); return; } CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); // // Create OneOf for each legacy device // HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, EFI_IFR_TYPE_NUM_SIZE_8, (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex ); } // // Create OneOf for item "Disabled" // HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE), 0, EFI_IFR_TYPE_NUM_SIZE_8, 0xFF ); // // Get Device Order from variable // VarData = BdsLibGetVariableAndSize ( VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, &VarSize ); if (NULL != VarData) { DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; while (VarData < VarData + VarSize) { if (DevOrder->BbsType == BbsType) { break; } VarData += sizeof (BBS_TYPE); VarData += *(UINT16 *) VarData; DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; } // // Create oneof tag here for FD/HD/CD #1 #2 // for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { // // Create the string for oneof tag // UnicodeSPrint (String, sizeof (String), TypeStr, Index); StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL); UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index); StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL); HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (Key + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (Key + Index - CONFIG_OPTION_OFFSET), StrRef, StrRefHelp, EFI_IFR_FLAG_CALLBACK, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); 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) (DisMap[Pos] | (UINT8) (1 << Bit)); } else { LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF); } } } CopyMem (OldData, LegacyOrder, 100); HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); }
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 CheckFlags; EFI_STATUS Status; VOID *Interface; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; CheckFlags = 0; if (NewConsoleContext->IsActive) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE; } else { CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE; } CreateCheckBoxOpCode ( CON_DEVICE_QUESTION_ID + Index, VARSTORE_ID_BOOT_MAINT, CON_DEVICE_VAR_OFFSET + Index, NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, &gUpdateData ); } Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface); if (!EFI_ERROR (Status)) { for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) { CheckFlags = 0; 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_CHECKBOX_DEFAULT; CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE; } else { CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE; } CreateCheckBoxOpCode ( CON_DEVICE_QUESTION_ID + Index, VARSTORE_ID_BOOT_MAINT, CON_DEVICE_VAR_OFFSET + Index, NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, &gUpdateData ); Index++; } } UpdatePageEnd (CallbackData); }
/** Update the page's NV Map if user has changed the order a list. This list can be Boot Order or Driver Order. @param UpdatePageId The form ID to be updated. @param OptionMenu The new list. @param CallbackData The BMM context data. **/ VOID UpdateOrderPage ( IN UINT16 UpdatePageId, IN BM_MENU_OPTION *OptionMenu, IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; UINT16 OptionIndex; VOID *OptionsOpCodeHandle; BM_LOAD_CONTEXT *NewLoadContext; BOOLEAN BootOptionFound; UINT32 *OptionOrder; EFI_QUESTION_ID QuestionId; UINT16 VarOffset; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); OptionOrder = NULL; QuestionId = 0; VarOffset = 0; switch (UpdatePageId) { case FORM_BOOT_CHG_ID: //GetBootOrder (CallbackData); OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder; QuestionId = BOOT_OPTION_ORDER_QUESTION_ID; VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET; break; case FORM_DRV_CHG_ID: //GetDriverOrder (CallbackData); OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder; QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID; VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET; break; } ASSERT (OptionOrder != NULL); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); NewMenuEntry = NULL; for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) { BootOptionFound = FALSE; for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) { BootOptionFound = TRUE; break; } } if (BootOptionFound) { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, EFI_IFR_TYPE_NUM_SIZE_32, OptionOrder[OptionIndex] ); } } if (OptionMenu->MenuNumber > 0) { HiiCreateOrderedListOpCode ( mStartOpCodeHandle, // Container for dynamic created opcodes QuestionId, // Question ID VARSTORE_ID_BOOT_MAINT, // VarStore ID VarOffset, // Offset in Buffer Storage STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text STRING_TOKEN (STR_CHANGE_ORDER), // Question help text 0, // Question flag 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value 100, // Maximum container OptionsOpCodeHandle, // Option Opcode list NULL // Default Opcode is NULL ); } HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); }
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; EFI_STRING_ID StrRef; EFI_STRING_ID StrRefHelp; BBS_TYPE BbsType; UINTN VarSize; UINTN Pos; UINTN Bit; UINT16 Index; UINT16 Key; CHAR16 String[100]; CHAR16 *TypeStr; CHAR16 *TypeStrHelp; UINT16 VarDevOrder; 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; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); DisMap = CallbackData->BmmOldFakeNVData.DisableMap; EfiSetMem (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 = EfiAllocateZeroPool (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 = 0; if (0 == Index) { IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT; } IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken; IfrOptionList[Index].Value.u8 = (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index; } // // for item "Disabled" // IfrOptionList[Index].Flags = 0; IfrOptionList[Index].StringToken = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE); IfrOptionList[Index].Value.u8 = 0xFF; // // 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++) { // // Create the string for oneof tag // SPrint (String, sizeof (String), TypeStr, Index); StrRef = 0; IfrLibNewString (CallbackData->BmmHiiHandle, &StrRef, String); SPrint (String, sizeof (String), TypeStrHelp, Index); StrRefHelp = 0; IfrLibNewString (CallbackData->BmmHiiHandle, &StrRefHelp, String); CreateOneOfOpCode ( Key + Index, VARSTORE_ID_BOOT_MAINT, Key + Index - CONFIG_OPTION_OFFSET, StrRef, StrRefHelp, EFI_IFR_FLAG_CALLBACK, EFI_IFR_NUMERIC_SIZE_1, IfrOptionList, OptionMenu->MenuNumber + 1, &gUpdateData ); 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); } } } EfiCopyMem (OldData, LegacyOrder, 100); if (IfrOptionList != NULL) { SafeFreePool (IfrOptionList); IfrOptionList = NULL; } UpdatePageEnd (CallbackData); }
VOID UpdateBootNextPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; IFR_OPTION *IfrOptionList; UINTN NumberOfOptions; UINT16 Index; IfrOptionList = NULL; NumberOfOptions = BootOptionMenu.MenuNumber; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); if (NumberOfOptions > 0) { IfrOptionList = EfiAllocateZeroPool ((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_OPTION_DEFAULT; CallbackData->BmmFakeNvData.BootNext = Index; } else { IfrOptionList[Index].Flags = 0; } IfrOptionList[Index].Value.u16 = Index; IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken; } IfrOptionList[Index].Value.u16 = Index; IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE); IfrOptionList[Index].Flags = 0; if (CallbackData->BmmFakeNvData.BootNext == Index) { IfrOptionList[Index].Flags |= EFI_IFR_OPTION_DEFAULT; } CreateOneOfOpCode ( BOOT_NEXT_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, BOOT_NEXT_VAR_OFFSET, STRING_TOKEN (STR_BOOT_NEXT), STRING_TOKEN (STR_BOOT_NEXT_HELP), 0, EFI_IFR_NUMERIC_SIZE_2, IfrOptionList, (UINTN) (NumberOfOptions + 1), &gUpdateData ); SafeFreePool (IfrOptionList); } UpdatePageEnd (CallbackData); }
/** Update console page. @param UpdatePageId The form ID to be updated. @param ConsoleMenu The console menu list. @param CallbackData The BMM context data. **/ VOID UpdateConsolePage ( IN UINT16 UpdatePageId, IN BM_MENU_OPTION *ConsoleMenu, IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; UINT8 CheckFlags; UINT8 *ConsoleCheck; EFI_QUESTION_ID QuestionIdBase; UINT16 VariableOffsetBase; UpdatePageStart (CallbackData); ConsoleCheck = NULL; QuestionIdBase = 0; VariableOffsetBase = 0; switch (UpdatePageId) { case FORM_CON_IN_ID: ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0]; QuestionIdBase = CON_IN_DEVICE_QUESTION_ID; VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET; break; case FORM_CON_OUT_ID: ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0]; QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID; VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET; break; case FORM_CON_ERR_ID: ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0]; QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID; VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET; break; } ASSERT (ConsoleCheck != NULL); for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \ (Index < MAX_MENU_NUMBER)) ; Index++) { CheckFlags = 0; if (UpdatePageId != FORM_CON_ERR_ID) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; } NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (QuestionIdBase + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (VariableOffsetBase + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); } UpdatePageEnd (CallbackData); }
/** Refresh the text mode page. @param CallbackData The BMM context data. **/ VOID UpdateConModePage ( IN BMM_CALLBACK_DATA *CallbackData ) { UINTN Mode; UINTN Index; UINTN Col; UINTN Row; CHAR16 ModeString[50]; CHAR16 *PStr; UINTN MaxMode; UINTN ValidMode; EFI_STRING_ID *ModeToken; EFI_STATUS Status; VOID *OptionsOpCodeHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; ConOut = gST->ConOut; Index = 0; ValidMode = 0; MaxMode = (UINTN) (ConOut->Mode->MaxMode); CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); // // Check valid mode // for (Mode = 0; Mode < MaxMode; Mode++) { Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row); if (EFI_ERROR (Status)) { continue; } ValidMode++; } if (ValidMode == 0) { return; } OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode); ASSERT(ModeToken != NULL); // // Determin which mode should be the first entry in menu // GetConsoleOutMode (CallbackData); // // Build text mode options // for (Mode = 0; Mode < MaxMode; Mode++) { Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row); if (EFI_ERROR (Status)) { continue; } // // Build mode string Column x Row // UnicodeValueToString (ModeString, 0, Col, 0); PStr = &ModeString[0]; StrnCat (PStr, L" x ", StrLen(L" x ") + 1); PStr = PStr + StrLen (PStr); UnicodeValueToString (PStr , 0, Row, 0); ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL); if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, ModeToken[Index], EFI_IFR_OPTION_DEFAULT, EFI_IFR_TYPE_NUM_SIZE_16, (UINT16) Mode ); } else { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, ModeToken[Index], 0, EFI_IFR_TYPE_NUM_SIZE_16, (UINT16) Mode ); } Index++; } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) CON_MODE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, CON_MODE_VAR_OFFSET, STRING_TOKEN (STR_CON_MODE_SETUP), STRING_TOKEN (STR_CON_MODE_SETUP), EFI_IFR_FLAG_RESET_REQUIRED, EFI_IFR_NUMERIC_SIZE_2, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); FreePool (ModeToken); UpdatePageEnd (CallbackData); }
/** Update console page. @param UpdatePageId The form ID to be updated. @param ConsoleMenu The console menu list. @param CallbackData The BMM context data. **/ 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 CheckFlags; UINT8 *ConsoleCheck; UINT8 *OldConsoleCheck; UINTN ConsoleCheckSize; EFI_QUESTION_ID QuestionIdBase; UINT16 VariableOffsetBase; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); ConsoleCheck = NULL; OldConsoleCheck = NULL; QuestionIdBase = 0; VariableOffsetBase = 0; ConsoleCheckSize = 0; switch (UpdatePageId) { case FORM_CON_IN_ID: ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0]; OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0]; ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck); QuestionIdBase = CON_IN_DEVICE_QUESTION_ID; VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET; break; case FORM_CON_OUT_ID: ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0]; OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0]; ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck); QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID; VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET; break; case FORM_CON_ERR_ID: ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0]; OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0]; ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck); QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID; VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET; break; } ASSERT (ConsoleCheck != NULL); for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \ (Index < MAX_MENU_NUMBER)) ; Index++) { CheckFlags = 0; NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; if (NewConsoleContext->IsActive) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; ConsoleCheck[Index] = TRUE; } else { ConsoleCheck[Index] = FALSE; } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (QuestionIdBase + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (VariableOffsetBase + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); } for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \ (Index2 < MAX_MENU_NUMBER)); Index2++) { CheckFlags = 0; NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2); NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; ASSERT (Index < MAX_MENU_NUMBER); if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) || ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) || ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID)) ) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; ConsoleCheck[Index] = TRUE; } else { ConsoleCheck[Index] = FALSE; } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (QuestionIdBase + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (VariableOffsetBase + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); Index++; } CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize); UpdatePageEnd (CallbackData); }
VOID UpdateConModePage ( IN BMM_CALLBACK_DATA *CallbackData ) /*++ Routine Description: Refresh the text mode page Arguments: CallbackData - BMM_CALLBACK_DATA Returns: None. --*/ { UINTN Mode; UINTN Index; UINTN Col; UINTN Row; CHAR16 RowString[50]; CHAR16 ModeString[50]; UINTN MaxMode; UINTN ValidMode; EFI_STRING_ID *ModeToken; IFR_OPTION *IfrOptionList; EFI_STATUS Status; EFI_SIMPLE_TEXT_OUT_PROTOCOL *ConOut; ConOut = gST->ConOut; Index = 0; ValidMode = 0; MaxMode = (UINTN) (ConOut->Mode->MaxMode); CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); // // Check valid mode // for (Mode = 0; Mode < MaxMode; Mode++) { Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row); if (EFI_ERROR (Status)) { continue; } ValidMode++; } if (ValidMode == 0) { return; } IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * ValidMode); ASSERT(IfrOptionList != NULL); ModeToken = EfiAllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode); ASSERT(ModeToken != NULL); // // Determin which mode should be the first entry in menu // GetConsoleOutMode (CallbackData); // // Build text mode options // for (Mode = 0; Mode < MaxMode; Mode++) { Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row); if (EFI_ERROR (Status)) { continue; } // // Build mode string Column x Row // EfiValueToString (ModeString, Col, 0, 0); EfiStrCat (ModeString, L" x "); EfiValueToString (RowString, Row, 0, 0); EfiStrCat (ModeString, RowString); IfrLibNewString (CallbackData->BmmHiiHandle, &ModeToken[Index], ModeString); IfrOptionList[Index].StringToken = ModeToken[Index]; IfrOptionList[Index].Value.u16 = (UINT16) Mode; if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) { IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT; } else { IfrOptionList[Index].Flags = 0; } Index++; } CreateOneOfOpCode ( CON_MODE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, CON_MODE_VAR_OFFSET, STRING_TOKEN (STR_CON_MODE_SETUP), STRING_TOKEN (STR_CON_MODE_SETUP), EFI_IFR_FLAG_RESET_REQUIRED, EFI_IFR_NUMERIC_SIZE_2, IfrOptionList, ValidMode, &gUpdateData ); SafeFreePool (IfrOptionList); SafeFreePool (ModeToken); UpdatePageEnd (CallbackData); }
/** Update the page's NV Map if user has changed the order a list. This list can be Boot Order or Driver Order. @param UpdatePageId The form ID to be updated. @param OptionMenu The new list. @param CallbackData The BMM context data. **/ VOID UpdateOrderPage ( IN UINT16 UpdatePageId, IN BM_MENU_OPTION *OptionMenu, IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; UINT16 OptionOrderIndex; VOID *OptionsOpCodeHandle; UINTN DeviceType; BM_LOAD_CONTEXT *NewLoadContext; DeviceType = (UINTN) -1; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, sizeof (CallbackData->BmmFakeNvData.OptionOrder)); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for ( Index = 0, OptionOrderIndex = 0; ( (Index < OptionMenu->MenuNumber) && (OptionOrderIndex < ( sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0]) ) ) ); Index++ ) { NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; if (NewLoadContext->IsLegacy) { if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) { DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType; } else { // // Only show one legacy boot option for the same device type // assuming the boot options are grouped by the device type // continue; } } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, EFI_IFR_TYPE_NUM_SIZE_32, (UINT32) (NewMenuEntry->OptionNumber + 1) ); CallbackData->BmmFakeNvData.OptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1); } if (OptionMenu->MenuNumber > 0) { HiiCreateOrderedListOpCode ( mStartOpCodeHandle, // Container for dynamic created opcodes (EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID, // Question ID VARSTORE_ID_BOOT_MAINT, // VarStore ID OPTION_ORDER_VAR_OFFSET, // Offset in Buffer Storage STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text STRING_TOKEN (STR_CHANGE_ORDER), // Question help text 0, // Question flag 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value 100, // Maximum container OptionsOpCodeHandle, // Option Opcode list NULL // Default Opcode is NULL ); } HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); CopyMem ( CallbackData->BmmOldFakeNVData.OptionOrder, CallbackData->BmmFakeNvData.OptionOrder, sizeof (CallbackData->BmmOldFakeNVData.OptionOrder) ); }
/** Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits, Parity, Stop Bits, Terminal Type. @param CallbackData The BMM context data. **/ VOID UpdateTerminalPage ( IN BMM_CALLBACK_DATA *CallbackData ) { UINT8 Index; UINT8 CheckFlags; BM_MENU_ENTRY *NewMenuEntry; BM_TERMINAL_CONTEXT *NewTerminalContext; VOID *OptionsOpCodeHandle; UINTN CurrentTerminal; UpdatePageStart (CallbackData); CurrentTerminal = CallbackData->CurrentTerminal; NewMenuEntry = BOpt_GetMenuEntry ( &TerminalMenu, CurrentTerminal ); if (NewMenuEntry == NULL) { return ; } NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) { CheckFlags = 0; if (BaudRateList[Index].Value == 115200) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, BaudRateList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_BAUD_RATE), STRING_TOKEN (STR_COM_BAUD_RATE), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) { CheckFlags = 0; if (DataBitsList[Index].Value == 8) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, DataBitsList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_DATA_BITS), STRING_TOKEN (STR_COM_DATA_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) { CheckFlags = 0; if (ParityList[Index].Value == NoParity) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, ParityList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_PARITY), STRING_TOKEN (STR_COM_PARITY), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) { CheckFlags = 0; if (StopBitsList[Index].Value == OneStopBit) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, StopBitsList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_STOP_BITS), STRING_TOKEN (STR_COM_STOP_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < 4; Index++) { CheckFlags = 0; if (Index == 0) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, (EFI_STRING_ID) TerminalType[Index], CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_TERMI_TYPE), STRING_TOKEN (STR_COM_TERMI_TYPE), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) { CheckFlags = 0; if (Index == 0) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, (EFI_STRING_ID) mFlowControlType[Index], CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, mFlowControlValue[Index] ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_FLOW_CONTROL), STRING_TOKEN (STR_COM_FLOW_CONTROL), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); }
/** Create the dynamic page to allow user to set the "BootNext" value. @param CallbackData The BMM context data. **/ VOID UpdateBootNextPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; UINTN NumberOfOptions; UINT16 Index; VOID *OptionsOpCodeHandle; NumberOfOptions = BootOptionMenu.MenuNumber; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); if (NumberOfOptions > 0) { OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); 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) { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, EFI_IFR_OPTION_DEFAULT, EFI_IFR_TYPE_NUM_SIZE_16, Index ); CallbackData->BmmFakeNvData.BootNext = Index; } else { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, EFI_IFR_TYPE_NUM_SIZE_16, Index ); } } if (CallbackData->BmmFakeNvData.BootNext == Index) { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, STRING_TOKEN (STR_NONE), EFI_IFR_OPTION_DEFAULT, EFI_IFR_TYPE_NUM_SIZE_16, Index ); } else { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, STRING_TOKEN (STR_NONE), 0, EFI_IFR_TYPE_NUM_SIZE_16, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, BOOT_NEXT_VAR_OFFSET, STRING_TOKEN (STR_BOOT_NEXT), STRING_TOKEN (STR_BOOT_NEXT_HELP), 0, EFI_IFR_NUMERIC_SIZE_2, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); } UpdatePageEnd (CallbackData); }
VOID UpdateTerminalPage ( IN BMM_CALLBACK_DATA *CallbackData ) { UINT8 Index; UINT8 CheckFlags; IFR_OPTION *IfrOptionList; BM_MENU_ENTRY *NewMenuEntry; BM_TERMINAL_CONTEXT *NewTerminalContext; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); NewMenuEntry = BOpt_GetMenuEntry ( &TerminalMenu, CallbackData->CurrentTerminal ); if (NewMenuEntry == NULL) { return ; } NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 19); if (IfrOptionList == NULL) { return ; } for (Index = 0; Index < 19; Index++) { CheckFlags = 0; if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; NewTerminalContext->BaudRateIndex = Index; CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex; } IfrOptionList[Index].Flags = CheckFlags; IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken; IfrOptionList[Index].Value.u8 = Index; } CreateOneOfOpCode ( COM_BAUD_RATE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_BAUD_RATE_VAR_OFFSET, STRING_TOKEN (STR_COM_BAUD_RATE), STRING_TOKEN (STR_COM_BAUD_RATE), 0, EFI_IFR_NUMERIC_SIZE_1, IfrOptionList, 19, &gUpdateData ); for (Index = 0; Index < 4; Index++) { CheckFlags = 0; if (NewTerminalContext->DataBits == DataBitsList[Index].Value) { NewTerminalContext->DataBitsIndex = Index; CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex; CheckFlags |= EFI_IFR_OPTION_DEFAULT; } IfrOptionList[Index].Flags = CheckFlags; IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken; IfrOptionList[Index].Value.u8 = Index; } CreateOneOfOpCode ( COM_DATA_RATE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_DATA_RATE_VAR_OFFSET, STRING_TOKEN (STR_COM_DATA_BITS), STRING_TOKEN (STR_COM_DATA_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, IfrOptionList, 4, &gUpdateData ); for (Index = 0; Index < 5; Index++) { CheckFlags = 0; if (NewTerminalContext->Parity == ParityList[Index].Value) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; NewTerminalContext->ParityIndex = (UINT8) Index; CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex; } IfrOptionList[Index].Flags = CheckFlags; IfrOptionList[Index].StringToken = ParityList[Index].StringToken; IfrOptionList[Index].Value.u8 = Index; } CreateOneOfOpCode ( COM_PARITY_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_PARITY_VAR_OFFSET, STRING_TOKEN (STR_COM_PARITY), STRING_TOKEN (STR_COM_PARITY), 0, EFI_IFR_NUMERIC_SIZE_1, IfrOptionList, 5, &gUpdateData ); for (Index = 0; Index < 3; Index++) { CheckFlags = 0; if (NewTerminalContext->StopBits == StopBitsList[Index].Value) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; NewTerminalContext->StopBitsIndex = (UINT8) Index; CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex; } IfrOptionList[Index].Flags = CheckFlags; IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken; IfrOptionList[Index].Value.u8 = Index; } CreateOneOfOpCode ( COM_STOP_BITS_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_STOP_BITS_VAR_OFFSET, STRING_TOKEN (STR_COM_STOP_BITS), STRING_TOKEN (STR_COM_STOP_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, IfrOptionList, 3, &gUpdateData ); for (Index = 0; Index < 4; Index++) { CheckFlags = 0; if (NewTerminalContext->TerminalType == Index) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType; } IfrOptionList[Index].Flags = CheckFlags; IfrOptionList[Index].StringToken = (EFI_STRING_ID) TerminalType[Index]; IfrOptionList[Index].Value.u8 = Index; } CreateOneOfOpCode ( COM_TERMINAL_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_TERMINAL_VAR_OFFSET, STRING_TOKEN (STR_COM_TERMI_TYPE), STRING_TOKEN (STR_COM_TERMI_TYPE), 0, EFI_IFR_NUMERIC_SIZE_1, IfrOptionList, 4, &gUpdateData ); SafeFreePool (IfrOptionList); UpdatePageEnd (CallbackData); }
/** Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits, Parity, Stop Bits, Terminal Type. @param CallbackData The BMM context data. **/ VOID UpdateTerminalPage ( IN BMM_CALLBACK_DATA *CallbackData ) { UINT8 Index; UINT8 CheckFlags; BM_MENU_ENTRY *NewMenuEntry; BM_TERMINAL_CONTEXT *NewTerminalContext; VOID *OptionsOpCodeHandle; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); NewMenuEntry = BOpt_GetMenuEntry ( &TerminalMenu, CallbackData->CurrentTerminal ); if (NewMenuEntry == NULL) { return ; } NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) { CheckFlags = 0; if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; NewTerminalContext->BaudRateIndex = Index; CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, BaudRateList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_BAUD_RATE_VAR_OFFSET, STRING_TOKEN (STR_COM_BAUD_RATE), STRING_TOKEN (STR_COM_BAUD_RATE), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) { CheckFlags = 0; if (NewTerminalContext->DataBits == DataBitsList[Index].Value) { NewTerminalContext->DataBitsIndex = Index; CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex; CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, DataBitsList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_DATA_RATE_VAR_OFFSET, STRING_TOKEN (STR_COM_DATA_BITS), STRING_TOKEN (STR_COM_DATA_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) { CheckFlags = 0; if (NewTerminalContext->Parity == ParityList[Index].Value) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; NewTerminalContext->ParityIndex = (UINT8) Index; CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, ParityList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_PARITY_VAR_OFFSET, STRING_TOKEN (STR_COM_PARITY), STRING_TOKEN (STR_COM_PARITY), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) { CheckFlags = 0; if (NewTerminalContext->StopBits == StopBitsList[Index].Value) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; NewTerminalContext->StopBitsIndex = (UINT8) Index; CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, StopBitsList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_STOP_BITS_VAR_OFFSET, STRING_TOKEN (STR_COM_STOP_BITS), STRING_TOKEN (STR_COM_STOP_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < 4; Index++) { CheckFlags = 0; if (NewTerminalContext->TerminalType == Index) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, (EFI_STRING_ID) TerminalType[Index], CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, Index ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_TERMINAL_VAR_OFFSET, STRING_TOKEN (STR_COM_TERMI_TYPE), STRING_TOKEN (STR_COM_TERMI_TYPE), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); CallbackData->BmmFakeNvData.COMFlowControl = NewTerminalContext->FlowControl; for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, (EFI_STRING_ID) mFlowControlType[Index], 0, EFI_IFR_TYPE_NUM_SIZE_8, mFlowControlValue[Index] ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, (EFI_QUESTION_ID) COM_FLOWCONTROL_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, COM_FLOWCONTROL_VAR_OFFSET, STRING_TOKEN (STR_COM_FLOW_CONTROL), STRING_TOKEN (STR_COM_FLOW_CONTROL), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); }
/** Update the page's NV Map if user has changed the order a list. This list can be Boot Order or Driver Order. @param UpdatePageId The form ID to be updated. @param OptionMenu The new list. @param CallbackData The BMM context data. **/ VOID UpdateOrderPage ( IN UINT16 UpdatePageId, IN BM_MENU_OPTION *OptionMenu, IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; UINT16 OptionIndex; VOID *OptionsOpCodeHandle; BOOLEAN BootOptionFound; UINT32 *OptionOrder; EFI_QUESTION_ID QuestionId; UINT16 VarOffset; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); OptionOrder = NULL; QuestionId = 0; VarOffset = 0; switch (UpdatePageId) { case FORM_BOOT_CHG_ID: // // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData, // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu. // else means browser maintains some uncommitted date which are not saved in BootOptionMenu, // so we should not get the data from BootOptionMenu to show it. // if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) { GetBootOrder (CallbackData); } OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder; QuestionId = BOOT_OPTION_ORDER_QUESTION_ID; VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET; break; case FORM_DRV_CHG_ID: // // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData, // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu. // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu, // so we should not get the data from DriverOptionMenu to show it. // if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) { GetDriverOrder (CallbackData); } OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder; QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID; VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET; break; } ASSERT (OptionOrder != NULL); OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); NewMenuEntry = NULL; for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) { BootOptionFound = FALSE; for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) { BootOptionFound = TRUE; break; } } if (BootOptionFound) { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, EFI_IFR_TYPE_NUM_SIZE_32, OptionOrder[OptionIndex] ); } } if (OptionMenu->MenuNumber > 0) { HiiCreateOrderedListOpCode ( mStartOpCodeHandle, // Container for dynamic created opcodes QuestionId, // Question ID VARSTORE_ID_BOOT_MAINT, // VarStore ID VarOffset, // Offset in Buffer Storage STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text STRING_TOKEN (STR_CHANGE_ORDER), // Question help text 0, // Question flag 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value 100, // Maximum container OptionsOpCodeHandle, // Option Opcode list NULL // Default Opcode is NULL ); } HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); }