[BACK]Return to setjmp.S CVS log [TXT][DIR] Up to [local] / prex-old / usr / arch / arm

Annotation of prex-old/usr/arch/arm/setjmp.S, Revision 1.1.1.1

1.1       nbrk        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 */

CVSweb