Hey all, Something that Rob mentioned to me at ELC, and others have mentioned before is that it would be nice if 'bootm' (which says "boot application image stored in memory" in the help, even) would just work with zImage or Image or whatever is spit directly out of the kernel.
The following shows roughly what I'm thinking about how we would handle this: diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 0706086..14319b2 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -332,6 +332,17 @@ struct zimage_header { #define LINUX_ARM_ZIMAGE_MAGIC 0x016f2818 +int check_image_linux_kernel(ulong image) +{ + struct zimage_header *zi; + + zi = (struct zimage_header *)map_sysmem(image, 0); + if (zi->zi_magic == LINUX_ARM_ZIMAGE_MAGIC) + return 0; + + return 1; +} + int bootz_setup(ulong image, ulong *start, ulong *end) { struct zimage_header *zi; diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 30fd643..6bed825 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -274,6 +274,11 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, } break; #endif +#ifdef CONFIG_BOOTM_LINUX_RAW + case IMAGE_FORMAT_LINUX: + /* Call something to set images.os.things */ + return 0; +#endif default: puts("ERROR: unknown image format type!\n"); return 1; @@ -1002,6 +1007,11 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, images->fit_noffset_os = os_noffset; break; #endif +#ifdef CONFIG_BOOTM_LINUX_RAW + case IMAGE_FORMAT_LINUX: + /* Set loadaddr? */ + return 0; +#endif default: printf("Wrong Image Format for %s command\n", cmdtp->name); bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO); diff --git a/common/image.c b/common/image.c index fcc5a9c..32237a3 100644 --- a/common/image.c +++ b/common/image.c @@ -665,6 +665,10 @@ int genimg_get_format(const void *img_addr) format = IMAGE_FORMAT_FIT; } #endif +#ifdef CONFIG_BOOTM_LINUX_RAW + if (check_image_linux_kernel((ulong)img_addr) == 0) + return IMAGE_FORMAT_LINUX; +#endif return format; } diff --git a/include/image.h b/include/image.h index b278778..985c6f0 100644 --- a/include/image.h +++ b/include/image.h @@ -411,6 +411,7 @@ enum fit_load_op { #ifndef USE_HOSTCC /* Image format types, returned by _get_format() routine */ #define IMAGE_FORMAT_INVALID 0x00 +#define IMAGE_FORMAT_LINUX 0xFF /* Linux kernel defined formats */ #define IMAGE_FORMAT_LEGACY 0x01 /* legacy image_header based format */ #define IMAGE_FORMAT_FIT 0x02 /* new, libfdt based format */ @@ -660,6 +661,15 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, int image_setup_linux(bootm_headers_t *images); /** + * Check if the given location has some form of Linux-kernel generated + * image. + * + * @param image Potential image location + * @return 0 if OK, 1 if not a known Linux-kernel generated image. + */ +int check_image_linux_kernel(ulong image); + +/** * bootz_setup() - Extract stat and size of a Linux xImage * * @image: Address of image It of course doesn't work and just shows where I think we would need to fill things in and probably provide some __weak functions for other arches. Looking over how we do bootz today, and how I wrote booti for arm64, it should be possible to do the correct callouts at the correct places for "oh, we don't have a legacy or FIT header, we have a per Linux architecture defined header". What does everyone think about extending things in this direction? -- Tom
signature.asc
Description: Digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot