Browse Source

- revert r22045: applied changes to wrong files, i.e. linux system files, instead of android ones

git-svn-id: branches/targetandroid@22047 -
tom_at_work 13 years ago
parent
commit
19238eafde
5 changed files with 280 additions and 10 deletions
  1. 2 0
      .gitattributes
  2. 4 7
      rtl/android/arm/cprt0.as
  3. 9 3
      rtl/linux/i386/cprt0.as
  4. 126 0
      rtl/linux/i386/cprt21.as
  5. 139 0
      rtl/linux/i386/gprt21.as

+ 2 - 0
.gitattributes

@@ -7713,8 +7713,10 @@ rtl/linux/fpmake.inc svneol=native#text/plain
 rtl/linux/gpm.pp svneol=native#text/plain
 rtl/linux/i386/bsyscall.inc svneol=native#text/plain
 rtl/linux/i386/cprt0.as svneol=native#text/plain
+rtl/linux/i386/cprt21.as svneol=native#text/plain
 rtl/linux/i386/dllprt0.as svneol=native#text/plain
 rtl/linux/i386/gprt0.as svneol=native#text/plain
+rtl/linux/i386/gprt21.as svneol=native#text/plain
 rtl/linux/i386/prt0.as svneol=native#text/plain
 rtl/linux/i386/si_c.inc svneol=native#text/plain
 rtl/linux/i386/si_c21.inc svneol=native#text/plain

+ 4 - 7
rtl/android/arm/cprt0.as

@@ -67,8 +67,7 @@ _start:
         str sp,[ip]
 
         /* Fetch address of fini */
-        /*fixme: ldr ip, =_fini */
-        mov ip, #0
+        ldr ip, =_fini
 
         /* argc already loaded to a2*/
 
@@ -83,17 +82,15 @@ _start:
 
         /* Set up the other arguments in registers */
         ldr a1, =PASCALMAIN
-        /* fixme: init ldr a4, =_init */
-        mov a4, #0
+        ldr a4, =_init
 
         /* Push fini */
         str ip, [sp, #-4]!
 
-        /* check that this is the correct function! */
-        /* __libc_init (main, argc, argv, init, fini, rtld_fini, stack_end) */
+        /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
 
         /* Let the libc call main and exit with its return code.  */
-        bl __libc_init
+        bl __libc_start_main
 
         /* should never get here....*/
         bl abort

+ 9 - 3
rtl/linux/i386/cprt0.as

@@ -47,15 +47,21 @@ _start:
         movl    %ecx,operatingsystem_parameter_argc    /* Move the argument counter    */
         movl    %ebx,operatingsystem_parameter_argv    /* Move the argument pointer    */
 
-        /* no libc __environ */
+        movl    %eax,__environ          /* libc environ */
 
         pushl   %eax
         pushl   %ebx
         pushl   %ecx
 
         call    __libc_init             /* init libc */
-        pushl   $0                      /* the onexit() function is always nil with bionic */
-        call    __cxa_finalize
+        movzwl  __fpu_control,%eax
+        pushl   %eax
+        call    __setfpucw
+        popl    %eax
+        pushl   $_fini
+        call    atexit
+        popl    %eax
+        call    _init
 
         popl    %eax
         popl    %eax

+ 126 - 0
rtl/linux/i386/cprt21.as

@@ -0,0 +1,126 @@
+#
+#   This file is part of the Free Pascal run time library.
+#   Copyright (c) 1999-2000 by Michael Van Canneyt and Peter Vreman
+#   members of the Free Pascal development team.
+#
+#   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.
+#
+#**********************************************************************}
+#
+# Linux ELF startup code for Free Pascal
+#
+# Stack layout at program start:
+#
+#         nil
+#         envn
+#         ....
+#         ....           ENVIRONMENT VARIABLES
+#         env1
+#         env0
+#         nil
+#         argn
+#         ....
+#         ....           COMMAND LINE OPTIONS
+#         arg1
+#         arg0
+#         argc <--- esp
+#
+
+        .file   "prt1.as"
+        .text
+        .globl  _start
+        .type   _start,@function
+_start:
+        /* First locate the start of the environment variables */
+
+        popl    %esi
+        movl    %eax,%edi
+
+        movl    %esp,%ebx               /* Points to the arguments */
+        movl    %esi,%eax
+        incl    %eax
+        shll    $2,%eax
+        addl    %esp,%eax
+        andl    $0xfffffff8,%esp        /* Align stack */
+
+        movl    %eax,operatingsystem_parameter_envp    /* Move the environment pointer */
+        movl    %esi,operatingsystem_parameter_argc    /* Move the argument counter    */
+        movl    %ebx,operatingsystem_parameter_argv    /* Move the argument pointer    */
+
+        xorl    %ebp,%ebp
+        pushl   %edi
+        pushl   %esp
+        pushl   %edx
+        pushl   $_fini_dummy
+        pushl   $_init_dummy
+        pushl   %ebx
+        pushl   %esi
+        pushl   $main
+        call    __libc_start_main
+        hlt
+
+/* fake main routine which will be run from libc */
+main:
+        /* save return address */
+        popl    %eax
+        movl    %eax,___fpc_ret
+        movl    %ebx,___fpc_ret_ebx
+        movl    %ebp,___fpc_ret_ebp
+        pushl   %eax
+
+        /* Save initial stackpointer */
+        movl    %esp,__stkptr
+
+        /* start the program */
+        xorl    %ebp,%ebp
+        call    PASCALMAIN
+        hlt
+
+        .globl _haltproc
+        .type _haltproc,@function
+_haltproc:
+        movzwl    operatingsystem_result,%eax
+
+        movl    ___fpc_ret,%edx         /* return to libc */
+        movl    ___fpc_ret_ebp,%ebp
+        movl    ___fpc_ret_ebx,%ebx
+        push    %edx
+_init_dummy:
+_fini_dummy:
+        ret
+
+.data
+        .align  4
+
+___fpc_ret:                             /* return address to libc */
+        .long   0
+___fpc_ret_ebx:
+        .long   0
+___fpc_ret_ebp:
+        .long   0
+
+.bss
+        .type   __stkptr,@object
+        .size   __stkptr,4
+        .global __stkptr
+__stkptr:
+        .skip   4
+
+        .type operatingsystem_parameters,@object
+        .size operatingsystem_parameters,12
+operatingsystem_parameters:
+        .skip 3*4
+
+        .global operatingsystem_parameter_envp
+        .global operatingsystem_parameter_argc
+        .global operatingsystem_parameter_argv
+        .set operatingsystem_parameter_envp,operatingsystem_parameters+0
+        .set operatingsystem_parameter_argc,operatingsystem_parameters+4
+        .set operatingsystem_parameter_argv,operatingsystem_parameters+8
+
+.section .note.GNU-stack,"",%progbits

+ 139 - 0
rtl/linux/i386/gprt21.as

@@ -0,0 +1,139 @@
+#
+#   This file is part of the Free Pascal run time library.
+#   Copyright (c) 1999-2000 by Michael Van Canneyt and Peter Vreman
+#   members of the Free Pascal development team.
+#
+#   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.
+#
+#**********************************************************************}
+#
+# Linux ELF startup code for Free Pascal
+#
+
+        .file   "prt1.as"
+        .text
+        .globl  _start
+        .type   _start,@function
+_start:
+        /* First locate the start of the environment variables */
+        popl    %esi
+        movl    %eax,%edi
+
+        movl    %esp,%ebx               /* Points to the arguments */
+        movl    %esi,%eax
+        incl    %eax
+        shll    $2,%eax
+        addl    %esp,%eax
+        andl    $0xfffffff8,%esp        /* Align stack */
+
+        movl    %eax,operatingsystem_parameter_envp    /* Move the environment pointer */
+        movl    %esi,operatingsystem_parameter_argc    /* Move the argument counter    */
+        movl    %ebx,operatingsystem_parameter_argv    /* Move the argument pointer    */
+
+        movl    %edi,%eax
+        xorl    %ebp,%ebp
+        pushl   %eax
+        pushl   %esp
+        pushl   %edx
+        pushl   $_fini_dummy
+        pushl   $_init_dummy
+        pushl   %ebx
+        pushl   %esi
+        pushl   $cmain
+        call    __libc_start_main
+        hlt
+
+/* fake main routine which will be run from libc */
+cmain:
+        /* save return address */
+        popl    %eax
+        movl    %eax,___fpc_ret
+        movl    %ebx,___fpc_ret_ebx
+        movl    %esi,___fpc_ret_esi
+        movl    %edi,___fpc_ret_edi
+        pushl   %eax
+
+        call    __gmon_start__
+
+        /* Save initial stackpointer */
+        movl    %esp,__stkptr
+
+        /* start the program */
+        call    PASCALMAIN
+        hlt
+
+        .globl _haltproc
+        .type _haltproc,@function
+_haltproc:
+        movzwl    operatingsystem_result,%eax
+
+        movl    ___fpc_ret,%edx         /* return to libc */
+        movl    ___fpc_ret_ebx,%ebx
+        movl    ___fpc_ret_esi,%esi
+        movl    ___fpc_ret_edi,%edi
+        push    %edx
+_init_dummy:
+_fini_dummy:
+        ret
+
+        .globl  __gmon_start__
+        .type   __gmon_start__,@function
+__gmon_start__:
+        pushl   %ebp
+        movl    __monstarted,%eax
+        leal    0x1(%eax),%edx
+        movl    %esp,%ebp
+        movl    %edx,__monstarted
+        testl   %eax,%eax
+        jnz     .Lnomonstart
+        pushl   $etext                  /* Initialize gmon */
+        pushl   $_start
+        call    monstartup
+        addl    $8,%esp
+        pushl   $_mcleanup
+        call    atexit
+        addl    $4,%esp
+.Lnomonstart:
+        movl   %ebp,%esp
+        popl   %ebp
+        ret
+
+.data
+        .align  4
+
+___fpc_ret:                             /* return address to libc */
+        .long   0
+___fpc_ret_ebx:
+        .long   0
+___fpc_ret_esi:
+        .long   0
+___fpc_ret_edi:
+        .long   0
+
+.bss
+        .lcomm __monstarted,4
+
+        .type   __stkptr,@object
+        .size   __stkptr,4
+        .global __stkptr
+__stkptr:
+        .skip   4
+
+        .type operatingsystem_parameters,@object
+        .size operatingsystem_parameters,12
+operatingsystem_parameters:
+        .skip 3*4
+
+        .global operatingsystem_parameter_envp
+        .global operatingsystem_parameter_argc
+        .global operatingsystem_parameter_argv
+        .set operatingsystem_parameter_envp,operatingsystem_parameters+0
+        .set operatingsystem_parameter_argc,operatingsystem_parameters+4
+        .set operatingsystem_parameter_argv,operatingsystem_parameters+8
+
+.section .note.GNU-stack,"",%progbits