Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/arm/gen/setjmp.S
39534 views
1
/* $NetBSD: setjmp.S,v 1.14 2013/04/19 13:45:45 matt Exp $ */
2
3
/*
4
* Copyright (c) 1997 Mark Brinicombe
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. All advertising materials mentioning features or use of this software
16
* must display the following acknowledgement:
17
* This product includes software developed by Mark Brinicombe
18
* 4. Neither the name of the University nor the names of its contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
21
*
22
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* SUCH DAMAGE.
33
*/
34
35
#if !defined(__SOFTFP__) && !defined(__VFP_FP__) && !defined(__ARM_PCS)
36
#error FPA is not supported anymore
37
#endif
38
39
.fpu vfp
40
41
#include <machine/asm.h>
42
#include <machine/setjmp.h>
43
/*
44
* C library -- setjmp, longjmp
45
*
46
* longjmp(a,v)
47
* will generate a "return(v)" from the last call to
48
* setjmp(a)
49
* by restoring registers from the stack.
50
* The previous signal state is restored.
51
*/
52
53
ENTRY(setjmp)
54
/* Block all signals and retrieve the old signal mask */
55
stmfd sp!, {r0, r14}
56
add r2, r0, #(_JB_SIGMASK * 4) /* oset */
57
mov r1, #0x00000000 /* set */
58
mov r0, #0x00000001 /* SIG_BLOCK */
59
bl PIC_SYM(_C_LABEL(sigprocmask), PLT)
60
ldmfd sp!, {r0, r14}
61
62
ldr r1, .Lsetjmp_magic
63
64
#if !defined(SOFTFLOAT_FOR_GCC)
65
add r2, r0, #(_JB_REG_D8 * 4)
66
vstmia r2, {d8-d15}
67
vmrs r2, fpscr
68
str r2, [r0, #(_JB_REG_FPSCR * 4)]
69
#endif
70
71
str r1, [r0] /* store magic */
72
73
/* Store integer registers */
74
add r0, r0, #(_JB_REG_R4 * 4)
75
#ifndef __thumb__
76
stmia r0, {r4-r14}
77
#else
78
stmia r0, {r4-r12}
79
str r13, [r0, #((_JB_REG_R13 - _JB_REG_R4) * 4)]
80
str r14, [r0, #((_JB_REG_R14 - _JB_REG_R4) * 4)]
81
#endif
82
mov r0, #0x00000000
83
RET
84
85
.Lsetjmp_magic:
86
.word _JB_MAGIC_SETJMP
87
END(setjmp)
88
89
.weak _C_LABEL(longjmp)
90
.set _C_LABEL(longjmp), _C_LABEL(__longjmp)
91
ENTRY(__longjmp)
92
ldr r2, [r0]
93
ldr ip, .Lsetjmp_magic
94
teq r2, ip
95
bne .Lbotch
96
97
/* Restore the signal mask. */
98
stmfd sp!, {r0-r2, r14}
99
mov r2, #0x00000000
100
add r1, r0, #(_JB_SIGMASK * 4) /* Signal mask */
101
mov r0, #3 /* SIG_SETMASK */
102
bl PIC_SYM(_C_LABEL(sigprocmask), PLT)
103
ldmfd sp!, {r0-r2, r14}
104
105
#if !defined(SOFTFLOAT_FOR_GCC)
106
add ip, r0, #(_JB_REG_D8 * 4)
107
vldmia ip, {d8-d15}
108
ldr ip, [r0, #(_JB_REG_FPSCR * 4)]
109
vmsr fpscr, ip
110
#endif
111
112
add r0, r0, #(_JB_REG_R4 * 4)
113
/* Restore integer registers */
114
#ifndef __thumb__
115
ldmia r0, {r4-r14}
116
#else
117
ldmia r0, {r4-r12}
118
ldr r13, [r0, #((_JB_REG_R13 - _JB_REG_R4) * 4)]
119
ldr r14, [r0, #((_JB_REG_R14 - _JB_REG_R4) * 4)]
120
#endif
121
122
/* Validate sp and r14 */
123
teq sp, #0
124
it ne
125
teqne r14, #0
126
it eq
127
beq .Lbotch
128
129
/* Set return value */
130
movs r0, r1
131
it eq
132
moveq r0, #0x00000001
133
RET
134
135
/* validation failed, die die die. */
136
.Lbotch:
137
bl PIC_SYM(_C_LABEL(longjmperror), PLT)
138
bl PIC_SYM(_C_LABEL(abort), PLT)
139
1: b 1b /* Cannot get here */
140
END(__longjmp)
141
142
.section .note.GNU-stack,"",%progbits
143
144