[PATCH v2 6/6] riscv: hwprobe: Report SiFive vector extensions only when available
Radim Krčmář
radim.krcmar at oss.qualcomm.com
Tue Nov 10 09:50:48 PST 2026
User-mode use of the SiFive vector extensions requires non-Off
sstatus.VS, which we set only when has_vector() (Zve32x on all harts).
Xsfvfnrclipxfqf and Xsfvfwmaccqqq also execute floating-point
instructions, which additionally require non-Off sstatus.FS and hence
has_fpu() (D on all harts).
hwprobe currently reports the extensions from the per-hart 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")
Reviewed-by: Andy Chiu <tchiu at tenstorrent.com>
Signed-off-by: Radim Krčmář <radim.krcmar at oss.qualcomm.com>
---
v2:
* slightly reworded commit message
* added r-b
---
.../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