]>
Commit | Line | Data |
---|---|---|
f8a26bed | 1 | /* ELF startup code for HPPA. |
568035b7 | 2 | Copyright (C) 2002-2013 Free Software Foundation, Inc. |
f8a26bed RM |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
0bec0145 RM |
10 | In addition to the permissions in the GNU Lesser General Public |
11 | License, the Free Software Foundation gives you unlimited | |
12 | permission to link the compiled version of this file with other | |
13 | programs, and to distribute those programs without any restriction | |
14 | coming from the use of this file. (The GNU Lesser General Public | |
15 | License restrictions do apply in other respects; for example, they | |
16 | cover modification of the file, and distribution when not linked | |
17 | into another program.) | |
18 | ||
19 | Note that people who make modified versions of this file are not | |
20 | obligated to grant this special exception for their modified | |
21 | versions; it is their choice whether to do so. The GNU Lesser | |
22 | General Public License gives permission to release a modified | |
23 | version without this exception; this exception also makes it | |
24 | possible to release a modified version which carries forward this | |
25 | exception. | |
26 | ||
f8a26bed RM |
27 | The GNU C Library is distributed in the hope that it will be useful, |
28 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
29 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
30 | Lesser General Public License for more details. | |
31 | ||
32 | You should have received a copy of the GNU Lesser General Public | |
ab84e3ff PE |
33 | License along with the GNU C Library. If not, see |
34 | <http://www.gnu.org/licenses/>. */ | |
1f07ba01 | 35 | |
1f07ba01 UD |
36 | .import main, code |
37 | .import $global$, data | |
38 | .import __libc_start_main, code | |
f8a26bed RM |
39 | .import __libc_csu_fini, code |
40 | .import __libc_csu_init, code | |
1f07ba01 | 41 | |
5556231d JM |
42 | /* Have the linker create plabel words so we get PLABEL32 |
43 | relocs and not 21/14. The use of 21/14 relocs is only | |
2625a1fb | 44 | supported in the latest dynamic linker. */ |
96007fb0 RM |
45 | .section .rodata |
46 | .align 4 | |
47 | .Lpmain: | |
48 | .word P%main | |
49 | .Lp__libc_start_main: | |
50 | .word P%__libc_start_main | |
51 | .Lp__libc_csu_fini: | |
52 | .word P%__libc_csu_fini | |
53 | .Lp__libc_csu_init: | |
54 | .word P%__libc_csu_init | |
55 | ||
56 | .text | |
57 | .align 4 | |
1f07ba01 UD |
58 | .globl _start |
59 | .export _start, ENTRY | |
13906e12 | 60 | .type _start,@function |
1f07ba01 | 61 | _start: |
2625a1fb CD |
62 | /* At entry to the function we have: |
63 | ||
64 | r26 - Unused | |
65 | r25 - argc | |
66 | r24 - argv | |
67 | r23 - False _dl_fini plabel address | |
68 | ||
5556231d | 69 | This function is called from the lower half of RTLD_START. |
2625a1fb CD |
70 | |
71 | The call to __libc_start_main expects: | |
72 | ||
73 | 1. r26 - Application main | |
74 | 2. r25 - argc | |
75 | 3. r24 - argv | |
76 | 4. r23 - __libc_csu_init | |
77 | 5. sp-52 - __libc_csu_fini | |
78 | 6. sp-56 - rtld_fini | |
5556231d | 79 | 7. sp-60 - stackend */ |
1f07ba01 UD |
80 | |
81 | .proc | |
82 | .callinfo | |
2625a1fb CD |
83 | /* Clear previous-sp. */ |
84 | stw %r0, -4(%sp) | |
85 | /* Setup the stack and frame. */ | |
86 | stw %rp, -20(%sp) | |
1f07ba01 | 87 | ldo 64(%sp), %sp |
2625a1fb CD |
88 | stw %sp, -4(%sp) |
89 | stw %r19, -32(%sp) | |
90 | ||
91 | /* argc and argv should be in 25 and 24 (2nd and 3rd argument) */ | |
92 | /* void (*rtld_fini) (void) (6th argument) */ | |
93 | stw %r23, -56(%sp) | |
94 | /* Need to setup 1, 4, 5, and 7th arguments */ | |
96007fb0 RM |
95 | |
96 | #if SHARED | |
97 | /* load main (1st argument) */ | |
d086703d CD |
98 | addil LT'.Lpmain, %r19 |
99 | ldw RT'.Lpmain(%r1), %r26 | |
96007fb0 | 100 | ldw 0(%r26),%r26 |
96007fb0 | 101 | /* void (*init) (void) (4th argument) */ |
d086703d CD |
102 | addil LT'.Lp__libc_csu_init, %r19 |
103 | ldw RT'.Lp__libc_csu_init(%r1), %r23 | |
96007fb0 RM |
104 | ldw 0(%r23), %r23 |
105 | /* void (*fini) (void) (5th argument) */ | |
d086703d CD |
106 | addil LT'.Lp__libc_csu_fini, %r19 |
107 | ldw RT'.Lp__libc_csu_fini(%r1), %r22 | |
96007fb0 RM |
108 | ldw 0(%r22), %r22 |
109 | #else | |
110 | /* load main (1st argument) */ | |
111 | ldil LR'.Lpmain, %r26 | |
112 | ldw RR'.Lpmain(%r26), %r26 | |
96007fb0 RM |
113 | /* void (*init) (void) (4th argument) */ |
114 | ldil LR'.Lp__libc_csu_init, %r23 | |
115 | ldw RR'.Lp__libc_csu_init(%r23), %r23 | |
116 | /* void (*fini) (void) (5th argument) */ | |
117 | ldil LR'.Lp__libc_csu_fini, %r22 | |
118 | ldw RR'.Lp__libc_csu_fini(%r22), %r22 | |
119 | #endif | |
120 | /* Store 5th argument */ | |
1f07ba01 | 121 | stw %r22, -52(%sp) |
96007fb0 | 122 | /* void *stack_end (7th argument) */ |
1f07ba01 UD |
123 | stw %sp, -60(%sp) |
124 | ||
125 | /* load global */ | |
126 | ldil L%$global$, %dp | |
127 | ldo R%$global$(%dp), %dp | |
128 | ||
129 | bl __libc_start_main,%r2 | |
130 | nop | |
131 | /* die horribly if it returned (it shouldn't) */ | |
96007fb0 | 132 | iitlbp %r0,(%sr0,%r0) |
1f07ba01 UD |
133 | nop |
134 | ||
135 | .procend | |
136 | ||
692e7ab8 RM |
137 | /* Define a symbol for the first piece of initialized data. */ |
138 | .data | |
139 | .globl __data_start | |
140 | __data_start: | |
141 | .long 0 | |
142 | .weak data_start | |
143 | data_start = __data_start |