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