[PATCH 6/6] riscv: hwprobe: Report SiFive vector extensions only when available
Radim Krčmář
radim.krcmar at oss.qualcomm.com
Tue Oct 6 00:53:03 PDT 2026
User-mode use of the SiFive vector extensions requires non-Off
sstatus.VS, which we set only when has_vector() (CONFIG_RISCV_ISA_V and
Zve32x on all harts). Xsfvfnrclipxfqf and Xsfvfwmaccqqq also execute
floating-point instructions, which additionally require non-Off
sstatus.FS and hence has_fpu(). hwprobe reports the extensions from the
per-hart vendor ISA bitmaps alone, so it can advertise extensions that
are always disabled in user-mode.
Report correct environment to user-mode.
Fixes: 1a6274f03534 ("riscv: hwprobe: Add SiFive vendor extension support and probe for xsfqmaccdod and xsfqmaccqoq")
Fixes: 1d91224394c9 ("riscv: hwprobe: Add SiFive xsfvfnrclipxfqf vendor extension")
Fixes: d9669e33c8fa ("riscv: hwprobe: Add SiFive xsfvfwmaccqqq vendor extension")
Signed-off-by: Radim Krčmář <radim.krcmar at oss.qualcomm.com>
---
Same as THeadVector, this could be optimized better.
.../kernel/vendor_extensions/sifive_hwprobe.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kernel/vendor_extensions/sifive_hwprobe.c b/arch/riscv/kernel/vendor_extensions/sifive_hwprobe.c
index 1f77f6309763..bcea4f7a81c4 100644
--- a/arch/riscv/kernel/vendor_extensions/sifive_hwprobe.c
+++ b/arch/riscv/kernel/vendor_extensions/sifive_hwprobe.c
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
+#include <asm/switch_to.h>
+#include <asm/vector.h>
#include <asm/vendor_extensions/sifive.h>
#include <asm/vendor_extensions/sifive_hwprobe.h>
#include <asm/vendor_extensions/vendor_hwprobe.h>
@@ -14,9 +16,13 @@ void hwprobe_isa_vendor_ext_sifive_0(struct riscv_hwprobe *pair, const struct cp
{
VENDOR_EXTENSION_SUPPORTED(pair, cpus,
riscv_isa_vendor_ext_list_sifive.per_hart_isa_bitmap, {
- VENDOR_EXT_KEY(XSFVQMACCDOD);
- VENDOR_EXT_KEY(XSFVQMACCQOQ);
- VENDOR_EXT_KEY(XSFVFNRCLIPXFQF);
- VENDOR_EXT_KEY(XSFVFWMACCQQQ);
+ if (has_vector()) {
+ VENDOR_EXT_KEY(XSFVQMACCDOD);
+ VENDOR_EXT_KEY(XSFVQMACCQOQ);
+ if (has_fpu()) {
+ VENDOR_EXT_KEY(XSFVFNRCLIPXFQF);
+ VENDOR_EXT_KEY(XSFVFWMACCQQQ);
+ }
+ }
});
}
--
2.55.0
More information about the linux-riscv
mailing list