1 | /* ELF startup code for HPPA. |
2 | Copyright (C) 2002-2022 Free Software Foundation, Inc. |
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 | |
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 | |
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 |
33 | License along with the GNU C Library. If not, see |
34 | <https://www.gnu.org/licenses/>. */ |
35 | |
36 | .import main, code |
37 | .import $global$, data |
38 | .import __libc_start_main, code |
39 | |
40 | /* Have the linker create plabel words so we get PLABEL32 |
41 | relocs and not 21/14. The use of 21/14 relocs is only |
42 | supported in the latest dynamic linker. */ |
43 | #ifdef PIC |
44 | .section .data.rel.ro,"aw" ,@progbits |
45 | #else |
46 | .section .rodata,"a" ,@progbits |
47 | #endif |
48 | .align 4 |
49 | .Lpmain: |
50 | .word P%main |
51 | .Lp__libc_start_main: |
52 | .word P%__libc_start_main |
53 | |
54 | .text |
55 | .align 4 |
56 | .globl _start |
57 | .export _start, ENTRY |
58 | .type _start,@function |
59 | _start: |
60 | /* At entry to the function we have: |
61 | |
62 | r26 - Unused |
63 | r25 - argc |
64 | r24 - argv |
65 | r23 - False _dl_fini plabel address |
66 | |
67 | This function is called from the lower half of RTLD_START. |
68 | |
69 | The call to __libc_start_main expects: |
70 | |
71 | 1. r26 - Application main |
72 | 2. r25 - argc |
73 | 3. r24 - argv |
74 | 4. r23 - init (unused) |
75 | 5. sp-52 - fini (unused) |
76 | 6. sp-56 - rtld_fini |
77 | 7. sp-60 - stackend */ |
78 | |
79 | .proc |
80 | .callinfo |
81 | /* Clear previous-sp. */ |
82 | stw %r0, -4(%sp) |
83 | /* Setup the stack and frame. */ |
84 | stw %rp, -20(%sp) |
85 | ldo 64(%sp), %sp |
86 | stw %sp, -4(%sp) |
87 | stw %r19, -32(%sp) |
88 | |
89 | /* argc and argv should be in 25 and 24 (2nd and 3rd argument) */ |
90 | /* void (*rtld_fini) (void) (6th argument) */ |
91 | stw %r23, -56(%sp) |
92 | |
93 | /* Need to setup 1, 4, 5, and 7th arguments */ |
94 | |
95 | #ifdef PIC |
96 | /* Load $global$ address into %dp */ |
97 | bl .+8, %dp |
98 | addil L'$global$-$PIC_pcrel$0+1, %dp |
99 | ldo R'$global$-$PIC_pcrel$0+5(%r1), %dp |
100 | |
101 | /* load main (1st argument) */ |
102 | addil LT'.Lpmain, %r19 |
103 | ldw RT'.Lpmain(%r1), %r26 |
104 | ldw 0(%r26),%r26 |
105 | #else |
106 | /* Load $global$ address into %dp */ |
107 | ldil L%$global$, %dp |
108 | ldo R%$global$(%dp), %dp |
109 | |
110 | /* load main (1st argument) */ |
111 | ldil LR'.Lpmain, %r26 |
112 | ldw RR'.Lpmain(%r26), %r26 |
113 | #endif |
114 | ldi 0,%r23 /* Used to be init. */ |
115 | ldi 0,%r22 /* Used to be fini. */ |
116 | /* Store 5th argument */ |
117 | stw %r22, -52(%sp) |
118 | /* void *stack_end (7th argument) */ |
119 | stw %sp, -60(%sp) |
120 | bl __libc_start_main,%r2 |
121 | nop |
122 | /* die horribly if it returned (it shouldn't) */ |
123 | iitlbp %r0,(%sr0,%r0) |
124 | nop |
125 | |
126 | .procend |
127 | |
128 | /* Define a symbol for the first piece of initialized data. */ |
129 | .data |
130 | .globl __data_start |
131 | __data_start: |
132 | .long 0 |
133 | .weak data_start |
134 | data_start = __data_start |
135 | |