/** This function invokes Boot Manager. If all devices have not a chance to be connected, the connect all will be triggered. It then enumerate all boot options. If a boot option from the Boot Manager page is selected, Boot Manager will boot from this boot option. **/ VOID UpdateBootManager ( VOID ) { UINTN Index; EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; UINTN BootOptionCount; EFI_STRING_ID Token; CHAR16 *HelpString; EFI_STRING_ID HelpToken; UINT16 *TempStr; EFI_HII_HANDLE HiiHandle; UINTN TempSize; VOID *StartOpCodeHandle; VOID *EndOpCodeHandle; EFI_IFR_GUID_LABEL *StartLabel; EFI_IFR_GUID_LABEL *EndLabel; UINT16 DeviceType; BOOLEAN IsLegacyOption; BOOLEAN NeedEndOp; UINTN MaxLen; DeviceType = (UINT16) -1; EfiBootManagerConnectAll (); // // for better user experience // 1. User changes HD configuration (e.g.: unplug HDD), here we have a chance to remove the HDD boot option // 2. User enables/disables UEFI PXE, here we have a chance to add/remove EFI Network boot option // EfiBootManagerRefreshAllBootOption (); // // BdsDxe doesn't group the legacy boot options for the same device type // It's UI's choice. // GroupMultipleLegacyBootOption4SameType (); BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); HiiHandle = gBootManagerPrivate.HiiHandle; // // Allocate space for creation of UpdateData Buffer // 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_BOOT_OPTION; // // 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_BOOT_OPTION_END; mKeyInput = 0; NeedEndOp = FALSE; for (Index = 0; Index < BootOptionCount; Index++) { // // At this stage we are creating a menu entry, thus the Keys are reproduceable // mKeyInput++; // // Don't display the hidden/inactive boot option // if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) { continue; } // // Group the legacy boot option in the sub title created dynamically // IsLegacyOption = (BOOLEAN) ( (DevicePathType (BootOption[Index].FilePath) == BBS_DEVICE_PATH) && (DevicePathSubType (BootOption[Index].FilePath) == BBS_BBS_DP) ); if (!IsLegacyOption && NeedEndOp) { NeedEndOp = FALSE; HiiCreateEndOpCode (StartOpCodeHandle); } if (IsLegacyOption && DeviceType != ((BBS_BBS_DEVICE_PATH *) BootOption[Index].FilePath)->DeviceType) { if (NeedEndOp) { HiiCreateEndOpCode (StartOpCodeHandle); } DeviceType = ((BBS_BBS_DEVICE_PATH *) BootOption[Index].FilePath)->DeviceType; Token = HiiSetString ( HiiHandle, 0, mDeviceTypeStr[ MIN (DeviceType & 0xF, sizeof (mDeviceTypeStr) / sizeof (mDeviceTypeStr[0]) - 1) ], NULL ); HiiCreateSubTitleOpCode (StartOpCodeHandle, Token, 0, 0, 1); NeedEndOp = TRUE; } ASSERT (BootOption[Index].Description != NULL); Token = HiiSetString (HiiHandle, 0, BootOption[Index].Description, NULL); TempStr = BmDevicePathToStr (BootOption[Index].FilePath); TempSize = StrSize (TempStr); HelpString = AllocateZeroPool (TempSize + StrSize (L"Device Path : ")); MaxLen = (TempSize + StrSize (L"Device Path : "))/sizeof(CHAR16); ASSERT (HelpString != NULL); StrCatS (HelpString, MaxLen, L"Device Path : "); StrCatS (HelpString, MaxLen, TempStr); HelpToken = HiiSetString (HiiHandle, 0, HelpString, NULL); HiiCreateActionOpCode ( StartOpCodeHandle, mKeyInput, Token, HelpToken, EFI_IFR_FLAG_CALLBACK, 0 ); } if (NeedEndOp) { HiiCreateEndOpCode (StartOpCodeHandle); } HiiUpdateForm ( HiiHandle, &mBootManagerGuid, BOOT_MANAGER_FORM_ID, StartOpCodeHandle, EndOpCodeHandle ); HiiFreeOpCodeHandle (StartOpCodeHandle); HiiFreeOpCodeHandle (EndOpCodeHandle); EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); }
/** Create empty line menu in the front page. @param HiiHandle The hii handle for the Uiapp driver. @param StartOpCodeHandle The opcode handle to save the new opcode. **/ VOID UiCreateEmptyLine ( IN EFI_HII_HANDLE HiiHandle, IN VOID *StartOpCodeHandle ) { HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0); }
/** Update add boot/driver option page. @param CallbackData The BMM context data. @param FormId The form ID to be updated. @param DevicePath Device path. **/ VOID UpdateOptionPage( IN BMM_CALLBACK_DATA *CallbackData, IN EFI_FORM_ID FormId, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath ) { CHAR16 *String; EFI_STRING_ID StringToken; String = NULL; if (DevicePath != NULL){ String = ExtractFileNameFromDevicePath(DevicePath); } if (String == NULL) { String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL); ASSERT (String != NULL); } StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL); FreePool (String); if(FormId == FORM_BOOT_ADD_ID){ if (!CallbackData->BmmFakeNvData.BootOptionChanged) { ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData)); ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData)); ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData)); ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData)); } } else if (FormId == FORM_DRV_ADD_FILE_ID){ if (!CallbackData->BmmFakeNvData.DriverOptionChanged) { ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData)); ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData)); ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData)); ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData)); } } RefreshUpdateData(); mStartLabel->Number = FormId; HiiCreateSubTitleOpCode ( mStartOpCodeHandle, StringToken, 0, 0, 0 ); HiiUpdateForm ( CallbackData->BmmHiiHandle, &mBootMaintGuid, FormId, mStartOpCodeHandle,// Label FormId mEndOpCodeHandle // LABEL_END ); }
/** Create the "Apply changes" and "Discard changes" tags. And ensure user can return to the main page. @param CallbackData The BMM context data. **/ VOID UpdatePageEnd ( IN BMM_CALLBACK_DATA *CallbackData ) { // // Create the "Apply changes" and "Discard changes" tags. // if (CallbackData->BmmAskSaveOrNot) { HiiCreateSubTitleOpCode ( mStartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0 ); HiiCreateActionOpCode ( mStartOpCodeHandle, KEY_VALUE_SAVE_AND_EXIT, STRING_TOKEN (STR_SAVE_AND_EXIT), STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); } // // Ensure user can return to the main page. // HiiCreateActionOpCode ( mStartOpCodeHandle, KEY_VALUE_NO_SAVE_AND_EXIT, STRING_TOKEN (STR_NO_SAVE_AND_EXIT), STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); HiiUpdateForm ( CallbackData->BmmHiiHandle, &gBootMaintFormSetGuid, CallbackData->BmmCurrentPageId, mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId mEndOpCodeHandle // LABEL_END ); }
/** Update the file explower page with the refershed file system. @param CallbackData BMM context data @param KeyValue Key value to identify the type of data to expect. @retval TRUE Inform the caller to create a callback packet to exit file explorer. @retval FALSE Indicate that there is no need to exit file explorer. **/ BOOLEAN UpdateFileExplorer ( IN BMM_CALLBACK_DATA *CallbackData, IN UINT16 KeyValue ) { UINT16 FileOptionMask; BM_MENU_ENTRY *NewMenuEntry; BM_FILE_CONTEXT *NewFileContext; EFI_FORM_ID FormId; BOOLEAN ExitFileExplorer; EFI_STATUS Status; NewMenuEntry = NULL; NewFileContext = NULL; ExitFileExplorer = FALSE; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue); if (FileExplorerDisplayUnknown == CallbackData->FeDisplayContext) { // // First in, display file system. // BOpt_FreeMenu (&FsOptionMenu); BOpt_FindFileSystem (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu); UpdateFileExplorePage (CallbackData, &FsOptionMenu); CallbackData->FeDisplayContext = FileExplorerDisplayFileSystem; } else { if (FileExplorerDisplayFileSystem == CallbackData->FeDisplayContext) { NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask); } else if (FileExplorerDisplayDirectory == CallbackData->FeDisplayContext) { NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask); } NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext; if (NewFileContext->IsDir ) { CallbackData->FeDisplayContext = FileExplorerDisplayDirectory; RemoveEntryList (&NewMenuEntry->Link); BOpt_FreeMenu (&DirectoryMenu); Status = BOpt_FindFiles (CallbackData, NewMenuEntry); if (EFI_ERROR (Status)) { ExitFileExplorer = TRUE; goto exit; } CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu); BOpt_DestroyMenuEntry (NewMenuEntry); UpdateFileExplorePage (CallbackData, &DirectoryMenu); } else { switch (CallbackData->FeCurrentState) { case FileExplorerStateBootFromFile: // // Here boot from file // BootThisFile (NewFileContext); ExitFileExplorer = TRUE; break; case FileExplorerStateAddBootOption: case FileExplorerStateAddDriverOptionState: if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) { FormId = FORM_BOOT_ADD_DESCRIPTION_ID; } else { FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; } CallbackData->MenuEntry = NewMenuEntry; CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath; // // Create Subtitle op-code for the display string of the option. // RefreshUpdateData (); mStartLabel->Number = FormId; HiiCreateSubTitleOpCode ( mStartOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, 0, 0 ); HiiUpdateForm ( CallbackData->FeHiiHandle, &mFileExplorerGuid, FormId, mStartOpCodeHandle, // Label FormId mEndOpCodeHandle // LABEL_END ); break; default: break; } } } exit: return ExitFileExplorer; }
/** Create a Hii Update data Handle used to call IfrLibUpdateForm. @param ThunkContext The HII Thunk Context. @param FwUpdateData The Framework Update Data. @param UefiOpCodeHandle The UEFI opcode handle. @retval EFI_SUCCESS The UEFI Update Data is created successfully. @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData. @retval EFI_OUT_OF_RESOURCES There is not enough resource. **/ EFI_STATUS FwUpdateDataToUefiUpdateData ( IN HII_THUNK_CONTEXT *ThunkContext, IN CONST EFI_HII_UPDATE_DATA *FwUpdateData, IN VOID *UefiOpCodeHandle ) { FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode; FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode; UINTN Index; UINTN DataCount; UINT8 *OpCodeBuffer; LIST_ENTRY *StorageList; FORMSET_STORAGE *Storage; FORM_BROWSER_FORMSET *FormSet; CHAR16 *DefaultVarStoreName; UINT16 DefaultVarStoreId; EFI_IFR_VARSTORE_SELECT *SelectVarOp; FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data; FormSet = ThunkContext->FormSet; DefaultVarStoreId = FormSet->DefaultVarStoreId; DefaultVarStoreName = FormSet->OriginalDefaultVarStoreName; for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) { switch (FwOpCode->OpCode) { case FRAMEWORK_EFI_IFR_SUBTITLE_OP: OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode)->SubTitle, 0, 0, 0); DataCount = 1; break; case FRAMEWORK_EFI_IFR_TEXT_OP: OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_REF_OP: OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_ONE_OF_OP: OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP: OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_CHECKBOX_OP: OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_STRING_OP: OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode); DataCount = 1; break; case EFI_IFR_BANNER_OP: OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (EFI_IFR_BANNER *) FwOpCode); DataCount = 1; break; case EFI_IFR_END_ONE_OF_OP: OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle); DataCount = 1; break; case FRAMEWORK_EFI_IFR_NUMERIC_OP: OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode); DataCount = 1; break; case EFI_IFR_VARSTORE_SELECT_OP: OpCodeBuffer = (UINT8 *) FwOpCode; SelectVarOp = (EFI_IFR_VARSTORE_SELECT *) FwOpCode; // // Check whether the selected VarId is in StorageList. // StorageList = GetFirstNode (&FormSet->StorageListHead); while (!IsNull (&FormSet->StorageListHead, StorageList)) { Storage = FORMSET_STORAGE_FROM_LINK (StorageList); if (Storage->VarStoreId == SelectVarOp->VarId) { break; } StorageList = GetNextNode (&FormSet->StorageListHead, StorageList); } ASSERT (!IsNull (&FormSet->StorageListHead, StorageList)); // // Change VarStoreId to the selected VarId. // FormSet->DefaultVarStoreId = SelectVarOp->VarId; if (SelectVarOp->VarId == DefaultVarStoreId) { FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName; } DataCount = 1; break; default: ASSERT (FALSE); return EFI_UNSUPPORTED; } if (OpCodeBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length); } // // Revert FromSet default varstore ID. // FormSet->DefaultVarStoreId = DefaultVarStoreId; FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName; return EFI_SUCCESS; }
/** This function invokes Boot Manager. If all devices have not a chance to be connected, the connect all will be triggered. It then enumerate all boot options. If a boot option from the Boot Manager page is selected, Boot Manager will boot from this boot option. **/ VOID CallBootManager ( VOID ) { EFI_STATUS Status; BDS_COMMON_OPTION *Option; LIST_ENTRY *Link; CHAR16 *ExitData; UINTN ExitDataSize; EFI_STRING_ID Token; EFI_INPUT_KEY Key; CHAR16 *HelpString; UINTN HelpSize; EFI_STRING_ID HelpToken; UINT16 *TempStr; EFI_HII_HANDLE HiiHandle; EFI_BROWSER_ACTION_REQUEST ActionRequest; VOID *StartOpCodeHandle; VOID *EndOpCodeHandle; EFI_IFR_GUID_LABEL *StartLabel; EFI_IFR_GUID_LABEL *EndLabel; UINT16 DeviceType; BOOLEAN IsLegacyOption; BOOLEAN NeedEndOp; DeviceType = (UINT16) -1; gOption = NULL; InitializeListHead (&mBootOptionsList); // // Connect all prior to entering the platform setup menu. // if (!gConnectAllHappened) { BdsLibConnectAllDriversToAllControllers (); gConnectAllHappened = TRUE; } BdsLibEnumerateAllBootOption (&mBootOptionsList); // // Group the legacy boot options for the same device type // GroupMultipleLegacyBootOption4SameType (); InitializeListHead (&mBootOptionsList); BdsLibBuildOptionFromVar (&mBootOptionsList, L"BootOrder"); HiiHandle = gBootManagerPrivate.HiiHandle; // // Allocate space for creation of UpdateData Buffer // 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_BOOT_OPTION; // // 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_BOOT_OPTION_END; mKeyInput = 0; NeedEndOp = FALSE; for (Link = GetFirstNode (&mBootOptionsList); !IsNull (&mBootOptionsList, Link); Link = GetNextNode (&mBootOptionsList, Link)) { Option = CR (Link, BDS_COMMON_OPTION, Link, BDS_LOAD_OPTION_SIGNATURE); // // At this stage we are creating a menu entry, thus the Keys are reproduceable // mKeyInput++; // // Don't display the hidden/inactive boot option // if (((Option->Attribute & LOAD_OPTION_HIDDEN) != 0) || ((Option->Attribute & LOAD_OPTION_ACTIVE) == 0)) { continue; } // // Group the legacy boot option in the sub title created dynamically // IsLegacyOption = (BOOLEAN) ( (DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) && (DevicePathSubType (Option->DevicePath) == BBS_BBS_DP) ); if (!IsLegacyOption && NeedEndOp) { NeedEndOp = FALSE; HiiCreateEndOpCode (StartOpCodeHandle); } if (IsLegacyOption && DeviceType != ((BBS_BBS_DEVICE_PATH *) Option->DevicePath)->DeviceType) { if (NeedEndOp) { HiiCreateEndOpCode (StartOpCodeHandle); } DeviceType = ((BBS_BBS_DEVICE_PATH *) Option->DevicePath)->DeviceType; Token = HiiSetString ( HiiHandle, 0, mDeviceTypeStr[ MIN (DeviceType & 0xF, ARRAY_SIZE (mDeviceTypeStr) - 1) ], NULL ); HiiCreateSubTitleOpCode (StartOpCodeHandle, Token, 0, 0, 1); NeedEndOp = TRUE; } ASSERT (Option->Description != NULL); Token = HiiSetString (HiiHandle, 0, Option->Description, NULL); TempStr = DevicePathToStr (Option->DevicePath); HelpSize = StrSize (TempStr) + StrSize (L"Device Path : "); HelpString = AllocateZeroPool (HelpSize); ASSERT (HelpString != NULL); StrCatS (HelpString, HelpSize / sizeof (CHAR16), L"Device Path : "); StrCatS (HelpString, HelpSize / sizeof (CHAR16), TempStr); HelpToken = HiiSetString (HiiHandle, 0, HelpString, NULL); HiiCreateActionOpCode ( StartOpCodeHandle, mKeyInput, Token, HelpToken, EFI_IFR_FLAG_CALLBACK, 0 ); } if (NeedEndOp) { HiiCreateEndOpCode (StartOpCodeHandle); } HiiUpdateForm ( HiiHandle, &gBootManagerFormSetGuid, BOOT_MANAGER_FORM_ID, StartOpCodeHandle, EndOpCodeHandle ); HiiFreeOpCodeHandle (StartOpCodeHandle); HiiFreeOpCodeHandle (EndOpCodeHandle); ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE; Status = gFormBrowser2->SendForm ( gFormBrowser2, &HiiHandle, 1, &gBootManagerFormSetGuid, 0, NULL, &ActionRequest ); if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) { EnableResetRequired (); } if (gOption == NULL) { return ; } // // Will leave browser, check any reset required change is applied? if yes, reset system // SetupResetReminder (); // // Restore to original mode before launching boot option. // BdsSetConsoleMode (FALSE); // // parse the selected option // Status = BdsLibBootViaBootOption (gOption, gOption->DevicePath, &ExitDataSize, &ExitData); if (!EFI_ERROR (Status)) { gOption->StatusString = GetStringById (STRING_TOKEN (STR_BOOT_SUCCEEDED)); PlatformBdsBootSuccess (gOption); } else { gOption->StatusString = GetStringById (STRING_TOKEN (STR_BOOT_FAILED)); PlatformBdsBootFail (gOption, Status, ExitData, ExitDataSize); gST->ConOut->OutputString ( gST->ConOut, GetStringById (STRING_TOKEN (STR_ANY_KEY_CONTINUE)) ); gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); } }
/** 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 Hii Update data Handle used to call IfrLibUpdateForm. @param ThunkContext The HII Thunk Context. @param FwUpdateData The Framework Update Data. @param UefiOpCodeHandle The UEFI opcode hanlde. @retval EFI_SUCCESS The UEFI Update Data is created successfully. @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData. @retval EFI_OUT_OF_RESOURCES There is not enough resource. **/ EFI_STATUS FwUpdateDataToUefiUpdateData ( IN HII_THUNK_CONTEXT *ThunkContext, IN CONST EFI_HII_UPDATE_DATA *FwUpdateData, IN VOID *UefiOpCodeHandle ) { FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode; FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode; UINTN Index; UINTN DataCount; UINT8 *OpCodeBuffer; FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data; for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) { switch (FwOpCode->OpCode) { case FRAMEWORK_EFI_IFR_SUBTITLE_OP: OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode)->SubTitle, 0, 0, 0); DataCount = 1; break; case FRAMEWORK_EFI_IFR_TEXT_OP: OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_REF_OP: OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_ONE_OF_OP: OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP: OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_CHECKBOX_OP: OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_STRING_OP: OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode); DataCount = 1; break; case EFI_IFR_BANNER_OP: OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (EFI_IFR_BANNER *) FwOpCode); DataCount = 1; break; case EFI_IFR_END_ONE_OF_OP: OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle); DataCount = 1; break; case FRAMEWORK_EFI_IFR_NUMERIC_OP: OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode); DataCount = 1; break; default: ASSERT (FALSE); return EFI_UNSUPPORTED; } if (OpCodeBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length); } return EFI_SUCCESS; }
/** Update the file explorer page with the refreshed file system. @param[in] PrivateData Module private data. @param[in] KeyValue Key value to identify the type of data to expect. @retval TRUE Inform the caller to create a callback packet to exit file explorer. @retval FALSE Indicate that there is no need to exit file explorer. **/ BOOLEAN UpdateFileExplorer ( IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData, IN UINT16 KeyValue ) { UINT16 FileOptionMask; SECUREBOOT_MENU_ENTRY *NewMenuEntry; SECUREBOOT_FILE_CONTEXT *NewFileContext; EFI_FORM_ID FormId; BOOLEAN ExitFileExplorer; EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath; NewMenuEntry = NULL; NewFileContext = NULL; ExitFileExplorer = FALSE; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue); if (PrivateData->FeDisplayContext == FileExplorerDisplayUnknown) { // // First in, display file system. // FreeMenu (&FsOptionMenu); FindFileSystem (); CreateMenuStringToken (PrivateData->HiiHandle, &FsOptionMenu); UpdateFileExplorePage (PrivateData->HiiHandle, &FsOptionMenu, PrivateData->FeCurrentState); PrivateData->FeDisplayContext = FileExplorerDisplayFileSystem; } else { if (PrivateData->FeDisplayContext == FileExplorerDisplayFileSystem) { NewMenuEntry = GetMenuEntry (&FsOptionMenu, FileOptionMask); } else if (PrivateData->FeDisplayContext == FileExplorerDisplayDirectory) { NewMenuEntry = GetMenuEntry (&DirectoryMenu, FileOptionMask); } NewFileContext = (SECUREBOOT_FILE_CONTEXT *) NewMenuEntry->FileContext; if (NewFileContext->IsDir ) { PrivateData->FeDisplayContext = FileExplorerDisplayDirectory; RemoveEntryList (&NewMenuEntry->Link); FreeMenu (&DirectoryMenu); Status = FindFiles (NewMenuEntry); if (EFI_ERROR (Status)) { ExitFileExplorer = TRUE; goto OnExit; } CreateMenuStringToken (PrivateData->HiiHandle, &DirectoryMenu); DestroyMenuEntry (NewMenuEntry); UpdateFileExplorePage (PrivateData->HiiHandle, &DirectoryMenu, PrivateData->FeCurrentState); } else { if (PrivateData->FeCurrentState == FileExplorerStateEnrollPkFile) { FormId = SECUREBOOT_ADD_PK_FILE_FORM_ID; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollKekFile) { FormId = FORMID_ENROLL_KEK_FORM; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollSignatureFileToDb) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DB; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollSignatureFileToDbx) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DBX; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollSignatureFileToDbt) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DBT; } else { return FALSE; } PrivateData->MenuEntry = NewMenuEntry; PrivateData->FileContext->FileName = NewFileContext->FileName; TmpDevicePath = NewFileContext->DevicePath; OpenFileByDevicePath ( &TmpDevicePath, &PrivateData->FileContext->FHandle, EFI_FILE_MODE_READ, 0 ); // // Create Subtitle op-code for the display string of the option. // RefreshUpdateData (); mStartLabel->Number = FormId; HiiCreateSubTitleOpCode ( mStartOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, 0, 0 ); HiiUpdateForm ( PrivateData->HiiHandle, &gSecureBootConfigFormSetGuid, FormId, mStartOpCodeHandle, // Label FormId mEndOpCodeHandle // LABEL_END ); } } OnExit: return ExitFileExplorer; }