Home | History | Annotate | Line # | Download | only in gen
setjmp.S revision 1.8.10.1
      1  1.8.10.1      matt /*	$NetBSD: setjmp.S,v 1.8.10.1 2007/08/28 17:36:30 matt Exp $	*/
      2       1.1     bjh21 
      3       1.1     bjh21 /*
      4       1.1     bjh21  * Copyright (c) 1997 Mark Brinicombe
      5       1.1     bjh21  * All rights reserved.
      6       1.1     bjh21  *
      7       1.1     bjh21  * Redistribution and use in source and binary forms, with or without
      8       1.1     bjh21  * modification, are permitted provided that the following conditions
      9       1.1     bjh21  * are met:
     10       1.1     bjh21  * 1. Redistributions of source code must retain the above copyright
     11       1.1     bjh21  *    notice, this list of conditions and the following disclaimer.
     12       1.1     bjh21  * 2. Redistributions in binary form must reproduce the above copyright
     13       1.1     bjh21  *    notice, this list of conditions and the following disclaimer in the
     14       1.1     bjh21  *    documentation and/or other materials provided with the distribution.
     15       1.1     bjh21  * 3. All advertising materials mentioning features or use of this software
     16       1.1     bjh21  *    must display the following acknowledgement:
     17       1.1     bjh21  *	This product includes software developed by Mark Brinicombe
     18       1.1     bjh21  * 4. Neither the name of the University nor the names of its contributors
     19       1.1     bjh21  *    may be used to endorse or promote products derived from this software
     20       1.1     bjh21  *    without specific prior written permission.
     21       1.1     bjh21  *
     22       1.1     bjh21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     23       1.1     bjh21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24       1.1     bjh21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25       1.1     bjh21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     26       1.1     bjh21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27       1.1     bjh21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28       1.1     bjh21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29       1.1     bjh21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30       1.1     bjh21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31       1.1     bjh21  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32       1.1     bjh21  * SUCH DAMAGE.
     33       1.1     bjh21  */
     34       1.1     bjh21 
     35       1.1     bjh21 #include <machine/asm.h>
     36       1.1     bjh21 #include <machine/setjmp.h>
     37       1.1     bjh21 
     38       1.1     bjh21 /*
     39       1.1     bjh21  * C library -- setjmp, longjmp
     40       1.1     bjh21  *
     41       1.1     bjh21  *	longjmp(a,v)
     42       1.1     bjh21  * will generate a "return(v)" from the last call to
     43       1.1     bjh21  *	setjmp(a)
     44       1.1     bjh21  * by restoring registers from the stack.
     45       1.1     bjh21  * The previous signal state is restored.
     46       1.1     bjh21  */
     47       1.1     bjh21 
     48       1.8  christos ENTRY(__setjmp14)
     49  1.8.10.1      matt #ifdef __thumb__
     50  1.8.10.1      matt 	/* Get the signal mask. */
     51  1.8.10.1      matt 	push	{r0, r4-r7, lr}
     52  1.8.10.1      matt 	add	r0, r0, #(_JB_SIGMASK * 4)
     53  1.8.10.1      matt 	mov	r2, r0
     54  1.8.10.1      matt 	mov	r1, #0
     55  1.8.10.1      matt 	mov	r0, #0
     56  1.8.10.1      matt 	bl	PLT_SYM(_C_LABEL(__sigprocmask14))
     57  1.8.10.1      matt 	pop	{r0}
     58  1.8.10.1      matt 
     59  1.8.10.1      matt 	ldr	r2, .Lsetjmp_magic
     60  1.8.10.1      matt 	str	r2, [r0]
     61  1.8.10.1      matt 
     62  1.8.10.1      matt 	add	r0, r0, #56	/* skip magic and floating point */
     63  1.8.10.1      matt 
     64  1.8.10.1      matt 	/* Store integer registers */
     65  1.8.10.1      matt         stmia	r0!, {r4-r7}
     66  1.8.10.1      matt 
     67  1.8.10.1      matt 	mov	r4, r8
     68  1.8.10.1      matt 	mov	r5, r9
     69  1.8.10.1      matt 	mov	r6, r10
     70  1.8.10.1      matt 	mov	r7, r11
     71  1.8.10.1      matt         stmia	r0!, {r4-r7}
     72  1.8.10.1      matt 
     73  1.8.10.1      matt 	mov	r4, r12
     74  1.8.10.1      matt 	mov	r5, r13
     75  1.8.10.1      matt 	mov	r6, r14
     76  1.8.10.1      matt         stmia	r0!, {r4-r6}
     77  1.8.10.1      matt 
     78  1.8.10.1      matt         mov	r0, #0
     79  1.8.10.1      matt         pop	{r4-r7, pc}
     80  1.8.10.1      matt #else
     81       1.8  christos 	/* Get the signal mask. */
     82       1.8  christos 	stmfd	sp!, {r0-r2, r14}
     83       1.8  christos 	add	r2, r0, #(_JB_SIGMASK * 4)
     84       1.8  christos 	mov	r1, #0x00000000
     85       1.1     bjh21 	mov	r0, #0x00000000
     86  1.8.10.1      matt 	bl	PLT_SYM(_C_LABEL(__sigprocmask14))
     87       1.8  christos 	ldmfd	sp!, {r0-r2, r14}
     88       1.1     bjh21 
     89       1.4   thorpej 	ldr	r1, .Lsetjmp_magic
     90  1.8.10.1      matt 	str	r1, [r0]
     91       1.1     bjh21 
     92       1.1     bjh21 #ifdef SOFTFLOAT
     93       1.1     bjh21 	add	r0, r0, #52
     94       1.1     bjh21 #else
     95       1.1     bjh21 	/* Store fp registers */
     96       1.1     bjh21 	sfm	f4, 4, [r0], #48
     97       1.1     bjh21 	/* Store fpsr */
     98       1.1     bjh21 	rfs	r1
     99       1.1     bjh21 	str	r1, [r0], #0x0004
    100       1.1     bjh21 #endif	/*SOFTFLOAT*/
    101       1.1     bjh21 	/* Store integer registers */
    102       1.1     bjh21         stmia	r0, {r4-r14}
    103       1.1     bjh21         mov	r0, #0x00000000
    104       1.6  rearnsha         RET
    105  1.8.10.1      matt #endif /* __thumb__ */
    106       1.1     bjh21 
    107  1.8.10.1      matt ENTRY(__longjmp14)
    108  1.8.10.1      matt #ifdef __thumb__
    109  1.8.10.1      matt 	ldr	r2, .Lsetjmp_magic
    110  1.8.10.1      matt 	ldr	r3, [r0]
    111  1.8.10.1      matt 	cmp	r2, r3
    112  1.8.10.1      matt 	bne	.Lbotch
    113       1.1     bjh21 
    114  1.8.10.1      matt 	/* Restore the signal mask. */
    115  1.8.10.1      matt 	push	{r0, lr}
    116  1.8.10.1      matt 	mov	r2, #0
    117  1.8.10.1      matt 	add	r0, r0, #(_JB_SIGMASK * 4)
    118  1.8.10.1      matt 	mov	r1, r0
    119  1.8.10.1      matt 	mov	r0, #3				/* SIG_SETMASK */
    120  1.8.10.1      matt 	bl	PLT_SYM(_C_LABEL(__sigprocmask14))
    121  1.8.10.1      matt 	pop	{r0}
    122       1.1     bjh21 
    123  1.8.10.1      matt 	add	r0, r0, #56
    124  1.8.10.1      matt 	/* Restore integer registers */
    125  1.8.10.1      matt         ldmia	r0!, {r4-r7}
    126  1.8.10.1      matt 	push	{r4-r7}
    127  1.8.10.1      matt 
    128  1.8.10.1      matt         ldmia	r0!, {r4-r7}
    129  1.8.10.1      matt 	mov	r8, r4
    130  1.8.10.1      matt 	mov	r9, r5
    131  1.8.10.1      matt 	mov	r10, r6
    132  1.8.10.1      matt 	mov	r11, r7
    133  1.8.10.1      matt 
    134  1.8.10.1      matt         ldmia	r0!, {r4-r6}
    135  1.8.10.1      matt 	mov	r12, r4
    136  1.8.10.1      matt 	mov	sp, r5
    137  1.8.10.1      matt 	mov	lr, r6
    138  1.8.10.1      matt 
    139  1.8.10.1      matt 	/* Validate sp and lr */
    140  1.8.10.1      matt 	cmp	r5, #0		/* sp */
    141  1.8.10.1      matt 	beq	.Lbotch
    142  1.8.10.1      matt 	cmp	r6, #0		/* lr */
    143  1.8.10.1      matt 	beq	.Lbotch
    144  1.8.10.1      matt 
    145  1.8.10.1      matt 	/* Set return value */
    146  1.8.10.1      matt 
    147  1.8.10.1      matt 	mov	r0, r1
    148  1.8.10.1      matt 	bne	1f
    149  1.8.10.1      matt 	mov	r0, #1
    150  1.8.10.1      matt 1:	pop	{r4-r7, pc}
    151  1.8.10.1      matt #else
    152       1.4   thorpej 	ldr	r2, .Lsetjmp_magic
    153       1.1     bjh21 	ldr	r3, [r0]
    154       1.1     bjh21 	teq	r2, r3
    155       1.8  christos 	bne	.Lbotch
    156       1.1     bjh21 
    157       1.8  christos 	/* Restore the signal mask. */
    158       1.8  christos 	stmfd	sp!, {r0-r2, r14}
    159       1.8  christos 	mov	r2, #0x00000000
    160       1.8  christos 	add	r1, r0, #(_JB_SIGMASK * 4)
    161       1.8  christos 	mov	r0, #3				/* SIG_SETMASK */
    162  1.8.10.1      matt 	bl	PLT_SYM(_C_LABEL(__sigprocmask14))
    163       1.8  christos 	ldmfd	sp!, {r0-r2, r14}
    164       1.1     bjh21 
    165       1.1     bjh21 	add	r0, r0, #4
    166       1.1     bjh21 #ifdef SOFTFLOAT
    167       1.1     bjh21 	add	r0, r0, #52
    168       1.1     bjh21 #else
    169       1.1     bjh21 	/* Restore fp registers */
    170       1.1     bjh21 	lfm	f4, 4, [r0], #48
    171       1.1     bjh21 	/* Restore FPSR */
    172       1.1     bjh21 	ldr	r4, [r0], #0x0004
    173       1.1     bjh21 	wfs	r4
    174       1.1     bjh21 #endif	/* SOFTFLOAT */
    175       1.1     bjh21 	/* Restore integer registers */
    176       1.1     bjh21         ldmia	r0, {r4-r14}
    177       1.1     bjh21 
    178       1.3     chris 	/* Validate sp and r14 */
    179       1.3     chris 	teq	sp, #0
    180       1.3     chris 	teqne	r14, #0
    181       1.8  christos 	beq	.Lbotch
    182       1.1     bjh21 
    183       1.1     bjh21 	/* Set return value */
    184       1.1     bjh21 
    185       1.1     bjh21 	mov	r0, r1
    186       1.1     bjh21 	teq	r0, #0x00000000
    187       1.1     bjh21 	moveq	r0, #0x00000001
    188       1.6  rearnsha 	RET
    189  1.8.10.1      matt #endif
    190       1.1     bjh21 
    191       1.1     bjh21 	/* validation failed, die die die. */
    192       1.8  christos .Lbotch:
    193  1.8.10.1      matt 	bl	PLT_SYM(_C_LABEL(longjmperror))
    194  1.8.10.1      matt 	bl	PLT_SYM(_C_LABEL(abort))
    195       1.1     bjh21 	b	. - 8		/* Cannot get here */
    196  1.8.10.1      matt 
    197  1.8.10.1      matt 	.p2align 2
    198  1.8.10.1      matt .Lsetjmp_magic:
    199  1.8.10.1      matt 	.word	_JB_MAGIC_SETJMP
    200