]>
Commit | Line | Data |
---|---|---|
ffeac417 | 1 | /* Startup code compliant to the 64 bit S/390 ELF ABI. |
b168057a | 2 | Copyright (C) 2001-2015 Free Software Foundation, Inc. |
847b055c AJ |
3 | Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). |
4 | This file is part of the GNU C Library. | |
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. | |
847b055c | 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 | ||
847b055c AJ |
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. |
847b055c | 32 | |
41bdb6e2 | 33 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
34 | License along with the GNU C Library; if not, see |
35 | <http://www.gnu.org/licenses/>. */ | |
847b055c | 36 | |
6a7a8b22 | 37 | /* |
847b055c AJ |
38 | This is the canonical entry point, usually the first thing in the text |
39 | segment. Most registers' values are unspecified, except for: | |
40 | ||
ffeac417 | 41 | %r14 Contains a function pointer to be registered with `atexit'. |
847b055c AJ |
42 | This is how the dynamic linker arranges to have DT_FINI |
43 | functions called for shared libraries that have been loaded | |
44 | before this code runs. | |
45 | ||
46 | %r15 The stack contains the arguments and environment: | |
47 | 0(%r15) argc | |
ffeac417 | 48 | 8(%r15) argv[0] |
847b055c | 49 | ... |
ffeac417 UD |
50 | (8*argc)(%r15) NULL |
51 | (8*(argc+1))(%r15) envp[0] | |
847b055c AJ |
52 | ... |
53 | NULL | |
54 | */ | |
55 | ||
56 | .text | |
57 | .globl _start | |
d1cf3e71 | 58 | .type _start,@function |
847b055c | 59 | _start: |
ffeac417 UD |
60 | /* Load argc and argv from stack. */ |
61 | la %r4,8(%r15) # get argv | |
62 | lg %r3,0(%r15) # get argc | |
847b055c | 63 | |
ffeac417 UD |
64 | /* Align the stack to a double word boundary. */ |
65 | lghi %r0,-16 | |
66 | ngr %r15,%r0 | |
847b055c | 67 | |
ffeac417 UD |
68 | /* Setup a stack frame and a parameter area. */ |
69 | aghi %r15,-176 # make room on stack | |
70 | xc 0(8,%r15),0(%r15) # clear back-chain | |
847b055c | 71 | |
ffeac417 | 72 | /* Set up arguments for __libc_start_main: |
847b055c | 73 | main, argc, argv, envp, _init, _fini, rtld_fini, stack_end |
ffeac417 | 74 | Note that envp will be determined later in __libc_start_main. |
847b055c | 75 | */ |
ffeac417 UD |
76 | stmg %r14,%r15,160(%r15) # store rtld_fini/stack_end to parameter area |
77 | la %r7,160(%r15) | |
06b31ad3 RM |
78 | larl %r6,__libc_csu_fini # load pointer to __libc_csu_fini |
79 | larl %r5,__libc_csu_init # load pointer to __libc_csu_init | |
847b055c | 80 | |
ffeac417 | 81 | /* Ok, now branch to the libc main routine. */ |
57a5ea02 | 82 | #ifdef PIC |
308bb2d5 UD |
83 | larl %r2,main@GOTENT # load pointer to main |
84 | lg %r2,0(%r2) | |
57a5ea02 UD |
85 | brasl %r14,__libc_start_main@plt |
86 | #else | |
308bb2d5 | 87 | larl %r2,main # load pointer to main |
ffeac417 | 88 | brasl %r14,__libc_start_main |
57a5ea02 | 89 | #endif |
847b055c | 90 | |
ffeac417 UD |
91 | /* Crash if __libc_start_main returns. */ |
92 | .word 0 | |
847b055c | 93 | |
ffeac417 | 94 | /* Define a symbol for the first piece of initialized data. */ |
847b055c AJ |
95 | .data |
96 | .globl __data_start | |
97 | __data_start: | |
98 | .long 0 | |
99 | .weak data_start | |
100 | data_start = __data_start |