]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/s390/s390-32/elf/setjmp.S
Update to LGPL v2.1.
[thirdparty/glibc.git] / sysdeps / s390 / s390-32 / elf / setjmp.S
CommitLineData
847b055c
AJ
1/* setjmp for s390, ELF version.
2 Copyright (C) 2000 Free Software Foundation, Inc.
3 Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
847b055c
AJ
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 14 Lesser General Public License for more details.
847b055c 15
41bdb6e2
AJ
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA. */
847b055c
AJ
20
21#include <sysdep.h>
22#define _ASM
23#define _SETJMP_H
24#include <bits/setjmp.h>
25
26 /* We include the BSD entry points here as well but we make
27 them weak. */
28ENTRY (setjmp)
29 .weak C_SYMBOL_NAME (setjmp)
30 lhi %r3,1 /* second argument of one */
ffeac417 31 j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
847b055c
AJ
32END (setjmp)
33
ffeac417 34 /* Binary compatibility entry point. */
847b055c
AJ
35ENTRY(_setjmp)
36 .weak C_SYMBOL_NAME (_setjmp)
ffeac417 37ENTRY(__setjmp)
847b055c
AJ
38 lhi %r3,0 /* second argument of zero */
39
40ENTRY(__sigsetjmp)
ffeac417 41.Linternal_sigsetjmp:
847b055c 42 stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
ffeac417
UD
43 std %f4,40(%r2)
44 std %f6,48(%r2)
847b055c
AJ
45#ifdef PIC
46 /* We cannot use the PLT, because it requires that %r12 be set, but
47 we can't save and restore our caller's value. Instead, we do an
48 indirect jump through the GOT. */
49 basr %r1,0
50.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
51 /* get address of __sigjmp_save from got */
52 l %r1,__sigjmp_save@GOT12(0,%r1)
53 br %r1
54.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
55#else
56 basr %r1,0
57.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */
58 br %r1 /* tail-call __sigjmp_save */
59.L1: .long __sigjmp_save
60#endif
61END (__sigsetjmp)