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