From 17a838e7daa526fdde0445adbf98524245883e5e Mon Sep 17 00:00:00 2001 From: pierre <pierre@freepascal.org> Date: Tue, 10 Nov 2009 22:39:13 +0000 Subject: [PATCH] + Add missing file for i386 solaris git-svn-id: trunk@14138 - --- .gitattributes | 1 + rtl/solaris/i386/sighndh.inc | 24 ++++++++ rtl/solaris/i386/start.inc | 105 +++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 rtl/solaris/i386/start.inc diff --git a/.gitattributes b/.gitattributes index 13e19963c4..a34ecb8dd4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7054,6 +7054,7 @@ rtl/solaris/errno.inc svneol=native#text/plain rtl/solaris/errnostr.inc svneol=native#text/plain rtl/solaris/i386/sighnd.inc svneol=native#text/plain rtl/solaris/i386/sighndh.inc svneol=native#text/plain +rtl/solaris/i386/start.inc -text svneol=unset#test/plain rtl/solaris/osdefs.inc svneol=native#text/plain rtl/solaris/osmacro.inc svneol=native#text/plain rtl/solaris/ostypes.inc svneol=native#text/plain diff --git a/rtl/solaris/i386/sighndh.inc b/rtl/solaris/i386/sighndh.inc index e8a498aa9e..1e05357798 100644 --- a/rtl/solaris/i386/sighndh.inc +++ b/rtl/solaris/i386/sighndh.inc @@ -19,6 +19,30 @@ type PSigContext = ^TSigContext; TSigContext = record + { WARNING: this is a blind copy of + the linux strcuture, probably totally wrong PM } + gs, __gsh: word; + fs, __fsh: word; + es, __esh: word; + ds, __dsh: word; + edi: cardinal; + esi: cardinal; + ebp: cardinal; + esp: cardinal; + ebx: cardinal; + edx: cardinal; + ecx: cardinal; + eax: cardinal; + trapno: cardinal; + err: cardinal; + eip: cardinal; + cs, __csh: word; + eflags: cardinal; + esp_at_signal: cardinal; + ss, __ssh: word; + // commented out for now : fpstate: pfpstate; + oldmask: cardinal; + cr2: cardinal; end; diff --git a/rtl/solaris/i386/start.inc b/rtl/solaris/i386/start.inc new file mode 100644 index 0000000000..c50cc344c4 --- /dev/null +++ b/rtl/solaris/i386/start.inc @@ -0,0 +1,105 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 2009 by Pierre Muller, + member of the Free Pascal development team. + + Program startup + Adapted from code generated by gcc on opensolaris 2.11 + and sparc version in + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + + +type + TCdeclProcedure = procedure; cdecl; +function atexit(proc:TCdeclProcedure):longint;cdecl;external 'c' name 'atexit'{ @plt }; +procedure C_exit;cdecl;external 'c' name 'exit'; +procedure _exit;cdecl;external 'c' name '_exit'; +//procedure _fini;cdecl;external 'c' name '_fini'; +//procedure __fpstart;cdecl;external 'c' name '__fpstart'{ @plt }; +//procedure __fsr;cdecl;external 'c' name '__fsr'; +//procedure _init;cdecl;external 'c' name '_init'; +procedure PascalMain;cdecl;external name 'PASCALMAIN'; + + +{vars are not correctly transformed :( +var + _DYNAMIC : longint; cvar; external; + __Argv : pointer; cvar; external; + environ : pointer; cvar; external; + __get_exit_frame_monitor_ptr : pointer; cvar; external; + __do_exit_code_ptr : pointer; cvar; external; +} +procedure _DYNAMIC;cdecl;external 'c' name '_DYNAMIC'; { should be weak } +procedure __Argv;cdecl;external 'c' name '__Argv'; +procedure environ;cdecl;external 'c' name 'environ'; +//procedure __get_exit_frame_monitor_ptr;cdecl;external 'c' name '__get_exit_frame_monitor_ptr'; +//procedure __do_exit_code_ptr;cdecl;external 'c' name '__do_exit_code_ptr'; + +{ +(top-gdb) disas _start +Dump of assembler code for function _start: } +procedure _start;assembler;nostackframe;public name '_start'; +asm + pushl $0x0 + pushl $0x0 + mov %esp,%ebp + mov $_DYNAMIC,%eax + test %eax,%eax + je .Label1 + push %edx + call atexit {@plt} + add $0x4,%esp +.Label1: + (* + push _fini + call atexit {@plt} + add $0x4,%esp + lea __get_exit_frame_monitor_ptr,%eax + mov (%eax),%eax + test %eax,%eax + je .Label2 + lea __do_exit_code_ptr,%eax + mov (%eax),%eax + test %eax,%eax + je .Label2 + push %eax + call atexit {@plt} + add $0x4,%esp + *) +.Label2: + mov 0x8(%ebp),%eax + mov %eax,argc + mov environ,%edx + test %edx,%edx + jne .Label3 + lea 0x10(%ebp,%eax,4),%edx +.Label3: + movl %edx,environ + movl %edx,envp + and $0xfffffff0,%esp + push %edx + lea 0xc(%ebp),%edx + mov %edx,argv + push %edx + push %eax + //call __fpstart {@plt} + //call __fsr + //call _init + call PASCALMAIN {was <main> } + add $0xc,%esp + push %eax + push %eax + call C_exit { was exit@plt } + add $0x4,%esp + call _exit {@plt} + add $0x4,%esp + hlt +end;