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