diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 65 |
1 files changed, 5 insertions, 60 deletions
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"); \ |