[BACK]Return to setjmp.S CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / arch / arm / gen

Annotation of src/lib/libc/arch/arm/gen/setjmp.S, Revision 1.9.2.3

1.9.2.2   tls         1: /*     $NetBSD$        */
1.1       bjh21       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:
1.9.2.1   tls        35: #if !defined(__SOFTFP__) && !defined(__VFP_FP__) && !defined(__ARM_PCS)
                     36: #error FPA is not supported anymore
                     37: #endif
                     38:
1.9.2.3 ! tls        39: #if defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
1.9.2.1   tls        40:        .fpu    vfp
                     41: #endif
                     42:
1.1       bjh21      43: #include <machine/asm.h>
                     44: #include <machine/setjmp.h>
                     45:
                     46: /*
                     47:  * C library -- setjmp, longjmp
                     48:  *
                     49:  *     longjmp(a,v)
                     50:  * will generate a "return(v)" from the last call to
                     51:  *     setjmp(a)
                     52:  * by restoring registers from the stack.
                     53:  * The previous signal state is restored.
                     54:  */
                     55:
1.8       christos   56: ENTRY(__setjmp14)
                     57:        /* Get the signal mask. */
1.9.2.3 ! tls        58:        push    {r0-r2, lr}
        !            59: #if !defined(__thumb__)
        !            60:        adds    r2, r0, #(_JB_SIGMASK * 4)
        !            61: #else
        !            62:        mov     r2, r0
        !            63:        adds    r2, r2, #(_JB_SIGMASK * 4)
        !            64: #endif
        !            65:        movs    r1, #0
        !            66:        movs    r0, #0
        !            67:        bl      PLT_SYM(_C_LABEL(__sigprocmask14))
        !            68: #if !defined(__thumb__) || defined(_ARM_ARCH_T2)
        !            69:        pop     {r0-r2, lr}
        !            70: #else
        !            71:        pop     {r0-r3}
        !            72:        mov     lr, r3
        !            73: #endif
1.1       bjh21      74:
1.4       thorpej    75:        ldr     r1, .Lsetjmp_magic
1.1       bjh21      76:
1.9.2.3 ! tls        77: #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
1.9.2.1   tls        78:        ldr     r2, .Lfpu_present
1.9.2.3 ! tls        79: #ifdef __PIC__
        !            80:        add     r2, r2, pc      /* pc = &.LPIC0 */
1.9.2.1   tls        81: #endif
1.9.2.3 ! tls        82:        ldr     r2, [r2]
        !            83: .LPIC0:
        !            84: #if defined(__thumb__) && defined(_ARM_ARCH_T2)
        !            85:        cbz     r2, 1f          /* don't save if we don't have a FPU */
        !            86: #else
        !            87:        cmp     r2, #0          /* do we have a FPU? */
1.9.2.1   tls        88:        beq     1f              /*   no, don't save VFP registers */
1.9.2.3 ! tls        89: #endif
1.9.2.1   tls        90:
1.9.2.3 ! tls        91:        orrs    r1, r1, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
1.9.2.1   tls        92:                                /* change magic to VFP magic */
1.9.2.3 ! tls        93:        adds    r2, r0, #(_JB_REG_D8 * 4)
1.9.2.1   tls        94:        vstmia  r2, {d8-d15}
                     95:        vmrs    r2, fpscr
                     96:        str     r2, [r0, #(_JB_REG_FPSCR * 4)]
                     97: 1:
1.9.2.3 ! tls        98: #endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
1.9.2.1   tls        99:
                    100:        str     r1, [r0]                /* store magic */
                    101:
1.1       bjh21     102:        /* Store integer registers */
1.9.2.3 ! tls       103:        adds    r0, r0, #(_JB_REG_R4 * 4)
        !           104: #if !defined(__thumb__)
        !           105:        stmia   r0!, {r4-lr}
        !           106: #else
        !           107:        stmia   r0!, {r4-r7}
        !           108:        mov     r2, r8
        !           109:        mov     r3, r9
        !           110:        stmia   r0!, {r2-r3}
        !           111:        mov     r2, r10
        !           112:        mov     r3, r11
        !           113:        stmia   r0!, {r2-r3}
        !           114:        mov     r2, sp
        !           115:        mov     r3, lr
        !           116:        str     r2, [r0, #4]
        !           117:        str     r3, [r0, #8]
        !           118: #endif
        !           119:        movs    r0, #0
        !           120:        RET
1.1       bjh21     121:
1.9.2.3 ! tls       122: #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
        !           123:        .align  0
1.9.2.1   tls       124: .Lfpu_present:
1.9.2.3 ! tls       125:        .word   REL_SYM(_libc_arm_fpu_present, .LPIC0)
        !           126: #endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
        !           127: END(__setjmp14)
1.1       bjh21     128:
1.8       christos  129: ENTRY(__longjmp14)
1.9.2.3 ! tls       130: #if !defined(__thumb__) || defined(_ARM_ARCH_T2)
1.9.2.1   tls       131:        ldr     r2, [r0]
                    132:        ldr     ip, .Lsetjmp_magic
                    133:        bic     r3, r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
1.9.2.3 ! tls       134: #else
        !           135:        ldr     r3, .Lsetjmp_magic
        !           136:        mov     ip, r3
        !           137:        ldr     r3, [r0]
        !           138:        movs    r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
        !           139:        bics    r3, r2
        !           140:        /* r2 is not the magic but we don't need it since we can't do VFP */
        !           141: #endif
        !           142:        cmp     r3, ip
1.9.2.2   tls       143:        bne     .Lbotch
1.1       bjh21     144:
1.8       christos  145:        /* Restore the signal mask. */
1.9.2.3 ! tls       146:        push    {r0-r2, lr}
        !           147:        movs    r2, #0
        !           148: #if !defined(__thumb__)
        !           149:        adds    r1, r0, #(_JB_SIGMASK * 4)
        !           150: #else
        !           151:        mov     r1, r0
        !           152:        adds    r1, r1, #(_JB_SIGMASK * 4)
        !           153: #endif
        !           154:        movs    r0, #3                          /* SIG_SETMASK */
        !           155:        bl      PLT_SYM(_C_LABEL(__sigprocmask14))
        !           156: #if !defined(__thumb__) || defined(_ARM_ARCH_T2)
        !           157:        pop     {r0-r2, lr}
        !           158: #else
        !           159:        pop     {r0-r3}
        !           160:        mov     lr, r3
        !           161: #endif
1.1       bjh21     162:
1.9.2.3 ! tls       163: #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
1.9.2.1   tls       164:        tst     r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
                    165:                                                /* is this a VFP magic? */
                    166:        beq     1f                              /*   no, don't restore VFP */
1.9.2.3 ! tls       167:        adds    r2, r0, #(_JB_REG_D8 * 4)
        !           168:        vldmia  r2, {d8-d15}
        !           169:        ldr     r2, [r0, #(_JB_REG_FPSCR * 4)]
        !           170:        vmsr    fpscr, r2
1.9.2.1   tls       171: 1:
1.9.2.3 ! tls       172: #endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
1.9.2.1   tls       173:
1.9.2.3 ! tls       174:        adds    r0, r0, #(_JB_REG_R4 * 4)
1.1       bjh21     175:        /* Restore integer registers */
1.9.2.3 ! tls       176: #if !defined(__thumb__) || defined(_ARM_ARCH_T2)
        !           177:        ldmia   r0!, {r4-r12}
        !           178: #else
        !           179:        ldmia   r0!, {r4-r7}
        !           180:        ldmia   r0!, {r2-r3}
        !           181:        mov     r8, r2
        !           182:        mov     r9, r3
        !           183:        ldmia   r0!, {r2-r3}
        !           184:        mov     r10, r2
        !           185:        mov     r11, r3
        !           186:        adds    r0, r0, #4      /* skip ip(r12) */
        !           187: #endif
        !           188:
        !           189:        ldmia   r0!, {r2-r3}
1.1       bjh21     190:
1.9.2.3 ! tls       191:        /* Validate sp and lr */
        !           192: #if defined(__thumb__) && defined(_ARM_ARCH_T2)
        !           193:        cbz     r2, .Lbotch
        !           194: #else
        !           195:        cmp     r2, #0
1.8       christos  196:        beq     .Lbotch
1.9.2.3 ! tls       197: #endif
        !           198:        mov     sp, r2
        !           199:
        !           200: #if defined(__thumb__) && defined(_ARM_ARCH_T2)
        !           201:        cbz     r3, .Lbotch
        !           202: #else
        !           203:        cmp     r3, #0
        !           204:        beq     .Lbotch
        !           205: #endif
        !           206:        mov     lr, r3
1.1       bjh21     207:
                    208:        /* Set return value */
1.9.2.2   tls       209:        movs    r0, r1
1.9.2.3 ! tls       210: #if !defined(__thumb__)
        !           211:        moveq   r0, #1
        !           212: #else
        !           213:        bne     1f
        !           214:        movs    r0, #1
        !           215: 1:
        !           216: #endif
1.6       rearnsha  217:        RET
1.1       bjh21     218:
                    219:        /* validation failed, die die die. */
1.8       christos  220: .Lbotch:
1.9.2.3 ! tls       221:        bl      PLT_SYM(_C_LABEL(longjmperror))
        !           222:        bl      PLT_SYM(_C_LABEL(abort))
        !           223: 1:     b       1b              /* Cannot get here */
        !           224:
        !           225:        .align  0
        !           226: .Lsetjmp_magic:
        !           227:        .word   _JB_MAGIC_SETJMP
        !           228: END(__longjmp14)

CVSweb <webmaster@jp.NetBSD.org>