summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Hendricks <dhendrix@chromium.org>2013-01-09 17:45:19 -0800
committerRonald G. Minnich <rminnich@gmail.com>2013-01-10 18:01:14 +0100
commit9ad1f56951df3d3877b9ae588909b1cb059c1cd7 (patch)
tree2cec1b223b2b2720e4497f40815cfa917c5eb4e7
parent8bc10b74dc36cdefdfb5a1c4457d44d9ec32fa15 (diff)
armv7: dynamically calculate the branch offset in cbfstool
This tidies up the ARMV7 case when creating cbfs: - Calculate the offset using the size of the master header and offsets rather than using a magic constant. - Re-order some assignments so things happen in a logical order. Change-Id: Id9cdbc3389c8bb504fa99436c9771936cc4c1c23 Signed-off-by: David Hendricks <dhendrix@chromium.org> Reviewed-on: http://review.coreboot.org/2125 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
-rw-r--r--util/cbfstool/common.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 3b63e5426d..195cda13c6 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -565,22 +565,23 @@ int create_cbfs_image(const char *romfile, uint32_t _romsize,
/* Set up physical/virtual mapping */
offset = romarea;
- // should be aligned to align but then we need to dynamically
- // create the jump to the bootblock
- loadfile(bootblock, &bootblocksize, romarea + offs + 0x20 +
- sizeof(struct cbfs_header), SEEK_SET);
- master_header = (struct cbfs_header *)(romarea + offs + 0x20);
+ // 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 - 0xa
+ * 27:24 - Branch (0xa, encoding A1)
* 23: 0 - sign-extended offset (in multiples of 4)
*
* When executing the branch, the PC will read as the address
* of current instruction + 8.
*/
- arm_vec[0] = htonl(0x0e0000ea); // branch to . + 64 bytes
+ uint32_t imm = ((0x20 + sizeof(struct cbfs_header)) - 8) / 4;
+ arm_vec[0] = imm | (0xa << 24) | (0xe << 28);
master_header->magic = ntohl(CBFS_HEADER_MAGIC);
master_header->version = ntohl(CBFS_HEADER_VERSION);