1/*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * the Systems Programming Group of the University of Utah Computer 7 * Science Department. 8 * 9 * %sccs.include.redist.c% 10 */ 11 12#if defined(LIBC_SCCS) && !defined(lint) 13 .asciz "@(#)sigsetjmp.s 8.1 (Berkeley) 05/03/95" 14#endif /* LIBC_SCCS and not lint */ 15 16/* 17 * C library -- sigsetjmp, siglongjmp 18 * 19 * siglongjmp(a,v) 20 * will generate a "return(v)" from 21 * the last call to 22 * sigsetjmp(a, savesig) 23 * by restoring registers from the stack, 24 * and a struct sigcontext, see <signal.h> 25 */ 26 27#define _JBLEN 17 /* XXX from <setjmp.h> */ 28 29#include "DEFS.h" 30 31ENTRY(sigsetjmp) 32 tstl sp@(8) /* save signal mask? */ 33 beq _setjmp /* do _setjmp */ 34 movl #_JBLEN,d0 /* last entry in jmpbuf */ 35 asll #2,d0 /* scale to long ptr */ 36 movl sp@(4),a0 /* save area pointer */ 37 addl d0,a0 /* &jmpbuf[_JBLEN] */ 38 movl sp@(8),a0@ /* jmpbuf[_JBLEN] = savemask */ 39 bra setjmp /* do setjmp */ 40 41_setjmp: 42 movl sp@(4),a0 /* save area pointer */ 43 clrl a0@+ /* no old onstack */ 44 clrl a0@+ /* no old sigmask */ 45 movl sp,a0@+ /* save old SP */ 46 movl a6,a0@+ /* save old FP */ 47 clrl a0@+ /* no old AP */ 48 movl sp@,a0@+ /* save old PC */ 49 clrl a0@+ /* clear PS */ 50 moveml #0x3CFC,a0@ /* save other non-scratch regs */ 51 clrl d0 /* return zero */ 52 rts 53 54setjmp: 55 subl #12,sp /* space for sigaltstack args/rvals */ 56 clrl sp@ /* don't change it... */ 57 movl sp,sp@(4) /* ...but return the current val */ 58 jsr _sigaltstack /* note: onstack returned in sp@(8) */ 59 clrl sp@ /* don't change mask, just return */ 60 jsr _sigblock /* old value */ 61 movl sp@(8),d1 /* old onstack value */ 62 andl #1,d1 /* extract onstack flag */ 63 addl #12,sp 64 movl sp@(4),a0 /* save area pointer */ 65 movl d1,a0@+ /* save old onstack value */ 66 movl d0,a0@+ /* save old signal mask */ 67 lea sp@(4),a1 /* adjust saved SP since we won't rts */ 68 movl a1,a0@+ /* save old SP */ 69 movl a6,a0@+ /* save old FP */ 70 clrl a0@+ /* no AP */ 71 movl sp@,a0@+ /* save old PC */ 72 clrl a0@+ /* clean PS */ 73 moveml #0x3CFC,a0@ /* save remaining non-scratch regs */ 74 clrl d0 /* return 0 */ 75 rts 76 77ENTRY(siglongjmp) 78 movl #_JBLEN,d0 /* last entry in jmpbuf */ 79 asll #2,d0 /* scale to long ptr */ 80 movl sp@(4),a0 /* save area pointer */ 81 addl d0,a0 /* &jmpbuf[_JBLEN] */ 82 tstl a0@ /* if jmpbuf[_JBLEN] */ 83 bne longjmp /* do longjmp */ 84 85_longjmp: 86 movl sp@(4),a0 /* save area pointer */ 87 addql #8,a0 /* skip onstack/sigmask */ 88 tstl a0@ /* ensure non-zero SP */ 89 jeq botch /* oops! */ 90 movl sp@(8),d0 /* grab return value */ 91 jne ok /* non-zero ok */ 92 moveq #1,d0 /* else make non-zero */ 93ok: 94 movl a0@+,sp /* restore SP */ 95 movl a0@+,a6 /* restore FP */ 96 addql #4,a0 /* skip AP */ 97 movl a0@+,sp@ /* restore PC */ 98 moveml a0@(4),#0x3CFC /* restore non-scratch regs */ 99 rts 100 101longjmp: 102 movl sp@(4),a0 /* save area pointer */ 103 tstl a0@(8) /* ensure non-zero SP */ 104 jeq botch /* oops! */ 105 movl sp@(8),d0 /* grab return value */ 106 jne good /* non-zero good */ 107 moveq #1,d0 /* else make non-zero */ 108good: 109 moveml a0@(28),#0x3CFC /* restore non-scratch regs */ 110 movl a0,sp@- /* let sigreturn */ 111 jsr _sigreturn /* finish for us */ 112 113botch: 114 jsr _longjmperror 115 stop #0 116