1251509Sandrew/*	$NetBSD: sigsetjmp.S,v 1.6 2013/04/19 16:50:22 matt Exp $	*/
2129202Scognet
3129202Scognet/*
4129202Scognet * Copyright (c) 1997 Mark Brinicombe
5129202Scognet * All rights reserved.
6129202Scognet *
7129202Scognet * Redistribution and use in source and binary forms, with or without
8129202Scognet * modification, are permitted provided that the following conditions
9129202Scognet * are met:
10129202Scognet * 1. Redistributions of source code must retain the above copyright
11129202Scognet *    notice, this list of conditions and the following disclaimer.
12129202Scognet * 2. Redistributions in binary form must reproduce the above copyright
13129202Scognet *    notice, this list of conditions and the following disclaimer in the
14129202Scognet *    documentation and/or other materials provided with the distribution.
15129202Scognet * 3. All advertising materials mentioning features or use of this software
16129202Scognet *    must display the following acknowledgement:
17129202Scognet *	This product includes software developed by Mark Brinicombe
18129202Scognet * 4. Neither the name of the University nor the names of its contributors
19129202Scognet *    may be used to endorse or promote products derived from this software
20129202Scognet *    without specific prior written permission.
21129202Scognet *
22129202Scognet * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23129202Scognet * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24129202Scognet * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25129202Scognet * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26129202Scognet * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27129202Scognet * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28129202Scognet * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29129202Scognet * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30129202Scognet * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31129202Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32129202Scognet * SUCH DAMAGE.
33129202Scognet */
34129202Scognet
35129202Scognet#include <machine/asm.h>
36129202Scognet__FBSDID("$FreeBSD$");
37129202Scognet
38251509Sandrew#include <machine/setjmp.h>
39251509Sandrew
40129202Scognet/*
41129202Scognet * C library -- sigsetjmp, siglongjmp
42129202Scognet *
43129202Scognet *	longjmp(a,v)
44129202Scognet * will generate a "return(v)" from the last call to
45129202Scognet *	setjmp(a, m)
46129202Scognet * by restoring registers from the stack.
47129202Scognet * The previous signal state is restored.
48129202Scognet */
49129202Scognet
50129202ScognetENTRY(sigsetjmp)
51129202Scognet	teq	r1, #0
52129202Scognet	beq	PIC_SYM(_C_LABEL(_setjmp), PLT)
53129202Scognet	b	PIC_SYM(_C_LABEL(setjmp), PLT)
54129202Scognet
55129202Scognet.L_setjmp_magic:
56129202Scognet	.word	_JB_MAGIC__SETJMP
57137461ScognetWEAK_ALIAS(__siglongjmp, siglongjmp)
58129202Scognet
59129202ScognetENTRY(siglongjmp)
60253518Sandrew	ldr	r2, .L_setjmp_magic		/* load magic */
61253518Sandrew	ldr	r3, [r0]			/* get magic from jmp_buf */
62253518Sandrew	bic	r3, r3, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
63253518Sandrew						/* ignore VFP-ness of magic */
64253518Sandrew	teq	r2, r3				/* magic correct? */
65129202Scognet	beq	PIC_SYM(_C_LABEL(_longjmp), PLT)
66129202Scognet	b	PIC_SYM(_C_LABEL(longjmp), PLT)
67