|
|
1.1 ! root 1: /* Copyright 1989 by AT&T Bell Laboratories */ ! 2: /* VAX.dep.c ! 3: * ! 4: * VAX dependent code for the SML/NJ runtime kernel. ! 5: */ ! 6: ! 7: #include <signal.h> ! 8: #include "tags.h" ! 9: ! 10: extern int cause, fault_code; ! 11: extern int saved_pc; ! 12: extern int saveregs[]; ! 13: ! 14: ! 15: int ghandle(sig,code,scp,addr) int sig, code, addr; struct sigcontext *scp; ! 16: { ! 17: #ifdef V9 ! 18: #define FPE_INTOVF_TRAP K_INTOVF ! 19: saved_pc = addr; addr = (int)saveregs; ! 20: #else ! 21: saved_pc = scp->sc_pc; scp->sc_pc = (int)saveregs; ! 22: #endif ! 23: ! 24: if (*(int*)(saved_pc-4) == 0x59585cc1 && code==FPE_INTOVF_TRAP) ! 25: {cause=CAUSE_GC; ! 26: saved_pc -= 4; ! 27: } ! 28: else if ((*(int*)saved_pc & 0xffffff) == 0x5958c0 && code==FPE_INTOVF_TRAP) ! 29: {cause=CAUSE_GC; ! 30: /* the next line is temporary */ ! 31: if ( (*(int*)(saved_pc-8) & 0xffff) == 0x5cc1 && code==FPE_INTOVF_TRAP) saved_pc-=8; else ! 32: saved_pc -= 12; ! 33: } ! 34: else {fault_code=exnCode(sig,code); cause=CAUSE_FAULT;} ! 35: } ! 36: ! 37: /* This next define is needed by ultrix systems */ ! 38: #ifndef sigmask ! 39: #define sigmask(X) (1<<((X)-1)) ! 40: #endif ! 41: ! 42: extern int handleprof(); ! 43: ! 44: setupsignals() ! 45: { ! 46: #ifdef BSD ! 47: struct sigvec a; ! 48: int (**handlerp)() = (int (**)()) &a.sv_handler; ! 49: *handlerp = ghandle; ! 50: a.sv_onstack = 0; ! 51: a.sv_mask = 0; ! 52: sigvec(SIGINT,&a,0); ! 53: sigvec(SIGFPE,&a,0); ! 54: a.sv_handler = SIG_IGN; ! 55: sigvec(SIGPIPE,&a,0); ! 56: a.sv_handler = (int (*)()) handleprof; ! 57: sigvec(SIGVTALRM,&a,0); ! 58: #endif ! 59: #ifdef V9 ! 60: signal(SIGINT,ghandle); ! 61: signal(SIGFPE,ghandle); ! 62: signal(SIGPIPE,SIG_IGN); ! 63: #endif ! 64: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.