/** This function attempts to boot per the boot order specified by platform policy. If the boot via Boot#### returns with a status of EFI_SUCCESS the boot manager will stop processing the BootOrder variable and present a boot manager menu to the user. If a boot via Boot#### returns a status other than EFI_SUCCESS, the boot has failed and the next Boot#### in the BootOrder variable will be tried until all possibilities are exhausted. -- Chapter 3.1.1 Boot Manager Programming, the 4th paragraph **/ VOID DefaultBootBehavior ( VOID ) { UINTN BootOptionCount; EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu; EfiBootManagerGetBootManagerMenu (&BootManagerMenu); // // BootManagerMenu always contains the correct information even the above function returns failure. // BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); if (BootAllBootOptions (BootOptions, BootOptionCount)) { // // Follow generic rule, Call BdsDxeOnConnectConInCallBack to connect ConIn before enter UI // if (PcdGetBool (PcdConInConnectOnDemand)) { BdsDxeOnConnectConInCallBack (NULL, NULL); } // // Show the Boot Manager Menu after successful boot // EfiBootManagerBoot (&BootManagerMenu); } else { EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); // // Re-scan all EFI boot options in case all the boot#### are deleted or failed to boot // // If no valid boot options exist, the boot manager will enumerate all removable media // devices followed by all fixed media devices. The order within each group is undefined. // These new default boot options are not saved to non volatile storage.The boot manger // will then attempt toboot from each boot option. // -- Chapter 3.3 Boot Manager Programming, the 2nd paragraph // EfiBootManagerConnectAll (); BootOptions = BdsEnumerateBootOptions (&BootOptionCount); if (!BootAllBootOptions (BootOptions, BootOptionCount)) { DEBUG ((EFI_D_ERROR, "[Bds]No bootable device!\n")); EfiBootManagerBoot (&BootManagerMenu); } } EfiBootManagerFreeLoadOption (&BootManagerMenu); EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); }
/** Boot a file selected by user at File Expoloer of BMM. @param FileContext The file context data, which contains the device path of the file to be boot from. @retval EFI_SUCCESS The function completed successfull. @return Other value if the boot from the file fails. **/ EFI_STATUS BootThisFile ( IN BM_FILE_CONTEXT *FileContext ) { EFI_BOOT_MANAGER_LOAD_OPTION BootOption; EfiBootManagerInitializeLoadOption ( &BootOption, 0, LoadOptionTypeBoot, LOAD_OPTION_ACTIVE, FileContext->FileName, FileContext->DevicePath, NULL, 0 ); // // Since current no boot from removable media directly is allowed */ // gST->ConOut->ClearScreen (gST->ConOut); BdsSetConsoleMode (FALSE); EfiBootManagerBoot (&BootOption); BdsSetConsoleMode (TRUE); EfiBootManagerFreeLoadOption (&BootOption); return BootOption.Status; }
/** Boot the file specified by the input file path info. @param FilePath Point to the file path. @retval TRUE Exit caller function. @retval FALSE Not exit caller function. **/ BOOLEAN BootFromFile ( IN EFI_DEVICE_PATH_PROTOCOL *FilePath ) { EFI_BOOT_MANAGER_LOAD_OPTION BootOption; CHAR16 *FileName; FileName = ExtractFileNameFromDevicePath(FilePath); EfiBootManagerInitializeLoadOption ( &BootOption, 0, LoadOptionTypeBoot, LOAD_OPTION_ACTIVE, FileName, FilePath, NULL, 0 ); // // Since current no boot from removable media directly is allowed */ // gST->ConOut->ClearScreen (gST->ConOut); BmmBdsSetConsoleMode (FALSE); EfiBootManagerBoot (&BootOption); BmmBdsSetConsoleMode (TRUE); FreePool(FileName); EfiBootManagerFreeLoadOption (&BootOption); return FALSE; }
/** Try to boot the boot option triggered by hot key. **/ VOID EFIAPI EfiBootManagerHotkeyBoot ( VOID ) { if (mHotkeyBootOption.OptionNumber != LoadOptionNumberUnassigned) { EfiBootManagerBoot (&mHotkeyBootOption); EfiBootManagerFreeLoadOption (&mHotkeyBootOption); mHotkeyBootOption.OptionNumber = LoadOptionNumberUnassigned; } }
/** Attempt to boot each boot option in the BootOptions array. @param BootOptions Input boot option array. @param BootOptionCount Input boot option count. @retval TRUE Successfully boot one of the boot options. @retval FALSE Failed boot any of the boot options. **/ BOOLEAN BootAllBootOptions ( IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions, IN UINTN BootOptionCount ) { UINTN Index; // // Attempt boot each boot option // for (Index = 0; Index < BootOptionCount; Index++) { // // According to EFI Specification, if a load option is not marked // as LOAD_OPTION_ACTIVE, the boot manager will not automatically // load the option. // if ((BootOptions[Index].Attributes & LOAD_OPTION_ACTIVE) == 0) { continue; } // // Boot#### load options with LOAD_OPTION_CATEGORY_APP are executables which are not // part of the normal boot processing. Boot options with reserved category values will be // ignored by the boot manager. // if ((BootOptions[Index].Attributes & LOAD_OPTION_CATEGORY) != LOAD_OPTION_CATEGORY_BOOT) { continue; } // // All the driver options should have been processed since // now boot will be performed. // EfiBootManagerBoot (&BootOptions[Index]); // // Successful boot breaks the loop, otherwise tries next boot option // if (BootOptions[Index].Status == EFI_SUCCESS) { break; } } return (BOOLEAN) (Index < BootOptionCount); }
STATIC EFI_STATUS BootOptionEfiOption ( IN MENU_ENTRY* This ) { EFI_BOOT_MANAGER_LOAD_OPTION *BootOption = This->Private; EfiBootManagerBoot(BootOption); if(EFI_ERROR(BootOption->Status)) { CHAR8 Buf[100]; AsciiSPrint(Buf, 100, "%r", BootOption->Status); MenuShowMessage("Error", Buf); } return BootOption->Status; }
/** This call back function is registered with Boot Manager formset. When user selects a boot option, this call back function will be triggered. The boot option is saved for later processing. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Action Specifies the type of action taken by the browser. @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the type of data to expect. @param Type The type of value for the question. @param Value A pointer to the data being sent to the original exporting driver. @param ActionRequest On return, points to the action requested by the callback function. @retval EFI_SUCCESS The callback successfully handled the action. @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters. **/ EFI_STATUS EFIAPI BootManagerCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; UINTN BootOptionCount; EFI_INPUT_KEY Key; if (Action != EFI_BROWSER_ACTION_CHANGED) { // // Do nothing for other UEFI Action. Only do call back when data is changed. // return EFI_UNSUPPORTED; } if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); // // parse the selected option // BmBdsSetConsoleMode (FALSE); EfiBootManagerBoot (&BootOption[QuestionId - 1]); BmBdsSetConsoleMode (TRUE); if (EFI_ERROR (BootOption[QuestionId - 1].Status)) { gST->ConOut->OutputString ( gST->ConOut, HiiGetString (gBootManagerPrivate.HiiHandle, STRING_TOKEN (STR_ANY_KEY_CONTINUE), NULL) ); gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); } EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); return EFI_SUCCESS; }
/** This call back function is registered with Boot Manager formset. When user selects a boot option, this call back function will be triggered. The boot option is saved for later processing. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Action Specifies the type of action taken by the browser. @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the type of data to expect. @param Type The type of value for the question. @param Value A pointer to the data being sent to the original exporting driver. @param ActionRequest On return, points to the action requested by the callback function. @retval EFI_SUCCESS The callback successfully handled the action. @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters. **/ EFI_STATUS EFIAPI BootManagerCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; UINTN BootOptionCount; EFI_INPUT_KEY Key; if (Action == EFI_BROWSER_ACTION_FORM_OPEN) { // //Means enter the boot manager form. //Update the boot manage page,because the boot option may changed. // if (QuestionId == 0x1212){ UpdateBootManager(); } return EFI_SUCCESS; } if (Action != EFI_BROWSER_ACTION_CHANGED) { // // Do nothing for other UEFI Action. Only do call back when data is changed. // return EFI_UNSUPPORTED; } if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); // // Clear the screen before. // gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); gST->ConOut->ClearScreen (gST->ConOut); // //check any reset required change is applied? if yes, reset system // BmSetupResetReminder (); // // parse the selected option // BmSetConsoleMode (FALSE); EfiBootManagerBoot (&BootOption[QuestionId - 1]); BmSetConsoleMode (TRUE); if (EFI_ERROR (BootOption[QuestionId - 1].Status)) { gST->ConOut->OutputString ( gST->ConOut, HiiGetString (gBootManagerPrivate.HiiHandle, STRING_TOKEN (STR_ANY_KEY_CONTINUE), NULL) ); gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); } EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); return EFI_SUCCESS; }
/** This call back function is registered with Boot Manager formset. When user selects a boot option, this call back function will be triggered. The boot option is saved for later processing. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Action Specifies the type of action taken by the browser. @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the type of data to expect. @param Type The type of value for the question. @param Value A pointer to the data being sent to the original exporting driver. @param ActionRequest On return, points to the action requested by the callback function. @retval EFI_SUCCESS The callback successfully handled the action. @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters. **/ EFI_STATUS EFIAPI BootManagerCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { UINTN Index; EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; UINTN BootOptionCount; UINT16 KeyCount; EFI_INPUT_KEY Key; EFI_BOOT_MANAGER_LOAD_OPTION Option; if (Action != EFI_BROWSER_ACTION_CHANGED) { // // Do nothing for other UEFI Action. Only do call back when data is changed. // return EFI_UNSUPPORTED; } if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } // // Initialize the key count // KeyCount = 0; Option.Attributes = 0; BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); for (Index = 0; Index < BootOptionCount; Index++) { KeyCount++; EfiBootManagerInitializeLoadOption ( &Option, BootOption[Index].OptionNumber, BootOption[Index].OptionType, BootOption[Index].Attributes, BootOption[Index].Description, BootOption[Index].FilePath, BootOption[Index].OptionalData, BootOption[Index].OptionalDataSize ); // // Is this device the one chosen? // if (KeyCount == QuestionId) { // // Clear the screen before. // gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); gST->ConOut->ClearScreen (gST->ConOut); // // Check any reset required change is applied? if yes, reset system // SetupResetReminder(); // // Parse the selected option. // BdsSetConsoleMode(FALSE); EfiBootManagerBoot (&Option); BdsSetConsoleMode(TRUE); if (EFI_ERROR (Option.Status)) { gST->ConOut->OutputString ( gST->ConOut, GetStringById (STRING_TOKEN (STR_ANY_KEY_CONTINUE)) ); gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); } break; } } EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); return EFI_SUCCESS; }