diff options
author | Philipp Tomsich <philipp.tomsich@theobroma-systems.com> | 2017-03-15 12:08:43 +0100 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2017-04-04 20:01:57 -0600 |
commit | 111bcc4fb6cb4a519daabf4812f3ce77f002352f (patch) | |
tree | 66a11d6c62990546b22be1bebfe8e526046eb7e2 /tools/rkcommon.h | |
parent | f3edf8b18ff6a6f5bf9893da5460449bae028430 (diff) |
rockchip: mkimage: pad the header to 8-bytes (using a 'nop') for RK3399
The RK3399 boot code (running as AArch64) poses a bit of a challenge
for SPL image generation:
* The BootROM will start execution right after the 4-byte header (at
the odd instruction word loaded into SRAM at 0xff8c2004, with the
'RK33' boot magic residing at 0xff8c2000).
* The default padding (during ELF generation) for AArch64 is 0x0,
which is an illegal instruction and the .text section needs to be
naturally aligned (someone might locate a 64bit constant relative
to the section start and unaligned loads trigger a fault for all
privileged modes of an ARMv8)... so we can't simply define the
CONFIG_SPL_TEXT_BASE option to the odd address (0xff8c2004).
* Finally, we don't want to change the values used for padding of
the SPL .text section for all ARMv8 targets to the instruction
word encoding 'nop', as this would affect all padding in this
section and might hide errors that would otherwise quickly trigger
an illegal insn exception.
To deal with this situation, we modify the rkimage generation to
- understand the fact that the RK3399 needs to pad the header to an
8 byte boundary using an AArch64 'nop'
- the necessary logic to adjust the header_size (which controls the
location where the payload is copied into the image) and to insert
this padding (AArch64 insn words are always little-endian) into
the image following the 4-byte header magic.
X-AffectedPlatforms: RK3399-Q7
Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com>
Diffstat (limited to 'tools/rkcommon.h')
-rw-r--r-- | tools/rkcommon.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/tools/rkcommon.h b/tools/rkcommon.h index b4f6f327dc..3d645168c2 100644 --- a/tools/rkcommon.h +++ b/tools/rkcommon.h @@ -34,6 +34,19 @@ int rkcommon_check_params(struct image_tool_params *params); const char *rkcommon_get_spl_hdr(struct image_tool_params *params); /** + * rkcommon_get_spl_hdr_padto8() - check if we need to pad to 8 bytes + * + * Rockchip's bootrom starts execution right after the SPL header (i.e. + * at offset 4), but we can not reasonably align the test section of + * an AArch64 SPL at 4 bytes (as this would break natural alignment + * and any embedded constants might cause an alignment exception, which + * is illegal in privileged modes). + * + * Padding is (for now) assumed to occur with a single AArch64 'nop'. + */ +const bool rkcommon_get_spl_hdr_padto8(struct image_tool_params *params); + +/** * rkcommon_get_spl_size() - get spl size for a Rockchip boot image * * Different chip may have different sram size. And if we want to jump @@ -77,4 +90,14 @@ bool rkcommon_need_rc4_spl(struct image_tool_params *params); */ void rkcommon_rc4_encode_spl(void *buf, unsigned int offset, unsigned int size); +/** + * rkcommon_vrec_header() - allocate memory for the header + * + * @params: Pointer to the tool params structure + * @tparams: Pointer tot the image type structure (for setting + * the header and header_size) + */ +void rkcommon_vrec_header(struct image_tool_params *params, + struct image_type_params *tparams); + #endif |