xref: /original-bsd/lib/libc/hp300/gen/sigsetjmp.s (revision 55510a1d)
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