Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/aarch64/gen/setjmp.S
48255 views
1
/*-
2
* Copyright (c) 2014 Andrew Turner
3
* Copyright (c) 2014 The FreeBSD Foundation
4
*
5
* Portions of this software were developed by Andrew Turner
6
* under sponsorship from the FreeBSD Foundation
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
*
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*
29
*/
30
31
#include <machine/asm.h>
32
#include <machine/setjmp.h>
33
#include <sys/elf_common.h>
34
35
ENTRY(setjmp)
36
sub sp, sp, #16
37
stp x0, lr, [sp]
38
39
/* Store the signal mask */
40
add x2, x0, #(_JB_SIGMASK * 8) /* oset */
41
mov x1, #0 /* set */
42
mov x0, #1 /* SIG_BLOCK */
43
bl sigprocmask
44
45
ldp x0, lr, [sp]
46
add sp, sp, #16
47
48
/* Store the magic value and stack pointer */
49
ldr x8, .Lmagic
50
mov x9, sp
51
stp x8, x9, [x0], #16
52
53
/* Store the general purpose registers and lr */
54
stp x19, x20, [x0], #16
55
stp x21, x22, [x0], #16
56
stp x23, x24, [x0], #16
57
stp x25, x26, [x0], #16
58
stp x27, x28, [x0], #16
59
stp x29, lr, [x0], #16
60
61
/* Store the vfp registers */
62
stp d8, d9, [x0], #16
63
stp d10, d11, [x0], #16
64
stp d12, d13, [x0], #16
65
stp d14, d15, [x0]
66
67
/* Return value */
68
mov x0, #0
69
ret
70
.align 3
71
.Lmagic:
72
.quad _JB_MAGIC_SETJMP
73
END(setjmp)
74
75
ENTRY(longjmp)
76
sub sp, sp, #32
77
stp x0, lr, [sp]
78
str x1, [sp, #16]
79
80
/* Restore the signal mask */
81
mov x2, #0 /* oset */
82
add x1, x0, #(_JB_SIGMASK * 8) /* set */
83
mov x0, #3 /* SIG_SETMASK */
84
bl sigprocmask
85
86
ldr x1, [sp, #16]
87
ldp x0, lr, [sp]
88
add sp, sp, #32
89
90
/* Check the magic value */
91
ldr x8, [x0], #8
92
ldr x9, .Lmagic
93
cmp x8, x9
94
b.ne botch
95
96
/* Restore the stack pointer */
97
ldr x8, [x0], #8
98
mov sp, x8
99
100
/* Restore the general purpose registers and lr */
101
ldp x19, x20, [x0], #16
102
ldp x21, x22, [x0], #16
103
ldp x23, x24, [x0], #16
104
ldp x25, x26, [x0], #16
105
ldp x27, x28, [x0], #16
106
ldp x29, lr, [x0], #16
107
108
/* Restore the vfp registers */
109
ldp d8, d9, [x0], #16
110
ldp d10, d11, [x0], #16
111
ldp d12, d13, [x0], #16
112
ldp d14, d15, [x0]
113
114
/* Load the return value */
115
cmp x1, #0
116
csinc x0, x1, xzr, ne
117
ret
118
119
botch:
120
bl _C_LABEL(longjmperror)
121
bl _C_LABEL(abort)
122
END(longjmp)
123
124
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)
125
126