diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-01-08 00:28:23 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-01-08 00:28:23 +0000 |
commit | 0480c901736591179cdf675697df7ea476720b90 (patch) | |
tree | 084399762cae7d0c4969cf3b3d79133afeb5d722 /sysdeps/unix/sysv/linux/s390/s390-64 | |
parent | b3918c7d7f99828d23232d0aaf4056f8fae9898e (diff) | |
download | glibc-0480c901736591179cdf675697df7ea476720b90.tar.gz glibc-0480c901736591179cdf675697df7ea476720b90.tar.xz glibc-0480c901736591179cdf675697df7ea476720b90.zip |
* sysdeps/unix/sysv/linux/s390/bits/libc-vdso.h: New file.
* sysdeps/unix/sysv/linux/s390/gettimeofday.c: New file. * sysdeps/unix/sysv/linux/s390/init-first.c: New file. * sysdeps/unix/sysv/linux/s390/Makefile (sysdep_routines): Add dl-vdso for elf subdir. * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (INLINE_VSYSCALL, INTERNAL_VSYSCALL, INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK, INTERNAL_SYSCALL_NCS, HAVE_CLOCK_GETRES_VSYSCALL and HAVE_CLOCK_GETTIME_VSYSCALL: Define. * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/s390/Versions: New file.
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390/s390-64')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 102 |
1 files changed, 101 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h index 9ddec8e041..6491a3b7b6 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h @@ -1,5 +1,5 @@ /* Assembler macros for 64 bit S/390. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -27,6 +27,11 @@ #include <dl-sysdep.h> /* For RTLD_PRIVATE_ERRNO. */ #include <tls.h> +/* Define __set_errno() for INLINE_SYSCALL macro below. */ +#ifndef __ASSEMBLER__ +#include <errno.h> +#endif + /* For Linux we can use the system call table in the header file /usr/include/asm/unistd.h of the kernel. But these symbols do not follow the SYS_* syntax @@ -278,6 +283,101 @@ #define ASMFMT_5 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6) #define ASMFMT_6 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6), "d" (gpr7) +#define CLOBBER_0 , "3", "4", "5" +#define CLOBBER_1 , "3", "4", "5" +#define CLOBBER_2 , "4", "5" +#define CLOBBER_3 , "5" +#define CLOBBER_4 +#define CLOBBER_5 +#define CLOBBER_6 + +/* List of system calls which are supported as vsyscalls. */ +#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); \ + else \ + err = 1 << 28; \ + _ret; \ + }) + +#define INTERNAL_VSYSCALL_NCS(fn, err, nr, args...) \ + ({ \ + DECLARGS_##nr(args) \ + register long _ret asm("2"); \ + asm volatile ( \ + "lgr 11,14\n\t" \ + "basr 14,%1\n\t" \ + "lgr 14,11\n\t" \ + : "=d" (_ret) \ + : "a" (fn) ASMFMT_##nr \ + : "cc", "memory", "0", "1", "11" CLOBBER_##nr); \ + _ret; }) + /* Pointer mangling support. */ #if defined NOT_IN_libc && defined IS_IN_rtld /* We cannot use the thread descriptor because in ld.so we use setjmp |