Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/23868
Change subject: util/cbfstool: Add bzImage header detection ......................................................................
util/cbfstool: Add bzImage header detection
Only handle payload as bzImage if it looks like one.
Change-Id: I9fc96caedb872b14f3238e4a7a96f0d32d17f7ee Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M util/cbfstool/cbfs-payload-linux.c M util/cbfstool/cbfstool.c M util/cbfstool/common.h 3 files changed, 46 insertions(+), 1 deletion(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/68/23868/1
diff --git a/util/cbfstool/cbfs-payload-linux.c b/util/cbfstool/cbfs-payload-linux.c index 9646384..17e18ca 100644 --- a/util/cbfstool/cbfs-payload-linux.c +++ b/util/cbfstool/cbfs-payload-linux.c @@ -50,6 +50,49 @@ struct cbfs_payload_segment *out_seg; };
+/** bzImage boot flag value */ +#define BZI_BOOT_FLAG 0xaa55 + +/** bzImage magic signature value */ +#define BZI_SIGNATURE 0x53726448 + +struct bzimage_header { + /** The size of the setup in sectors + * + * If this field contains 0, assume it contains 4. + */ + uint8_t setup_sects; + /** If set, the root is mounted readonly */ + uint16_t root_flags; + /** DO NOT USE - for bootsect.S use only */ + uint16_t syssize; + /** DO NOT USE - obsolete */ + uint16_t swap_dev; + /** DO NOT USE - for bootsect.S use only */ + uint16_t ram_size; + /** Video mode control */ + uint16_t vid_mode; + /** Default root device number */ + uint16_t root_dev; + /** 0xAA55 magic number */ + uint16_t boot_flag; + /** Jump instruction */ + uint16_t jump; + /** Magic signature "HdrS" */ + uint32_t header; +}; + +/* Return true if buffer looks like a bzImage */ +int probe_for_bzImage_header(const struct buffer *input) +{ + const struct bzimage_header *header = + (const struct bzimage_header *)input->data; + if (input->size < sizeof(*header)) + return 0; + return (header->boot_flag == BZI_BOOT_FLAG) && + (header->header == BZI_SIGNATURE); +} + static int bzp_init(struct bzpayload *bzp, enum comp_algo algo) { memset(bzp, 0, sizeof(*bzp)); diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index 1f71906..91b0290 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -636,7 +636,7 @@ ret = parse_fv_to_payload(buffer, &output, param.compression);
/* If it's neither ELF nor UEFI Fv, try bzImage */ - if (ret != 0) + if (ret != 0 && probe_for_bzImage_header(buffer)) ret = parse_bzImage_to_payload(buffer, &output, param.initrd, param.cmdline, param.compression);
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h index 85dfdeb..6e366a1 100644 --- a/util/cbfstool/common.h +++ b/util/cbfstool/common.h @@ -188,6 +188,8 @@ enum comp_algo algo); int parse_fv_to_payload(const struct buffer *input, struct buffer *output, enum comp_algo algo); + +int probe_for_bzImage_header(const struct buffer *input); int parse_bzImage_to_payload(const struct buffer *input, struct buffer *output, const char *initrd, char *cmdline, enum comp_algo algo);