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 810 - (view) (download) (as text)

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

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