[v5,1/4] riscv: Add Linux hwprobe syscall support
Checks
Context |
Check |
Description |
redhat-pt-bot/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_glibc_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_glibc_check--master-arm |
success
|
Testing passed
|
Commit Message
Add awareness and a thin wrapper function around a new Linux system call
that allows callers to get architecture and microarchitecture
information about the CPUs from the kernel. This can be used to
do things like dynamically choose a memcpy implementation.
Signed-off-by: Evan Green <evan@rivosinc.com>
Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
---
(no changes since v4)
Changes in v4:
- Remove __USE_GNU (Florian)
- __nonnull, __wur, __THROW, and __fortified_attr_access decorations
(Florian)
- change long to long int (Florian)
- Fix comment formatting (Florian)
- Update backup kernel header content copy.
- Fix function declaration formatting (Florian)
- Changed export versions to 2.38
Changes in v3:
- Update argument types to match v4 kernel interface
Changes in v2:
- hwprobe.h: Use __has_include and duplicate Linux content to make
compilation work when Linux headers are absent (Adhemerval)
- hwprobe.h: Put declaration under __USE_GNU (Adhemerval)
- Use INLINE_SYSCALL_CALL (Adhemerval)
- Update versions
- Update UNALIGNED_MASK to match kernel v3 series.
sysdeps/unix/sysv/linux/riscv/Makefile | 4 +-
sysdeps/unix/sysv/linux/riscv/Versions | 3 +
sysdeps/unix/sysv/linux/riscv/hwprobe.c | 30 ++++++++
.../unix/sysv/linux/riscv/rv32/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h | 72 +++++++++++++++++++
6 files changed, 109 insertions(+), 2 deletions(-)
create mode 100644 sysdeps/unix/sysv/linux/riscv/hwprobe.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h
Comments
On Wed, 12 Jul 2023, Evan Green wrote:
> +extern int __riscv_hwprobe (struct riscv_hwprobe *pairs, size_t pair_count,
> + size_t cpu_count, unsigned long int *cpus,
> + unsigned int flags)
In an installed header, I'd expect leading __ on parameter names in
function declarations, so that you don't take those names from the user's
namespace for macros unnecessarily.
@@ -1,6 +1,6 @@
ifeq ($(subdir),misc)
-sysdep_headers += sys/cachectl.h
-sysdep_routines += flush-icache
+sysdep_headers += sys/cachectl.h sys/hwprobe.h
+sysdep_routines += flush-icache hwprobe
endif
ifeq ($(subdir),stdlib)
@@ -8,4 +8,7 @@ libc {
GLIBC_2.27 {
__riscv_flush_icache;
}
+ GLIBC_2.38 {
+ __riscv_hwprobe;
+ }
}
new file mode 100644
@@ -0,0 +1,30 @@
+/* RISC-V hardware feature probing support on Linux
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/syscall.h>
+#include <sys/hwprobe.h>
+#include <sysdep.h>
+
+int __riscv_hwprobe (struct riscv_hwprobe *pairs, size_t pair_count,
+ size_t cpu_count, unsigned long int *cpus,
+ unsigned int flags)
+{
+ return INLINE_SYSCALL_CALL (riscv_hwprobe, pairs, pair_count,
+ cpu_count, cpus, flags);
+}
@@ -2436,3 +2436,4 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.38 __riscv_hwprobe F
@@ -2636,3 +2636,4 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.38 __riscv_hwprobe F
new file mode 100644
@@ -0,0 +1,72 @@
+/* RISC-V architecture probe interface
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_HWPROBE_H
+#define _SYS_HWPROBE_H 1
+
+#include <features.h>
+#include <stddef.h>
+#ifdef __has_include
+# if __has_include (<asm/hwprobe.h>)
+# include <asm/hwprobe.h>
+# endif
+#endif
+
+/* Define a (probably stale) version of the interface if the Linux headers
+ aren't present. */
+#ifndef RISCV_HWPROBE_KEY_MVENDORID
+struct riscv_hwprobe {
+ signed long long int key;
+ unsigned long long int value;
+};
+
+#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 (1 << 0)
+#define RISCV_HWPROBE_KEY_IMA_EXT_0 4
+#define RISCV_HWPROBE_IMA_FD (1 << 0)
+#define RISCV_HWPROBE_IMA_C (1 << 1)
+#define RISCV_HWPROBE_IMA_V (1 << 2)
+#define RISCV_HWPROBE_EXT_ZBA (1 << 3)
+#define RISCV_HWPROBE_EXT_ZBB (1 << 4)
+#define RISCV_HWPROBE_EXT_ZBS (1 << 5)
+#define RISCV_HWPROBE_KEY_CPUPERF_0 5
+#define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
+#define RISCV_HWPROBE_MISALIGNED_EMULATED (1 << 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)
+
+#endif /* RISCV_HWPROBE_KEY_MVENDORID */
+
+__BEGIN_DECLS
+
+extern int __riscv_hwprobe (struct riscv_hwprobe *pairs, size_t pair_count,
+ size_t cpu_count, unsigned long int *cpus,
+ unsigned int flags)
+ __THROW __nonnull ((1)) __wur
+ __fortified_attr_access (__read_write__, 1, 2)
+ __fortified_attr_access (__read_only__, 4, 3);
+
+__END_DECLS
+
+#endif /* sys/hwprobe.h */