This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[RFC v4 22/24] RISC-V: Use 64-bit vdso syscalls for RV32
- From: Alistair Francis <alistair dot francis at wdc dot com>
- To: libc-alpha at sourceware dot org
- Cc: arnd at arndb dot de, adhemerval dot zanella at linaro dot org, fweimer at redhat dot com, palmer at sifive dot com, macro at wdc dot com, zongbox at gmail dot com, alistair dot francis at wdc dot com, alistair23 at gmail dot com
- Date: Fri, 9 Aug 2019 18:00:50 -0700
- Subject: [RFC v4 22/24] RISC-V: Use 64-bit vdso syscalls for RV32
- Ironport-sdr: vPiofg6yX6dqm4urN6O3iANKpZ8gKS9+JDIZcDgugUL7VzTnCaS7Mjyx0SMWKo27NWKnruTZlN 88ZAbXgzkTHpU7VtWla39nH1eZLDQgASARdAnLSY62E6pfUA0NCI1rP7tCkWVub1nXuhsk3mqM RVhTr7sRN9xZ21yQDtlXP39cShGRcbBRSR6Sn3AS854C6w4AoVfowMWW0BiM8GpYn8hXug+oQg 4yusSJmHcqRJ/l0ufbgj3nUoprhKL3wFr0V3H92KS68zjs00dR41jZJ9aQ+3Gfnj2ne71Bkgkw yr0=
- Ironport-sdr: P/6ELn6Fx+uKvMG32Gvnv0pcNk4q7pg5X9vj0eMvtKVSGlbi6snlXXUkBcikxLR9xB1Z2+khdc QWRrcl76lc44SpWJ7UQejkM9HJerccV8rVtPMoFX8xjikmkjMnSIXMr16QaG284Bz8j6Zt99hC PzeF0N3IYmli1T6c6NFYbwg2/tIdq3VplXCIDRvYF09dIIBYoo9y4zEjTFm5LRdBPIJWaPK1DE iPc4iJCYMiCP16iHS0vxkgfJvOYs39pkuMr9EAqGpiVtkcTlLyxskbCdqDAG/FzcE0q7BwW9EM ZIanWmxoOZ05ZXpFdazDAjhn
- Ironport-sdr: MIw7omyWIIBnqEJhY7JHynrIem7dPwVtD8mbwK9YZ56AdurqYCVSelxPdSegLIxdj/gOh1nP23 ZaLtu0X3jOEEncjaitWKterGMNZ7WJ40rCiz4oLRXJEkzOwvYB27qghU3IzkXLRxGkQVefBNv/ QmtAd6mCReqM26QAU4SnB3YHDHyh1Vg84kYk/J3T0+haaBwKSYEr2lxZo3P6NKrPOj2lMKL9JF kgOMIa0IfxEgXYUysRLrElpZCMEh8FvN1ycl3UG1SDGK9l1xnAHP2ar6EiiajXeQJUMmv1g+f7 qV4=
- References: <cover.1565398513.git.alistair.francis@wdc.com>
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(-)
diff --git a/sysdeps/unix/sysv/linux/clock_getres.c b/sysdeps/unix/sysv/linux/clock_getres.c
index 24b2299938c..6982c754d6f 100644
--- a/sysdeps/unix/sysv/linux/clock_getres.c
+++ b/sysdeps/unix/sysv/linux/clock_getres.c
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/riscv/init-first.c b/sysdeps/unix/sysv/linux/riscv/init-first.c
index 35dc8a8d386..e5f72803464 100644
--- a/sysdeps/unix/sysv/linux/riscv/init-first.c
+++ b/sysdeps/unix/sysv/linux/riscv/init-first.c
@@ -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
diff --git a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h
index 16905d5b78d..da4ec9b2ed7 100644
--- a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h
+++ b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h
@@ -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 */
--
2.22.0