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
/* Store the magic value and stack pointer */
37
ldr x8, .Lmagic
38
mov x9, sp
39
stp x8, x9, [x0], #16
40
41
/* Store the general purpose registers and lr */
42
stp x19, x20, [x0], #16
43
stp x21, x22, [x0], #16
44
stp x23, x24, [x0], #16
45
stp x25, x26, [x0], #16
46
stp x27, x28, [x0], #16
47
stp x29, lr, [x0], #16
48
49
#ifndef _STANDALONE
50
/* Store the vfp registers */
51
stp d8, d9, [x0], #16
52
stp d10, d11, [x0], #16
53
stp d12, d13, [x0], #16
54
stp d14, d15, [x0]
55
#endif
56
57
/* Return value */
58
mov x0, #0
59
ret
60
.align 3
61
.Lmagic:
62
.quad _JB_MAGIC__SETJMP
63
END(_setjmp)
64
65
ENTRY(_longjmp)
66
/* Check the magic value */
67
ldr x8, [x0], #8
68
ldr x9, .Lmagic
69
cmp x8, x9
70
b.ne botch
71
72
/* Restore the stack pointer */
73
ldr x8, [x0], #8
74
mov sp, x8
75
76
/* Restore the general purpose registers and lr */
77
ldp x19, x20, [x0], #16
78
ldp x21, x22, [x0], #16
79
ldp x23, x24, [x0], #16
80
ldp x25, x26, [x0], #16
81
ldp x27, x28, [x0], #16
82
ldp x29, lr, [x0], #16
83
84
#ifndef _STANDALONE
85
/* Restore the vfp registers */
86
ldp d8, d9, [x0], #16
87
ldp d10, d11, [x0], #16
88
ldp d12, d13, [x0], #16
89
ldp d14, d15, [x0]
90
#endif
91
92
/* Load the return value */
93
cmp x1, #0
94
csinc x0, x1, xzr, ne
95
ret
96
97
botch:
98
#ifdef _STANDALONE
99
b botch
100
#else
101
bl _C_LABEL(longjmperror)
102
bl _C_LABEL(abort)
103
#endif
104
END(_longjmp)
105
106
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)
107
108