aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/tile
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/tile')
-rw-r--r--sysdeps/unix/sysv/linux/tile/gettimeofday.c4
-rw-r--r--sysdeps/unix/sysv/linux/tile/init-first.c18
-rw-r--r--sysdeps/unix/sysv/linux/tile/libc-vdso.h14
-rw-r--r--sysdeps/unix/sysv/linux/tile/sysdep.h68
4 files changed, 31 insertions, 73 deletions
diff --git a/sysdeps/unix/sysv/linux/tile/gettimeofday.c b/sysdeps/unix/sysv/linux/tile/gettimeofday.c
index 8d34b40..13382ab 100644
--- a/sysdeps/unix/sysv/linux/tile/gettimeofday.c
+++ b/sysdeps/unix/sysv/linux/tile/gettimeofday.c
@@ -19,7 +19,9 @@
#include <stddef.h>
#include <sys/time.h>
#include <time.h>
-#include <libc-vdso.h>
+
+#define HAVE_VSYSCALL
+#include <sysdep-vdso.h>
int
__gettimeofday (struct timeval *tv, struct timezone *tz)
diff --git a/sysdeps/unix/sysv/linux/tile/init-first.c b/sysdeps/unix/sysv/linux/tile/init-first.c
index 6b0e26a..29356c2 100644
--- a/sysdeps/unix/sysv/linux/tile/init-first.c
+++ b/sysdeps/unix/sysv/linux/tile/init-first.c
@@ -19,21 +19,27 @@
#include <dl-vdso.h>
#include <libc-vdso.h>
-struct syscall_return_value (*__vdso_gettimeofday) (struct timeval *, void *)
+struct syscall_return_value (*VDSO_SYMBOL(gettimeofday)) (struct timeval *,
+ void *)
attribute_hidden;
-struct syscall_return_value (*__vdso_clock_gettime) (clockid_t,
- struct timespec *)
+struct syscall_return_value (*VDSO_SYMBOL(clock_gettime)) (clockid_t,
+ struct timespec *)
__attribute__ ((nocommon));
-strong_alias (__vdso_clock_gettime, __GI___vdso_clock_gettime attribute_hidden)
static inline void
_libc_vdso_platform_setup (void)
{
PREPARE_VERSION (linux26, "LINUX_2.6", 61765110);
- __vdso_gettimeofday = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26);
- __vdso_clock_gettime = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26);
+
+ void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26);
+ PTR_MANGLE (p);
+ VDSO_SYMBOL (gettimeofday) = p;
+
+ p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26);
+ PTR_MANGLE (p);
+ VDSO_SYMBOL (clock_gettime) = p;
}
#define VDSO_SETUP _libc_vdso_platform_setup
diff --git a/sysdeps/unix/sysv/linux/tile/libc-vdso.h b/sysdeps/unix/sysv/linux/tile/libc-vdso.h
index 44f8286..2f5b23d 100644
--- a/sysdeps/unix/sysv/linux/tile/libc-vdso.h
+++ b/sysdeps/unix/sysv/linux/tile/libc-vdso.h
@@ -22,19 +22,21 @@
#ifdef SHARED
+#include <sysdep-vdso.h>
+
struct syscall_return_value
{
long int value;
long int error;
};
-extern struct syscall_return_value (*__vdso_gettimeofday) (struct timeval *,
- void *)
+extern struct syscall_return_value (*VDSO_SYMBOL (gettimeofday)) (struct
+ timeval *,
+ void *)
attribute_hidden;
-extern struct syscall_return_value (*__vdso_clock_gettime) (clockid_t,
- struct timespec *);
-
+extern struct syscall_return_value (*VDSO_SYMBOL (clock_gettime)) (clockid_t,
+ struct
+ timespec *);
#endif
-
#endif /* _LIBC_VDSO_H */
diff --git a/sysdeps/unix/sysv/linux/tile/sysdep.h b/sysdeps/unix/sysv/linux/tile/sysdep.h
index 64c8920..30d52e3 100644
--- a/sysdeps/unix/sysv/linux/tile/sysdep.h
+++ b/sysdeps/unix/sysv/linux/tile/sysdep.h
@@ -202,71 +202,19 @@
"=R02" (_clobber_r2), "=R03" (_clobber_r3), "=R04" (_clobber_r4), \
"=R05" (_clobber_r5), "=R10" (_clobber_r10)
-/* This version is for kernels that implement system calls that
- behave like function calls as far as register saving.
- It falls back to the syscall in the case that the vDSO doesn't
- exist or fails for ENOSYS */
-# ifdef SHARED
-# define INLINE_VSYSCALL(name, nr, args...) \
- ({ \
- __label__ out; \
- __label__ iserr; \
- INTERNAL_SYSCALL_DECL (sc_err); \
- long int sc_ret; \
- \
- __typeof (__vdso_##name) vdsop = __vdso_##name; \
- if (vdsop != NULL) \
- { \
- struct syscall_return_value rv = vdsop (args); \
- sc_ret = rv.value; \
- sc_err = rv.error; \
- if (!INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
- goto out; \
- if (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err) != ENOSYS) \
- goto iserr; \
- } \
- \
- sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, ##args); \
- if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
- { \
- iserr: \
- __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err)); \
- sc_ret = -1L; \
- } \
- out: \
- sc_ret; \
- })
-# define INTERNAL_VSYSCALL(name, err, nr, args...) \
- ({ \
- __label__ out; \
- long int v_ret; \
- \
- __typeof (__vdso_##name) vdsop = __vdso_##name; \
- if (vdsop != NULL) \
- { \
- struct syscall_return_value rv = vdsop (args); \
- v_ret = rv.value; \
- err = rv.error; \
- if (!INTERNAL_SYSCALL_ERROR_P (v_ret, err) \
- || INTERNAL_SYSCALL_ERRNO (v_ret, err) != ENOSYS) \
- goto out; \
- } \
- v_ret = INTERNAL_SYSCALL (name, err, nr, ##args); \
- out: \
- v_ret; \
- })
-# else
-# define INLINE_VSYSCALL(name, nr, args...) \
- INLINE_SYSCALL (name, nr, ##args)
-# define INTERNAL_VSYSCALL(name, err, nr, args...) \
- INTERNAL_SYSCALL (name, err, nr, ##args)
-# endif
-#endif /* not __ASSEMBLER__ */
+#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \
+ ({ \
+ struct syscall_return_value rv = funcptr (args); \
+ err = rv.error; \
+ rv.value; \
+ })
/* List of system calls which are supported as vsyscalls. */
#define HAVE_CLOCK_GETTIME_VSYSCALL 1
+#endif /* __ASSEMBLER__ */
+
/* Pointer mangling support. */
#if IS_IN (rtld)
/* We cannot use the thread descriptor because in ld.so we use setjmp