MdeModulePkg/BM: Update boot options on device change
Register an event to trigger when a block device is added or removed that will update the list of boot options. Use a refreshguid to force the form to display the changes if it already open.
This commit is contained in:
@ -8,6 +8,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "BootManager.h"
|
#include "BootManager.h"
|
||||||
|
|
||||||
|
#include <Protocol/BlockIo.h>
|
||||||
|
|
||||||
UINT16 mKeyInput;
|
UINT16 mKeyInput;
|
||||||
EFI_GUID mBootManagerGuid = BOOT_MANAGER_FORMSET_GUID;
|
EFI_GUID mBootManagerGuid = BOOT_MANAGER_FORMSET_GUID;
|
||||||
//
|
//
|
||||||
@ -27,6 +29,10 @@ UINT32 mBmSetupVerticalResolution = 0;
|
|||||||
|
|
||||||
BOOLEAN mBmModeInitialized = FALSE;
|
BOOLEAN mBmModeInitialized = FALSE;
|
||||||
|
|
||||||
|
STATIC EFI_EVENT mBmRefreshEvent;
|
||||||
|
STATIC CONST EFI_GUID mBmRefreshGuid = BOOT_MANAGER_REFRESH_GUID;
|
||||||
|
STATIC VOID *mBlockIoRegistration; // Unused
|
||||||
|
|
||||||
CHAR16 *mDeviceTypeStr[] = {
|
CHAR16 *mDeviceTypeStr[] = {
|
||||||
L"Legacy BEV",
|
L"Legacy BEV",
|
||||||
L"Legacy Floppy",
|
L"Legacy Floppy",
|
||||||
@ -488,19 +494,6 @@ UpdateBootManager (
|
|||||||
|
|
||||||
DeviceType = (UINT16) -1;
|
DeviceType = (UINT16) -1;
|
||||||
|
|
||||||
//
|
|
||||||
// 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);
|
BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
|
||||||
|
|
||||||
HiiHandle = gBootManagerPrivate.HiiHandle;
|
HiiHandle = gBootManagerPrivate.HiiHandle;
|
||||||
@ -843,6 +836,26 @@ BootManagerCallback (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
RefreshBootOptions(
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN VOID *Context
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_TPL OldTpl = gBS->RaiseTPL(TPL_CALLBACK);
|
||||||
|
|
||||||
|
EfiBootManagerRefreshAllBootOption();
|
||||||
|
|
||||||
|
// BdsDxe doesn't group the legacy boot options for the same device type. It's UI's choice.
|
||||||
|
GroupMultipleLegacyBootOption4SameType();
|
||||||
|
|
||||||
|
UpdateBootManager();
|
||||||
|
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
Install Boot Manager Menu driver.
|
Install Boot Manager Menu driver.
|
||||||
@ -891,6 +904,23 @@ BootManagerUiLibConstructor (
|
|||||||
|
|
||||||
BmInitialBootModeInfo ();
|
BmInitialBootModeInfo ();
|
||||||
|
|
||||||
|
Status = gBS->CreateEventEx(
|
||||||
|
EVT_NOTIFY_SIGNAL,
|
||||||
|
TPL_CALLBACK,
|
||||||
|
RefreshBootOptions,
|
||||||
|
NULL,
|
||||||
|
&mBmRefreshGuid,
|
||||||
|
&mBmRefreshEvent
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
|
||||||
|
Status = gBS->RegisterProtocolNotify (
|
||||||
|
&gEfiBlockIoProtocolGuid,
|
||||||
|
mBmRefreshEvent,
|
||||||
|
&mBlockIoRegistration
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -911,6 +941,8 @@ BootManagerUiLibDestructor (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
gBS->CloseEvent(mBmRefreshEvent);
|
||||||
|
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
gBootManagerPrivate.DriverHandle,
|
gBootManagerPrivate.DriverHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
@ -46,6 +46,11 @@ typedef struct {
|
|||||||
0x847bc3fe, 0xb974, 0x446d, {0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b} \
|
0x847bc3fe, 0xb974, 0x446d, {0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BOOT_MANAGER_REFRESH_GUID \
|
||||||
|
{ \
|
||||||
|
0x7648C827, 0xBE32, 0x44D2, { 0xA1, 0x33, 0xF1, 0x7F, 0x93, 0x76, 0xC7, 0x00 } \
|
||||||
|
}
|
||||||
|
|
||||||
#define BOOT_MANAGER_FORM_ID 0x1030
|
#define BOOT_MANAGER_FORM_ID 0x1030
|
||||||
|
|
||||||
#define LABEL_BOOT_OPTION 0x00
|
#define LABEL_BOOT_OPTION 0x00
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
gEfiHiiConfigAccessProtocolGuid ## CONSUMES
|
gEfiHiiConfigAccessProtocolGuid ## CONSUMES
|
||||||
gEfiDevicePathToTextProtocolGuid ## CONSUMES
|
gEfiDevicePathToTextProtocolGuid ## CONSUMES
|
||||||
gEdkiiFormBrowserEx2ProtocolGuid ## CONSUMES
|
gEdkiiFormBrowserEx2ProtocolGuid ## CONSUMES
|
||||||
|
gEfiBlockIoProtocolGuid
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
//
|
//
|
||||||
//**/
|
//**/
|
||||||
#define FORMSET_GUID { 0x847bc3fe, 0xb974, 0x446d, 0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b }
|
#define FORMSET_GUID { 0x847bc3fe, 0xb974, 0x446d, 0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b }
|
||||||
|
#define BOOT_MANAGER_REFRESH_GUID { 0x7648C827, 0xBE32, 0x44D2, { 0xA1, 0x33, 0xF1, 0x7F, 0x93, 0x76, 0xC7, 0x00 }}
|
||||||
|
|
||||||
#define BOOT_MANAGER_FORM_ID 0x1030
|
#define BOOT_MANAGER_FORM_ID 0x1030
|
||||||
|
|
||||||
@ -21,6 +22,7 @@ formset
|
|||||||
|
|
||||||
form formid = BOOT_MANAGER_FORM_ID,
|
form formid = BOOT_MANAGER_FORM_ID,
|
||||||
title = STRING_TOKEN(STR_BM_BANNER);
|
title = STRING_TOKEN(STR_BM_BANNER);
|
||||||
|
refreshguid = BOOT_MANAGER_REFRESH_GUID;
|
||||||
|
|
||||||
//
|
//
|
||||||
//Add this invisable text in order to indicate enter Boot Manager form.
|
//Add this invisable text in order to indicate enter Boot Manager form.
|
||||||
|
Reference in New Issue
Block a user