This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[RFC v5 20/21] 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: Thu, 29 Aug 2019 09:50:54 -0700
- Subject: [RFC v5 20/21] RISC-V: Use 64-bit vdso syscalls for RV32
- Ironport-sdr: VXfdkQfuOb9CP1amq6DvW9QRitpLYDx5V0dGwWlIRBkliLUqnFaSIG9LCyst4mOsPgQop2U7k4 X3let7GjvMIlwQmZDKsZxWH5nfqS+wmZt4MTkI98XByfzpmOB0AVz/E3TH7H0nds7TivrRNNJq sClAm8BdiNstascaOzoyBQl/HU9LOJ1IXrjliKA7gKVFcleJgQ6t9j3bYavL+xHJpFSkYSL4Jk TbTtLWCRIBxOSVJ5bzwwUuWVAAyAnqqUbYTRL3Uz6NY5nE4quyzY20ayYLM5SBRx9z4A4lZbmM 4tU=
- Ironport-sdr: TaFj7NwiHyW348C33mZS0SCrKVZ8Oa4sO/zxzSFbfss+WWPe4EpzVxbrkjW7JfvcrnPmfKDnb4 8cpxOVYm+fDPy8zXXrkM/nvqvDe394I0STaGpRyX0MF3WoK+FYS5HzfwK61MINxf0oISX0XLHY WswBVpudeCFcDOk9fp4oJgZTMEqQLzO42rQO7NCTaltBX85HB1reyaJEApCveOCd/CSPxfbvNw mXjrqSazstzaid5LdFogNF5CE8AaZ7G9f5Cz8X4aVTUSOp9iMrbdp8sglV9NtLeulDuCTwjWiR JLdo76fhCIqycLb1IocKLqrJ
- Ironport-sdr: mo9UdvHwOvnR2zXBrLa+tuYtQsg0l6tRmM7brRPaV6tAj6LZ2cPHIJt8pi5MWLJioi1jLn8s4A jtrjBcyhGLxhFINnoEG+07C7Xrf73S+hMfOsNtepd9je+q/tN5UBKm5CjIv1K5lh2c8pCmAYgt mePzjy4o2m+ca6bD6QauFEsYQVnVvdKvgjnuxiOBH1TXwIJE48JWQvj+UOLYHmMYpVGWPlsTXw PmJvr/Rg4ecHP9ETB3YyErUy9cJ1xx3G8jzGWZ+cxobofIaH50Aw1qPyixN3ntTRDBqpQxTwtH IYo=
- References: <cover.1567097252.git.alistair.francis@wdc.com>
- Wdcironportexception: Internal
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
* sysdeps/unix/sysv/linux/clock_getres.c: Use 64-bit vdso syscalls
for RV32
* sysdeps/unix/sysv/linux/riscv/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/libc-vdso.h: Likewise.
---
sysdeps/unix/sysv/linux/clock_getres.c | 4 ++++
sysdeps/unix/sysv/linux/riscv/init-first.c | 19 ++++++++++++-------
sysdeps/unix/sysv/linux/riscv/libc-vdso.h | 9 ++++++---
3 files changed, 22 insertions(+), 10 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..7b7457a7a8b 100644
--- a/sysdeps/unix/sysv/linux/riscv/init-first.c
+++ b/sysdeps/unix/sysv/linux/riscv/init-first.c
@@ -22,12 +22,15 @@
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 *)
+long int (*VDSO_SYMBOL (clock_gettime64)) (clockid_t, struct timespec *)
attribute_hidden;
+
+#if __riscv_xlen == 64
long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *)
attribute_hidden;
+long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
+ attribute_hidden;
+#endif
static inline void
_libc_vdso_platform_setup (void)
@@ -38,17 +41,19 @@ _libc_vdso_platform_setup (void)
PTR_MANGLE (p);
VDSO_SYMBOL (getcpu) = p;
- p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version);
+ p = _dl_vdso_vsym ("__vdso_clock_gettime64", &linux_version);
PTR_MANGLE (p);
- VDSO_SYMBOL (gettimeofday) = p;
+ VDSO_SYMBOL (clock_gettime64) = p;
- p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux_version);
+#if __riscv_xlen == 64
+ p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version);
PTR_MANGLE (p);
- VDSO_SYMBOL (clock_gettime) = 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..3684168df4b 100644
--- a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h
+++ b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h
@@ -24,11 +24,14 @@
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 *)
+extern long int (*VDSO_SYMBOL (clock_gettime64)) (clockid_t, struct timespec *)
attribute_hidden;
+
+#if __riscv_xlen == 64
extern long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *)
attribute_hidden;
+extern long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
+ attribute_hidden;
+#endif
#endif /* _LIBC_VDSO_H */
--
2.22.0