blob: df46997d9db345aa6fd1fc6c3a00ed3a2f4882bb [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/* 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, 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#include <bits/setjmp.h>
23
24.global setjmp
25.type setjmp,%function
26setjmp:
27 movl 4 (%esp), %eax
28 /* Save registers. */
29 movl %ebx, (0 *4)(%eax)
30 movl %esi, (1 *4)(%eax)
31 movl %edi, (2 *4)(%eax)
32 /* Save SP as it will be after we return. */
33 leal 4 (%esp), %ecx
34 movl %ecx, (4 *4)(%eax)
35 /* Save PC we are returning to now. */
36 movl 0 (%esp), %ecx
37 movl %ecx, (5 *4)(%eax)
38 /* Save caller's frame pointer. */
39 movl %ebp, (3 *4)(%eax)
40
41 /* Call __sigjmp_save. */
42 pushl $1
43 pushl 8(%esp)
44#ifdef __PIC__
45 /* We cannot use the PLT, because it requires that %ebx be set, but
46 we can't save and restore our caller's value. Instead, we do an
47 indirect jump through the GOT, using for the temporary register
48 %ecx, which is call-clobbered. */
49 call here2
50here2: popl %ecx
51 addl $_GLOBAL_OFFSET_TABLE_+[.-here2], %ecx
52 movl __sigjmp_save @GOT (%ecx), %ecx
53 call *%ecx
54#else
55 call __sigjmp_save
56#endif
57 popl %ecx
58 popl %edx
59 ret
60.size setjmp,.-setjmp