1209878Snwhitehorn/*- 2209878Snwhitehorn * Copyright (c) 2002 Peter Grehan. 3209878Snwhitehorn * All rights reserved. 4209878Snwhitehorn * 5209878Snwhitehorn * Redistribution and use in source and binary forms, with or without 6209878Snwhitehorn * modification, are permitted provided that the following conditions 7209878Snwhitehorn * are met: 8209878Snwhitehorn * 1. Redistributions of source code must retain the above copyright 9209878Snwhitehorn * notice, this list of conditions and the following disclaimer. 10209878Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 11209878Snwhitehorn * notice, this list of conditions and the following disclaimer in the 12209878Snwhitehorn * documentation and/or other materials provided with the distribution. 13209878Snwhitehorn * 14209878Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15209878Snwhitehorn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16209878Snwhitehorn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17209878Snwhitehorn * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18209878Snwhitehorn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19209878Snwhitehorn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20209878Snwhitehorn * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21209878Snwhitehorn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22209878Snwhitehorn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23209878Snwhitehorn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24209878Snwhitehorn * SUCH DAMAGE. 25209878Snwhitehorn */ 26209878Snwhitehorn/* $NetBSD: setjmp.S,v 1.3 1998/10/03 12:30:38 tsubai Exp $ */ 27209878Snwhitehorn 28209878Snwhitehorn#include <machine/asm.h> 29209878Snwhitehorn__FBSDID("$FreeBSD$"); 30209878Snwhitehorn 31209878Snwhitehorn#include <sys/syscall.h> 32209878Snwhitehorn 33209878Snwhitehorn/* 34209878Snwhitehorn * C library -- setjmp, longjmp 35209878Snwhitehorn * 36209878Snwhitehorn * longjmp(a,v) 37209878Snwhitehorn * will generate a "return(v?v:1)" from the last call to 38209878Snwhitehorn * setjmp(a) 39209878Snwhitehorn * by restoring registers from the stack. 40209878Snwhitehorn * The previous signal state is restored. 41209878Snwhitehorn * 42209878Snwhitehorn * jmpbuf layout: 43209878Snwhitehorn * +------------+ 44209878Snwhitehorn * | unused | 45209878Snwhitehorn * +------------+ 46209878Snwhitehorn * | sig state | 47209878Snwhitehorn * | | 48209878Snwhitehorn * | (4 words) | 49209878Snwhitehorn * | | 50209878Snwhitehorn * +------------+ 51209878Snwhitehorn * | saved regs | 52209878Snwhitehorn * | ... | 53209878Snwhitehorn */ 54209878Snwhitehorn 55209878SnwhitehornENTRY(setjmp) 56209878Snwhitehorn mr %r6,%r3 57209878Snwhitehorn li %r3,1 /* SIG_BLOCK, but doesn't matter */ 58209878Snwhitehorn /* since set == NULL */ 59209878Snwhitehorn li %r4,0 /* set = NULL */ 60209878Snwhitehorn mr %r5,%r6 /* &oset */ 61209878Snwhitehorn addi %r5,%r5,4 62209878Snwhitehorn li %r0, SYS_sigprocmask /*sigprocmask(SIG_BLOCK, NULL, &oset)*/ 63209878Snwhitehorn sc /*assume no error XXX */ 64209878Snwhitehorn mflr %r11 /* r11 <- link reg */ 65209878Snwhitehorn mfcr %r12 /* r12 <- condition reg */ 66209878Snwhitehorn mr %r10,%r1 /* r10 <- stackptr */ 67209878Snwhitehorn mr %r9,%r2 /* r9 <- global ptr */ 68209878Snwhitehorn 69209878Snwhitehorn std %r9,40 + 0*8(%r6) 70209878Snwhitehorn std %r10,40 + 1*8(%r6) 71209878Snwhitehorn std %r11,40 + 2*8(%r6) 72209878Snwhitehorn std %r12,40 + 3*8(%r6) 73209878Snwhitehorn std %r13,40 + 4*8(%r6) 74209878Snwhitehorn std %r14,40 + 5*8(%r6) 75209878Snwhitehorn std %r15,40 + 6*8(%r6) 76209878Snwhitehorn std %r16,40 + 7*8(%r6) 77209878Snwhitehorn std %r17,40 + 8*8(%r6) 78209878Snwhitehorn std %r18,40 + 9*8(%r6) 79209878Snwhitehorn std %r19,40 + 10*8(%r6) 80209878Snwhitehorn std %r20,40 + 11*8(%r6) 81209878Snwhitehorn std %r21,40 + 12*8(%r6) 82209878Snwhitehorn std %r22,40 + 13*8(%r6) 83209878Snwhitehorn std %r23,40 + 14*8(%r6) 84209878Snwhitehorn std %r24,40 + 15*8(%r6) 85209878Snwhitehorn std %r25,40 + 16*8(%r6) 86209878Snwhitehorn std %r26,40 + 17*8(%r6) 87209878Snwhitehorn std %r27,40 + 18*8(%r6) 88209878Snwhitehorn std %r28,40 + 19*8(%r6) 89209878Snwhitehorn std %r29,40 + 20*8(%r6) 90209878Snwhitehorn std %r30,40 + 21*8(%r6) 91209878Snwhitehorn std %r31,40 + 22*8(%r6) 92209878Snwhitehorn 93209878Snwhitehorn li %r3,0 /* return (0) */ 94209878Snwhitehorn blr 95209878Snwhitehorn 96209878Snwhitehorn .weak CNAME(longjmp) 97209878Snwhitehorn .set CNAME(longjmp),CNAME(__longjmp) 98209878Snwhitehorn .weak CNAME(.longjmp) 99209878Snwhitehorn .set CNAME(.longjmp),CNAME(.__longjmp) 100209878SnwhitehornENTRY(__longjmp) 101209878Snwhitehorn ld %r9,40 + 0*8(%r3) 102209878Snwhitehorn ld %r10,40 + 1*8(%r3) 103209878Snwhitehorn ld %r11,40 + 2*8(%r3) 104209878Snwhitehorn ld %r12,40 + 3*8(%r3) 105209878Snwhitehorn ld %r14,40 + 5*8(%r3) 106209878Snwhitehorn ld %r15,40 + 6*8(%r3) 107209878Snwhitehorn ld %r16,40 + 7*8(%r3) 108209878Snwhitehorn ld %r17,40 + 8*8(%r3) 109209878Snwhitehorn ld %r18,40 + 9*8(%r3) 110209878Snwhitehorn ld %r19,40 + 10*8(%r3) 111209878Snwhitehorn ld %r20,40 + 11*8(%r3) 112209878Snwhitehorn ld %r21,40 + 12*8(%r3) 113209878Snwhitehorn ld %r22,40 + 13*8(%r3) 114209878Snwhitehorn ld %r23,40 + 14*8(%r3) 115209878Snwhitehorn ld %r24,40 + 15*8(%r3) 116209878Snwhitehorn ld %r25,40 + 16*8(%r3) 117209878Snwhitehorn ld %r26,40 + 17*8(%r3) 118209878Snwhitehorn ld %r27,40 + 18*8(%r3) 119209878Snwhitehorn ld %r28,40 + 19*8(%r3) 120209878Snwhitehorn ld %r29,40 + 20*8(%r3) 121209878Snwhitehorn ld %r30,40 + 21*8(%r3) 122209878Snwhitehorn ld %r31,40 + 22*8(%r3) 123209878Snwhitehorn mr %r6,%r4 /* save val param */ 124209878Snwhitehorn mtlr %r11 /* r11 -> link reg */ 125209878Snwhitehorn mtcr %r12 /* r12 -> condition reg */ 126209878Snwhitehorn mr %r2,%r9 /* r9 -> global ptr */ 127209878Snwhitehorn mr %r1,%r10 /* r10 -> stackptr */ 128209878Snwhitehorn mr %r4,%r3 129209878Snwhitehorn li %r3,3 /* SIG_SETMASK */ 130209878Snwhitehorn addi %r4,%r4,4 /* &set */ 131209878Snwhitehorn li %r5,0 /* oset = NULL */ 132209878Snwhitehorn li %r0,SYS_sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */ 133209878Snwhitehorn sc /* assume no error XXX */ 134209878Snwhitehorn or. %r3,%r6,%r6 135209878Snwhitehorn bnelr 136209878Snwhitehorn li %r3,1 137209878Snwhitehorn blr 138209878Snwhitehorn 139217398Skib .section .note.GNU-stack,"",%progbits 140