From a63fa3518f79b86db34d0c4a0d13c93f64a1a8e9 Mon Sep 17 00:00:00 2001 From: pierre Date: Sun, 24 Dec 2006 01:26:47 +0000 Subject: [PATCH] * try to correct the code for regcall convention. * signal handlers need to have cdecl modifier to be compatible with djgpp C code. git-svn-id: trunk@5694 - --- rtl/go32v2/dpmiexcp.pp | 97 ++++++++++++++++++++++++++++-------------- rtl/go32v2/emu387.pp | 2 +- rtl/go32v2/profile.pp | 4 +- 3 files changed, 68 insertions(+), 35 deletions(-) diff --git a/rtl/go32v2/dpmiexcp.pp b/rtl/go32v2/dpmiexcp.pp index 69eada3529..e4ae3fc314 100644 --- a/rtl/go32v2/dpmiexcp.pp +++ b/rtl/go32v2/dpmiexcp.pp @@ -109,31 +109,31 @@ const SIG_SETMASK = 2; SIG_UNBLOCK = 3; -function SIG_DFL( x: longint) : longint; +function SIG_DFL( x: longint) : longint;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} {$ifndef CREATE_C_FUNCTIONS} -external name '___djgpp_SIG_DFL'; +external name '__djgpp_SIG_DFL'; {$endif CREATE_C_FUNCTIONS} -function SIG_ERR( x: longint) : longint; +function SIG_ERR( x: longint) : longint;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} {$ifndef CREATE_C_FUNCTIONS} -external name '___djgpp_SIG_ERR'; +external name '__djgpp_SIG_ERR'; {$endif CREATE_C_FUNCTIONS} -function SIG_IGN( x: longint) : longint; +function SIG_IGN( x: longint) : longint;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} {$ifndef CREATE_C_FUNCTIONS} -external name '___djgpp_SIG_IGN'; +external name '__djgpp_SIG_IGN'; {$endif CREATE_C_FUNCTIONS} type - SignalHandler = function (v : longint) : longint; + SignalHandler = function (v : longint) : longint;cdecl; PSignalHandler = ^SignalHandler; { to be compatible with linux.pp } -function signal(sig : longint;func : SignalHandler) : SignalHandler; +function signal(sig : longint;func : SignalHandler) : SignalHandler;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} -function _raise(sig : longint) : longint; +function _raise(sig : longint) : longint;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} { Exceptions } @@ -149,13 +149,13 @@ type __fpu_state : array [0..108-1] of byte; { for future use } end; -procedure djgpp_exception_toggle; +procedure djgpp_exception_toggle;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} {$ifndef CREATE_C_FUNCTIONS} external name '___djgpp_exception_toggle'; {$endif CREATE_C_FUNCTIONS} -procedure djgpp_exception_setup; +procedure djgpp_exception_setup;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} {$ifndef CREATE_C_FUNCTIONS} external name '___djgpp_exception_setup'; @@ -164,11 +164,11 @@ external name '___djgpp_exception_setup'; function djgpp_exception_state : pexception_state; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} -function djgpp_set_ctrl_c(enable : boolean) : boolean; +function djgpp_set_ctrl_c(enable : boolean) : boolean;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} { Other } -function dpmi_set_coprocessor_emulation(flag : longint) : longint; +function dpmi_set_coprocessor_emulation(flag : longint) : longint;cdecl; {$ifdef IN_SYSTEM}forward;{$endif IN_SYSTEM} function __djgpp_set_sigint_key(new_key : longint) : longint;cdecl; @@ -499,8 +499,9 @@ end; ****************************************************************************} {$ifdef CREATE_C_FUNCTIONS} -function c_setjmp(var rec : dpmi_jmp_buf) : longint;[public, alias : '_setjmp']; +function c_setjmp(var rec : dpmi_jmp_buf) : longint;cdecl;[public, alias : '_setjmp']; begin +{$ifndef REGCALL} { here we need to be subtle : - we need to return with the arg still on the stack - but we also need to jmp to FPC_setjmp and not to call it @@ -520,6 +521,27 @@ function c_setjmp(var rec : dpmi_jmp_buf) : longint;[public, alias : '_setjmp']; popl %eax jmp dpmi_setjmp end; +{$ELSE REGCALL} + { this is easier with regcall convention + because dpmi_setjmp expects rec arg in $eax } + asm + movl rec,%eax + movl %ebp,%esp + popl %ebp + pushl %eax + { stack is now: + (%esp): saved eax + 4(%esp): return addr + 8(%esp): rec addr + we need just + (%esp): return addr } + movl 4(%esp),%eax + movl %eax,8(%esp) + popl %eax + addl $4,%esp + jmp dpmi_setjmp + end; +{$ENDIF REGCALL} end; {$endif CREATE_C_FUNCTIONS} @@ -535,16 +557,27 @@ begin movl %ecx,8(%edi) movl %edx,12(%edi) movl %esi,16(%edi) +{$ifndef REGCALL} { load edi } movl -4(%ebp),%eax +{$ELSE REGCALL} + { load edi } + movl (%esp),%eax +{$ENDIF REGCALL} { ... and store it } movl %eax,20(%edi) { ebp ... } movl (%ebp),%eax movl %eax,24(%edi) +{$ifndef REGCALL} { esp ... } movl %esp,%eax addl $12,%eax +{$ELSE REGCALL} + { for esp, use ebp ... } + movl %ebp,%eax + addl $8,%eax +{$ENDIF REGCALL} movl %eax,28(%edi) { the return address } movl 4(%ebp),%eax @@ -577,7 +610,7 @@ end; {$ifdef CREATE_C_FUNCTIONS} -procedure c_longjmp(var rec : dpmi_jmp_buf;return_value : longint);[public, alias : '_longjmp']; +procedure c_longjmp(var rec : dpmi_jmp_buf;return_value : longint);cdecl;[public, alias : '_longjmp']; begin dpmi_longjmp(rec,return_value); { never gets here !! so pascal stack convention is no problem } @@ -650,25 +683,25 @@ var {$ifndef CREATE_C_FUNCTIONS}external;{$else}public;{$endif} {$ifdef CREATE_C_FUNCTIONS} -function SIG_ERR(x:longint):longint;[public,alias : '___djgpp_SIG_ERR']; +function SIG_ERR(x:longint):longint;cdecl;[public,alias : '___djgpp_SIG_ERR']; begin SIG_ERR:=-1; end; -function SIG_IGN(x:longint):longint;[public,alias : '___djgpp_SIG_IGN']; +function SIG_IGN(x:longint):longint;cdecl;[public,alias : '___djgpp_SIG_IGN']; begin SIG_IGN:=-1; end; -function SIG_DFL(x:longint):longint;[public,alias : '___djgpp_SIG_DFL']; +function SIG_DFL(x:longint):longint;cdecl;[public,alias : '___djgpp_SIG_DFL']; begin SIG_DFL:=0; end; {$endif CREATE_C_FUNCTIONS} -function signal(sig : longint;func : SignalHandler) : SignalHandler; +function signal(sig : longint;func : SignalHandler) : SignalHandler;cdecl; var temp : SignalHandler; begin @@ -715,7 +748,7 @@ begin errln(''); end; -function _raise(sig : longint) : longint; +function _raise(sig : longint) : longint;cdecl; var temp : SignalHandler; begin @@ -1011,7 +1044,7 @@ end; var _os_trueversion : word;external name '__os_trueversion'; -procedure djgpp_exception_processor;[public,alias : '___djgpp_exception_processor']; +procedure djgpp_exception_processor;cdecl;[public,alias : '___djgpp_exception_processor']; var sig : longint; begin @@ -1073,7 +1106,7 @@ var v2prt0_exceptions_on : longbool;external name '_v2prt0_exceptions_on'; -procedure djgpp_exception_toggle; +procedure djgpp_exception_toggle;cdecl; [public,alias : '___djgpp_exception_toggle']; var _except : tseginfo; @@ -1163,7 +1196,7 @@ begin end; {$endif CREATE_C_FUNCTIONS} -function dpmi_set_coprocessor_emulation(flag : longint) : longint; +function dpmi_set_coprocessor_emulation(flag : longint) : longint;cdecl; var res : longint; begin @@ -1191,7 +1224,7 @@ var const STUBINFO_END = $54; -procedure __maybe_fix_w2k_ntvdm_bug;[public,alias : '___maybe_fix_w2k_ntvdm_bug']; +procedure __maybe_fix_w2k_ntvdm_bug;cdecl;[public,alias : '___maybe_fix_w2k_ntvdm_bug']; var psp_sel : word; begin @@ -1223,13 +1256,13 @@ begin end; -procedure dpmiexcp_exit{(status : longint)};[public,alias : 'excep_exit']; +procedure dpmiexcp_exit{(status : longint)};cdecl;[public,alias : 'excep_exit']; { We need to restore hardware interrupt handlers even if somebody calls `_exit' directly, or else we crash the machine in nested programs. We only toggle the handlers if the original keyboard handler is intact (otherwise, they might have already toggled them). } begin -{ +(* void __maybe_fix_w2k_ntvdm_bug(void) if (_osmajor == 5 && _get_dos_version(1) == 0x532) /* Windows NT, 2000 or XP? */ { @@ -1251,7 +1284,7 @@ void __maybe_fix_w2k_ntvdm_bug(void) : "g" (_stubinfo->psp_selector) /* input */ : "ax", "bx" ); /* regs */ } -} +*) if (exceptions_on) then djgpp_exception_toggle; _exception_exit:=nil; @@ -1266,14 +1299,14 @@ end; is already present in v2prt0.as PM} { used by dos.pp for swap vectors } -procedure dpmi_swap_in;[public,alias : 'swap_in']; +procedure dpmi_swap_in;cdecl;[public,alias : 'swap_in']; begin if not (exceptions_on) then djgpp_exception_toggle; end; -procedure dpmi_swap_out;[public,alias : 'swap_out']; +procedure dpmi_swap_out;cdecl;[public,alias : 'swap_out']; begin if (exceptions_on) then djgpp_exception_toggle; @@ -1391,7 +1424,7 @@ begin end; -procedure djgpp_exception_setup; +procedure djgpp_exception_setup;cdecl; [public,alias : '___djgpp_exception_setup']; var temp_kbd, @@ -1465,7 +1498,7 @@ end; {$endif CREATE_C_FUNCTIONS} -function djgpp_set_ctrl_c(enable : boolean) : boolean; +function djgpp_set_ctrl_c(enable : boolean) : boolean;cdecl; begin djgpp_set_ctrl_c:=(djgpp_hwint_flags and 1)=0; if enable then @@ -1517,7 +1550,7 @@ end. {$else IN_SYSTEM} const FPU_ControlWord : word = $1332; -function HandleException(sig : longint) : longint; +function HandleException(sig : longint) : longint;cdecl; var truesig : longint; ErrorOfSig : longint; diff --git a/rtl/go32v2/emu387.pp b/rtl/go32v2/emu387.pp index a24c20ea49..905d94dbfd 100644 --- a/rtl/go32v2/emu387.pp +++ b/rtl/go32v2/emu387.pp @@ -67,7 +67,7 @@ begin end; -function nofpsig( sig : longint) : longint; +function nofpsig( sig : longint) : longint;cdecl; const last_eip : longint = 0; var diff --git a/rtl/go32v2/profile.pp b/rtl/go32v2/profile.pp index 506449fae8..45d4116844 100644 --- a/rtl/go32v2/profile.pp +++ b/rtl/go32v2/profile.pp @@ -195,7 +195,7 @@ var doublecall, reload : longint; {=0} -function mcount_tick(x : longint) : longint; +function mcount_tick(x : longint) : longint;cdecl; var bin : longint; begin @@ -220,7 +220,7 @@ end; var ___djgpp_timer_countdown:longint;external name '___djgpp_timer_countdown'; -function timer(x : longint) : longint; +function timer(x : longint) : longint;cdecl; begin if reload>0 then ___djgpp_timer_countdown:=RELOAD;