xref: /netbsd-src/lib/libc/arch/m68k/gen/_setjmp.S (revision 942581824f52f2ec2ee4a78b95b13892268c05ee)
1*94258182Smatt/*	$NetBSD: _setjmp.S,v 1.9 2013/07/16 22:12:20 matt Exp $	*/
29f1ee9aeSthorpej
35f709618Spaulus/*-
45f709618Spaulus * Copyright (c) 1990 The Regents of the University of California.
55f709618Spaulus * All rights reserved.
65f709618Spaulus *
75f709618Spaulus * This code is derived from software contributed to Berkeley by
85f709618Spaulus * the Systems Programming Group of the University of Utah Computer
95f709618Spaulus * Science Department.
105f709618Spaulus *
115f709618Spaulus * Redistribution and use in source and binary forms, with or without
125f709618Spaulus * modification, are permitted provided that the following conditions
135f709618Spaulus * are met:
145f709618Spaulus * 1. Redistributions of source code must retain the above copyright
155f709618Spaulus *    notice, this list of conditions and the following disclaimer.
165f709618Spaulus * 2. Redistributions in binary form must reproduce the above copyright
175f709618Spaulus *    notice, this list of conditions and the following disclaimer in the
185f709618Spaulus *    documentation and/or other materials provided with the distribution.
19eb7c1594Sagc * 3. Neither the name of the University nor the names of its contributors
205f709618Spaulus *    may be used to endorse or promote products derived from this software
215f709618Spaulus *    without specific prior written permission.
225f709618Spaulus *
235f709618Spaulus * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
245f709618Spaulus * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
255f709618Spaulus * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
265f709618Spaulus * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
275f709618Spaulus * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
285f709618Spaulus * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
295f709618Spaulus * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
305f709618Spaulus * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
315f709618Spaulus * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
325f709618Spaulus * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
335f709618Spaulus * SUCH DAMAGE.
345f709618Spaulus */
355f709618Spaulus
36d0fed6c8Sthorpej#include <machine/asm.h>
379f1ee9aeSthorpej
385f709618Spaulus#if defined(LIBC_SCCS) && !defined(lint)
399f1ee9aeSthorpej#if 0
409f1ee9aeSthorpej	RCSID("from: @(#)_setjmp.s	5.1 (Berkeley) 5/12/90")
419f1ee9aeSthorpej#else
42*94258182Smatt	RCSID("$NetBSD: _setjmp.S,v 1.9 2013/07/16 22:12:20 matt Exp $")
439f1ee9aeSthorpej#endif
445f709618Spaulus#endif /* LIBC_SCCS and not lint */
455f709618Spaulus
465f709618Spaulus/*
475f709618Spaulus * C library -- _setjmp, _longjmp
485f709618Spaulus *
495f709618Spaulus *	_longjmp(a,v)
505f709618Spaulus * will generate a "return(v)" from
515f709618Spaulus * the last call to
525f709618Spaulus *	_setjmp(a)
535f709618Spaulus * by restoring registers from the stack,
545f709618Spaulus * The previous signal state is NOT restored.
555f709618Spaulus */
565f709618Spaulus
575f709618SpaulusENTRY(_setjmp)
5807a0a325Smatt	movl	4(%sp),%a0	/* save area pointer */
5907a0a325Smatt	clrl	(%a0)+		/* no old onstack */
6007a0a325Smatt	clrl	(%a0)+		/* no old sigmask */
6107a0a325Smatt	movl	%sp,(%a0)+	/* save old SP */
6207a0a325Smatt	movl	%a6,(%a0)+	/* save old FP */
6307a0a325Smatt	clrl	(%a0)+		/* no old AP */
6407a0a325Smatt	movl	(%sp),(%a0)+	/* save old PC */
6507a0a325Smatt	clrl	(%a0)+		/* clear PS */
6607a0a325Smatt	moveml	#0x3CFC,(%a0)	/* save other non-scratch regs */
673b435a73Sthorpej	clrl	%d0		/* return zero */
685f709618Spaulus	rts
69*94258182SmattEND(_setjmp)
705f709618Spaulus
715f709618SpaulusENTRY(_longjmp)
7207a0a325Smatt	movl	4(%sp),%a0	/* save area pointer */
733b435a73Sthorpej	addql	#8,%a0		/* skip onstack/sigmask */
7407a0a325Smatt	tstl	(%a0)		/* ensure non-zero SP */
755f709618Spaulus	jeq	botch		/* oops! */
7607a0a325Smatt	movl	8(%sp),%d0	/* grab return value */
775f709618Spaulus	jne	ok		/* non-zero ok */
783b435a73Sthorpej	moveq	#1,%d0		/* else make non-zero */
795f709618Spaulusok:
8007a0a325Smatt	movl	(%a0)+,%sp	/* restore SP */
8107a0a325Smatt	movl	(%a0)+,%a6	/* restore FP */
823b435a73Sthorpej	addql	#4,%a0		/* skip AP */
8307a0a325Smatt	movl	(%a0)+,(%sp)	/* restore PC */
8407a0a325Smatt	moveml	4(%a0),#0x3CFC	/* restore non-scratch regs */
855f709618Spaulus	rts
865f709618Spaulus
875f709618Spaulusbotch:
881d0a4330Sitohy	jbsr	PIC_PLT(_C_LABEL(longjmperror))
895f709618Spaulus	stop	#0
90*94258182SmattEND(_longjmp)
91