فهرست منبع

aarch64: add big endian support

Tested with Qemu System Emulation and a uClibc-ng system.
Needs a Linux Kernel patch to mark Big Endian as working again.
Waldemar Brodkorb 1 هفته پیش
والد
کامیت
0cc4085f8d

+ 4 - 3
target/aarch64/Makefile

@@ -10,6 +10,7 @@ KERNEL:=${LINUX_DIR}/arch/arm64/boot/Image
 QEMU_ARGS:=${ADK_QEMU_ARGS}
 QEMU_ARGS+=-M virt -cpu cortex-a57 -smp 1
 QEMU_ARGS+=-netdev user,id=eth0 -device virtio-net-device,netdev=eth0
+QEMU_ARGS+=-append "console=ttyAMA0 earlycon"
 ifeq ($(ADK_TARGET_FS),archive)
 QEMU_ARGS+=-device virtio-blk-device,drive=vda -drive file=qemu-${ADK_TARGET_CPU_ARCH}.img,if=none,id=vda,format=raw
 endif
@@ -35,7 +36,7 @@ ifeq ($(ADK_TARGET_QEMU),y)
 	@echo "Use following command to create a QEMU Image:"
 	@echo "./scripts/create.sh qemu-${ADK_TARGET_CPU_ARCH}.img $(FW_DIR)/$(ROOTFSTARBALL)"
 	@echo "Start qemu with following options:"
-	@echo 'qemu-system-${ADK_TARGET_CPU_ARCH} ${QEMU_ARGS} -kernel $(FW_DIR)/$(TARGET_KERNEL)'
+	@echo 'qemu-system-aarch64 ${QEMU_ARGS} -kernel $(FW_DIR)/$(TARGET_KERNEL)'
 endif
 endif
 ifeq ($(ADK_TARGET_FS),initramfs)
@@ -44,7 +45,7 @@ targethelp:
 	@echo 'The initramfs image is: ${FW_DIR}/${INITRAMFS}'
 ifeq ($(ADK_TARGET_QEMU),y)
 	@echo "Start qemu with following command line:"
-	@echo 'qemu-system-${ADK_TARGET_CPU_ARCH} ${QEMU_ARGS} -kernel $(FW_DIR)/$(TARGET_KERNEL) -initrd ${FW_DIR}/${INITRAMFS}'
+	@echo 'qemu-system-aarch64 ${QEMU_ARGS} -kernel $(FW_DIR)/$(TARGET_KERNEL) -initrd ${FW_DIR}/${INITRAMFS}'
 endif
 endif
 ifeq ($(ADK_TARGET_FS),initramfsarchive)
@@ -57,7 +58,7 @@ targethelp:
 	@echo 'The kernel+initramfs file is: $(FW_DIR)/${TARGET_KERNEL}'
 ifeq ($(ADK_TARGET_QEMU),y)
 	@echo "Start qemu with following command line:"
-	@echo 'qemu-system-${ADK_TARGET_CPU_ARCH} ${QEMU_ARGS} -kernel $(FW_DIR)/$(TARGET_KERNEL)'
+	@echo 'qemu-system-aarch64 ${QEMU_ARGS} -kernel $(FW_DIR)/$(TARGET_KERNEL)'
 endif
 endif
 ifeq ($(ADK_TARGET_FS),nfsroot)

+ 2 - 0
target/aarch64/kernel/qemu-aarch64

@@ -1,4 +1,6 @@
 CONFIG_ARM64=y
 CONFIG_ARCH_VEXPRESS=y
+CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 CONFIG_SERIAL_AMBA_PL011=y
 CONFIG_SERIAL_AMBA_PL011_CONSOLE=y

+ 6 - 0
target/aarch64/kernel/qemu-aarch64be

@@ -0,0 +1,6 @@
+CONFIG_ARM64=y
+CONFIG_ARCH_VEXPRESS=y
+CONFIG_CPU_BIG_ENDIAN=y
+# CONFIG_CPU_LITTLE_ENDIAN is not set
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y

+ 1 - 1
target/aarch64/systems/qemu-aarch64

@@ -1,5 +1,5 @@
 config ADK_TARGET_SYSTEM_QEMU_AARCH64
-	bool "Qemu Emulator"
+	bool "Qemu Emulator (little endian)"
 	select ADK_TARGET_LITTLE_ENDIAN
 	select ADK_TARGET_CPU_AARCH_CORTEX_A57
 	select ADK_TARGET_QEMU

+ 11 - 0
target/aarch64/systems/qemu-aarch64be

@@ -0,0 +1,11 @@
+config ADK_TARGET_SYSTEM_QEMU_AARCH64BE
+	bool "Qemu Emulator (big endian)"
+	select ADK_TARGET_CPU_AARCH_CORTEX_A57
+	select ADK_TARGET_BIG_ENDIAN
+	select ADK_TARGET_QEMU
+	select ADK_TARGET_QEMU_WITH_VIRTIO
+	select ADK_TARGET_KERNEL_IMAGE
+	select ADK_TARGET_KERNEL_WITH_COMPRESSION
+	help
+	  Qemu Emulator for AARCH64 (Big Endian) architecture.
+

+ 2 - 1
target/config/Config.in.endian

@@ -18,6 +18,7 @@ depends on ADK_TARGET_SYSTEM_GENERIC_ARC \
 	|| ADK_TARGET_SYSTEM_SYNOPSYS_NSIM \
 	|| ADK_TARGET_SYSTEM_QEMU_ARC \
 	|| ADK_TARGET_SYSTEM_QEMU_AARCH64 \
+	|| ADK_TARGET_SYSTEM_QEMU_AARCH64BE \
 	|| ADK_TARGET_SYSTEM_QEMU_CSKY \
 	|| ADK_TARGET_SYSTEM_QEMU_MICROBLAZE_ML605 \
 	|| ADK_TARGET_SYSTEM_QEMU_MICROBLAZE_S3ADSP1800 \
@@ -47,7 +48,7 @@ config ADK_TARGET_ENDIAN_SUFFIX
 	string
 	default "le" if ADK_TARGET_LITTLE_ENDIAN && (ADK_TARGET_ARCH_NDS32 || ADK_TARGET_ARCH_PPC64)
 	default "el" if ADK_TARGET_LITTLE_ENDIAN && (ADK_TARGET_ARCH_MIPS || ADK_TARGET_ARCH_MIPS64 || ADK_TARGET_ARCH_MICROBLAZE)
-	default "be" if ADK_TARGET_BIG_ENDIAN && (ADK_TARGET_ARCH_NDS32 || ADK_TARGET_ARCH_AARCH64)
+	default "be" if ADK_TARGET_BIG_ENDIAN && ADK_TARGET_ARCH_NDS32
 	default "eb" if ADK_TARGET_BIG_ENDIAN && (ADK_TARGET_ARCH_ARC || ADK_TARGET_ARM || ADK_TARGET_ARCH_SH)
 
 config ADK_TARGET_ENDIAN

+ 2 - 1
target/config/Config.in.runtime

@@ -388,7 +388,8 @@ config ADK_RUNTIME_CONSOLE_SERIAL_DEVICE
 	default "ttyAMA0" if ADK_TARGET_SYSTEM_QEMU_ARM_VERSATILEPB \
 				|| ADK_TARGET_SYSTEM_QEMU_ARM_REALVIEW_EB_MPCORE \
 				|| ADK_TARGET_SYSTEM_QEMU_ARM_VEXPRESS_A9 \
-				|| ADK_TARGET_SYSTEM_QEMU_AARCH64
+				|| ADK_TARGET_SYSTEM_QEMU_AARCH64 \
+				|| ADK_TARGET_SYSTEM_QEMU_AARCH64BE
 	default "ttyARC0" if ADK_TARGET_SYSTEM_SYNOPSYS_NSIM && ADK_TARGET_CPU_ARC_ARC700
 	default "ttySC1" if ADK_TARGET_SYSTEM_QEMU_SH
 	default "ttySC1" if ADK_TARGET_SYSTEM_HP_JORNADA

+ 3 - 0
target/linux/config/Config.in.virtio

@@ -32,6 +32,7 @@ config ADK_LINUX_KERNEL_VIRTIO_CONSOLE
 	bool "Virtio console driver"
 	select ADK_LINUX_KERNEL_VIRTIO
 	default y if ADK_TARGET_SYSTEM_QEMU_AARCH64
+	default y if ADK_TARGET_SYSTEM_QEMU_AARCH64BE
 	default y if ADK_TARGET_SYSTEM_QEMU_ARC
 	default y if ADK_TARGET_SYSTEM_QEMU_CSKY
 	default y if ADK_TARGET_SYSTEM_QEMU_M68K_VIRT
@@ -50,6 +51,7 @@ config ADK_LINUX_KERNEL_VIRTIO_NET
 	select ADK_LINUX_KERNEL_VIRTIO_PCI
 	select ADK_LINUX_KERNEL_VIRTIO_PCI_LEGACY
 	default y if ADK_TARGET_SYSTEM_QEMU_AARCH64
+	default y if ADK_TARGET_SYSTEM_QEMU_AARCH64BE
 	default y if ADK_TARGET_SYSTEM_QEMU_ARC
 	default y if ADK_TARGET_SYSTEM_QEMU_CSKY
 	default y if ADK_TARGET_SYSTEM_QEMU_M68K_VIRT
@@ -69,6 +71,7 @@ config ADK_LINUX_KERNEL_VIRTIO_BLK
 	select ADK_LINUX_KERNEL_VIRTIO_MMIO
 	select ADK_LINUX_KERNEL_BLK_DEV
 	default y if ADK_TARGET_SYSTEM_QEMU_AARCH64
+	default y if ADK_TARGET_SYSTEM_QEMU_AARCH64BE
 	default y if ADK_TARGET_SYSTEM_QEMU_ARC
 	default y if ADK_TARGET_SYSTEM_QEMU_CSKY
 	default y if ADK_TARGET_SYSTEM_QEMU_M68K_VIRT

+ 11 - 0
target/linux/patches/6.18.46/arm64-big-endian.patch

@@ -0,0 +1,11 @@
+diff -Nur linux-6.18.46.orig/arch/arm64/Kconfig linux-6.18.46/arch/arm64/Kconfig
+--- linux-6.18.46.orig/arch/arm64/Kconfig	2026-08-23 14:27:10.000000000 +0200
++++ linux-6.18.46/arch/arm64/Kconfig	2026-08-25 02:38:38.351986108 +0200
+@@ -1545,7 +1545,6 @@
+ 
+ config CPU_BIG_ENDIAN
+ 	bool "Build big-endian kernel"
+-	depends on BROKEN
+ 	help
+ 	  Say Y if you plan on running a kernel with a big-endian userspace.
+