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>
This commit is contained in:
parent
8bc10b74dc
commit
9ad1f56951
|
@ -565,22 +565,23 @@ int create_cbfs_image(const char *romfile, uint32_t _romsize,
|
||||||
/* Set up physical/virtual mapping */
|
/* Set up physical/virtual mapping */
|
||||||
offset = romarea;
|
offset = romarea;
|
||||||
|
|
||||||
// should be aligned to align but then we need to dynamically
|
// should be aligned to align
|
||||||
// create the jump to the bootblock
|
uint32_t *arm_vec = (uint32_t *)(romarea + offs);
|
||||||
|
master_header = (struct cbfs_header *)(romarea + offs + 0x20);
|
||||||
loadfile(bootblock, &bootblocksize, romarea + offs + 0x20 +
|
loadfile(bootblock, &bootblocksize, romarea + offs + 0x20 +
|
||||||
sizeof(struct cbfs_header), SEEK_SET);
|
sizeof(struct cbfs_header), SEEK_SET);
|
||||||
master_header = (struct cbfs_header *)(romarea + offs + 0x20);
|
|
||||||
uint32_t *arm_vec = (uint32_t *)(romarea + offs);
|
|
||||||
/*
|
/*
|
||||||
* Encoding for this branch instruction is:
|
* Encoding for this branch instruction is:
|
||||||
* 31:28 - condition (0xe for always/unconditional)
|
* 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)
|
* 23: 0 - sign-extended offset (in multiples of 4)
|
||||||
*
|
*
|
||||||
* When executing the branch, the PC will read as the address
|
* When executing the branch, the PC will read as the address
|
||||||
* of current instruction + 8.
|
* 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->magic = ntohl(CBFS_HEADER_MAGIC);
|
||||||
master_header->version = ntohl(CBFS_HEADER_VERSION);
|
master_header->version = ntohl(CBFS_HEADER_VERSION);
|
||||||
|
|
Loading…
Reference in New Issue