Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/amd64/gen/sigsetjmp.S
39536 views
1
/*-
2
* Copyright (c) 1990 The Regents of the University of California.
3
* All rights reserved.
4
*
5
* This code is derived from software contributed to Berkeley by
6
* William Jolitz.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
* 3. Neither the name of the University nor the names of its contributors
17
* may be used to endorse or promote products derived from this software
18
* without specific prior written permission.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
* SUCH DAMAGE.
31
*/
32
33
#if defined(LIBC_SCCS) && !defined(lint)
34
.text
35
.asciz "$Id: sigsetjmp.S,v 1.1 1993/12/05 13:01:05 ats Exp $"
36
#endif /* LIBC_SCCS and not lint */
37
#include <machine/asm.h>
38
#include "SYS.h"
39
40
/*-
41
* TODO:
42
* Rename sigsetjmp to __sigsetjmp and siglongjmp to __siglongjmp,
43
* remove the other *jmp functions and define everything in terms
44
* of the renamed functions. This requires compiler support for
45
* the renamed functions (introduced in gcc-2.5.3; previous versions
46
* only supported *jmp with 0 or 1 leading underscores).
47
*
48
* Restore _all_ the registers and the signal mask atomically. Can
49
* use sigreturn() if sigreturn() works.
50
*/
51
52
ENTRY(sigsetjmp)
53
movl %esi,88(%rdi) /* 11; savemask */
54
testl %esi,%esi
55
jz 2f
56
pushq %rdi
57
movq %rdi,%rcx
58
movq $1,%rdi /* SIG_BLOCK */
59
movq $0,%rsi /* (sigset_t*)set */
60
leaq 72(%rcx),%rdx /* 9,10 (sigset_t*)oset */
61
/* stack is 16-byte aligned */
62
call __libc_sigprocmask
63
popq %rdi
64
2: movq %rdi,%rcx
65
movq 0(%rsp),%rdx /* return address */
66
movq %rdx, 0(%rcx) /* 0; return address */
67
movq %rbx, 8(%rcx) /* 1; rbx */
68
movq %rsp,16(%rcx) /* 2; rsp */
69
movq %rbp,24(%rcx) /* 3; rbp */
70
movq %r12,32(%rcx) /* 4; r12 */
71
movq %r13,40(%rcx) /* 5; r13 */
72
movq %r14,48(%rcx) /* 6; r14 */
73
movq %r15,56(%rcx) /* 7; r15 */
74
fnstcw 64(%rcx) /* 8; fpu cw */
75
xorq %rax,%rax
76
ret
77
END(sigsetjmp)
78
79
WEAK_REFERENCE(__siglongjmp, siglongjmp)
80
ENTRY(__siglongjmp)
81
cmpl $0,88(%rdi)
82
jz 2f
83
movq %rdi,%rdx
84
pushq %rdi
85
pushq %rsi
86
movq $3,%rdi /* SIG_SETMASK */
87
leaq 72(%rdx),%rsi /* (sigset_t*)set */
88
movq $0,%rdx /* (sigset_t*)oset */
89
subq $0x8,%rsp /* make the stack 16-byte aligned */
90
call __libc_sigprocmask
91
addq $0x8,%rsp
92
popq %rsi
93
popq %rdi /* jmpbuf */
94
2: movq %rdi,%rdx
95
movq %rsi,%rax /* retval */
96
movq 0(%rdx),%rcx
97
movq 8(%rdx),%rbx
98
movq 16(%rdx),%rsp
99
movq 24(%rdx),%rbp
100
movq 32(%rdx),%r12
101
movq 40(%rdx),%r13
102
movq 48(%rdx),%r14
103
movq 56(%rdx),%r15
104
fldcw 64(%rdx)
105
testq %rax,%rax
106
jnz 1f
107
incq %rax
108
1: movq %rcx,0(%rsp) /* return address */
109
ret
110
END(__siglongjmp)
111
112
.section .note.GNU-stack,"",%progbits
113
114