diff options
author | Evan Green <evan@rivosinc.com> | 2024-02-27 14:56:42 -0800 |
---|---|---|
committer | Palmer Dabbelt <palmer@rivosinc.com> | 2024-03-01 07:15:00 -0800 |
commit | a2b47f7d4679a01d56827e1aff2a40de173fab23 (patch) | |
tree | f4cb7172e01d25e742bf37f87d046de32397cf64 /sysdeps/unix | |
parent | a29bb320a1a1daa8add4d213fc70f273810dd91a (diff) | |
download | glibc-a2b47f7d4679a01d56827e1aff2a40de173fab23.tar.gz glibc-a2b47f7d4679a01d56827e1aff2a40de173fab23.tar.xz glibc-a2b47f7d4679a01d56827e1aff2a40de173fab23.zip |
riscv: Add ifunc helper method to hwprobe.h
Add a little helper method so it's easier to fetch a single value from the hwprobe function when used within an ifunc selector. Signed-off-by: Evan Green <evan@rivosinc.com> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h b/sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h index 34a2e3dbc2..8ecb43bb69 100644 --- a/sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h +++ b/sysdeps/unix/sysv/linux/riscv/sys/hwprobe.h @@ -22,6 +22,7 @@ #include <features.h> #include <stddef.h> +#include <errno.h> #ifdef __has_include # if __has_include (<asm/hwprobe.h>) # include <asm/hwprobe.h> @@ -79,6 +80,34 @@ typedef int (*__riscv_hwprobe_t) (struct riscv_hwprobe *__pairs, size_t __pair_c __fortified_attr_access (__read_write__, 1, 2) __fortified_attr_access (__read_only__, 4, 3); +/* Helper function usable from ifunc selectors that probes a single key. */ +static __inline int +__riscv_hwprobe_one(__riscv_hwprobe_t hwprobe_func, + long long int key, + unsigned long long int *value) +{ + struct riscv_hwprobe pair; + int rc; + + /* Earlier versions of glibc pass NULL as the second ifunc parameter. Other C + libraries on non-Linux systems may pass +1 as this function pointer to + indicate no support. Users copying this function to exotic worlds + (non-Linux non-glibc) may want to do additional validity checks here. */ + if (hwprobe_func == NULL) + return ENOSYS; + + pair.key = key; + rc = hwprobe_func (&pair, 1, 0, NULL, 0); + if (rc != 0) + return rc; + + if (pair.key < 0) + return ENOENT; + + *value = pair.value; + return 0; +} + __END_DECLS #endif /* sys/hwprobe.h */ |