]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Connect controllers after loading an EFI driver
authorMichael Brown <mcb30@ipxe.org>
Thu, 1 Oct 2020 15:07:23 +0000 (16:07 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 1 Oct 2020 23:36:33 +0000 (00:36 +0100)
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>
src/image/efi_image.c

index a112a8fcb5c45d2aec69b932559b74ed42473558..942b7aeeb86a23a6d99929db617187e11bb6a294 100644 (file)
@@ -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>
@@ -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;
@@ -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 =
@@ -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;