| ! crt1.s for sparc & sparcv9 (SunOS 5) |
| |
| ! Copyright (C) 1992-2021 Free Software Foundation, Inc. |
| ! Written By David Vinayak Henkel-Wallace, June 1992 |
| ! |
| ! This file is free software; you can redistribute it and/or modify it |
| ! under the terms of the GNU General Public License as published by the |
| ! Free Software Foundation; either version 3, or (at your option) any |
| ! later version. |
| ! |
| ! This file 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. See the GNU |
| ! General Public License for more details. |
| ! |
| ! Under Section 7 of GPL version 3, you are granted additional |
| ! permissions described in the GCC Runtime Library Exception, version |
| ! 3.1, as published by the Free Software Foundation. |
| ! |
| ! You should have received a copy of the GNU General Public License and |
| ! a copy of the GCC Runtime Library Exception along with this program; |
| ! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| ! <http://www.gnu.org/licenses/>. |
| |
| ! This file takes control of the process from the kernel, as specified |
| ! in section 3 of the SVr4 ABI. |
| ! This file is the first thing linked into any executable. |
| |
| #ifdef __sparcv9 |
| #define CPTRSIZE 8 |
| #define CPTRSHIFT 3 |
| #define STACK_BIAS 2047 |
| #define ldn ldx |
| #define stn stx |
| #define setn(s, scratch, dst) setx s, scratch, dst |
| #else |
| #define CPTRSIZE 4 |
| #define CPTRSHIFT 2 |
| #define STACK_BIAS 0 |
| #define ldn ld |
| #define stn st |
| #define setn(s, scratch, dst) set s, dst |
| #endif |
| |
| .section ".text" |
| .proc 022 |
| .global _start |
| |
| _start: |
| mov 0, %fp ! Mark bottom frame pointer |
| ldn [%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0 ! argc |
| add %sp, (17 * CPTRSIZE) + STACK_BIAS, %l1 ! argv |
| |
| ! Leave some room for a call. Sun leaves 32 octets (to sit on |
| ! a cache line?) so we do too. |
| #ifdef __sparcv9 |
| sub %sp, 48, %sp |
| #else |
| sub %sp, 32, %sp |
| #endif |
| |
| ! %g1 may contain a function to be registered w/atexit |
| orcc %g0, %g1, %g0 |
| #ifdef __sparcv9 |
| be %xcc, .nope |
| #else |
| be .nope |
| #endif |
| mov %g1, %o0 |
| call atexit |
| nop |
| .nope: |
| ! Now make sure constructors and destructors are handled. |
| setn(_fini, %o1, %o0) |
| call atexit, 1 |
| nop |
| call _init, 0 |
| nop |
| |
| ! We ignore the auxiliary vector; there is no defined way to |
| ! access those data anyway. Instead, go straight to main: |
| mov %l0, %o0 ! argc |
| mov %l1, %o1 ! argv |
| #ifdef GCRT1 |
| setn(___Argv, %o4, %o3) |
| stn %o1, [%o3] ! *___Argv |
| #endif |
| ! Skip argc words past argv, to env: |
| sll %l0, CPTRSHIFT, %o2 |
| add %o2, CPTRSIZE, %o2 |
| add %l1, %o2, %o2 ! env |
| setn(_environ, %o4, %o3) |
| stn %o2, [%o3] ! *_environ |
| call main, 4 |
| nop |
| call exit, 0 |
| nop |
| call _exit, 0 |
| nop |
| ! We should never get here. |
| |
| .type _start,#function |
| .size _start,.-_start |