aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2023-05-04 14:21:42 +0100
committerMichael Brown <mcb30@ipxe.org>2023-05-05 14:54:20 +0100
commitf9beb20e99abbfcbea7cf222ba692aa3cbf10df7 (patch)
tree337aef1fa6a9a454a36fd54f278db82791c69394
parentf93e6b712ff2beb7ea4e169a681b8144785f3e49 (diff)
downloadipxe-f9beb20e99abbfcbea7cf222ba692aa3cbf10df7.zip
ipxe-f9beb20e99abbfcbea7cf222ba692aa3cbf10df7.tar.gz
ipxe-f9beb20e99abbfcbea7cf222ba692aa3cbf10df7.tar.bz2
[image] Allow for images to be hidden from lists of all images
When invoking a kernel via the UEFI shim, the kernel (and potentially also a helper binary such as GRUB) must be accessible via the virtual filesystem exposed via EFI_SIMPLE_FILE_SYSTEM_PROTOCOL but must not be present in the magic initrd constructed from all registered images. Allow for images to be flagged as hidden, which will cause them to be excluded from API-level lists of all images such as the virtual filesystem directory contents, the magic initrd, or the Multiboot module list. Hidden images remain visible to iPXE commands including "imgstat", which will show a "[HIDDEN]" flag for such images. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/arch/x86/image/bzimage.c4
-rw-r--r--src/arch/x86/image/multiboot.c4
-rw-r--r--src/include/ipxe/image.h12
-rw-r--r--src/interface/efi/efi_file.c36
-rw-r--r--src/usr/imgmgmt.c2
5 files changed, 39 insertions, 19 deletions
diff --git a/src/arch/x86/image/bzimage.c b/src/arch/x86/image/bzimage.c
index b15bd55..2c77614 100644
--- a/src/arch/x86/image/bzimage.c
+++ b/src/arch/x86/image/bzimage.c
@@ -355,6 +355,10 @@ static size_t bzimage_load_initrd ( struct image *image,
size_t offset;
size_t pad_len;
+ /* Skip hidden images */
+ if ( initrd->flags & IMAGE_HIDDEN )
+ return 0;
+
/* Create cpio header for non-prebuilt images */
offset = cpio_header ( initrd, &cpio );
diff --git a/src/arch/x86/image/multiboot.c b/src/arch/x86/image/multiboot.c
index c1c63bc..cada021 100644
--- a/src/arch/x86/image/multiboot.c
+++ b/src/arch/x86/image/multiboot.c
@@ -204,6 +204,10 @@ static int multiboot_add_modules ( struct image *image, physaddr_t start,
break;
}
+ /* Skip hidden images */
+ if ( module_image->flags & IMAGE_HIDDEN )
+ continue;
+
/* Page-align the module */
start = ( ( start + 0xfff ) & ~0xfff );
diff --git a/src/include/ipxe/image.h b/src/include/ipxe/image.h
index 9e0c0f2..e00af82 100644
--- a/src/include/ipxe/image.h
+++ b/src/include/ipxe/image.h
@@ -72,6 +72,9 @@ struct image {
/** Image will be automatically unregistered after execution */
#define IMAGE_AUTO_UNREGISTER 0x0008
+/** Image will be hidden from enumeration */
+#define IMAGE_HIDDEN 0x0010
+
/** An executable image type */
struct image_type {
/** Name of this image type */
@@ -162,15 +165,6 @@ extern struct image *current_image;
list_for_each_entry_safe ( (image), (tmp), &images, list )
/**
- * Test for existence of images
- *
- * @ret existence Some images exist
- */
-static inline int have_images ( void ) {
- return ( ! list_empty ( &images ) );
-}
-
-/**
* Retrieve first image
*
* @ret image Image, or NULL
diff --git a/src/interface/efi/efi_file.c b/src/interface/efi/efi_file.c
index fd0bcc6..673f902 100644
--- a/src/interface/efi/efi_file.c
+++ b/src/interface/efi/efi_file.c
@@ -250,6 +250,10 @@ static size_t efi_file_read_initrd ( struct efi_file_reader *reader ) {
len = 0;
for_each_image ( image ) {
+ /* Skip hidden images */
+ if ( image->flags & IMAGE_HIDDEN )
+ continue;
+
/* Pad to alignment boundary */
pad_len = ( ( -reader->pos ) & ( INITRD_ALIGN - 1 ) );
if ( pad_len ) {
@@ -524,13 +528,21 @@ static EFI_STATUS efi_file_read_dir ( struct efi_file *file, UINTN *len,
/* Construct directory entries for image-backed files */
index = file->pos;
for_each_image ( image ) {
- if ( index-- == 0 ) {
- efi_file_image ( &entry, image );
- efirc = efi_file_info ( &entry, len, data );
- if ( efirc == 0 )
- file->pos++;
- return efirc;
- }
+
+ /* Skip hidden images */
+ if ( image->flags & IMAGE_HIDDEN )
+ continue;
+
+ /* Skip preceding images */
+ if ( index-- )
+ continue;
+
+ /* Construct directory entry */
+ efi_file_image ( &entry, image );
+ efirc = efi_file_info ( &entry, len, data );
+ if ( efirc == 0 )
+ file->pos++;
+ return efirc;
}
/* No more entries */
@@ -1093,6 +1105,7 @@ int efi_file_install ( EFI_HANDLE handle ) {
EFI_DISK_IO_PROTOCOL *diskio;
void *interface;
} diskio;
+ struct image *image;
EFI_STATUS efirc;
int rc;
@@ -1156,9 +1169,12 @@ int efi_file_install ( EFI_HANDLE handle ) {
goto err_initrd_claim;
/* Install Linux initrd fixed device path file if non-empty */
- if ( have_images() &&
- ( ( rc = efi_file_path_install ( &efi_file_initrd ) ) != 0 ) ) {
- goto err_initrd_install;
+ for_each_image ( image ) {
+ if ( image->flags & IMAGE_HIDDEN )
+ continue;
+ if ( ( rc = efi_file_path_install ( &efi_file_initrd ) ) != 0 )
+ goto err_initrd_install;
+ break;
}
return 0;
diff --git a/src/usr/imgmgmt.c b/src/usr/imgmgmt.c
index b7fc829..94f3d2c 100644
--- a/src/usr/imgmgmt.c
+++ b/src/usr/imgmgmt.c
@@ -165,6 +165,8 @@ void imgstat ( struct image *image ) {
printf ( " [SELECTED]" );
if ( image->flags & IMAGE_AUTO_UNREGISTER )
printf ( " [AUTOFREE]" );
+ if ( image->flags & IMAGE_HIDDEN )
+ printf ( " [HIDDEN]" );
if ( image->cmdline )
printf ( " \"%s\"", image->cmdline );
printf ( "\n" );