blob: 6810c554f0da3c1c853613999d6532c0ff9f30f6 [file] [log] [blame]
Benny Prijono0a749f12005-10-31 21:02:30 +00001/* setjmp for i386, ELF 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, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
19
20#define _ASM
21#define _SETJMP_H
22#define PJ_LINUX_KERNEL 1
23#include <pj/compat/setjmp.h>
24
25
26.global __sigsetjmp
27.type __sigsetjmp,%function
28.align 4
29
30__sigsetjmp:
31 movl 4 (%esp), %eax
32 /* Save registers. */
33 movl %ebx, (0 *4)(%eax)
34 movl %esi, (1 *4)(%eax)
35 movl %edi, (2 *4)(%eax)
36 /* Save SP as it will be after we return. */
37 leal 4(%esp), %ecx
38 movl %ecx, (4 *4)(%eax)
39 /* Save PC we are returning to now. */
40 movl 0(%esp), %ecx
41 movl %ecx, (5 *4)(%eax)
42 /* Save caller's frame pointer. */
43 movl %ebp, (3 *4)(%eax)
44
45 /* Make a tail call to __sigjmp_save; it takes the same args. */
46#ifdef __PIC__
47 /* We cannot use the PLT, because it requires that %ebx be set, but
48 we can't save and restore our caller's value. Instead, we do an
49 indirect jump through the GOT, using for the temporary register
50 %ecx, which is call-clobbered. */
51 call .Lhere
52.Lhere:
53 popl %ecx
54 addl $_GLOBAL_OFFSET_TABLE_+[.- .Lhere ], %ecx
55 movl __sigjmp_save @GOT (%ecx), %ecx
56 jmp *%ecx
57#else
58 jmp __sigjmp_save
59#endif
60.size __sigsetjmp,.-__sigsetjmp
61