137535Sdes/*- 237535Sdes * Copyright (c) 2002 Peter Grehan. 337535Sdes * All rights reserved. 437535Sdes * 537535Sdes * Redistribution and use in source and binary forms, with or without 637535Sdes * modification, are permitted provided that the following conditions 737535Sdes * are met: 837535Sdes * 1. Redistributions of source code must retain the above copyright 937535Sdes * notice, this list of conditions and the following disclaimer. 1037535Sdes * 2. Redistributions in binary form must reproduce the above copyright 1137535Sdes * notice, this list of conditions and the following disclaimer in the 1237535Sdes * documentation and/or other materials provided with the distribution. 1337535Sdes * 1437535Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1537535Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1637535Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1737535Sdes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1837535Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1937535Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2037535Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2137535Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2237535Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2337535Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2437535Sdes * SUCH DAMAGE. 2537535Sdes */ 2637535Sdes/* $NetBSD: sigsetjmp.S,v 1.4 1998/10/03 12:30:38 tsubai Exp $ */ 2737535Sdes 2850476Speter#include <machine/asm.h> 2937535Sdes__FBSDID("$FreeBSD$"); 3037535Sdes 3137608Sdes/* 3237608Sdes * C library -- sigsetjmp, siglongjmp 3337608Sdes * 3437608Sdes * siglongjmp(a,v) 3537608Sdes * will generate a "return(v?v:1)" from the last call to 3637608Sdes * sigsetjmp(a, savemask) 3737608Sdes * by restoring registers from the stack. 3837608Sdes * The previous signal state is restored if savemask is non-zero 3937608Sdes * 4037608Sdes * jmpbuf layout: 4137608Sdes * +------------+ 4237608Sdes * | savemask | 4337608Sdes * +------------+ 4437608Sdes * | sig state | 4560189Sdes * | | 4637608Sdes * | (4 words) | 4737608Sdes * | | 4837608Sdes * +------------+ 4937608Sdes * | saved regs | 5037608Sdes * | ... | 5137608Sdes */ 5237608Sdes 5337608Sdes 5437608Sdes#include <sys/syscall.h> 5537608Sdes 5637608SdesENTRY(sigsetjmp) 5737608Sdes mr %r6,%r3 5837608Sdes stw %r4,0(%r3) 5937608Sdes or. %r7,%r4,%r4 6037608Sdes beq 1f 6137608Sdes li %r3,1 /* SIG_BLOCK, but doesn't matter */ 6237608Sdes /* since set == NULL */ 6337535Sdes li %r4,0 /* set = NULL */ 6460737Sume mr %r5,%r6 /* &oset */ 6537535Sdes addi %r5,%r5,4 6637535Sdes li %r0, SYS_sigprocmask /* sigprocmask(SIG_BLOCK, NULL, &oset)*/ 6737535Sdes sc /* assume no error XXX */ 6860376Sdes1: 6960189Sdes mflr %r11 7037608Sdes mfcr %r12 7137535Sdes mr %r10,%r1 7237535Sdes mr %r9,%r2 7337535Sdes 7460376Sdes std %r9,40 + 0*8(%r6) 7537535Sdes std %r10,40 + 1*8(%r6) 7637535Sdes std %r11,40 + 2*8(%r6) 7737535Sdes std %r12,40 + 3*8(%r6) 7840939Sdes std %r13,40 + 4*8(%r6) 7941862Sdes std %r14,40 + 5*8(%r6) 8037535Sdes std %r15,40 + 6*8(%r6) 8137535Sdes std %r16,40 + 7*8(%r6) 8237535Sdes std %r17,40 + 8*8(%r6) 8337535Sdes std %r18,40 + 9*8(%r6) 8437535Sdes std %r19,40 + 10*8(%r6) 8560196Sdes std %r20,40 + 11*8(%r6) 8660196Sdes std %r21,40 + 12*8(%r6) 8760954Sdes std %r22,40 + 13*8(%r6) 8860196Sdes std %r23,40 + 14*8(%r6) 8937535Sdes std %r24,40 + 15*8(%r6) 9037535Sdes std %r25,40 + 16*8(%r6) 9137535Sdes std %r26,40 + 17*8(%r6) 9237535Sdes std %r27,40 + 18*8(%r6) 9337535Sdes std %r28,40 + 19*8(%r6) 9437535Sdes std %r29,40 + 20*8(%r6) 9537535Sdes std %r30,40 + 21*8(%r6) 9637535Sdes std %r31,40 + 22*8(%r6) 9737535Sdes 9837535Sdes li %r3,0 9937535Sdes blr 10037535Sdes 10137535SdesENTRY(siglongjmp) 10237608Sdes ld %r9,40 + 0*8(%r3) 10337608Sdes ld %r10,40 + 1*8(%r3) 10437608Sdes ld %r11,40 + 2*8(%r3) 10537608Sdes ld %r12,40 + 3*8(%r3) 10637608Sdes ld %r14,40 + 5*8(%r3) 10737608Sdes ld %r15,40 + 6*8(%r3) 10837608Sdes ld %r16,40 + 7*8(%r3) 10937608Sdes ld %r17,40 + 8*8(%r3) 11037608Sdes ld %r18,40 + 9*8(%r3) 11137608Sdes ld %r19,40 + 10*8(%r3) 11237608Sdes ld %r20,40 + 11*8(%r3) 11337608Sdes ld %r21,40 + 12*8(%r3) 11437608Sdes ld %r22,40 + 13*8(%r3) 11537608Sdes ld %r23,40 + 14*8(%r3) 11637608Sdes ld %r24,40 + 15*8(%r3) 11737608Sdes ld %r25,40 + 16*8(%r3) 11837608Sdes ld %r26,40 + 17*8(%r3) 11937608Sdes ld %r27,40 + 18*8(%r3) 12037608Sdes ld %r28,40 + 19*8(%r3) 12137608Sdes ld %r29,40 + 20*8(%r3) 12237608Sdes ld %r30,40 + 21*8(%r3) 12337608Sdes ld %r31,40 + 22*8(%r3) 12437608Sdes 12537535Sdes lwz %r7,0(%r3) 12637535Sdes mr %r6,%r4 12737535Sdes mtlr %r11 12837535Sdes mtcr %r12 12937535Sdes mr %r2,%r9 13037535Sdes mr %r1,%r10 13137535Sdes or. %r7,%r7,%r7 13237535Sdes beq 1f 13337535Sdes mr %r4,%r3 13437535Sdes li %r3,3 /* SIG_SETMASK */ 13537535Sdes addi %r4,%r4,4 /* &set */ 13637535Sdes li %r5,0 /* oset = NULL */ 13737535Sdes li %r0,SYS_sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */ 13837535Sdes sc /* assume no error XXX */ 13937535Sdes1: 14060707Sdes or. %r3,%r6,%r6 14160707Sdes bnelr 14237535Sdes li %r3,1 14337535Sdes blr 14437535Sdes 14537535Sdes .section .note.GNU-stack,"",%progbits 14637535Sdes