Project

General

Profile

Statistics
| Branch: | Revision:

root / prex-0.9.0 / usr / arch / arm / setjmp.S @ 03e9c04a

History | View | Annotate | Download (3.59 KB)

1
/*	$NetBSD: setjmp.S,v 1.5 2003/04/05 23:08:51 bjh21 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
#include <machine/asm.h>
36
#include <machine/setjmp.h>
37

    
38
/*
39
 * C library -- setjmp, longjmp
40
 *
41
 *	longjmp(a,v)
42
 * will generate a "return(v)" from the last call to
43
 *	setjmp(a)
44
 * by restoring registers from the stack.
45
 * The previous signal state is restored.
46
 */
47

    
48
ENTRY(setjmp)
49
	/* Block all signals and retrieve the old signal mask */
50
	stmfd	sp!, {r0, r14}
51
	mov	r0, #0x00000000
52

    
53
	bl	PIC_SYM(_C_LABEL(sigblock), PLT)
54
	mov	r1, r0
55

    
56
	ldmfd	sp!, {r0, r14}
57

    
58
	/* Store signal mask */
59
	str	r1, [r0, #((25-13) * 4)]
60

    
61
	ldr	r1, .Lsetjmp_magic
62
	str	r1, [r0], #4
63

    
64
#if 0 /* PREX */
65
#ifdef SOFTFLOAT
66
	add	r0, r0, #52
67
#else
68
	/* Store fp registers */
69
	sfm	f4, 4, [r0], #48
70
	/* Store fpsr */
71
	rfs	r1
72
	str	r1, [r0], #0x0004
73
#endif	/*SOFTFLOAT*/
74
#endif
75
	/* Store integer registers */
76
        stmia	r0, {r4-r14}
77
        mov	r0, #0x00000000
78
        mov	r15, r14
79

    
80
.Lsetjmp_magic:
81
	.word	_JB_MAGIC_SETJMP
82

    
83

    
84
ENTRY(longjmp)
85
	ldr	r2, .Lsetjmp_magic
86
	ldr	r3, [r0]
87
	teq	r2, r3
88
	bne	botch
89

    
90
	/* Fetch signal mask */
91
	ldr	r2, [r0, #((25-13) * 4)]
92

    
93
	/* Set signal mask */
94
	stmfd	sp!, {r0, r1, r14}
95
	sub	sp, sp, #4	/* align the stack */
96

    
97
	mov	r0, r2
98
	bl	PIC_SYM(_C_LABEL(sigsetmask), PLT)
99

    
100
	add	sp, sp, #4	/* unalign the stack */
101
	ldmfd	sp!, {r0, r1, r14}
102

    
103
	add	r0, r0, #4
104
#if 0 /* PREX */
105
#ifdef SOFTFLOAT
106
	add	r0, r0, #52
107
#else
108
	/* Restore fp registers */
109
	lfm	f4, 4, [r0], #48
110
	/* Restore FPSR */
111
	ldr	r4, [r0], #0x0004
112
	wfs	r4
113
#endif	/* SOFTFLOAT */
114
#endif
115
	/* Restore integer registers */
116
        ldmia	r0, {r4-r14}
117

    
118
	/* Validate sp and r14 */
119
	teq	sp, #0
120
	teqne	r14, #0
121
	beq	botch
122

    
123
	/* Set return value */
124

    
125
	mov	r0, r1
126
	teq	r0, #0x00000000
127
	moveq	r0, #0x00000001
128
#ifdef __ARM_26__
129
	mov	r15, r14
130
#else
131
	mov	r15, r14
132
#endif
133

    
134
	/* validation failed, die die die. */
135
botch:
136
#if 0 /* PREX */
137
	bl	PIC_SYM(_C_LABEL(longjmperror), PLT)
138
#endif
139
	bl	PIC_SYM(_C_LABEL(abort), PLT)
140
	b	. - 8		/* Cannot get here */