summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/armv7/Makefile.inc3
-rw-r--r--src/arch/armv7/bootblock.inc8
-rw-r--r--util/cbfstool/common.c37
3 files changed, 28 insertions, 20 deletions
diff --git a/src/arch/armv7/Makefile.inc b/src/arch/armv7/Makefile.inc
index a4f57f34c1..cc306335cd 100644
--- a/src/arch/armv7/Makefile.inc
+++ b/src/arch/armv7/Makefile.inc
@@ -48,8 +48,7 @@ prebuilt-files = $(foreach file,$(cbfs-files), $(call extract_nth,1,$(file)))
$(obj)/coreboot.pre1: $(objcbfs)/bootblock.bin $$(prebuilt-files) $(CBFSTOOL)
$(CBFSTOOL) $@.tmp create -m armv7 -s $(CONFIG_COREBOOT_ROMSIZE_KB)K \
- -B $(objcbfs)/bootblock.bin -a 64 \
- -o $$(( $(CONFIG_ROM_SIZE) - $(CONFIG_CBFS_SIZE) ))
+ -B $(objcbfs)/bootblock.bin -a 64
$(prebuild-files) true
mv $@.tmp $@
else
diff --git a/src/arch/armv7/bootblock.inc b/src/arch/armv7/bootblock.inc
index 90850d62dd..e1b8b19341 100644
--- a/src/arch/armv7/bootblock.inc
+++ b/src/arch/armv7/bootblock.inc
@@ -43,11 +43,11 @@ _start: b reset
.balignl 16,0xdeadbeef
_cbfs_master_header:
- /* The CBFS master header is inserted here by cbfstool
- * when coreboot.rom is being created. Hence, we leave
- * some space for it.
+ /* The CBFS master header is inserted by cbfstool at the first
+ * aligned offset after the above anchor string is found.
+ * Hence, we leave some space for it.
*/
- .skip 64
+ .skip 128 @ Assumes 64-byte alignment
reset:
/*
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 195cda13c6..5413958447 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -565,23 +565,32 @@ int create_cbfs_image(const char *romfile, uint32_t _romsize,
/* Set up physical/virtual mapping */
offset = romarea;
- // should be aligned to align
- uint32_t *arm_vec = (uint32_t *)(romarea + offs);
- master_header = (struct cbfs_header *)(romarea + offs + 0x20);
- loadfile(bootblock, &bootblocksize, romarea + offs + 0x20 +
- sizeof(struct cbfs_header), SEEK_SET);
-
/*
- * Encoding for this branch instruction is:
- * 31:28 - condition (0xe for always/unconditional)
- * 27:24 - Branch (0xa, encoding A1)
- * 23: 0 - sign-extended offset (in multiples of 4)
+ * The initial jump instruction and bootblock will be placed
+ * before and after the master header, respectively. The
+ * bootblock image must contain a blank, aligned region large
+ * enough for the master header to fit.
*
- * When executing the branch, the PC will read as the address
- * of current instruction + 8.
+ * An anchor string must be left such that when cbfstool is run
+ * we can find it and insert the master header at the next
+ * aligned boundary.
*/
- uint32_t imm = ((0x20 + sizeof(struct cbfs_header)) - 8) / 4;
- arm_vec[0] = imm | (0xa << 24) | (0xe << 28);
+ loadfile(bootblock, &bootblocksize, romarea + offs, SEEK_SET);
+
+ unsigned char *p = romarea + offs;
+ while (1) {
+ /* FIXME: assumes little endian... */
+ if (*(uint32_t *)p == 0xdeadbeef)
+ break;
+ if (p >= (romarea + _romsize)) {
+ fprintf(stderr, "E: Could not determine CBFS "
+ "header location.\n", bootblock);
+ return 1;
+ }
+ p += (sizeof(unsigned int));
+ }
+ unsigned int u = ALIGN((unsigned int)(p - romarea), align);
+ master_header = (struct cbfs_header *)(romarea + u);
master_header->magic = ntohl(CBFS_HEADER_MAGIC);
master_header->version = ntohl(CBFS_HEADER_VERSION);