S/390: Add SystemTap probes to longjmp and setjmp.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Thu, 13 Nov 2014 09:44:42 +0000 (10:44 +0100)
committerAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Thu, 13 Nov 2014 09:44:42 +0000 (10:44 +0100)
ChangeLog
sysdeps/s390/s390-32/__longjmp.c
sysdeps/s390/s390-32/setjmp.S
sysdeps/s390/s390-64/__longjmp.c
sysdeps/s390/s390-64/setjmp.S

index 6648967..aeabc76 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2014-11-13  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
+       * sysdeps/s390/s390-32/setjmp.S (__sigsetjmp):
+       Add setjmp LIBC_PROBE.
+       * sysdeps/s390/s390-64/setjmp.S (__sigsetjmp):
+       Likewise.
+       * sysdeps/s390/s390-32/__longjmp.c (__longjmp):
+       Add longjmp, longjmp_target LIBC_PROBE.
+       * sysdeps/s390/s390-64/__longjmp.c (__longjmp):
+       Likewise.
+
+2014-11-13  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
        * sysdeps/s390/s390-64/dl-machine.h (elf_machine_rela):
        Gate the definition of refsym additionally with !RTLD_BOOTSTRAP
        to get rid of unused variable warning.
index 5d46e21..54e5915 100644 (file)
@@ -22,6 +22,7 @@
 #include <bits/setjmp.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <stap-probe.h>
 
 /* Jump to the position specified by ENV, causing the
    setjmp call there to return VAL, or 1 if VAL is 0.  */
@@ -42,17 +43,31 @@ __longjmp (__jmp_buf env, int val)
   register void *r1 __asm ("%r1") = (void *) env;
 #endif
   /* Restore registers and jump back.  */
-  asm volatile ("ld   %%f6,48(%1)\n\t"
-               "ld   %%f4,40(%1)\n\t"
+  asm volatile (
+               /* longjmp probe expects longjmp first argument, second
+                  argument and target address.  */
 #ifdef PTR_DEMANGLE
-               "lm   %%r6,%%r13,0(%1)\n\t"
                "lm   %%r4,%%r5,32(%1)\n\t"
                "xr   %%r4,%2\n\t"
                "xr   %%r5,%2\n\t"
+               LIBC_PROBE_ASM (longjmp, 4@%1 -4@%0 4@%%r4)
+#else
+               LIBC_PROBE_ASM (longjmp, 4@%1 -4@%0 4@%%r14)
+#endif
+
+               /* restore fpregs  */
+               "ld   %%f6,48(%1)\n\t"
+               "ld   %%f4,40(%1)\n\t"
+
+               /* restore gregs and return to jmp_buf target  */
+#ifdef PTR_DEMANGLE
+               "lm   %%r6,%%r13,0(%1)\n\t"
                "lr   %%r15,%%r5\n\t"
+               LIBC_PROBE_ASM (longjmp_target, 4@%1 -4@%0 4@%%r4)
                "br   %%r4"
 #else
                "lm   %%r6,%%r15,0(%1)\n\t"
+               LIBC_PROBE_ASM (longjmp_target, 4@%1 -4@%0 4@%%r14)
                "br   %%r14"
 #endif
                : : "r" (r2),
index c0cf3ab..f601f25 100644 (file)
@@ -22,6 +22,7 @@
 #define _SETJMP_H
 #include <bits/setjmp.h>
 #include <shlib-compat.h>
+#include <stap-probe.h>
 
 #if !defined IS_IN_rtld
 # if defined SHARED &&  SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
@@ -53,6 +54,9 @@ END (__setjmp)
 
 ENTRY(__sigsetjmp)
 .Linternal_sigsetjmp:
+       /* setjmp probe expects sig/setjmp first argument (4@%r2), second
+          argument (-4@%r3) and target address (4@%r14).  */
+       LIBC_PROBE (setjmp, 3, 4@%r2, -4@%r3, 4@%r14)
 #ifdef PTR_MANGLE
        stm    %r6,%r13,0(%r2)      /* store registers in jmp_buf */
        lr     %r4,%r14
index 168ebf5..e2b13f8 100644 (file)
@@ -22,6 +22,7 @@
 #include <bits/setjmp.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <stap-probe.h>
 
 /* Jump to the position specified by ENV, causing the
    setjmp call there to return VAL, or 1 if VAL is 0.  */
@@ -42,7 +43,20 @@ __longjmp (__jmp_buf env, int val)
   register void *r1 __asm ("%r1") = (void *) env;
 #endif
   /* Restore registers and jump back.  */
-  asm volatile ("ld    %%f8,80(%1)\n\t"
+  asm volatile (
+               /* longjmp probe expects longjmp first argument, second
+                  argument and target address.  */
+#ifdef PTR_DEMANGLE
+               "lmg  %%r4,%%r5,64(%1)\n\t"
+               "xgr  %%r4,%2\n\t"
+               "xgr  %%r5,%2\n\t"
+               LIBC_PROBE_ASM (longjmp, 8@%1 -4@%0 8@%%r4)
+#else
+               LIBC_PROBE_ASM (longjmp, 8@%1 -4@%0 8@%%r14)
+#endif
+
+               /* restore fpregs  */
+               "ld    %%f8,80(%1)\n\t"
                "ld    %%f9,88(%1)\n\t"
                "ld    %%f10,96(%1)\n\t"
                "ld    %%f11,104(%1)\n\t"
@@ -50,15 +64,16 @@ __longjmp (__jmp_buf env, int val)
                "ld    %%f13,120(%1)\n\t"
                "ld    %%f14,128(%1)\n\t"
                "ld    %%f15,136(%1)\n\t"
+
+               /* restore gregs and return to jmp_buf target  */
 #ifdef PTR_DEMANGLE
                "lmg  %%r6,%%r13,0(%1)\n\t"
-               "lmg  %%r4,%%r5,64(%1)\n\t"
-               "xgr  %%r4,%2\n\t"
-               "xgr  %%r5,%2\n\t"
                "lgr  %%r15,%%r5\n\t"
+               LIBC_PROBE_ASM (longjmp_target, 8@%1 -4@%0 8@%%r4)
                "br   %%r4"
 #else
                "lmg  %%r6,%%r15,0(%1)\n\t"
+               LIBC_PROBE_ASM (longjmp_target, 8@%1 -4@%0 8@%%r14)
                "br   %%r14"
 #endif
                : : "r" (r2),
index faa2784..03de2bf 100644 (file)
@@ -22,6 +22,7 @@
 #define _SETJMP_H
 #include <bits/setjmp.h>
 #include <shlib-compat.h>
+#include <stap-probe.h>
 
 #if !defined IS_IN_rtld
 # if defined SHARED &&  SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
@@ -53,6 +54,9 @@ END (__setjmp)
 
 ENTRY(__sigsetjmp)
 .Linternal_sigsetjmp:
+       /* setjmp probe expects sig/setjmp first argument (8@%r2), second
+          argument (-8@%r3) and target address (8@%r14).  */
+       LIBC_PROBE (setjmp, 3, 8@%r2, -4@%r3, 8@%r14)
 #ifdef PTR_MANGLE
        stmg   %r6,%r13,0(%r2)      /* Store registers in jmp_buf.  */
        lgr    %r4,%r14