]> sourceware.org Git - glibc.git/commitdiff
S390: Fix backtrace in vdso functions.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Mon, 4 Dec 2017 15:40:13 +0000 (16:40 +0100)
committerStefan Liebler <stli@linux.vnet.ibm.com>
Mon, 4 Dec 2017 15:40:13 +0000 (16:40 +0100)
On s390, GDB fails to show the complete backtrace from within vdso functions.
The macro INTERNAL_VSYSCALL_CALL saves the return address in r14 to r10
before branching to the vdso function. The branch-instruction updates r14
in order to let the vdso function return. Then the original address in r14 is
restored from r10. Unfortunately, there are no cfi-rules and GDB fails.

Furthermore the call of the vdso function does not comply with the s390 ABI
as no stack-frame for the vdso-function is generated.

This patch removes the s390 specific macro INTERNAL_VSYSCALL_CALL
and the common implementation in sysdeps/unix/sysv/linux/sysdep-vdso.h is used.
Then the vdso function is called via function-pointer and GCC generates a
new stack-frame and emits all needed cfi-rules.

The defines CLOBBER_[0-6] are removed as they  were only used in macro
INTERNAL_VSYSCALL_CALL.

The macro INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK is not used on s390.
The only user is power. Thus it is removed from s390 sysdep.h.

ChangeLog:

* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
(INTERNAL_VSYSCALL_CALL, CLOBBER_0, CLOBBER_1, CLOBBER_2,
 CLOBBER_3, CLOBBER_4, CLOBBER_5, CLOBBER_6,
INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK): Remove.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise.

ChangeLog
sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h

index 5983c12c978612bb5b1ce40d165ad562ca4bd1f7..a847985e44c813bc51547549376114bd8a450058 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2017-12-04  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
+       * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
+       (INTERNAL_VSYSCALL_CALL, CLOBBER_0, CLOBBER_1, CLOBBER_2,
+        CLOBBER_3, CLOBBER_4, CLOBBER_5, CLOBBER_6,
+       INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK): Remove.
+       * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise.
+
 2017-12-04  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>
 
        [BZ #5997]
index e56fc3234fa3b02c05dde861a69dd77e52b8bc35..644b83c02ff900e4518b6d9a57154e30395fbfa2 100644 (file)
 #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
 #define HAVE_GETTIMEOFDAY_VSYSCALL     1
 #define HAVE_GETCPU_VSYSCALL           1
 
-/* 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;                                                  \
-                                                                             \
-    __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_CALL(fn, err, nr, args...)                         \
-  ({                                                                         \
-    DECLARGS_##nr(args)                                                              \
-    register long _ret __asm__("2");                                         \
-    __asm__ __volatile__ (                                                   \
-                         "lr 10,14\n\t"                                      \
-                         "basr 14,%1\n\t"                                    \
-                         "lr 14,10\n\t"                                      \
-                         : "=d" (_ret)                                       \
-                         : "d" (fn) ASMFMT_##nr                              \
-                         : "cc", "memory", "0", "1", "10" CLOBBER_##nr);     \
-    _ret; })
-
 /* Pointer mangling support.  */
 #if IS_IN (rtld)
 /* We cannot use the thread descriptor because in ld.so we use setjmp
index 622991d84d72ebaec0021f38286ea446b4a54b6b..18ed3398aa410b35e285280beb89c8772caffe50 100644 (file)
 #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
 
 #define SINGLE_THREAD_BY_GLOBAL                1
 
-/* 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;                                                  \
-                                                                             \
-    __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_CALL(fn, err, nr, args...)                         \
-  ({                                                                         \
-    DECLARGS_##nr(args)                                                              \
-    register long _ret __asm__("2");                                         \
-    __asm__ __volatile__ (                                                   \
-                         "lgr 10,14\n\t"                                     \
-                         "basr 14,%1\n\t"                                    \
-                         "lgr 14,10\n\t"                                     \
-                         : "=d" (_ret)                                       \
-                         : "a" (fn) ASMFMT_##nr                              \
-                         : "cc", "memory", "0", "1", "10" CLOBBER_##nr);     \
-    _ret; })
-
 /* Pointer mangling support.  */
 #if IS_IN (rtld)
 /* We cannot use the thread descriptor because in ld.so we use setjmp
This page took 0.093007 seconds and 5 git commands to generate.