[coreboot] Patch set updated for coreboot: d634d85 cbfstool: Optionally specify offsets to commands

Noé Rubinstein (noe.rubinstein@gmail.com) gerrit at coreboot.org
Mon Oct 17 14:14:28 CEST 2011


Noé Rubinstein (noe.rubinstein at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/284

-gerrit

commit d634d85badfe28f6a23e67d2811e66dd8695426f
Author: Noe Rubinstein <nrubinstein at avencall.com>
Date:   Tue Sep 27 14:59:12 2011 +0200

    cbfstool: Optionally specify offsets to commands
    
    This enables placing components in specific parts of the ROM while
    leaving the calculation of their precise location to CBFStool. This can
    be used, for example, with flashrom's layout feature.
    
    We plan to use it to provide a more robust fallback mechanism than the
    one already provided by Coreboot, restricting the fallback to a part of
    the ROM which is write-protected during runtime.
    
    Change-Id: I7403f37e2f20306ea113879d12a9fcec175063d8
    Signed-off-by: Noe Rubinstein <nrubinstein at avencall.com>
---
 src/arch/x86/Kconfig                |    6 +++
 src/arch/x86/Makefile.bootblock.inc |    4 +-
 util/cbfstool/cbfstool.c            |   53 ++++++++++++++++++-----
 util/cbfstool/common.c              |   79 ++++++++++++++++++++++++++++++++---
 util/cbfstool/common.h              |    6 ++-
 5 files changed, 128 insertions(+), 20 deletions(-)

diff --git a/src/arch/x86/Kconfig b/src/arch/x86/Kconfig
index f98cf5b..c4ece2a 100644
--- a/src/arch/x86/Kconfig
+++ b/src/arch/x86/Kconfig
@@ -55,6 +55,12 @@ config X86_BOOTBLOCK_NORMAL
 
 endchoice
 
+
+config ROMSTAGE_OFFSET
+	hex "Romstage offset in ROM: "
+	depends on TINY_BOOTBLOCK
+	default '0x0'
+
 config BOOTBLOCK_SOURCE
 	string
 	default "bootblock_simple.c" if X86_BOOTBLOCK_SIMPLE
diff --git a/src/arch/x86/Makefile.bootblock.inc b/src/arch/x86/Makefile.bootblock.inc
index 806afea..dd0d76e 100644
--- a/src/arch/x86/Makefile.bootblock.inc
+++ b/src/arch/x86/Makefile.bootblock.inc
@@ -80,7 +80,9 @@ $(obj)/coreboot.romstage: $(obj)/coreboot.pre1 $$(romstage-objs) $(obj)/romstage
 	$(CC) -nostdlib -nostartfiles -static -o $(obj)/romstage.elf -L$(obj) -T $(obj)/romstage/ldscript.ld $(romstage-objs)
 	$(OBJCOPY) -O binary $(obj)/romstage.elf $(obj)/romstage.bin
 	printf "CONFIG_ROMBASE = 0x" > $(obj)/location.ld
-	$(CBFSTOOL) $(obj)/coreboot.pre1 locate $(obj)/romstage.bin $(CONFIG_CBFS_PREFIX)/romstage $(CONFIG_XIP_ROM_SIZE) > $(obj)/location.txt
+	$(CBFSTOOL) $(obj)/coreboot.pre1 locate $(obj)/romstage.bin \
+		$(CONFIG_CBFS_PREFIX)/romstage $(CONFIG_XIP_ROM_SIZE) \
+		$(CONFIG_ROMSTAGE_OFFSET) > $(obj)/location.txt
 	cat $(obj)/location.txt >> $(obj)/location.ld
 	printf ';\nAUTO_XIP_ROM_BASE = CONFIG_ROMBASE & ~(CONFIG_XIP_ROM_SIZE - 1);\n' >> $(obj)/location.ld
 	$(CC) -nostdlib -nostartfiles -static -o $(obj)/romstage.elf -L$(obj) -T $(obj)/romstage/ldscript.ld $(romstage-objs)
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 4c28c29..bda8cf7 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -78,7 +78,11 @@ static int cbfs_add(int argc, char **argv)
 	else
 		type = strtoul(argv[5], NULL, 0);
 	if (argc > 6) {
-		base = strtoul(argv[6], NULL, 0);
+		if (*argv[6] == '+')
+			base = cbfs_find_location(rom, filesize, filename,
+					strtoul(argv[6]+1, NULL, 0));
+		else
+			base = strtoul(argv[6], NULL, 0);
 	}
 	cbfsfile = create_cbfs_file(cbfsname, filedata, &filesize, type, &base);
 	if (add_file_to_cbfs(cbfsfile, filesize, base))
@@ -118,15 +122,20 @@ static int cbfs_add_payload(int argc, char **argv)
 	void *cbfsfile = NULL;
 
 	comp_algo algo = CBFS_COMPRESS_NONE;
-	if (argc > 5) {
-		if (argv[5][0] == 'l')
+	if (argc > 5 && argv[5][0] == 'l')
 			algo = CBFS_COMPRESS_LZMA;
-	}
-	if (argc > 6) {
-		base = strtoul(argv[6], NULL, 0);
-	}
+
+
 	unsigned char *payload;
 	filesize = parse_elf_to_payload(filedata, &payload, algo);
+
+	if (argc > 6)
+		if (*argv[6] == '+')
+			base = cbfs_find_location(rom, filesize, filename,
+					strtoul(argv[6]+1, NULL, 0));
+		else
+			base = strtoul(argv[6], NULL, 0);
+
 	cbfsfile =
 	    create_cbfs_file(cbfsname, payload, &filesize,
 			     CBFS_COMPONENT_PAYLOAD, &base);
@@ -171,11 +180,27 @@ static int cbfs_add_stage(int argc, char **argv)
 		if (argv[5][0] == 'l')
 			algo = CBFS_COMPRESS_LZMA;
 	}
-	if (argc > 6) {
-		base = strtoul(argv[6], NULL, 0);
-	}
 	unsigned char *stage;
+
+	/* Careful here:
+	 *
+	 * - when the location is specified exactly, we want parse_elf_to_stage
+	 *   to use this information for the romstage to execute correctly. See
+	 *   src/arch/x86/Makefile.bootblock.inc
+	 *
+	 * - the +offset syntax can only be used when parse_elf_to_stage
+	 *   doesn't need this information
+	 */
+
+	if (argc > 6 && *argv[6] != '+')
+			base = strtoul(argv[6], NULL, 0);
+
 	filesize = parse_elf_to_stage(filedata, &stage, algo, &base);
+
+	if (argc > 6 && *argv[6] == '+')
+			base = cbfs_find_location(rom, filesize, filename,
+					strtoul(argv[6]+1, NULL, 0));
+
 	cbfsfile =
 	    create_cbfs_file(cbfsname, stage, &filesize,
 			     CBFS_COMPONENT_STAGE, &base);
@@ -225,8 +250,11 @@ static int cbfs_locate(int argc, char **argv)
 	uint32_t filesize = getfilesize(file);
 	const char *filename = argv[4];
 	int align = strtoul(argv[5], NULL, 0);
+	uint32_t offset = argc > 6 ? strtoul(argv[6], NULL, 0) : 0;
+	uint32_t loc = cbfs_find_stage_location(romname, filesize, filename, align,
+	                                  offset);
 
-	printf("%x\n", cbfs_find_location(romname, filesize, filename, align));
+	printf("%x\n", loc);
 	return 0;
 }
 
@@ -287,7 +315,8 @@ void usage(void)
 	     " add-payload FILE NAME [COMP] [base]  Add a payload to the ROM\n"
 	     " add-stage FILE NAME [COMP] [base]    Add a stage to the ROM\n"
 	     " create SIZE BOOTBLOCK [ALIGN]        Create a ROM file\n"
-	     " locate FILE NAME ALIGN               Find a place for a file of that size\n"
+	     " locate FILE NAME ALIGN OFFSET        Find a place for a file of that size\n"
+	     "                                      OFFSET is relative to the ROM start.\n"
 	     " print                                Show the contents of the ROM\n"
 	     " extract NAME FILE                    Extracts a raw payload from ROM\n"
 	     "\n"
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index cbf0757..09fe5bb 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -436,8 +436,9 @@ static int in_segment(int addr, int size, int gran)
 	return ((addr & ~(gran - 1)) == ((addr + size) & ~(gran - 1)));
 }
 
-uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
-			    const char *filename, uint32_t alignment)
+uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
+			    const char *filename, uint32_t alignment,
+			    uint32_t offset)
 {
 	void *rom = loadrom(romfile);
 	int filename_size = strlen(filename);
@@ -447,6 +448,13 @@ uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
 					     16) + sizeof(struct cbfs_stage);
 	int totalsize = headersize + filesize;
 
+	if (offset > phys_end - phys_start) {
+		fprintf(stderr, "Offset outside of ROM boundaries\n");
+		exit(1);
+	}
+
+	if (offset) offset = ALIGN(phys_start + offset, align);
+
 	uint32_t current = phys_start;
 	while (current < phys_end) {
 		if (!cbfs_file_header(current)) {
@@ -458,10 +466,19 @@ uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
 
 		uint32_t top =
 		    current + ntohl(thisfile->len) + ntohl(thisfile->offset);
-		if (((ntohl(thisfile->type) == 0x0)
-		     || (ntohl(thisfile->type) == 0xffffffff))
-		    && (ntohl(thisfile->len) + ntohl(thisfile->offset) >=
-			totalsize)) {
+
+		uint32_t off_rel = 0;
+		if (current < offset && offset <= top) {
+			off_rel = offset - current;
+			current = offset;
+		}
+
+		if (current >= offset
+		    && ((ntohl(thisfile->type) == 0x0)
+		        || (ntohl(thisfile->type) == 0xffffffff))
+		    && (ntohl(thisfile->len) + ntohl(thisfile->offset)
+			- off_rel >= totalsize)) {
+
 			if (in_segment
 			    (current + headersize, filesize, alignment))
 				return current + headersize;
@@ -485,3 +502,53 @@ uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
 	}
 	return 0;
 }
+
+uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
+			    const char *filename, uint32_t offset)
+{
+	void *rom = loadrom(romfile);
+	int filename_size = strlen(filename);
+
+	int headersize =
+		sizeof(struct cbfs_file) + ALIGN(filename_size + 1, 16);
+
+	int totalsize = headersize + filesize;
+
+	if (offset > phys_end - phys_start) {
+		fprintf(stderr, "Offset outside of ROM boundaries\n");
+		exit(1);
+	}
+
+	if (offset) offset = ALIGN(phys_start + offset, align);
+
+	uint32_t current = phys_start;
+	while (current < phys_end) {
+		if (!cbfs_file_header(current)) {
+			current += align;
+			continue;
+		}
+		struct cbfs_file *thisfile =
+		    (struct cbfs_file *)phys_to_virt(current);
+
+		uint32_t top =
+		    current + ntohl(thisfile->len) + ntohl(thisfile->offset);
+
+		uint32_t off_rel = 0;
+		if (current < offset && offset <= top) {
+			off_rel = offset - current;
+			current = offset;
+		}
+
+		if (current >= offset
+		    && ((ntohl(thisfile->type) == 0x0)
+		        || (ntohl(thisfile->type) == 0xffffffff))
+		    && (ntohl(thisfile->len) + ntohl(thisfile->offset)
+			- off_rel >= totalsize))
+			return current + headersize;
+
+		current = ALIGN(current + (ntohl(thisfile->len) +
+					ntohl(thisfile->offset) - off_rel),
+				align);
+	}
+	return 0;
+}
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h
index 8f397d8..b5aea46 100644
--- a/util/cbfstool/common.h
+++ b/util/cbfstool/common.h
@@ -70,8 +70,12 @@ int add_file_to_cbfs(void *content, uint32_t contentsize, uint32_t location);
 void print_cbfs_directory(const char *filename);
 int extract_file_from_cbfs(const char *filename, const char *payloadname, const char *outpath);
 
+uint32_t cbfs_find_stage_location(const char *romfile, uint32_t filesize,
+			    const char *filename, uint32_t alignment,
+			    uint32_t offset);
+
 uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
-			    const char *filename, uint32_t align);
+			    const char *filename, uint32_t offset);
 
 void print_supported_filetypes(void);
 




More information about the coreboot mailing list