diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c index b1dd1c027c..6e6e4188e4 100644 --- a/util/cbfstool/cbfs-mkpayload.c +++ b/util/cbfstool/cbfs-mkpayload.c @@ -51,7 +51,7 @@ static void xdr_segs(struct buffer *output, } } int parse_elf_to_payload(const struct buffer *input, - struct buffer *output, comp_algo algo) + struct buffer *output, uint32_t arch, comp_algo algo) { Elf64_Phdr *phdr; Elf64_Ehdr ehdr; @@ -69,7 +69,7 @@ int parse_elf_to_payload(const struct buffer *input, if (!compress) return -1; - if (elf_headers(input, &ehdr, &phdr, &shdr) < 0) + if (elf_headers(input, arch, &ehdr, &phdr, &shdr) < 0) return -1; DEBUG("start: parse_elf_to_payload\n"); diff --git a/util/cbfstool/cbfs-mkstage.c b/util/cbfstool/cbfs-mkstage.c index 6a5f6f74ca..233ec57deb 100644 --- a/util/cbfstool/cbfs-mkstage.c +++ b/util/cbfstool/cbfs-mkstage.c @@ -33,7 +33,7 @@ * works for all elf files, not just the restricted set. */ int parse_elf_to_stage(const struct buffer *input, struct buffer *output, - comp_algo algo, uint32_t *location) + uint32_t arch, comp_algo algo, uint32_t *location) { Elf64_Phdr *phdr; Elf64_Ehdr ehdr; @@ -50,7 +50,7 @@ int parse_elf_to_stage(const struct buffer *input, struct buffer *output, DEBUG("start: parse_elf_to_stage(location=0x%x)\n", *location); - if (elf_headers(input, &ehdr, &phdr, NULL) < 0) + if (elf_headers(input, arch, &ehdr, &phdr, NULL) < 0) return -1; headers = ehdr.e_phnum; diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h index 92dd84ae84..9a5af5b3b1 100644 --- a/util/cbfstool/cbfs.h +++ b/util/cbfstool/cbfs.h @@ -129,6 +129,7 @@ uint32_t get_cbfs_compression(const char *name, uint32_t unknown); /* elfheaders.c */ int elf_headers(const struct buffer *pinput, + uint32_t arch, Elf64_Ehdr *ehdr, Elf64_Phdr **pphdr, Elf64_Shdr **pshdr); diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index 9935f51f05..1d93981d72 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -56,6 +56,7 @@ static struct param { uint32_t pagesize; uint32_t offset; uint32_t top_aligned; + uint32_t arch; int fit_empty_entries; comp_algo algo; /* for linux payloads */ @@ -63,6 +64,7 @@ static struct param { char *cmdline; } param = { /* All variables not listed are initialized as zero. */ + .arch = CBFS_ARCHITECTURE_UNKNOWN, .algo = CBFS_COMPRESS_NONE, }; @@ -178,9 +180,13 @@ static int cbfs_add_component(const char *cbfs_name, return 0; } -static int cbfstool_convert_mkstage(struct buffer *buffer, uint32_t *offset) { +static int cbfstool_convert_mkstage(struct buffer *buffer, uint32_t *offset) +{ struct buffer output; - if (parse_elf_to_stage(buffer, &output, param.algo, offset) != 0) + int ret; + ret = parse_elf_to_stage(buffer, &output, param.arch, param.algo, + offset); + if (ret != 0) return -1; buffer_delete(buffer); // direct assign, no dupe. @@ -192,7 +198,7 @@ static int cbfstool_convert_mkpayload(struct buffer *buffer, uint32_t *offset) { struct buffer output; int ret; /* per default, try and see if payload is an ELF binary */ - ret = parse_elf_to_payload(buffer, &output, param.algo); + ret = parse_elf_to_payload(buffer, &output, param.arch, param.algo); /* If it's not an ELF, see if it's a UEFI FV */ if (ret != 0) @@ -334,8 +340,7 @@ static int cbfs_create(void) return 1; } - // TODO Remove arch or pack into param. - if (arch == CBFS_ARCHITECTURE_UNKNOWN) { + if (param.arch == CBFS_ARCHITECTURE_UNKNOWN) { ERROR("You need to specify -m/--machine arch.\n"); return 1; } @@ -368,7 +373,7 @@ static int cbfs_create(void) } if (cbfs_image_create(&image, - arch, + param.arch, param.size, param.alignment, &bootblock, @@ -701,7 +706,7 @@ int main(int argc, char **argv) verbose++; break; case 'm': - arch = string_to_arch(optarg); + param.arch = string_to_arch(optarg); break; case 'I': param.initrd = optarg; diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c index 715c5df58e..98d9517bf4 100644 --- a/util/cbfstool/common.c +++ b/util/cbfstool/common.c @@ -103,9 +103,6 @@ void buffer_delete(struct buffer *buffer) { buffer->size = 0; } -/* FIXME: This global is more difficult to just remove */ -uint32_t arch = CBFS_ARCHITECTURE_UNKNOWN; - static struct { uint32_t arch; const char *name; diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h index b8ff4a3c7c..5bcbcbedf8 100644 --- a/util/cbfstool/common.h +++ b/util/cbfstool/common.h @@ -62,8 +62,6 @@ int buffer_write_file(struct buffer *buffer, const char *filename); /* Destroys a memory buffer. */ void buffer_delete(struct buffer *buffer); -extern uint32_t arch; - uint32_t string_to_arch(const char *arch_string); #define ALIGN(val, by) (((val) + (by)-1)&~((by)-1)) @@ -79,7 +77,7 @@ uint64_t intfiletype(const char *name); /* cbfs-mkpayload.c */ int parse_elf_to_payload(const struct buffer *input, - struct buffer *output, comp_algo algo); + struct buffer *output, uint32_t arch, comp_algo algo); int parse_fv_to_payload(const struct buffer *input, struct buffer *output, comp_algo algo); int parse_bzImage_to_payload(const struct buffer *input, @@ -92,7 +90,7 @@ int parse_flat_binary_to_payload(const struct buffer *input, comp_algo algo); /* cbfs-mkstage.c */ int parse_elf_to_stage(const struct buffer *input, struct buffer *output, - comp_algo algo, uint32_t *location); + uint32_t arch, comp_algo algo, uint32_t *location); void print_supported_filetypes(void); diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c index fd7a1a1575..0d874a1171 100644 --- a/util/cbfstool/elfheaders.c +++ b/util/cbfstool/elfheaders.c @@ -241,6 +241,7 @@ elf_shdr(struct buffer *pinput, Elf64_Shdr *shdr, */ int elf_headers(const struct buffer *pinput, + uint32_t arch, Elf64_Ehdr *ehdr, Elf64_Phdr **pphdr, Elf64_Shdr **pshdr)