diff --git a/rtl/openbsd/i386/prt0.as b/rtl/openbsd/i386/prt0.as index 64fbb4097c..16e652c1a9 100644 --- a/rtl/openbsd/i386/prt0.as +++ b/rtl/openbsd/i386/prt0.as @@ -42,15 +42,16 @@ ___fpc_brk_addr: .globl _start _start: __start: - pushl %ebx #ps_strings - pushl %ecx # obj - pushl %edx # cleanup - movl 12(%esp),%eax - leal 20(%esp,%eax,4),%ecx - leal 16(%esp),%edx + movl %esp,%ebp + andl $~15,%esp + pushl %edx + movl 0(%ebp),%eax + leal 8(%ebp,%eax,4),%ecx + leal 4(%ebp),%edx pushl %ecx pushl %edx pushl %eax + xorl %ebp,%ebp call ___start #NO_APP diff --git a/rtl/openbsd/i386/si_c.inc b/rtl/openbsd/i386/si_c.inc index cc9bc89da3..abdeb5d0d6 100644 --- a/rtl/openbsd/i386/si_c.inc +++ b/rtl/openbsd/i386/si_c.inc @@ -19,25 +19,26 @@ procedure __init; cdecl; external name '__init'; procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit'; -procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; forward; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; forward; procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start'; asm - pushl %ebx { ps_strings } - pushl %ecx { obj } - pushl %edx { cleanup } - movl 12(%esp),%eax - leal 20(%esp,%eax,4),%ecx - leal 16(%esp),%edx + movl %esp,%ebp + andl $0xFFFFFFF0,%esp + pushl %edx + movl 0(%ebp),%eax + leal 8(%ebp,%eax,4),%ecx + leal 4(%ebp),%edx pushl %ecx pushl %edx pushl %eax + xorl %ebp,%ebp call _FPC_proc___start end; function _strrchr(str: PChar; character: LongInt): PChar; forward; -procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; var I: SizeUInt; begin diff --git a/rtl/openbsd/i386/si_g.inc b/rtl/openbsd/i386/si_g.inc index 15436feffa..d09b84421b 100644 --- a/rtl/openbsd/i386/si_g.inc +++ b/rtl/openbsd/i386/si_g.inc @@ -26,25 +26,26 @@ procedure _monstartup(lowpc, highpc: u_long); cdecl; external name '_monstartup' procedure __init; cdecl; external name '__init'; procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit'; -procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; forward; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; forward; procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start'; asm - pushl %ebx { ps_strings } - pushl %ecx { obj } - pushl %edx { cleanup } - movl 12(%esp),%eax - leal 20(%esp,%eax,4),%ecx - leal 16(%esp),%edx + movl %esp,%ebp + andl $0xFFFFFFF0,%esp + pushl %edx + movl 0(%ebp),%eax + leal 8(%ebp,%eax,4),%ecx + leal 4(%ebp),%edx pushl %ecx pushl %edx pushl %eax + xorl %ebp,%ebp call _FPC_proc___start end; function _strrchr(str: PChar; character: LongInt): PChar; forward; -procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; var I: SizeUInt; begin diff --git a/rtl/openbsd/i386/si_prc.inc b/rtl/openbsd/i386/si_prc.inc index d0b8573571..2cfb873c75 100644 --- a/rtl/openbsd/i386/si_prc.inc +++ b/rtl/openbsd/i386/si_prc.inc @@ -16,26 +16,27 @@ {$asmmode att} -procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; forward; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; forward; procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start'; asm - pushl %ebx { ps_strings } - pushl %ecx { obj } - pushl %edx { cleanup } - movl 12(%esp),%eax - leal 20(%esp,%eax,4),%ecx - leal 16(%esp),%edx + movl %esp,%ebp + andl $0xFFFFFFF0,%esp + pushl %edx + movl 0(%ebp),%eax + leal 8(%ebp,%eax,4),%ecx + leal 4(%ebp),%edx pushl %ecx pushl %edx pushl %eax + xorl %ebp,%ebp call _FPC_proc___start end; procedure _FPC_proc_haltproc; cdecl; noreturn; forward; function _strrchr(str: PChar; character: LongInt): PChar; forward; -procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; var I: SizeUInt; begin