xref: /freebsd/lib/libc/arm/gen/setjmp.S (revision 8ed717de58c2129561aec57a1432ba011cbe8f96)
1*8ed717deSAndrew Turner/*	$NetBSD: setjmp.S,v 1.14 2013/04/19 13:45:45 matt Exp $	*/
22357939bSOlivier Houchard
32357939bSOlivier Houchard/*
42357939bSOlivier Houchard * Copyright (c) 1997 Mark Brinicombe
52357939bSOlivier Houchard * All rights reserved.
62357939bSOlivier Houchard *
72357939bSOlivier Houchard * Redistribution and use in source and binary forms, with or without
82357939bSOlivier Houchard * modification, are permitted provided that the following conditions
92357939bSOlivier Houchard * are met:
102357939bSOlivier Houchard * 1. Redistributions of source code must retain the above copyright
112357939bSOlivier Houchard *    notice, this list of conditions and the following disclaimer.
122357939bSOlivier Houchard * 2. Redistributions in binary form must reproduce the above copyright
132357939bSOlivier Houchard *    notice, this list of conditions and the following disclaimer in the
142357939bSOlivier Houchard *    documentation and/or other materials provided with the distribution.
152357939bSOlivier Houchard * 3. All advertising materials mentioning features or use of this software
162357939bSOlivier Houchard *    must display the following acknowledgement:
172357939bSOlivier Houchard *	This product includes software developed by Mark Brinicombe
182357939bSOlivier Houchard * 4. Neither the name of the University nor the names of its contributors
192357939bSOlivier Houchard *    may be used to endorse or promote products derived from this software
202357939bSOlivier Houchard *    without specific prior written permission.
212357939bSOlivier Houchard *
222357939bSOlivier Houchard * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
232357939bSOlivier Houchard * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
242357939bSOlivier Houchard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
252357939bSOlivier Houchard * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
262357939bSOlivier Houchard * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
272357939bSOlivier Houchard * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
282357939bSOlivier Houchard * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
292357939bSOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
302357939bSOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
312357939bSOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
322357939bSOlivier Houchard * SUCH DAMAGE.
332357939bSOlivier Houchard */
342357939bSOlivier Houchard
35*8ed717deSAndrew Turner#if !defined(__SOFTFP__) && !defined(__VFP_FP__) && !defined(__ARM_PCS)
36*8ed717deSAndrew Turner#error FPA is not supported anymore
37*8ed717deSAndrew Turner#endif
38*8ed717deSAndrew Turner
392357939bSOlivier Houchard#include <machine/asm.h>
40*8ed717deSAndrew Turner#include <machine/setjmp.h>
41*8ed717deSAndrew Turner
422357939bSOlivier Houchard__FBSDID("$FreeBSD$");
43*8ed717deSAndrew Turner
442357939bSOlivier Houchard/*
452357939bSOlivier Houchard * C library -- setjmp, longjmp
462357939bSOlivier Houchard *
472357939bSOlivier Houchard *	longjmp(a,v)
482357939bSOlivier Houchard * will generate a "return(v)" from the last call to
492357939bSOlivier Houchard *	setjmp(a)
502357939bSOlivier Houchard * by restoring registers from the stack.
512357939bSOlivier Houchard * The previous signal state is restored.
522357939bSOlivier Houchard */
532357939bSOlivier Houchard
542357939bSOlivier HouchardENTRY(setjmp)
552357939bSOlivier Houchard	/* Block all signals and retrieve the old signal mask */
562357939bSOlivier Houchard	stmfd	sp!, {r0, r14}
57*8ed717deSAndrew Turner	add	r2, r0, #(_JB_SIGMASK * 4)	/* oset */
58*8ed717deSAndrew Turner	mov	r1, #0x00000000			/* set */
593d90a3cdSOlivier Houchard	mov	r0, #0x00000001			/* SIG_BLOCK */
603d90a3cdSOlivier Houchard	bl	PIC_SYM(_C_LABEL(sigprocmask), PLT)
612357939bSOlivier Houchard	ldmfd	sp!, {r0, r14}
622357939bSOlivier Houchard
632357939bSOlivier Houchard	ldr	r1, .Lsetjmp_magic
64*8ed717deSAndrew Turner	str	r1, [r0]		/* store magic */
652357939bSOlivier Houchard
662357939bSOlivier Houchard	/* Store integer registers */
67*8ed717deSAndrew Turner	add	r0, r0, #(_JB_REG_R4 * 4)
682357939bSOlivier Houchard        stmia	r0, {r4-r14}
692357939bSOlivier Houchard        mov	r0, #0x00000000
7031489a9aSOlivier Houchard	RET
712357939bSOlivier Houchard
722357939bSOlivier Houchard.Lsetjmp_magic:
732357939bSOlivier Houchard	.word	_JB_MAGIC_SETJMP
742357939bSOlivier Houchard
752357939bSOlivier Houchard
762357939bSOlivier Houchard.weak _C_LABEL(longjmp)
772357939bSOlivier Houchard.set _C_LABEL(longjmp), _C_LABEL(__longjmp)
782357939bSOlivier HouchardENTRY(__longjmp)
79*8ed717deSAndrew Turner	ldr	r2, [r0]
80*8ed717deSAndrew Turner	ldr	ip, .Lsetjmp_magic
81*8ed717deSAndrew Turner	bic	r3, r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
82*8ed717deSAndrew Turner	teq	r3, ip
83*8ed717deSAndrew Turner	bne	.Lbotch
842357939bSOlivier Houchard
85*8ed717deSAndrew Turner	/* Restore the signal mask. */
86*8ed717deSAndrew Turner	stmfd	sp!, {r0-r2, r14}
87*8ed717deSAndrew Turner	mov	r2, #0x00000000
88*8ed717deSAndrew Turner	add	r1, r0, #(_JB_SIGMASK * 4)	/* Signal mask */
893d90a3cdSOlivier Houchard	mov	r0, #3				/* SIG_SETMASK */
903d90a3cdSOlivier Houchard	bl	PIC_SYM(_C_LABEL(sigprocmask), PLT)
91*8ed717deSAndrew Turner	ldmfd	sp!, {r0-r2, r14}
922357939bSOlivier Houchard
93*8ed717deSAndrew Turner	add	r0, r0, #(_JB_REG_R4 * 4)
942357939bSOlivier Houchard	/* Restore integer registers */
952357939bSOlivier Houchard        ldmia	r0, {r4-r14}
962357939bSOlivier Houchard
972357939bSOlivier Houchard	/* Validate sp and r14 */
982357939bSOlivier Houchard	teq	sp, #0
992357939bSOlivier Houchard	teqne	r14, #0
100*8ed717deSAndrew Turner	beq	.Lbotch
1012357939bSOlivier Houchard
1022357939bSOlivier Houchard	/* Set return value */
103*8ed717deSAndrew Turner	movs	r0, r1
1042357939bSOlivier Houchard	moveq	r0, #0x00000001
10531489a9aSOlivier Houchard	RET
1062357939bSOlivier Houchard
1072357939bSOlivier Houchard	/* validation failed, die die die. */
108*8ed717deSAndrew Turner.Lbotch:
1092357939bSOlivier Houchard	bl	PIC_SYM(_C_LABEL(longjmperror), PLT)
1102357939bSOlivier Houchard	bl	PIC_SYM(_C_LABEL(abort), PLT)
1112357939bSOlivier Houchard	b	. - 8		/* Cannot get here */
112