22 SIGTIMR
= 303; { Internal
for setitimer (SIGALRM
, SIGPROF
) }
30 function
SIG_DFL( x
: longint
) : longint
;
32 function
SIG_ERR( x
: longint
) : longint
;
34 function
SIG_IGN( x
: longint
) : longint
;
38 SignalHandler
= function (v
: longint
) : longint
;
40 PSignalHandler
= ^SignalHandler
; { to be compatible with linux
.pp
}
42 function
signal(sig
: longint
;func
: SignalHandler
) : SignalHandler
;
46 EXCEPTION_MAXIMUM_PARAMETERS
= 15;
50 FLOATING_SAVE_AREA
= record
55 ErrorSelector
: DWORD
;
58 RegisterArea
: array
[0..79] of BYTE
;
61 _FLOATING_SAVE_AREA
= FLOATING_SAVE_AREA
;
62 TFLOATINGSAVEAREA
= FLOATING_SAVE_AREA
;
63 PFLOATINGSAVEAREA
= ^FLOATING_SAVE_AREA
;
73 FloatSave
: FLOATING_SAVE_AREA
;
98 pexception_record
= ^exception_record
;
99 EXCEPTION_RECORD
= record
100 ExceptionCode
: longint
;
101 ExceptionFlags
: longint
;
102 ExceptionRecord
: pexception_record
;
103 ExceptionAddress
: pointer
;
104 NumberParameters
: longint
;
105 ExceptionInformation
: array
[0..EXCEPTION_MAXIMUM_PARAMETERS-1
] of pointer
;
108 PEXCEPTION_POINTERS
= ^EXCEPTION_POINTERS
;
109 EXCEPTION_POINTERS
= record
110 ExceptionRecord
: PEXCEPTION_RECORD
;
111 ContextRecord
: PCONTEXT
;
120 EXCEPTION_ACCESS_VIOLATION
= $c0000005;
121 EXCEPTION_BREAKPOINT
= $80000003;
122 EXCEPTION_DATATYPE_MISALIGNMENT
= $80000002;
123 EXCEPTION_SINGLE_STEP
= $80000004;
124 EXCEPTION_ARRAY_BOUNDS_EXCEEDED
= $c000008c;
125 EXCEPTION_FLT_DENORMAL_OPERAND
= $c000008d;
126 EXCEPTION_FLT_DIVIDE_BY_ZERO
= $c000008e;
127 EXCEPTION_FLT_INEXACT_RESULT
= $c000008f;
128 EXCEPTION_FLT_INVALID_OPERATION
= $c0000090;
129 EXCEPTION_FLT_OVERFLOW
= $c0000091;
130 EXCEPTION_FLT_STACK_CHECK
= $c0000092;
131 EXCEPTION_FLT_UNDERFLOW
= $c0000093;
132 EXCEPTION_INT_DIVIDE_BY_ZERO
= $c0000094;
133 EXCEPTION_INT_OVERFLOW
= $c0000095;
134 EXCEPTION_INVALID_HANDLE
= $c0000008;
135 EXCEPTION_PRIV_INSTRUCTION
= $c0000096;
136 EXCEPTION_NONCONTINUABLE_EXCEPTION
= $c0000025;
137 EXCEPTION_NONCONTINUABLE
= $1;
138 EXCEPTION_STACK_OVERFLOW
= $c00000fd;
139 EXCEPTION_INVALID_DISPOSITION
= $c0000026;
140 EXCEPTION_ILLEGAL_INSTRUCTION
= $C000001D;
141 EXCEPTION_IN_PAGE_ERROR
= $C0000006;
143 EXCEPTION_EXECUTE_HANDLER
= 1;
144 EXCEPTION_CONTINUE_EXECUTION
= -(1);
145 EXCEPTION_CONTINUE_SEARCH
= 0;
148 { type of functions that should be used
for exception handling
}
149 LPTOP_LEVEL_EXCEPTION_FILTER
= function(excep
:PEXCEPTION_POINTERS) : longint
;stdcall
;
151 function
SetUnhandledExceptionFilter(lpTopLevelExceptionFilter
: LPTOP_LEVEL_EXCEPTION_FILTER
)
152 : LPTOP_LEVEL_EXCEPTION_FILTER
;
153 external
'kernel32' name
'SetUnhandledExceptionFilter';
156 signal_list
: Array
[SIGABRT
..SIGMAX
] of SignalHandler
;
158 { value of the stack segment
159 to check
if the call stack can be written on exceptions
}
163 fpucw
: word
= $1332;
167 function
Signals_exception_handler(excep
:PEXCEPTION_POINTERS) : longint
;stdcall
;
168 var frame
,res
: longint
;
169 function
CallSignal(error
,frame
: longint
;must_reset_fpu
: boolean
) : longint
;
171 CallSignal
:=Exception_Continue_Search
;
173 if must_reset_fpu
then
179 if (error
>=SIGABRT
) and (error
<=SIGMAX
) and (signal_list
[error
]<>@SIG_DFL) then
180 res
:=signal_list
[error
](error
);
182 CallSignal
:=Exception_Continue_Execution
;
187 if excep^
.ContextRecord^
.SegSs
=_SS
then
188 frame
:=excep^
.ContextRecord^
.Ebp
192 { default
: unhandled
!}
193 res
:=Exception_Continue_Search
;
194 {$ifdef SYSTEMEXCEPTIONDEBUG
}
196 writeln(stderr,'Exception ',
197 hexstr(excep^
.ExceptionRecord^
.ExceptionCode
,8));
198 {$endif SYSTEMEXCEPTIONDEBUG
}
199 case excep^
.ExceptionRecord^
.ExceptionCode of
200 EXCEPTION_ACCESS_VIOLATION
:
201 res
:=CallSignal(SIGSEGV
,frame
,false);
202 { EXCEPTION_BREAKPOINT
= $80000003;
203 EXCEPTION_DATATYPE_MISALIGNMENT
= $80000002;
204 EXCEPTION_SINGLE_STEP
= $80000004; }
205 EXCEPTION_ARRAY_BOUNDS_EXCEEDED
:
206 res
:=CallSignal(SIGSEGV
,frame
,false);
207 EXCEPTION_FLT_DENORMAL_OPERAND
:
209 res
:=CallSignal(SIGFPE
,frame
,true);
211 EXCEPTION_FLT_DIVIDE_BY_ZERO
:
213 res
:=CallSignal(SIGFPE
,frame
,true);
214 {excep^
.ContextRecord^
.FloatSave
.StatusWord
:=excep^
.ContextRecord^
.FloatSave
.StatusWord
and $ffffff00;}
216 {EXCEPTION_FLT_INEXACT_RESULT
= $c000008f; }
217 EXCEPTION_FLT_INVALID_OPERATION
:
219 res
:=CallSignal(SIGFPE
,frame
,true);
221 EXCEPTION_FLT_OVERFLOW
:
223 res
:=CallSignal(SIGFPE
,frame
,true);
225 EXCEPTION_FLT_STACK_CHECK
:
227 res
:=CallSignal(SIGFPE
,frame
,true);
229 EXCEPTION_FLT_UNDERFLOW
:
231 res
:=CallSignal(SIGFPE
,frame
,true); { should be accepted as zero
!! }
233 EXCEPTION_INT_DIVIDE_BY_ZERO
:
234 res
:=CallSignal(SIGFPE
,frame
,false);
235 EXCEPTION_INT_OVERFLOW
:
236 res
:=CallSignal(SIGFPE
,frame
,false);
237 {EXCEPTION_INVALID_HANDLE
= $c0000008;
238 EXCEPTION_PRIV_INSTRUCTION
= $c0000096;
239 EXCEPTION_NONCONTINUABLE_EXCEPTION
= $c0000025;
240 EXCEPTION_NONCONTINUABLE
= $1;}
241 EXCEPTION_STACK_OVERFLOW
:
242 res
:=CallSignal(SIGSEGV
,frame
,false);
243 {EXCEPTION_INVALID_DISPOSITION
= $c0000026;}
244 EXCEPTION_ILLEGAL_INSTRUCTION
,
245 EXCEPTION_PRIV_INSTRUCTION
,
246 EXCEPTION_IN_PAGE_ERROR
,
247 EXCEPTION_SINGLE_STEP
: res
:=CallSignal(SIGSEGV
,frame
,false);
249 Signals_exception_handler
:=res
;
253 procedure install_exception_handler
;
254 {$ifdef SYSTEMEXCEPTIONDEBUG
}
256 oldexceptaddr
,newexceptaddr
: longint
;
257 {$endif SYSTEMEXCEPTIONDEBUG
}
259 {$ifdef SYSTEMEXCEPTIONDEBUG
}
263 movl
%eax
,oldexceptaddr
265 {$endif SYSTEMEXCEPTIONDEBUG
}
266 SetUnhandledExceptionFilter(@Signals_exception_handler);
267 {$ifdef SYSTEMEXCEPTIONDEBUG
}
271 movl
%eax
,newexceptaddr
274 writeln(stderr,'Old exception ',hexstr(oldexceptaddr
,8),
275 ' new exception ',hexstr(newexceptaddr
,8));
276 {$endif SYSTEMEXCEPTIONDEBUG
}
279 procedure remove_exception_handler
;
281 SetUnhandledExceptionFilter(nil);
285 function
SIG_ERR(x
:longint):longint;
291 function
SIG_IGN(x
:longint):longint;
297 function
SIG_DFL(x
:longint):longint;
302 function
signal(sig
: longint
;func
: SignalHandler
) : SignalHandler
;
304 temp
: SignalHandler
;
306 if ((sig
< SIGABRT
) or (sig
> SIGMAX
) or (sig
= SIGKILL
)) then
311 temp
:= signal_list
[sig
];
312 signal_list
[sig
] := func
;
329 for i
:=SIGABRT to SIGMAX
do
330 signal_list
[i
]:=@SIG_DFL;
331 install_exception_handler
;
335 remove_exception_handler
;