From 0bb0aea878bc9c2f775d967df83d3c081c1c34a2 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 5 May 2023 14:46:42 +0100 Subject: [efi] Allow currently executing image to be opened via virtual filesystem 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 --- src/image/efi_image.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/image/efi_image.c b/src/image/efi_image.c index 467fb05..0be4856 100644 --- a/src/image/efi_image.c +++ b/src/image/efi_image.c @@ -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; } -- cgit v1.1