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>