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;