OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / i386 / bsd-setjmp.S
1 /* BSD `setjmp' entry point to `sigsetjmp (..., 1)'.  i386 version.
2    Copyright (C) 1995, 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 .global setjmp
20 .type   setjmp,%function
21 setjmp:
22         movl 4   (%esp), %eax
23         /* Save registers.  */
24         movl %ebx, (0 *4)(%eax)
25         movl %esi, (1 *4)(%eax)
26         movl %edi, (2 *4)(%eax)
27         /* Save SP as it will be after we return.  */
28         leal 4   (%esp), %ecx
29         movl %ecx, (4 *4)(%eax)
30         /* Save PC we are returning to now.  */
31         movl 0 (%esp), %ecx
32         movl %ecx, (5 *4)(%eax)
33         /* Save caller's frame pointer.  */
34         movl %ebp, (3 *4)(%eax)  
35
36         /* Call __sigjmp_save.  */
37         pushl $1
38         pushl 8(%esp)
39 #ifdef  __PIC__
40         /* We cannot use the PLT, because it requires that %ebx be set, but
41            we can't save and restore our caller's value.  Instead, we do an
42            indirect jump through the GOT, using for the temporary register
43            %ecx, which is call-clobbered.  */
44         call here2
45 here2:  popl %ecx
46         addl $_GLOBAL_OFFSET_TABLE_+[.-here2], %ecx
47         movl    __sigjmp_save    @GOT  (%ecx), %ecx
48         call *%ecx
49 #else
50         call __sigjmp_save
51 #endif
52         popl %ecx
53         popl %edx
54         ret
55 .size setjmp,.-setjmp