1*80ee5cbfSDavid du Colombier #include "../plan9/lib.h"
2*80ee5cbfSDavid du Colombier #include "../plan9/sys9.h"
3*80ee5cbfSDavid du Colombier #include <signal.h>
4*80ee5cbfSDavid du Colombier #include <setjmp.h>
5*80ee5cbfSDavid du Colombier
6*80ee5cbfSDavid du Colombier /* A stack to hold pcs when signals nest */
7*80ee5cbfSDavid du Colombier #define MAXSIGSTACK 20
8*80ee5cbfSDavid du Colombier typedef struct Pcstack Pcstack;
9*80ee5cbfSDavid du Colombier static struct Pcstack {
10*80ee5cbfSDavid du Colombier int sig;
11*80ee5cbfSDavid du Colombier void (*hdlr)(int, char*, Ureg*);
12*80ee5cbfSDavid du Colombier unsigned long restorepc;
13*80ee5cbfSDavid du Colombier Ureg *u;
14*80ee5cbfSDavid du Colombier } pcstack[MAXSIGSTACK];
15*80ee5cbfSDavid du Colombier static int nstack = 0;
16*80ee5cbfSDavid du Colombier
17*80ee5cbfSDavid du Colombier static void notecont(Ureg*, char*);
18*80ee5cbfSDavid du Colombier
19*80ee5cbfSDavid du Colombier void
_notetramp(int sig,void (* hdlr)(int,char *,Ureg *),Ureg * u)20*80ee5cbfSDavid du Colombier _notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u)
21*80ee5cbfSDavid du Colombier {
22*80ee5cbfSDavid du Colombier Pcstack *p;
23*80ee5cbfSDavid du Colombier
24*80ee5cbfSDavid du Colombier if(nstack >= MAXSIGSTACK)
25*80ee5cbfSDavid du Colombier _NOTED(1); /* nesting too deep; just do system default */
26*80ee5cbfSDavid du Colombier p = &pcstack[nstack];
27*80ee5cbfSDavid du Colombier p->restorepc = u->pc;
28*80ee5cbfSDavid du Colombier p->sig = sig;
29*80ee5cbfSDavid du Colombier p->hdlr = hdlr;
30*80ee5cbfSDavid du Colombier p->u = u;
31*80ee5cbfSDavid du Colombier nstack++;
32*80ee5cbfSDavid du Colombier u->pc = (unsigned long) notecont;
33*80ee5cbfSDavid du Colombier _NOTED(2); /* NSAVE: clear note but hold state */
34*80ee5cbfSDavid du Colombier }
35*80ee5cbfSDavid du Colombier
36*80ee5cbfSDavid du Colombier static void
notecont(Ureg * u,char * s)37*80ee5cbfSDavid du Colombier notecont(Ureg *u, char *s)
38*80ee5cbfSDavid du Colombier {
39*80ee5cbfSDavid du Colombier Pcstack *p;
40*80ee5cbfSDavid du Colombier void(*f)(int, char*, Ureg*);
41*80ee5cbfSDavid du Colombier
42*80ee5cbfSDavid du Colombier p = &pcstack[nstack-1];
43*80ee5cbfSDavid du Colombier f = p->hdlr;
44*80ee5cbfSDavid du Colombier u->pc = p->restorepc;
45*80ee5cbfSDavid du Colombier nstack--;
46*80ee5cbfSDavid du Colombier (*f)(p->sig, s, u);
47*80ee5cbfSDavid du Colombier _NOTED(3); /* NRSTR */
48*80ee5cbfSDavid du Colombier }
49*80ee5cbfSDavid du Colombier
50*80ee5cbfSDavid du Colombier #define JMPBUFPC 1
51*80ee5cbfSDavid du Colombier #define JMPBUFSP 0
52*80ee5cbfSDavid du Colombier
53*80ee5cbfSDavid du Colombier extern sigset_t _psigblocked;
54*80ee5cbfSDavid du Colombier
55*80ee5cbfSDavid du Colombier void
siglongjmp(sigjmp_buf j,int ret)56*80ee5cbfSDavid du Colombier siglongjmp(sigjmp_buf j, int ret)
57*80ee5cbfSDavid du Colombier {
58*80ee5cbfSDavid du Colombier struct Ureg *u;
59*80ee5cbfSDavid du Colombier
60*80ee5cbfSDavid du Colombier if(j[0])
61*80ee5cbfSDavid du Colombier _psigblocked = j[1];
62*80ee5cbfSDavid du Colombier if(nstack == 0 || pcstack[nstack-1].u->sp > j[2+JMPBUFSP])
63*80ee5cbfSDavid du Colombier longjmp(j+2, ret);
64*80ee5cbfSDavid du Colombier u = pcstack[nstack-1].u;
65*80ee5cbfSDavid du Colombier nstack--;
66*80ee5cbfSDavid du Colombier u->r0 = ret;
67*80ee5cbfSDavid du Colombier if(ret == 0)
68*80ee5cbfSDavid du Colombier u->r0 = 1;
69*80ee5cbfSDavid du Colombier u->pc = j[2+JMPBUFPC];
70*80ee5cbfSDavid du Colombier u->sp = j[2+JMPBUFSP];
71*80ee5cbfSDavid du Colombier _NOTED(3); /* NRSTR */
72*80ee5cbfSDavid du Colombier }
73