[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.