Index | Thread | Search

From:
George Koehler <kernigh@gmail.com>
Subject:
big-endian sysutils/u-boot/{rk356x,rk3588}
To:
ports@openbsd.org
Cc:
kettenis@openbsd.org
Date:
Thu, 21 Mar 2024 13:16:06 -0400

Download raw body.

Thread
I don't use u-boot, but I saw the powerpc bulk failing to package
u-boot for rk356x and rk3588.  This diff fixes the failures by adding
5 endian swaps.  I don't know if my u-boot works, but I picked 2
boards (1 from each package) and compared u-boot-rockchip.bin between
powerpc and amd64: cmp -l|wc -l found 106 to 117 different bytes.

Right now, powerpc is the only big-endian arch that can build this.
mips64 and powerpc64 are missing devel/arm-none-eabi/gcc,aarch64; and
sparc64 has BROKEN-sparc64 on u-boot.  My 750 MHz PowerPC G4 takes
over 3+1/2 hours to package rk3588 and over 7+1/2 hours for rk356x.

May I get an ok from arm64 people?
--gkoehler

Index: rk356x/Makefile
===================================================================
RCS file: /cvs/ports/sysutils/u-boot/rk356x/Makefile,v
diff -u -p -r1.4 Makefile
--- rk356x/Makefile	17 Feb 2024 11:27:42 -0000	1.4
+++ rk356x/Makefile	20 Mar 2024 22:34:34 -0000
@@ -1,4 +1,5 @@
 VERSION=	2024.01
+REVISION=	0
 
 SOC=		rk356x
 
Index: rk356x/files/rkbinpatch.c
===================================================================
RCS file: /cvs/ports/sysutils/u-boot/rk356x/files/rkbinpatch.c,v
diff -u -p -r1.1 rkbinpatch.c
--- rk356x/files/rkbinpatch.c	17 Oct 2023 19:36:22 -0000	1.1
+++ rk356x/files/rkbinpatch.c	20 Mar 2024 22:34:35 -0000
@@ -16,6 +16,7 @@
 
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <endian.h>
 #include <err.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -43,12 +44,13 @@ main(int argc, char *argv[])
 
 	end = (char *)start + st.st_size;
 	for (word = start; (void *)word < end; word++) {
-		if (*word == 0x12345678 && (void *)(word + 10) < end) {
-			data = *(word + 9);
+		if (le32toh(*word) == 0x12345678 &&
+		    (void *)(word + 10) < end) {
+			data = le32toh(*(word + 9));
 			if ((data & 0xffffff) == 1500000) {
 				data &= 0xff000000;
 				data |= 115200;
-				*(word + 9) = data;
+				*(word + 9) = htole32(data);
 				close(fd);
 				return 0;
 			}
Index: rk356x/patches/patch-tools_rkcommon_c
===================================================================
RCS file: rk356x/patches/patch-tools_rkcommon_c
diff -N rk356x/patches/patch-tools_rkcommon_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ rk356x/patches/patch-tools_rkcommon_c	20 Mar 2024 22:34:35 -0000
@@ -0,0 +1,23 @@
+Add endian swaps for BE_ARCHS.
+
+Index: tools/rkcommon.c
+--- tools/rkcommon.c.orig
++++ tools/rkcommon.c
+@@ -454,7 +454,7 @@ int rkcommon_verify_header(unsigned char *buf, int siz
+ 	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);
+@@ -489,7 +489,7 @@ void rkcommon_print_header(const void *buf, struct ima
+ 	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) {
Index: rk3588/Makefile
===================================================================
RCS file: /cvs/ports/sysutils/u-boot/rk3588/Makefile,v
diff -u -p -r1.3 Makefile
--- rk3588/Makefile	6 Mar 2024 10:19:30 -0000	1.3
+++ rk3588/Makefile	20 Mar 2024 22:34:35 -0000
@@ -1,5 +1,5 @@
 VERSION=	2024.01-rc3
-REVISION=	1
+REVISION=	2
 
 SOC=		rk3588
 
Index: rk3588/files/rkbinpatch.c
===================================================================
RCS file: /cvs/ports/sysutils/u-boot/rk3588/files/rkbinpatch.c,v
diff -u -p -r1.1 rkbinpatch.c
--- rk3588/files/rkbinpatch.c	26 Nov 2023 21:06:26 -0000	1.1
+++ rk3588/files/rkbinpatch.c	20 Mar 2024 22:34:35 -0000
@@ -43,12 +43,13 @@ main(int argc, char *argv[])
 
 	end = (char *)start + st.st_size;
 	for (word = start; (void *)word < end; word++) {
-		if (*word == 0x12345678 && (void *)(word + 14) < end) {
-			data = *(word + 13);
+		if (le32toh(*word) == 0x12345678 &&
+		    (void *)(word + 14) < end) {
+			data = le32toh(*(word + 13));
 			if ((data & 0xffffff) == 1500000) {
 				data &= 0xff000000;
 				data |= 115200;
-				*(word + 13) = data;
+				*(word + 13) = htole32(data);
 				close(fd);
 				return 0;
 			}
Index: rk3588/patches/patch-tools_rkcommon_c
===================================================================
RCS file: rk3588/patches/patch-tools_rkcommon_c
diff -N rk3588/patches/patch-tools_rkcommon_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ rk3588/patches/patch-tools_rkcommon_c	20 Mar 2024 22:34:35 -0000
@@ -0,0 +1,23 @@
+Add endian swaps for BE_ARCHS.
+
+Index: tools/rkcommon.c
+--- tools/rkcommon.c.orig
++++ tools/rkcommon.c
+@@ -454,7 +454,7 @@ int rkcommon_verify_header(unsigned char *buf, int siz
+ 	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);
+@@ -489,7 +489,7 @@ void rkcommon_print_header(const void *buf, struct ima
+ 	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) {