xref: /plan9/sys/src/ape/lib/ap/sparc/notetramp.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include "../plan9/lib.h"
2*219b2ee8SDavid du Colombier #include "../plan9/sys9.h"
3*219b2ee8SDavid du Colombier #include <signal.h>
4*219b2ee8SDavid du Colombier 
5*219b2ee8SDavid du Colombier /* A stack to hold pcs when signals nest */
6*219b2ee8SDavid du Colombier #define MAXSIGSTACK 20
7*219b2ee8SDavid du Colombier typedef struct Pcstack Pcstack;
8*219b2ee8SDavid du Colombier static struct Pcstack {
9*219b2ee8SDavid du Colombier 	int sig;
10*219b2ee8SDavid du Colombier 	void (*hdlr)(int, char*, Ureg*);
11*219b2ee8SDavid du Colombier 	unsigned long restorepc;
12*219b2ee8SDavid du Colombier 	unsigned long restorenpc;
13*219b2ee8SDavid du Colombier } pcstack[MAXSIGSTACK];
14*219b2ee8SDavid du Colombier static int nstack = 0;
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier static void notecont(Ureg*, char*);
17*219b2ee8SDavid du Colombier 
18*219b2ee8SDavid du Colombier void
19*219b2ee8SDavid du Colombier _notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u)
20*219b2ee8SDavid du Colombier {
21*219b2ee8SDavid du Colombier 	Pcstack *p;
22*219b2ee8SDavid du Colombier 
23*219b2ee8SDavid du Colombier 	if(nstack >= MAXSIGSTACK)
24*219b2ee8SDavid du Colombier 		_NOTED(1);	/* nesting too deep; just do system default */
25*219b2ee8SDavid du Colombier 	p = &pcstack[nstack];
26*219b2ee8SDavid du Colombier 	p->restorepc = u->pc;
27*219b2ee8SDavid du Colombier 	p->restorenpc = u->npc;
28*219b2ee8SDavid du Colombier 	p->sig = sig;
29*219b2ee8SDavid du Colombier 	p->hdlr = hdlr;
30*219b2ee8SDavid du Colombier 	nstack++;
31*219b2ee8SDavid du Colombier 	u->pc = (unsigned long) notecont;
32*219b2ee8SDavid du Colombier 	u->npc = u->pc+4;
33*219b2ee8SDavid du Colombier 	_NOTED(2);	/* NSAVE: clear note but hold state */
34*219b2ee8SDavid du Colombier }
35*219b2ee8SDavid du Colombier 
36*219b2ee8SDavid du Colombier static void
37*219b2ee8SDavid du Colombier notecont(Ureg *u, char *s)
38*219b2ee8SDavid du Colombier {
39*219b2ee8SDavid du Colombier 	Pcstack *p;
40*219b2ee8SDavid du Colombier 	void(*f)(int, char*, Ureg*);
41*219b2ee8SDavid du Colombier 
42*219b2ee8SDavid du Colombier 	p = &pcstack[nstack-1];
43*219b2ee8SDavid du Colombier 	f = p->hdlr;
44*219b2ee8SDavid du Colombier 	u->pc = p->restorepc;
45*219b2ee8SDavid du Colombier 	u->npc = p->restorenpc;
46*219b2ee8SDavid du Colombier 	nstack--;
47*219b2ee8SDavid du Colombier 	(*f)(p->sig, s, u);
48*219b2ee8SDavid du Colombier 	_NOTED(3);	/* NRSTR */
49*219b2ee8SDavid du Colombier }
50