]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
ad39bb843396e7d47cdd6ba023636f8d146fea9a
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / s390 / s390-32 / __makecontext_ret.S
1 /* Copyright (C) 2012-2015 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
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.
8
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.
13
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/>. */
17
18 #include <sysdep.h>
19
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
27
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
36 2:
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
43 3:
44 .long HIDDEN_JUMPTARGET (exit)@GOTOFF
45 4:
46 .long _GLOBAL_OFFSET_TABLE_-2b
47 #else
48 l %r1,3f-2b(%r13)
49 basr %r14,%r1
50 .align 4
51 3:
52 .long HIDDEN_JUMPTARGET (exit)
53 #endif
54 .align 2
55 j .+2 /* Trap if exit returns for some reason. */
56 END(__makecontext_ret)