diff --git a/src/arch/i386/image/multiboot.c b/src/arch/i386/image/multiboot.c index cdf81e6e..746b8a57 100644 --- a/src/arch/i386/image/multiboot.c +++ b/src/arch/i386/image/multiboot.c @@ -33,7 +33,7 @@ #include #include -struct image_type multiboot_image_type __image_type; +struct image_type multiboot_image_type __image_type ( PROBE_MULTIBOOT ); /** Multiboot flags that we support */ #define MB_SUPPORTED_FLAGS ( MB_FLAG_PGALIGN | MB_FLAG_MEMMAP | \ @@ -320,7 +320,7 @@ int multiboot_load ( struct image *image ) { } /** Multiboot image type */ -struct image_type multiboot_image_type __image_type = { +struct image_type multiboot_image_type __image_type ( PROBE_MULTIBOOT ) = { .name = "Multiboot", .load = multiboot_load, .exec = multiboot_exec, diff --git a/src/image/elf.c b/src/image/elf.c index 869be3f3..167ef2bf 100644 --- a/src/image/elf.c +++ b/src/image/elf.c @@ -30,7 +30,7 @@ #include #include -struct image_type elf_image_type __image_type; +struct image_type elf_image_type __image_type ( PROBE_NORMAL ); typedef Elf32_Ehdr Elf_Ehdr; typedef Elf32_Phdr Elf_Phdr; @@ -143,7 +143,7 @@ int elf_load ( struct image *image ) { } /** ELF image type */ -struct image_type elf_image_type __image_type = { +struct image_type elf_image_type __image_type ( PROBE_NORMAL ) = { .name = "ELF", .load = elf_load, .exec = elf_exec, diff --git a/src/include/gpxe/image.h b/src/include/gpxe/image.h index 5367735c..c91468c6 100644 --- a/src/include/gpxe/image.h +++ b/src/include/gpxe/image.h @@ -79,18 +79,30 @@ struct image_type { int ( * exec ) ( struct image *image ); }; -/** An executable or loadable image type */ -#define __image_type __table ( struct image_type, image_types, 01 ) +/** + * Multiboot image probe priority + * + * Multiboot images are also valid executables in another format + * (e.g. ELF), so we must perform the multiboot probe first. + */ +#define PROBE_MULTIBOOT 01 /** - * An unverifiable executable or loadable image type - * - * This should be used to mark image types for which there are no - * signature or other checks that can be used to verify the validity - * of the image (such as PXE images). These will then be tried last - * in the list of image types. + * Normal image probe priority */ -#define __default_image_type __table ( struct image_type, image_types, 02 ) +#define PROBE_NORMAL 02 + +/** + * PXE image probe priority + * + * PXE images have no signature checks, so will claim all image files. + * They must therefore be tried last in the probe order list. + */ +#define PROBE_PXE 03 + +/** An executable or loadable image type */ +#define __image_type( probe_order ) \ + __table ( struct image_type, image_types, probe_order ) extern struct list_head images;