summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 b15bd556..2c776147 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 c1c63bc9..cada021a 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 9e0c0f22..e00af82e 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 fd0bcc6c..673f902d 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 b7fc8293..94f3d2ce 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" );