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 115