From: Piotr Kubaj <[email protected]>
rkcommon_verify_header() and rkcommon_print_header() compare the first
four bytes of the image against RK_MAGIC_V2 using a raw host-endian read:
if ((*(uint32_t *)buf) == RK_MAGIC_V2)
The v2 header is written little-endian (rkcommon_set_header0_v2() uses
cpu_to_le32(RK_MAGIC_V2)) and rkcommon_parse_header() already reads it
back with le32_to_cpu(). On a big-endian build host the two raw reads
above never match, so a valid v2 image (e.g. for RK3568) is not
recognised as v2: verification falls through to the v1 path and fails
with "Error: image verification failed".
Read the magic with le32_to_cpu() at both sites so mkimage works when
built on a big-endian host. This is a no-op on little-endian hosts.
Signed-off-by: Piotr Kubaj <[email protected]>
---
tools/rkcommon.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/rkcommon.c b/tools/rkcommon.c
index b39777f..0e456ae 100644
--- a/tools/rkcommon.c
+++ b/tools/rkcommon.c
@@ -473,7 +473,7 @@ int rkcommon_verify_header(unsigned char *buf, int size,
int ret;
/* spl_hdr is abandon on header_v2 */
- if ((*(uint32_t *)buf) == RK_MAGIC_V2)
+ if (le32_to_cpu(*(uint32_t *)buf) == RK_MAGIC_V2)
return 0;
ret = rkcommon_parse_header(buf, &header0, &img_spl_info);
@@ -508,7 +508,7 @@ void rkcommon_print_header(const void *buf, struct
image_tool_params *params)
uint8_t image_type;
int ret, boot_size, init_size;
- if ((*(uint32_t *)buf) == RK_MAGIC_V2) {
+ if (le32_to_cpu(*(uint32_t *)buf) == RK_MAGIC_V2) {
ret = rkcommon_parse_header_v2(buf, &header0_v2);
if (ret < 0) {
--
2.52.0