dpmiexcp.pp

This commit is contained in:
pierre 1998-12-21 14:23:12 +00:00
parent 2cd191a9bc
commit f8165b303b

View File

@ -35,11 +35,15 @@ function do_faulting_finish_message : integer;
{ SetJmp/LongJmp }
type
{ must also contain exception_state !! }
pdpmi_jmp_buf = ^dpmi_jmp_buf;
dpmi_jmp_buf = packed record
eax,ebx,ecx,edx,esi,edi,ebp,esp,eip,flags : longint;
cs,ds,es,fs,gs,ss : word;
sigmask : longint; { for POSIX signals only }
signum : longint; { for expansion ie 386 exception number }
exception_ptr : pdpmi_jmp_buf; { pointer to previous exception if exists }
end;
pdpmi_jmp_buf = ^dpmi_jmp_buf;
function dpmi_setjmp(var rec : dpmi_jmp_buf) : longint;
procedure dpmi_longjmp(var rec : dpmi_jmp_buf;return_value : longint);
@ -81,16 +85,16 @@ function _raise(sig : longint) : longint;
{ Exceptions }
type
pexception_state = ^texception_state;
texception_state = record
__eax, __ebx, __ecx, __edx, __esi : longint;
__edi, __ebp, __esp, __eip, __eflags : longint;
__cs, __ds, __es, __fs, __gs, __ss : word;
__sigmask : longint; { for POSIX signals only }
__signum : longint; { for expansion }
__exception_ptr : longint; { pointer to previous exception }
__exception_ptr : pexception_state; { pointer to previous exception }
__fpu_state : array [0..108-1] of byte; { for future use }
end;
pexception_state = ^texception_state;
procedure djgpp_exception_toggle;
procedure djgpp_exception_setup;
@ -129,6 +133,9 @@ procedure djgpp_cbrk_hdlr;external name '___djgpp_cbrk_hdlr';
var
exceptions_on : boolean;
old_int00 : tseginfo;cvar;external;
old_int75 : tseginfo;cvar;external;
const
cbrk_vect : byte = $1b;
exception_level : longint = 0;
@ -162,6 +169,11 @@ end;
SetJmp/LongJmp
****************************************************************************}
{ function c_setjmp(var rec : dpmi_jmp_buf) : longint;cdecl;[public, alias : '_setjmp'];
begin
c_setjmp:=dpmi_setjmp(rec);
end; }
function dpmi_setjmp(var rec : dpmi_jmp_buf) : longint;
begin
asm
@ -204,12 +216,19 @@ begin
pop %edi
{ we come from the initial call }
xorl %eax,%eax
leave
ret $4
movl %eax,__RESULT
{ leave USING RET inside CDECL functions is risky as
some registers are pushed at entry
ret $4 not anymore since cdecl !! }
end;
end;
{procedure c_longjmp(var rec : dpmi_jmp_buf;return_value : longint);cdecl;[public, alias : '_longjmp'];
begin
dpmi_longjmp(rec,return_value);
end; }
procedure dpmi_longjmp(var rec : dpmi_jmp_buf;return_value : longint);
begin
if (@rec=pdpmi_jmp_buf(djgpp_exception_state)) and (exception_level>0) then
@ -396,7 +415,7 @@ begin
end;
procedure show_call_frame;
procedure show_call_frame(djgpp_exception_state : pexception_state);
begin
errln('Call frame traceback EIPs:');
errln(' 0x'+hexstr(djgpp_exception_state^.__eip, 8));
@ -545,7 +564,23 @@ begin
dump_selector('ss', djgpp_exception_state^.__ss);
errln('');
if (djgpp_exception_state^.__cs = get_cs) then
show_call_frame;
show_call_frame(djgpp_exception_state)
{$ifdef SYSTEMDEBUG}
else
errln('Exception occured in another context');
{$endif def SYSTEMDEBUG}
;
if assigned(djgpp_exception_state^.__exception_ptr) then
if (djgpp_exception_state^.__exception_ptr^.__cs = get_cs) then
begin
Errln('First exception level stack');
show_call_frame(djgpp_exception_state^.__exception_ptr);
end
{$ifdef SYSTEMDEBUG}
else
errln('First exception occured in another context');
{$endif def SYSTEMDEBUG}
;
{ must not return !! }
if exceptions_on then
djgpp_exception_toggle;
@ -566,8 +601,13 @@ procedure djgpp_exception_processor;[public,alias : '___djgpp_exception_processo
var
sig : longint;
begin
inc(exception_level);
if not assigned(djgpp_exception_state^.__exception_ptr) then
exception_level:=1
else
inc(exception_level);
sig:=djgpp_exception_state^.__signum;
if (exception_level=1) or (sig=$78) then
begin
sig := except_to_sig(sig);
@ -605,6 +645,9 @@ type
pseginfo = ^tseginfo;
var
except_ori : array [0..EXCEPTIONCOUNT-1] of tseginfo;
{$ifdef SYSTEMDEBUG}
export name '_ori_exceptions';
{$endif def SYSTEMDEBUG}
kbd_ori : tseginfo;
npx_ori : tseginfo;
cbrk_ori,
@ -833,7 +876,10 @@ begin
end.
{
$Log$
Revision 1.1 1998-12-21 13:07:02 peter
Revision 1.2 1998-12-21 14:23:12 pierre
dpmiexcp.pp
Revision 1.1 1998/12/21 13:07:02 peter
* use -FE
Revision 1.11 1998/11/17 09:42:50 pierre