aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/s390
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-12-06 00:20:16 +0000
committerUlrich Drepper <drepper@redhat.com>2003-12-06 00:20:16 +0000
commit844a34a2ae4b493f86ed1e79c5992329b54a5511 (patch)
tree4c28fbeb9a311bd9acfa4a7a7d11f133ae516603 /sysdeps/s390
parentdd17514ce7a10d785b977586224d31563888cb9d (diff)
downloadglibc-844a34a2ae4b493f86ed1e79c5992329b54a5511.zip
glibc-844a34a2ae4b493f86ed1e79c5992329b54a5511.tar.gz
glibc-844a34a2ae4b493f86ed1e79c5992329b54a5511.tar.bz2
Update.
2003-12-05 Martin Schwidefsky <schwidefsky@de.ibm.com> * sysdeps/s390/s390-32/elf/setjmp.S (setjmp, __setjmp): Add END statements. * sysdeps/s390/s390-64/elf/setjmp.S (setjmp, __setjmp): Likewise. * sysdeps/s390/s390-32/sysdep.h (ENTRY): Add cfi_startproc directive. (END): Add cfi_endproc directive. * sysdeps/s390/s390-64/sysdep.h (ENTRY, END): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/socket.S (__socket): Remove cfi_startproc and cfi_endproc directive. * sysdeps/unix/sysv/linux/s390/s390-64/socket.S (__socket): Likewise. * sysdeps/s390/s390-32/addmul_1.S (__mpn_addmul_1): Add CFI directives. * sysdeps/s390/s390-32/add_n.S (__mpn_add_n): Likewise. * sysdeps/s390/s390-64/add_n.S (__mpn_add_n): Likewise. * sysdeps/s390/s390-32/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE): Likewise. * sysdeps/s390/s390-64/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE): Likewise. * sysdeps/s390/s390-32/mul_1.S (__mpn_mul_1): Likewise. * sysdeps/s390/s390-32/sub_n.S (__mpn_sub_n): Likewise. * sysdeps/s390/s390-64/sub_n.S (__mpn_sub_n): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S (__mmap64): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/mmap.S (__mmap): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/mmap.S (__mmap): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/syscall.S (syscall): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/syscall.S (syscall): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S (__syscall_error): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S (__syscall_error): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/clone.S (__clone): Add CFI directives. Move thread_start out of ENTRY/PSEUDO_END block to make backchain terminate. * sysdeps/unix/sysv/linux/s390/s390-64/clone.S (__clone): Likewise. * sysdeps/s390/s390-32/backtrace.c (trace_arg): New structure. (unwind_backtrace, unwind_getip): New variables. (init, __backchain_backtrace, backtrace_helper): New functions. (__backtrace): Use unwind info for backtrace instead of backchain walking if the unwind functions can be found. * sysdeps/s390/s390-64/backtrace.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c: New file. * sysdeps/unix/sysv/linux/s390/sys/procfs.h (ELF_NGREG32): New #define. (elf_greg_t32, elf_gregset_t32, elf_fpregset_t32): New types. (elf_prstatus32, elf_prpsinfo32): New structures. (prgregset32_t, prfpregset32_t, prstatus32_t, prpsinfo32_t): New types. * scripts/data/c++-types-s390-linux-gnu.data: New file. * scripts/data/c++-types-s390x-linux-gnu.data: New file.
Diffstat (limited to 'sysdeps/s390')
-rw-r--r--sysdeps/s390/s390-32/add_n.S1
-rw-r--r--sysdeps/s390/s390-32/addmul_1.S1
-rw-r--r--sysdeps/s390/s390-32/backtrace.c68
-rw-r--r--sysdeps/s390/s390-32/dl-machine.h12
-rw-r--r--sysdeps/s390/s390-32/elf/setjmp.S6
-rw-r--r--sysdeps/s390/s390-32/mul_1.S1
-rw-r--r--sysdeps/s390/s390-32/sub_n.S1
-rw-r--r--sysdeps/s390/s390-32/sysdep.h2
-rw-r--r--sysdeps/s390/s390-64/add_n.S1
-rw-r--r--sysdeps/s390/s390-64/backtrace.c64
-rw-r--r--sysdeps/s390/s390-64/dl-machine.h12
-rw-r--r--sysdeps/s390/s390-64/elf/setjmp.S6
-rw-r--r--sysdeps/s390/s390-64/sub_n.S1
-rw-r--r--sysdeps/s390/s390-64/sysdep.h2
14 files changed, 168 insertions, 10 deletions
diff --git a/sysdeps/s390/s390-32/add_n.S b/sysdeps/s390/s390-32/add_n.S
index 8183017..b7e6682 100644
--- a/sysdeps/s390/s390-32/add_n.S
+++ b/sysdeps/s390/s390-32/add_n.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_add_n)
st %r6,24(%r15) # save register 6
+ cfi_offset (%r6, -72)
sr %r1,%r1
lhi %r0,1 # cannot use ahi to add carry, use alr
.L0: l %r6,0(%r1,%r3) # .L0 -> no carry from last add
diff --git a/sysdeps/s390/s390-32/addmul_1.S b/sysdeps/s390/s390-32/addmul_1.S
index f83c345..40ba871 100644
--- a/sysdeps/s390/s390-32/addmul_1.S
+++ b/sysdeps/s390/s390-32/addmul_1.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_addmul_1)
st %r6,24(%r15)
+ cfi_offset (%r6, -72)
slr %r6,%r6 # cy_limb = 0
.L0: icm %r1,15,0(%r3) # get s1_ptr[i]
mr %r0,%r5 # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
diff --git a/sysdeps/s390/s390-32/backtrace.c b/sysdeps/s390/s390-32/backtrace.c
index 11d2219..c52750c 100644
--- a/sysdeps/s390/s390-32/backtrace.c
+++ b/sysdeps/s390/s390-32/backtrace.c
@@ -1,5 +1,5 @@
/* Return backtrace of current program state.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -18,8 +18,12 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <bits/libc-lock.h>
+#include <dlfcn.h>
#include <execinfo.h>
#include <stddef.h>
+#include <stdlib.h>
+#include <unwind.h>
/* This is a global variable set at program start time. It marks the
highest used stack address. */
@@ -51,10 +55,31 @@ struct layout
int empty[2];
};
-int
-__backtrace (array, size)
- void **array;
- int size;
+struct trace_arg
+{
+ void **array;
+ int cnt, size;
+};
+
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+
+static void
+init (void)
+{
+ void *handle = __libc_dlopen ("libgcc_s.so.1");
+
+ if (handle == NULL)
+ return;
+
+ unwind_backtrace = __libc_dlsym (handle, "_Unwind_Backtrace");
+ unwind_getip = __libc_dlsym (handle, "_Unwind_GetIP");
+ if (unwind_getip == NULL)
+ unwind_backtrace = NULL;
+}
+
+static int
+__backchain_backtrace (void **array, int size)
{
/* We assume that all the code is generated with frame pointers set. */
struct layout *stack;
@@ -71,11 +96,42 @@ __backtrace (array, size)
out of range. */
break;
- array[cnt++] = stack->save_grps[8] & 0x7fffffff;
+ array[cnt++] = (void *) (stack->save_grps[8] & 0x7fffffff);
stack = (struct layout *) stack->back_chain;
}
return cnt;
}
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+ struct trace_arg *arg = a;
+
+ /* We are first called with address in the __backtrace function.
+ Skip it. */
+ if (arg->cnt != -1)
+ arg->array[arg->cnt] = (void *) unwind_getip (ctx);
+ if (++arg->cnt == arg->size)
+ return _URC_END_OF_STACK;
+ return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+ struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
+ __libc_once_define (static, once);
+
+ __libc_once (once, init);
+ if (unwind_backtrace == NULL)
+ return __backchain_backtrace (array, size);
+
+ if (size >= 1)
+ unwind_backtrace (backtrace_helper, &arg);
+
+ return arg.cnt != -1 ? arg.cnt : 0;
+}
+
weak_alias (__backtrace, backtrace)
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index 9eb0419..7a7dfbe 100644
--- a/sysdeps/s390/s390-32/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -146,12 +146,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
# save registers\n\
stm 2,5,32(15)\n\
st 14,48(15)\n\
lr 0,15\n\
ahi 15,-96\n\
+ " CFI_ADJUST_CFA_OFFSET(96)"\n\
st 0,0(15)\n\
# load args saved by PLT\n\
lm 2,3,120(15)\n\
@@ -162,21 +164,25 @@ _dl_runtime_resolve:\n\
lr 1,2 # function addr returned in r2\n\
# restore registers\n\
ahi 15,96\n\
+ " CFI_ADJUST_CFA_OFFSET(-96)" \n\
l 14,48(15)\n\
lm 2,5,32(15)\n\
br 1\n\
1: .long fixup-1b\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
\n\
.globl _dl_runtime_profile\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_profile:\n\
# save registers\n\
stm 2,5,32(15)\n\
st 14,48(15)\n\
lr 0,15\n\
ahi 15,-96\n\
+ " CFI_ADJUST_CFA_OFFSET(96)"\n\
st 0,0(15)\n\
# load args saved by PLT\n\
lm 2,3,120(15)\n\
@@ -189,10 +195,12 @@ _dl_runtime_profile:\n\
lr 1,2 # function addr returned in r2\n\
# restore registers\n\
ahi 15,96\n\
+ " CFI_ADJUST_CFA_OFFSET(-96)" \n\
l 14,48(15)\n\
lm 2,5,32(15)\n\
br 1\n\
1: .long profile_fixup-1b\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
#else
@@ -204,6 +212,7 @@ _dl_runtime_profile:\n\
.type _dl_runtime_resolve, @function\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
_dl_runtime_profile:\n\
# save registers\n\
@@ -211,6 +220,7 @@ _dl_runtime_profile:\n\
st 14,48(15)\n\
lr 0,15\n\
ahi 15,-96\n\
+ " CFI_ADJUST_CFA_OFFSET(96)"\n\
st 0,0(15)\n\
# load args saved by PLT\n\
lm 2,3,120(15)\n\
@@ -223,10 +233,12 @@ _dl_runtime_profile:\n\
lr 1,2 # function addr returned in r2\n\
# restore registers\n\
ahi 15,96\n\
+ " CFI_ADJUST_CFA_OFFSET(-96)" \n\
l 14,48(15)\n\
lm 2,5,32(15)\n\
br 1\n\
1: .long fixup-1b\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
diff --git a/sysdeps/s390/s390-32/elf/setjmp.S b/sysdeps/s390/s390-32/elf/setjmp.S
index f785201..0d1fa8e 100644
--- a/sysdeps/s390/s390-32/elf/setjmp.S
+++ b/sysdeps/s390/s390-32/elf/setjmp.S
@@ -34,9 +34,15 @@ END (setjmp)
/* Binary compatibility entry point. */
ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp)
+ lhi %r3,0 /* second argument of zero */
+ j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (_setjmp)
libc_hidden_def (_setjmp)
+
ENTRY(__setjmp)
lhi %r3,0 /* second argument of zero */
+ j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
+END (__setjmp)
ENTRY(__sigsetjmp)
.Linternal_sigsetjmp:
diff --git a/sysdeps/s390/s390-32/mul_1.S b/sysdeps/s390/s390-32/mul_1.S
index 92c18e4..0194476 100644
--- a/sysdeps/s390/s390-32/mul_1.S
+++ b/sysdeps/s390/s390-32/mul_1.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_mul_1)
st %r6,24(%r15)
+ cfi_offset (%r6, -72)
slr %r6,%r6 # cy_limb = 0
.L0: icm %r1,15,0(%r3) # get s1_ptr[i]
mr %r0,%r5 # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
diff --git a/sysdeps/s390/s390-32/sub_n.S b/sysdeps/s390/s390-32/sub_n.S
index 1241b1b..058183b 100644
--- a/sysdeps/s390/s390-32/sub_n.S
+++ b/sysdeps/s390/s390-32/sub_n.S
@@ -32,6 +32,7 @@
ENTRY(__mpn_sub_n)
st %r6,24(%r15) # save register 6
+ cfi_offset (%r6, -72)
sr %r1,%r1
lhi %r0,1 # cannot use ahi to add carry, use slr
.L0: l %r6,0(%r1,%r3) # .L0 -> no carry from last sub
diff --git a/sysdeps/s390/s390-32/sysdep.h b/sysdeps/s390/s390-32/sysdep.h
index 941575b..f2d5bad 100644
--- a/sysdeps/s390/s390-32/sysdep.h
+++ b/sysdeps/s390/s390-32/sysdep.h
@@ -51,10 +51,12 @@
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
.align ALIGNARG(2); \
C_LABEL(name) \
+ cfi_startproc; \
CALL_MCOUNT
#undef END
#define END(name) \
+ cfi_endproc; \
ASM_SIZE_DIRECTIVE(name) \
/* If compiled for profiling, call `mcount' at the start of each function. */
diff --git a/sysdeps/s390/s390-64/add_n.S b/sysdeps/s390/s390-64/add_n.S
index c4e0a62..51bf73f 100644
--- a/sysdeps/s390/s390-64/add_n.S
+++ b/sysdeps/s390/s390-64/add_n.S
@@ -33,6 +33,7 @@
.text
ENTRY(__mpn_add_n)
stg %r6,48(%r15) # save register 6
+ cfi_offset (%r6,-112)
slgr %r1,%r1
lghi %r0,1 # cannot use ahi to add carry, use alr
.L0: lg %r6,0(%r1,%r3) # .L0 -> no carry from last add
diff --git a/sysdeps/s390/s390-64/backtrace.c b/sysdeps/s390/s390-64/backtrace.c
index 1eed72a..8efdc6c 100644
--- a/sysdeps/s390/s390-64/backtrace.c
+++ b/sysdeps/s390/s390-64/backtrace.c
@@ -1,5 +1,5 @@
/* Return backtrace of current program state. 64 bit S/390 version.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2003 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -18,8 +18,12 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <bits/libc-lock.h>
+#include <dlfcn.h>
#include <execinfo.h>
#include <stddef.h>
+#include <stdlib.h>
+#include <unwind.h>
/* This is a global variable set at program start time. It marks the
@@ -50,10 +54,31 @@ struct layout
long empty[2];
};
+struct trace_arg
+{
+ void **array;
+ int cnt, size;
+};
+
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+
+static void
+init (void)
+{
+ void *handle = __libc_dlopen ("libgcc_s.so.1");
+
+ if (handle == NULL)
+ return;
+
+ unwind_backtrace = __libc_dlsym (handle, "_Unwind_Backtrace");
+ unwind_getip = __libc_dlsym (handle, "_Unwind_GetIP");
+ if (unwind_getip == NULL)
+ unwind_backtrace = NULL;
+}
+
int
-__backtrace (array, size)
- void **array;
- int size;
+__backchain_backtrace (void **array, int size)
{
/* We assume that all the code is generated with frame pointers set. */
struct layout *stack;
@@ -77,4 +102,35 @@ __backtrace (array, size)
return cnt;
}
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+ struct trace_arg *arg = a;
+
+ /* We are first called with address in the __backtrace function.
+ Skip it. */
+ if (arg->cnt != -1)
+ arg->array[arg->cnt] = (void *) unwind_getip (ctx);
+ if (++arg->cnt == arg->size)
+ return _URC_END_OF_STACK;
+ return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+ struct trace_arg arg = { .array = array, .size = size, .cnt = -1 };
+ __libc_once_define (static, once);
+
+ __libc_once (once, init);
+ if (unwind_backtrace == NULL)
+ return __backchain_backtrace (array, size);
+
+ if (size >= 1)
+ unwind_backtrace (backtrace_helper, &arg);
+
+ return arg.cnt != -1 ? arg.cnt : 0;
+}
+
weak_alias (__backtrace, backtrace)
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
index 2d9e63a..c898c7f 100644
--- a/sysdeps/s390/s390-64/dl-machine.h
+++ b/sysdeps/s390/s390-64/dl-machine.h
@@ -139,12 +139,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
# save registers\n\
stmg 2,5,64(15)\n\
stg 14,96(15)\n\
lgr 0,15\n\
aghi 15,-160\n\
+ " CFI_ADJUST_CFA_OFFSET(160)"\n\
stg 0,0(15)\n\
# load args saved by PLT\n\
lmg 2,3,208(15)\n\
@@ -152,20 +154,24 @@ _dl_runtime_resolve:\n\
lgr 1,2 # function addr returned in r2\n\
# restore registers\n\
aghi 15,160\n\
+ " CFI_ADJUST_CFA_OFFSET(-160)" \n\
lg 14,96(15)\n\
lmg 2,5,64(15)\n\
br 1\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
\n\
.globl _dl_runtime_profile\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_profile:\n\
# save registers\n\
stmg 2,5,64(15)\n\
stg 14,96(15)\n\
lgr 0,15\n\
aghi 15,-160\n\
+ " CFI_ADJUST_CFA_OFFSET(160)"\n\
stg 0,0(15)\n\
# load args saved by PLT\n\
lmg 2,3,208(15)\n\
@@ -175,9 +181,11 @@ _dl_runtime_profile:\n\
lgr 1,2 # function addr returned in r2\n\
# restore registers\n\
aghi 15,160\n\
+ " CFI_ADJUST_CFA_OFFSET(-160)" \n\
lg 14,96(15)\n\
lmg 2,5,64(15)\n\
br 1\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
#else
@@ -189,6 +197,7 @@ _dl_runtime_profile:\n\
.type _dl_runtime_resolve, @function\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
_dl_runtime_profile:\n\
# save registers\n\
@@ -196,6 +205,7 @@ _dl_runtime_profile:\n\
stg 14,96(15)\n\
lgr 0,15\n\
aghi 15,-160\n\
+ " CFI_ADJUST_CFA_OFFSET(160)"\n\
stg 0,0(15)\n\
# load args saved by PLT\n\
lmg 2,3,208(15)\n\
@@ -205,9 +215,11 @@ _dl_runtime_profile:\n\
lgr 1,2 # function addr returned in r2\n\
# restore registers\n\
aghi 15,160\n\
+ " CFI_ADJUST_CFA_OFFSET(-160)" \n\
lg 14,96(15)\n\
lmg 2,5,64(15)\n\
br 1\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
");
diff --git a/sysdeps/s390/s390-64/elf/setjmp.S b/sysdeps/s390/s390-64/elf/setjmp.S
index 657514d..fa3ac72 100644
--- a/sysdeps/s390/s390-64/elf/setjmp.S
+++ b/sysdeps/s390/s390-64/elf/setjmp.S
@@ -34,9 +34,15 @@ END (setjmp)
/* Binary compatibility entry point. */
ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp)
+ slgr %r3,%r3 /* Second argument of zero. */
+ j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
+END (setjmp)
libc_hidden_def (_setjmp)
+
ENTRY(__setjmp)
slgr %r3,%r3 /* Second argument of zero. */
+ j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
+END (setjmp)
ENTRY(__sigsetjmp)
.Linternal_sigsetjmp:
diff --git a/sysdeps/s390/s390-64/sub_n.S b/sysdeps/s390/s390-64/sub_n.S
index 231ab44..65d1c9f 100644
--- a/sysdeps/s390/s390-64/sub_n.S
+++ b/sysdeps/s390/s390-64/sub_n.S
@@ -30,6 +30,7 @@
ENTRY(__mpn_sub_n)
stg %r6,48(%r15) # save register 6
+ cfi_offset (%r6,-112)
sgr %r1,%r1
lghi %r0,1 # cannot use ahi to add carry, use slr
.L0: lg %r6,0(%r1,%r3) # .L0 -> no carry from last sub
diff --git a/sysdeps/s390/s390-64/sysdep.h b/sysdeps/s390/s390-64/sysdep.h
index 2247629..75fee73 100644
--- a/sysdeps/s390/s390-64/sysdep.h
+++ b/sysdeps/s390/s390-64/sysdep.h
@@ -51,10 +51,12 @@
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
.align ALIGNARG(2); \
C_LABEL(name) \
+ cfi_startproc; \
CALL_MCOUNT
#undef END
#define END(name) \
+ cfi_endproc; \
ASM_SIZE_DIRECTIVE(name) \
/* If compiled for profiling, call `mcount' at the start of each function. */