]>
Commit | Line | Data |
---|---|---|
f8a26bed | 1 | /* ELF startup code for HPPA. |
f7a9f785 | 2 | Copyright (C) 2002-2016 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. */ |
cf425377 AM |
45 | #ifdef SHARED |
46 | .section .data.rel.ro,"aw",@progbits | |
47 | #else | |
48 | .section .rodata,"a",@progbits | |
49 | #endif | |
96007fb0 RM |
50 | .align 4 |
51 | .Lpmain: | |
52 | .word P%main | |
53 | .Lp__libc_start_main: | |
54 | .word P%__libc_start_main | |
55 | .Lp__libc_csu_fini: | |
56 | .word P%__libc_csu_fini | |
57 | .Lp__libc_csu_init: | |
58 | .word P%__libc_csu_init | |
cf425377 AM |
59 | #ifdef SHARED |
60 | .Lp__global: | |
61 | .word $global$ | |
62 | #endif | |
96007fb0 RM |
63 | |
64 | .text | |
65 | .align 4 | |
1f07ba01 UD |
66 | .globl _start |
67 | .export _start, ENTRY | |
13906e12 | 68 | .type _start,@function |
1f07ba01 | 69 | _start: |
2625a1fb CD |
70 | /* At entry to the function we have: |
71 | ||
72 | r26 - Unused | |
73 | r25 - argc | |
74 | r24 - argv | |
75 | r23 - False _dl_fini plabel address | |
76 | ||
5556231d | 77 | This function is called from the lower half of RTLD_START. |
2625a1fb CD |
78 | |
79 | The call to __libc_start_main expects: | |
80 | ||
81 | 1. r26 - Application main | |
82 | 2. r25 - argc | |
83 | 3. r24 - argv | |
84 | 4. r23 - __libc_csu_init | |
85 | 5. sp-52 - __libc_csu_fini | |
86 | 6. sp-56 - rtld_fini | |
5556231d | 87 | 7. sp-60 - stackend */ |
1f07ba01 UD |
88 | |
89 | .proc | |
90 | .callinfo | |
2625a1fb CD |
91 | /* Clear previous-sp. */ |
92 | stw %r0, -4(%sp) | |
93 | /* Setup the stack and frame. */ | |
94 | stw %rp, -20(%sp) | |
1f07ba01 | 95 | ldo 64(%sp), %sp |
2625a1fb CD |
96 | stw %sp, -4(%sp) |
97 | stw %r19, -32(%sp) | |
98 | ||
99 | /* argc and argv should be in 25 and 24 (2nd and 3rd argument) */ | |
100 | /* void (*rtld_fini) (void) (6th argument) */ | |
101 | stw %r23, -56(%sp) | |
102 | /* Need to setup 1, 4, 5, and 7th arguments */ | |
96007fb0 | 103 | |
82374e65 | 104 | #ifdef SHARED |
96007fb0 | 105 | /* load main (1st argument) */ |
d086703d CD |
106 | addil LT'.Lpmain, %r19 |
107 | ldw RT'.Lpmain(%r1), %r26 | |
96007fb0 | 108 | ldw 0(%r26),%r26 |
96007fb0 | 109 | /* void (*init) (void) (4th argument) */ |
d086703d CD |
110 | addil LT'.Lp__libc_csu_init, %r19 |
111 | ldw RT'.Lp__libc_csu_init(%r1), %r23 | |
96007fb0 RM |
112 | ldw 0(%r23), %r23 |
113 | /* void (*fini) (void) (5th argument) */ | |
d086703d CD |
114 | addil LT'.Lp__libc_csu_fini, %r19 |
115 | ldw RT'.Lp__libc_csu_fini(%r1), %r22 | |
96007fb0 RM |
116 | ldw 0(%r22), %r22 |
117 | #else | |
118 | /* load main (1st argument) */ | |
119 | ldil LR'.Lpmain, %r26 | |
120 | ldw RR'.Lpmain(%r26), %r26 | |
96007fb0 RM |
121 | /* void (*init) (void) (4th argument) */ |
122 | ldil LR'.Lp__libc_csu_init, %r23 | |
123 | ldw RR'.Lp__libc_csu_init(%r23), %r23 | |
124 | /* void (*fini) (void) (5th argument) */ | |
125 | ldil LR'.Lp__libc_csu_fini, %r22 | |
126 | ldw RR'.Lp__libc_csu_fini(%r22), %r22 | |
127 | #endif | |
128 | /* Store 5th argument */ | |
1f07ba01 | 129 | stw %r22, -52(%sp) |
96007fb0 | 130 | /* void *stack_end (7th argument) */ |
1f07ba01 UD |
131 | stw %sp, -60(%sp) |
132 | ||
cf425377 AM |
133 | #ifdef SHARED |
134 | addil LT'.Lp__global, %r19 | |
135 | ldw RT'.Lp__global(%r1), %dp | |
136 | #else | |
1f07ba01 UD |
137 | /* load global */ |
138 | ldil L%$global$, %dp | |
139 | ldo R%$global$(%dp), %dp | |
cf425377 | 140 | #endif |
1f07ba01 UD |
141 | bl __libc_start_main,%r2 |
142 | nop | |
143 | /* die horribly if it returned (it shouldn't) */ | |
96007fb0 | 144 | iitlbp %r0,(%sr0,%r0) |
1f07ba01 UD |
145 | nop |
146 | ||
147 | .procend | |
148 | ||
692e7ab8 RM |
149 | /* Define a symbol for the first piece of initialized data. */ |
150 | .data | |
151 | .globl __data_start | |
152 | __data_start: | |
153 | .long 0 | |
154 | .weak data_start | |
155 | data_start = __data_start |