[PATCH 1/3] RISC-V: Move the hwprobe interface description into a .def file
Kito Cheng <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
Extract the hwprobe key numbers and extension bits into
common/config/riscv/riscv-hwprobe.def, with the syscall wrapper in
riscv-hwprobe.h, so that the -march=native implementation can share the
description libgcc already needs.
gcc/ChangeLog:
* common/config/riscv/riscv-hwprobe.def: New file.
* common/config/riscv/riscv-hwprobe.h: New file.
libgcc/ChangeLog:
* config/riscv/feature_bits.c: Include
common/config/riscv/riscv-hwprobe.h, and drop the hwprobe key
numbers, extension bit positions, struct riscv_hwprobe and
syscall_5_args that moved there.
(__init_riscv_features_bits_linux): Set the extension bits from
riscv-hwprobe.def.
(__init_riscv_feature_bits): Add a declaration.
---
gcc/common/config/riscv/riscv-hwprobe.def | 146 ++++++++++++++++
gcc/common/config/riscv/riscv-hwprobe.h | 85 ++++++++++
libgcc/config/riscv/feature_bits.c | 194 +---------------------
3 files changed, 240 insertions(+), 185 deletions(-)
create mode 100644 gcc/common/config/riscv/riscv-hwprobe.def
create mode 100644 gcc/common/config/riscv/riscv-hwprobe.h
diff --git a/gcc/common/config/riscv/riscv-hwprobe.def b/gcc/common/config/riscv/riscv-hwprobe.def
new file mode 100644
index 00000000000..92eda025401
--- /dev/null
+++ b/gcc/common/config/riscv/riscv-hwprobe.def
@@ -0,0 +1,146 @@
+/* Description of the Linux riscv_hwprobe interface.
+
+ Copyright (C) 2026 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+/* This transcribes the part of <asm/hwprobe.h> that both the compiler and
+ libgcc need. It is a stable Linux ABI, transcribed rather than included
+ so that neither the driver nor libgcc depends on the kernel headers being
+ installed, or on a glibc new enough to provide <sys/hwprobe.h>.
+
+ The file is written to be read more than once. Before each #include,
+ define whichever of these macros you want:
+
+ RISCV_HWPROBE_KEY (NAME, VALUE)
+
+ NAME is the key name without its RISCV_HWPROBE_KEY_ prefix, and VALUE
+ is the number the kernel knows it by.
+
+ RISCV_HWPROBE_EXT (NAME, UPPERCASE_NAME, KEY, BIT, XLEN)
+
+ NAME is the extension name as it appears in an ISA string,
+ UPPERCASE_NAME is the same name as an upper case token, KEY names the
+ key whose value holds the bit, BIT is the bit position within that
+ value, and XLEN is 32 or 64 if the extension only exists on that XLEN,
+ or 0 if it exists on both.
+
+ RISCV_HWPROBE_IMA_FD covers both F and D, so bit 0 of IMA_EXT_0 has two
+ entries. Extensions implied by others are listed all the same; callers
+ that care must drop the redundant ones themselves. */
+
+#ifndef RISCV_HWPROBE_KEY
+#define RISCV_HWPROBE_KEY(NAME, VALUE)
+#endif
+
+#ifndef RISCV_HWPROBE_EXT
+#define RISCV_HWPROBE_EXT(NAME, UPPERCASE_NAME, KEY, BIT, XLEN)
+#endif
+
+RISCV_HWPROBE_KEY (MVENDORID, 0)
+RISCV_HWPROBE_KEY (MARCHID, 1)
+RISCV_HWPROBE_KEY (MIMPID, 2)
+RISCV_HWPROBE_KEY (BASE_BEHAVIOR, 3)
+RISCV_HWPROBE_KEY (IMA_EXT_0, 4)
+RISCV_HWPROBE_KEY (CPUPERF_0, 5)
+RISCV_HWPROBE_KEY (ZICBOZ_BLOCK_SIZE, 6)
+RISCV_HWPROBE_KEY (HIGHEST_VIRT_ADDRESS, 7)
+RISCV_HWPROBE_KEY (TIME_CSR_FREQ, 8)
+RISCV_HWPROBE_KEY (MISALIGNED_SCALAR_PERF, 9)
+RISCV_HWPROBE_KEY (MISALIGNED_VECTOR_PERF, 10)
+RISCV_HWPROBE_KEY (VENDOR_EXT_THEAD_0, 11)
+RISCV_HWPROBE_KEY (ZICBOM_BLOCK_SIZE, 12)
+RISCV_HWPROBE_KEY (VENDOR_EXT_SIFIVE_0, 13)
+RISCV_HWPROBE_KEY (VENDOR_EXT_MIPS_0, 14)
+RISCV_HWPROBE_KEY (IMA_EXT_1, 16)
+
+RISCV_HWPROBE_EXT ("f", F, RISCV_HWPROBE_KEY_IMA_EXT_0, 0, 0)
+RISCV_HWPROBE_EXT ("d", D, RISCV_HWPROBE_KEY_IMA_EXT_0, 0, 0)
+RISCV_HWPROBE_EXT ("c", C, RISCV_HWPROBE_KEY_IMA_EXT_0, 1, 0)
+RISCV_HWPROBE_EXT ("v", V, RISCV_HWPROBE_KEY_IMA_EXT_0, 2, 0)
+RISCV_HWPROBE_EXT ("zba", ZBA, RISCV_HWPROBE_KEY_IMA_EXT_0, 3, 0)
+RISCV_HWPROBE_EXT ("zbb", ZBB, RISCV_HWPROBE_KEY_IMA_EXT_0, 4, 0)
+RISCV_HWPROBE_EXT ("zbs", ZBS, RISCV_HWPROBE_KEY_IMA_EXT_0, 5, 0)
+RISCV_HWPROBE_EXT ("zicboz", ZICBOZ, RISCV_HWPROBE_KEY_IMA_EXT_0, 6, 0)
+RISCV_HWPROBE_EXT ("zbc", ZBC, RISCV_HWPROBE_KEY_IMA_EXT_0, 7, 0)
+RISCV_HWPROBE_EXT ("zbkb", ZBKB, RISCV_HWPROBE_KEY_IMA_EXT_0, 8, 0)
+RISCV_HWPROBE_EXT ("zbkc", ZBKC, RISCV_HWPROBE_KEY_IMA_EXT_0, 9, 0)
+RISCV_HWPROBE_EXT ("zbkx", ZBKX, RISCV_HWPROBE_KEY_IMA_EXT_0, 10, 0)
+RISCV_HWPROBE_EXT ("zknd", ZKND, RISCV_HWPROBE_KEY_IMA_EXT_0, 11, 0)
+RISCV_HWPROBE_EXT ("zkne", ZKNE, RISCV_HWPROBE_KEY_IMA_EXT_0, 12, 0)
+RISCV_HWPROBE_EXT ("zknh", ZKNH, RISCV_HWPROBE_KEY_IMA_EXT_0, 13, 0)
+RISCV_HWPROBE_EXT ("zksed", ZKSED, RISCV_HWPROBE_KEY_IMA_EXT_0, 14, 0)
+RISCV_HWPROBE_EXT ("zksh", ZKSH, RISCV_HWPROBE_KEY_IMA_EXT_0, 15, 0)
+RISCV_HWPROBE_EXT ("zkt", ZKT, RISCV_HWPROBE_KEY_IMA_EXT_0, 16, 0)
+RISCV_HWPROBE_EXT ("zvbb", ZVBB, RISCV_HWPROBE_KEY_IMA_EXT_0, 17, 0)
+RISCV_HWPROBE_EXT ("zvbc", ZVBC, RISCV_HWPROBE_KEY_IMA_EXT_0, 18, 0)
+RISCV_HWPROBE_EXT ("zvkb", ZVKB, RISCV_HWPROBE_KEY_IMA_EXT_0, 19, 0)
+RISCV_HWPROBE_EXT ("zvkg", ZVKG, RISCV_HWPROBE_KEY_IMA_EXT_0, 20, 0)
+RISCV_HWPROBE_EXT ("zvkned", ZVKNED, RISCV_HWPROBE_KEY_IMA_EXT_0, 21, 0)
+RISCV_HWPROBE_EXT ("zvknha", ZVKNHA, RISCV_HWPROBE_KEY_IMA_EXT_0, 22, 0)
+RISCV_HWPROBE_EXT ("zvknhb", ZVKNHB, RISCV_HWPROBE_KEY_IMA_EXT_0, 23, 0)
+RISCV_HWPROBE_EXT ("zvksed", ZVKSED, RISCV_HWPROBE_KEY_IMA_EXT_0, 24, 0)
+RISCV_HWPROBE_EXT ("zvksh", ZVKSH, RISCV_HWPROBE_KEY_IMA_EXT_0, 25, 0)
+RISCV_HWPROBE_EXT ("zvkt", ZVKT, RISCV_HWPROBE_KEY_IMA_EXT_0, 26, 0)
+RISCV_HWPROBE_EXT ("zfh", ZFH, RISCV_HWPROBE_KEY_IMA_EXT_0, 27, 0)
+RISCV_HWPROBE_EXT ("zfhmin", ZFHMIN, RISCV_HWPROBE_KEY_IMA_EXT_0, 28, 0)
+RISCV_HWPROBE_EXT ("zihintntl", ZIHINTNTL, RISCV_HWPROBE_KEY_IMA_EXT_0, 29, 0)
+RISCV_HWPROBE_EXT ("zvfh", ZVFH, RISCV_HWPROBE_KEY_IMA_EXT_0, 30, 0)
+RISCV_HWPROBE_EXT ("zvfhmin", ZVFHMIN, RISCV_HWPROBE_KEY_IMA_EXT_0, 31, 0)
+RISCV_HWPROBE_EXT ("zfa", ZFA, RISCV_HWPROBE_KEY_IMA_EXT_0, 32, 0)
+RISCV_HWPROBE_EXT ("ztso", ZTSO, RISCV_HWPROBE_KEY_IMA_EXT_0, 33, 0)
+RISCV_HWPROBE_EXT ("zacas", ZACAS, RISCV_HWPROBE_KEY_IMA_EXT_0, 34, 0)
+RISCV_HWPROBE_EXT ("zicond", ZICOND, RISCV_HWPROBE_KEY_IMA_EXT_0, 35, 0)
+RISCV_HWPROBE_EXT ("zihintpause", ZIHINTPAUSE,
+ RISCV_HWPROBE_KEY_IMA_EXT_0, 36, 0)
+RISCV_HWPROBE_EXT ("zve32x", ZVE32X, RISCV_HWPROBE_KEY_IMA_EXT_0, 37, 0)
+RISCV_HWPROBE_EXT ("zve32f", ZVE32F, RISCV_HWPROBE_KEY_IMA_EXT_0, 38, 0)
+RISCV_HWPROBE_EXT ("zve64x", ZVE64X, RISCV_HWPROBE_KEY_IMA_EXT_0, 39, 0)
+RISCV_HWPROBE_EXT ("zve64f", ZVE64F, RISCV_HWPROBE_KEY_IMA_EXT_0, 40, 0)
+RISCV_HWPROBE_EXT ("zve64d", ZVE64D, RISCV_HWPROBE_KEY_IMA_EXT_0, 41, 0)
+RISCV_HWPROBE_EXT ("zimop", ZIMOP, RISCV_HWPROBE_KEY_IMA_EXT_0, 42, 0)
+RISCV_HWPROBE_EXT ("zca", ZCA, RISCV_HWPROBE_KEY_IMA_EXT_0, 43, 0)
+RISCV_HWPROBE_EXT ("zcb", ZCB, RISCV_HWPROBE_KEY_IMA_EXT_0, 44, 0)
+RISCV_HWPROBE_EXT ("zcd", ZCD, RISCV_HWPROBE_KEY_IMA_EXT_0, 45, 0)
+RISCV_HWPROBE_EXT ("zcf", ZCF, RISCV_HWPROBE_KEY_IMA_EXT_0, 46, 32)
+RISCV_HWPROBE_EXT ("zcmop", ZCMOP, RISCV_HWPROBE_KEY_IMA_EXT_0, 47, 0)
+RISCV_HWPROBE_EXT ("zawrs", ZAWRS, RISCV_HWPROBE_KEY_IMA_EXT_0, 48, 0)
+RISCV_HWPROBE_EXT ("supm", SUPM, RISCV_HWPROBE_KEY_IMA_EXT_0, 49, 0)
+RISCV_HWPROBE_EXT ("zicntr", ZICNTR, RISCV_HWPROBE_KEY_IMA_EXT_0, 50, 0)
+RISCV_HWPROBE_EXT ("zihpm", ZIHPM, RISCV_HWPROBE_KEY_IMA_EXT_0, 51, 0)
+RISCV_HWPROBE_EXT ("zfbfmin", ZFBFMIN, RISCV_HWPROBE_KEY_IMA_EXT_0, 52, 0)
+RISCV_HWPROBE_EXT ("zvfbfmin", ZVFBFMIN, RISCV_HWPROBE_KEY_IMA_EXT_0, 53, 0)
+RISCV_HWPROBE_EXT ("zvfbfwma", ZVFBFWMA, RISCV_HWPROBE_KEY_IMA_EXT_0, 54, 0)
+RISCV_HWPROBE_EXT ("zicbom", ZICBOM, RISCV_HWPROBE_KEY_IMA_EXT_0, 55, 0)
+RISCV_HWPROBE_EXT ("zaamo", ZAAMO, RISCV_HWPROBE_KEY_IMA_EXT_0, 56, 0)
+RISCV_HWPROBE_EXT ("zalrsc", ZALRSC, RISCV_HWPROBE_KEY_IMA_EXT_0, 57, 0)
+RISCV_HWPROBE_EXT ("zabha", ZABHA, RISCV_HWPROBE_KEY_IMA_EXT_0, 58, 0)
+RISCV_HWPROBE_EXT ("zalasr", ZALASR, RISCV_HWPROBE_KEY_IMA_EXT_0, 59, 0)
+RISCV_HWPROBE_EXT ("zicbop", ZICBOP, RISCV_HWPROBE_KEY_IMA_EXT_0, 60, 0)
+RISCV_HWPROBE_EXT ("zilsd", ZILSD, RISCV_HWPROBE_KEY_IMA_EXT_0, 61, 32)
+RISCV_HWPROBE_EXT ("zclsd", ZCLSD, RISCV_HWPROBE_KEY_IMA_EXT_0, 62, 32)
+RISCV_HWPROBE_EXT ("zicfilp", ZICFILP, RISCV_HWPROBE_KEY_IMA_EXT_0, 63, 0)
+
+RISCV_HWPROBE_EXT ("zicfiss", ZICFISS, RISCV_HWPROBE_KEY_IMA_EXT_1, 0, 0)
+
+#undef RISCV_HWPROBE_KEY
+#undef RISCV_HWPROBE_EXT
diff --git a/gcc/common/config/riscv/riscv-hwprobe.h b/gcc/common/config/riscv/riscv-hwprobe.h
new file mode 100644
index 00000000000..f1fe2aeac2c
--- /dev/null
+++ b/gcc/common/config/riscv/riscv-hwprobe.h
@@ -0,0 +1,85 @@
+/* Definitions for the Linux riscv_hwprobe interface.
+
+ Copyright (C) 2026 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_RISCV_HWPROBE_H
+#define GCC_RISCV_HWPROBE_H
+
+#ifndef __NR_riscv_hwprobe
+#define __NR_riscv_hwprobe 258
+#endif
+
+enum {
+#define RISCV_HWPROBE_KEY(NAME, VALUE) RISCV_HWPROBE_KEY_##NAME = VALUE,
+#include "common/config/riscv/riscv-hwprobe.def"
+};
+
+#define RISCV_HWPROBE_BASE_BEHAVIOR_IMA (1ULL << 0)
+#define RISCV_HWPROBE_IMA_FD (1ULL << 0)
+#define RISCV_HWPROBE_IMA_C (1ULL << 1)
+#define RISCV_HWPROBE_IMA_V (1ULL << 2)
+
+struct riscv_hwprobe {
+ long long key;
+ unsigned long long value;
+};
+
+static inline long
+syscall_5_args (long number, long arg1, long arg2, long arg3,
+ long arg4, long arg5)
+{
+ register long a7 __asm__ ("a7") = number;
+ register long a0 __asm__ ("a0") = arg1;
+ register long a1 __asm__ ("a1") = arg2;
+ register long a2 __asm__ ("a2") = arg3;
+ register long a3 __asm__ ("a3") = arg4;
+ register long a4 __asm__ ("a4") = arg5;
+ __asm__ __volatile__ ("ecall\n\t"
+ : "=r"(a0)
+ : "r"(a7), "r"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4)
+ : "memory");
+ return a0;
+}
+
+static inline long
+riscv_hwprobe (struct riscv_hwprobe *hwprobes, long npairs)
+{
+ return syscall_5_args (__NR_riscv_hwprobe, (long)hwprobes, npairs, 0,
+ 0, 0);
+}
+
+static inline unsigned long long
+riscv_hwprobe_value (const struct riscv_hwprobe *pairs, int npairs,
+ long long key)
+{
+ int i;
+
+ for (i = 0; i < npairs; i++)
+ if (pairs[i].key == key)
+ return pairs[i].value;
+
+ return 0;
+}
+
+#endif
diff --git a/libgcc/config/riscv/feature_bits.c b/libgcc/config/riscv/feature_bits.c
index 8d226502eb7..af07fd6b30c 100644
--- a/libgcc/config/riscv/feature_bits.c
+++ b/libgcc/config/riscv/feature_bits.c
@@ -190,119 +190,7 @@ struct {
#define SET_EXT(EXT) features[EXT##_GROUPID] |= EXT##_BITMASK
#ifdef __linux
-
-#define __NR_riscv_hwprobe 258
-#define RISCV_HWPROBE_KEY_MVENDORID 0
-#define RISCV_HWPROBE_KEY_MARCHID 1
-#define RISCV_HWPROBE_KEY_MIMPID 2
-#define RISCV_HWPROBE_KEY_BASE_BEHAVIOR 3
-#define RISCV_HWPROBE_BASE_BEHAVIOR_IMA (1ULL << 0)
-#define RISCV_HWPROBE_KEY_IMA_EXT_0 4
-#define RISCV_HWPROBE_IMA_FD (1ULL << 0)
-#define RISCV_HWPROBE_IMA_C (1ULL << 1)
-#define RISCV_HWPROBE_IMA_V (1ULL << 2)
-#define RISCV_HWPROBE_EXT_ZBA (1ULL << 3)
-#define RISCV_HWPROBE_EXT_ZBB (1ULL << 4)
-#define RISCV_HWPROBE_EXT_ZBS (1ULL << 5)
-#define RISCV_HWPROBE_EXT_ZICBOZ (1ULL << 6)
-#define RISCV_HWPROBE_EXT_ZBC (1ULL << 7)
-#define RISCV_HWPROBE_EXT_ZBKB (1ULL << 8)
-#define RISCV_HWPROBE_EXT_ZBKC (1ULL << 9)
-#define RISCV_HWPROBE_EXT_ZBKX (1ULL << 10)
-#define RISCV_HWPROBE_EXT_ZKND (1ULL << 11)
-#define RISCV_HWPROBE_EXT_ZKNE (1ULL << 12)
-#define RISCV_HWPROBE_EXT_ZKNH (1ULL << 13)
-#define RISCV_HWPROBE_EXT_ZKSED (1ULL << 14)
-#define RISCV_HWPROBE_EXT_ZKSH (1ULL << 15)
-#define RISCV_HWPROBE_EXT_ZKT (1ULL << 16)
-#define RISCV_HWPROBE_EXT_ZVBB (1ULL << 17)
-#define RISCV_HWPROBE_EXT_ZVBC (1ULL << 18)
-#define RISCV_HWPROBE_EXT_ZVKB (1ULL << 19)
-#define RISCV_HWPROBE_EXT_ZVKG (1ULL << 20)
-#define RISCV_HWPROBE_EXT_ZVKNED (1ULL << 21)
-#define RISCV_HWPROBE_EXT_ZVKNHA (1ULL << 22)
-#define RISCV_HWPROBE_EXT_ZVKNHB (1ULL << 23)
-#define RISCV_HWPROBE_EXT_ZVKSED (1ULL << 24)
-#define RISCV_HWPROBE_EXT_ZVKSH (1ULL << 25)
-#define RISCV_HWPROBE_EXT_ZVKT (1ULL << 26)
-#define RISCV_HWPROBE_EXT_ZFH (1ULL << 27)
-#define RISCV_HWPROBE_EXT_ZFHMIN (1ULL << 28)
-#define RISCV_HWPROBE_EXT_ZIHINTNTL (1ULL << 29)
-#define RISCV_HWPROBE_EXT_ZVFH (1ULL << 30)
-#define RISCV_HWPROBE_EXT_ZVFHMIN (1ULL << 31)
-#define RISCV_HWPROBE_EXT_ZFA (1ULL << 32)
-#define RISCV_HWPROBE_EXT_ZTSO (1ULL << 33)
-#define RISCV_HWPROBE_EXT_ZACAS (1ULL << 34)
-#define RISCV_HWPROBE_EXT_ZICOND (1ULL << 35)
-#define RISCV_HWPROBE_EXT_ZIHINTPAUSE (1ULL << 36)
-#define RISCV_HWPROBE_EXT_ZVE32X (1ULL << 37)
-#define RISCV_HWPROBE_EXT_ZVE32F (1ULL << 38)
-#define RISCV_HWPROBE_EXT_ZVE64X (1ULL << 39)
-#define RISCV_HWPROBE_EXT_ZVE64F (1ULL << 40)
-#define RISCV_HWPROBE_EXT_ZVE64D (1ULL << 41)
-#define RISCV_HWPROBE_EXT_ZIMOP (1ULL << 42)
-#define RISCV_HWPROBE_EXT_ZCA (1ULL << 43)
-#define RISCV_HWPROBE_EXT_ZCB (1ULL << 44)
-#define RISCV_HWPROBE_EXT_ZCD (1ULL << 45)
-#define RISCV_HWPROBE_EXT_ZCF (1ULL << 46)
-#define RISCV_HWPROBE_EXT_ZCMOP (1ULL << 47)
-#define RISCV_HWPROBE_EXT_ZAWRS (1ULL << 48)
-#define RISCV_HWPROBE_EXT_SUPM (1ULL << 49)
-#define RISCV_HWPROBE_EXT_ZICNTR (1ULL << 50)
-#define RISCV_HWPROBE_EXT_ZIHPM (1ULL << 51)
-#define RISCV_HWPROBE_EXT_ZFBFMIN (1ULL << 52)
-#define RISCV_HWPROBE_EXT_ZVFBFMIN (1ULL << 53)
-#define RISCV_HWPROBE_EXT_ZVFBFWMA (1ULL << 54)
-#define RISCV_HWPROBE_EXT_ZICBOM (1ULL << 55)
-#define RISCV_HWPROBE_EXT_ZAAMO (1ULL << 56)
-#define RISCV_HWPROBE_EXT_ZALRSC (1ULL << 57)
-#define RISCV_HWPROBE_EXT_ZABHA (1ULL << 58)
-#define RISCV_HWPROBE_EXT_ZALASR (1ULL << 59)
-#define RISCV_HWPROBE_EXT_ZICBOP (1ULL << 60)
-#define RISCV_HWPROBE_EXT_ZILSD (1ULL << 61)
-#define RISCV_HWPROBE_EXT_ZCLSD (1ULL << 62)
-#define RISCV_HWPROBE_EXT_ZICFILP (1ULL << 63)
-#define RISCV_HWPROBE_KEY_CPUPERF_0 5
-#define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
-#define RISCV_HWPROBE_MISALIGNED_EMULATED (1ULL << 0)
-#define RISCV_HWPROBE_MISALIGNED_SLOW (2 << 0)
-#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
-#define RISCV_HWPROBE_KEY_IMA_EXT_1 16
-#define RISCV_HWPROBE_EXT_ZICFISS (1ULL << 0)
-
-struct riscv_hwprobe {
- long long key;
- unsigned long long value;
-};
-
-static long syscall_5_args (long number, long arg1, long arg2, long arg3,
- long arg4, long arg5)
-{
- register long a7 __asm__ ("a7") = number;
- register long a0 __asm__ ("a0") = arg1;
- register long a1 __asm__ ("a1") = arg2;
- register long a2 __asm__ ("a2") = arg3;
- register long a3 __asm__ ("a3") = arg4;
- register long a4 __asm__ ("a4") = arg5;
- __asm__ __volatile__ ("ecall\n\t"
- : "=r"(a0)
- : "r"(a7), "r"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4)
- : "memory");
- return a0;
-}
-
-#define SET_FROM_HWPROBE(HWPROBE_VAR, EXT) \
- if (HWPROBE_VAR.value & RISCV_HWPROBE_EXT_##EXT) \
- SET_EXT (EXT)
-
-#define SET_FROM_IMA_EXT(EXT) \
- SET_FROM_HWPROBE (hwprobe_ima_ext, EXT)
-
-#define SET_FROM_IMA_EXT_1(EXT) \
- SET_FROM_HWPROBE (hwprobe_ima_ext_1, EXT)
+#include "common/config/riscv/riscv-hwprobe.h"
static void __init_riscv_features_bits_linux ()
{
@@ -314,10 +202,9 @@ static void __init_riscv_features_bits_linux ()
{RISCV_HWPROBE_KEY_IMA_EXT_0, 0},
{RISCV_HWPROBE_KEY_IMA_EXT_1, 0},
};
+ const int npairs = sizeof (hwprobes) / sizeof (hwprobes[0]);
- long res = syscall_5_args (__NR_riscv_hwprobe, (long)&hwprobes,
- sizeof (hwprobes) / sizeof (hwprobes[0]), 0,
- 0, 0);
+ long res = riscv_hwprobe (hwprobes, npairs);
if (res)
return;
@@ -354,7 +241,6 @@ static void __init_riscv_features_bits_linux ()
1. The new extension implies a previous extension (e.g., Zve32f -> F).
2. The extensions imply some other extensions appear in the same release
version of Linux Kernel (e.g., Zbc - > Zbkc). */
-
if (hwprobe_ima_ext.value & RISCV_HWPROBE_IMA_FD)
{
SET_EXT (F);
@@ -385,74 +271,10 @@ static void __init_riscv_features_bits_linux ()
SET_EXT (ZVE64D);
}
- SET_FROM_IMA_EXT (ZBA);
- SET_FROM_IMA_EXT (ZBB);
- SET_FROM_IMA_EXT (ZBS);
- /* Added since Linux v6.7. */
- SET_FROM_IMA_EXT (ZICBOZ);
- /* Added since Linux v6.8. */
- SET_FROM_IMA_EXT (ZBC);
- SET_FROM_IMA_EXT (ZBKB);
- SET_FROM_IMA_EXT (ZBKC);
- SET_FROM_IMA_EXT (ZBKX);
- SET_FROM_IMA_EXT (ZKND);
- SET_FROM_IMA_EXT (ZKNE);
- SET_FROM_IMA_EXT (ZKNH);
- SET_FROM_IMA_EXT (ZKSED);
- SET_FROM_IMA_EXT (ZKSH);
- SET_FROM_IMA_EXT (ZKT);
- SET_FROM_IMA_EXT (ZVBB);
- SET_FROM_IMA_EXT (ZVBC);
- SET_FROM_IMA_EXT (ZVKB);
- SET_FROM_IMA_EXT (ZVKG);
- SET_FROM_IMA_EXT (ZVKNED);
- SET_FROM_IMA_EXT (ZVKNHA);
- SET_FROM_IMA_EXT (ZVKNHB);
- SET_FROM_IMA_EXT (ZVKSED);
- SET_FROM_IMA_EXT (ZVKSH);
- SET_FROM_IMA_EXT (ZVKT);
- SET_FROM_IMA_EXT (ZFH);
- SET_FROM_IMA_EXT (ZFHMIN);
- SET_FROM_IMA_EXT (ZIHINTNTL);
- SET_FROM_IMA_EXT (ZVFH);
- SET_FROM_IMA_EXT (ZVFHMIN);
- SET_FROM_IMA_EXT (ZFA);
- SET_FROM_IMA_EXT (ZTSO);
- SET_FROM_IMA_EXT (ZACAS);
- SET_FROM_IMA_EXT (ZICOND);
- /* Added since Linux v6.10. */
- SET_FROM_IMA_EXT (ZIHINTPAUSE);
- /* Added since Linux v6.11. */
- SET_FROM_IMA_EXT (ZVE32X);
- SET_FROM_IMA_EXT (ZVE32F);
- SET_FROM_IMA_EXT (ZVE64X);
- SET_FROM_IMA_EXT (ZVE64F);
- SET_FROM_IMA_EXT (ZVE64D);
- SET_FROM_IMA_EXT (ZIMOP);
- SET_FROM_IMA_EXT (ZCA);
- SET_FROM_IMA_EXT (ZCB);
- SET_FROM_IMA_EXT (ZCD);
- SET_FROM_IMA_EXT (ZCF);
- SET_FROM_IMA_EXT (ZCMOP);
- SET_FROM_IMA_EXT (ZAWRS);
- SET_FROM_IMA_EXT (SUPM);
- SET_FROM_IMA_EXT (ZICNTR);
- SET_FROM_IMA_EXT (ZIHPM);
- SET_FROM_IMA_EXT (ZFBFMIN);
- SET_FROM_IMA_EXT (ZVFBFMIN);
- SET_FROM_IMA_EXT (ZVFBFWMA);
- SET_FROM_IMA_EXT (ZICBOM);
- SET_FROM_IMA_EXT (ZAAMO);
- SET_FROM_IMA_EXT (ZALRSC);
- SET_FROM_IMA_EXT (ZABHA);
- SET_FROM_IMA_EXT (ZALASR);
- SET_FROM_IMA_EXT (ZICBOP);
- SET_FROM_IMA_EXT (ZILSD);
- SET_FROM_IMA_EXT (ZCLSD);
- SET_FROM_IMA_EXT (ZICFILP);
-
- const struct riscv_hwprobe hwprobe_ima_ext_1 = hwprobes[5];
- SET_FROM_IMA_EXT_1 (ZICFISS);
+#define RISCV_HWPROBE_EXT(NAME, UPPERCASE_NAME, KEY, BIT, XLEN) \
+ if (riscv_hwprobe_value (hwprobes, npairs, KEY) & (1ULL << (BIT))) \
+ SET_EXT (UPPERCASE_NAME);
+#include "common/config/riscv/riscv-hwprobe.def"
for (i = 0; i < RISCV_FEATURE_BITS_LENGTH; ++i)
__riscv_feature_bits.features[i] = features[i];
@@ -464,6 +286,8 @@ static void __init_riscv_features_bits_linux ()
static int __init = 0;
+void __init_riscv_feature_bits ();
+
void
__attribute__ ((constructor (101)))
__init_riscv_feature_bits ()
--
2.53.0