* [PATCH v2 1/6] RISC-V: Make zicbom/zicboz errors consistent
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
@ 2023-08-30 16:49 ` Andrew Jones
2023-08-30 16:49 ` [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
` (5 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:49 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
commit c818fea83de4 ("riscv: say disabling zicbom if no or bad
riscv,cbom-block-size found") improved the error messages for
zicbom but zicboz was missed since its patches were in flight
at the same time. Get 'em now.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
---
arch/riscv/kernel/cpufeature.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
index a8f66c015229..31843e9cc80c 100644
--- a/arch/riscv/kernel/cpufeature.c
+++ b/arch/riscv/kernel/cpufeature.c
@@ -87,10 +87,10 @@ static bool riscv_isa_extension_check(int id)
return true;
case RISCV_ISA_EXT_ZICBOZ:
if (!riscv_cboz_block_size) {
- pr_err("Zicboz detected in ISA string, but no cboz-block-size found\n");
+ pr_err("Zicboz detected in ISA string, disabling as no cboz-block-size found\n");
return false;
} else if (!is_power_of_2(riscv_cboz_block_size)) {
- pr_err("cboz-block-size present, but is not a power-of-2\n");
+ pr_err("Zicboz disabled as cboz-block-size present, but is not a power-of-2\n");
return false;
}
return true;
--
2.41.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
2023-08-30 16:49 ` [PATCH v2 1/6] RISC-V: Make zicbom/zicboz errors consistent Andrew Jones
@ 2023-08-30 16:49 ` Andrew Jones
2023-08-31 16:24 ` Conor Dooley
2023-08-30 16:49 ` [PATCH v2 3/6] RISC-V: hwprobe: Expose Zicboz extension and its block size Andrew Jones
` (4 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:49 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
When Zicboz is present, enable its instruction (cbo.zero) in
usermode by setting its respective senvcfg bit. We don't bother
trying to set this bit per-task, which would also require an
interface for tasks to request enabling and/or disabling. Instead,
permanently set the bit for each hart which has the extension when
bringing it online.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
---
arch/riscv/include/asm/cpufeature.h | 2 ++
arch/riscv/include/asm/csr.h | 1 +
arch/riscv/include/asm/hwcap.h | 16 ++++++++++++++++
arch/riscv/kernel/cpufeature.c | 6 ++++++
arch/riscv/kernel/setup.c | 4 ++++
arch/riscv/kernel/smpboot.c | 4 ++++
6 files changed, 33 insertions(+)
diff --git a/arch/riscv/include/asm/cpufeature.h b/arch/riscv/include/asm/cpufeature.h
index 23fed53b8815..788fd575c21a 100644
--- a/arch/riscv/include/asm/cpufeature.h
+++ b/arch/riscv/include/asm/cpufeature.h
@@ -30,4 +30,6 @@ DECLARE_PER_CPU(long, misaligned_access_speed);
/* Per-cpu ISA extensions. */
extern struct riscv_isainfo hart_isa[NR_CPUS];
+void riscv_user_isa_enable(void);
+
#endif
diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
index 7bac43a3176e..e187e76e3df4 100644
--- a/arch/riscv/include/asm/csr.h
+++ b/arch/riscv/include/asm/csr.h
@@ -273,6 +273,7 @@
#define CSR_SIE 0x104
#define CSR_STVEC 0x105
#define CSR_SCOUNTEREN 0x106
+#define CSR_SENVCFG 0x10a
#define CSR_SSCRATCH 0x140
#define CSR_SEPC 0x141
#define CSR_SCAUSE 0x142
diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h
index f041bfa7f6a0..66178dbd0045 100644
--- a/arch/riscv/include/asm/hwcap.h
+++ b/arch/riscv/include/asm/hwcap.h
@@ -66,6 +66,7 @@
#ifndef __ASSEMBLY__
#include <linux/jump_label.h>
+#include <asm/cpufeature.h>
unsigned long riscv_get_elf_hwcap(void);
@@ -130,6 +131,21 @@ riscv_has_extension_unlikely(const unsigned long ext)
return true;
}
+static __always_inline bool riscv_cpu_has_extension_likely(int cpu, const unsigned long ext)
+{
+ if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_likely(ext))
+ return true;
+
+ return __riscv_isa_extension_available(hart_isa[cpu].isa, ext);
+}
+
+static __always_inline bool riscv_cpu_has_extension_unlikely(int cpu, const unsigned long ext)
+{
+ if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_unlikely(ext))
+ return true;
+
+ return __riscv_isa_extension_available(hart_isa[cpu].isa, ext);
+}
#endif
#endif /* _ASM_RISCV_HWCAP_H */
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
index 31843e9cc80c..a33cf7c89d9e 100644
--- a/arch/riscv/kernel/cpufeature.c
+++ b/arch/riscv/kernel/cpufeature.c
@@ -391,6 +391,12 @@ unsigned long riscv_get_elf_hwcap(void)
return hwcap;
}
+void riscv_user_isa_enable(void)
+{
+ if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_ZICBOZ))
+ csr_set(CSR_SENVCFG, ENVCFG_CBZE);
+}
+
#ifdef CONFIG_RISCV_ALTERNATIVE
/*
* Alternative patch sites consider 48 bits when determining when to patch
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index 971fe776e2f8..2f053f0763a1 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -25,6 +25,7 @@
#include <asm/acpi.h>
#include <asm/alternative.h>
#include <asm/cacheflush.h>
+#include <asm/cpufeature.h>
#include <asm/cpu_ops.h>
#include <asm/early_ioremap.h>
#include <asm/pgtable.h>
@@ -308,9 +309,12 @@ void __init setup_arch(char **cmdline_p)
riscv_fill_hwcap();
init_rt_signal_env();
apply_boot_alternatives();
+
if (IS_ENABLED(CONFIG_RISCV_ISA_ZICBOM) &&
riscv_isa_extension_available(NULL, ZICBOM))
riscv_noncoherent_supported();
+
+ riscv_user_isa_enable();
}
static int __init topology_init(void)
diff --git a/arch/riscv/kernel/smpboot.c b/arch/riscv/kernel/smpboot.c
index f4d6acb38dd0..502b04abda0b 100644
--- a/arch/riscv/kernel/smpboot.c
+++ b/arch/riscv/kernel/smpboot.c
@@ -25,6 +25,8 @@
#include <linux/of.h>
#include <linux/sched/task_stack.h>
#include <linux/sched/mm.h>
+
+#include <asm/cpufeature.h>
#include <asm/cpu_ops.h>
#include <asm/irq.h>
#include <asm/mmu_context.h>
@@ -252,6 +254,8 @@ asmlinkage __visible void smp_callin(void)
elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
}
+ riscv_user_isa_enable();
+
/*
* Remote TLB flushes are ignored while the CPU is offline, so emit
* a local TLB flush right now just in case.
--
2.41.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode
2023-08-30 16:49 ` [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
@ 2023-08-31 16:24 ` Conor Dooley
2023-08-31 16:39 ` Andrew Jones
0 siblings, 1 reply; 15+ messages in thread
From: Conor Dooley @ 2023-08-31 16:24 UTC (permalink / raw)
To: Andrew Jones
Cc: linux-riscv, paul.walmsley, palmer, aou, evan, conor.dooley, apatel
[-- Attachment #1.1: Type: text/plain, Size: 5342 bytes --]
On Wed, Aug 30, 2023 at 06:49:57PM +0200, Andrew Jones wrote:
> When Zicboz is present, enable its instruction (cbo.zero) in
> usermode by setting its respective senvcfg bit. We don't bother
> trying to set this bit per-task, which would also require an
> interface for tasks to request enabling and/or disabling. Instead,
> permanently set the bit for each hart which has the extension when
> bringing it online.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
> arch/riscv/include/asm/cpufeature.h | 2 ++
> arch/riscv/include/asm/csr.h | 1 +
> arch/riscv/include/asm/hwcap.h | 16 ++++++++++++++++
> arch/riscv/kernel/cpufeature.c | 6 ++++++
> arch/riscv/kernel/setup.c | 4 ++++
> arch/riscv/kernel/smpboot.c | 4 ++++
> 6 files changed, 33 insertions(+)
>
> diff --git a/arch/riscv/include/asm/cpufeature.h b/arch/riscv/include/asm/cpufeature.h
> index 23fed53b8815..788fd575c21a 100644
> --- a/arch/riscv/include/asm/cpufeature.h
> +++ b/arch/riscv/include/asm/cpufeature.h
> @@ -30,4 +30,6 @@ DECLARE_PER_CPU(long, misaligned_access_speed);
> /* Per-cpu ISA extensions. */
> extern struct riscv_isainfo hart_isa[NR_CPUS];
>
> +void riscv_user_isa_enable(void);
> +
> #endif
> diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
> index 7bac43a3176e..e187e76e3df4 100644
> --- a/arch/riscv/include/asm/csr.h
> +++ b/arch/riscv/include/asm/csr.h
> @@ -273,6 +273,7 @@
> #define CSR_SIE 0x104
> #define CSR_STVEC 0x105
> #define CSR_SCOUNTEREN 0x106
> +#define CSR_SENVCFG 0x10a
> #define CSR_SSCRATCH 0x140
> #define CSR_SEPC 0x141
> #define CSR_SCAUSE 0x142
> diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h
> index f041bfa7f6a0..66178dbd0045 100644
> --- a/arch/riscv/include/asm/hwcap.h
> +++ b/arch/riscv/include/asm/hwcap.h
> @@ -66,6 +66,7 @@
> #ifndef __ASSEMBLY__
>
> #include <linux/jump_label.h>
> +#include <asm/cpufeature.h>
>
> unsigned long riscv_get_elf_hwcap(void);
>
> @@ -130,6 +131,21 @@ riscv_has_extension_unlikely(const unsigned long ext)
> return true;
> }
>
> +static __always_inline bool riscv_cpu_has_extension_likely(int cpu, const unsigned long ext)
> +{
> + if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_likely(ext))
> + return true;
It'd have been nice to put the explanation for this into the commit
message I think, but w/e. Do it if there's a v3 I guess.
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Thanks,
Conor.
> +
> + return __riscv_isa_extension_available(hart_isa[cpu].isa, ext);
> +}
> +
> +static __always_inline bool riscv_cpu_has_extension_unlikely(int cpu, const unsigned long ext)
> +{
> + if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_unlikely(ext))
> + return true;
> +
> + return __riscv_isa_extension_available(hart_isa[cpu].isa, ext);
> +}
> #endif
>
> #endif /* _ASM_RISCV_HWCAP_H */
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index 31843e9cc80c..a33cf7c89d9e 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -391,6 +391,12 @@ unsigned long riscv_get_elf_hwcap(void)
> return hwcap;
> }
>
> +void riscv_user_isa_enable(void)
> +{
> + if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_ZICBOZ))
> + csr_set(CSR_SENVCFG, ENVCFG_CBZE);
> +}
> +
> #ifdef CONFIG_RISCV_ALTERNATIVE
> /*
> * Alternative patch sites consider 48 bits when determining when to patch
> diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
> index 971fe776e2f8..2f053f0763a1 100644
> --- a/arch/riscv/kernel/setup.c
> +++ b/arch/riscv/kernel/setup.c
> @@ -25,6 +25,7 @@
> #include <asm/acpi.h>
> #include <asm/alternative.h>
> #include <asm/cacheflush.h>
> +#include <asm/cpufeature.h>
> #include <asm/cpu_ops.h>
> #include <asm/early_ioremap.h>
> #include <asm/pgtable.h>
> @@ -308,9 +309,12 @@ void __init setup_arch(char **cmdline_p)
> riscv_fill_hwcap();
> init_rt_signal_env();
> apply_boot_alternatives();
> +
> if (IS_ENABLED(CONFIG_RISCV_ISA_ZICBOM) &&
> riscv_isa_extension_available(NULL, ZICBOM))
> riscv_noncoherent_supported();
> +
> + riscv_user_isa_enable();
> }
>
> static int __init topology_init(void)
> diff --git a/arch/riscv/kernel/smpboot.c b/arch/riscv/kernel/smpboot.c
> index f4d6acb38dd0..502b04abda0b 100644
> --- a/arch/riscv/kernel/smpboot.c
> +++ b/arch/riscv/kernel/smpboot.c
> @@ -25,6 +25,8 @@
> #include <linux/of.h>
> #include <linux/sched/task_stack.h>
> #include <linux/sched/mm.h>
> +
> +#include <asm/cpufeature.h>
> #include <asm/cpu_ops.h>
> #include <asm/irq.h>
> #include <asm/mmu_context.h>
> @@ -252,6 +254,8 @@ asmlinkage __visible void smp_callin(void)
> elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
> }
>
> + riscv_user_isa_enable();
> +
> /*
> * Remote TLB flushes are ignored while the CPU is offline, so emit
> * a local TLB flush right now just in case.
> --
> 2.41.0
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode
2023-08-31 16:24 ` Conor Dooley
@ 2023-08-31 16:39 ` Andrew Jones
2023-08-31 16:46 ` Conor Dooley
0 siblings, 1 reply; 15+ messages in thread
From: Andrew Jones @ 2023-08-31 16:39 UTC (permalink / raw)
To: Conor Dooley
Cc: linux-riscv, paul.walmsley, palmer, aou, evan, conor.dooley, apatel
On Thu, Aug 31, 2023 at 05:24:41PM +0100, Conor Dooley wrote:
> On Wed, Aug 30, 2023 at 06:49:57PM +0200, Andrew Jones wrote:
> > When Zicboz is present, enable its instruction (cbo.zero) in
> > usermode by setting its respective senvcfg bit. We don't bother
> > trying to set this bit per-task, which would also require an
> > interface for tasks to request enabling and/or disabling. Instead,
> > permanently set the bit for each hart which has the extension when
> > bringing it online.
> >
> > Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> > ---
> > arch/riscv/include/asm/cpufeature.h | 2 ++
> > arch/riscv/include/asm/csr.h | 1 +
> > arch/riscv/include/asm/hwcap.h | 16 ++++++++++++++++
> > arch/riscv/kernel/cpufeature.c | 6 ++++++
> > arch/riscv/kernel/setup.c | 4 ++++
> > arch/riscv/kernel/smpboot.c | 4 ++++
> > 6 files changed, 33 insertions(+)
> >
> > diff --git a/arch/riscv/include/asm/cpufeature.h b/arch/riscv/include/asm/cpufeature.h
> > index 23fed53b8815..788fd575c21a 100644
> > --- a/arch/riscv/include/asm/cpufeature.h
> > +++ b/arch/riscv/include/asm/cpufeature.h
> > @@ -30,4 +30,6 @@ DECLARE_PER_CPU(long, misaligned_access_speed);
> > /* Per-cpu ISA extensions. */
> > extern struct riscv_isainfo hart_isa[NR_CPUS];
> >
> > +void riscv_user_isa_enable(void);
> > +
> > #endif
> > diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
> > index 7bac43a3176e..e187e76e3df4 100644
> > --- a/arch/riscv/include/asm/csr.h
> > +++ b/arch/riscv/include/asm/csr.h
> > @@ -273,6 +273,7 @@
> > #define CSR_SIE 0x104
> > #define CSR_STVEC 0x105
> > #define CSR_SCOUNTEREN 0x106
> > +#define CSR_SENVCFG 0x10a
> > #define CSR_SSCRATCH 0x140
> > #define CSR_SEPC 0x141
> > #define CSR_SCAUSE 0x142
> > diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h
> > index f041bfa7f6a0..66178dbd0045 100644
> > --- a/arch/riscv/include/asm/hwcap.h
> > +++ b/arch/riscv/include/asm/hwcap.h
> > @@ -66,6 +66,7 @@
> > #ifndef __ASSEMBLY__
> >
> > #include <linux/jump_label.h>
> > +#include <asm/cpufeature.h>
> >
> > unsigned long riscv_get_elf_hwcap(void);
> >
> > @@ -130,6 +131,21 @@ riscv_has_extension_unlikely(const unsigned long ext)
> > return true;
> > }
> >
> > +static __always_inline bool riscv_cpu_has_extension_likely(int cpu, const unsigned long ext)
> > +{
> > + if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_likely(ext))
> > + return true;
>
> It'd have been nice to put the explanation for this into the commit
> message I think, but w/e. Do it if there's a v3 I guess.
Do you mean the "why gate on the alternative config" explanation? If so, I
can certainly do that for v3.
>
> Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Thanks,
drew
>
> Thanks,
> Conor.
>
> > +
> > + return __riscv_isa_extension_available(hart_isa[cpu].isa, ext);
> > +}
> > +
> > +static __always_inline bool riscv_cpu_has_extension_unlikely(int cpu, const unsigned long ext)
> > +{
> > + if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_unlikely(ext))
> > + return true;
> > +
> > + return __riscv_isa_extension_available(hart_isa[cpu].isa, ext);
> > +}
> > #endif
> >
> > #endif /* _ASM_RISCV_HWCAP_H */
> > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> > index 31843e9cc80c..a33cf7c89d9e 100644
> > --- a/arch/riscv/kernel/cpufeature.c
> > +++ b/arch/riscv/kernel/cpufeature.c
> > @@ -391,6 +391,12 @@ unsigned long riscv_get_elf_hwcap(void)
> > return hwcap;
> > }
> >
> > +void riscv_user_isa_enable(void)
> > +{
> > + if (riscv_cpu_has_extension_unlikely(smp_processor_id(), RISCV_ISA_EXT_ZICBOZ))
> > + csr_set(CSR_SENVCFG, ENVCFG_CBZE);
> > +}
> > +
> > #ifdef CONFIG_RISCV_ALTERNATIVE
> > /*
> > * Alternative patch sites consider 48 bits when determining when to patch
> > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
> > index 971fe776e2f8..2f053f0763a1 100644
> > --- a/arch/riscv/kernel/setup.c
> > +++ b/arch/riscv/kernel/setup.c
> > @@ -25,6 +25,7 @@
> > #include <asm/acpi.h>
> > #include <asm/alternative.h>
> > #include <asm/cacheflush.h>
> > +#include <asm/cpufeature.h>
> > #include <asm/cpu_ops.h>
> > #include <asm/early_ioremap.h>
> > #include <asm/pgtable.h>
> > @@ -308,9 +309,12 @@ void __init setup_arch(char **cmdline_p)
> > riscv_fill_hwcap();
> > init_rt_signal_env();
> > apply_boot_alternatives();
> > +
> > if (IS_ENABLED(CONFIG_RISCV_ISA_ZICBOM) &&
> > riscv_isa_extension_available(NULL, ZICBOM))
> > riscv_noncoherent_supported();
> > +
> > + riscv_user_isa_enable();
> > }
> >
> > static int __init topology_init(void)
> > diff --git a/arch/riscv/kernel/smpboot.c b/arch/riscv/kernel/smpboot.c
> > index f4d6acb38dd0..502b04abda0b 100644
> > --- a/arch/riscv/kernel/smpboot.c
> > +++ b/arch/riscv/kernel/smpboot.c
> > @@ -25,6 +25,8 @@
> > #include <linux/of.h>
> > #include <linux/sched/task_stack.h>
> > #include <linux/sched/mm.h>
> > +
> > +#include <asm/cpufeature.h>
> > #include <asm/cpu_ops.h>
> > #include <asm/irq.h>
> > #include <asm/mmu_context.h>
> > @@ -252,6 +254,8 @@ asmlinkage __visible void smp_callin(void)
> > elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
> > }
> >
> > + riscv_user_isa_enable();
> > +
> > /*
> > * Remote TLB flushes are ignored while the CPU is offline, so emit
> > * a local TLB flush right now just in case.
> > --
> > 2.41.0
> >
> >
> > _______________________________________________
> > 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] 15+ messages in thread
* Re: [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode
2023-08-31 16:39 ` Andrew Jones
@ 2023-08-31 16:46 ` Conor Dooley
0 siblings, 0 replies; 15+ messages in thread
From: Conor Dooley @ 2023-08-31 16:46 UTC (permalink / raw)
To: Andrew Jones
Cc: linux-riscv, paul.walmsley, palmer, aou, evan, conor.dooley, apatel
[-- Attachment #1.1: Type: text/plain, Size: 841 bytes --]
On Thu, Aug 31, 2023 at 06:39:30PM +0200, Andrew Jones wrote:
> On Thu, Aug 31, 2023 at 05:24:41PM +0100, Conor Dooley wrote:
> > On Wed, Aug 30, 2023 at 06:49:57PM +0200, Andrew Jones wrote:
> > > @@ -130,6 +131,21 @@ riscv_has_extension_unlikely(const unsigned long ext)
> > > return true;
> > > }
> > >
> > > +static __always_inline bool riscv_cpu_has_extension_likely(int cpu, const unsigned long ext)
> > > +{
> > > + if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) && riscv_has_extension_likely(ext))
> > > + return true;
> >
> > It'd have been nice to put the explanation for this into the commit
> > message I think, but w/e. Do it if there's a v3 I guess.
>
> Do you mean the "why gate on the alternative config" explanation? If so, I
> can certainly do that for v3.
Yeah, should maybe have specified, sorry.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 3/6] RISC-V: hwprobe: Expose Zicboz extension and its block size
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
2023-08-30 16:49 ` [PATCH v2 1/6] RISC-V: Make zicbom/zicboz errors consistent Andrew Jones
2023-08-30 16:49 ` [PATCH v2 2/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
@ 2023-08-30 16:49 ` Andrew Jones
2023-08-31 16:19 ` Conor Dooley
2023-08-30 16:49 ` [PATCH v2 4/6] RISC-V: selftests: Statically link hwprobe test Andrew Jones
` (3 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:49 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
Expose Zicboz through hwprobe and also provide a key to extract its
respective block size. Opportunistically add a macro and apply it to
current extensions in order to avoid duplicating code.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Evan Green <evan@rivosinc.com>
---
Documentation/riscv/hwprobe.rst | 6 ++++
arch/riscv/include/asm/hwprobe.h | 2 +-
arch/riscv/include/uapi/asm/hwprobe.h | 2 ++
arch/riscv/kernel/sys_riscv.c | 46 +++++++++++++++++++--------
4 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/Documentation/riscv/hwprobe.rst b/Documentation/riscv/hwprobe.rst
index 933c715065d6..6a17c2872660 100644
--- a/Documentation/riscv/hwprobe.rst
+++ b/Documentation/riscv/hwprobe.rst
@@ -77,6 +77,9 @@ The following keys are defined:
* :c:macro:`RISCV_HWPROBE_EXT_ZBS`: The Zbs extension is supported, as defined
in version 1.0 of the Bit-Manipulation ISA extensions.
+ * :c:macro:`RISCV_HWPROBE_EXT_ZICBOZ`: The Zicboz extension is supported, as
+ ratified in commit 3dd606f ("Create cmobase-v1.0.pdf") of riscv-CMOs.
+
* :c:macro:`RISCV_HWPROBE_KEY_CPUPERF_0`: A bitmask that contains performance
information about the selected set of processors.
@@ -97,3 +100,6 @@ The following keys are defined:
* :c:macro:`RISCV_HWPROBE_MISALIGNED_UNSUPPORTED`: Misaligned accesses are
not supported at all and will generate a misaligned address fault.
+
+* :c:macro:`RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE`: An unsigned int which
+ represents the size of the Zicboz block in bytes.
diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hwprobe.h
index 78936f4ff513..39df8604fea1 100644
--- a/arch/riscv/include/asm/hwprobe.h
+++ b/arch/riscv/include/asm/hwprobe.h
@@ -8,6 +8,6 @@
#include <uapi/asm/hwprobe.h>
-#define RISCV_HWPROBE_MAX_KEY 5
+#define RISCV_HWPROBE_MAX_KEY 6
#endif
diff --git a/arch/riscv/include/uapi/asm/hwprobe.h b/arch/riscv/include/uapi/asm/hwprobe.h
index 006bfb48343d..86d08a0e617b 100644
--- a/arch/riscv/include/uapi/asm/hwprobe.h
+++ b/arch/riscv/include/uapi/asm/hwprobe.h
@@ -29,6 +29,7 @@ struct riscv_hwprobe {
#define RISCV_HWPROBE_EXT_ZBA (1 << 3)
#define RISCV_HWPROBE_EXT_ZBB (1 << 4)
#define RISCV_HWPROBE_EXT_ZBS (1 << 5)
+#define RISCV_HWPROBE_EXT_ZICBOZ (1 << 6)
#define RISCV_HWPROBE_KEY_CPUPERF_0 5
#define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
#define RISCV_HWPROBE_MISALIGNED_EMULATED (1 << 0)
@@ -36,6 +37,7 @@ struct riscv_hwprobe {
#define RISCV_HWPROBE_MISALIGNED_FAST (3 << 0)
#define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
#define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
+#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
#endif
diff --git a/arch/riscv/kernel/sys_riscv.c b/arch/riscv/kernel/sys_riscv.c
index 26ef5526bfb4..d17cb5b4945b 100644
--- a/arch/riscv/kernel/sys_riscv.c
+++ b/arch/riscv/kernel/sys_riscv.c
@@ -145,26 +145,38 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair,
for_each_cpu(cpu, cpus) {
struct riscv_isainfo *isainfo = &hart_isa[cpu];
- if (riscv_isa_extension_available(isainfo->isa, ZBA))
- pair->value |= RISCV_HWPROBE_EXT_ZBA;
- else
- missing |= RISCV_HWPROBE_EXT_ZBA;
-
- if (riscv_isa_extension_available(isainfo->isa, ZBB))
- pair->value |= RISCV_HWPROBE_EXT_ZBB;
- else
- missing |= RISCV_HWPROBE_EXT_ZBB;
-
- if (riscv_isa_extension_available(isainfo->isa, ZBS))
- pair->value |= RISCV_HWPROBE_EXT_ZBS;
- else
- missing |= RISCV_HWPROBE_EXT_ZBS;
+#define EXT_KEY(ext) \
+ do { \
+ if (__riscv_isa_extension_available(isainfo->isa, RISCV_ISA_EXT_##ext)) \
+ pair->value |= RISCV_HWPROBE_EXT_##ext; \
+ else \
+ missing |= RISCV_HWPROBE_EXT_##ext; \
+ } while (false)
+
+ /*
+ * Only use EXT_KEY() for extensions which can be exposed to userspace,
+ * regardless of the kernel's configuration, as no other checks, besides
+ * presence in the hart_isa bitmap, are made.
+ */
+ EXT_KEY(ZBA);
+ EXT_KEY(ZBB);
+ EXT_KEY(ZBS);
+ EXT_KEY(ZICBOZ);
+#undef EXT_KEY
}
/* Now turn off reporting features if any CPU is missing it. */
pair->value &= ~missing;
}
+static bool hwprobe_ext0_has(const struct cpumask *cpus, unsigned long ext)
+{
+ struct riscv_hwprobe pair;
+
+ hwprobe_isa_ext0(&pair, cpus);
+ return (pair.value & ext);
+}
+
static u64 hwprobe_misaligned(const struct cpumask *cpus)
{
int cpu;
@@ -215,6 +227,12 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair,
pair->value = hwprobe_misaligned(cpus);
break;
+ case RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE:
+ pair->value = 0;
+ if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOZ))
+ pair->value = riscv_cboz_block_size;
+ break;
+
/*
* For forward compatibility, unknown keys don't fail the whole
* call, but get their element key set to -1 and value set to 0
--
2.41.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 3/6] RISC-V: hwprobe: Expose Zicboz extension and its block size
2023-08-30 16:49 ` [PATCH v2 3/6] RISC-V: hwprobe: Expose Zicboz extension and its block size Andrew Jones
@ 2023-08-31 16:19 ` Conor Dooley
0 siblings, 0 replies; 15+ messages in thread
From: Conor Dooley @ 2023-08-31 16:19 UTC (permalink / raw)
To: Andrew Jones
Cc: linux-riscv, paul.walmsley, palmer, aou, evan, conor.dooley, apatel
[-- Attachment #1.1: Type: text/plain, Size: 5715 bytes --]
On Wed, Aug 30, 2023 at 06:49:58PM +0200, Andrew Jones wrote:
> Expose Zicboz through hwprobe and also provide a key to extract its
> respective block size. Opportunistically add a macro and apply it to
> current extensions in order to avoid duplicating code.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> Reviewed-by: Evan Green <evan@rivosinc.com>
> ---
> Documentation/riscv/hwprobe.rst | 6 ++++
> arch/riscv/include/asm/hwprobe.h | 2 +-
> arch/riscv/include/uapi/asm/hwprobe.h | 2 ++
> arch/riscv/kernel/sys_riscv.c | 46 +++++++++++++++++++--------
> 4 files changed, 41 insertions(+), 15 deletions(-)
>
> diff --git a/Documentation/riscv/hwprobe.rst b/Documentation/riscv/hwprobe.rst
> index 933c715065d6..6a17c2872660 100644
> --- a/Documentation/riscv/hwprobe.rst
> +++ b/Documentation/riscv/hwprobe.rst
> @@ -77,6 +77,9 @@ The following keys are defined:
> * :c:macro:`RISCV_HWPROBE_EXT_ZBS`: The Zbs extension is supported, as defined
> in version 1.0 of the Bit-Manipulation ISA extensions.
>
> + * :c:macro:`RISCV_HWPROBE_EXT_ZICBOZ`: The Zicboz extension is supported, as
> + ratified in commit 3dd606f ("Create cmobase-v1.0.pdf") of riscv-CMOs.
> +
> * :c:macro:`RISCV_HWPROBE_KEY_CPUPERF_0`: A bitmask that contains performance
> information about the selected set of processors.
>
> @@ -97,3 +100,6 @@ The following keys are defined:
>
> * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNSUPPORTED`: Misaligned accesses are
> not supported at all and will generate a misaligned address fault.
> +
> +* :c:macro:`RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE`: An unsigned int which
> + represents the size of the Zicboz block in bytes.
> diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hwprobe.h
> index 78936f4ff513..39df8604fea1 100644
> --- a/arch/riscv/include/asm/hwprobe.h
> +++ b/arch/riscv/include/asm/hwprobe.h
> @@ -8,6 +8,6 @@
>
> #include <uapi/asm/hwprobe.h>
>
> -#define RISCV_HWPROBE_MAX_KEY 5
> +#define RISCV_HWPROBE_MAX_KEY 6
>
> #endif
> diff --git a/arch/riscv/include/uapi/asm/hwprobe.h b/arch/riscv/include/uapi/asm/hwprobe.h
> index 006bfb48343d..86d08a0e617b 100644
> --- a/arch/riscv/include/uapi/asm/hwprobe.h
> +++ b/arch/riscv/include/uapi/asm/hwprobe.h
> @@ -29,6 +29,7 @@ struct riscv_hwprobe {
> #define RISCV_HWPROBE_EXT_ZBA (1 << 3)
> #define RISCV_HWPROBE_EXT_ZBB (1 << 4)
> #define RISCV_HWPROBE_EXT_ZBS (1 << 5)
> +#define RISCV_HWPROBE_EXT_ZICBOZ (1 << 6)
> #define RISCV_HWPROBE_KEY_CPUPERF_0 5
> #define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
> #define RISCV_HWPROBE_MISALIGNED_EMULATED (1 << 0)
> @@ -36,6 +37,7 @@ struct riscv_hwprobe {
> #define RISCV_HWPROBE_MISALIGNED_FAST (3 << 0)
> #define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
> #define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
> +#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
> /* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
>
> #endif
> diff --git a/arch/riscv/kernel/sys_riscv.c b/arch/riscv/kernel/sys_riscv.c
> index 26ef5526bfb4..d17cb5b4945b 100644
> --- a/arch/riscv/kernel/sys_riscv.c
> +++ b/arch/riscv/kernel/sys_riscv.c
> @@ -145,26 +145,38 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair,
> for_each_cpu(cpu, cpus) {
> struct riscv_isainfo *isainfo = &hart_isa[cpu];
>
> - if (riscv_isa_extension_available(isainfo->isa, ZBA))
> - pair->value |= RISCV_HWPROBE_EXT_ZBA;
> - else
> - missing |= RISCV_HWPROBE_EXT_ZBA;
> -
> - if (riscv_isa_extension_available(isainfo->isa, ZBB))
> - pair->value |= RISCV_HWPROBE_EXT_ZBB;
> - else
> - missing |= RISCV_HWPROBE_EXT_ZBB;
> -
> - if (riscv_isa_extension_available(isainfo->isa, ZBS))
> - pair->value |= RISCV_HWPROBE_EXT_ZBS;
> - else
> - missing |= RISCV_HWPROBE_EXT_ZBS;
> +#define EXT_KEY(ext) \
> + do { \
> + if (__riscv_isa_extension_available(isainfo->isa, RISCV_ISA_EXT_##ext)) \
> + pair->value |= RISCV_HWPROBE_EXT_##ext; \
> + else \
> + missing |= RISCV_HWPROBE_EXT_##ext; \
> + } while (false)
> +
> + /*
> + * Only use EXT_KEY() for extensions which can be exposed to userspace,
> + * regardless of the kernel's configuration, as no other checks, besides
> + * presence in the hart_isa bitmap, are made.
Thanks for adding the comment.
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Thanks,
Conor.
> + */
> + EXT_KEY(ZBA);
> + EXT_KEY(ZBB);
> + EXT_KEY(ZBS);
> + EXT_KEY(ZICBOZ);
> +#undef EXT_KEY
> }
>
> /* Now turn off reporting features if any CPU is missing it. */
> pair->value &= ~missing;
> }
>
> +static bool hwprobe_ext0_has(const struct cpumask *cpus, unsigned long ext)
> +{
> + struct riscv_hwprobe pair;
> +
> + hwprobe_isa_ext0(&pair, cpus);
> + return (pair.value & ext);
> +}
> +
> static u64 hwprobe_misaligned(const struct cpumask *cpus)
> {
> int cpu;
> @@ -215,6 +227,12 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair,
> pair->value = hwprobe_misaligned(cpus);
> break;
>
> + case RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE:
> + pair->value = 0;
> + if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOZ))
> + pair->value = riscv_cboz_block_size;
> + break;
> +
> /*
> * For forward compatibility, unknown keys don't fail the whole
> * call, but get their element key set to -1 and value set to 0
> --
> 2.41.0
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 4/6] RISC-V: selftests: Statically link hwprobe test
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
` (2 preceding siblings ...)
2023-08-30 16:49 ` [PATCH v2 3/6] RISC-V: hwprobe: Expose Zicboz extension and its block size Andrew Jones
@ 2023-08-30 16:49 ` Andrew Jones
2023-08-30 16:50 ` [PATCH v2 5/6] RISC-V: selftests: Convert hwprobe test to kselftest API Andrew Jones
` (2 subsequent siblings)
6 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:49 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
Statically linking makes it more convenient to copy the test to a
minimal busybox environment.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
---
tools/testing/selftests/riscv/hwprobe/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/riscv/hwprobe/Makefile b/tools/testing/selftests/riscv/hwprobe/Makefile
index ebdbb3c22e54..5f614c3ba598 100644
--- a/tools/testing/selftests/riscv/hwprobe/Makefile
+++ b/tools/testing/selftests/riscv/hwprobe/Makefile
@@ -7,4 +7,4 @@ TEST_GEN_PROGS := hwprobe
include ../../lib.mk
$(OUTPUT)/hwprobe: hwprobe.c sys_hwprobe.S
- $(CC) -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
--
2.41.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 5/6] RISC-V: selftests: Convert hwprobe test to kselftest API
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
` (3 preceding siblings ...)
2023-08-30 16:49 ` [PATCH v2 4/6] RISC-V: selftests: Statically link hwprobe test Andrew Jones
@ 2023-08-30 16:50 ` Andrew Jones
2023-08-30 16:50 ` [PATCH v2 6/6] RISC-V: selftests: Add CBO tests Andrew Jones
2023-08-30 16:52 ` [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
6 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:50 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
Returning (exiting with) negative exit codes isn't user friendly,
because the user must output the exit code with the shell, convert it
from its unsigned 8-bit value back to the negative value, and then
look up where that comes from in the code (which may be multiple
places). Use the kselftests TAP interface, instead.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
---
.../testing/selftests/riscv/hwprobe/hwprobe.c | 54 +++++++------------
1 file changed, 20 insertions(+), 34 deletions(-)
diff --git a/tools/testing/selftests/riscv/hwprobe/hwprobe.c b/tools/testing/selftests/riscv/hwprobe/hwprobe.c
index 09f290a67420..4f15f1f3b4c3 100644
--- a/tools/testing/selftests/riscv/hwprobe/hwprobe.c
+++ b/tools/testing/selftests/riscv/hwprobe/hwprobe.c
@@ -2,6 +2,8 @@
#include <stddef.h>
#include <asm/hwprobe.h>
+#include "../../kselftest.h"
+
/*
* Rather than relying on having a new enough libc to define this, just do it
* ourselves. This way we don't need to be coupled to a new-enough libc to
@@ -16,6 +18,9 @@ int main(int argc, char **argv)
unsigned long cpus;
long out;
+ ksft_print_header();
+ ksft_set_plan(5);
+
/* Fake the CPU_SET ops. */
cpus = -1;
@@ -25,13 +30,16 @@ int main(int argc, char **argv)
*/
for (long i = 0; i < 8; i++)
pairs[i].key = i;
+
out = riscv_hwprobe(pairs, 8, 1, &cpus, 0);
if (out != 0)
- return -1;
+ ksft_exit_fail_msg("hwprobe() failed with %ld\n", out);
+
for (long i = 0; i < 4; ++i) {
/* Fail if the kernel claims not to recognize a base key. */
if ((i < 4) && (pairs[i].key != i))
- return -2;
+ ksft_exit_fail_msg("Failed to recognize base key: key != i, "
+ "key=%ld, i=%ld\n", pairs[i].key, i);
if (pairs[i].key != RISCV_HWPROBE_KEY_BASE_BEHAVIOR)
continue;
@@ -39,52 +47,30 @@ int main(int argc, char **argv)
if (pairs[i].value & RISCV_HWPROBE_BASE_BEHAVIOR_IMA)
continue;
- return -3;
+ ksft_exit_fail_msg("Unexpected pair: (%ld, %ld)\n", pairs[i].key, pairs[i].value);
}
- /*
- * This should also work with a NULL CPU set, but should not work
- * with an improperly supplied CPU set.
- */
out = riscv_hwprobe(pairs, 8, 0, 0, 0);
- if (out != 0)
- return -4;
+ ksft_test_result(out == 0, "NULL CPU set\n");
out = riscv_hwprobe(pairs, 8, 0, &cpus, 0);
- if (out == 0)
- return -5;
+ ksft_test_result(out != 0, "Bad CPU set\n");
out = riscv_hwprobe(pairs, 8, 1, 0, 0);
- if (out == 0)
- return -6;
+ ksft_test_result(out != 0, "NULL CPU set with non-zero count\n");
- /*
- * Check that keys work by providing one that we know exists, and
- * checking to make sure the resultig pair is what we asked for.
- */
pairs[0].key = RISCV_HWPROBE_KEY_BASE_BEHAVIOR;
out = riscv_hwprobe(pairs, 1, 1, &cpus, 0);
- if (out != 0)
- return -7;
- if (pairs[0].key != RISCV_HWPROBE_KEY_BASE_BEHAVIOR)
- return -8;
+ ksft_test_result(out == 0 && pairs[0].key == RISCV_HWPROBE_KEY_BASE_BEHAVIOR,
+ "Existing key is maintained\n");
- /*
- * Check that an unknown key gets overwritten with -1,
- * but doesn't block elements after it.
- */
pairs[0].key = 0x5555;
pairs[1].key = 1;
pairs[1].value = 0xAAAA;
out = riscv_hwprobe(pairs, 2, 0, 0, 0);
- if (out != 0)
- return -9;
-
- if (pairs[0].key != -1)
- return -10;
-
- if ((pairs[1].key != 1) || (pairs[1].value == 0xAAAA))
- return -11;
+ ksft_test_result(out == 0 && pairs[0].key == -1 &&
+ pairs[1].key == 1 && pairs[1].value != 0xAAAA,
+ "Unknown key overwritten with -1 and doesn't block other elements\n");
- return 0;
+ ksft_finished();
}
--
2.41.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 6/6] RISC-V: selftests: Add CBO tests
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
` (4 preceding siblings ...)
2023-08-30 16:50 ` [PATCH v2 5/6] RISC-V: selftests: Convert hwprobe test to kselftest API Andrew Jones
@ 2023-08-30 16:50 ` Andrew Jones
2023-09-01 9:37 ` Wang, Xiao W
2023-08-30 16:52 ` [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
6 siblings, 1 reply; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:50 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
Add hwprobe test for Zicboz and its block size. Also, when Zicboz is
present, test that cbo.zero may be issued and works. Additionally
test that the Zicbom instructions cause SIGILL and also that cbo.zero
causes SIGILL when Zicboz is not present. Pinning the test to a subset
of cpus with taskset will also restrict the hwprobe calls to that set.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
---
.../testing/selftests/riscv/hwprobe/Makefile | 7 +-
tools/testing/selftests/riscv/hwprobe/cbo.c | 162 ++++++++++++++++++
.../testing/selftests/riscv/hwprobe/hwprobe.c | 12 +-
.../testing/selftests/riscv/hwprobe/hwprobe.h | 15 ++
4 files changed, 184 insertions(+), 12 deletions(-)
create mode 100644 tools/testing/selftests/riscv/hwprobe/cbo.c
create mode 100644 tools/testing/selftests/riscv/hwprobe/hwprobe.h
diff --git a/tools/testing/selftests/riscv/hwprobe/Makefile b/tools/testing/selftests/riscv/hwprobe/Makefile
index 5f614c3ba598..f224b84591fb 100644
--- a/tools/testing/selftests/riscv/hwprobe/Makefile
+++ b/tools/testing/selftests/riscv/hwprobe/Makefile
@@ -2,9 +2,14 @@
# Copyright (C) 2021 ARM Limited
# Originally tools/testing/arm64/abi/Makefile
-TEST_GEN_PROGS := hwprobe
+CFLAGS += -I$(top_srcdir)/tools/include
+
+TEST_GEN_PROGS := hwprobe cbo
include ../../lib.mk
$(OUTPUT)/hwprobe: hwprobe.c sys_hwprobe.S
$(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+
+$(OUTPUT)/cbo: cbo.c sys_hwprobe.S
+ $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
diff --git a/tools/testing/selftests/riscv/hwprobe/cbo.c b/tools/testing/selftests/riscv/hwprobe/cbo.c
new file mode 100644
index 000000000000..920abfaa10c2
--- /dev/null
+++ b/tools/testing/selftests/riscv/hwprobe/cbo.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2023 Ventana Micro Systems Inc.
+ *
+ * Run with 'taskset -c <cpu-list> cbo' to only execute hwprobe on a
+ * subset of cpus, as well as only executing the tests on those cpus.
+ */
+#define _GNU_SOURCE
+#include <stdbool.h>
+#include <stdint.h>
+#include <sched.h>
+#include <signal.h>
+#include <assert.h>
+#include <linux/compiler.h>
+#include <asm/ucontext.h>
+
+#include "hwprobe.h"
+#include "../../kselftest.h"
+
+static char mem[4096] __aligned(4096) = { [0 ... 4095] = 0xa5 };
+
+static bool illegal_insn;
+
+static void sigill_handler(int sig, siginfo_t *info, void *context)
+{
+ unsigned long *regs = (unsigned long *)&((ucontext_t *)context)->uc_mcontext;
+ uint32_t insn = *(uint32_t *)regs[0];
+
+ assert(insn >> 20 == regs[11] &&
+ (insn & ((1 << 20) - 1)) == (10 << 15 | 2 << 12 | 0 << 7 | 15));
+
+ illegal_insn = true;
+ regs[0] += 4;
+}
+
+static void cbo_insn(int fn, char *base)
+{
+ asm volatile(
+ "mv a0, %0\n"
+ "li a1, %1\n"
+ ".4byte %1 << 20 | 10 << 15 | 2 << 12 | 0 << 7 | 15\n"
+ : : "r" (base), "i" (fn) : "a0", "a1", "memory");
+}
+
+static void cbo_inval(char *base) { cbo_insn(0, base); }
+static void cbo_clean(char *base) { cbo_insn(1, base); }
+static void cbo_flush(char *base) { cbo_insn(2, base); }
+static void cbo_zero(char *base) { cbo_insn(4, base); }
+
+static void test_no_zicbom(void)
+{
+ illegal_insn = false;
+ cbo_clean(&mem[0]);
+ ksft_test_result(illegal_insn, "No cbo.clean\n");
+
+ illegal_insn = false;
+ cbo_flush(&mem[0]);
+ ksft_test_result(illegal_insn, "No cbo.flush\n");
+
+ illegal_insn = false;
+ cbo_inval(&mem[0]);
+ ksft_test_result(illegal_insn, "No cbo.inval\n");
+}
+
+static void test_no_zicboz(void)
+{
+ illegal_insn = false;
+ cbo_clean(&mem[0]);
+ ksft_test_result(illegal_insn, "No cbo.zero\n");
+}
+
+static bool is_power_of_2(__u64 n)
+{
+ return n != 0 && (n & (n - 1)) == 0;
+}
+
+static void test_zicboz(__u64 block_size)
+{
+ int i, j;
+
+ illegal_insn = false;
+ cbo_zero(&mem[block_size]);
+ ksft_test_result(!illegal_insn, "cbo.zero\n");
+
+ if (!is_power_of_2(block_size)) {
+ ksft_test_result_skip("cbo.zero check\n");
+ return;
+ }
+
+ assert(block_size <= 1024);
+
+ for (i = 0; i < 4096 / block_size; ++i) {
+ if (i % 2)
+ cbo_zero(&mem[i * block_size]);
+ }
+
+ for (i = 0; i < 4096 / block_size; ++i) {
+ char expected = i % 2 ? 0x0 : 0xa5;
+
+ for (j = 0; j < block_size; ++j) {
+ if (mem[i * block_size + j] != expected) {
+ ksft_test_result_fail("cbo.zero check\n");
+ ksft_print_msg("cbo.zero check: mem[%d] != 0x%x\n",
+ i * block_size + j, expected);
+ return;
+ }
+ }
+ }
+
+ ksft_test_result_pass("cbo.zero check\n");
+}
+
+int main(int argc, char **argv)
+{
+ struct sigaction act = {
+ .sa_sigaction = &sigill_handler,
+ .sa_flags = SA_SIGINFO,
+ };
+ bool has_zicboz = false;
+ struct riscv_hwprobe pair;
+ cpu_set_t cpus;
+ size_t nr_cpus;
+ long rc;
+
+ rc = sigaction(SIGILL, &act, NULL);
+ assert(rc == 0);
+
+ rc = sched_getaffinity(0, sizeof(cpu_set_t), &cpus);
+ assert(rc == 0);
+ nr_cpus = CPU_COUNT(&cpus);
+
+ ksft_print_header();
+
+ pair.key = RISCV_HWPROBE_KEY_IMA_EXT_0;
+ rc = riscv_hwprobe(&pair, 1, nr_cpus, (unsigned long *)&cpus, 0);
+ if (rc < 0)
+ ksft_exit_fail_msg("hwprobe() failed with %d\n", rc);
+
+ if (pair.key != -1 && (pair.value & RISCV_HWPROBE_EXT_ZICBOZ)) {
+ has_zicboz = true;
+ ksft_set_plan(6);
+ } else {
+ ksft_print_msg("No Zicboz, testing cbo.zero remains privileged\n");
+ ksft_set_plan(4);
+ }
+
+ /* Ensure zicbom instructions remain privileged */
+ test_no_zicbom();
+
+ if (has_zicboz) {
+ pair.key = RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE;
+ rc = riscv_hwprobe(&pair, 1, nr_cpus, (unsigned long *)&cpus, 0);
+ ksft_test_result(rc == 0 && pair.key == RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE &&
+ is_power_of_2(pair.value), "Zicboz block size\n");
+ ksft_print_msg("Zicboz block size: %ld\n", pair.value);
+ test_zicboz(pair.value);
+ } else {
+ test_no_zicboz();
+ }
+
+ ksft_finished();
+}
diff --git a/tools/testing/selftests/riscv/hwprobe/hwprobe.c b/tools/testing/selftests/riscv/hwprobe/hwprobe.c
index 4f15f1f3b4c3..c474891df307 100644
--- a/tools/testing/selftests/riscv/hwprobe/hwprobe.c
+++ b/tools/testing/selftests/riscv/hwprobe/hwprobe.c
@@ -1,17 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
-#include <stddef.h>
-#include <asm/hwprobe.h>
-
+#include "hwprobe.h"
#include "../../kselftest.h"
-/*
- * Rather than relying on having a new enough libc to define this, just do it
- * ourselves. This way we don't need to be coupled to a new-enough libc to
- * contain the call.
- */
-long riscv_hwprobe(struct riscv_hwprobe *pairs, size_t pair_count,
- size_t cpu_count, unsigned long *cpus, unsigned int flags);
-
int main(int argc, char **argv)
{
struct riscv_hwprobe pairs[8];
diff --git a/tools/testing/selftests/riscv/hwprobe/hwprobe.h b/tools/testing/selftests/riscv/hwprobe/hwprobe.h
new file mode 100644
index 000000000000..721b0ce73a56
--- /dev/null
+++ b/tools/testing/selftests/riscv/hwprobe/hwprobe.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef SELFTEST_RISCV_HWPROBE_H
+#define SELFTEST_RISCV_HWPROBE_H
+#include <stddef.h>
+#include <asm/hwprobe.h>
+
+/*
+ * Rather than relying on having a new enough libc to define this, just do it
+ * ourselves. This way we don't need to be coupled to a new-enough libc to
+ * contain the call.
+ */
+long riscv_hwprobe(struct riscv_hwprobe *pairs, size_t pair_count,
+ size_t cpu_count, unsigned long *cpus, unsigned int flags);
+
+#endif
--
2.41.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 15+ messages in thread
* RE: [PATCH v2 6/6] RISC-V: selftests: Add CBO tests
2023-08-30 16:50 ` [PATCH v2 6/6] RISC-V: selftests: Add CBO tests Andrew Jones
@ 2023-09-01 9:37 ` Wang, Xiao W
2023-09-01 15:12 ` Andrew Jones
0 siblings, 1 reply; 15+ messages in thread
From: Wang, Xiao W @ 2023-09-01 9:37 UTC (permalink / raw)
To: Andrew Jones, linux-riscv
Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
Hi,
> -----Original Message-----
> From: linux-riscv <linux-riscv-bounces@lists.infradead.org> On Behalf Of
> Andrew Jones
> Sent: Thursday, August 31, 2023 12:50 AM
> To: linux-riscv@lists.infradead.org
> Cc: paul.walmsley@sifive.com; palmer@dabbelt.com;
> aou@eecs.berkeley.edu; evan@rivosinc.com; conor.dooley@microchip.com;
> apatel@ventanamicro.com
> Subject: [PATCH v2 6/6] RISC-V: selftests: Add CBO tests
>
> Add hwprobe test for Zicboz and its block size. Also, when Zicboz is
> present, test that cbo.zero may be issued and works. Additionally
> test that the Zicbom instructions cause SIGILL and also that cbo.zero
> causes SIGILL when Zicboz is not present. Pinning the test to a subset
> of cpus with taskset will also restrict the hwprobe calls to that set.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
> .../testing/selftests/riscv/hwprobe/Makefile | 7 +-
> tools/testing/selftests/riscv/hwprobe/cbo.c | 162 ++++++++++++++++++
> .../testing/selftests/riscv/hwprobe/hwprobe.c | 12 +-
> .../testing/selftests/riscv/hwprobe/hwprobe.h | 15 ++
> 4 files changed, 184 insertions(+), 12 deletions(-)
> create mode 100644 tools/testing/selftests/riscv/hwprobe/cbo.c
> create mode 100644 tools/testing/selftests/riscv/hwprobe/hwprobe.h
>
> diff --git a/tools/testing/selftests/riscv/hwprobe/Makefile
> b/tools/testing/selftests/riscv/hwprobe/Makefile
> index 5f614c3ba598..f224b84591fb 100644
> --- a/tools/testing/selftests/riscv/hwprobe/Makefile
> +++ b/tools/testing/selftests/riscv/hwprobe/Makefile
> @@ -2,9 +2,14 @@
> # Copyright (C) 2021 ARM Limited
> # Originally tools/testing/arm64/abi/Makefile
>
> -TEST_GEN_PROGS := hwprobe
> +CFLAGS += -I$(top_srcdir)/tools/include
> +
> +TEST_GEN_PROGS := hwprobe cbo
>
> include ../../lib.mk
>
> $(OUTPUT)/hwprobe: hwprobe.c sys_hwprobe.S
> $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
> +
> +$(OUTPUT)/cbo: cbo.c sys_hwprobe.S
> + $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
> diff --git a/tools/testing/selftests/riscv/hwprobe/cbo.c
> b/tools/testing/selftests/riscv/hwprobe/cbo.c
> new file mode 100644
> index 000000000000..920abfaa10c2
> --- /dev/null
> +++ b/tools/testing/selftests/riscv/hwprobe/cbo.c
> @@ -0,0 +1,162 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2023 Ventana Micro Systems Inc.
> + *
> + * Run with 'taskset -c <cpu-list> cbo' to only execute hwprobe on a
> + * subset of cpus, as well as only executing the tests on those cpus.
> + */
> +#define _GNU_SOURCE
> +#include <stdbool.h>
> +#include <stdint.h>
> +#include <sched.h>
> +#include <signal.h>
> +#include <assert.h>
> +#include <linux/compiler.h>
> +#include <asm/ucontext.h>
> +
> +#include "hwprobe.h"
> +#include "../../kselftest.h"
> +
> +static char mem[4096] __aligned(4096) = { [0 ... 4095] = 0xa5 };
> +
> +static bool illegal_insn;
> +
> +static void sigill_handler(int sig, siginfo_t *info, void *context)
> +{
> + unsigned long *regs = (unsigned long *)&((ucontext_t *)context)-
> >uc_mcontext;
> + uint32_t insn = *(uint32_t *)regs[0];
> +
> + assert(insn >> 20 == regs[11] &&
> + (insn & ((1 << 20) - 1)) == (10 << 15 | 2 << 12 | 0 << 7 | 15));
> +
> + illegal_insn = true;
> + regs[0] += 4;
> +}
> +
> +static void cbo_insn(int fn, char *base)
> +{
> + asm volatile(
> + "mv a0, %0\n"
> + "li a1, %1\n"
> + ".4byte %1 << 20 | 10 << 15 | 2 << 12 | 0 << 7 | 15\n"
> + : : "r" (base), "i" (fn) : "a0", "a1", "memory");
> +}
> +
> +static void cbo_inval(char *base) { cbo_insn(0, base); }
> +static void cbo_clean(char *base) { cbo_insn(1, base); }
> +static void cbo_flush(char *base) { cbo_insn(2, base); }
> +static void cbo_zero(char *base) { cbo_insn(4, base); }
> +
> +static void test_no_zicbom(void)
> +{
> + illegal_insn = false;
> + cbo_clean(&mem[0]);
> + ksft_test_result(illegal_insn, "No cbo.clean\n");
> +
> + illegal_insn = false;
> + cbo_flush(&mem[0]);
> + ksft_test_result(illegal_insn, "No cbo.flush\n");
> +
> + illegal_insn = false;
> + cbo_inval(&mem[0]);
> + ksft_test_result(illegal_insn, "No cbo.inval\n");
> +}
> +
> +static void test_no_zicboz(void)
> +{
> + illegal_insn = false;
> + cbo_clean(&mem[0]);
Seems we need to call cbo_zero() instead of cbo_clean().
BRs,
Xiao
> + ksft_test_result(illegal_insn, "No cbo.zero\n");
> +}
> +
[...]
>
>
> _______________________________________________
> 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] 15+ messages in thread
* Re: [PATCH v2 6/6] RISC-V: selftests: Add CBO tests
2023-09-01 9:37 ` Wang, Xiao W
@ 2023-09-01 15:12 ` Andrew Jones
0 siblings, 0 replies; 15+ messages in thread
From: Andrew Jones @ 2023-09-01 15:12 UTC (permalink / raw)
To: Wang, Xiao W
Cc: linux-riscv, paul.walmsley, palmer, aou, evan, conor.dooley, apatel
On Fri, Sep 01, 2023 at 09:37:27AM +0000, Wang, Xiao W wrote:
> Hi,
>
> > -----Original Message-----
> > From: linux-riscv <linux-riscv-bounces@lists.infradead.org> On Behalf Of
> > Andrew Jones
> > Sent: Thursday, August 31, 2023 12:50 AM
> > To: linux-riscv@lists.infradead.org
> > Cc: paul.walmsley@sifive.com; palmer@dabbelt.com;
> > aou@eecs.berkeley.edu; evan@rivosinc.com; conor.dooley@microchip.com;
> > apatel@ventanamicro.com
> > Subject: [PATCH v2 6/6] RISC-V: selftests: Add CBO tests
> >
> > Add hwprobe test for Zicboz and its block size. Also, when Zicboz is
> > present, test that cbo.zero may be issued and works. Additionally
> > test that the Zicbom instructions cause SIGILL and also that cbo.zero
> > causes SIGILL when Zicboz is not present. Pinning the test to a subset
> > of cpus with taskset will also restrict the hwprobe calls to that set.
> >
> > Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> > ---
> > .../testing/selftests/riscv/hwprobe/Makefile | 7 +-
> > tools/testing/selftests/riscv/hwprobe/cbo.c | 162 ++++++++++++++++++
> > .../testing/selftests/riscv/hwprobe/hwprobe.c | 12 +-
> > .../testing/selftests/riscv/hwprobe/hwprobe.h | 15 ++
> > 4 files changed, 184 insertions(+), 12 deletions(-)
> > create mode 100644 tools/testing/selftests/riscv/hwprobe/cbo.c
> > create mode 100644 tools/testing/selftests/riscv/hwprobe/hwprobe.h
> >
> > diff --git a/tools/testing/selftests/riscv/hwprobe/Makefile
> > b/tools/testing/selftests/riscv/hwprobe/Makefile
> > index 5f614c3ba598..f224b84591fb 100644
> > --- a/tools/testing/selftests/riscv/hwprobe/Makefile
> > +++ b/tools/testing/selftests/riscv/hwprobe/Makefile
> > @@ -2,9 +2,14 @@
> > # Copyright (C) 2021 ARM Limited
> > # Originally tools/testing/arm64/abi/Makefile
> >
> > -TEST_GEN_PROGS := hwprobe
> > +CFLAGS += -I$(top_srcdir)/tools/include
> > +
> > +TEST_GEN_PROGS := hwprobe cbo
> >
> > include ../../lib.mk
> >
> > $(OUTPUT)/hwprobe: hwprobe.c sys_hwprobe.S
> > $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
> > +
> > +$(OUTPUT)/cbo: cbo.c sys_hwprobe.S
> > + $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
> > diff --git a/tools/testing/selftests/riscv/hwprobe/cbo.c
> > b/tools/testing/selftests/riscv/hwprobe/cbo.c
> > new file mode 100644
> > index 000000000000..920abfaa10c2
> > --- /dev/null
> > +++ b/tools/testing/selftests/riscv/hwprobe/cbo.c
> > @@ -0,0 +1,162 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Copyright (c) 2023 Ventana Micro Systems Inc.
> > + *
> > + * Run with 'taskset -c <cpu-list> cbo' to only execute hwprobe on a
> > + * subset of cpus, as well as only executing the tests on those cpus.
> > + */
> > +#define _GNU_SOURCE
> > +#include <stdbool.h>
> > +#include <stdint.h>
> > +#include <sched.h>
> > +#include <signal.h>
> > +#include <assert.h>
> > +#include <linux/compiler.h>
> > +#include <asm/ucontext.h>
> > +
> > +#include "hwprobe.h"
> > +#include "../../kselftest.h"
> > +
> > +static char mem[4096] __aligned(4096) = { [0 ... 4095] = 0xa5 };
> > +
> > +static bool illegal_insn;
> > +
> > +static void sigill_handler(int sig, siginfo_t *info, void *context)
> > +{
> > + unsigned long *regs = (unsigned long *)&((ucontext_t *)context)-
> > >uc_mcontext;
> > + uint32_t insn = *(uint32_t *)regs[0];
> > +
> > + assert(insn >> 20 == regs[11] &&
> > + (insn & ((1 << 20) - 1)) == (10 << 15 | 2 << 12 | 0 << 7 | 15));
> > +
> > + illegal_insn = true;
> > + regs[0] += 4;
> > +}
> > +
> > +static void cbo_insn(int fn, char *base)
> > +{
> > + asm volatile(
> > + "mv a0, %0\n"
> > + "li a1, %1\n"
> > + ".4byte %1 << 20 | 10 << 15 | 2 << 12 | 0 << 7 | 15\n"
> > + : : "r" (base), "i" (fn) : "a0", "a1", "memory");
> > +}
> > +
> > +static void cbo_inval(char *base) { cbo_insn(0, base); }
> > +static void cbo_clean(char *base) { cbo_insn(1, base); }
> > +static void cbo_flush(char *base) { cbo_insn(2, base); }
> > +static void cbo_zero(char *base) { cbo_insn(4, base); }
> > +
> > +static void test_no_zicbom(void)
> > +{
> > + illegal_insn = false;
> > + cbo_clean(&mem[0]);
> > + ksft_test_result(illegal_insn, "No cbo.clean\n");
> > +
> > + illegal_insn = false;
> > + cbo_flush(&mem[0]);
> > + ksft_test_result(illegal_insn, "No cbo.flush\n");
> > +
> > + illegal_insn = false;
> > + cbo_inval(&mem[0]);
> > + ksft_test_result(illegal_insn, "No cbo.inval\n");
> > +}
> > +
> > +static void test_no_zicboz(void)
> > +{
> > + illegal_insn = false;
> > + cbo_clean(&mem[0]);
>
> Seems we need to call cbo_zero() instead of cbo_clean().
Nice catch, Xiao. Copy+paste mistake... Will fix for v3.
Thanks,
drew
>
> BRs,
> Xiao
>
> > + ksft_test_result(illegal_insn, "No cbo.zero\n");
> > +}
> > +
> [...]
> >
> >
> > _______________________________________________
> > 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] 15+ messages in thread
* Re: [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode
2023-08-30 16:49 [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
` (5 preceding siblings ...)
2023-08-30 16:50 ` [PATCH v2 6/6] RISC-V: selftests: Add CBO tests Andrew Jones
@ 2023-08-30 16:52 ` Andrew Jones
2023-08-30 20:28 ` Palmer Dabbelt
6 siblings, 1 reply; 15+ messages in thread
From: Andrew Jones @ 2023-08-30 16:52 UTC (permalink / raw)
To: linux-riscv; +Cc: paul.walmsley, palmer, aou, evan, conor.dooley, apatel
On Wed, Aug 30, 2023 at 06:49:55PM +0200, Andrew Jones wrote:
> In order for usermode to issue cbo.zero, it needs privilege granted to
> issue the extension instruction (patch 2) and to know that the extension
> is available and its block size (patch 3). Patch 1 could be separate from
> this series (it just fixes up some error messages), patches 4-5 convert
> the hwprobe selftest to a statically-linked, TAP test and patch 6 adds a
> new hwprobe test for the new information as well as testing CBO
> instructions can or cannot be issued as appropriate.
>
> Thanks,
> drew
>
> v2:
> - fixed build of the vector selftest
for-next also needs commit 25696067202f ("selftests: riscv: Fix
compilation error with vstate_exec_nolibc.c") in order for the vector
selftest to build.
Thanks,
drew
> - changed this-cpu wrappers to just cpu wrappers and then pass
> smp_processor_id() at the callsite
> - added comment to EXT_KEY macro
> - picked up a couple r-b's
>
> Andrew Jones (6):
> RISC-V: Make zicbom/zicboz errors consistent
> RISC-V: Enable cbo.zero in usermode
> RISC-V: hwprobe: Expose Zicboz extension and its block size
> RISC-V: selftests: Statically link hwprobe test
> RISC-V: selftests: Convert hwprobe test to kselftest API
> RISC-V: selftests: Add CBO tests
>
> Documentation/riscv/hwprobe.rst | 6 +
> arch/riscv/include/asm/cpufeature.h | 2 +
> arch/riscv/include/asm/csr.h | 1 +
> arch/riscv/include/asm/hwcap.h | 16 ++
> arch/riscv/include/asm/hwprobe.h | 2 +-
> arch/riscv/include/uapi/asm/hwprobe.h | 2 +
> arch/riscv/kernel/cpufeature.c | 10 +-
> arch/riscv/kernel/setup.c | 4 +
> arch/riscv/kernel/smpboot.c | 4 +
> arch/riscv/kernel/sys_riscv.c | 46 +++--
> .../testing/selftests/riscv/hwprobe/Makefile | 9 +-
> tools/testing/selftests/riscv/hwprobe/cbo.c | 162 ++++++++++++++++++
> .../testing/selftests/riscv/hwprobe/hwprobe.c | 64 +++----
> .../testing/selftests/riscv/hwprobe/hwprobe.h | 15 ++
> 14 files changed, 280 insertions(+), 63 deletions(-)
> create mode 100644 tools/testing/selftests/riscv/hwprobe/cbo.c
> create mode 100644 tools/testing/selftests/riscv/hwprobe/hwprobe.h
>
> --
> 2.41.0
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode
2023-08-30 16:52 ` [PATCH v2 0/6] RISC-V: Enable cbo.zero in usermode Andrew Jones
@ 2023-08-30 20:28 ` Palmer Dabbelt
0 siblings, 0 replies; 15+ messages in thread
From: Palmer Dabbelt @ 2023-08-30 20:28 UTC (permalink / raw)
To: ajones; +Cc: linux-riscv, Paul Walmsley, aou, Evan Green, Conor Dooley, apatel
On Wed, 30 Aug 2023 09:52:46 PDT (-0700), ajones@ventanamicro.com wrote:
> On Wed, Aug 30, 2023 at 06:49:55PM +0200, Andrew Jones wrote:
>> In order for usermode to issue cbo.zero, it needs privilege granted to
>> issue the extension instruction (patch 2) and to know that the extension
>> is available and its block size (patch 3). Patch 1 could be separate from
>> this series (it just fixes up some error messages), patches 4-5 convert
>> the hwprobe selftest to a statically-linked, TAP test and patch 6 adds a
>> new hwprobe test for the new information as well as testing CBO
>> instructions can or cannot be issued as appropriate.
>>
>> Thanks,
>> drew
>>
>> v2:
>> - fixed build of the vector selftest
>
> for-next also needs commit 25696067202f ("selftests: riscv: Fix
> compilation error with vstate_exec_nolibc.c") in order for the vector
> selftest to build.
Thanks. I'm going to hold off on this one for this week's PR and then
pick it up for next week, assuming no other issues crop up.
> Thanks,
> drew
>
>> - changed this-cpu wrappers to just cpu wrappers and then pass
>> smp_processor_id() at the callsite
>> - added comment to EXT_KEY macro
>> - picked up a couple r-b's
>>
>> Andrew Jones (6):
>> RISC-V: Make zicbom/zicboz errors consistent
>> RISC-V: Enable cbo.zero in usermode
>> RISC-V: hwprobe: Expose Zicboz extension and its block size
>> RISC-V: selftests: Statically link hwprobe test
>> RISC-V: selftests: Convert hwprobe test to kselftest API
>> RISC-V: selftests: Add CBO tests
>>
>> Documentation/riscv/hwprobe.rst | 6 +
>> arch/riscv/include/asm/cpufeature.h | 2 +
>> arch/riscv/include/asm/csr.h | 1 +
>> arch/riscv/include/asm/hwcap.h | 16 ++
>> arch/riscv/include/asm/hwprobe.h | 2 +-
>> arch/riscv/include/uapi/asm/hwprobe.h | 2 +
>> arch/riscv/kernel/cpufeature.c | 10 +-
>> arch/riscv/kernel/setup.c | 4 +
>> arch/riscv/kernel/smpboot.c | 4 +
>> arch/riscv/kernel/sys_riscv.c | 46 +++--
>> .../testing/selftests/riscv/hwprobe/Makefile | 9 +-
>> tools/testing/selftests/riscv/hwprobe/cbo.c | 162 ++++++++++++++++++
>> .../testing/selftests/riscv/hwprobe/hwprobe.c | 64 +++----
>> .../testing/selftests/riscv/hwprobe/hwprobe.h | 15 ++
>> 14 files changed, 280 insertions(+), 63 deletions(-)
>> create mode 100644 tools/testing/selftests/riscv/hwprobe/cbo.c
>> create mode 100644 tools/testing/selftests/riscv/hwprobe/hwprobe.h
>>
>> --
>> 2.41.0
>>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 15+ messages in thread