| xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 1 | /* ELF startup code for HPPA. | 
|  | 2 | Copyright (C) 2002-2016 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 | <http://www.gnu.org/licenses/>.  */ | 
|  | 35 |  | 
|  | 36 | .import main, code | 
|  | 37 | .import $global$, data | 
|  | 38 | .import __libc_start_main, code | 
|  | 39 | .import __libc_csu_fini, code | 
|  | 40 | .import __libc_csu_init, code | 
|  | 41 |  | 
|  | 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 | 
|  | 44 | supported in the latest dynamic linker.  */ | 
|  | 45 | #ifdef SHARED | 
|  | 46 | .section	.data.rel.ro,"aw",@progbits | 
|  | 47 | #else | 
|  | 48 | .section	.rodata,"a",@progbits | 
|  | 49 | #endif | 
|  | 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 | 
|  | 59 | #ifdef SHARED | 
|  | 60 | .Lp__global: | 
|  | 61 | .word $global$ | 
|  | 62 | #endif | 
|  | 63 |  | 
|  | 64 | .text | 
|  | 65 | .align 4 | 
|  | 66 | .globl _start | 
|  | 67 | .export _start, ENTRY | 
|  | 68 | .type _start,@function | 
|  | 69 | _start: | 
|  | 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 |  | 
|  | 77 | This function is called from the lower half of RTLD_START. | 
|  | 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 | 
|  | 87 | 7. sp-60 - stackend  */ | 
|  | 88 |  | 
|  | 89 | .proc | 
|  | 90 | .callinfo | 
|  | 91 | /* Clear previous-sp.  */ | 
|  | 92 | stw	%r0, -4(%sp) | 
|  | 93 | /* Setup the stack and frame.  */ | 
|  | 94 | stw	%rp, -20(%sp) | 
|  | 95 | ldo	64(%sp), %sp | 
|  | 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 */ | 
|  | 103 |  | 
|  | 104 | #ifdef SHARED | 
|  | 105 | /* load main (1st argument) */ | 
|  | 106 | addil	LT'.Lpmain, %r19 | 
|  | 107 | ldw	RT'.Lpmain(%r1), %r26 | 
|  | 108 | ldw	0(%r26),%r26 | 
|  | 109 | /* void (*init) (void) (4th argument) */ | 
|  | 110 | addil	LT'.Lp__libc_csu_init, %r19 | 
|  | 111 | ldw	RT'.Lp__libc_csu_init(%r1), %r23 | 
|  | 112 | ldw	0(%r23), %r23 | 
|  | 113 | /* void (*fini) (void) (5th argument) */ | 
|  | 114 | addil	LT'.Lp__libc_csu_fini, %r19 | 
|  | 115 | ldw	RT'.Lp__libc_csu_fini(%r1), %r22 | 
|  | 116 | ldw	0(%r22), %r22 | 
|  | 117 | #else | 
|  | 118 | /* load main (1st argument) */ | 
|  | 119 | ldil	LR'.Lpmain, %r26 | 
|  | 120 | ldw	RR'.Lpmain(%r26), %r26 | 
|  | 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 */ | 
|  | 129 | stw	%r22, -52(%sp) | 
|  | 130 | /* void *stack_end (7th argument) */ | 
|  | 131 | stw	%sp, -60(%sp) | 
|  | 132 |  | 
|  | 133 | #ifdef SHARED | 
|  | 134 | addil	LT'.Lp__global, %r19 | 
|  | 135 | ldw	RT'.Lp__global(%r1), %dp | 
|  | 136 | #else | 
|  | 137 | /* load global */ | 
|  | 138 | ldil	L%$global$, %dp | 
|  | 139 | ldo	R%$global$(%dp), %dp | 
|  | 140 | #endif | 
|  | 141 | bl	__libc_start_main,%r2 | 
|  | 142 | nop | 
|  | 143 | /* die horribly if it returned (it shouldn't) */ | 
|  | 144 | iitlbp %r0,(%sr0,%r0) | 
|  | 145 | nop | 
|  | 146 |  | 
|  | 147 | .procend | 
|  | 148 |  | 
|  | 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 |