[RFC,v4,22/24] RISC-V: Use 64-bit vdso syscalls for RV32
Commit Message
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
sysdeps/unix/sysv/linux/clock_getres.c | 4 ++++
sysdeps/unix/sysv/linux/riscv/init-first.c | 26 +++++++++++++++++-----
sysdeps/unix/sysv/linux/riscv/libc-vdso.h | 12 +++++++---
3 files changed, 33 insertions(+), 9 deletions(-)
@@ -30,6 +30,10 @@
int
__clock_getres (clockid_t clock_id, struct timespec *res)
{
+#ifndef __vdso_clock_getres
+ return INLINE_SYSCALL_CALL (clock_getres, clock_id, res);
+#else
return INLINE_VSYSCALL (clock_getres, 2, clock_id, res);
+#endif
}
weak_alias (__clock_getres, clock_getres)
@@ -22,12 +22,18 @@
long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *)
attribute_hidden;
-long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
- attribute_hidden;
-long int (*VDSO_SYMBOL (__clock_gettime64)) (clockid_t, struct __timespec64 *)
+
+#if __riscv_xlen == 64
+long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *)
attribute_hidden;
long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *)
attribute_hidden;
+long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
+ attribute_hidden;
+#else
+long int (*VDSO_SYMBOL (clock_gettime64)) (clockid_t, struct timespec *)
+ attribute_hidden;
+#endif
static inline void
_libc_vdso_platform_setup (void)
@@ -38,17 +44,25 @@ _libc_vdso_platform_setup (void)
PTR_MANGLE (p);
VDSO_SYMBOL (getcpu) = p;
- p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version);
+#if __riscv_xlen == 32
+ p = _dl_vdso_vsym ("__vdso_clock_gettime64", &linux_version);
PTR_MANGLE (p);
- VDSO_SYMBOL (gettimeofday) = p;
-
+ VDSO_SYMBOL (clock_gettime64) = p;
+#else
p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux_version);
PTR_MANGLE (p);
VDSO_SYMBOL (clock_gettime) = p;
+#endif
+
+#if __riscv_xlen == 64
+ p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version);
+ PTR_MANGLE (p);
+ VDSO_SYMBOL (gettimeofday) = p;
p = _dl_vdso_vsym ("__vdso_clock_getres", &linux_version);
PTR_MANGLE (p);
VDSO_SYMBOL (clock_getres) = p;
+#endif
}
#define VDSO_SETUP _libc_vdso_platform_setup
@@ -24,11 +24,17 @@
extern long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *)
attribute_hidden;
-extern long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
- attribute_hidden;
-extern long int (*VDSO_SYMBOL (__clock_gettime64)) (clockid_t, struct __timespec64 *)
+
+#if __riscv_xlen == 64
+extern long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *)
attribute_hidden;
extern long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *)
attribute_hidden;
+extern long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
+ attribute_hidden;
+#else
+extern long int (*VDSO_SYMBOL (clock_gettime64)) (clockid_t, struct timespec *)
+ attribute_hidden;
+#endif
#endif /* _LIBC_VDSO_H */