diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/gettimeofday.c | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/init-first.c | 23 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/libc-vdso.h | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h | 65 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 65 |
5 files changed, 33 insertions, 133 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/gettimeofday.c b/sysdeps/unix/sysv/linux/s390/gettimeofday.c index e8dee26842..9f98f293fa 100644 --- a/sysdeps/unix/sysv/linux/s390/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/s390/gettimeofday.c @@ -21,7 +21,8 @@ #include <time.h> #include <hp-timing.h> -#include <libc-vdso.h> +#define HAVE_VSYSCALL +#include <sysdep-vdso.h> /* Get the current time of day and timezone information, putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. diff --git a/sysdeps/unix/sysv/linux/s390/init-first.c b/sysdeps/unix/sysv/linux/s390/init-first.c index 2e00a99866..8129967ba5 100644 --- a/sysdeps/unix/sysv/linux/s390/init-first.c +++ b/sysdeps/unix/sysv/linux/s390/init-first.c @@ -23,15 +23,14 @@ # undef __clock_getres # include <libc-vdso.h> -long int (*__vdso_gettimeofday) (struct timeval *, void *) attribute_hidden; +long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) + attribute_hidden; -long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) +long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) __attribute__ ((nocommon)); -strong_alias (__vdso_clock_gettime, __GI___vdso_clock_gettime attribute_hidden) -long int (*__vdso_clock_getres) (clockid_t, struct timespec *) +long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *) __attribute__ ((nocommon)); -strong_alias (__vdso_clock_getres, __GI___vdso_clock_getres attribute_hidden) static inline void @@ -39,9 +38,17 @@ _libc_vdso_platform_setup (void) { PREPARE_VERSION (linux2629, "LINUX_2.6.29", 123718585); - __vdso_gettimeofday = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2629); - __vdso_clock_gettime = _dl_vdso_vsym ("__kernel_clock_gettime", &linux2629); - __vdso_clock_getres = _dl_vdso_vsym ("__kernel_clock_getres", &linux2629); + void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2629); + PTR_MANGLE (p); + VDSO_SYMBOL (gettimeofday) = p; + + p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux2629); + PTR_MANGLE (p); + VDSO_SYMBOL (clock_gettime) = p; + + p = _dl_vdso_vsym ("__kernel_clock_getres", &linux2629); + PTR_MANGLE (p); + VDSO_SYMBOL (clock_getres) = p; } # define VDSO_SETUP _libc_vdso_platform_setup diff --git a/sysdeps/unix/sysv/linux/s390/libc-vdso.h b/sysdeps/unix/sysv/linux/s390/libc-vdso.h index 3fd3d06b79..88d9eaf585 100644 --- a/sysdeps/unix/sysv/linux/s390/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/s390/libc-vdso.h @@ -22,12 +22,14 @@ #ifdef SHARED -extern long int (*__vdso_gettimeofday) (struct timeval *, void *) - attribute_hidden; +#include <sysdep-vdso.h> -extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); +extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) + attribute_hidden; -extern long int (*__vdso_clock_getres) (clockid_t, struct timespec *); +extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); + +extern long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); #endif diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h index 9c194b80a7..a773a2856d 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h @@ -282,77 +282,22 @@ #define HAVE_CLOCK_GETRES_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL 1 -/* 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; \ - long int _ret; \ - \ - if (__vdso_##name != NULL) \ - { \ - _ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, , nr, ##args); \ - if (!INTERNAL_SYSCALL_ERROR_P (_ret, )) \ - goto out; \ - if (INTERNAL_SYSCALL_ERRNO (_ret, ) != ENOSYS) \ - goto iserr; \ - } \ - \ - _ret = INTERNAL_SYSCALL (name, , nr, ##args); \ - if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \ - { \ - iserr: \ - __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ - _ret = -1L; \ - } \ - out: \ - (int) _ret; \ - }) -#else -# define INLINE_VSYSCALL(name, nr, args...) \ - INLINE_SYSCALL (name, nr, ##args) -#endif - -#ifdef SHARED -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ - ({ \ - __label__ out; \ - long int _ret; \ - \ - if (__vdso_##name != NULL) \ - { \ - _ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args); \ - if (!INTERNAL_SYSCALL_ERROR_P (_ret, err) \ - || INTERNAL_SYSCALL_ERRNO (_ret, err) != ENOSYS) \ - goto out; \ - } \ - _ret = INTERNAL_SYSCALL (name, err, nr, ##args); \ - out: \ - _ret; \ - }) -#else -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ - INTERNAL_SYSCALL (name, err, nr, ##args) -#endif - /* This version is for internal uses when there is no desire to set errno */ #define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...) \ ({ \ long int _ret = ENOSYS; \ \ - if (__vdso_##name != NULL) \ - _ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args); \ + __typeof (__vdso_##name) vdsop = __vdso_##name; \ + PTR_DEMANGLE (vdsop); \ + if (vdsop != NULL) \ + _ret = INTERNAL_VSYSCALL_CALL (vdsop, err, nr, ##args); \ else \ err = 1 << 28; \ _ret; \ }) -#define INTERNAL_VSYSCALL_NCS(fn, err, nr, args...) \ +#define INTERNAL_VSYSCALL_CALL(fn, err, nr, args...) \ ({ \ DECLARGS_##nr(args) \ register long _ret asm("2"); \ diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h index 4631cb1160..c944634cde 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h @@ -288,77 +288,22 @@ #define HAVE_CLOCK_GETRES_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL 1 -/* 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; \ - long int _ret; \ - \ - if (__vdso_##name != NULL) \ - { \ - _ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, , nr, ##args); \ - if (!INTERNAL_SYSCALL_ERROR_P (_ret, )) \ - goto out; \ - if (INTERNAL_SYSCALL_ERRNO (_ret, ) != ENOSYS) \ - goto iserr; \ - } \ - \ - _ret = INTERNAL_SYSCALL (name, , nr, ##args); \ - if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \ - { \ - iserr: \ - __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ - _ret = -1L; \ - } \ - out: \ - (int) _ret; \ - }) -#else -# define INLINE_VSYSCALL(name, nr, args...) \ - INLINE_SYSCALL (name, nr, ##args) -#endif - -#ifdef SHARED -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ - ({ \ - __label__ out; \ - long int _ret; \ - \ - if (__vdso_##name != NULL) \ - { \ - _ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args); \ - if (!INTERNAL_SYSCALL_ERROR_P (_ret, err) \ - || INTERNAL_SYSCALL_ERRNO (_ret, err) != ENOSYS) \ - goto out; \ - } \ - _ret = INTERNAL_SYSCALL (name, err, nr, ##args); \ - out: \ - _ret; \ - }) -#else -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ - INTERNAL_SYSCALL (name, err, nr, ##args) -#endif - /* This version is for internal uses when there is no desire to set errno */ #define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...) \ ({ \ long int _ret = ENOSYS; \ \ - if (__vdso_##name != NULL) \ - _ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args); \ + __typeof (__vdso_##name) vdsop = __vdso_##name; \ + PTR_DEMANGLE (vdsop); \ + if (vdsop != NULL) \ + _ret = INTERNAL_VSYSCALL_CALL (vdsop, err, nr, ##args); \ else \ err = 1 << 28; \ _ret; \ }) -#define INTERNAL_VSYSCALL_NCS(fn, err, nr, args...) \ +#define INTERNAL_VSYSCALL_CALL(fn, err, nr, args...) \ ({ \ DECLARGS_##nr(args) \ register long _ret asm("2"); \ |