rtld_start.S (85676) | rtld_start.S (115396) |
---|---|
1/* $FreeBSD: head/libexec/rtld-elf/ia64/rtld_start.S 85676 2001-10-29 10:05:32Z peter $ */ | 1/* $FreeBSD: head/libexec/rtld-elf/ia64/rtld_start.S 115396 2003-05-29 22:58:26Z kan $ */ |
2/* From: NetBSD: rtld_start.S,v 1.1 1996/12/16 20:38:09 cgd Exp */ 3 4/* 5 * Copyright 1996 Matt Thomas <matt@3am-software.com> 6 * Copyright 2000 John D. Polstra 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without --- 35 unchanged lines hidden (view full) --- 45 .align 8 46 .previous 47 add r15=@gprel(2b),gp 48 ;; 49 ld8 r15=[r15] 50 ;; 51 sub out0=r14,r15 // out0 is image base address 52 br.call.sptk.many rp=_rtld_reloc // fixup image | 2/* From: NetBSD: rtld_start.S,v 1.1 1996/12/16 20:38:09 cgd Exp */ 3 4/* 5 * Copyright 1996 Matt Thomas <matt@3am-software.com> 6 * Copyright 2000 John D. Polstra 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without --- 35 unchanged lines hidden (view full) --- 45 .align 8 46 .previous 47 add r15=@gprel(2b),gp 48 ;; 49 ld8 r15=[r15] 50 ;; 51 sub out0=r14,r15 // out0 is image base address 52 br.call.sptk.many rp=_rtld_reloc // fixup image |
53 | 53 |
54 add sp=-16,sp // 16 bytes for us, 16 for _rtld 55 ;; 56 mov out0=in0 57 add out1=16,sp // address for exit proc 58 add out2=24,sp // address for obj_main 59 60 br.call.sptk.many rp=_rtld // r8=_rtld(sp, &exit_proc, &obj_main) 61 62 add r16=16,sp // address for exit proc | 54 add sp=-16,sp // 16 bytes for us, 16 for _rtld 55 ;; 56 mov out0=in0 57 add out1=16,sp // address for exit proc 58 add out2=24,sp // address for obj_main 59 60 br.call.sptk.many rp=_rtld // r8=_rtld(sp, &exit_proc, &obj_main) 61 62 add r16=16,sp // address for exit proc |
63 ;; | 63 ;; |
64 ld8 r15=[r16] // read exit proc 65 add sp=16,sp // readjust stack 66 mov b7=r8 // address of real _start 67 ;; 68 alloc r2=ar.pfs,0,0,3,0 // dump register frame 69 mov out2=r15 70 ;; 71 br.call.sptk.many rp=b7 // transfer to main program --- 29 unchanged lines hidden (view full) --- 101 stf.spill [r18]=f9,32 102 mov loc5=r11 // language specific 103 shl out1=r15,4 // 16 * index 104 ;; 105} { .mmi 106 stf.spill [r17]=f10,32 107 stf.spill [r18]=f11,32 108 mov out0=r16 // Obj_Entry for caller | 64 ld8 r15=[r16] // read exit proc 65 add sp=16,sp // readjust stack 66 mov b7=r8 // address of real _start 67 ;; 68 alloc r2=ar.pfs,0,0,3,0 // dump register frame 69 mov out2=r15 70 ;; 71 br.call.sptk.many rp=b7 // transfer to main program --- 29 unchanged lines hidden (view full) --- 101 stf.spill [r18]=f9,32 102 mov loc5=r11 // language specific 103 shl out1=r15,4 // 16 * index 104 ;; 105} { .mmi 106 stf.spill [r17]=f10,32 107 stf.spill [r18]=f11,32 108 mov out0=r16 // Obj_Entry for caller |
109 ;; | 109 ;; |
110} { .mmi 111 stf.spill [r17]=f12,32 112 stf.spill [r18]=f13,32 113 shladd out1=r15,3,out1 // rela offset = 24 * index | 110} { .mmi 111 stf.spill [r17]=f12,32 112 stf.spill [r18]=f13,32 113 shladd out1=r15,3,out1 // rela offset = 24 * index |
114 ;; | 114 ;; |
115} { .mmb 116 stf.spill [r17]=f14,32 117 stf.spill [r18]=f15,32 118 br.call.sptk.many rp=_rtld_bind 119} { .mii 120 ld8 r14=[r8],8 // target address 121 add r17=16,sp 122 add r18=32,sp 123 ;; 124} { .mii 125 ld8 r1=[r8] // target gp 126 mov ar.pfs=loc0 // clean up 127 mov rp=loc1 | 115} { .mmb 116 stf.spill [r17]=f14,32 117 stf.spill [r18]=f15,32 118 br.call.sptk.many rp=_rtld_bind 119} { .mii 120 ld8 r14=[r8],8 // target address 121 add r17=16,sp 122 add r18=32,sp 123 ;; 124} { .mii 125 ld8 r1=[r8] // target gp 126 mov ar.pfs=loc0 // clean up 127 mov rp=loc1 |
128} { .mmi | 128} { .mmi |
129 ldf.fill f8=[r17],32 // restore float arguments 130 ldf.fill f9=[r18],32 131 mov r8=loc2 // restore structure pointer | 129 ldf.fill f8=[r17],32 // restore float arguments 130 ldf.fill f9=[r18],32 131 mov r8=loc2 // restore structure pointer |
132 ;; | 132 ;; |
133} { .mmi 134 ldf.fill f10=[r17],32 135 ldf.fill f11=[r18],32 136 mov r9=loc3 | 133} { .mmi 134 ldf.fill f10=[r17],32 135 ldf.fill f11=[r18],32 136 mov r9=loc3 |
137 ;; | 137 ;; |
138} { .mmi 139 ldf.fill f12=[r17],32 140 ldf.fill f13=[r18],32 141 mov r10=loc4 | 138} { .mmi 139 ldf.fill f12=[r17],32 140 ldf.fill f13=[r18],32 141 mov r10=loc4 |
142 ;; | 142 ;; |
143} { .mmi 144 ldf.fill f14=[r17],32 145 ldf.fill f15=[r18],32 146 mov r11=loc5 147 ;; 148} { .mii 149 nop.m 0 150 mov b7=r14 151 add sp=8*16,sp 152 ;; 153} { .mib 154 alloc r14=ar.pfs,0,0,8,0 // drop our register frame 155 nop.i 0 156 br.sptk.many b7 // jump to target 157} 158END(_rtld_bind_start) 159 | 143} { .mmi 144 ldf.fill f14=[r17],32 145 ldf.fill f15=[r18],32 146 mov r11=loc5 147 ;; 148} { .mii 149 nop.m 0 150 mov b7=r14 151 add sp=8*16,sp 152 ;; 153} { .mib 154 alloc r14=ar.pfs,0,0,8,0 // drop our register frame 155 nop.i 0 156 br.sptk.many b7 // jump to target 157} 158END(_rtld_bind_start) 159 |
160/* 161 * int cmp0_and_store_int(volatile int *p, int newval); 162 * 163 * If an int holds 0, store newval into it; else do nothing. Returns 164 * the previous value. 165 */ 166ENTRY(cmp0_and_store_int, 2) 167 mov ar.ccv=0 168 ;; 169 cmpxchg4.acq r8=[in0],in1,ar.ccv 170 br.ret.sptk.many rp 171END(cmp0_and_store_int) 172 173ENTRY(atomic_add_int, 2) 1741: ld4 r14=[in0] 175 ;; 176 mov ar.ccv=r14 177 add r15=in1,r14 178 ;; 179 cmpxchg4.acq r16=[in0],r15,ar.ccv 180 ;; 181 cmp.ne p6,p0=r14,r16 182(p6) br.cond.spnt.few 1b 183 br.ret.sptk.many rp 184END(atomic_add_int) 185 186/* Atomically increment an int. */ 187ENTRY(atomic_incr_int, 1) 1881: ld4 r14=[in0] 189 ;; 190 mov ar.ccv=r14 191 add r15=1,r14 192 ;; 193 cmpxchg4.acq r16=[in0],r15,ar.ccv 194 ;; 195 cmp.ne p6,p0=r14,r16 196(p6) br.cond.spnt.few 1b 197 br.ret.sptk.many rp 198END(atomic_incr_int) 199 200/* Atomically decrement an int. */ 201ENTRY(atomic_decr_int, 1) 2021: ld4 r14=[in0] 203 ;; 204 mov ar.ccv=r14 205 add r15=-1,r14 206 ;; 207 cmpxchg4.acq r16=[in0],r15,ar.ccv 208 ;; 209 cmp.ne p6,p0=r14,r16 210(p6) br.cond.spnt.few 1b 211 br.ret.sptk.many rp 212END(atomic_decr_int) 213 | |
214#define DT_NULL 0 /* Terminating entry. */ 215#define DT_RELA 7 /* Address of ElfNN_Rela relocations. */ 216#define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */ 217#define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */ | 160#define DT_NULL 0 /* Terminating entry. */ 161#define DT_RELA 7 /* Address of ElfNN_Rela relocations. */ 162#define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */ 163#define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */ |
218 | 164 |
219#define R_IA64_NONE 0 /* None */ 220#define R_IA64_DIR64LSB 0x27 /* word64 LSB S + A */ 221#define R_IA64_REL64LSB 0x6f /* word64 LSB BD + A */ | 165#define R_IA64_NONE 0 /* None */ 166#define R_IA64_DIR64LSB 0x27 /* word64 LSB S + A */ 167#define R_IA64_REL64LSB 0x6f /* word64 LSB BD + A */ |
222 | 168 |
223/* 224 * _rtld_reloc: relocate the rtld image, apart from @fptrs. 225 * 226 * Assumes that rtld was linked at zero and that we only need to 227 * handle REL64LSB and DIR64LSB relocations. 228 * 229 * Arguments: 230 * r1 gp value for rtld 231 * in0 rtld base address 232 */ 233STATIC_ENTRY(_rtld_reloc, 1) 234 alloc loc0=ar.pfs,1,2,0,0 235 mov loc1=rp | 169/* 170 * _rtld_reloc: relocate the rtld image, apart from @fptrs. 171 * 172 * Assumes that rtld was linked at zero and that we only need to 173 * handle REL64LSB and DIR64LSB relocations. 174 * 175 * Arguments: 176 * r1 gp value for rtld 177 * in0 rtld base address 178 */ 179STATIC_ENTRY(_rtld_reloc, 1) 180 alloc loc0=ar.pfs,1,2,0,0 181 mov loc1=rp |
236 ;; | 182 ;; |
237 movl r15=@gprel(_DYNAMIC) // find _DYNAMIC etc. 238 ;; 239 add r15=r15,gp // relocate _DYNAMIC etc. 240 ;; 2411: ld8 r16=[r15],8 // read r15->d_tag 242 ;; 243 ld8 r17=[r15],8 // and r15->d_val 244 ;; 245 cmp.eq p6,p0=DT_NULL,r16 // done? 246(p6) br.cond.dpnt.few 2f | 183 movl r15=@gprel(_DYNAMIC) // find _DYNAMIC etc. 184 ;; 185 add r15=r15,gp // relocate _DYNAMIC etc. 186 ;; 1871: ld8 r16=[r15],8 // read r15->d_tag 188 ;; 189 ld8 r17=[r15],8 // and r15->d_val 190 ;; 191 cmp.eq p6,p0=DT_NULL,r16 // done? 192(p6) br.cond.dpnt.few 2f |
247 ;; | 193 ;; |
248 cmp.eq p6,p0=DT_RELA,r16 | 194 cmp.eq p6,p0=DT_RELA,r16 |
249 ;; | 195 ;; |
250(p6) add r18=r17,in0 // found rela section | 196(p6) add r18=r17,in0 // found rela section |
251 ;; | 197 ;; |
252 cmp.eq p6,p0=DT_RELASZ,r16 | 198 cmp.eq p6,p0=DT_RELASZ,r16 |
253 ;; | 199 ;; |
254(p6) mov r19=r17 // found rela size | 200(p6) mov r19=r17 // found rela size |
255 ;; | 201 ;; |
256 cmp.eq p6,p0=DT_RELAENT,r16 | 202 cmp.eq p6,p0=DT_RELAENT,r16 |
257 ;; | 203 ;; |
258(p6) mov r22=r17 // found rela entry size 259 ;; 260 br.sptk.few 1b | 204(p6) mov r22=r17 // found rela entry size 205 ;; 206 br.sptk.few 1b |
261 2622: | 207 2082: |
263 ld8 r15=[r18],8 // read r_offset | 209 ld8 r15=[r18],8 // read r_offset |
264 ;; | 210 ;; |
265 ld8 r16=[r18],8 // read r_info 266 add r15=r15,in0 // relocate r_offset 267 ;; 268 ld8 r17=[r18],8 // read r_addend 269 sub r19=r19,r22 // update relasz 270 271 extr.u r23=r16,0,32 // ELF64_R_TYPE(r16) 272 ;; --- 6 unchanged lines hidden (view full) --- 279 ;; 280 cmp.eq p6,p0=R_IA64_REL64LSB,r23 281 ;; 282(p6) br.cond.dptk.few 4f 283 ;; 284 2853: cmp.ltu p6,p0=0,r19 // more? 286(p6) br.cond.dptk.few 2b // loop | 211 ld8 r16=[r18],8 // read r_info 212 add r15=r15,in0 // relocate r_offset 213 ;; 214 ld8 r17=[r18],8 // read r_addend 215 sub r19=r19,r22 // update relasz 216 217 extr.u r23=r16,0,32 // ELF64_R_TYPE(r16) 218 ;; --- 6 unchanged lines hidden (view full) --- 225 ;; 226 cmp.eq p6,p0=R_IA64_REL64LSB,r23 227 ;; 228(p6) br.cond.dptk.few 4f 229 ;; 230 2313: cmp.ltu p6,p0=0,r19 // more? 232(p6) br.cond.dptk.few 2b // loop |
287 | 233 |
288 mov r8=0 // success return value 289 ;; 290 br.cond.sptk.few 9f // done 291 2924: 293 ld8 r16=[r15] // read value 294 ;; 295 add r16=r16,in0 // relocate it 296 ;; 297 st8 [r15]=r16 // and store it back 298 br.cond.sptk.few 3b 299 3009: 301 mov ar.pfs=loc0 302 mov rp=loc1 303 ;; 304 br.ret.sptk.few rp 305 306END(_rtld_reloc) | 234 mov r8=0 // success return value 235 ;; 236 br.cond.sptk.few 9f // done 237 2384: 239 ld8 r16=[r15] // read value 240 ;; 241 add r16=r16,in0 // relocate it 242 ;; 243 st8 [r15]=r16 // and store it back 244 br.cond.sptk.few 3b 245 2469: 247 mov ar.pfs=loc0 248 mov rp=loc1 249 ;; 250 br.ret.sptk.few rp 251 252END(_rtld_reloc) |