Benny Prijono | 0a749f1 | 2005-10-31 21:02:30 +0000 | [diff] [blame^] | 1 | /* 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 |
|