Deleted Added
full compact
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)