]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Allow currently executing image to be opened via virtual filesystem
authorMichael Brown <mcb30@ipxe.org>
Fri, 5 May 2023 13:46:42 +0000 (14:46 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 5 May 2023 13:54:20 +0000 (14:54 +0100)
When invoking a kernel via the UEFI shim, the kernel image must be
accessible via EFI_SIMPLE_FILE_SYSTEM_PROTOCOL but must not be present
in the magic initrd constructed from all registered images.

Re-register a currently executing EFI image and mark it as hidden,
thereby allowing it to be accessed via the virtual filesystem exposed
via EFI_SIMPLE_FILE_SYSTEM_PROTOCOL without appearing in the magic
initrd contents.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/image/efi_image.c

index 467fb05a4708e0ef2af9d7eddc45d46674d50dbe..0be485649b86ba68f1b94f5a5aaadf65e6e5dcf9 100644 (file)
@@ -141,6 +141,7 @@ static int efi_image_exec ( struct image *image ) {
        EFI_HANDLE handle;
        EFI_MEMORY_TYPE type;
        wchar_t *cmdline;
+       unsigned int toggle;
        EFI_STATUS efirc;
        int rc;
 
@@ -153,6 +154,12 @@ static int efi_image_exec ( struct image *image ) {
                goto err_no_snpdev;
        }
 
+       /* Re-register as a hidden image to allow for access via file I/O */
+       toggle = ( ~image->flags & IMAGE_HIDDEN );
+       image->flags |= IMAGE_HIDDEN;
+       if ( ( rc = register_image ( image ) ) != 0 )
+               goto err_register_image;
+
        /* Install file I/O protocols */
        if ( ( rc = efi_file_install ( snpdev->handle ) ) != 0 ) {
                DBGC ( image, "EFIIMAGE %s could not install file protocol: "
@@ -296,6 +303,9 @@ static int efi_image_exec ( struct image *image ) {
  err_pxe_install:
        efi_file_uninstall ( snpdev->handle );
  err_file_install:
+       unregister_image ( image );
+ err_register_image:
+       image->flags ^= toggle;
  err_no_snpdev:
        return rc;
 }