S390: Fix "backtrace() returns infinitely deep stack frames with makecontext()" ...
[glibc.git] / sysdeps / unix / sysv / linux / s390 / s390-32 / __makecontext_ret.S
blobad39bb843396e7d47cdd6ba023636f8d146fea9a
1 /* Copyright (C) 2012-2015 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
20 /* We do not want .eh_frame info so that __makecontext_ret stops unwinding
21    if backtrace was called within a context created by makecontext. (There
22    is also no .eh_frame info for _start or thread_start.)  */
23 #undef cfi_startproc
24 #define cfi_startproc
25 #undef cfi_endproc
26 #define cfi_endproc
28 ENTRY(__makecontext_ret)
29         basr  %r14,%r7
30         ltr   %r8,%r8                   /* Check whether uc_link is 0.  */
31         jz    1f
32         lr    %r2,%r8
33         br    %r9
34 1:      lhi   %r2,0                     /* EXIT return value.  */
35         basr    %r13,0
37 #ifdef PIC
38         l       %r12,4f-2b(%r13)
39         la      %r12,0(%r12,%r13)       /* GOT pointer in r12 after this.  */
40         l       %r1,3f-2b(%r13)
41         bas     %r14,0(%r1,%r12)
42         .align  4
44         .long   HIDDEN_JUMPTARGET (exit)@GOTOFF
46         .long   _GLOBAL_OFFSET_TABLE_-2b
47 #else
48         l       %r1,3f-2b(%r13)
49         basr    %r14,%r1
50         .align  4
52         .long   HIDDEN_JUMPTARGET (exit)
53 #endif
54         .align  2
55         j       .+2                     /* Trap if exit returns for some reason.  */
56 END(__makecontext_ret)