* RFC: riscv64 big endian system attempt
@ 2024-12-20 15:57 Ben Dooks
2024-12-20 15:57 ` [RFC 01/15] riscv: add initial kconfig and build flags for big-endian Ben Dooks
` (15 more replies)
0 siblings, 16 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv
With the latest spec adding configurable endianness, we thought we
should try putting together a proof of concept riscv64 big endian.
The full information is documented on our gitlab[1] which includes
source repositories, build information and project documentation.
We have a minimal buildroot, qemu and kernel working on QEMU.
As this is a work in progress any review or help is appreciated.
[1] https://gitlab.com/CodethinkLabs/riscv_bigendian
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 18+ messages in thread
* [RFC 01/15] riscv: add initial kconfig and build flags for big-endian
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 02/15] add __RISCVEB__ to byteorder.h Ben Dooks
` (14 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
this is the initial kconfig and makefile updates to get a base
big-endian build for arch/riscv. Will require header updates
for IO code and features whcih are known to not work.
---
arch/riscv/Kconfig | 22 ++++++++++++++++++++++
arch/riscv/Makefile | 15 ++++++++++++---
2 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index fa8f2da87a0a..e352e022ed4a 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -426,6 +426,28 @@ choice
bool "medium any code model"
endchoice
+choice
+ prompt "Data endian"
+ default CPU_LITTLE_ENDIAN
+ help
+ Configure the endiannes of data access performed by the CPU.
+ This will require system to be booted from M mode in big endian
+ and the userland to be compiled for the same endian-ness.
+
+config CPU_BIG_ENDIAN
+ bool "Build big-endian kernel"
+ depends on EXPERT
+ help
+ Say Y if you want to run big-endian kernel and userspace
+ Set for expert as this experimental
+
+config CPU_LITTLE_ENDIAN
+ bool "Build little-endian kernel (default)"
+ help
+ Say Y if you want to run little-endian kernel and userspace
+ This is the default for most distributions
+endchoice
+
config MODULE_SECTIONS
bool
select HAVE_MOD_ARCH_SPECIFIC
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index d469db9f46f4..535cbbb76f5c 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -21,6 +21,11 @@ else
endif
endif
+ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
+KBUILD_CPPFLAGS += -mbig-endian -D__RISCVEB__
+CHECKFLAGS += -D__RISCVEB__
+endif
+
ifeq ($(CONFIG_CMODEL_MEDLOW),y)
KBUILD_CFLAGS_MODULE += -mcmodel=medany
endif
@@ -28,13 +33,17 @@ endif
export BITS
ifeq ($(CONFIG_ARCH_RV64I),y)
BITS := 64
- UTS_MACHINE := riscv64
+ ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
+ UTS_MACHINE := riscv64_be
+ KBUILD_LDFLAGS += -melf64briscv
+ else
+ UTS_MACHINE := riscv64
+ KBUILD_LDFLAGS += -melf64lriscv
+ endif
KBUILD_CFLAGS += -mabi=lp64
KBUILD_AFLAGS += -mabi=lp64
- KBUILD_LDFLAGS += -melf64lriscv
-
KBUILD_RUSTFLAGS += -Ctarget-cpu=generic-rv64 --target=riscv64imac-unknown-none-elf \
-Cno-redzone
else
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 02/15] add __RISCVEB__ to byteorder.h
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
2024-12-20 15:57 ` [RFC 01/15] riscv: add initial kconfig and build flags for big-endian Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 03/15] riscv: disable vector if big-endian, gcc unsupported option Ben Dooks
` (13 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
---
arch/riscv/include/uapi/asm/byteorder.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/riscv/include/uapi/asm/byteorder.h b/arch/riscv/include/uapi/asm/byteorder.h
index f671e16bf6af..61da07ed6b32 100644
--- a/arch/riscv/include/uapi/asm/byteorder.h
+++ b/arch/riscv/include/uapi/asm/byteorder.h
@@ -7,6 +7,10 @@
#ifndef _UAPI_ASM_RISCV_BYTEORDER_H
#define _UAPI_ASM_RISCV_BYTEORDER_H
+#ifdef __RISCVEB__
+#include <linux/byteorder/big_endian.h>
+#else
#include <linux/byteorder/little_endian.h>
+#endif
#endif /* _UAPI_ASM_RISCV_BYTEORDER_H */
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 03/15] riscv: disable vector if big-endian, gcc unsupported option
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
2024-12-20 15:57 ` [RFC 01/15] riscv: add initial kconfig and build flags for big-endian Ben Dooks
2024-12-20 15:57 ` [RFC 02/15] add __RISCVEB__ to byteorder.h Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 04/15] riscv: word-at-atime: move to generic if we're big endian Ben Dooks
` (12 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
You can't build with vector enabled at the moment so remove
this until gcc is changed.
---
arch/riscv/Kconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index e352e022ed4a..d632bfad190c 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -602,6 +602,7 @@ config RISCV_ISA_V
bool "VECTOR extension support"
depends on TOOLCHAIN_HAS_V
depends on FPU
+ depends on CPU_LITTLE_ENDIAN
select DYNAMIC_SIGFRAME
default y
help
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 04/15] riscv: word-at-atime: move to generic if we're big endian
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (2 preceding siblings ...)
2024-12-20 15:57 ` [RFC 03/15] riscv: disable vector if big-endian, gcc unsupported option Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 05/15] riscv: asm: use .insn for making custom instructioons Ben Dooks
` (11 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
Use the generic word at a time code if we're running in big endian
for now otherwise this doesn't work. Add better support later.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
arch/riscv/include/asm/word-at-a-time.h | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/arch/riscv/include/asm/word-at-a-time.h b/arch/riscv/include/asm/word-at-a-time.h
index 3802cda71ab7..436e3588f50f 100644
--- a/arch/riscv/include/asm/word-at-a-time.h
+++ b/arch/riscv/include/asm/word-at-a-time.h
@@ -8,8 +8,9 @@
#ifndef _ASM_RISCV_WORD_AT_A_TIME_H
#define _ASM_RISCV_WORD_AT_A_TIME_H
-
#include <asm/asm-extable.h>
+
+#ifndef __RISCVEB__
#include <linux/bitops.h>
#include <linux/wordpart.h>
@@ -47,6 +48,14 @@ static inline unsigned long find_zero(unsigned long mask)
/* The mask we created is directly usable as a bytemask */
#define zero_bytemask(mask) (mask)
+#else /* !__RISCVEB__ */
+
+/* use the generic one for now */
+#include <asm-generic/word-at-a-time.h>
+#endif /* !__RISCVEB__ */
+
+
+
#ifdef CONFIG_DCACHE_WORD_ACCESS
/*
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 05/15] riscv: asm: use .insn for making custom instructioons
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (3 preceding siblings ...)
2024-12-20 15:57 ` [RFC 04/15] riscv: word-at-atime: move to generic if we're big endian Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 06/15] intiial header work Ben Dooks
` (10 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
Using .word breaks with big endian builds, making something which
is not a valid or worse an instruction or pair that does something
which is not intended.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
arch/riscv/include/asm/insn-def.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/riscv/include/asm/insn-def.h b/arch/riscv/include/asm/insn-def.h
index 9a913010cdd9..f6dd6d963de9 100644
--- a/arch/riscv/include/asm/insn-def.h
+++ b/arch/riscv/include/asm/insn-def.h
@@ -196,8 +196,14 @@
INSN_I(OPCODE_MISC_MEM, FUNC3(2), __RD(0), \
RS1(base), SIMM12(4))
+#ifndef CONFIG_AS_HAS_INSN
#define RISCV_PAUSE ".4byte 0x100000f"
#define ZAWRS_WRS_NTO ".4byte 0x00d00073"
#define ZAWRS_WRS_STO ".4byte 0x01d00073"
+#else
+#define RISCV_PAUSE ".insn 0x100000f"
+#define ZAWRS_WRS_NTO ".insn 0x00d00073"
+#define ZAWRS_WRS_STO ".insn 0x01d00073"
+#endif
#endif /* __ASM_INSN_DEF_H */
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 06/15] intiial header work
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (4 preceding siblings ...)
2024-12-20 15:57 ` [RFC 05/15] riscv: asm: use .insn for making custom instructioons Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 07/15] kconfig: remove CONFIG_COMAPT for big-endian (compat cods doesn't build atm) Ben Dooks
` (9 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
---
arch/riscv/include/asm/image.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/riscv/include/asm/image.h b/arch/riscv/include/asm/image.h
index e0b319af3681..21ffe80aa397 100644
--- a/arch/riscv/include/asm/image.h
+++ b/arch/riscv/include/asm/image.h
@@ -13,7 +13,8 @@
#define RISCV_IMAGE_FLAG_BE 1
#ifdef CONFIG_CPU_BIG_ENDIAN
-#error conversion of header fields to LE not yet implemented
+//#error conversion of header fields to LE not yet implemented
+#define __HEAD_FLAG_BE RISCV_IMAGE_FLAG_BE
#else
#define __HEAD_FLAG_BE RISCV_IMAGE_FLAG_LE
#endif
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 07/15] kconfig: remove CONFIG_COMAPT for big-endian (compat cods doesn't build atm)
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (5 preceding siblings ...)
2024-12-20 15:57 ` [RFC 06/15] intiial header work Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 08/15] defconfig: add our build config Ben Dooks
` (8 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
---
arch/riscv/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index d632bfad190c..5a72e7b31095 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -930,7 +930,7 @@ config ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
config COMPAT
bool "Kernel support for 32-bit U-mode"
default 64BIT
- depends on 64BIT && MMU
+ depends on 64BIT && MMU && !CPU_BIG_ENDIAN
help
This option enables support for a 32-bit U-mode running under a 64-bit
kernel at S-mode. riscv32-specific components such as system calls,
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 08/15] defconfig: add our build config
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (6 preceding siblings ...)
2024-12-20 15:57 ` [RFC 07/15] kconfig: remove CONFIG_COMAPT for big-endian (compat cods doesn't build atm) Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 09/15] temp: remove various library optimisations Ben Dooks
` (7 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
---
arch/riscv/configs/be_defconfig | 344 ++++++++++++++++++++++++++++++++
1 file changed, 344 insertions(+)
create mode 100644 arch/riscv/configs/be_defconfig
diff --git a/arch/riscv/configs/be_defconfig b/arch/riscv/configs/be_defconfig
new file mode 100644
index 000000000000..89d06b74a1b8
--- /dev/null
+++ b/arch/riscv/configs/be_defconfig
@@ -0,0 +1,344 @@
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+CONFIG_BPF_LSM=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_CGROUPS=y
+CONFIG_MEMCG=y
+CONFIG_BLK_CGROUP=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_CGROUP_PIDS=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_HUGETLB=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_BPF=y
+CONFIG_NAMESPACES=y
+CONFIG_USER_NS=y
+CONFIG_CHECKPOINT_RESTORE=y
+CONFIG_BOOT_CONFIG=y
+CONFIG_EXPERT=y
+# CONFIG_SYSFS_SYSCALL is not set
+CONFIG_PROFILING=y
+CONFIG_ARCH_MICROCHIP=y
+CONFIG_ARCH_RENESAS=y
+CONFIG_ARCH_SIFIVE=y
+CONFIG_ARCH_SOPHGO=y
+CONFIG_SOC_STARFIVE=y
+CONFIG_ARCH_SUNXI=y
+CONFIG_ARCH_THEAD=y
+CONFIG_ARCH_VIRT=y
+CONFIG_ARCH_CANAAN=y
+CONFIG_CPU_BIG_ENDIAN=y
+CONFIG_SMP=y
+CONFIG_RISCV_EMULATED_UNALIGNED_ACCESS=y
+CONFIG_CMDLINE="earlycon=sbi console=ttyS0,115200,8h1 root=/dev/vda"
+CONFIG_CMDLINE_EXTEND=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPUFREQ_DT=y
+CONFIG_ACPI_CPPC_CPUFREQ=m
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=m
+CONFIG_ACPI=y
+CONFIG_KPROBES=y
+CONFIG_JUMP_LABEL=y
+CONFIG_STATIC_KEYS_SELFTEST=y
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_BLK_DEV_THROTTLING=y
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_XFRM_USER=m
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_INET_ESP=m
+CONFIG_NETFILTER=y
+CONFIG_BRIDGE_NETFILTER=m
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_IPVS=m
+CONFIG_IP_VS=m
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_RR=m
+CONFIG_IP_VS_NFCT=y
+CONFIG_NF_LOG_ARP=m
+CONFIG_NF_LOG_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_NF_LOG_IPV6=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_BRIDGE=m
+CONFIG_BRIDGE_VLAN_FILTERING=y
+CONFIG_VLAN_8021Q=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_CLS_CGROUP=m
+CONFIG_NETLINK_DIAG=y
+CONFIG_CGROUP_NET_PRIO=y
+CONFIG_BPF_STREAM_PARSER=y
+CONFIG_CAN=m
+CONFIG_NET_9P=y
+CONFIG_NET_9P_VIRTIO=y
+CONFIG_PCI=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCI_HOST_GENERIC=y
+CONFIG_PCIE_XILINX=y
+CONFIG_PCIE_FU740=y
+CONFIG_PCIE_STARFIVE_HOST=m
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_SIFIVE_CCACHE=y
+CONFIG_MTD=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_SPI_NOR=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_VIRTIO_BLK=y
+CONFIG_BLK_DEV_NVME=m
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_SCSI_VIRTIO=y
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_AHCI_PLATFORM=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_THIN_PROVISIONING=m
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_MACVLAN=m
+CONFIG_IPVLAN=m
+CONFIG_VXLAN=m
+CONFIG_VETH=m
+CONFIG_VIRTIO_NET=y
+CONFIG_MACB=y
+CONFIG_E1000E=y
+CONFIG_R8169=y
+CONFIG_RAVB=y
+CONFIG_STMMAC_ETH=m
+CONFIG_MICREL_PHY=y
+CONFIG_MICROSEMI_PHY=y
+CONFIG_MOTORCOMM_PHY=y
+CONFIG_CAN_RCAR_CANFD=m
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_KEYBOARD_SUN4I_LRADC=m
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_DW=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_SERIAL_EARLYCON_RISCV_SBI=y
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_VIRTIO_CONSOLE=y
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_VIRTIO=y
+CONFIG_HW_RANDOM_JH7110=m
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_DESIGNWARE_CORE=y
+CONFIG_I2C_MV64XXX=m
+CONFIG_I2C_RIIC=y
+CONFIG_SPI=y
+CONFIG_SPI_CADENCE_QUADSPI=m
+CONFIG_SPI_PL022=m
+CONFIG_SPI_RSPI=m
+CONFIG_SPI_SIFIVE=y
+CONFIG_SPI_SUN6I=y
+# CONFIG_PTP_1588_CLOCK is not set
+CONFIG_GPIO_SIFIVE=y
+CONFIG_GPIO_ADP5585=y
+CONFIG_POWER_RESET_GPIO_RESTART=y
+CONFIG_SENSORS_SFCTEMP=m
+CONFIG_SENSORS_SG2042_MCU=m
+CONFIG_CPU_THERMAL=y
+CONFIG_DEVFREQ_THERMAL=y
+CONFIG_RZG2L_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_SUNXI_WATCHDOG=y
+CONFIG_MFD_ADP5585=y
+CONFIG_MFD_AXP20X_I2C=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_AXP20X=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_MEDIA_SUPPORT=m
+CONFIG_VIDEO_CADENCE_CSI2RX=m
+CONFIG_DRM=m
+CONFIG_DRM_RADEON=m
+CONFIG_DRM_NOUVEAU=m
+CONFIG_DRM_SUN4I=m
+CONFIG_DRM_VIRTIO_GPU=m
+CONFIG_FB=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_UTIMER=y
+CONFIG_SND_SOC=y
+CONFIG_SND_DESIGNWARE_I2S=m
+CONFIG_SND_SOC_STARFIVE=m
+CONFIG_SND_SOC_JH7110_PWMDAC=m
+CONFIG_SND_SOC_JH7110_TDM=m
+CONFIG_SND_SOC_WM8978=m
+CONFIG_SND_SOC_MT6357=y
+CONFIG_SND_SIMPLE_CARD=m
+CONFIG_USB=y
+CONFIG_USB_OTG=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_PLATFORM=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_RENESAS_USBHS=m
+CONFIG_USB_STORAGE=y
+CONFIG_USB_UAS=y
+CONFIG_USB_CDNS_SUPPORT=m
+CONFIG_USB_CDNS3=m
+CONFIG_USB_CDNS3_GADGET=y
+CONFIG_USB_CDNS3_HOST=y
+CONFIG_USB_CDNS3_STARFIVE=m
+CONFIG_USB_MUSB_HDRC=m
+CONFIG_USB_MUSB_SUNXI=m
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_USB_GADGET=y
+CONFIG_USB_RENESAS_USBHS_UDC=m
+CONFIG_USB_CONFIGFS=m
+CONFIG_USB_CONFIGFS_SERIAL=y
+CONFIG_USB_CONFIGFS_ACM=y
+CONFIG_USB_CONFIGFS_OBEX=y
+CONFIG_USB_CONFIGFS_NCM=y
+CONFIG_USB_CONFIGFS_ECM=y
+CONFIG_USB_CONFIGFS_ECM_SUBSET=y
+CONFIG_USB_CONFIGFS_RNDIS=y
+CONFIG_USB_CONFIGFS_EEM=y
+CONFIG_USB_CONFIGFS_MASS_STORAGE=y
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_OF_DWCMSHC=y
+CONFIG_MMC_SDHCI_CADENCE=y
+CONFIG_MMC_SPI=y
+CONFIG_MMC_SDHI=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_STARFIVE=y
+CONFIG_MMC_SUNXI=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_SUN6I=y
+CONFIG_DMADEVICES=y
+CONFIG_DMA_SUN6I=m
+CONFIG_DW_AXI_DMAC=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_BALLOON=y
+CONFIG_VIRTIO_INPUT=y
+CONFIG_VIRTIO_MMIO=y
+CONFIG_CLK_SOPHGO_CV1800=y
+CONFIG_SUN8I_DE2_CCU=m
+CONFIG_RENESAS_OSTM=y
+CONFIG_SUN50I_IOMMU=y
+CONFIG_RPMSG_CHAR=y
+CONFIG_RPMSG_CTRL=y
+CONFIG_RPMSG_VIRTIO=y
+CONFIG_PM_DEVFREQ=y
+CONFIG_IIO=y
+CONFIG_PHY_SUN4I_USB=m
+CONFIG_PHY_RCAR_GEN3_USB2=y
+CONFIG_PHY_STARFIVE_JH7110_DPHY_RX=m
+CONFIG_PHY_STARFIVE_JH7110_PCIE=m
+CONFIG_PHY_STARFIVE_JH7110_USB=m
+CONFIG_LIBNVDIMM=y
+CONFIG_NVMEM_SUNXI_SID=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_BTRFS_FS=m
+CONFIG_BTRFS_FS_POSIX_ACL=y
+CONFIG_AUTOFS_FS=y
+CONFIG_OVERLAY_FS=m
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_HUGETLBFS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
+CONFIG_NFS_V4_2=y
+CONFIG_ROOT_NFS=y
+CONFIG_9P_FS=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ISO8859_1=m
+CONFIG_SECURITY=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SECURITY_APPARMOR=y
+CONFIG_SECURITY_IPE=y
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,bpf"
+CONFIG_CRYPTO_USER_API_HASH=y
+CONFIG_CRYPTO_DEV_VIRTIO=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_PAGEALLOC=y
+CONFIG_SCHED_STACK_END_CHECK=y
+CONFIG_DEBUG_VM=y
+CONFIG_DEBUG_VM_PGFLAGS=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_DEBUG_PER_CPU_MAPS=y
+CONFIG_SOFTLOCKUP_DETECTOR=y
+CONFIG_WQ_WATCHDOG=y
+CONFIG_DEBUG_TIMEKEEPING=y
+CONFIG_DEBUG_RT_MUTEXES=y
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_DEBUG_MUTEXES=y
+CONFIG_DEBUG_RWSEMS=y
+CONFIG_DEBUG_ATOMIC_SLEEP=y
+CONFIG_DEBUG_LIST=y
+CONFIG_DEBUG_PLIST=y
+CONFIG_DEBUG_SG=y
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_EQS_DEBUG=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_USER_EVENTS=y
+CONFIG_TRACE_EVENT_INJECT=y
+CONFIG_KPROBE_EVENT_GEN_TEST=m
+CONFIG_RV=y
+CONFIG_TEST_BPF=y
+CONFIG_FIND_BIT_BENCHMARK=y
+CONFIG_TEST_STATIC_KEYS=m
+CONFIG_MEMTEST=y
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 09/15] temp: remove various library optimisations
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (7 preceding siblings ...)
2024-12-20 15:57 ` [RFC 08/15] defconfig: add our build config Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 10/15] riscv: fixup use of natural endian on instructions Ben Dooks
` (6 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
These either need fixing or checking for big endian.
- memove is deifentyl not working
- ignore memset and memcpy optimisation for now
- uaccess code needs fixing
---
arch/riscv/lib/memcpy.S | 22 +++++++++++++++++++++-
arch/riscv/lib/memmove.S | 2 +-
arch/riscv/lib/memset.S | 1 +
arch/riscv/lib/strlen.S | 2 +-
arch/riscv/lib/uaccess.S | 7 +++++--
5 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/arch/riscv/lib/memcpy.S b/arch/riscv/lib/memcpy.S
index 44e009ec5fef..b51380f06204 100644
--- a/arch/riscv/lib/memcpy.S
+++ b/arch/riscv/lib/memcpy.S
@@ -7,12 +7,15 @@
#include <asm/asm.h>
/* void *memcpy(void *, const void *, size_t) */
-SYM_FUNC_START(__memcpy)
+SYM_FUNC_START(__memcpy1)
move t6, a0 /* Preserve return value */
/* Defer to byte-oriented copy for small sizes */
sltiu a3, a2, 128
+ j 4f /* for now just always use bytes */
+
bnez a3, 4f
+
/* Use word-oriented copy only if low-order bits match */
andi a3, t6, SZREG-1
andi a4, a1, SZREG-1
@@ -87,6 +90,7 @@ SYM_FUNC_START(__memcpy)
or a5, a5, a3
andi a5, a5, 3
bnez a5, 5f
+ j 5f /* skip word */
7:
lw a4, 0(a1)
addi a1, a1, 4
@@ -104,6 +108,22 @@ SYM_FUNC_START(__memcpy)
bltu a1, a3, 5b
6:
ret
+
+SYM_FUNC_START(__memcpy)
+ move t6, a0 /* Preserve return value */
+ beqz a2, 6f
+ add a3, a1, a2
+
+5:
+ lb a4, 0(a1)
+ addi a1, a1, 1
+ sb a4, 0(t6)
+ addi t6, t6, 1
+ bltu a1, a3, 5b
+6:
+ ret
+
+
SYM_FUNC_END(__memcpy)
SYM_FUNC_ALIAS_WEAK(memcpy, __memcpy)
SYM_FUNC_ALIAS(__pi_memcpy, __memcpy)
diff --git a/arch/riscv/lib/memmove.S b/arch/riscv/lib/memmove.S
index cb3e2e7ef0ba..c51475e4f3ce 100644
--- a/arch/riscv/lib/memmove.S
+++ b/arch/riscv/lib/memmove.S
@@ -60,7 +60,7 @@ SYM_FUNC_START(__memmove)
*/
andi t0, a2, -(2 * SZREG)
beqz t0, .Lbyte_copy
-
+ j .Lbyte_copy
/*
* Now solve for t5 and t6.
*/
diff --git a/arch/riscv/lib/memset.S b/arch/riscv/lib/memset.S
index da23b8347e2d..a3cd79cb33b4 100644
--- a/arch/riscv/lib/memset.S
+++ b/arch/riscv/lib/memset.S
@@ -14,6 +14,7 @@ SYM_FUNC_START(__memset)
/* Defer to byte-oriented fill for small sizes */
sltiu a3, a2, 16
bnez a3, 4f
+ j 4f /* disabel optimised for now */
/*
* Round to nearest XLEN-aligned address
diff --git a/arch/riscv/lib/strlen.S b/arch/riscv/lib/strlen.S
index 962983b73251..bea650fd24af 100644
--- a/arch/riscv/lib/strlen.S
+++ b/arch/riscv/lib/strlen.S
@@ -8,7 +8,7 @@
/* int strlen(const char *s) */
SYM_FUNC_START(strlen)
- ALTERNATIVE("nop", "j strlen_zbb", 0, RISCV_ISA_EXT_ZBB, CONFIG_RISCV_ISA_ZBB)
+ /*ALTERNATIVE("nop", "j strlen_zbb", 0, RISCV_ISA_EXT_ZBB, CONFIG_RISCV_ISA_ZBB)*/
/*
* Returns
diff --git a/arch/riscv/lib/uaccess.S b/arch/riscv/lib/uaccess.S
index 6a9f116bb545..3d7da86277bb 100644
--- a/arch/riscv/lib/uaccess.S
+++ b/arch/riscv/lib/uaccess.S
@@ -46,7 +46,8 @@ SYM_FUNC_START(fallback_scalar_usercopy)
*/
li a3, 9*SZREG-1 /* size must >= (word_copy stride + SZREG-1) */
bltu a2, a3, .Lbyte_copy_tail
-
+ j .Lbyte_copy_tail
+
/*
* Copy first bytes until dst is aligned to word boundary.
* a0 - start of dst
@@ -73,7 +74,9 @@ SYM_FUNC_START(fallback_scalar_usercopy)
*/
/* a1 - start of src */
andi a3, a1, SZREG-1
- bnez a3, .Lshift_copy
+ /* bnez a3, .Lshift_copy */
+ /* for now, ignore shift copy until fixed */
+ bnez a3, .Lbyte_copy_tail
.Lword_copy:
/*
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 10/15] riscv: fixup use of natural endian on instructions
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (8 preceding siblings ...)
2024-12-20 15:57 ` [RFC 09/15] temp: remove various library optimisations Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 11/15] add todo on fpu Ben Dooks
` (5 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
The priveldged ISA spec says that all instructions should
be treated as little endian, so if we load them from memory
we should do le{16,32}_to_cpu on these and the reverse when
storing.
This fixes jump_label, bug and related functions for big endian
builds.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
arch/riscv/kernel/alternative.c | 10 +++++++++-
arch/riscv/kernel/cfi.c | 3 ++-
arch/riscv/kernel/jump_label.c | 3 ++-
arch/riscv/kernel/traps.c | 2 ++
arch/riscv/kernel/traps_misaligned.c | 3 +++
5 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/arch/riscv/kernel/alternative.c b/arch/riscv/kernel/alternative.c
index 0128b161bfda..a2c8f0a5bca9 100644
--- a/arch/riscv/kernel/alternative.c
+++ b/arch/riscv/kernel/alternative.c
@@ -62,11 +62,16 @@ static void riscv_fill_cpu_mfr_info(struct cpu_manufacturer_info_t *cpu_mfr_info
}
}
+static u32 get_u16(u16 *ptr)
+{
+ return le16_to_cpu(*ptr);
+}
+
static u32 riscv_instruction_at(void *p)
{
u16 *parcel = p;
- return (u32)parcel[0] | (u32)parcel[1] << 16;
+ return (u32)get_u16(parcel+0) | (u32)get_u16(parcel+1) << 16;
}
static void riscv_alternative_fix_auipc_jalr(void *ptr, u32 auipc_insn,
@@ -83,6 +88,8 @@ static void riscv_alternative_fix_auipc_jalr(void *ptr, u32 auipc_insn,
riscv_insn_insert_utype_itype_imm(&call[0], &call[1], imm);
/* patch the call place again */
+ call[0] = cpu_to_le32(call[0]);
+ call[1] = cpu_to_le32(call[1]);
patch_text_nosync(ptr, call, sizeof(u32) * 2);
}
@@ -98,6 +105,7 @@ static void riscv_alternative_fix_jal(void *ptr, u32 jal_insn, int patch_offset)
riscv_insn_insert_jtype_imm(&jal_insn, imm);
/* patch the call place again */
+ jal_insn = cpu_to_le32(jal_insn);
patch_text_nosync(ptr, &jal_insn, sizeof(u32));
}
diff --git a/arch/riscv/kernel/cfi.c b/arch/riscv/kernel/cfi.c
index 64bdd3e1ab8c..bd35ddbcbcee 100644
--- a/arch/riscv/kernel/cfi.c
+++ b/arch/riscv/kernel/cfi.c
@@ -37,15 +37,16 @@ static bool decode_cfi_insn(struct pt_regs *regs, unsigned long *target,
*/
if (get_kernel_nofault(insn, (void *)regs->epc - 4))
return false;
+ insn = le32_to_cpu(insn);
if (!riscv_insn_is_beq(insn))
return false;
-
*type = (u32)regs_ptr[RV_EXTRACT_RS1_REG(insn)];
if (get_kernel_nofault(insn, (void *)regs->epc) ||
get_kernel_nofault(insn, (void *)regs->epc + GET_INSN_LENGTH(insn)))
return false;
+ insn = le32_to_cpu(insn);
if (riscv_insn_is_jalr(insn))
rs1_num = RV_EXTRACT_RS1_REG(insn);
else if (riscv_insn_is_c_jalr(insn))
diff --git a/arch/riscv/kernel/jump_label.c b/arch/riscv/kernel/jump_label.c
index 11ad789c60c6..e8a9301ec0bf 100644
--- a/arch/riscv/kernel/jump_label.c
+++ b/arch/riscv/kernel/jump_label.c
@@ -19,7 +19,7 @@ bool arch_jump_label_transform_queue(struct jump_entry *entry,
enum jump_label_type type)
{
void *addr = (void *)jump_entry_code(entry);
- u32 insn;
+ __le32 insn;
if (type == JUMP_LABEL_JMP) {
long offset = jump_entry_target(entry) - jump_entry_code(entry);
@@ -36,6 +36,7 @@ bool arch_jump_label_transform_queue(struct jump_entry *entry,
insn = RISCV_INSN_NOP;
}
+ insn = cpu_to_le32(insn);
mutex_lock(&text_mutex);
patch_insn_write(addr, &insn, sizeof(insn));
mutex_unlock(&text_mutex);
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 51ebfd23e007..a475fd9310fd 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -253,6 +253,7 @@ static inline unsigned long get_break_insn_length(unsigned long pc)
if (get_kernel_nofault(insn, (bug_insn_t *)pc))
return 0;
+ insn = le32_to_cpu(insn);
return GET_INSN_LENGTH(insn);
}
@@ -399,6 +400,7 @@ int is_valid_bugaddr(unsigned long pc)
return 0;
if (get_kernel_nofault(insn, (bug_insn_t *)pc))
return 0;
+ insn = cpu_to_le32(insn);
if ((insn & __INSN_LENGTH_MASK) == __INSN_LENGTH_32)
return (insn == __BUG_INSN_32);
else
diff --git a/arch/riscv/kernel/traps_misaligned.c b/arch/riscv/kernel/traps_misaligned.c
index 1b9867136b61..21b2a4df185f 100644
--- a/arch/riscv/kernel/traps_misaligned.c
+++ b/arch/riscv/kernel/traps_misaligned.c
@@ -290,6 +290,7 @@ static inline int get_insn(struct pt_regs *regs, ulong epc, ulong *r_insn)
* below with the upper 16 bits half.
*/
insn &= GENMASK(15, 0);
+ insn = le16_to_cpu(insn);
if ((insn & __INSN_LENGTH_MASK) != __INSN_LENGTH_32) {
*r_insn = insn;
return 0;
@@ -297,12 +298,14 @@ static inline int get_insn(struct pt_regs *regs, ulong epc, ulong *r_insn)
epc += sizeof(u16);
if (__read_insn(regs, tmp, epc, u16))
return -EFAULT;
+ tmp = le16_to_cpu(tmp);
*r_insn = (tmp << 16) | insn;
return 0;
} else {
if (__read_insn(regs, insn, epc, u32))
return -EFAULT;
+ insn = le32_to_cpu(insn);
if ((insn & __INSN_LENGTH_MASK) == __INSN_LENGTH_32) {
*r_insn = insn;
return 0;
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 11/15] add todo on fpu
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (9 preceding siblings ...)
2024-12-20 15:57 ` [RFC 10/15] riscv: fixup use of natural endian on instructions Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 12/15] riscv: bpf: big endian fixes, updated BPF_ALU ops Ben Dooks
` (4 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
---
arch/riscv/kernel/traps_misaligned.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/riscv/kernel/traps_misaligned.c b/arch/riscv/kernel/traps_misaligned.c
index 21b2a4df185f..fdf12dc579d4 100644
--- a/arch/riscv/kernel/traps_misaligned.c
+++ b/arch/riscv/kernel/traps_misaligned.c
@@ -154,6 +154,7 @@
#define PRECISION_D 1
#ifdef CONFIG_FPU
+// todo - is fpu going to be big or little endian
#define FP_GET_RD(insn) (insn >> 7 & 0x1F)
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 12/15] riscv: bpf: big endian fixes, updated BPF_ALU ops
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (10 preceding siblings ...)
2024-12-20 15:57 ` [RFC 11/15] add todo on fpu Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:57 ` [RFC 13/15] riscv: probes: sort out endian-ness Ben Dooks
` (3 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
If running big endian then the instruction stream needs to
be written le16/le323 and the BPF BSWAP instrictions need
to correctly set the endian.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
arch/riscv/net/bpf_jit.h | 14 +++++++++-----
arch/riscv/net/bpf_jit_comp64.c | 29 +++++++++++++++++------------
2 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/arch/riscv/net/bpf_jit.h b/arch/riscv/net/bpf_jit.h
index 1d1c78d4cff1..eb2908cc42fd 100644
--- a/arch/riscv/net/bpf_jit.h
+++ b/arch/riscv/net/bpf_jit.h
@@ -28,6 +28,12 @@ static inline bool rvzbb_enabled(void)
return IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && riscv_has_extension_likely(RISCV_ISA_EXT_ZBB);
}
+static inline bool alu_end_should_swap(u32 code)
+{
+ u32 endian = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ? BPF_FROM_BE : BPF_FROM_LE;
+ return (code & BPF_FROM_BE) != endian;
+}
+
enum {
RV_REG_ZERO = 0, /* The constant value 0 */
RV_REG_RA = 1, /* Return address */
@@ -117,10 +123,8 @@ static inline void bpf_flush_icache(void *start, void *end)
/* Emit a 4-byte riscv instruction. */
static inline void emit(const u32 insn, struct rv_jit_context *ctx)
{
- if (ctx->insns) {
- ctx->insns[ctx->ninsns] = insn;
- ctx->insns[ctx->ninsns + 1] = (insn >> 16);
- }
+ if (ctx->insns)
+ put_unaligned_le32(insn, ctx->insns+ctx->ninsns);
ctx->ninsns += 2;
}
@@ -131,7 +135,7 @@ static inline void emitc(const u16 insn, struct rv_jit_context *ctx)
BUILD_BUG_ON(!rvc_enabled());
if (ctx->insns)
- ctx->insns[ctx->ninsns] = insn;
+ ctx->insns[ctx->ninsns] = cpu_to_le16(insn);
ctx->ninsns++;
}
diff --git a/arch/riscv/net/bpf_jit_comp64.c b/arch/riscv/net/bpf_jit_comp64.c
index 4cc631fa7039..05f5b1a88423 100644
--- a/arch/riscv/net/bpf_jit_comp64.c
+++ b/arch/riscv/net/bpf_jit_comp64.c
@@ -1273,20 +1273,25 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
/* dst = BSWAP##imm(dst) */
case BPF_ALU | BPF_END | BPF_FROM_LE:
- switch (imm) {
- case 16:
- emit_zexth(rd, rd, ctx);
- break;
- case 32:
- if (!aux->verifier_zext)
- emit_zextw(rd, rd, ctx);
- break;
- case 64:
- /* Do nothing */
- break;
+ case BPF_ALU | BPF_END | BPF_FROM_BE:
+ if (alu_end_should_swap(code)) {
+ emit_bswap(rd, imm, ctx);
+ } else {
+ switch (imm) {
+ case 16:
+ emit_zexth(rd, rd, ctx);
+ break;
+ case 32:
+ if (!aux->verifier_zext)
+ emit_zextw(rd, rd, ctx);
+ break;
+ case 64:
+ /* Do nothing */
+ break;
+ }
}
break;
- case BPF_ALU | BPF_END | BPF_FROM_BE:
+
case BPF_ALU64 | BPF_END | BPF_FROM_LE:
emit_bswap(rd, imm, ctx);
break;
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 13/15] riscv: probes: sort out endian-ness
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (11 preceding siblings ...)
2024-12-20 15:57 ` [RFC 12/15] riscv: bpf: big endian fixes, updated BPF_ALU ops Ben Dooks
@ 2024-12-20 15:57 ` Ben Dooks
2024-12-20 15:58 ` [RFC 14/15] riscv: ftrace big endian updates Ben Dooks
` (2 subsequent siblings)
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:57 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
Updated {k,u}probe code to deal with big endian mode where
the instruction stream is always in little endian.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
arch/riscv/kernel/probes/decode-insn.c | 2 +-
arch/riscv/kernel/probes/decode-insn.h | 5 +++++
arch/riscv/kernel/probes/kprobes.c | 30 ++++++++++++++++----------
arch/riscv/kernel/probes/uprobes.c | 10 ++++-----
4 files changed, 30 insertions(+), 17 deletions(-)
diff --git a/arch/riscv/kernel/probes/decode-insn.c b/arch/riscv/kernel/probes/decode-insn.c
index 65d9590bfb9f..5f30c10f7d8d 100644
--- a/arch/riscv/kernel/probes/decode-insn.c
+++ b/arch/riscv/kernel/probes/decode-insn.c
@@ -16,7 +16,7 @@
enum probe_insn __kprobes
riscv_probe_decode_insn(probe_opcode_t *addr, struct arch_probe_insn *api)
{
- probe_opcode_t insn = *addr;
+ probe_opcode_t insn = le32_to_cpu(*addr);
/*
* Reject instructions list:
diff --git a/arch/riscv/kernel/probes/decode-insn.h b/arch/riscv/kernel/probes/decode-insn.h
index 42269a7d676d..0515deb204b5 100644
--- a/arch/riscv/kernel/probes/decode-insn.h
+++ b/arch/riscv/kernel/probes/decode-insn.h
@@ -15,4 +15,9 @@ enum probe_insn {
enum probe_insn __kprobes
riscv_probe_decode_insn(probe_opcode_t *addr, struct arch_probe_insn *asi);
+static inline int read_insn_length(void *ptr)
+{
+ return GET_INSN_LENGTH(le16_to_cpu(*(__le16 *)ptr));
+}
+
#endif /* _RISCV_KERNEL_KPROBES_DECODE_INSN_H */
diff --git a/arch/riscv/kernel/probes/kprobes.c b/arch/riscv/kernel/probes/kprobes.c
index 474a65213657..aba684938284 100644
--- a/arch/riscv/kernel/probes/kprobes.c
+++ b/arch/riscv/kernel/probes/kprobes.c
@@ -24,13 +24,13 @@ post_kprobe_handler(struct kprobe *, struct kprobe_ctlblk *, struct pt_regs *);
static void __kprobes arch_prepare_ss_slot(struct kprobe *p)
{
- size_t len = GET_INSN_LENGTH(p->opcode);
- u32 insn = __BUG_INSN_32;
+ size_t len = read_insn_length(&p->opcode);
+ u32 insn = cpu_to_le32(__BUG_INSN_32);
p->ainsn.api.restore = (unsigned long)p->addr + len;
patch_text_nosync(p->ainsn.api.insn, &p->opcode, len);
- patch_text_nosync(p->ainsn.api.insn + len, &insn, GET_INSN_LENGTH(insn));
+ patch_text_nosync((void *)p->ainsn.api.insn + len, &insn, GET_INSN_LENGTH(__BUG_INSN_32));
}
static void __kprobes arch_prepare_simulate(struct kprobe *p)
@@ -58,7 +58,7 @@ static bool __kprobes arch_check_kprobe(struct kprobe *p)
if (tmp == addr)
return true;
- tmp += GET_INSN_LENGTH(*(u16 *)tmp);
+ tmp += read_insn_length((u16 *)tmp);
}
return false;
@@ -75,9 +75,9 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
return -EILSEQ;
/* copy instruction */
- p->opcode = (kprobe_opcode_t)(*insn++);
- if (GET_INSN_LENGTH(p->opcode) == 4)
- p->opcode |= (kprobe_opcode_t)(*insn) << 16;
+ *((u16 *)&p->opcode) = (*insn++);
+ if (read_insn_length(&p->opcode) == 4)
+ p->opcode = (kprobe_opcode_t)(*(u32 *)p->addr);
/* decode instruction */
switch (riscv_probe_decode_insn(p->addr, &p->ainsn.api)) {
@@ -107,16 +107,24 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
/* install breakpoint in text */
void __kprobes arch_arm_kprobe(struct kprobe *p)
{
- size_t len = GET_INSN_LENGTH(p->opcode);
- u32 insn = len == 4 ? __BUG_INSN_32 : __BUG_INSN_16;
+ size_t len = read_insn_length(&p->opcode);
+ u32 insn;
+
+ if (len == 4)
+ insn = cpu_to_le32(__BUG_INSN_32);
+ else {
+ insn = cpu_to_le16(__BUG_INSN_16);
+ insn |= cpu_to_le16(__BUG_INSN_16) << 16;
+ }
+ pr_info("%s: patching %px (%d bytes)\n", __func__, p->addr, (int)len);
patch_text(p->addr, &insn, len);
}
/* remove breakpoint from text */
void __kprobes arch_disarm_kprobe(struct kprobe *p)
{
- size_t len = GET_INSN_LENGTH(p->opcode);
+ size_t len = read_insn_length(&p->opcode);
patch_text(p->addr, &p->opcode, len);
}
@@ -336,7 +344,7 @@ kprobe_single_step_handler(struct pt_regs *regs)
struct kprobe *cur = kprobe_running();
if (cur && (kcb->kprobe_status & (KPROBE_HIT_SS | KPROBE_REENTER)) &&
- ((unsigned long)&cur->ainsn.api.insn[0] + GET_INSN_LENGTH(cur->opcode) == addr)) {
+ ((unsigned long)&cur->ainsn.api.insn[0] + read_insn_length(&cur->opcode) == addr)) {
kprobes_restore_local_irqflag(kcb, regs);
post_kprobe_handler(cur, kcb, regs);
return true;
diff --git a/arch/riscv/kernel/probes/uprobes.c b/arch/riscv/kernel/probes/uprobes.c
index 4b3dc8beaf77..e31c1dd337d5 100644
--- a/arch/riscv/kernel/probes/uprobes.c
+++ b/arch/riscv/kernel/probes/uprobes.c
@@ -12,9 +12,9 @@
bool is_swbp_insn(uprobe_opcode_t *insn)
{
#ifdef CONFIG_RISCV_ISA_C
- return (*insn & 0xffff) == UPROBE_SWBP_INSN;
+ return (*(u16 *)insn) == cpu_to_le16(UPROBE_SWBP_INSN);
#else
- return *insn == UPROBE_SWBP_INSN;
+ return *insn == cpu_to_le32(UPROBE_SWBP_INSN);
#endif
}
@@ -35,7 +35,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
opcode = *(probe_opcode_t *)(&auprobe->insn[0]);
- auprobe->insn_size = GET_INSN_LENGTH(opcode);
+ auprobe->insn_size = GET_INSN_LENGTH(le32_to_cpu(opcode));
switch (riscv_probe_decode_insn(&opcode, &auprobe->api)) {
case INSN_REJECTED:
@@ -172,8 +172,8 @@ void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,
/* Add ebreak behind opcode to simulate singlestep */
if (vaddr) {
- dst += GET_INSN_LENGTH(*(probe_opcode_t *)src);
- *(uprobe_opcode_t *)dst = __BUG_INSN_32;
+ dst += read_insn_length(src);
+ *(uprobe_opcode_t *)dst = cpu_to_le32(__BUG_INSN_32);
}
kunmap_atomic(kaddr);
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 14/15] riscv: ftrace big endian updates
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (12 preceding siblings ...)
2024-12-20 15:57 ` [RFC 13/15] riscv: probes: sort out endian-ness Ben Dooks
@ 2024-12-20 15:58 ` Ben Dooks
2024-12-20 15:58 ` [RFC 15/15] riscv: traps: make insn fetch common in unknown instruction Ben Dooks
2024-12-20 19:53 ` RFC: riscv64 big endian system attempt Olof Johansson
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:58 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
Make the ftrace code work with big endian by ensuring the
instruction stream is accessed little endian.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
arch/riscv/include/asm/ftrace.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/riscv/include/asm/ftrace.h b/arch/riscv/include/asm/ftrace.h
index 2cddd79ff21b..233428aeab1d 100644
--- a/arch/riscv/include/asm/ftrace.h
+++ b/arch/riscv/include/asm/ftrace.h
@@ -79,7 +79,7 @@ struct dyn_arch_ftrace {
#define AUIPC_RA (0x00000097)
#define JALR_T0 (0x000282e7)
#define AUIPC_T0 (0x00000297)
-#define NOP4 (0x00000013)
+#define NOP4 (le32_to_cpu(0x00000013))
#define to_jalr_t0(offset) \
(((offset & JALR_OFFSET_MASK) << JALR_SHIFT) | JALR_T0)
@@ -93,8 +93,8 @@ struct dyn_arch_ftrace {
do { \
unsigned int offset = \
(unsigned long) callee - (unsigned long) caller; \
- call[0] = to_auipc_t0(offset); \
- call[1] = to_jalr_t0(offset); \
+ call[0] = cpu_to_le32(to_auipc_t0(offset)); \
+ call[1] = cpu_to_le32(to_jalr_t0(offset)); \
} while (0)
#define to_jalr_ra(offset) \
@@ -109,8 +109,8 @@ do { \
do { \
unsigned int offset = \
(unsigned long) callee - (unsigned long) caller; \
- call[0] = to_auipc_ra(offset); \
- call[1] = to_jalr_ra(offset); \
+ call[0] = cpu_to_le32(to_auipc_ra(offset)); \
+ call[1] = cpu_to_le32(to_jalr_ra(offset)); \
} while (0)
/*
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [RFC 15/15] riscv: traps: make insn fetch common in unknown instruction
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (13 preceding siblings ...)
2024-12-20 15:58 ` [RFC 14/15] riscv: ftrace big endian updates Ben Dooks
@ 2024-12-20 15:58 ` Ben Dooks
2024-12-20 19:53 ` RFC: riscv64 big endian system attempt Olof Johansson
15 siblings, 0 replies; 18+ messages in thread
From: Ben Dooks @ 2024-12-20 15:58 UTC (permalink / raw)
To: felix.chong, lawrence.hunter, roan.richmond, linux-riscv; +Cc: Ben Dooks
Add the trapped instruction (insn) as the second argument to
riscv_v_first_use_handler() from the trap handler so when we
add more handlers we can do the fetch of the instruction just
once.
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
- fixed wording of patch from rfc
v2:
- fixed todo by going to illegal instruction error if get_user fails
- added pointer print for failed read
- fixed issues with rebasing onto main branch
v3:
- removed print from v2
---
arch/riscv/include/asm/vector.h | 5 +++--
arch/riscv/kernel/traps.c | 13 +++++++++++--
arch/riscv/kernel/vector.c | 11 +----------
3 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/arch/riscv/include/asm/vector.h b/arch/riscv/include/asm/vector.h
index be7d309cca8a..24f77a56ac57 100644
--- a/arch/riscv/include/asm/vector.h
+++ b/arch/riscv/include/asm/vector.h
@@ -21,7 +21,7 @@
extern unsigned long riscv_v_vsize;
int riscv_v_setup_vsize(void);
-bool riscv_v_first_use_handler(struct pt_regs *regs);
+bool riscv_v_first_use_handler(struct pt_regs *regs, u32 insn);
void kernel_vector_begin(void);
void kernel_vector_end(void);
void get_cpu_vector_context(void);
@@ -268,7 +268,8 @@ struct pt_regs;
static inline int riscv_v_setup_vsize(void) { return -EOPNOTSUPP; }
static __always_inline bool has_vector(void) { return false; }
-static inline bool riscv_v_first_use_handler(struct pt_regs *regs) { return false; }
+static __always_inline bool insn_is_vector(u32 insn_buf) { return false; }
+static inline bool riscv_v_first_use_handler(struct pt_regs *regs, u32 insn) { return false; }
static inline bool riscv_v_vstate_query(struct pt_regs *regs) { return false; }
static inline bool riscv_v_vstate_ctrl_user_allowed(void) { return false; }
#define riscv_v_vsize (0)
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index a475fd9310fd..5ef418b0b7b2 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -169,17 +169,26 @@ DO_ERROR_INFO(do_trap_insn_fault,
asmlinkage __visible __trap_section void do_trap_insn_illegal(struct pt_regs *regs)
{
- bool handled;
+ bool handled = false;
if (user_mode(regs)) {
+ u32 __user *epc = (u32 __user *)regs->epc;
+ u32 insn = (u32)regs->badaddr;
+
irqentry_enter_from_user_mode(regs);
local_irq_enable();
- handled = riscv_v_first_use_handler(regs);
+ if (!insn) {
+ if (__get_user(insn, epc))
+ goto no_insn;
+ }
+
+ handled = riscv_v_first_use_handler(regs, insn);
local_irq_disable();
+ no_insn:
if (!handled)
do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->epc,
"Oops - illegal instruction");
diff --git a/arch/riscv/kernel/vector.c b/arch/riscv/kernel/vector.c
index 682b3feee451..b852648cb8d5 100644
--- a/arch/riscv/kernel/vector.c
+++ b/arch/riscv/kernel/vector.c
@@ -168,11 +168,8 @@ bool riscv_v_vstate_ctrl_user_allowed(void)
}
EXPORT_SYMBOL_GPL(riscv_v_vstate_ctrl_user_allowed);
-bool riscv_v_first_use_handler(struct pt_regs *regs)
+bool riscv_v_first_use_handler(struct pt_regs *regs, u32 insn)
{
- u32 __user *epc = (u32 __user *)regs->epc;
- u32 insn = (u32)regs->badaddr;
-
if (!has_vector())
return false;
@@ -184,12 +181,6 @@ bool riscv_v_first_use_handler(struct pt_regs *regs)
if (riscv_v_vstate_query(regs))
return false;
- /* Get the instruction */
- if (!insn) {
- if (__get_user(insn, epc))
- return false;
- }
-
/* Filter out non-V instructions */
if (!insn_is_vector(insn))
return false;
--
2.37.2.352.g3c44437643
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: RFC: riscv64 big endian system attempt
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
` (14 preceding siblings ...)
2024-12-20 15:58 ` [RFC 15/15] riscv: traps: make insn fetch common in unknown instruction Ben Dooks
@ 2024-12-20 19:53 ` Olof Johansson
2025-01-09 17:46 ` Palmer Dabbelt
15 siblings, 1 reply; 18+ messages in thread
From: Olof Johansson @ 2024-12-20 19:53 UTC (permalink / raw)
To: Ben Dooks; +Cc: felix.chong, lawrence.hunter, roan.richmond, linux-riscv
On Fri, Dec 20, 2024 at 03:57:46PM +0000, Ben Dooks wrote:
> With the latest spec adding configurable endianness, we thought we
> should try putting together a proof of concept riscv64 big endian.
>
> The full information is documented on our gitlab[1] which includes
> source repositories, build information and project documentation.
>
> We have a minimal buildroot, qemu and kernel working on QEMU.
>
> As this is a work in progress any review or help is appreciated.
While this is neat, I wonder if there's any real point in picking this
up broadly and enabling it, with the associated overhead to keep it
maintained?
While big endian ppc64 will always be close to my heart, little endian
really has taken over the world by now, even on ppc64. It used to be
that networking was the area that BE was a (soft) requirement, but with
modern CPUs having advanced faster than memory latencies and speed, doing
endian conversion in software doesn't seem to be a big deal any more.
As far as I know, ARM platforms are in the same boat -- they did some
early enablement, driven by a couple of specific use cases that didn't
significantly grow and are used in very narrow environment and with very
limited userspace.
Is this a parallel situation to that, or are there reasons to support BE
more broadly? It seems like it'd mostly split efforts and add overhead
to make sure it's still supported, even if it's a fun project to prove
that it works.
-Olof
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: RFC: riscv64 big endian system attempt
2024-12-20 19:53 ` RFC: riscv64 big endian system attempt Olof Johansson
@ 2025-01-09 17:46 ` Palmer Dabbelt
0 siblings, 0 replies; 18+ messages in thread
From: Palmer Dabbelt @ 2025-01-09 17:46 UTC (permalink / raw)
To: Olof Johansson
Cc: ben.dooks, felix.chong, lawrence.hunter, roan.richmond,
linux-riscv
On Fri, 20 Dec 2024 11:53:47 PST (-0800), Olof Johansson wrote:
> On Fri, Dec 20, 2024 at 03:57:46PM +0000, Ben Dooks wrote:
>> With the latest spec adding configurable endianness, we thought we
>> should try putting together a proof of concept riscv64 big endian.
>>
>> The full information is documented on our gitlab[1] which includes
>> source repositories, build information and project documentation.
>>
>> We have a minimal buildroot, qemu and kernel working on QEMU.
>>
>> As this is a work in progress any review or help is appreciated.
>
> While this is neat, I wonder if there's any real point in picking this
> up broadly and enabling it, with the associated overhead to keep it
> maintained?
>
> While big endian ppc64 will always be close to my heart, little endian
> really has taken over the world by now, even on ppc64. It used to be
> that networking was the area that BE was a (soft) requirement, but with
> modern CPUs having advanced faster than memory latencies and speed, doing
> endian conversion in software doesn't seem to be a big deal any more.
>
> As far as I know, ARM platforms are in the same boat -- they did some
> early enablement, driven by a couple of specific use cases that didn't
> significantly grow and are used in very narrow environment and with very
> limited userspace.
>
> Is this a parallel situation to that, or are there reasons to support BE
> more broadly? It seems like it'd mostly split efforts and add overhead
> to make sure it's still supported, even if it's a fun project to prove
> that it works.
Ya, I think we'd need some real concrete use for this in order to want
to support it. Something like actual shipping hardware.
>
>
>
> -Olof
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2025-01-09 17:47 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-20 15:57 RFC: riscv64 big endian system attempt Ben Dooks
2024-12-20 15:57 ` [RFC 01/15] riscv: add initial kconfig and build flags for big-endian Ben Dooks
2024-12-20 15:57 ` [RFC 02/15] add __RISCVEB__ to byteorder.h Ben Dooks
2024-12-20 15:57 ` [RFC 03/15] riscv: disable vector if big-endian, gcc unsupported option Ben Dooks
2024-12-20 15:57 ` [RFC 04/15] riscv: word-at-atime: move to generic if we're big endian Ben Dooks
2024-12-20 15:57 ` [RFC 05/15] riscv: asm: use .insn for making custom instructioons Ben Dooks
2024-12-20 15:57 ` [RFC 06/15] intiial header work Ben Dooks
2024-12-20 15:57 ` [RFC 07/15] kconfig: remove CONFIG_COMAPT for big-endian (compat cods doesn't build atm) Ben Dooks
2024-12-20 15:57 ` [RFC 08/15] defconfig: add our build config Ben Dooks
2024-12-20 15:57 ` [RFC 09/15] temp: remove various library optimisations Ben Dooks
2024-12-20 15:57 ` [RFC 10/15] riscv: fixup use of natural endian on instructions Ben Dooks
2024-12-20 15:57 ` [RFC 11/15] add todo on fpu Ben Dooks
2024-12-20 15:57 ` [RFC 12/15] riscv: bpf: big endian fixes, updated BPF_ALU ops Ben Dooks
2024-12-20 15:57 ` [RFC 13/15] riscv: probes: sort out endian-ness Ben Dooks
2024-12-20 15:58 ` [RFC 14/15] riscv: ftrace big endian updates Ben Dooks
2024-12-20 15:58 ` [RFC 15/15] riscv: traps: make insn fetch common in unknown instruction Ben Dooks
2024-12-20 19:53 ` RFC: riscv64 big endian system attempt Olof Johansson
2025-01-09 17:46 ` Palmer Dabbelt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox