1 /*-
2 * Copyright (c) 1980 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 /*
9 * Don't split the copyright notice over two lines, it makes mkvers
10 * unhappy.
11 */
12 #ifndef lint
13 char copyright[] =
14 "@(#) Copyright (c) 1980 The Regents of the University of California.\n All rights reserved.\n";
15 #endif /* not lint */
16
17 #ifndef lint
18 static char sccsid[] = "@(#)main.c 5.7 (Berkeley) 11/13/91";
19 #endif /* not lint */
20
21 #include <stdio.h>
22 #include <signal.h>
23 #include "../libI77/fiodefs.h"
24
25 extern int errno;
26 char *getenv();
27 int xargc;
28 char **xargv;
29
main(argc,argv,arge)30 main(argc, argv, arge)
31 int argc;
32 char **argv;
33 char **arge;
34 {
35 void sigdie();
36 sig_t sigf;
37 int signum;
38
39 xargc = argc;
40 xargv = argv;
41
42 for (signum=1; signum<=16; signum++)
43 {
44 if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
45 }
46
47 #ifdef pdp11
48 ldfps(01200); /* detect overflow as an exception */
49 #endif
50
51 f_init();
52 MAIN_();
53 f_exit();
54 return 0;
55 }
56
57 struct action {
58 char *mesg;
59 int core;
60 } sig_act[16] = {
61 {"Hangup", 0}, /* SIGHUP */
62 {"Interrupt!", 0}, /* SIGINT */
63 {"Quit!", 1}, /* SIGQUIT */
64 {"Illegal ", 1}, /* SIGILL */
65 {"Trace Trap", 1}, /* SIGTRAP */
66 {"IOT Trap", 1}, /* SIGIOT */
67 {"EMT Trap", 1}, /* SIGEMT */
68 {"Arithmetic Exception", 1}, /* SIGFPE */
69 { 0, 0}, /* SIGKILL */
70 {"Bus error", 1}, /* SIGBUS */
71 {"Segmentation violation", 1}, /* SIGSEGV */
72 {"Sys arg", 1}, /* SIGSYS */
73 {"Open pipe", 0}, /* SIGPIPE */
74 {"Alarm", 0}, /* SIGALRM */
75 {"Terminated", 0}, /* SIGTERM */
76 {"Sig 16", 0}, /* unassigned */
77 };
78
79 #ifdef tahoe
80 /* The following arrays are defined & used assuming that signal codes are
81 1 to 5 for SIGFPE, and 0 to 3 for SIGILL.
82 Actually ILL_ALIGN_FAULT=14, and is mapped to 3. */
83
84 #define N_ACT_ILL 4 /* number of entries in act_ill[] */
85 #define N_ACT_FPE 5 /* number of entries in act_fpe[] */
86 #define ILL_ALIGN_FAULT 14
87
88 struct action act_fpe[] = {
89 {"Integer overflow", 1},
90 {"Integer divide by 0", 1},
91 {"Floating divide by zero", 1},
92 {"Floating point overflow", 1},
93 {"Floating point underflow", 1},
94 };
95
96 #else vax || pdp11
97
98 struct action act_fpe[] = {
99 {"Integer overflow", 1},
100 {"Integer divide by 0", 1},
101 {"Floating point overflow trap", 1},
102 {"Floating divide by zero trap", 1},
103 {"Floating point underflow trap", 1},
104 {"Decimal overflow", 1},
105 {"Subscript range", 1},
106 {"Floating point overflow", 0},
107 {"Floating divide by zero", 0},
108 {"Floating point underflow", 0},
109 };
110 #endif vax || pdp11
111
112 struct action act_ill[] = {
113 {"addr mode", 1},
114 {"instruction", 1},
115 {"operand", 0},
116 #ifdef tahoe
117 {"alignment", 1},
118 #endif tahoe
119 };
120
121 #if (defined(vax) || defined(tahoe))
122 void
sigdie(s,t,sc)123 sigdie(s, t, sc)
124 int s; int t; struct sigcontext *sc;
125
126 #else pdp11
127
128 void
129 sigdie(s, t, pc)
130 int s; int t; long pc;
131
132 #endif pdp11
133 {
134 extern unit units[];
135 register struct action *act = &sig_act[s-1];
136 /* print error message, then flush buffers */
137
138 if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
139 signal(s, SIG_IGN); /* don't allow it again */
140 else
141 signal(s, SIG_DFL); /* shouldn't happen again, but ... */
142
143 if (act->mesg)
144 {
145 fprintf(units[STDERR].ufd, "*** %s", act->mesg);
146 if (s == SIGFPE)
147 {
148 #ifndef tahoe
149 if (t >= 1 && t <= 10)
150 #else tahoe
151 if ((t-1) >= 0 && t < N_ACT_FPE)
152 #endif tahoe
153 fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
154 else
155 fprintf(units[STDERR].ufd, ": Type=%d?", t);
156 }
157 else if (s == SIGILL)
158 {
159 #ifndef tahoe
160 if (t == 4) t = 2; /* 4.0bsd botch */
161 if (t >= 0 && t <= 2)
162 #else tahoe
163 if (t == ILL_ALIGN_FAULT) /* ILL_ALIGN_FAULT maps to last
164 t = N_ACT_ILL-1; entry in act_ill[] */
165 if (t >= 0 && t < N_ACT_ILL)
166 #endif tahoe
167 fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
168 else
169 fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
170 }
171 putc('\n', units[STDERR].ufd);
172 }
173 f77_abort( s, act->core );
174 }
175