1dc9b124dSJustin Hibbits/*- 2dc9b124dSJustin Hibbits * Copyright (c) 2016 Justin Hibbits 3dc9b124dSJustin Hibbits * All rights reserved. 4dc9b124dSJustin Hibbits * 5dc9b124dSJustin Hibbits * Redistribution and use in source and binary forms, with or without 6dc9b124dSJustin Hibbits * modification, are permitted provided that the following conditions 7dc9b124dSJustin Hibbits * are met: 8dc9b124dSJustin Hibbits * 1. Redistributions of source code must retain the above copyright 9dc9b124dSJustin Hibbits * notice, this list of conditions and the following disclaimer. 10dc9b124dSJustin Hibbits * 2. Redistributions in binary form must reproduce the above copyright 11dc9b124dSJustin Hibbits * notice, this list of conditions and the following disclaimer in the 12dc9b124dSJustin Hibbits * documentation and/or other materials provided with the distribution. 13dc9b124dSJustin Hibbits * 14dc9b124dSJustin Hibbits * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15dc9b124dSJustin Hibbits * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16dc9b124dSJustin Hibbits * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17dc9b124dSJustin Hibbits * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18dc9b124dSJustin Hibbits * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19dc9b124dSJustin Hibbits * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20dc9b124dSJustin Hibbits * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21dc9b124dSJustin Hibbits * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22dc9b124dSJustin Hibbits * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23dc9b124dSJustin Hibbits * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24dc9b124dSJustin Hibbits * SUCH DAMAGE. 25dc9b124dSJustin Hibbits */ 26dc9b124dSJustin Hibbits/* $NetBSD: setjmp.S,v 1.3 1998/10/03 12:30:38 tsubai Exp $ */ 27dc9b124dSJustin Hibbits 28dc9b124dSJustin Hibbits#include <machine/asm.h> 29dc9b124dSJustin Hibbits#include <sys/syscall.h> 30dc9b124dSJustin Hibbits 31dc9b124dSJustin Hibbits/* 32dc9b124dSJustin Hibbits * C library -- setjmp, longjmp 33dc9b124dSJustin Hibbits * 34dc9b124dSJustin Hibbits * longjmp(a,v) 35dc9b124dSJustin Hibbits * will generate a "return(v?v:1)" from the last call to 36dc9b124dSJustin Hibbits * setjmp(a) 37dc9b124dSJustin Hibbits * by restoring registers from the stack. 38dc9b124dSJustin Hibbits * The previous signal state is restored. 39dc9b124dSJustin Hibbits * 40dc9b124dSJustin Hibbits * jmpbuf layout: 41dc9b124dSJustin Hibbits * +------------+ 42dc9b124dSJustin Hibbits * | unused | 43dc9b124dSJustin Hibbits * +------------+ 44dc9b124dSJustin Hibbits * | sig state | 45dc9b124dSJustin Hibbits * | | 46dc9b124dSJustin Hibbits * | (4 words) | 47dc9b124dSJustin Hibbits * | | 48dc9b124dSJustin Hibbits * +------------+ 49dc9b124dSJustin Hibbits * | saved regs | 50dc9b124dSJustin Hibbits * | ... | 51dc9b124dSJustin Hibbits */ 52dc9b124dSJustin Hibbits 53dc9b124dSJustin HibbitsENTRY(setjmp) 54dc9b124dSJustin Hibbits mr %r6,%r3 55dc9b124dSJustin Hibbits li %r3,1 /* SIG_BLOCK, but doesn't matter */ 56dc9b124dSJustin Hibbits /* since set == NULL */ 57dc9b124dSJustin Hibbits li %r4,0 /* set = NULL */ 58dc9b124dSJustin Hibbits mr %r5,%r6 /* &oset */ 59dc9b124dSJustin Hibbits addi %r5,%r5,4 60dc9b124dSJustin Hibbits li %r0, SYS_sigprocmask /*sigprocmask(SIG_BLOCK, NULL, &oset)*/ 61dc9b124dSJustin Hibbits sc /*assume no error XXX */ 62dc9b124dSJustin Hibbits mflr %r11 /* r11 <- link reg */ 63dc9b124dSJustin Hibbits mfcr %r12 /* r12 <- condition reg */ 64dc9b124dSJustin Hibbits mr %r10,%r1 /* r10 <- stackptr */ 65dc9b124dSJustin Hibbits mr %r9,%r2 /* r9 <- global ptr */ 66dc9b124dSJustin Hibbits evstdd %r9,24+0*8(%r6) 67dc9b124dSJustin Hibbits evstdd %r10,24+1*8(%r6) 68dc9b124dSJustin Hibbits evstdd %r11,24+2*8(%r6) 69dc9b124dSJustin Hibbits evstdd %r12,24+3*8(%r6) 70dc9b124dSJustin Hibbits evstdd %r13,24+4*8(%r6) 71dc9b124dSJustin Hibbits evstdd %r14,24+5*8(%r6) 72dc9b124dSJustin Hibbits evstdd %r15,24+6*8(%r6) 73dc9b124dSJustin Hibbits evstdd %r16,24+7*8(%r6) 74dc9b124dSJustin Hibbits evstdd %r17,24+8*8(%r6) 75dc9b124dSJustin Hibbits evstdd %r18,24+9*8(%r6) 76dc9b124dSJustin Hibbits evstdd %r19,24+10*8(%r6) 77dc9b124dSJustin Hibbits evstdd %r20,24+11*8(%r6) 78dc9b124dSJustin Hibbits evstdd %r21,24+12*8(%r6) 79dc9b124dSJustin Hibbits evstdd %r22,24+13*8(%r6) 80dc9b124dSJustin Hibbits evstdd %r23,24+14*8(%r6) 81dc9b124dSJustin Hibbits evstdd %r24,24+15*8(%r6) 82dc9b124dSJustin Hibbits evstdd %r25,24+16*8(%r6) 83dc9b124dSJustin Hibbits evstdd %r26,24+17*8(%r6) 84dc9b124dSJustin Hibbits evstdd %r27,24+18*8(%r6) 85dc9b124dSJustin Hibbits evstdd %r28,24+19*8(%r6) 86dc9b124dSJustin Hibbits evstdd %r29,24+20*8(%r6) 87dc9b124dSJustin Hibbits evstdd %r30,24+21*8(%r6) 88dc9b124dSJustin Hibbits evstdd %r31,24+22*8(%r6) 89dc9b124dSJustin Hibbits 90dc9b124dSJustin Hibbits li %r3,0 /* return (0) */ 91dc9b124dSJustin Hibbits blr 92dc9b124dSJustin HibbitsEND(setjmp) 93dc9b124dSJustin Hibbits 94dc9b124dSJustin Hibbits WEAK_REFERENCE(CNAME(__longjmp), longjmp) 95dc9b124dSJustin HibbitsENTRY(__longjmp) 96*aab03089SJustin Hibbits evldd %r9,24+0*8(%r3) 97*aab03089SJustin Hibbits evldd %r10,24+1*8(%r3) 98*aab03089SJustin Hibbits evldd %r11,24+2*8(%r3) 99*aab03089SJustin Hibbits evldd %r12,24+3*8(%r3) 100*aab03089SJustin Hibbits evldd %r13,24+4*8(%r3) 101*aab03089SJustin Hibbits evldd %r14,24+5*8(%r3) 102*aab03089SJustin Hibbits evldd %r15,24+6*8(%r3) 103*aab03089SJustin Hibbits evldd %r16,24+7*8(%r3) 104*aab03089SJustin Hibbits evldd %r17,24+8*8(%r3) 105*aab03089SJustin Hibbits evldd %r18,24+9*8(%r3) 106*aab03089SJustin Hibbits evldd %r19,24+10*8(%r3) 107*aab03089SJustin Hibbits evldd %r20,24+11*8(%r3) 108*aab03089SJustin Hibbits evldd %r21,24+12*8(%r3) 109*aab03089SJustin Hibbits evldd %r22,24+13*8(%r3) 110*aab03089SJustin Hibbits evldd %r23,24+14*8(%r3) 111*aab03089SJustin Hibbits evldd %r24,24+15*8(%r3) 112*aab03089SJustin Hibbits evldd %r25,24+16*8(%r3) 113*aab03089SJustin Hibbits evldd %r26,24+17*8(%r3) 114*aab03089SJustin Hibbits evldd %r27,24+18*8(%r3) 115*aab03089SJustin Hibbits evldd %r28,24+19*8(%r3) 116*aab03089SJustin Hibbits evldd %r29,24+20*8(%r3) 117*aab03089SJustin Hibbits evldd %r30,24+21*8(%r3) 118*aab03089SJustin Hibbits evldd %r31,24+22*8(%r3) 119dc9b124dSJustin Hibbits 120dc9b124dSJustin Hibbits mr %r6,%r4 /* save val param */ 121dc9b124dSJustin Hibbits mtlr %r11 /* r11 -> link reg */ 122dc9b124dSJustin Hibbits mtcr %r12 /* r12 -> condition reg */ 123dc9b124dSJustin Hibbits mr %r1,%r10 /* r10 -> stackptr */ 124dc9b124dSJustin Hibbits mr %r4,%r3 125dc9b124dSJustin Hibbits li %r3,3 /* SIG_SETMASK */ 126dc9b124dSJustin Hibbits addi %r4,%r4,4 /* &set */ 127dc9b124dSJustin Hibbits li %r5,0 /* oset = NULL */ 128dc9b124dSJustin Hibbits li %r0,SYS_sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */ 129dc9b124dSJustin Hibbits sc /* assume no error XXX */ 130dc9b124dSJustin Hibbits or. %r3,%r6,%r6 131dc9b124dSJustin Hibbits bnelr 132dc9b124dSJustin Hibbits li %r3,1 133dc9b124dSJustin Hibbits blr 134dc9b124dSJustin HibbitsEND(__longjmp) 135dc9b124dSJustin Hibbits 136dc9b124dSJustin Hibbits .section .note.GNU-stack,"",%progbits 137