Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/mach-dep/unix-fault.c
ViewVC logotype

Annotation of /sml/trunk/src/runtime/mach-dep/unix-fault.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (view) (download) (as text)

1 : monnier 2 /* unix-fault.c
2 :     *
3 :     * COPYRIGHT (c) 1992 by AT&T Bell Laboratories.
4 :     *
5 :     * Common code for handling arithmetic traps.
6 :     */
7 :    
8 :     #include "ml-unixdep.h"
9 :     #include "signal-sysdep.h"
10 :     #include "ml-base.h"
11 :     #include "vproc-state.h"
12 :     #include "ml-state.h"
13 :     #include "ml-globals.h"
14 :    
15 :     /* this is temporary */
16 :     #define SELF_VPROC (VProc[0])
17 :    
18 :    
19 :     /* local routines */
20 :     PVT SigReturn_t FaultHandler (/* int sig, SigInfo_t code, SigContext_t *scp */);
21 :     PVT SigReturn_t PanicTrace (/* int sig, SigInfo_t code, SigContext_t *scp */);
22 :    
23 :    
24 :     /* InitFaultHandlers:
25 :     */
26 :     void InitFaultHandlers (ml_state_t *msp)
27 :     {
28 :     int mlSig;
29 :    
30 :     #ifndef TARGET_BYTECODE
31 :    
32 :     /** Set up the Div and Overflow faults **/
33 :     #ifdef SIG_FAULT1
34 :     SIG_SetHandler (SIG_FAULT1, FaultHandler);
35 :     #endif
36 :     #ifdef SIG_FAULT2
37 :     SIG_SetHandler (SIG_FAULT2, FaultHandler);
38 :     #endif
39 :    
40 :     /** Initialize the floating-point unit **/
41 :     SIG_InitFPE ();
42 :    
43 :     #else /* TARGET_BYTECODE */
44 :     /** **/ SIG_SetHandler (SIGINT, PanicTrace);
45 :     SIG_SetHandler (SIGBUS, PanicTrace);
46 :     SIG_SetHandler (SIGSEGV, PanicTrace);
47 :     #endif /* !TARGET_BYTECODE */
48 :    
49 :     } /* end of InitFaultHandlers */
50 :    
51 :    
52 :     #ifndef TARGET_BYTECODE
53 :    
54 :     /* FaultHandler:
55 :     *
56 :     * Handle arithmetic faults (e.g., divide by zero, integer overflow).
57 :     */
58 :     PVT SigReturn_t FaultHandler (
59 :     int signal,
60 :     #if defined(OPSYS_LINUX)
61 :     SigContext_t sc)
62 :     #elif defined(OPSYS_MKLINUX)
63 :     SigContext_t *scp)
64 :     #else
65 :     SigInfo_t info,
66 :     SigContext_t *scp)
67 :     #endif
68 :     {
69 :     #if defined(OPSYS_LINUX)
70 :     SigContext_t *scp = ≻
71 :     #endif
72 :     ml_state_t *msp = SELF_VPROC->vp_state;
73 :     extern Word_t request_fault[];
74 :     int code = SIG_GetCode(info, scp);
75 :    
76 :     #ifdef SIGNAL_DEBUG
77 :     SayDebug ("Fault handler: sig = %d, inML = %d\n",
78 :     signal, SELF_VPROC->vp_inMLFlag);
79 :     #endif
80 :    
81 :     if (! SELF_VPROC->vp_inMLFlag)
82 :     Die ("bogus fault not in ML: (%d, %#x)\n", signal, SIG_GetCode(info, scp));
83 :    
84 :     /* Map the signal to the appropriate ML exception. */
85 : monnier 8 if (INT_DIVZERO(signal, code)) {
86 :     msp->ml_faultExn = DivId;
87 :     msp->ml_faultPC = (Word_t)SIG_GetPC(scp);
88 :     }
89 :     else if (INT_OVFLW(signal, code)) {
90 :     msp->ml_faultExn = OverflowId;
91 :     msp->ml_faultPC = (Word_t)SIG_GetPC(scp);
92 :     }
93 : monnier 2 else
94 :     Die ("unexpected fault, signal = %d, code = %#x", signal, code);
95 :    
96 :     SIG_SetPC (scp, request_fault);
97 :    
98 :     SIG_ResetFPE (scp);
99 :    
100 :     } /* end of FaultHandler */
101 :    
102 :     #endif /* !TARGET_BYTECODE */
103 :    
104 :    
105 :     #if defined(TARGET_BYTECODE)
106 :     extern void PrintRegs (FILE *);
107 :     #ifdef INSTR_HISTORY
108 :     extern void PrintInstrHistory (FILE *);
109 :     #endif
110 :    
111 :     /* PanicTrace:
112 :     * This signal handler prints a trace of the last few instructions executed
113 :     * by the bytecode interpreter (for debugging purposes).
114 :     */
115 :     PVT SigReturn_t PanicTrace (
116 :     int signal,
117 :     #if defined(OPSYS_LINUX)
118 :     SigContext_t sc)
119 :     #else
120 :     SigInfo_t info,
121 :     SigContext_t *scp)
122 :     #endif
123 :     {
124 :     #if defined(OPSYS_LINUX)
125 :     SigContext_t *scp = ≻
126 :     #endif
127 :    
128 :     SayDebug ("**** PANIC: signal = %d, code = %#x ****\n",
129 :     signal, SIG_GetCode(info, scp));
130 :     PrintRegs(DebugF);
131 :     #ifdef INSTR_HISTORY
132 :     PrintInstrHistory (DebugF);
133 :     #endif
134 :     SayDebug ("\n");
135 :    
136 :     Exit (1);
137 :     }
138 :     #endif
139 :    
140 :    
141 :     #if (defined(TARGET_RS6000) && defined(OPSYS_AIX))
142 :    
143 :     /* SIG_GetCode:
144 :     *
145 :     * For the RS6000/AIX, the overflow and divide by zero information is obtained
146 :     * from information contained in the sigcontext structure.
147 :     */
148 :     PVT int SIG_GetCode (SigInfo_t code, SigContext_t *scp)
149 :     {
150 :     struct fp_sh_info FPInfo;
151 :    
152 :     fp_sh_info (scp, &FPInfo, sizeof(struct fp_sh_info));
153 :    
154 :     return FPInfo.trap;
155 :    
156 :     } /* end of SIG_GetCode */
157 :    
158 :     #endif

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0