]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/gcc/config/sparc/sol2-c1.asm
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / gcc / config / sparc / sol2-c1.asm
1 ! crt1.s for sparc & sparcv9 (SunOS 5)
2
3 !   Copyright (C) 1992 Free Software Foundation, Inc.
4 !   Written By David Vinayak Henkel-Wallace, June 1992
5
6 ! This file is free software; you can redistribute it and/or modify it
7 ! under the terms of the GNU General Public License as published by the
8 ! Free Software Foundation; either version 2, or (at your option) any
9 ! later version.
10
11 ! In addition to the permissions in the GNU General Public License, the
12 ! Free Software Foundation gives you unlimited permission to link the
13 ! compiled version of this file with other programs, and to distribute
14 ! those programs without any restriction coming from the use of this
15 ! file.  (The General Public License restrictions do apply in other
16 ! respects; for example, they cover modification of the file, and
17 ! distribution when not linked into another program.)
18
19 ! This file is distributed in the hope that it will be useful, but
20 ! WITHOUT ANY WARRANTY; without even the implied warranty of
21 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22 ! General Public License for more details.
23
24 ! You should have received a copy of the GNU General Public License
25 ! along with this program; see the file COPYING.  If not, write to
26 ! the Free Software Foundation, 51 Franklin Street, Fifth Floor,
27 ! Boston, MA 02110-1301, USA.
28
29 !    As a special exception, if you link this library with files
30 !    compiled with GCC to produce an executable, this does not cause
31 !    the resulting executable to be covered by the GNU General Public License.
32 !    This exception does not however invalidate any other reasons why
33 !    the executable file might be covered by the GNU General Public License.
34
35
36 ! This file takes control of the process from the kernel, as specified
37 ! in section 3 of the SVr4 ABI.
38 ! This file is the first thing linked into any executable.
39
40 #ifdef __sparcv9
41 #define CPTRSIZE        8
42 #define CPTRSHIFT       3
43 #define STACK_BIAS      2047
44 #define ldn             ldx
45 #define stn             stx
46 #define setn(s, scratch, dst)   setx s, scratch, dst
47 #else
48 #define CPTRSIZE        4
49 #define CPTRSHIFT       2
50 #define STACK_BIAS      0
51 #define ldn             ld
52 #define stn             st
53 #define setn(s, scratch, dst)   set s, dst
54 #endif
55
56         .section        ".text"
57         .proc   022
58         .global _start
59
60 _start:
61         mov     0, %fp          ! Mark bottom frame pointer
62         ldn     [%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0       ! argc
63         add     %sp, (17 * CPTRSIZE) + STACK_BIAS, %l1          ! argv
64
65         ! Leave some room for a call.  Sun leaves 32 octets (to sit on
66         ! a cache line?) so we do too.
67 #ifdef __sparcv9
68         sub     %sp, 48, %sp
69 #else
70         sub     %sp, 32, %sp
71 #endif
72
73         ! %g1 may contain a function to be registered w/atexit
74         orcc    %g0, %g1, %g0
75 #ifdef __sparcv9
76         be      %xcc, .nope
77 #else
78         be      .nope
79 #endif
80         mov     %g1, %o0
81         call    atexit
82         nop   
83 .nope:
84         ! Now make sure constructors and destructors are handled.
85         setn(_fini, %o1, %o0)
86         call    atexit, 1
87         nop
88         call    _init, 0
89         nop
90
91         ! We ignore the auxiliary vector; there is no defined way to
92         ! access those data anyway.  Instead, go straight to main:
93         mov     %l0, %o0        ! argc
94         mov     %l1, %o1        ! argv
95 #ifdef GCRT1
96         setn(___Argv, %o4, %o3)
97         stn     %o1, [%o3]      ! *___Argv
98 #endif
99         ! Skip argc words past argv, to env:
100         sll     %l0, CPTRSHIFT, %o2
101         add     %o2, CPTRSIZE, %o2
102         add     %l1, %o2, %o2   ! env
103         setn(_environ, %o4, %o3)
104         stn     %o2, [%o3]      ! *_environ
105         call    main, 4
106         nop   
107         call    exit, 0
108         nop   
109         call    _exit, 0
110         nop   
111         ! We should never get here.
112
113         .type   _start,#function
114         .size   _start,.-_start