|
|
1.1 root 1: /* Copyright 1989 by AT&T Bell Laboratories */
2: /* M68.dep.c
3: *
4: * M68 dependent code for the SML/NJ runtime kernel.
5: */
6:
7: #include <signal.h>
8: #include "tags.h"
9:
10: #if defined(NeXT) && (! defined(FPE_TRAPV_TRAP))
11: /* This is required because NeXT 1.0 nuked this definition */
12: #define FPE_TRAPV_TRAP 0x1c /* TRAPV [cpTRAPcc TRAPcc] instr */
13: #endif
14:
15: extern int cause, fault_code;
16: extern int saved_pc;
17: extern int saveregs[];
18:
19:
20: /* ghandle:
21: */
22: ghandle (sig, code, scp, addr)
23: int sig, code, addr;
24: struct sigcontext *scp;
25: {
26: saved_pc = scp->sc_pc;
27: scp->sc_pc = (int)saveregs;
28:
29: /* Note: versions of sony_news before Sept 1989 had pc pointer BEFORE
30: trap instruction, not after. */
31: if (sig==SIGFPE && code==FPE_TRAPV_TRAP && ((short*)saved_pc)[-1] == 23548)
32: { saved_pc-=4;
33: cause=CAUSE_GC;
34: }
35: else {
36: fault_code=exnCode(sig,code);
37: cause=CAUSE_FAULT;
38: }
39: }
40:
41:
42: extern int handleprof();
43:
44: void setupsignals()
45: {
46: struct sigvec a;
47: extern fpenable();
48:
49: a.sv_handler = (void (*)()) ghandle;
50: a.sv_onstack = 0;
51: a.sv_mask = 0;
52: sigvec(SIGINT,&a,0);
53: sigvec(SIGFPE,&a,0);
54: sigvec(SIGEMT,&a,0); /* in case 68881 is not present */
55: a.sv_handler = SIG_IGN;
56: sigvec(SIGPIPE,&a,0);
57: a.sv_handler = (void (*)()) handleprof;
58: sigvec(SIGVTALRM,&a,0);
59: fpenable();
60: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.