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: sigsetjmp.S,v 1.4 1998/10/03 12:30:38 tsubai Exp $ */ 27209878Snwhitehorn 28209878Snwhitehorn#include <machine/asm.h> 29209878Snwhitehorn__FBSDID("$FreeBSD: releng/10.2/lib/libc/powerpc64/gen/sigsetjmp.S 234115 2012-04-11 00:00:40Z nwhitehorn $"); 30209878Snwhitehorn 31209878Snwhitehorn/* 32209878Snwhitehorn * C library -- sigsetjmp, siglongjmp 33209878Snwhitehorn * 34209878Snwhitehorn * siglongjmp(a,v) 35209878Snwhitehorn * will generate a "return(v?v:1)" from the last call to 36209878Snwhitehorn * sigsetjmp(a, savemask) 37209878Snwhitehorn * by restoring registers from the stack. 38209878Snwhitehorn * The previous signal state is restored if savemask is non-zero 39209878Snwhitehorn * 40209878Snwhitehorn * jmpbuf layout: 41209878Snwhitehorn * +------------+ 42209878Snwhitehorn * | savemask | 43209878Snwhitehorn * +------------+ 44209878Snwhitehorn * | sig state | 45209878Snwhitehorn * | | 46209878Snwhitehorn * | (4 words) | 47209878Snwhitehorn * | | 48209878Snwhitehorn * +------------+ 49209878Snwhitehorn * | saved regs | 50209878Snwhitehorn * | ... | 51209878Snwhitehorn */ 52209878Snwhitehorn 53209878Snwhitehorn 54209878Snwhitehorn#include <sys/syscall.h> 55209878Snwhitehorn 56209878SnwhitehornENTRY(sigsetjmp) 57209878Snwhitehorn mr %r6,%r3 58209878Snwhitehorn stw %r4,0(%r3) 59209878Snwhitehorn or. %r7,%r4,%r4 60209878Snwhitehorn beq 1f 61209878Snwhitehorn li %r3,1 /* SIG_BLOCK, but doesn't matter */ 62209878Snwhitehorn /* since set == NULL */ 63209878Snwhitehorn li %r4,0 /* set = NULL */ 64209878Snwhitehorn mr %r5,%r6 /* &oset */ 65209878Snwhitehorn addi %r5,%r5,4 66209878Snwhitehorn li %r0, SYS_sigprocmask /* sigprocmask(SIG_BLOCK, NULL, &oset)*/ 67209878Snwhitehorn sc /* assume no error XXX */ 68209878Snwhitehorn1: 69209878Snwhitehorn mflr %r11 70209878Snwhitehorn mfcr %r12 71209878Snwhitehorn mr %r10,%r1 72209878Snwhitehorn mr %r9,%r2 73209878Snwhitehorn 74209878Snwhitehorn std %r9,40 + 0*8(%r6) 75209878Snwhitehorn std %r10,40 + 1*8(%r6) 76209878Snwhitehorn std %r11,40 + 2*8(%r6) 77209878Snwhitehorn std %r12,40 + 3*8(%r6) 78209878Snwhitehorn std %r13,40 + 4*8(%r6) 79209878Snwhitehorn std %r14,40 + 5*8(%r6) 80209878Snwhitehorn std %r15,40 + 6*8(%r6) 81209878Snwhitehorn std %r16,40 + 7*8(%r6) 82209878Snwhitehorn std %r17,40 + 8*8(%r6) 83209878Snwhitehorn std %r18,40 + 9*8(%r6) 84209878Snwhitehorn std %r19,40 + 10*8(%r6) 85209878Snwhitehorn std %r20,40 + 11*8(%r6) 86209878Snwhitehorn std %r21,40 + 12*8(%r6) 87209878Snwhitehorn std %r22,40 + 13*8(%r6) 88209878Snwhitehorn std %r23,40 + 14*8(%r6) 89209878Snwhitehorn std %r24,40 + 15*8(%r6) 90209878Snwhitehorn std %r25,40 + 16*8(%r6) 91209878Snwhitehorn std %r26,40 + 17*8(%r6) 92209878Snwhitehorn std %r27,40 + 18*8(%r6) 93209878Snwhitehorn std %r28,40 + 19*8(%r6) 94209878Snwhitehorn std %r29,40 + 20*8(%r6) 95209878Snwhitehorn std %r30,40 + 21*8(%r6) 96209878Snwhitehorn std %r31,40 + 22*8(%r6) 97209878Snwhitehorn 98209878Snwhitehorn li %r3,0 99209878Snwhitehorn blr 100209878Snwhitehorn 101209878SnwhitehornENTRY(siglongjmp) 102209878Snwhitehorn ld %r9,40 + 0*8(%r3) 103209878Snwhitehorn ld %r10,40 + 1*8(%r3) 104209878Snwhitehorn ld %r11,40 + 2*8(%r3) 105209878Snwhitehorn ld %r12,40 + 3*8(%r3) 106209878Snwhitehorn ld %r14,40 + 5*8(%r3) 107209878Snwhitehorn ld %r15,40 + 6*8(%r3) 108209878Snwhitehorn ld %r16,40 + 7*8(%r3) 109209878Snwhitehorn ld %r17,40 + 8*8(%r3) 110209878Snwhitehorn ld %r18,40 + 9*8(%r3) 111209878Snwhitehorn ld %r19,40 + 10*8(%r3) 112209878Snwhitehorn ld %r20,40 + 11*8(%r3) 113209878Snwhitehorn ld %r21,40 + 12*8(%r3) 114209878Snwhitehorn ld %r22,40 + 13*8(%r3) 115209878Snwhitehorn ld %r23,40 + 14*8(%r3) 116209878Snwhitehorn ld %r24,40 + 15*8(%r3) 117209878Snwhitehorn ld %r25,40 + 16*8(%r3) 118209878Snwhitehorn ld %r26,40 + 17*8(%r3) 119209878Snwhitehorn ld %r27,40 + 18*8(%r3) 120209878Snwhitehorn ld %r28,40 + 19*8(%r3) 121209878Snwhitehorn ld %r29,40 + 20*8(%r3) 122209878Snwhitehorn ld %r30,40 + 21*8(%r3) 123209878Snwhitehorn ld %r31,40 + 22*8(%r3) 124209878Snwhitehorn 125209878Snwhitehorn lwz %r7,0(%r3) 126209878Snwhitehorn mr %r6,%r4 127209878Snwhitehorn mtlr %r11 128209878Snwhitehorn mtcr %r12 129209878Snwhitehorn mr %r2,%r9 130209878Snwhitehorn mr %r1,%r10 131209878Snwhitehorn or. %r7,%r7,%r7 132209878Snwhitehorn beq 1f 133209878Snwhitehorn mr %r4,%r3 134209878Snwhitehorn li %r3,3 /* SIG_SETMASK */ 135209878Snwhitehorn addi %r4,%r4,4 /* &set */ 136209878Snwhitehorn li %r5,0 /* oset = NULL */ 137209878Snwhitehorn li %r0,SYS_sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */ 138209878Snwhitehorn sc /* assume no error XXX */ 139209878Snwhitehorn1: 140209878Snwhitehorn or. %r3,%r6,%r6 141209878Snwhitehorn bnelr 142209878Snwhitehorn li %r3,1 143209878Snwhitehorn blr 144217398Skib 145217398Skib .section .note.GNU-stack,"",%progbits 146