/** 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); }
/** This function update VLAN list in the VLAN configuration Form. @param[in, out] PrivateData Points to VLAN configuration private data. **/ VOID VlanUpdateForm ( IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData ) { EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; UINT16 NumberOfVlan; UINTN Index; EFI_VLAN_FIND_DATA *VlanData; VOID *StartOpCodeHandle; EFI_IFR_GUID_LABEL *StartLabel; VOID *EndOpCodeHandle; EFI_IFR_GUID_LABEL *EndLabel; CHAR16 *String; CHAR16 VlanStr[30]; CHAR16 VlanIdStr[6]; UINTN DigitalCount; EFI_STRING_ID StringId; // // Find current VLAN configuration // VlanData = NULL; NumberOfVlan = 0; VlanConfig = PrivateData->VlanConfig; VlanConfig->Find (VlanConfig, NULL, &NumberOfVlan, &VlanData); // // Update VLAN configuration in PrivateData // if (NumberOfVlan > MAX_VLAN_NUMBER) { NumberOfVlan = MAX_VLAN_NUMBER; } PrivateData->NumberOfVlan = NumberOfVlan; // // Init OpCode Handle // StartOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (StartOpCodeHandle != NULL); EndOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (EndOpCodeHandle != NULL); // // Create Hii Extend Label OpCode as the start opcode // StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL) ); StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; StartLabel->Number = LABEL_VLAN_LIST; // // Create Hii Extend Label OpCode as the end opcode // EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL) ); EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; EndLabel->Number = LABEL_END; ZeroMem (PrivateData->VlanId, MAX_VLAN_NUMBER); for (Index = 0; Index < NumberOfVlan; Index++) { String = VlanStr; StrCpy (String, L" VLAN ID:"); String += 10; // // Pad VlanId string up to 4 characters with space // DigitalCount = UnicodeValueToString (VlanIdStr, 0, VlanData[Index].VlanId, 5); SetMem16 (String, (4 - DigitalCount) * sizeof (CHAR16), L' '); StrCpy (String + 4 - DigitalCount, VlanIdStr); String += 4; StrCpy (String, L", Priority:"); String += 11; String += UnicodeValueToString (String, 0, VlanData[Index].Priority, 4); *String = 0; StringId = HiiSetString (PrivateData->HiiHandle, 0, VlanStr, NULL); ASSERT (StringId != 0); HiiCreateCheckBoxOpCode ( StartOpCodeHandle, (EFI_QUESTION_ID) (VLAN_LIST_VAR_OFFSET + Index), VLAN_CONFIGURATION_VARSTORE_ID, (UINT16) (VLAN_LIST_VAR_OFFSET + Index), StringId, STRING_TOKEN (STR_VLAN_VLAN_LIST_HELP), 0, 0, NULL ); // // Save VLAN id to private data // PrivateData->VlanId[Index] = VlanData[Index].VlanId; } HiiUpdateForm ( PrivateData->HiiHandle, // HII handle &gVlanConfigFormSetGuid, // Formset GUID VLAN_CONFIGURATION_FORM_ID, // Form ID StartOpCodeHandle, // Label for where to insert opcodes EndOpCodeHandle // Replace data ); HiiFreeOpCodeHandle (StartOpCodeHandle); HiiFreeOpCodeHandle (EndOpCodeHandle); if (VlanData != NULL) { FreePool (VlanData); } }
/** 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); }
/** 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); }
/** 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); }