diff options
author | Stefan Liebler <stli@linux.vnet.ibm.com> | 2014-11-13 10:44:42 +0100 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2014-11-13 10:44:42 +0100 |
commit | 53244a4e12797f10c028d2cf0e091330854c44e7 (patch) | |
tree | 5d507bb411c3c4c1131ead9d5eda8ab88fc69d22 /sysdeps/s390/s390-32/__longjmp.c | |
parent | 47df8251e8df7570d9581806113723aeb07dc35d (diff) | |
download | glibc-53244a4e12797f10c028d2cf0e091330854c44e7.tar.gz |
S/390: Add SystemTap probes to longjmp and setjmp.
Diffstat (limited to 'sysdeps/s390/s390-32/__longjmp.c')
-rw-r--r-- | sysdeps/s390/s390-32/__longjmp.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c index 5d46e21923..54e5915700 100644 --- a/sysdeps/s390/s390-32/__longjmp.c +++ b/sysdeps/s390/s390-32/__longjmp.c @@ -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), |