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