]>
Commit | Line | Data |
---|---|---|
5ae3e846 | 1 | /* Startup code for elf64-sparc |
04277e02 | 2 | Copyright (C) 1997-2019 Free Software Foundation, Inc. |
41bdb6e2 | 3 | This file is part of the GNU C Library. |
5ae3e846 UD |
4 | Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
5ae3e846 | 10 | |
92c6ccd1 RM |
11 | In addition to the permissions in the GNU Lesser General Public |
12 | License, the Free Software Foundation gives you unlimited | |
13 | permission to link the compiled version of this file with other | |
14 | programs, and to distribute those programs without any restriction | |
15 | coming from the use of this file. (The GNU Lesser General Public | |
16 | License restrictions do apply in other respects; for example, they | |
17 | cover modification of the file, and distribution when not linked | |
18 | into another program.) | |
19 | ||
20 | Note that people who make modified versions of this file are not | |
21 | obligated to grant this special exception for their modified | |
22 | versions; it is their choice whether to do so. The GNU Lesser | |
23 | General Public License gives permission to release a modified | |
24 | version without this exception; this exception also makes it | |
25 | possible to release a modified version which carries forward this | |
26 | exception. | |
27 | ||
5ae3e846 UD |
28 | The GNU C Library is distributed in the hope that it will be useful, |
29 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 31 | Lesser General Public License for more details. |
5ae3e846 | 32 | |
41bdb6e2 | 33 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 | 34 | License along with the GNU C Library; if not, see |
5a82c748 | 35 | <https://www.gnu.org/licenses/>. */ |
5ae3e846 UD |
36 | |
37 | #include <sysdep.h> | |
38 | ||
39 | ||
40 | .section ".text" | |
41 | .align 4 | |
42 | .global _start | |
43 | .type _start,#function | |
44 | _start: | |
371b220f | 45 | #ifdef PIC |
3d2b3019 | 46 | SETUP_PIC_REG(l7) |
4c595adb UD |
47 | #endif |
48 | ||
5ae3e846 UD |
49 | /* Terminate the stack frame, and reserve space for functions to |
50 | drop their arguments. */ | |
51 | mov %g0, %fp | |
52 | sub %sp, 6*8, %sp | |
53 | ||
5ae3e846 UD |
54 | /* Extract the arguments and environment as encoded on the stack. The |
55 | argument info starts after one register window (16 words) past the SP, | |
56 | plus the bias we added, plus the magic v9 STACK_BIAS. */ | |
a5540016 RH |
57 | ldx [%sp+STACK_BIAS+22*8], %o1 |
58 | add %sp, STACK_BIAS+23*8, %o2 | |
59 | ||
60 | /* Load the addresses of the user entry points. */ | |
371b220f | 61 | #ifndef PIC |
3d2b3019 DM |
62 | sethi %hi(main), %o0 |
63 | sethi %hi(__libc_csu_init), %o3 | |
64 | sethi %hi(__libc_csu_fini), %o4 | |
65 | or %o0, %lo(main), %o0 | |
66 | or %o3, %lo(__libc_csu_init), %o3 | |
67 | or %o4, %lo(__libc_csu_fini), %o4 | |
68 | #else | |
3d2b3019 DM |
69 | sethi %gdop_hix22(main), %o0 |
70 | sethi %gdop_hix22(__libc_csu_init), %o3 | |
71 | sethi %gdop_hix22(__libc_csu_fini), %o4 | |
72 | xor %o0, %gdop_lox10(main), %o0 | |
73 | xor %o3, %gdop_lox10(__libc_csu_init), %o3 | |
74 | xor %o4, %gdop_lox10(__libc_csu_fini), %o4 | |
75 | ldx [%l7 + %o0], %o0, %gdop(main) | |
76 | ldx [%l7 + %o3], %o3, %gdop(__libc_csu_init) | |
77 | ldx [%l7 + %o4], %o4, %gdop(__libc_csu_fini) | |
4c595adb | 78 | #endif |
a5540016 RH |
79 | |
80 | /* When starting a binary via the dynamic linker, %g1 contains the | |
81 | address of the shared library termination function, which will be | |
82 | registered with atexit(). If we are statically linked, this will | |
83 | be NULL. */ | |
84 | mov %g1, %o5 | |
85 | ||
86 | /* Let libc do the rest of the initialization, and call main. */ | |
87 | call __libc_start_main | |
5ae3e846 UD |
88 | nop |
89 | ||
90 | /* Die very horribly if exit returns. */ | |
91 | illtrap 0 | |
92 | ||
a5540016 | 93 | .size _start, .-_start |
87f37b48 RM |
94 | |
95 | /* Define a symbol for the first piece of initialized data. */ | |
96 | .data | |
97 | .globl __data_start | |
98 | __data_start: | |
e42e88ab | 99 | .long 0 |
87f37b48 | 100 | weak_alias (__data_start, data_start) |