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/win32-fault.c
ViewVC logotype

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

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : monnier 2 /* win32-fault.c
2 :     *
3 :     * COPYRIGHT (c) 1996 Bell Laboratories, Lucent Technologies
4 :     *
5 :     * win32 code for handling traps (arithmetic overflow, div-by-0, ctrl-c, etc.).
6 :     */
7 :    
8 :     #include <windows.h>
9 :     #include <excpt.h>
10 :    
11 :     #include "ml-base.h"
12 :     #include "vproc-state.h"
13 :     #include "ml-state.h"
14 :     #include "ml-globals.h"
15 :     #include "signal-sysdep.h"
16 :     #include "system-signals.h"
17 :    
18 :     #include "win32-fault.h"
19 :    
20 :     #define SELF_VPROC (VProc[0])
21 :    
22 :     /* globals */
23 :     HANDLE win32_stdin_handle;
24 :     HANDLE win32_console_handle;
25 :     HANDLE win32_stdout_handle;
26 :     HANDLE win32_stderr_handle;
27 :    
28 :     HANDLE win32_ML_thread_handle;
29 :     BOOL win32_isNT;
30 :    
31 :     /* static globals */
32 :     PVT BOOL caught_cntrl_c = FALSE;
33 :    
34 :     void wait_for_cntrl_c()
35 :     {
36 :     /* we know a cntrl_c is coming; wait for it */
37 :     while (!caught_cntrl_c)
38 :     ;
39 :     }
40 :    
41 :     /* generic handler for win32 "signals" such as interrupt, alarm */
42 :     /* returns TRUE if the main thread is running ML code */
43 :     BOOL win32_generic_handler(int code)
44 :     {
45 :     vproc_state_t *vsp = SELF_VPROC;
46 :    
47 :     EnqueueSignal(vsp, code);
48 :     vsp->vp_numPendingSysSigs++;
49 :    
50 :     if (vsp->vp_inMLFlag &&
51 :     (! vsp->vp_handlerPending) &&
52 :     (! vsp->vp_inSigHandler))
53 :     {
54 :     vsp->vp_handlerPending = TRUE;
55 :     SIG_ZeroLimitPtr();
56 :     return TRUE;
57 :     }
58 :     return FALSE;
59 :     }
60 :    
61 :     /* cntrl_c_handler
62 :     * the win32 handler for ctrl-c
63 :     */
64 :     PVT
65 :     BOOL cntrl_c_handler(DWORD fdwCtrlType)
66 :     {
67 :     int ret = FALSE;
68 :    
69 :     /* SayDebug("event is %x\n", fdwCtrlType); */
70 :     switch (fdwCtrlType) {
71 :     case CTRL_BREAK_EVENT:
72 :     case CTRL_C_EVENT: {
73 :     if (!win32_generic_handler(SIGINT)) {
74 :     caught_cntrl_c = TRUE;
75 :     }
76 :     ret = TRUE; /* we handled the event */
77 :     break;
78 :     }
79 :     }
80 :     return ret; /* chain to other handlers */
81 :     }
82 :    
83 :    
84 :     /* InitFaultHandlers:
85 :     */
86 :     void InitFaultHandlers (ml_state_t *msp)
87 :     {
88 :     /* some basic win32 initialization is done here */
89 :    
90 :     /* determine if we're NT or 95 */
91 :     win32_isNT = !(GetVersion() & 0x80000000);
92 :    
93 :     /* get the redirected handle; this is "stdin" */
94 :     win32_stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
95 :     /* get the actual handle of the console */
96 :     win32_console_handle = CreateFile("CONIN$",
97 :     GENERIC_READ|GENERIC_WRITE,
98 :     FILE_SHARE_READ|FILE_SHARE_WRITE,
99 :     NULL,
100 :     OPEN_EXISTING,
101 :     0,0);
102 :     #ifdef WIN32_DEBUG
103 :     if (win32_console_handle == INVALID_HANDLE_VALUE) {
104 :     SayDebug("win32: failed to get actual console handle");
105 :     }
106 :     #endif
107 :    
108 :     win32_stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
109 :     win32_stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
110 :    
111 :     #ifdef WIN32_DEBUG
112 :     SayDebug("console input handle, %x\n", (unsigned int) win32_stdin_handle);
113 :     SayDebug("console output handle, %x\n", (unsigned int) win32_stdout_handle);
114 :     SayDebug("console error handle, %x\n", (unsigned int) win32_stderr_handle);
115 :     #endif
116 :    
117 :     /* create a thread id for the main thread */
118 :     {
119 :     HANDLE cp_h = GetCurrentProcess();
120 :    
121 :     if (!DuplicateHandle(cp_h, /* process with handle to dup */
122 :     GetCurrentThread(), /* pseudohandle, hence the dup */
123 :     cp_h, /* handle goes to current proc */
124 :     &win32_ML_thread_handle, /* recipient */
125 :     THREAD_ALL_ACCESS,
126 :     FALSE,
127 :     0 /* no options */
128 :     )) {
129 :     Die ("win32:InitFaultHandlers: cannot duplicate thread handle");
130 :     }
131 :     }
132 :    
133 :     /* install the ctrl-C handler */
134 :     if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)cntrl_c_handler,TRUE)) {
135 :     Die("win32:InitFaultHandlers: can't install cntrl_c_handler\n");
136 :     }
137 :    
138 :     /* initialize the floating-point unit */
139 :     SIG_InitFPE ();
140 :     }
141 :    
142 : monnier 8 PVT bool_t fault_handler (int code, Word_t pc)
143 : monnier 2 {
144 :     ml_state_t *msp = SELF_VPROC->vp_state;
145 :     extern Word_t request_fault[];
146 :    
147 :     if (! SELF_VPROC->vp_inMLFlag)
148 :     Die ("win32:fault_handler: bogus fault not in ML: %#x\n", code);
149 :    
150 :     /* Map the signal to the appropriate ML exception. */
151 :     switch (code) {
152 :     case EXCEPTION_INT_DIVIDE_BY_ZERO:
153 : monnier 8 msp->ml_faultExn = DivId;
154 :     msp->ml_faultPC = pc;
155 : monnier 2 break;
156 :     case EXCEPTION_INT_OVERFLOW:
157 : monnier 8 msp->ml_faultExn = OverflowId;
158 :     msp->ml_faultPC = pc;
159 : monnier 2 break;
160 :     default:
161 : monnier 8 Die ("win32:fault_handler: unexpected fault @%#x, code = %#x", pc, code);
162 : monnier 2 }
163 :     return TRUE;
164 :     }
165 :    
166 :     /* restoreregs
167 :     * this is where win32 handles traps
168 :     */
169 :     int restoreregs(ml_state_t *msp)
170 :     {
171 :     extern Word_t request_fault[];
172 :    
173 :     caught_cntrl_c = FALSE;
174 :     __try{
175 :     int request;
176 :    
177 :     request = asm_restoreregs(msp);
178 :     return request;
179 :    
180 : monnier 8 } __except(fault_handler(GetExceptionCode(), (Word_t *)(GetExceptionInformation())->ContextRecord->Eip) ?
181 : monnier 2 #ifdef HOST_X86
182 :     ((Word_t *)(GetExceptionInformation())->ContextRecord->Eip = request_fault,
183 :     EXCEPTION_CONTINUE_EXECUTION) :
184 :     EXCEPTION_CONTINUE_SEARCH)
185 :     #else
186 :     # error non-x86 win32 platforms need restoreregs support
187 :     #endif
188 :     { /* nothing */ }
189 :     }
190 :    
191 :     /* end of win32-fault.c */

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