Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[efi] Do not raise TPL within EFI_DRIVER_BINDING_PROTOCOL.Supported()
When booting some versions of the UEFI shell, our driver binding
protocol's Supported() entry point is called at TPL_NOTIFY for no
discernible reason.  Attempting to raise to TPL_CALLBACK triggers an
immediate assertion failure in the firmware.

Since our Supported() method can run at any TPL, fix by simply not
attempting to raise the TPL within this method.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 26, 2018
1 parent 331ac45 commit 4f362a0
Showing 1 changed file with 0 additions and 7 deletions.
7 changes: 0 additions & 7 deletions src/interface/efi/efi_driver.c
Expand Up @@ -95,9 +95,7 @@ struct efi_device * efidev_parent ( struct device *dev ) {
static EFI_STATUS EFIAPI
efi_driver_supported ( EFI_DRIVER_BINDING_PROTOCOL *driver __unused,
EFI_HANDLE device, EFI_DEVICE_PATH_PROTOCOL *child ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
struct efi_driver *efidrv;
EFI_TPL saved_tpl;
int rc;

DBGCP ( device, "EFIDRV %s DRIVER_SUPPORTED",
Expand All @@ -113,22 +111,17 @@ efi_driver_supported ( EFI_DRIVER_BINDING_PROTOCOL *driver __unused,
return EFI_ALREADY_STARTED;
}

/* Raise TPL */
saved_tpl = bs->RaiseTPL ( TPL_CALLBACK );

/* Look for a driver claiming to support this device */
for_each_table_entry ( efidrv, EFI_DRIVERS ) {
if ( ( rc = efidrv->supported ( device ) ) == 0 ) {
DBGC ( device, "EFIDRV %s has driver \"%s\"\n",
efi_handle_name ( device ), efidrv->name );
bs->RestoreTPL ( saved_tpl );
return 0;
}
}
DBGCP ( device, "EFIDRV %s has no driver\n",
efi_handle_name ( device ) );

bs->RestoreTPL ( saved_tpl );
return EFI_UNSUPPORTED;
}

Expand Down

0 comments on commit 4f362a0

Please sign in to comment.