2024-05-07 01:42:49

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 0/8] riscv: Support compiling the kernel with extensions

The kernel currently has the restriction that it can only be compiled
with the extensions that are hardcoded in arch/risc/Makefile.

Any extension that is not listed in the Makefile can still be used by
explicitly writing the assembly and using alternative patching.

This series introduces Kconfig options that allow the kernel to be
compiled with additional extensions.

Signed-off-by: Charlie Jenkins <[email protected]>
---
Charlie Jenkins (8):
riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_C Kconfig option
riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_V Kconfig option
riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT Kconfig option
riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option
riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBB Kconfig option
riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBA Kconfig option
riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBC Kconfig option
riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBS Kconfig option

arch/riscv/Kconfig | 135 +-----------
arch/riscv/Kconfig.isa | 393 ++++++++++++++++++++++++++++++++++
arch/riscv/Makefile | 15 +-
arch/riscv/crypto/Kconfig | 14 +-
arch/riscv/include/asm/arch_hweight.h | 33 +--
arch/riscv/include/asm/checksum.h | 18 +-
arch/riscv/include/asm/pgtable.h | 3 +-
arch/riscv/include/asm/simd.h | 3 +
arch/riscv/include/asm/vector.h | 3 +-
arch/riscv/kernel/cpufeature.c | 3 +-
arch/riscv/kernel/head.S | 8 +-
arch/riscv/kernel/probes/uprobes.c | 2 +-
arch/riscv/kernel/process.c | 14 +-
arch/riscv/kernel/ptrace.c | 6 +
arch/riscv/lib/csum.c | 48 ++---
arch/riscv/lib/riscv_v_helpers.c | 1 -
arch/riscv/lib/strcmp.S | 4 +-
arch/riscv/lib/strlen.S | 4 +-
arch/riscv/lib/strncmp.S | 4 +-
arch/riscv/lib/uaccess_vector.S | 2 +
arch/riscv/lib/xor.S | 2 +
arch/riscv/net/bpf_jit.h | 8 +-
22 files changed, 511 insertions(+), 212 deletions(-)
---
base-commit: 2f47357557b7aa98d9d9002688aae480864ca3f6
change-id: 20240429-compile_kernel_with_extensions-92dd2403d325
--
- Charlie



2024-05-07 01:43:16

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 2/8] riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_V Kconfig option

Current versions of the kernel add "v" to the march and then immeidately
filter it out such that "v" is not passed to CFLAGS. Instead of doing
this filtering, code blocks in the kernel that want to use vector
assembly have been changed to locally enable vector (using ".option
arch, +v").

To support kernels that can run on hardware that may support vector, the
config option PLATFORM_MAY_SUPPORT_RISCV_ISA_V is added, and the
previous behavior of RISCV_ISA_V is retained with the option
CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V. When the hardware is assumed to
support vector, has_vector() unconditionally returns true and "v" is
added to the kernel march.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig | 54 -------------------------
arch/riscv/Kconfig.isa | 85 ++++++++++++++++++++++++++++++++++++++++
arch/riscv/Makefile | 7 +---
arch/riscv/crypto/Kconfig | 14 +++----
arch/riscv/include/asm/simd.h | 3 ++
arch/riscv/include/asm/vector.h | 3 +-
arch/riscv/kernel/cpufeature.c | 3 +-
arch/riscv/kernel/head.S | 8 +++-
arch/riscv/kernel/process.c | 14 +++----
arch/riscv/kernel/ptrace.c | 6 +++
arch/riscv/lib/riscv_v_helpers.c | 1 -
arch/riscv/lib/uaccess_vector.S | 2 +
arch/riscv/lib/xor.S | 2 +
13 files changed, 124 insertions(+), 78 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index c2a4f5364707..c2e9eded0a7d 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -520,60 +520,6 @@ config RISCV_ISA_SVPBMT

If you don't know what to do here, say Y.

-config TOOLCHAIN_HAS_V
- bool
- default y
- depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64iv)
- depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32iv)
- depends on LLD_VERSION >= 140000 || LD_VERSION >= 23800
- depends on AS_HAS_OPTION_ARCH
-
-config RISCV_ISA_V
- bool "Vector extension support"
- depends on TOOLCHAIN_HAS_V
- depends on FPU
- select DYNAMIC_SIGFRAME
- default y
- help
- Add support for the Vector extension when it is detected at boot.
- When this option is disabled, neither the kernel nor userspace may
- use vector procedures.
-
- If you don't know what to do here, say Y.
-
-config RISCV_ISA_V_DEFAULT_ENABLE
- bool "Enable userspace Vector by default"
- depends on RISCV_ISA_V
- default y
- help
- Say Y here if you want to enable Vector in userspace by default.
- Otherwise, userspace has to make explicit prctl() call to enable
- Vector, or enable it via the sysctl interface.
-
- If you don't know what to do here, say Y.
-
-config RISCV_ISA_V_UCOPY_THRESHOLD
- int "Threshold size for vectorized user copies"
- depends on RISCV_ISA_V
- default 768
- help
- Prefer using vectorized copy_to_user()/copy_from_user() when the
- workload size exceeds this value.
-
-config RISCV_ISA_V_PREEMPTIVE
- bool "Run kernel-mode Vector with kernel preemption"
- depends on PREEMPTION
- depends on RISCV_ISA_V
- default y
- help
- Usually, in-kernel SIMD routines are run with preemption disabled.
- Functions which envoke long running SIMD thus must yield core's
- vector unit to prevent blocking other tasks for too long.
-
- This config allows kernel to run SIMD without explicitly disable
- preemption. Enabling this config will result in higher memory
- consumption due to the allocation of per-task's kernel Vector context.
-
config TOOLCHAIN_HAS_ZBB
bool
default y
diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index 08b7af5aabb0..0663c98b5b17 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -39,3 +39,88 @@ config PLATFORM_SUPPORTS_RISCV_ISA_C
If you don't know what to do here, say Y.

endchoice
+
+config TOOLCHAIN_HAS_V
+ bool
+ default y
+ depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64iv)
+ depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32iv)
+ depends on LLD_VERSION >= 140000 || LD_VERSION >= 23800
+ depends on AS_HAS_OPTION_ARCH
+
+config RISCV_ISA_V
+ bool
+
+choice
+ prompt "Vector extension support"
+ default PLATFORM_MAY_SUPPORT_RISCV_ISA_V
+ help
+ This selects the level of support for vector instructions to be
+ built into the Linux Kernel. This does not impact whether vector
+ instructions are allowed to be emitted by user-space code.
+
+config PROHIBIT_RISCV_ISA_V
+ bool "Prohibit vector instructions"
+ depends on NONPORTABLE
+ help
+ Regardless of if the platform supports vector instructions,
+ prohibit the kernel from emitting vector instructions.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_V
+ bool "Allow vector instruction sequences if supported"
+ depends on TOOLCHAIN_HAS_V
+ depends on FPU
+ select DYNAMIC_SIGFRAME
+ select RISCV_ISA_V
+ help
+ Only allow vector instructions to be emitted if "V" is present in
+ the device tree or ACPI table. No vector instructions will be
+ emitted if the platform does not support them.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_V
+ bool "Emit vector instructions when building Linux"
+ depends on TOOLCHAIN_HAS_V
+ depends on FPU
+ depends on NONPORTABLE
+ select DYNAMIC_SIGFRAME
+ select RISCV_ISA_V
+ help
+ Adds "V" to the ISA subsets that the toolchain is allowed to emit
+ when building Linux, which results in vector instructions in the
+ Linux binary. This option produces a kernel that will not run on
+ systems that do not support vector instructions.
+
+endchoice
+
+config RISCV_ISA_V_DEFAULT_ENABLE
+ bool "Enable userspace Vector by default"
+ depends on RISCV_ISA_V
+ default y
+ help
+ Say Y here if you want to enable Vector in userspace by default.
+ Otherwise, userspace has to make explicit prctl() call to enable
+ Vector, or enable it via the sysctl interface.
+
+ If you don't know what to do here, say Y.
+
+config RISCV_ISA_V_UCOPY_THRESHOLD
+ int "Threshold size for vectorized user copies"
+ depends on RISCV_ISA_V
+ default 768
+ help
+ Prefer using vectorized copy_to_user()/copy_from_user() when the
+ workload size exceeds this value.
+
+config RISCV_ISA_V_PREEMPTIVE
+ bool "Run kernel-mode Vector with kernel preemption"
+ depends on PREEMPTION
+ depends on RISCV_ISA_V
+ default y
+ help
+ Usually, in-kernel SIMD routines are run with preemption disabled.
+ Functions which envoke long running SIMD thus must yield core's
+ vector unit to prevent blocking other tasks for too long.
+
+ This config allows kernel to run SIMD without explicitly disable
+ preemption. Enabling this config will result in higher memory
+ consumption due to the allocation of per-task's kernel Vector context.
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index e1be36004097..f2120db6ed92 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -66,7 +66,7 @@ riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima
riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C) := $(riscv-march-y)c
-riscv-march-$(CONFIG_RISCV_ISA_V) := $(riscv-march-y)v
+riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V) := $(riscv-march-y)v

ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
KBUILD_CFLAGS += -Wa,-misa-spec=2.2
@@ -78,10 +78,7 @@ endif
# Check if the toolchain supports Zihintpause extension
riscv-march-$(CONFIG_TOOLCHAIN_HAS_ZIHINTPAUSE) := $(riscv-march-y)_zihintpause

-# Remove F,D,V from isa string for all. Keep extensions between "fd" and "v" by
-# matching non-v and non-multi-letter extensions out with the filter ([^v_]*)
-KBUILD_CFLAGS += -march=$(shell echo $(riscv-march-y) | sed -E 's/(rv32ima|rv64ima)fd([^v_]*)v?/\1\2/')
-
+KBUILD_CFLAGS += -march=$(subst fd,,$(riscv-march-y))
KBUILD_AFLAGS += -march=$(riscv-march-y)

KBUILD_CFLAGS += -mno-save-restore
diff --git a/arch/riscv/crypto/Kconfig b/arch/riscv/crypto/Kconfig
index ad58dad9a580..5f7ea675a8cf 100644
--- a/arch/riscv/crypto/Kconfig
+++ b/arch/riscv/crypto/Kconfig
@@ -4,7 +4,7 @@ menu "Accelerated Cryptographic Algorithms for CPU (riscv)"

config CRYPTO_AES_RISCV64
tristate "Ciphers: AES, modes: ECB, CBC, CTS, CTR, XTS"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_ALGAPI
select CRYPTO_LIB_AES
select CRYPTO_SKCIPHER
@@ -20,7 +20,7 @@ config CRYPTO_AES_RISCV64

config CRYPTO_CHACHA_RISCV64
tristate "Ciphers: ChaCha"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_SKCIPHER
select CRYPTO_LIB_CHACHA_GENERIC
help
@@ -31,7 +31,7 @@ config CRYPTO_CHACHA_RISCV64

config CRYPTO_GHASH_RISCV64
tristate "Hash functions: GHASH"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_GCM
help
GCM GHASH function (NIST SP 800-38D)
@@ -41,7 +41,7 @@ config CRYPTO_GHASH_RISCV64

config CRYPTO_SHA256_RISCV64
tristate "Hash functions: SHA-224 and SHA-256"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_SHA256
help
SHA-224 and SHA-256 secure hash algorithm (FIPS 180)
@@ -52,7 +52,7 @@ config CRYPTO_SHA256_RISCV64

config CRYPTO_SHA512_RISCV64
tristate "Hash functions: SHA-384 and SHA-512"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_SHA512
help
SHA-384 and SHA-512 secure hash algorithm (FIPS 180)
@@ -63,7 +63,7 @@ config CRYPTO_SHA512_RISCV64

config CRYPTO_SM3_RISCV64
tristate "Hash functions: SM3 (ShangMi 3)"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_HASH
select CRYPTO_SM3
help
@@ -75,7 +75,7 @@ config CRYPTO_SM3_RISCV64

config CRYPTO_SM4_RISCV64
tristate "Ciphers: SM4 (ShangMi 4)"
- depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
+ depends on 64BIT && PLATFORM_SUPPORTS_RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
select CRYPTO_ALGAPI
select CRYPTO_SM4
help
diff --git a/arch/riscv/include/asm/simd.h b/arch/riscv/include/asm/simd.h
index adb50f3ec205..81508325fd51 100644
--- a/arch/riscv/include/asm/simd.h
+++ b/arch/riscv/include/asm/simd.h
@@ -26,6 +26,9 @@
*/
static __must_check inline bool may_use_simd(void)
{
+ if (!has_vector())
+ return false;
+
/*
* RISCV_KERNEL_MODE_V is only set while preemption is disabled,
* and is clear whenever preemption is enabled.
diff --git a/arch/riscv/include/asm/vector.h b/arch/riscv/include/asm/vector.h
index 731dcd0ed4de..a08c4bf92ecd 100644
--- a/arch/riscv/include/asm/vector.h
+++ b/arch/riscv/include/asm/vector.h
@@ -37,7 +37,8 @@ static inline u32 riscv_v_flags(void)

static __always_inline bool has_vector(void)
{
- return riscv_has_extension_unlikely(RISCV_ISA_EXT_v);
+ return IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V) ||
+ riscv_has_extension_likely(RISCV_ISA_EXT_v);
}

static inline void __riscv_v_vstate_clean(struct pt_regs *regs)
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
index 3ed2359eae35..7cb365714855 100644
--- a/arch/riscv/kernel/cpufeature.c
+++ b/arch/riscv/kernel/cpufeature.c
@@ -683,7 +683,6 @@ void __init riscv_fill_hwcap(void)
}

if (elf_hwcap & COMPAT_HWCAP_ISA_V) {
- riscv_v_setup_vsize();
/*
* ISA string in device tree might have 'v' flag, but
* CONFIG_RISCV_ISA_V is disabled in kernel.
@@ -691,6 +690,8 @@ void __init riscv_fill_hwcap(void)
*/
if (!IS_ENABLED(CONFIG_RISCV_ISA_V))
elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
+ else
+ riscv_v_setup_vsize();
}

memset(print_str, 0, sizeof(print_str));
diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S
index 4236a69c35cb..b027be82bbb3 100644
--- a/arch/riscv/kernel/head.S
+++ b/arch/riscv/kernel/head.S
@@ -428,17 +428,20 @@ SYM_CODE_START_LOCAL(reset_regs)
.Lreset_regs_done_fpu:
#endif /* CONFIG_FPU */

-#ifdef CONFIG_RISCV_ISA_V
+#if defined(CONFIG_PLATFORM_MAY_SUPPORT_RISCV_ISA_V)
csrr t0, CSR_MISA
li t1, COMPAT_HWCAP_ISA_V
and t0, t0, t1
beqz t0, .Lreset_regs_done_vector
-
+#endif
+#ifdef CONFIG_RISCV_ISA_V
/*
* Clear vector registers and reset vcsr
* VLMAX has a defined value, VLEN is a constant,
* and this form of vsetvli is defined to set vl to VLMAX.
*/
+ .option push
+ .option arch, +v
li t1, SR_VS
csrs CSR_STATUS, t1
csrs CSR_VCSR, x0
@@ -447,6 +450,7 @@ SYM_CODE_START_LOCAL(reset_regs)
vmv.v.i v8, 0
vmv.v.i v16, 0
vmv.v.i v24, 0
+ .option pop
/* note that the caller must clear SR_VS */
.Lreset_regs_done_vector:
#endif /* CONFIG_RISCV_ISA_V */
diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
index e4bc61c4e58a..af10715a63f7 100644
--- a/arch/riscv/kernel/process.c
+++ b/arch/riscv/kernel/process.c
@@ -163,14 +163,14 @@ void flush_thread(void)
fstate_off(current, task_pt_regs(current));
memset(&current->thread.fstate, 0, sizeof(current->thread.fstate));
#endif
-#ifdef CONFIG_RISCV_ISA_V
/* Reset vector state */
- riscv_v_vstate_ctrl_init(current);
- riscv_v_vstate_off(task_pt_regs(current));
- kfree(current->thread.vstate.datap);
- memset(&current->thread.vstate, 0, sizeof(struct __riscv_v_ext_state));
- clear_tsk_thread_flag(current, TIF_RISCV_V_DEFER_RESTORE);
-#endif
+ if (has_vector()) {
+ riscv_v_vstate_ctrl_init(current);
+ riscv_v_vstate_off(task_pt_regs(current));
+ kfree(current->thread.vstate.datap);
+ memset(&current->thread.vstate, 0, sizeof(struct __riscv_v_ext_state));
+ clear_tsk_thread_flag(current, TIF_RISCV_V_DEFER_RESTORE);
+ }
}

void arch_release_task_struct(struct task_struct *tsk)
diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c
index 92731ff8c79a..bdfaed2a4023 100644
--- a/arch/riscv/kernel/ptrace.c
+++ b/arch/riscv/kernel/ptrace.c
@@ -92,6 +92,9 @@ static int riscv_vr_get(struct task_struct *target,
struct __riscv_v_ext_state *vstate = &target->thread.vstate;
struct __riscv_v_regset_state ptrace_vstate;

+ if (!has_vector())
+ return 0;
+
if (!riscv_v_vstate_query(task_pt_regs(target)))
return -EINVAL;

@@ -127,6 +130,9 @@ static int riscv_vr_set(struct task_struct *target,
struct __riscv_v_ext_state *vstate = &target->thread.vstate;
struct __riscv_v_regset_state ptrace_vstate;

+ if (!has_vector())
+ return 0;
+
if (!riscv_v_vstate_query(task_pt_regs(target)))
return -EINVAL;

diff --git a/arch/riscv/lib/riscv_v_helpers.c b/arch/riscv/lib/riscv_v_helpers.c
index be38a93cedae..661c77fdd7f7 100644
--- a/arch/riscv/lib/riscv_v_helpers.c
+++ b/arch/riscv/lib/riscv_v_helpers.c
@@ -21,7 +21,6 @@ asmlinkage int enter_vector_usercopy(void *dst, void *src, size_t n)
{
size_t remain, copied;

- /* skip has_vector() check because it has been done by the asm */
if (!may_use_simd())
goto fallback;

diff --git a/arch/riscv/lib/uaccess_vector.S b/arch/riscv/lib/uaccess_vector.S
index 7c45f26de4f7..4de37a3a2163 100644
--- a/arch/riscv/lib/uaccess_vector.S
+++ b/arch/riscv/lib/uaccess_vector.S
@@ -5,6 +5,8 @@
#include <asm/asm-extable.h>
#include <asm/csr.h>

+.option arch, +v
+
#define pDst a0
#define pSrc a1
#define iNum a2
diff --git a/arch/riscv/lib/xor.S b/arch/riscv/lib/xor.S
index b28f2430e52f..9a3e2c19efc9 100644
--- a/arch/riscv/lib/xor.S
+++ b/arch/riscv/lib/xor.S
@@ -6,6 +6,8 @@
#include <linux/export.h>
#include <asm/asm.h>

+.option arch, +v
+
SYM_FUNC_START(xor_regs_2_)
vsetvli a3, a0, e8, m8, ta, ma
vle8.v v0, (a1)

--
2.44.0


2024-05-07 01:43:20

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 3/8] riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT Kconfig option

The previously supported config RISCV_ISA_SVNAPOT has been renamed to
PLATFORM_MAY_SUPPORT_RISCV_ISA_SVNAPOT and the config
PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT has been introduced to compile a
kernel that will use svnapot by default. Both of these configs select a
hidden CONFIG_RISCV_ISA_SVNAPOT that can be used to determin if SVNAPOT
is allowed to be used.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig | 21 +------------------
arch/riscv/Kconfig.isa | 44 ++++++++++++++++++++++++++++++++++++++++
arch/riscv/include/asm/pgtable.h | 3 ++-
3 files changed, 47 insertions(+), 21 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index c2e9eded0a7d..9c3a4347953b 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -63,7 +63,7 @@ config RISCV
select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH if SMP && MMU
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
select ARCH_WANT_FRAME_POINTERS
- select ARCH_WANT_GENERAL_HUGETLB if !RISCV_ISA_SVNAPOT
+ select ARCH_WANT_GENERAL_HUGETLB if !PLATFORM_MAY_SUPPORT_RISCV_ISA_SVNAPOT
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
select ARCH_WANT_LD_ORPHAN_WARN if !XIP_KERNEL
select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP
@@ -484,25 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
help
Allows early patching of the kernel for special errata

-config RISCV_ISA_SVNAPOT
- bool "Svnapot extension support for supervisor mode NAPOT pages"
- depends on 64BIT && MMU
- depends on RISCV_ALTERNATIVE
- default y
- help
- Add support for the Svnapot ISA-extension in the kernel when it
- is detected at boot.
-
- The Svnapot extension is used to mark contiguous PTEs as a range
- of contiguous virtual-to-physical translations for a naturally
- aligned power-of-2 (NAPOT) granularity larger than the base 4KB page
- size. When HUGETLBFS is also selected this option unconditionally
- allocates some memory for each NAPOT page size supported by the kernel.
- When optimizing for low memory consumption and for platforms without
- the Svnapot extension, it may be better to say N here.
-
- If you don't know what to do here, say Y.
-
config RISCV_ISA_SVPBMT
bool "Svpbmt extension support for supervisor mode page-based memory types"
depends on 64BIT && MMU
diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index 0663c98b5b17..37585bcd763e 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -124,3 +124,47 @@ config RISCV_ISA_V_PREEMPTIVE
This config allows kernel to run SIMD without explicitly disable
preemption. Enabling this config will result in higher memory
consumption due to the allocation of per-task's kernel Vector context.
+
+config RISCV_ISA_SVNAPOT
+ bool
+
+choice
+ prompt "Svnapot extension support for supervisor mode NAPOT pages"
+ default PLATFORM_MAY_SUPPORT_RISCV_ISA_SVNAPOT
+ help
+ This selects the level of support for Svnapot in the Linux Kernel.
+
+ The Svnapot extension is used to mark contiguous PTEs as a range
+ of contiguous virtual-to-physical translations for a naturally
+ aligned power-of-2 (NAPOT) granularity larger than the base 4KB page
+ size. When HUGETLBFS is also selected this option unconditionally
+ allocates some memory for each NAPOT page size supported by the kernel.
+ When optimizing for low memory consumption and for platforms without
+ the Svnapot extension, it may be better to prohibit Svnapot.
+
+config PROHIBIT_RISCV_ISA_SVNAPOT
+ bool "Prohibit Svnapot extension"
+ help
+ Regardless of if the platform supports Svnapot, prohibit the kernel
+ from using Svnapot.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_SVNAPOT
+ bool "Allow Svnapot extension if supported"
+ depends on 64BIT && MMU
+ depends on RISCV_ALTERNATIVE
+ select RISCV_ISA_SVNAPOT
+ help
+ Add support for the Svnapot ISA-extension in the kernel when it
+ is detected at boot.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT
+ bool "Emit Svnapot mappings when building Linux"
+ depends on 64BIT && MMU
+ depends on NONPORTABLE
+ select RISCV_ISA_SVNAPOT
+ help
+ Compile a kernel that assumes that the platform supports Svnapot.
+ This option produces a kernel that will not run on systems that do
+ not support Svnapot.
+
+endchoice
diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h
index 6afd6bb4882e..432be9691b78 100644
--- a/arch/riscv/include/asm/pgtable.h
+++ b/arch/riscv/include/asm/pgtable.h
@@ -289,7 +289,8 @@ static inline pte_t pud_pte(pud_t pud)

static __always_inline bool has_svnapot(void)
{
- return riscv_has_extension_likely(RISCV_ISA_EXT_SVNAPOT);
+ return IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT) ||
+ riscv_has_extension_likely(RISCV_ISA_EXT_SVNAPOT);
}

static inline unsigned long pte_napot(pte_t pte)

--
2.44.0


2024-05-07 01:43:32

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 4/8] riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option

Svpbmt would not benefit from having PLATFORM_SUPPORTS_RISCV_ISA_SVPBMT
so just rename RISCV_ISA_SVPBMT to PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT
and move the definition to Kconfig.isa.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig | 17 -----------------
arch/riscv/Kconfig.isa | 17 +++++++++++++++++
2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 9c3a4347953b..22303a3ab59e 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -484,23 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
help
Allows early patching of the kernel for special errata

-config RISCV_ISA_SVPBMT
- bool "Svpbmt extension support for supervisor mode page-based memory types"
- depends on 64BIT && MMU
- depends on RISCV_ALTERNATIVE
- default y
- help
- Add support for the Svpbmt ISA-extension (Supervisor-mode:
- page-based memory types) in the kernel when it is detected at boot.
-
- The memory type for a page contains a combination of attributes
- that indicate the cacheability, idempotency, and ordering
- properties for access to that page.
-
- The Svpbmt extension is only available on 64-bit cpus.
-
- If you don't know what to do here, say Y.
-
config TOOLCHAIN_HAS_ZBB
bool
default y
diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index 37585bcd763e..50e217dc5719 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -168,3 +168,20 @@ config PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT
not support Svnapot.

endchoice
+
+config RISCV_ISA_SVPBMT
+ bool "Svpbmt extension support for supervisor mode page-based memory types"
+ depends on 64BIT && MMU
+ depends on RISCV_ALTERNATIVE
+ default y
+ help
+ Add support for the Svpbmt ISA-extension (Supervisor-mode:
+ page-based memory types) in the kernel when it is detected at boot.
+
+ The memory type for a page contains a combination of attributes
+ that indicate the cacheability, idempotency, and ordering
+ properties for access to that page.
+
+ The Svpbmt extension is only available on 64-bit cpus.
+
+ If you don't know what to do here, say Y.

--
2.44.0


2024-05-07 01:43:54

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 1/8] riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_C Kconfig option

Introduce a "Kernel ISA" menu and migrate the compressed instruction
support options into a new file Kconfig.isa. Add a new option
"PLATFORM_MAY_SUPPORT_RISCV_ISA_C" that can be used to conditionally
emit C extensions if the hardware supports it.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig | 19 +++++++-----------
arch/riscv/Kconfig.isa | 41 ++++++++++++++++++++++++++++++++++++++
arch/riscv/Makefile | 4 ++--
arch/riscv/kernel/probes/uprobes.c | 2 +-
arch/riscv/net/bpf_jit.h | 4 +++-
5 files changed, 54 insertions(+), 16 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index c8bdfd33abf4..c2a4f5364707 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -369,6 +369,12 @@ config ARCH_RV64I

endchoice

+menu "Kernel ISA"
+
+source "arch/riscv/Kconfig.isa"
+
+endmenu
+
# We must be able to map all physical memory into the kernel, but the compiler
# is still a bit more efficient when generating code if it's setup in a manner
# such that it can only map 2GiB of memory.
@@ -478,17 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
help
Allows early patching of the kernel for special errata

-config RISCV_ISA_C
- bool "Emit compressed instructions when building Linux"
- default y
- help
- Adds "C" to the ISA subsets that the toolchain is allowed to emit
- when building Linux, which results in compressed instructions in the
- Linux binary. This option produces a kernel that will not run on
- systems that do not support compressed instructions.
-
- If you don't know what to do here, say Y.
-
config RISCV_ISA_SVNAPOT
bool "Svnapot extension support for supervisor mode NAPOT pages"
depends on 64BIT && MMU
@@ -937,6 +932,7 @@ config EFI
bool "UEFI runtime support"
depends on OF && !XIP_KERNEL
depends on MMU
+ depends on PLATFORM_SUPPORTS_RISCV_ISA_C
default y
select ARCH_SUPPORTS_ACPI if 64BIT
select EFI_GENERIC_STUB
@@ -944,7 +940,6 @@ config EFI
select EFI_RUNTIME_WRAPPERS
select EFI_STUB
select LIBFDT
- select RISCV_ISA_C
select UCS2_STRING
help
This option provides support for runtime services provided
diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
new file mode 100644
index 000000000000..08b7af5aabb0
--- /dev/null
+++ b/arch/riscv/Kconfig.isa
@@ -0,0 +1,41 @@
+config RISCV_ISA_C
+ bool
+
+choice
+ prompt "Compressed instruction support"
+ default PLATFORM_SUPPORTS_RISCV_ISA_C
+ help
+ This selects the level of support for compressed instructions to be
+ built into the Linux Kernel. This does not impact whether compressed
+ instructions are allowed to be emitted by user-space code.
+
+config PROHIBIT_RISCV_ISA_C
+ bool "Prohibit compressed instructions"
+ depends on NONPORTABLE
+ help
+ Regardless of if the platform supports compressed instructions,
+ prohibit the kernel from emitting compressed instructions.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_C
+ bool "Allow compressed instructions sequences if supported"
+ depends on FPU
+ depends on NONPORTABLE
+ select RISCV_ISA_C
+ help
+ Only allow compressed instructions to be emitted if "C" is present in
+ the device tree or ACPI table. No compressed instructions will be
+ emitted if the platform does not support them.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_C
+ bool "Emit compressed instructions when building Linux"
+ depends on FPU
+ select RISCV_ISA_C
+ help
+ Adds "C" to the ISA subsets that the toolchain is allowed to emit
+ when building Linux, which results in compressed instructions in the
+ Linux binary. This option produces a kernel that will not run on
+ systems that do not support compressed instructions.
+
+ If you don't know what to do here, say Y.
+
+endchoice
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 5b3115a19852..e1be36004097 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -14,7 +14,7 @@ endif
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
LDFLAGS_vmlinux += --no-relax
KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
-ifeq ($(CONFIG_RISCV_ISA_C),y)
+ifeq ($(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C),y)
CC_FLAGS_FTRACE := -fpatchable-function-entry=4
else
CC_FLAGS_FTRACE := -fpatchable-function-entry=2
@@ -65,7 +65,7 @@ endif
riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima
riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
-riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c
+riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C) := $(riscv-march-y)c
riscv-march-$(CONFIG_RISCV_ISA_V) := $(riscv-march-y)v

ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
diff --git a/arch/riscv/kernel/probes/uprobes.c b/arch/riscv/kernel/probes/uprobes.c
index 4b3dc8beaf77..a468689a6f6d 100644
--- a/arch/riscv/kernel/probes/uprobes.c
+++ b/arch/riscv/kernel/probes/uprobes.c
@@ -11,7 +11,7 @@

bool is_swbp_insn(uprobe_opcode_t *insn)
{
-#ifdef CONFIG_RISCV_ISA_C
+#ifdef CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C
return (*insn & 0xffff) == UPROBE_SWBP_INSN;
#else
return *insn == UPROBE_SWBP_INSN;
diff --git a/arch/riscv/net/bpf_jit.h b/arch/riscv/net/bpf_jit.h
index f4b6b3b9edda..259294bdbc3a 100644
--- a/arch/riscv/net/bpf_jit.h
+++ b/arch/riscv/net/bpf_jit.h
@@ -15,7 +15,9 @@

static inline bool rvc_enabled(void)
{
- return IS_ENABLED(CONFIG_RISCV_ISA_C);
+ return IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C) ||
+ (IS_ENABLED(CONFIG_PLATFORM_MAY_SUPPORT_RISCV_ISA_C) &&
+ riscv_has_extension_likely(RISCV_ISA_EXT_c));
}

static inline bool rvzbb_enabled(void)

--
2.44.0


2024-05-07 01:44:00

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 5/8] riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBB Kconfig option

Zbb can optimize kernel instruction sequences. Add a config option
PLATFORM_SUPPORTS_RISCV_ISA_ZBB that allows arbitrary Zbb instruction
sequences to be emitted by the compiler. This assumption also allows the
alternatives to become evaluated at compile time for Zbb.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig | 24 ----------------
arch/riscv/Kconfig.isa | 54 ++++++++++++++++++++++++++++++++++-
arch/riscv/Makefile | 1 +
arch/riscv/include/asm/arch_hweight.h | 33 ++++++++++-----------
arch/riscv/include/asm/checksum.h | 18 ++++++------
arch/riscv/lib/csum.c | 48 +++++++++++++++----------------
arch/riscv/lib/strcmp.S | 4 +--
arch/riscv/lib/strlen.S | 4 +--
arch/riscv/lib/strncmp.S | 4 +--
arch/riscv/net/bpf_jit.h | 4 ++-
10 files changed, 113 insertions(+), 81 deletions(-)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 22303a3ab59e..685092045447 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -484,14 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
help
Allows early patching of the kernel for special errata

-config TOOLCHAIN_HAS_ZBB
- bool
- default y
- depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64ima_zbb)
- depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zbb)
- depends on LLD_VERSION >= 150000 || LD_VERSION >= 23900
- depends on AS_HAS_OPTION_ARCH
-
# This symbol indicates that the toolchain supports all v1.0 vector crypto
# extensions, including Zvk*, Zvbb, and Zvbc. LLVM added all of these at once.
# binutils added all except Zvkb, then added Zvkb. So we just check for Zvkb.
@@ -499,22 +491,6 @@ config TOOLCHAIN_HAS_VECTOR_CRYPTO
def_bool $(as-instr, .option arch$(comma) +v$(comma) +zvkb)
depends on AS_HAS_OPTION_ARCH

-config RISCV_ISA_ZBB
- bool "Zbb extension support for bit manipulation instructions"
- depends on TOOLCHAIN_HAS_ZBB
- depends on MMU
- depends on RISCV_ALTERNATIVE
- default y
- help
- Add support for enabling optimisations in the kernel when the
- Zbb extension is detected at boot.
-
- The Zbb extension provides instructions to accelerate a number
- of bit-specific operations (count bit population, sign extending,
- bitrotation, etc).
-
- If you don't know what to do here, say Y.
-
config RISCV_ISA_ZICBOM
bool "Zicbom extension support for non-coherent DMA operation"
depends on MMU
diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index 50e217dc5719..49bed8c75263 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -169,7 +169,7 @@ config PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT

endchoice

-config RISCV_ISA_SVPBMT
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT
bool "Svpbmt extension support for supervisor mode page-based memory types"
depends on 64BIT && MMU
depends on RISCV_ALTERNATIVE
@@ -185,3 +185,55 @@ config RISCV_ISA_SVPBMT
The Svpbmt extension is only available on 64-bit cpus.

If you don't know what to do here, say Y.
+
+config TOOLCHAIN_HAS_ZBB
+ bool
+ default y
+ depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64ima_zbb)
+ depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zbb)
+ depends on LLD_VERSION >= 150000 || LD_VERSION >= 23900
+ depends on AS_HAS_OPTION_ARCH
+
+config RISCV_ISA_ZBB
+ bool
+
+choice
+ prompt "Zbb extension for bit manipulation instructions support"
+ default PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBB
+ help
+ This selects the level of support for Zbb instructions to be
+ built into the Linux Kernel. This does not impact whether Zbb
+ instructions are allowed to be emitted by user-space code.
+
+ The Zbb extension provides instructions to accelerate a number
+ of bit-specific operations (count bit population, sign extending,
+ bitrotation, etc).
+
+config PROHIBIT_RISCV_ISA_ZBB
+ bool "Prohibit Zbb instruction sequences"
+ depends on NONPORTABLE
+ help
+ Regardless of if the platform supports Zbb instructions,
+ prohibit the kernel from emitting Zbb instructions.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBB
+ bool "Allow Zbb instruction sequences if supported"
+ depends on TOOLCHAIN_HAS_ZBB
+ depends on RISCV_ALTERNATIVE
+ select RISCV_ISA_ZBB
+ help
+ Add support for enabling optimisations in the kernel when the
+ Zbb extension is detected at boot.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_ZBB
+ bool "Emit Zbb instructions when building Linux"
+ depends on TOOLCHAIN_HAS_ZBB
+ depends on NONPORTABLE
+ select RISCV_ISA_ZBB
+ help
+ Adds "zbb" to the ISA subsets that the toolchain is allowed to emit
+ when building Linux, which results in Zbb instructions in the
+ Linux binary. This option produces a kernel that will not run on
+ systems that do not support the Zbb extension.
+
+endchoice
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index f2120db6ed92..934e20de576b 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -67,6 +67,7 @@ riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C) := $(riscv-march-y)c
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V) := $(riscv-march-y)v
+riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB) := $(riscv-march-y)_zbb

ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
KBUILD_CFLAGS += -Wa,-misa-spec=2.2
diff --git a/arch/riscv/include/asm/arch_hweight.h b/arch/riscv/include/asm/arch_hweight.h
index 85b2c443823e..d89a18d5104f 100644
--- a/arch/riscv/include/asm/arch_hweight.h
+++ b/arch/riscv/include/asm/arch_hweight.h
@@ -19,21 +19,20 @@

static __always_inline unsigned int __arch_hweight32(unsigned int w)
{
-#ifdef CONFIG_RISCV_ISA_ZBB
- asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
- RISCV_ISA_EXT_ZBB, 1)
- : : : : legacy);
-
- asm (".option push\n"
- ".option arch,+zbb\n"
- CPOPW "%0, %0\n"
- ".option pop\n"
- : "+r" (w) : :);
-
- return w;
+ if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB)) {
+ if (!IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB))
+ asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
+ RISCV_ISA_EXT_ZBB, 1)
+ : : : : legacy);
+ asm (".option push\n"
+ ".option arch,+zbb\n"
+ CPOPW "%0, %0\n"
+ ".option pop\n"
+ : "+r" (w) : :);

+ return w;
+ }
legacy:
-#endif
return __sw_hweight32(w);
}

@@ -50,11 +49,12 @@ static inline unsigned int __arch_hweight8(unsigned int w)
#if BITS_PER_LONG == 64
static __always_inline unsigned long __arch_hweight64(__u64 w)
{
-# ifdef CONFIG_RISCV_ISA_ZBB
+#ifdef CONFIG_PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBB
asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
RISCV_ISA_EXT_ZBB, 1)
: : : : legacy);
-
+#endif
+#ifdef CONFIG_RISCV_ISA_ZBB
asm (".option push\n"
".option arch,+zbb\n"
"cpop %0, %0\n"
@@ -62,7 +62,8 @@ static __always_inline unsigned long __arch_hweight64(__u64 w)
: "+r" (w) : :);

return w;
-
+#endif
+#ifdef CONFIG_PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBB
legacy:
# endif
return __sw_hweight64(w);
diff --git a/arch/riscv/include/asm/checksum.h b/arch/riscv/include/asm/checksum.h
index 88e6f1499e88..2fe92abf5525 100644
--- a/arch/riscv/include/asm/checksum.h
+++ b/arch/riscv/include/asm/checksum.h
@@ -2,7 +2,7 @@
/*
* Checksum routines
*
- * Copyright (C) 2023 Rivos Inc.
+ * Copyright (C) 2023-2024 Rivos Inc.
*/
#ifndef __ASM_RISCV_CHECKSUM_H
#define __ASM_RISCV_CHECKSUM_H
@@ -49,16 +49,16 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
* ZBB only saves three instructions on 32-bit and five on 64-bit so not
* worth checking if supported without Alternatives.
*/
- if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
- IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
+ if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB)) {
unsigned long fold_temp;

- asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
- RISCV_ISA_EXT_ZBB, 1)
- :
- :
- :
- : no_zbb);
+ if (!IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB))
+ asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
+ RISCV_ISA_EXT_ZBB, 1)
+ :
+ :
+ :
+ : no_zbb);

if (IS_ENABLED(CONFIG_32BIT)) {
asm(".option push \n\
diff --git a/arch/riscv/lib/csum.c b/arch/riscv/lib/csum.c
index 7fb12c59e571..5ea2bf71c963 100644
--- a/arch/riscv/lib/csum.c
+++ b/arch/riscv/lib/csum.c
@@ -44,8 +44,7 @@ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
* Zbb support saves 4 instructions, so not worth checking without
* alternatives if supported
*/
- if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
- IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
+ if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB)) {
unsigned long fold_temp;

/*
@@ -53,12 +52,13 @@ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
* support, so nop when Zbb is available and jump when Zbb is
* not available.
*/
- asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
- RISCV_ISA_EXT_ZBB, 1)
- :
- :
- :
- : no_zbb);
+ if (!IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB))
+ asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
+ RISCV_ISA_EXT_ZBB, 1)
+ :
+ :
+ :
+ : no_zbb);
asm(".option push \n\
.option arch,+zbb \n\
rori %[fold_temp], %[sum], 32 \n\
@@ -161,8 +161,7 @@ do_csum_with_alignment(const unsigned char *buff, int len)
* Zbb support saves 6 instructions, so not worth checking without
* alternatives if supported
*/
- if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
- IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
+ if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB)) {
unsigned long fold_temp;

/*
@@ -170,12 +169,13 @@ do_csum_with_alignment(const unsigned char *buff, int len)
* support, so nop when Zbb is available and jump when Zbb is
* not available.
*/
- asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
- RISCV_ISA_EXT_ZBB, 1)
- :
- :
- :
- : no_zbb);
+ if (!IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB))
+ asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
+ RISCV_ISA_EXT_ZBB, 1)
+ :
+ :
+ :
+ : no_zbb);

#ifdef CONFIG_32BIT
asm_goto_output(".option push \n\
@@ -248,8 +248,7 @@ do_csum_no_alignment(const unsigned char *buff, int len)
* Zbb support saves 6 instructions, so not worth checking without
* alternatives if supported
*/
- if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
- IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
+ if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB)) {
unsigned long fold_temp;

/*
@@ -257,12 +256,13 @@ do_csum_no_alignment(const unsigned char *buff, int len)
* support, so nop when Zbb is available and jump when Zbb is
* not available.
*/
- asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
- RISCV_ISA_EXT_ZBB, 1)
- :
- :
- :
- : no_zbb);
+ if (!IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB))
+ asm goto(ALTERNATIVE("j %l[no_zbb]", "nop", 0,
+ RISCV_ISA_EXT_ZBB, 1)
+ :
+ :
+ :
+ : no_zbb);

#ifdef CONFIG_32BIT
asm (".option push \n\
diff --git a/arch/riscv/lib/strcmp.S b/arch/riscv/lib/strcmp.S
index 687b2bea5c43..5798ef7e73fc 100644
--- a/arch/riscv/lib/strcmp.S
+++ b/arch/riscv/lib/strcmp.S
@@ -7,7 +7,7 @@

/* int strcmp(const char *cs, const char *ct) */
SYM_FUNC_START(strcmp)
-
+#ifndef CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB
ALTERNATIVE("nop", "j strcmp_zbb", 0, RISCV_ISA_EXT_ZBB, CONFIG_RISCV_ISA_ZBB)

/*
@@ -37,7 +37,7 @@ SYM_FUNC_START(strcmp)
*/
sub a0, t0, t1
ret
-
+#endif /* !CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB */
/*
* Variant of strcmp using the ZBB extension if available.
* The code was published as part of the bitmanip manual
diff --git a/arch/riscv/lib/strlen.S b/arch/riscv/lib/strlen.S
index 8ae3064e45ff..b63b91f74084 100644
--- a/arch/riscv/lib/strlen.S
+++ b/arch/riscv/lib/strlen.S
@@ -7,7 +7,7 @@

/* int strlen(const char *s) */
SYM_FUNC_START(strlen)
-
+#ifndef CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB
ALTERNATIVE("nop", "j strlen_zbb", 0, RISCV_ISA_EXT_ZBB, CONFIG_RISCV_ISA_ZBB)

/*
@@ -29,7 +29,7 @@ SYM_FUNC_START(strlen)
2:
sub a0, t1, a0
ret
-
+#endif /* !CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB */
/*
* Variant of strlen using the ZBB extension if available
*/
diff --git a/arch/riscv/lib/strncmp.S b/arch/riscv/lib/strncmp.S
index aba5b3148621..3a1330d7d4a2 100644
--- a/arch/riscv/lib/strncmp.S
+++ b/arch/riscv/lib/strncmp.S
@@ -7,7 +7,7 @@

/* int strncmp(const char *cs, const char *ct, size_t count) */
SYM_FUNC_START(strncmp)
-
+#ifndef CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB
ALTERNATIVE("nop", "j strncmp_zbb", 0, RISCV_ISA_EXT_ZBB, CONFIG_RISCV_ISA_ZBB)

/*
@@ -42,7 +42,7 @@ SYM_FUNC_START(strncmp)
*/
sub a0, t0, t1
ret
-
+#endif /* !CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB */
/*
* Variant of strncmp using the ZBB extension if available
*/
diff --git a/arch/riscv/net/bpf_jit.h b/arch/riscv/net/bpf_jit.h
index 259294bdbc3a..61892044124e 100644
--- a/arch/riscv/net/bpf_jit.h
+++ b/arch/riscv/net/bpf_jit.h
@@ -22,7 +22,9 @@ static inline bool rvc_enabled(void)

static inline bool rvzbb_enabled(void)
{
- return IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && riscv_has_extension_likely(RISCV_ISA_EXT_ZBB);
+ return IS_ENABLED(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB) ||
+ (IS_ENABLED(CONFIG_PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBB) &&
+ riscv_has_extension_likely(RISCV_ISA_EXT_ZBB));
}

enum {

--
2.44.0


2024-05-07 01:44:06

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 6/8] riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBA Kconfig option

Zba can optimize kernel instruction sequences. Add a config option
PLATFORM_SUPPORTS_RISCV_ISA_ZBA that allows arbitrary Zba instruction
sequences to be emitted by the compiler.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig.isa | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
arch/riscv/Makefile | 1 +
2 files changed, 53 insertions(+)

diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index 49bed8c75263..e7f28dc44137 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -186,6 +186,58 @@ config PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT

If you don't know what to do here, say Y.

+
+config TOOLCHAIN_HAS_ZBA
+ bool
+ default y
+ depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64ima_zba)
+ depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zba)
+ depends on LLD_VERSION >= 150000 || LD_VERSION >= 23900
+ depends on AS_HAS_OPTION_ARCH
+
+config RISCV_ISA_ZBA
+ bool
+
+choice
+ prompt "Zba extension for address generation instructions support"
+ default PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBA
+ help
+ This selects the level of support for Zba instructions to be
+ built into the Linux Kernel. This does not impact whether Zba
+ instructions are allowed to be emitted by user-space code.
+
+ The Zba extension provides instructions to accelerate a number
+ of address generation instruction sequences.
+
+config PROHIBIT_RISCV_ISA_ZBA
+ bool "Prohibit Zba instruction sequences"
+ depends on NONPORTABLE
+ help
+ Regardless of if the platform supports Zba instructions,
+ prohibit the kernel from emitting Zba instructions.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBA
+ bool "Allow Zba instruction sequences if supported"
+ depends on TOOLCHAIN_HAS_ZBB
+ depends on RISCV_ALTERNATIVE
+ select RISCV_ISA_ZBA
+ help
+ Add support for enabling optimisations in the kernel when the
+ Zba extension is detected at boot.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_ZBA
+ bool "Emit Zba instructions when building Linux"
+ depends on TOOLCHAIN_HAS_ZBB
+ depends on NONPORTABLE
+ select RISCV_ISA_ZBA
+ help
+ Adds "zba" to the ISA subsets that the toolchain is allowed to emit
+ when building Linux, which results in Zba instructions in the
+ Linux binary. This option produces a kernel that will not run on
+ systems that do not support the Zba extension.
+
+endchoice
+
config TOOLCHAIN_HAS_ZBB
bool
default y
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 934e20de576b..0ab4cc5dfffb 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -67,6 +67,7 @@ riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C) := $(riscv-march-y)c
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V) := $(riscv-march-y)v
+riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBA) := $(riscv-march-y)_zba
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB) := $(riscv-march-y)_zbb

ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC

--
2.44.0


2024-05-07 01:44:36

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 8/8] riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBS Kconfig option

Zbs can optimize kernel instruction sequences. Add a config option
PLATFORM_SUPPORTS_RISCV_ISA_ZBS that allows arbitrary Zbs instruction
sequences to be emitted by the compiler.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig.isa | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
arch/riscv/Makefile | 1 +
2 files changed, 52 insertions(+)

diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index b7399f236bba..60ae1bf71c70 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -340,3 +340,54 @@ config PLATFORM_SUPPORTS_RISCV_ISA_ZBC
systems that do not support the Zbc extension.

endchoice
+
+config TOOLCHAIN_HAS_ZBS
+ bool
+ default y
+ depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64ima_zbs)
+ depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zbs)
+ depends on LLD_VERSION >= 150000 || LD_VERSION >= 23900
+ depends on AS_HAS_OPTION_ARCH
+
+config RISCV_ISA_ZBS
+ bool
+
+choice
+ prompt "Zbs extension for bit manipulation instructions support"
+ default PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBS
+ help
+ This selects the level of support for Zbs instructions to be
+ built into the Linux Kernel. This does not impact whether Zbs
+ instructions are allowed to be emitted by user-space code.
+
+ The Zbs extension provides instructions to accelerate carry-less
+ multiplication.
+
+config PROHIBIT_RISCV_ISA_ZBS
+ bool "Prohibit Zbs instruction sequences"
+ depends on NONPORTABLE
+ help
+ Regardless of if the platform supports Zbs instructions,
+ prohibit the kernel from emitting Zbs instructions.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBS
+ bool "Allow Zbs instruction sequences if supported"
+ depends on TOOLCHAIN_HAS_ZBS
+ depends on RISCV_ALTERNATIVE
+ select RISCV_ISA_ZBS
+ help
+ Add support for enabling optimisations in the kernel when the
+ Zbs extension is detected at boot.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_ZBS
+ bool "Emit Zbs instructions when building Linux"
+ depends on TOOLCHAIN_HAS_ZBS
+ depends on NONPORTABLE
+ select RISCV_ISA_ZBS
+ help
+ Adds "zbs" to the ISA subsets that the toolchain is allowed to emit
+ when building Linux, which results in Zbs instructions in the
+ Linux binary. This option produces a kernel that will not run on
+ systems that do not support the Zbs extension.
+
+endchoice
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 30be0fec976a..7519b68c3bd5 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -70,6 +70,7 @@ riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V) := $(riscv-march-y)v
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBA) := $(riscv-march-y)_zba
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB) := $(riscv-march-y)_zbb
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBC) := $(riscv-march-y)_zbc
+riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBS) := $(riscv-march-y)_zbs

ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
KBUILD_CFLAGS += -Wa,-misa-spec=2.2

--
2.44.0


2024-05-07 01:45:15

by Charlie Jenkins

[permalink] [raw]
Subject: [PATCH 7/8] riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBC Kconfig option

Zbc can optimize kernel instruction sequences. Add a config option
PLATFORM_SUPPORTS_RISCV_ISA_ZBC that allows arbitrary Zbc instruction
sequences to be emitted by the compiler.

Signed-off-by: Charlie Jenkins <[email protected]>
---
arch/riscv/Kconfig.isa | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
arch/riscv/Makefile | 1 +
2 files changed, 52 insertions(+)

diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
index e7f28dc44137..b7399f236bba 100644
--- a/arch/riscv/Kconfig.isa
+++ b/arch/riscv/Kconfig.isa
@@ -289,3 +289,54 @@ config PLATFORM_SUPPORTS_RISCV_ISA_ZBB
systems that do not support the Zbb extension.

endchoice
+
+config TOOLCHAIN_HAS_ZBC
+ bool
+ default y
+ depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64ima_zbc)
+ depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zbc)
+ depends on LLD_VERSION >= 150000 || LD_VERSION >= 23900
+ depends on AS_HAS_OPTION_ARCH
+
+config RISCV_ISA_ZBC
+ bool
+
+choice
+ prompt "Zbc extension for bit manipulation instructions support"
+ default PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBC
+ help
+ This selects the level of support for Zbc instructions to be
+ built into the Linux Kernel. This does not impact whether Zbc
+ instructions are allowed to be emitted by user-space code.
+
+ The Zbc extension provides instructions to accelerate carry-less
+ multiplication.
+
+config PROHIBIT_RISCV_ISA_ZBC
+ bool "Prohibit Zbc instruction sequences"
+ depends on NONPORTABLE
+ help
+ Regardless of if the platform supports Zbc instructions,
+ prohibit the kernel from emitting Zbc instructions.
+
+config PLATFORM_MAY_SUPPORT_RISCV_ISA_ZBC
+ bool "Allow Zbc instruction sequences if supported"
+ depends on TOOLCHAIN_HAS_ZBC
+ depends on RISCV_ALTERNATIVE
+ select RISCV_ISA_ZBC
+ help
+ Add support for enabling optimisations in the kernel when the
+ Zbc extension is detected at boot.
+
+config PLATFORM_SUPPORTS_RISCV_ISA_ZBC
+ bool "Emit Zbc instructions when building Linux"
+ depends on TOOLCHAIN_HAS_ZBC
+ depends on NONPORTABLE
+ select RISCV_ISA_ZBC
+ help
+ Adds "zbc" to the ISA subsets that the toolchain is allowed to emit
+ when building Linux, which results in Zbc instructions in the
+ Linux binary. This option produces a kernel that will not run on
+ systems that do not support the Zbc extension.
+
+endchoice
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 0ab4cc5dfffb..30be0fec976a 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -69,6 +69,7 @@ riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_C) := $(riscv-march-y)c
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_V) := $(riscv-march-y)v
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBA) := $(riscv-march-y)_zba
riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBB) := $(riscv-march-y)_zbb
+riscv-march-$(CONFIG_PLATFORM_SUPPORTS_RISCV_ISA_ZBC) := $(riscv-march-y)_zbc

ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
KBUILD_CFLAGS += -Wa,-misa-spec=2.2

--
2.44.0


2024-05-07 05:42:08

by Jessica Clarke

[permalink] [raw]
Subject: Re: [PATCH 4/8] riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option

On 7 May 2024, at 02:40, Charlie Jenkins <[email protected]> wrote:
>
> Svpbmt would not benefit from having PLATFORM_SUPPORTS_RISCV_ISA_SVPBMT
> so just rename RISCV_ISA_SVPBMT to PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT
> and move the definition to Kconfig.isa.
>
> Signed-off-by: Charlie Jenkins <[email protected]>
> ---
> arch/riscv/Kconfig | 17 -----------------
> arch/riscv/Kconfig.isa | 17 +++++++++++++++++
> 2 files changed, 17 insertions(+), 17 deletions(-)
>
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 9c3a4347953b..22303a3ab59e 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -484,23 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
> help
> Allows early patching of the kernel for special errata
>
> -config RISCV_ISA_SVPBMT
> - bool "Svpbmt extension support for supervisor mode page-based memory types"
> - depends on 64BIT && MMU
> - depends on RISCV_ALTERNATIVE
> - default y
> - help
> - Add support for the Svpbmt ISA-extension (Supervisor-mode:
> - page-based memory types) in the kernel when it is detected at boot.
> -
> - The memory type for a page contains a combination of attributes
> - that indicate the cacheability, idempotency, and ordering
> - properties for access to that page.
> -
> - The Svpbmt extension is only available on 64-bit cpus.
> -
> - If you don't know what to do here, say Y.
> -
> config TOOLCHAIN_HAS_ZBB
> bool
> default y
> diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
> index 37585bcd763e..50e217dc5719 100644
> --- a/arch/riscv/Kconfig.isa
> +++ b/arch/riscv/Kconfig.isa
> @@ -168,3 +168,20 @@ config PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT
> not support Svnapot.
>
> endchoice
> +
> +config RISCV_ISA_SVPBMT

Hi Charlie,
Despite the subject and body you haven’t renamed it in this patch?

Jess

> + bool "Svpbmt extension support for supervisor mode page-based memory types"
> + depends on 64BIT && MMU
> + depends on RISCV_ALTERNATIVE
> + default y
> + help
> + Add support for the Svpbmt ISA-extension (Supervisor-mode:
> + page-based memory types) in the kernel when it is detected at boot.
> +
> + The memory type for a page contains a combination of attributes
> + that indicate the cacheability, idempotency, and ordering
> + properties for access to that page.
> +
> + The Svpbmt extension is only available on 64-bit cpus.
> +
> + If you don't know what to do here, say Y.
>
> --
> 2.44.0
>
>
> _______________________________________________
> linux-riscv mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/linux-riscv


2024-05-07 07:25:25

by Conor Dooley

[permalink] [raw]
Subject: Re: [PATCH 0/8] riscv: Support compiling the kernel with extensions

Hey Charlie,

On 7 May 2024 02:40:41 IST, Charlie Jenkins <[email protected]> wrote:
>The kernel currently has the restriction that it can only be compiled
>with the extensions that are hardcoded in arch/risc/Makefile.
>
>Any extension that is not listed in the Makefile can still be used by
>explicitly writing the assembly and using alternative patching.
>
>This series introduces Kconfig options that allow the kernel to be
>compiled with additional extensions.

One thing I don't see in the commit messages or the cover letter is what your actual motivation is
for making these changes.
Are you effectively looking to evaluate the alternatives at build time, or are you looking to
let the compiler use the extension where it sees
fit? Or perhaps both?

Thanks,
Conor.

>
>Signed-off-by: Charlie Jenkins <[email protected]>
>---
>Charlie Jenkins (8):
> riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_C Kconfig option
> riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_V Kconfig option
> riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT Kconfig option
> riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option
> riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBB Kconfig option
> riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBA Kconfig option
> riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBC Kconfig option
> riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBS Kconfig option
>
> arch/riscv/Kconfig | 135 +-----------
> arch/riscv/Kconfig.isa | 393 ++++++++++++++++++++++++++++++++++
> arch/riscv/Makefile | 15 +-
> arch/riscv/crypto/Kconfig | 14 +-
> arch/riscv/include/asm/arch_hweight.h | 33 +--
> arch/riscv/include/asm/checksum.h | 18 +-
> arch/riscv/include/asm/pgtable.h | 3 +-
> arch/riscv/include/asm/simd.h | 3 +
> arch/riscv/include/asm/vector.h | 3 +-
> arch/riscv/kernel/cpufeature.c | 3 +-
> arch/riscv/kernel/head.S | 8 +-
> arch/riscv/kernel/probes/uprobes.c | 2 +-
> arch/riscv/kernel/process.c | 14 +-
> arch/riscv/kernel/ptrace.c | 6 +
> arch/riscv/lib/csum.c | 48 ++---
> arch/riscv/lib/riscv_v_helpers.c | 1 -
> arch/riscv/lib/strcmp.S | 4 +-
> arch/riscv/lib/strlen.S | 4 +-
> arch/riscv/lib/strncmp.S | 4 +-
> arch/riscv/lib/uaccess_vector.S | 2 +
> arch/riscv/lib/xor.S | 2 +
> arch/riscv/net/bpf_jit.h | 8 +-
> 22 files changed, 511 insertions(+), 212 deletions(-)
>---
>base-commit: 2f47357557b7aa98d9d9002688aae480864ca3f6
>change-id: 20240429-compile_kernel_with_extensions-92dd2403d325

2024-05-07 20:08:38

by Charlie Jenkins

[permalink] [raw]
Subject: Re: [PATCH 0/8] riscv: Support compiling the kernel with extensions

On Tue, May 07, 2024 at 08:25:09AM +0100, Conor Dooley wrote:
> Hey Charlie,
>
> On 7 May 2024 02:40:41 IST, Charlie Jenkins <[email protected]> wrote:
> >The kernel currently has the restriction that it can only be compiled
> >with the extensions that are hardcoded in arch/risc/Makefile.
> >
> >Any extension that is not listed in the Makefile can still be used by
> >explicitly writing the assembly and using alternative patching.
> >
> >This series introduces Kconfig options that allow the kernel to be
> >compiled with additional extensions.
>
> One thing I don't see in the commit messages or the cover letter is what your actual motivation is
> for making these changes.
> Are you effectively looking to evaluate the alternatives at build time, or are you looking to
> let the compiler use the extension where it sees
> fit? Or perhaps both?

Both. I forgot to mention that this uses the updated wording from your
patch "RISC-V: clarify what some RISCV_ISA* config options do".

The hope is that at some point the kernel can be compiled with something
like the RVI profiles, in the interim this allows people to compile
kernels with these extensions for some "free" performance improvements.
I haven't tested performance on real hardware, but compiling the kernel
with the Zb* extensions has a 4.9% dynamic instruction count reduction
when running a boot + simple userspace program test (tested using
Spike).

I meant to remove "v" from the march since we have to call the kernel
begin/end functions when using vector, I'll need to update that in the
next version.

- Charlie

>
> Thanks,
> Conor.
>
> >
> >Signed-off-by: Charlie Jenkins <[email protected]>
> >---
> >Charlie Jenkins (8):
> > riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_C Kconfig option
> > riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_V Kconfig option
> > riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT Kconfig option
> > riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option
> > riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBB Kconfig option
> > riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBA Kconfig option
> > riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBC Kconfig option
> > riscv: Add PLATFORM_SUPPORTS_RISCV_ISA_ZBS Kconfig option
> >
> > arch/riscv/Kconfig | 135 +-----------
> > arch/riscv/Kconfig.isa | 393 ++++++++++++++++++++++++++++++++++
> > arch/riscv/Makefile | 15 +-
> > arch/riscv/crypto/Kconfig | 14 +-
> > arch/riscv/include/asm/arch_hweight.h | 33 +--
> > arch/riscv/include/asm/checksum.h | 18 +-
> > arch/riscv/include/asm/pgtable.h | 3 +-
> > arch/riscv/include/asm/simd.h | 3 +
> > arch/riscv/include/asm/vector.h | 3 +-
> > arch/riscv/kernel/cpufeature.c | 3 +-
> > arch/riscv/kernel/head.S | 8 +-
> > arch/riscv/kernel/probes/uprobes.c | 2 +-
> > arch/riscv/kernel/process.c | 14 +-
> > arch/riscv/kernel/ptrace.c | 6 +
> > arch/riscv/lib/csum.c | 48 ++---
> > arch/riscv/lib/riscv_v_helpers.c | 1 -
> > arch/riscv/lib/strcmp.S | 4 +-
> > arch/riscv/lib/strlen.S | 4 +-
> > arch/riscv/lib/strncmp.S | 4 +-
> > arch/riscv/lib/uaccess_vector.S | 2 +
> > arch/riscv/lib/xor.S | 2 +
> > arch/riscv/net/bpf_jit.h | 8 +-
> > 22 files changed, 511 insertions(+), 212 deletions(-)
> >---
> >base-commit: 2f47357557b7aa98d9d9002688aae480864ca3f6
> >change-id: 20240429-compile_kernel_with_extensions-92dd2403d325

2024-05-07 20:39:26

by Charlie Jenkins

[permalink] [raw]
Subject: Re: [PATCH 4/8] riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option

On Tue, May 07, 2024 at 06:40:52AM +0100, Jessica Clarke wrote:
> On 7 May 2024, at 02:40, Charlie Jenkins <[email protected]> wrote:
> >
> > Svpbmt would not benefit from having PLATFORM_SUPPORTS_RISCV_ISA_SVPBMT
> > so just rename RISCV_ISA_SVPBMT to PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT
> > and move the definition to Kconfig.isa.
> >
> > Signed-off-by: Charlie Jenkins <[email protected]>
> > ---
> > arch/riscv/Kconfig | 17 -----------------
> > arch/riscv/Kconfig.isa | 17 +++++++++++++++++
> > 2 files changed, 17 insertions(+), 17 deletions(-)
> >
> > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> > index 9c3a4347953b..22303a3ab59e 100644
> > --- a/arch/riscv/Kconfig
> > +++ b/arch/riscv/Kconfig
> > @@ -484,23 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
> > help
> > Allows early patching of the kernel for special errata
> >
> > -config RISCV_ISA_SVPBMT
> > - bool "Svpbmt extension support for supervisor mode page-based memory types"
> > - depends on 64BIT && MMU
> > - depends on RISCV_ALTERNATIVE
> > - default y
> > - help
> > - Add support for the Svpbmt ISA-extension (Supervisor-mode:
> > - page-based memory types) in the kernel when it is detected at boot.
> > -
> > - The memory type for a page contains a combination of attributes
> > - that indicate the cacheability, idempotency, and ordering
> > - properties for access to that page.
> > -
> > - The Svpbmt extension is only available on 64-bit cpus.
> > -
> > - If you don't know what to do here, say Y.
> > -
> > config TOOLCHAIN_HAS_ZBB
> > bool
> > default y
> > diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
> > index 37585bcd763e..50e217dc5719 100644
> > --- a/arch/riscv/Kconfig.isa
> > +++ b/arch/riscv/Kconfig.isa
> > @@ -168,3 +168,20 @@ config PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT
> > not support Svnapot.
> >
> > endchoice
> > +
> > +config RISCV_ISA_SVPBMT
>
> Hi Charlie,
> Despite the subject and body you haven’t renamed it in this patch?

I didn't do a good job at explaining exactly what's happening here. The
config option "PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT" most closely
follows the semantics of what "RISCV_ISA_SVPBMT" previously was. This
patch changes "RISCV_ISA_SVPBMT" to mean that either
PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT or
PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT was selected.

- Charlie

>
> Jess
>
> > + bool "Svpbmt extension support for supervisor mode page-based memory types"
> > + depends on 64BIT && MMU
> > + depends on RISCV_ALTERNATIVE
> > + default y
> > + help
> > + Add support for the Svpbmt ISA-extension (Supervisor-mode:
> > + page-based memory types) in the kernel when it is detected at boot.
> > +
> > + The memory type for a page contains a combination of attributes
> > + that indicate the cacheability, idempotency, and ordering
> > + properties for access to that page.
> > +
> > + The Svpbmt extension is only available on 64-bit cpus.
> > +
> > + If you don't know what to do here, say Y.
> >
> > --
> > 2.44.0
> >
> >
> > _______________________________________________
> > linux-riscv mailing list
> > [email protected]
> > http://lists.infradead.org/mailman/listinfo/linux-riscv
>

2024-05-08 01:25:08

by Charlie Jenkins

[permalink] [raw]
Subject: Re: [PATCH 4/8] riscv: Add PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT Kconfig option

On Tue, May 07, 2024 at 01:39:14PM -0700, Charlie Jenkins wrote:
> On Tue, May 07, 2024 at 06:40:52AM +0100, Jessica Clarke wrote:
> > On 7 May 2024, at 02:40, Charlie Jenkins <[email protected]> wrote:
> > >
> > > Svpbmt would not benefit from having PLATFORM_SUPPORTS_RISCV_ISA_SVPBMT
> > > so just rename RISCV_ISA_SVPBMT to PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT
> > > and move the definition to Kconfig.isa.
> > >
> > > Signed-off-by: Charlie Jenkins <[email protected]>
> > > ---
> > > arch/riscv/Kconfig | 17 -----------------
> > > arch/riscv/Kconfig.isa | 17 +++++++++++++++++
> > > 2 files changed, 17 insertions(+), 17 deletions(-)
> > >
> > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> > > index 9c3a4347953b..22303a3ab59e 100644
> > > --- a/arch/riscv/Kconfig
> > > +++ b/arch/riscv/Kconfig
> > > @@ -484,23 +484,6 @@ config RISCV_ALTERNATIVE_EARLY
> > > help
> > > Allows early patching of the kernel for special errata
> > >
> > > -config RISCV_ISA_SVPBMT
> > > - bool "Svpbmt extension support for supervisor mode page-based memory types"
> > > - depends on 64BIT && MMU
> > > - depends on RISCV_ALTERNATIVE
> > > - default y
> > > - help
> > > - Add support for the Svpbmt ISA-extension (Supervisor-mode:
> > > - page-based memory types) in the kernel when it is detected at boot.
> > > -
> > > - The memory type for a page contains a combination of attributes
> > > - that indicate the cacheability, idempotency, and ordering
> > > - properties for access to that page.
> > > -
> > > - The Svpbmt extension is only available on 64-bit cpus.
> > > -
> > > - If you don't know what to do here, say Y.
> > > -
> > > config TOOLCHAIN_HAS_ZBB
> > > bool
> > > default y
> > > diff --git a/arch/riscv/Kconfig.isa b/arch/riscv/Kconfig.isa
> > > index 37585bcd763e..50e217dc5719 100644
> > > --- a/arch/riscv/Kconfig.isa
> > > +++ b/arch/riscv/Kconfig.isa
> > > @@ -168,3 +168,20 @@ config PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT
> > > not support Svnapot.
> > >
> > > endchoice
> > > +
> > > +config RISCV_ISA_SVPBMT
> >
> > Hi Charlie,
> > Despite the subject and body you haven’t renamed it in this patch?
>
> I didn't do a good job at explaining exactly what's happening here. The
> config option "PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT" most closely
> follows the semantics of what "RISCV_ISA_SVPBMT" previously was. This
> patch changes "RISCV_ISA_SVPBMT" to mean that either
> PLATFORM_MAY_SUPPORT_RISCV_ISA_SVPBMT or
> PLATFORM_SUPPORTS_RISCV_ISA_SVNAPOT was selected.

Disregard what I said... I was thinking about the other extensions and
forgot this one was different. Thank you for pointing this out! I need
to change this description to just say that the definition moved to
Kconfig.isa.

- Charlie

>
> - Charlie
>
> >
> > Jess
> >
> > > + bool "Svpbmt extension support for supervisor mode page-based memory types"
> > > + depends on 64BIT && MMU
> > > + depends on RISCV_ALTERNATIVE
> > > + default y
> > > + help
> > > + Add support for the Svpbmt ISA-extension (Supervisor-mode:
> > > + page-based memory types) in the kernel when it is detected at boot.
> > > +
> > > + The memory type for a page contains a combination of attributes
> > > + that indicate the cacheability, idempotency, and ordering
> > > + properties for access to that page.
> > > +
> > > + The Svpbmt extension is only available on 64-bit cpus.
> > > +
> > > + If you don't know what to do here, say Y.
> > >
> > > --
> > > 2.44.0
> > >
> > >
> > > _______________________________________________
> > > linux-riscv mailing list
> > > [email protected]
> > > http://lists.infradead.org/mailman/listinfo/linux-riscv
> >