Skip to content

Commit

Permalink
[efi] Connect controllers after loading an EFI driver
Browse files Browse the repository at this point in the history
iPXE is already capable of loading EFI drivers on demand (via
e.g. "chain UsbMassStorageDxe.efi") but there is currently no way to
trigger connection of the driver to any preexisting handles.

Add an explicit call to (re)connect all drivers after successfully
loading an image with a code type that indicates a boot services
driver.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Oct 1, 2020
1 parent eede697 commit fbb5989
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/image/efi_image.c
Expand Up @@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/efi/efi_strings.h>
#include <ipxe/efi/efi_wrap.h>
#include <ipxe/efi/efi_pxe.h>
#include <ipxe/efi/efi_driver.h>
#include <ipxe/image.h>
#include <ipxe/init.h>
#include <ipxe/features.h>
Expand Down Expand Up @@ -140,6 +141,7 @@ static int efi_image_exec ( struct image *image ) {
void *interface;
} loaded;
EFI_HANDLE handle;
EFI_MEMORY_TYPE type;
wchar_t *cmdline;
EFI_STATUS efirc;
int rc;
Expand Down Expand Up @@ -231,6 +233,9 @@ static int efi_image_exec ( struct image *image ) {
assert ( loaded.image->LoadOptionsSize == 0 );
assert ( loaded.image->LoadOptions == NULL );

/* Record image code type */
type = loaded.image->ImageCodeType;

/* Set command line */
loaded.image->LoadOptions = cmdline;
loaded.image->LoadOptionsSize =
Expand All @@ -253,6 +258,12 @@ static int efi_image_exec ( struct image *image ) {
goto err_start_image;
}

/* If image was a driver, connect it up to anything available */
if ( type == EfiBootServicesCode ) {
DBGC ( image, "EFIIMAGE %p connecting drivers\n", image );
efi_driver_reconnect_all();
}

/* Success */
rc = 0;

Expand Down

0 comments on commit fbb5989

Please sign in to comment.