cbfstool: Clean up in preparation for adding new files

This enables more warnings on the cbfstool codebase and fixes the
issues that surface as a result. A memory leak that used to occur
when compressing files with lzma is also found and fixed.
Finally, there are several fixes for the Makefile:
 - Its autodependencies used to be broken because the target for
   the .dependencies file was misnamed; this meant that Make
   didn't know how to rebuild the file, and so would silently
   skip the step of updating it before including it.
 - The ability to build to a custom output directory by defining
   the obj variable had bitrotted.
 - The default value of the obj variable was causing implicit
   rules not to apply when specifying a file as a target without
   providing a custom value for obj.
 - Add a distclean target for removing the .dependencies file.

BUG=chromium:461875
TEST=Build an image with cbfstool both before and after.
BRANCH=None

Change-Id: I951919d63443f2b053c2e67c1ac9872abc0a43ca
Signed-off-by: Sol Boucher <solb@chromium.org>
Original-Commit-Id: 49293443b4e565ca48d284e9a66f80c9c213975d
Original-Change-Id: Ia7350c2c3306905984cfa711d5fc4631f0b43d5b
Original-Signed-off-by: Sol Boucher <solb@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/257340
Original-Reviewed-by: Julius Werner <jwerner@chromium.org>
Original-Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
Reviewed-on: http://review.coreboot.org/9937
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Sol Boucher 2015-03-05 15:38:03 -08:00 committed by Patrick Georgi
parent c13ad6c6df
commit 0e53931fee
14 changed files with 121 additions and 89 deletions

View File

@ -1,50 +1,61 @@
obj ?= $(shell pwd) obj ?= .
HOSTCC ?= $(CC) HOSTCC ?= $(CC)
CFLAGS ?= -g
CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes CFLAGS += -Og -g3
CFLAGS += -Wwrite-strings -Wredundant-decls -Wno-trigraphs CFLAGS += -std=c99 -Werror -Wall -Wextra
CFLAGS += -Wstrict-aliasing -Wshadow -Werror CFLAGS += -Wcast-qual -Wmissing-prototypes -Wredundant-decls -Wshadow
CFLAGS += -Wstrict-prototypes -Wwrite-strings
CPPFLAGS += -D_POSIX_C_SOURCE=200809L # strdup() from string.h
LINKFLAGS += -g3
CBFSTOOL_BINARY:=$(obj)/cbfstool CBFSTOOL_BINARY:=$(obj)/cbfstool
CBFSTOOL_COMMON:=common.o cbfs_image.o compress.o fit.o
CBFSTOOL_COMMON:=cbfstool.o common.o cbfs_image.o compress.o fit.o
CBFSTOOL_COMMON+=elfheaders.o cbfs-mkstage.o cbfs-mkpayload.o xdr.o CBFSTOOL_COMMON+=elfheaders.o cbfs-mkstage.o cbfs-mkpayload.o xdr.o
CBFSTOOL_COMMON+=linux_trampoline.o cbfs-payload-linux.o
# LZMA # LZMA
CBFSTOOL_COMMON+=lzma/lzma.o CBFSTOOL_COMMON+=lzma/lzma.o
CBFSTOOL_COMMON+=lzma/C/LzFind.o lzma/C/LzmaDec.o lzma/C/LzmaEnc.o CBFSTOOL_COMMON+=lzma/C/LzFind.o lzma/C/LzmaDec.o lzma/C/LzmaEnc.o
CBFSTOOL_COMMON+=linux_trampoline.o cbfs-payload-linux.o
CBFSTOOL_COMMON:=$(addprefix $(obj)/,$(CBFSTOOL_COMMON)) CBFSTOOL_COMMON:=$(addprefix $(obj)/,$(CBFSTOOL_COMMON))
RMODTOOL_BINARY:=$(obj)/rmodtool RMODTOOL_BINARY:=$(obj)/rmodtool
RMODTOOL_COMMON:=rmodtool.o rmodule.o common.o elfheaders.o xdr.o RMODTOOL_COMMON:=rmodule.o common.o elfheaders.o xdr.o
RMODTOOL_COMMON:=$(addprefix $(obj)/,$(RMODTOOL_COMMON)) RMODTOOL_COMMON:=$(addprefix $(obj)/,$(RMODTOOL_COMMON))
all: dep $(CBFSTOOL_BINARY) $(RMODTOOL_BINARY) .PHONY: all
all: .dependencies $(CBFSTOOL_BINARY) $(RMODTOOL_BINARY)
$(obj)/%: $(obj)/%.o
mkdir -p $(dir $@)
$(HOSTCC) $(LINKFLAGS) -o $@ $^ $(LDLIBS)
$(obj)/%.o: %.c $(obj)/%.o: %.c
$(HOSTCC) $(CFLAGS) -c -o $@ $< mkdir -p $(dir $@)
$(HOSTCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
.PHONY: clean
clean: clean:
rm -f $(CBFSTOOL_COMMON) $(CBFSTOOL_BINARY) $(RM) $(CBFSTOOL_COMMON) $(CBFSTOOL_BINARY).o $(CBFSTOOL_BINARY)
rm -f $(RMODTOOL_COMMON) $(RMODTOOL_BINARY) $(RM) $(RMODTOOL_COMMON) $(RMODTOOL_BINARY).o $(RMODTOOL_BINARY)
.PHONY: distclean
distclean: clean
$(RM) .dependencies
tags: tags:
ctags *.[ch] ctags *.[ch]
$(obj)/cbfstool:$(CBFSTOOL_COMMON) .dependencies:
$(HOSTCC) $(CFLAGS) -o $@ $^ @$(HOSTCC) $(CPPFLAGS) $(CFLAGS) -MM -MG *.c > $@
@$(HOSTCC) $(CPPFLAGS) $(CFLAGS) -MM lzma/*.c >> $@
@$(HOSTCC) $(CPPFLAGS) $(CFLAGS) -MM lzma/C/*.c >> $@
@sed -i 's|.*:.*|$$(obj)/&|' $@
$(obj)/rmodtool:$(RMODTOOL_COMMON) $(CBFSTOOL_BINARY): $(CBFSTOOL_COMMON)
$(HOSTCC) $(CFLAGS) -o $@ $^ $(RMODTOOL_BINARY): $(RMODTOOL_COMMON)
dep: # Tolerate lzma sdk warnings
@$(HOSTCC) $(CFLAGS) -MM *.c > .dependencies $(obj)/lzma/C/LzmaEnc.o: CFLAGS += -Wno-sign-compare -Wno-cast-qual
@$(HOSTCC) $(CFLAGS) -MM lzma/*.c >> .dependencies
@$(HOSTCC) $(CFLAGS) -MM lzma/C/*.c >> .dependencies
-include .dependencies -include .dependencies

View File

@ -17,32 +17,42 @@ cbfsobj += LzmaEnc.o
cbfsobj += linux_trampoline.o cbfsobj += linux_trampoline.o
cbfsobj += cbfs-payload-linux.o cbfsobj += cbfs-payload-linux.o
rmodobj :=
rmodobj += rmodtool.o rmodobj += rmodtool.o
rmodobj += rmodule.o rmodobj += rmodule.o
rmodobj += common.o rmodobj += common.o
rmodobj += elfheaders.o rmodobj += elfheaders.o
rmodobj += xdr.o rmodobj += xdr.o
TOOLCFLAGS ?= -std=c99 -Werror -Wall -Wextra
TOOLCFLAGS += -Wcast-qual -Wmissing-prototypes -Wredundant-decls -Wshadow
TOOLCFLAGS += -Wstrict-prototypes -Wwrite-strings
TOOLCPPFLAGS ?= -D_POSIX_C_SOURCE=200809L # strdup() from string.h
TOOLLINKFLAGS ?=
ifeq ($(shell uname -s | cut -c-7 2>/dev/null), MINGW32) ifeq ($(shell uname -s | cut -c-7 2>/dev/null), MINGW32)
TOOLFLAGS+=-mno-ms-bitfields TOOLFLAGS+=-mno-ms-bitfields
endif endif
$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/%.c $(objutil)/cbfstool/%.o: $(top)/util/cbfstool/%.c
printf " HOSTCC $(subst $(objutil)/,,$(@))\n" printf " HOSTCC $(subst $(objutil)/,,$(@))\n"
$(HOSTCC) $(TOOLFLAGS) $(HOSTCFLAGS) -c -o $@ $< $(HOSTCC) $(TOOLCPPFLAGS) $(TOOLCFLAGS) $(HOSTCFLAGS) -c -o $@ $<
$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/%.c $(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/%.c
printf " HOSTCC $(subst $(objutil)/,,$(@))\n" printf " HOSTCC $(subst $(objutil)/,,$(@))\n"
$(HOSTCC) $(TOOLFLAGS) $(HOSTCFLAGS) -c -o $@ $< $(HOSTCC) $(TOOLCPPFLAGS) $(TOOLCFLAGS) $(HOSTCFLAGS) -c -o $@ $<
$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/%.c $(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/%.c
printf " HOSTCC $(subst $(objutil)/,,$(@))\n" printf " HOSTCC $(subst $(objutil)/,,$(@))\n"
$(HOSTCC) $(TOOLFLAGS) $(HOSTCFLAGS) -c -o $@ $< $(HOSTCC) $(TOOLCPPFLAGS) $(TOOLCFLAGS) $(HOSTCFLAGS) -c -o $@ $<
$(objutil)/cbfstool/cbfstool: $(addprefix $(objutil)/cbfstool/,$(cbfsobj)) $(objutil)/cbfstool/cbfstool: $(addprefix $(objutil)/cbfstool/,$(cbfsobj))
printf " HOSTCC $(subst $(objutil)/,,$(@)) (link)\n" printf " HOSTCC $(subst $(objutil)/,,$(@)) (link)\n"
$(HOSTCC) $(TOOLFLAGS) -o $@ $(addprefix $(objutil)/cbfstool/,$(cbfsobj)) $(HOSTCC) $(TOOLLINKFLAGS) -o $@ $(addprefix $(objutil)/cbfstool/,$(cbfsobj))
$(objutil)/cbfstool/rmodtool: $(addprefix $(objutil)/cbfstool/,$(rmodobj)) $(objutil)/cbfstool/rmodtool: $(addprefix $(objutil)/cbfstool/,$(rmodobj))
printf " HOSTCC $(subst $(objutil)/,,$(@)) (link)\n" printf " HOSTCC $(subst $(objutil)/,,$(@)) (link)\n"
$(HOSTCC) $(TOOLFLAGS) -o $@ $(addprefix $(objutil)/cbfstool/,$(rmodobj)) $(HOSTCC) $(TOOLLINKFLAGS) -o $@ $(addprefix $(objutil)/cbfstool/,$(rmodobj))
# Tolerate lzma sdk warnings
$(objutil)/cbfstool/LzmaEnc.o: TOOLCFLAGS += -Wno-sign-compare -Wno-cast-qual

View File

@ -67,8 +67,8 @@ void xdr_get_seg(struct cbfs_payload_segment *out,
out->mem_len = xdr_be.get32(&inheader); out->mem_len = xdr_be.get32(&inheader);
} }
int parse_elf_to_payload(const struct buffer *input, int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
struct buffer *output, uint32_t arch, comp_algo algo) comp_algo algo)
{ {
Elf64_Phdr *phdr; Elf64_Phdr *phdr;
Elf64_Ehdr ehdr; Elf64_Ehdr ehdr;
@ -87,7 +87,7 @@ int parse_elf_to_payload(const struct buffer *input,
if (!compress) if (!compress)
return -1; return -1;
if (elf_headers(input, arch, &ehdr, &phdr, &shdr) < 0) if (elf_headers(input, &ehdr, &phdr, &shdr) < 0)
return -1; return -1;
DEBUG("start: parse_elf_to_payload\n"); DEBUG("start: parse_elf_to_payload\n");
@ -325,7 +325,7 @@ int parse_fv_to_payload(const struct buffer *input,
while (fh->file_type == FILETYPE_PAD) { while (fh->file_type == FILETYPE_PAD) {
unsigned long offset = (fh->size[2] << 16) | (fh->size[1] << 8) | fh->size[0]; unsigned long offset = (fh->size[2] << 16) | (fh->size[1] << 8) | fh->size[0];
ERROR("skipping %lu bytes of FV padding\n", offset); ERROR("skipping %lu bytes of FV padding\n", offset);
fh = (ffs_file_header_t *)(((void*)fh) + offset); fh = (ffs_file_header_t *)(((uintptr_t)fh) + offset);
} }
if (fh->file_type != FILETYPE_SEC) { if (fh->file_type != FILETYPE_SEC) {
ERROR("Not a usable UEFI firmware volume.\n"); ERROR("Not a usable UEFI firmware volume.\n");
@ -337,7 +337,7 @@ int parse_fv_to_payload(const struct buffer *input,
while (cs->section_type == SECTION_RAW) { while (cs->section_type == SECTION_RAW) {
unsigned long offset = (cs->size[2] << 16) | (cs->size[1] << 8) | cs->size[0]; unsigned long offset = (cs->size[2] << 16) | (cs->size[1] << 8) | cs->size[0];
ERROR("skipping %lu bytes of section padding\n", offset); ERROR("skipping %lu bytes of section padding\n", offset);
cs = (common_section_header_t *)(((void*)cs) + offset); cs = (common_section_header_t *)(((uintptr_t)cs) + offset);
} }
if (cs->section_type != SECTION_PE32) { if (cs->section_type != SECTION_PE32) {
ERROR("Not a usable UEFI firmware volume.\n"); ERROR("Not a usable UEFI firmware volume.\n");
@ -355,7 +355,7 @@ int parse_fv_to_payload(const struct buffer *input,
dh_offset = (unsigned long)dh - (unsigned long)input->data; dh_offset = (unsigned long)dh - (unsigned long)input->data;
DEBUG("dos header offset = %x\n", dh_offset); DEBUG("dos header offset = %x\n", dh_offset);
ch = (coff_header_t *)(((void *)dh)+dh->e_lfanew); ch = (coff_header_t *)(((uintptr_t)dh)+dh->e_lfanew);
if (ch->machine == MACHINE_TYPE_X86) { if (ch->machine == MACHINE_TYPE_X86) {
pe_opt_header_32_t *ph; pe_opt_header_32_t *ph;

View File

@ -95,7 +95,7 @@ static Elf64_Shdr *find_ignored_section_header(struct parsed_elf *pelf,
* works for all elf files, not just the restricted set. * works for all elf files, not just the restricted set.
*/ */
int parse_elf_to_stage(const struct buffer *input, struct buffer *output, int parse_elf_to_stage(const struct buffer *input, struct buffer *output,
uint32_t arch, comp_algo algo, uint32_t *location, comp_algo algo, uint32_t *location,
const char *ignore_section) const char *ignore_section)
{ {
struct parsed_elf pelf; struct parsed_elf pelf;
@ -245,7 +245,7 @@ int parse_elf_to_stage(const struct buffer *input, struct buffer *output,
*/ */
if (compress(buffer, data_end - data_start, if (compress(buffer, data_end - data_start,
(output->data + sizeof(struct cbfs_stage)), (output->data + sizeof(struct cbfs_stage)),
&outlen) < 0 || outlen > data_end - data_start) { &outlen) < 0 || (unsigned)outlen > data_end - data_start) {
WARN("Compression failed or would make the data bigger " WARN("Compression failed or would make the data bigger "
"- disabled.\n"); "- disabled.\n");
memcpy(output->data + sizeof(struct cbfs_stage), memcpy(output->data + sizeof(struct cbfs_stage),

View File

@ -22,6 +22,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <strings.h>
#include "common.h" #include "common.h"
#include "cbfs_image.h" #include "cbfs_image.h"
@ -83,7 +84,7 @@ static const char *get_cbfs_entry_type_name(uint32_t type)
/* CBFS image */ /* CBFS image */
static int cbfs_calculate_file_header_size(const char *name) static size_t cbfs_calculate_file_header_size(const char *name)
{ {
return (sizeof(struct cbfs_file) + return (sizeof(struct cbfs_file) +
align_up(strlen(name) + 1, CBFS_FILENAME_ALIGN)); align_up(strlen(name) + 1, CBFS_FILENAME_ALIGN));
@ -146,11 +147,11 @@ static void cbfs_decode_payload_segment(struct cbfs_payload_segment *output,
assert(seg.size == 0); assert(seg.size == 0);
} }
void cbfs_get_header(struct cbfs_header *header, const void *src) void cbfs_get_header(struct cbfs_header *header, void *src)
{ {
struct buffer outheader; struct buffer outheader;
outheader.data = (void *)src; /* We're not modifying the data */ outheader.data = src; /* We're not modifying the data */
outheader.size = 0; outheader.size = 0;
header->magic = xdr_be.get32(&outheader); header->magic = xdr_be.get32(&outheader);
@ -167,9 +168,9 @@ int cbfs_image_create(struct cbfs_image *image,
size_t size, size_t size,
uint32_t align, uint32_t align,
struct buffer *bootblock, struct buffer *bootblock,
int32_t bootblock_offset, uint32_t bootblock_offset,
int32_t header_offset, uint32_t header_offset,
int32_t entries_offset) uint32_t entries_offset)
{ {
struct cbfs_header header; struct cbfs_header header;
struct cbfs_file *entry; struct cbfs_file *entry;
@ -191,11 +192,11 @@ int cbfs_image_create(struct cbfs_image *image,
// Adjust legcay top-aligned address to ROM offset. // Adjust legcay top-aligned address to ROM offset.
if (IS_TOP_ALIGNED_ADDRESS(entries_offset)) if (IS_TOP_ALIGNED_ADDRESS(entries_offset))
entries_offset += (int32_t)size; entries_offset = size + (int32_t)entries_offset;
if (IS_TOP_ALIGNED_ADDRESS(bootblock_offset)) if (IS_TOP_ALIGNED_ADDRESS(bootblock_offset))
bootblock_offset += (int32_t)size; bootblock_offset = size + (int32_t)bootblock_offset;
if (IS_TOP_ALIGNED_ADDRESS(header_offset)) if (IS_TOP_ALIGNED_ADDRESS(header_offset))
header_offset += (int32_t) size; header_offset = size + (int32_t)header_offset;
DEBUG("cbfs_create_image: (real offset) bootblock=0x%x, " DEBUG("cbfs_create_image: (real offset) bootblock=0x%x, "
"header=0x%x, entries_offset=0x%x\n", "header=0x%x, entries_offset=0x%x\n",
@ -358,7 +359,8 @@ int cbfs_copy_instance(struct cbfs_image *image, size_t copy_offset,
dst_entry = (struct cbfs_file *)( dst_entry = (struct cbfs_file *)(
(uintptr_t)dst_entry + align_up(entry_size, align)); (uintptr_t)dst_entry + align_up(entry_size, align));
if (((char *)dst_entry - image->buffer.data) >= copy_end) { if ((size_t)((char *)dst_entry - image->buffer.data) >=
copy_end) {
ERROR("Ran out of room in copy region.\n"); ERROR("Ran out of room in copy region.\n");
return 1; return 1;
} }
@ -486,7 +488,7 @@ int cbfs_add_entry(struct cbfs_image *image, struct buffer *buffer,
uint32_t theromsize = image->header->romsize; uint32_t theromsize = image->header->romsize;
INFO("Converting top-aligned address 0x%x to offset: 0x%x\n", INFO("Converting top-aligned address 0x%x to offset: 0x%x\n",
content_offset, content_offset + theromsize); content_offset, content_offset + theromsize);
content_offset += theromsize; content_offset = theromsize + (int32_t)content_offset;
} }
// Merge empty entries. // Merge empty entries.
@ -614,12 +616,14 @@ int cbfs_export_entry(struct cbfs_image *image, const char *entry_name,
buffer.data = CBFS_SUBHEADER(entry); buffer.data = CBFS_SUBHEADER(entry);
buffer.size = ntohl(entry->len); buffer.size = ntohl(entry->len);
buffer.name = (char *)"(cbfs_export_entry)"; buffer.name = strdup("(cbfs_export_entry)");
if (buffer_write_file(&buffer, filename) != 0) { if (buffer_write_file(&buffer, filename) != 0) {
ERROR("Failed to write %s into %s.\n", ERROR("Failed to write %s into %s.\n",
entry_name, filename); entry_name, filename);
free(buffer.name);
return -1; return -1;
} }
free(buffer.name);
INFO("Successfully dumped the file to: %s\n", filename); INFO("Successfully dumped the file to: %s\n", filename);
return 0; return 0;
} }
@ -793,7 +797,7 @@ int cbfs_print_directory(struct cbfs_image *image)
} }
int cbfs_merge_empty_entry(struct cbfs_image *image, struct cbfs_file *entry, int cbfs_merge_empty_entry(struct cbfs_image *image, struct cbfs_file *entry,
void *arg) unused void *arg)
{ {
struct cbfs_file *next; struct cbfs_file *next;
uint32_t type, addr, last_addr; uint32_t type, addr, last_addr;

View File

@ -35,7 +35,7 @@ struct cbfs_image {
* to cbfs format, i.e. big-endian. */ * to cbfs format, i.e. big-endian. */
void cbfs_put_header(void *dest, const struct cbfs_header *header); void cbfs_put_header(void *dest, const struct cbfs_header *header);
/* Or deserialize into host-native format */ /* Or deserialize into host-native format */
void cbfs_get_header(struct cbfs_header *header, const void *src); void cbfs_get_header(struct cbfs_header *header, void *src);
/* Creates an empty CBFS image by given size, and description to its content /* Creates an empty CBFS image by given size, and description to its content
* (bootblock, align, header location, starting offset of CBFS entries. * (bootblock, align, header location, starting offset of CBFS entries.
@ -47,9 +47,9 @@ int cbfs_image_create(struct cbfs_image *image,
size_t size, size_t size,
uint32_t align, uint32_t align,
struct buffer *bootblock, struct buffer *bootblock,
int32_t bootblock_offset, uint32_t bootblock_offset,
int32_t header_offset, uint32_t header_offset,
int32_t entries_offset); uint32_t entries_offset);
/* Loads a CBFS image from file. Returns 0 on success, otherwise non-zero. */ /* Loads a CBFS image from file. Returns 0 on success, otherwise non-zero. */
int cbfs_image_from_file(struct cbfs_image *image, int cbfs_image_from_file(struct cbfs_image *image,

View File

@ -22,6 +22,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <strings.h>
#include <ctype.h> #include <ctype.h>
#include <unistd.h> #include <unistd.h>
#include <getopt.h> #include <getopt.h>
@ -104,8 +105,10 @@ static int cbfs_add_integer_component(const char *cbfs_name,
goto done; goto done;
} }
if (cbfs_add_entry(&image, &buffer, name, CBFS_COMPONENT_RAW, param.baseaddress) != 0) { if (cbfs_add_entry(&image, &buffer, name, CBFS_COMPONENT_RAW, offset) !=
ERROR("Failed to add %llu into ROM image as '%s'.\n", (long long unsigned)u64val, name); 0) {
ERROR("Failed to add %llu into ROM image as '%s'.\n",
(long long unsigned)u64val, name);
goto done; goto done;
} }
@ -189,8 +192,8 @@ static int cbfstool_convert_mkstage(struct buffer *buffer, uint32_t *offset)
{ {
struct buffer output; struct buffer output;
int ret; int ret;
ret = parse_elf_to_stage(buffer, &output, param.arch, param.algo, ret = parse_elf_to_stage(buffer, &output, param.algo, offset,
offset, param.ignore_section); param.ignore_section);
if (ret != 0) if (ret != 0)
return -1; return -1;
buffer_delete(buffer); buffer_delete(buffer);
@ -205,7 +208,7 @@ static int cbfstool_convert_mkpayload(struct buffer *buffer,
struct buffer output; struct buffer output;
int ret; int ret;
/* per default, try and see if payload is an ELF binary */ /* per default, try and see if payload is an ELF binary */
ret = parse_elf_to_payload(buffer, &output, param.arch, param.algo); ret = parse_elf_to_payload(buffer, &output, param.algo);
/* If it's not an ELF, see if it's a UEFI FV */ /* If it's not an ELF, see if it's a UEFI FV */
if (ret != 0) if (ret != 0)
@ -641,6 +644,11 @@ static void usage(char *name)
" update-fit -n MICROCODE_BLOB_NAME -x EMTPY_FIT_ENTRIES\n " " update-fit -n MICROCODE_BLOB_NAME -x EMTPY_FIT_ENTRIES\n "
"Updates the FIT table with microcode entries\n" "Updates the FIT table with microcode entries\n"
"\n" "\n"
"OFFSETs:\n"
" Numbers accompanying -b, -H, and -o switches may be provided\n"
" in two possible formats: if their value is greater than\n"
" 0x80000000, they are interpreted as a top-aligned x86 memory\n"
" address; otherwise, they are treated as an offset into flash.\n"
"ARCHes:\n" "ARCHes:\n"
" arm64, arm, mips, x86\n" " arm64, arm, mips, x86\n"
"TYPEs:\n", name, name "TYPEs:\n", name, name

View File

@ -22,6 +22,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <strings.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
@ -36,7 +37,7 @@ int verbose = 0;
int is_big_endian(void) int is_big_endian(void)
{ {
static const uint32_t inttest = 0x12345678; static const uint32_t inttest = 0x12345678;
uint8_t inttest_lsb = *(uint8_t *)&inttest; const uint8_t inttest_lsb = *(const uint8_t *)&inttest;
if (inttest_lsb == 0x12) { if (inttest_lsb == 0x12) {
return 1; return 1;
} }
@ -73,7 +74,7 @@ int buffer_from_file(struct buffer *buffer, const char *filename)
return -1; return -1;
} }
buffer->size = get_file_size(fp); buffer->size = get_file_size(fp);
if (buffer->size == -1) { if (buffer->size == -1u) {
fprintf(stderr, "could not determine size of %s\n", filename); fprintf(stderr, "could not determine size of %s\n", filename);
fclose(fp); fclose(fp);
return -1; return -1;

View File

@ -26,20 +26,20 @@
/* Endianess */ /* Endianess */
#include "swab.h" #include "swab.h"
#ifndef __APPLE__ #ifndef __APPLE__
#define ntohl(x) (is_big_endian() ? (x) : swab32(x)) #define ntohl(x) (is_big_endian() ? (uint32_t)(x) : swab32(x))
#define htonl(x) (is_big_endian() ? (x) : swab32(x)) #define htonl(x) (is_big_endian() ? (uint32_t)(x) : swab32(x))
#endif #endif
#define ntohll(x) (is_big_endian() ? (x) : swab64(x)) #define ntohll(x) (is_big_endian() ? (uint64_t)(x) : swab64(x))
#define htonll(x) (is_big_endian() ? (x) : swab64(x)) #define htonll(x) (is_big_endian() ? (uint64_t)(x) : swab64(x))
int is_big_endian(void); int is_big_endian(void);
/* Message output */ /* Message output */
extern int verbose; extern int verbose;
#define ERROR(x...) { fprintf(stderr, "E: " x); } #define ERROR(...) { fprintf(stderr, "E: " __VA_ARGS__); }
#define WARN(x...) { fprintf(stderr, "W: " x); } #define WARN(...) { fprintf(stderr, "W: " __VA_ARGS__); }
#define LOG(x...) { fprintf(stderr, x); } #define LOG(...) { fprintf(stderr, __VA_ARGS__); }
#define INFO(x...) { if (verbose > 0) fprintf(stderr, "INFO: " x); } #define INFO(...) { if (verbose > 0) fprintf(stderr, "INFO: " __VA_ARGS__); }
#define DEBUG(x...) { if (verbose > 1) fprintf(stderr, "DEBUG: " x); } #define DEBUG(...) { if (verbose > 1) fprintf(stderr, "DEBUG: " __VA_ARGS__); }
/* Helpers */ /* Helpers */
#define ARRAY_SIZE(a) (int)(sizeof(a) / sizeof((a)[0])) #define ARRAY_SIZE(a) (int)(sizeof(a) / sizeof((a)[0]))
@ -135,8 +135,8 @@ comp_func_ptr compression_function(comp_algo algo);
uint64_t intfiletype(const char *name); uint64_t intfiletype(const char *name);
/* cbfs-mkpayload.c */ /* cbfs-mkpayload.c */
int parse_elf_to_payload(const struct buffer *input, int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
struct buffer *output, uint32_t arch, comp_algo algo); comp_algo algo);
int parse_fv_to_payload(const struct buffer *input, int parse_fv_to_payload(const struct buffer *input,
struct buffer *output, comp_algo algo); struct buffer *output, comp_algo algo);
int parse_bzImage_to_payload(const struct buffer *input, int parse_bzImage_to_payload(const struct buffer *input,
@ -149,7 +149,7 @@ int parse_flat_binary_to_payload(const struct buffer *input,
comp_algo algo); comp_algo algo);
/* cbfs-mkstage.c */ /* cbfs-mkstage.c */
int parse_elf_to_stage(const struct buffer *input, struct buffer *output, int parse_elf_to_stage(const struct buffer *input, struct buffer *output,
uint32_t arch, comp_algo algo, uint32_t *location, comp_algo algo, uint32_t *location,
const char *ignore_section); const char *ignore_section);
void print_supported_filetypes(void); void print_supported_filetypes(void);

View File

@ -588,12 +588,10 @@ void parsed_elf_destroy(struct parsed_elf *pelf)
*/ */
int int
elf_headers(const struct buffer *pinput, elf_headers(const struct buffer *pinput,
uint32_t arch,
Elf64_Ehdr *ehdr, Elf64_Ehdr *ehdr,
Elf64_Phdr **pphdr, Elf64_Phdr **pphdr,
Elf64_Shdr **pshdr) Elf64_Shdr **pshdr)
{ {
struct parsed_elf pelf; struct parsed_elf pelf;
int flags; int flags;

View File

@ -69,7 +69,6 @@ void parsed_elf_destroy(struct parsed_elf *pelf);
int int
elf_headers(const struct buffer *pinput, elf_headers(const struct buffer *pinput,
uint32_t arch,
Elf64_Ehdr *ehdr, Elf64_Ehdr *ehdr,
Elf64_Phdr **pphdr, Elf64_Phdr **pphdr,
Elf64_Shdr **pshdr); Elf64_Shdr **pshdr);

View File

@ -48,7 +48,7 @@ struct fit_entry {
struct fit_table { struct fit_table {
struct fit_entry header; struct fit_entry header;
struct fit_entry entries[0]; struct fit_entry entries[];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct microcode_header { struct microcode_header {

View File

@ -142,6 +142,7 @@ int do_lzma_compress(char *in, int in_len, char *out, int *out_len)
Write(&os, propsEncoded, LZMA_PROPS_SIZE+8); Write(&os, propsEncoded, LZMA_PROPS_SIZE+8);
res = LzmaEnc_Encode(p, &os, &is, 0, &LZMAalloc, &LZMAalloc); res = LzmaEnc_Encode(p, &os, &is, 0, &LZMAalloc, &LZMAalloc);
LzmaEnc_Destroy(p, &LZMAalloc, &LZMAalloc);
if (res != SZ_OK) { if (res != SZ_OK) {
ERROR("LZMA: LzmaEnc_Encode failed %d.\n", res); ERROR("LZMA: LzmaEnc_Encode failed %d.\n", res);
return -1; return -1;

View File

@ -15,6 +15,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/ */
#include <inttypes.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -28,9 +29,9 @@ struct rmod_context;
struct arch_ops { struct arch_ops {
int arch; int arch;
/* Determine if relocation is a valid type for the architecture. */ /* Determine if relocation is a valid type for the architecture. */
int (*valid_type)(struct rmod_context *ctx, Elf64_Rela *rel); int (*valid_type)(Elf64_Rela *rel);
/* Determine if relocation should be emitted. */ /* Determine if relocation should be emitted. */
int (*should_emit)(struct rmod_context *ctx, Elf64_Rela *rel); int (*should_emit)(Elf64_Rela *rel);
}; };
struct rmod_context { struct rmod_context {
@ -62,7 +63,7 @@ struct rmod_context {
/* /*
* Architecture specific support operations. * Architecture specific support operations.
*/ */
static int valid_reloc_386(struct rmod_context *ctx, Elf64_Rela *rel) static int valid_reloc_386(Elf64_Rela *rel)
{ {
int type; int type;
@ -72,7 +73,7 @@ static int valid_reloc_386(struct rmod_context *ctx, Elf64_Rela *rel)
return (type == R_386_32 || type == R_386_PC32); return (type == R_386_32 || type == R_386_PC32);
} }
static int should_emit_386(struct rmod_context *ctx, Elf64_Rela *rel) static int should_emit_386(Elf64_Rela *rel)
{ {
int type; int type;
@ -82,7 +83,7 @@ static int should_emit_386(struct rmod_context *ctx, Elf64_Rela *rel)
return (type == R_386_32); return (type == R_386_32);
} }
static int valid_reloc_arm(struct rmod_context *ctx, Elf64_Rela *rel) static int valid_reloc_arm(Elf64_Rela *rel)
{ {
int type; int type;
@ -94,7 +95,7 @@ static int valid_reloc_arm(struct rmod_context *ctx, Elf64_Rela *rel)
type == R_ARM_CALL || type == R_ARM_JUMP24); type == R_ARM_CALL || type == R_ARM_JUMP24);
} }
static int should_emit_arm(struct rmod_context *ctx, Elf64_Rela *rel) static int should_emit_arm(Elf64_Rela *rel)
{ {
int type; int type;
@ -104,7 +105,7 @@ static int should_emit_arm(struct rmod_context *ctx, Elf64_Rela *rel)
return (type == R_ARM_ABS32); return (type == R_ARM_ABS32);
} }
static int valid_reloc_aarch64(struct rmod_context *ctx, Elf64_Rela *rel) static int valid_reloc_aarch64(Elf64_Rela *rel)
{ {
int type; int type;
@ -122,7 +123,7 @@ static int valid_reloc_aarch64(struct rmod_context *ctx, Elf64_Rela *rel)
type == R_AARCH64_ADR_PREL_LO21); type == R_AARCH64_ADR_PREL_LO21);
} }
static int should_emit_aarch64(struct rmod_context *ctx, Elf64_Rela *rel) static int should_emit_aarch64(Elf64_Rela *rel)
{ {
int type; int type;
@ -176,13 +177,13 @@ static int for_each_reloc(struct rmod_context *ctx, int do_emit)
for (j = 0; j < nrelocs; j++) { for (j = 0; j < nrelocs; j++) {
Elf64_Rela *r = &relocs[j]; Elf64_Rela *r = &relocs[j];
if (!ctx->ops->valid_type(ctx, r)) { if (!ctx->ops->valid_type(r)) {
ERROR("Invalid reloc type: %u\n", ERROR("Invalid reloc type: %u\n",
(unsigned int)ELF64_R_TYPE(r->r_info)); (unsigned int)ELF64_R_TYPE(r->r_info));
return -1; return -1;
} }
if (ctx->ops->should_emit(ctx, r)) { if (ctx->ops->should_emit(r)) {
int n = ctx->nrelocs; int n = ctx->nrelocs;
if (do_emit) if (do_emit)
ctx->emitted_relocs[n] = r->r_offset; ctx->emitted_relocs[n] = r->r_offset;
@ -306,7 +307,7 @@ static int vaddr_cmp(const void *a, const void *b)
static int collect_relocations(struct rmod_context *ctx) static int collect_relocations(struct rmod_context *ctx)
{ {
int nrelocs; Elf64_Xword nrelocs;
/* /*
* The relocs array in the pelf should only contain relocations that * The relocs array in the pelf should only contain relocations that
@ -317,7 +318,7 @@ static int collect_relocations(struct rmod_context *ctx)
return -1; return -1;
nrelocs = ctx->nrelocs; nrelocs = ctx->nrelocs;
INFO("%d relocations to be emitted.\n", nrelocs); INFO("%" PRIu64 " relocations to be emitted.\n", nrelocs);
if (!nrelocs) if (!nrelocs)
return 0; return 0;
@ -457,7 +458,6 @@ static int
write_elf(const struct rmod_context *ctx, const struct buffer *in, write_elf(const struct rmod_context *ctx, const struct buffer *in,
struct buffer *out) struct buffer *out)
{ {
int i;
int ret; int ret;
int bit64; int bit64;
size_t loc; size_t loc;
@ -556,7 +556,7 @@ write_elf(const struct rmod_context *ctx, const struct buffer *in,
ctx->xdr->put32(&rmod_header, 0); ctx->xdr->put32(&rmod_header, 0);
/* Write the relocations. */ /* Write the relocations. */
for (i = 0; i < ctx->nrelocs; i++) { for (unsigned i = 0; i < ctx->nrelocs; i++) {
if (bit64) if (bit64)
ctx->xdr->put64(&relocs, ctx->emitted_relocs[i]); ctx->xdr->put64(&relocs, ctx->emitted_relocs[i]);
else else