aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/locore.S77
-rw-r--r--sys/ia64/ia64/locore.s77
2 files changed, 78 insertions, 76 deletions
diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S
index 8452c5792d3a2..080dfd961899e 100644
--- a/sys/ia64/ia64/locore.S
+++ b/sys/ia64/ia64/locore.S
@@ -424,67 +424,68 @@ STATIC_ENTRY(_reloc, 1)
cmp.eq p6,p0=R_IA64_NONE,r23
(p6) br.cond.dpnt.few 3f
;;
- cmp.eq p6,p0=R_IA64_DIR64LSB,r23
- ;;
+ cmp.eq p6,p0=R_IA64_REL64LSB,r23
(p6) br.cond.dptk.few 4f
;;
- cmp.eq p6,p0=R_IA64_FPTR64LSB,r23
+
+ extr.u r16=r16,32,32 // ELF64_R_SYM(r16)
+ ;;
+ setf.sig f10=r16 // so we can multiply
;;
-(p6) br.cond.dptk.few 5f
+ xma.lu f10=f10,f9,f8 // f10=symtab + r_sym*syment
;;
- cmp.eq p6,p0=R_IA64_REL64LSB,r23
+ getf.sig r16=f10
;;
-(p6) br.cond.dptk.few 4f
+ add r16=8,r16 // address of st_value
+ ;;
+ ld8 r16=[r16] // read symbol value
+ ;;
+ add r16=r16,in0 // relocate symbol value
+ ;;
+
+ cmp.eq p6,p0=R_IA64_DIR64LSB,r23
+(p6) br.cond.dptk.few 5f
+ ;;
+ cmp.eq p6,p0=R_IA64_FPTR64LSB,r23
+(p6) br.cond.dptk.few 6f
;;
-3: cmp.ltu p6,p0=0,r19 // more?
+3:
+ cmp.ltu p6,p0=0,r19 // more?
(p6) br.cond.dptk.few 2b // loop
-
mov r8=0 // success return value
- ;;
br.cond.sptk.few 9f // done
4:
- ld8 r16=[r15] // read value
+ add r16=in0,r17 // BD + A
;;
- add r16=r16,in0 // relocate it
- ;;
- st8 [r15]=r16 // and store it back
+ st8 [r15]=r16 // word64 (LSB)
br.cond.sptk.few 3b
-
+
5:
- extr.u r23=r16,32,32 // ELF64_R_SYM(r16)
- ;;
- setf.sig f10=r23 // so we can multiply
- ;;
- xma.lu f10=f10,f9,f8 // f10=symtab + r_sym*syment
- ;;
- getf.sig r16=f10
- ;;
- add r16=8,r16 // address of st_value
- ;;
- ld8 r16=[r16] // read symbol value
- ;;
- add r16=r16,in0 // relocate symbol value
+ add r16=r16,r17 // S + A
;;
+ st8 [r15]=r16 // word64 (LSB)
+ br.cond.sptk.few 3b
+
+6:
movl r17=@gprel(fptr_storage)
;;
add r17=r17,gp // start of fptrs
;;
-6: cmp.geu p6,p0=r17,r2 // end of fptrs?
-(p6) br.cond.dpnt.few 7f // can't find existing fptr
+7: cmp.geu p6,p0=r17,r2 // end of fptrs?
+(p6) br.cond.dpnt.few 8f // can't find existing fptr
ld8 r20=[r17] // read function from fptr
;;
cmp.eq p6,p0=r16,r20 // same function?
- ;;
+ ;;
(p6) st8 [r15]=r17 // reuse fptr
(p6) br.cond.sptk.few 3b // done
add r17=16,r17 // next fptr
- br.cond.sptk.few 6b
-
-7: // allocate new fptr
+ br.cond.sptk.few 7b
+
+8: // allocate new fptr
mov r8=1 // failure return value
- ;;
cmp.geu p6,p0=r2,r3 // space left?
(p6) br.cond.dpnt.few 9f // bail out
@@ -501,10 +502,10 @@ STATIC_ENTRY(_reloc, 1)
br.ret.sptk.few rp
END(_reloc)
-
+
.data
.align 16
-
-fptr_storage:
+ .global fptr_storage
+fptr_storage:
.space 4096*16 // XXX
-fptr_storage_end:
+fptr_storage_end:
diff --git a/sys/ia64/ia64/locore.s b/sys/ia64/ia64/locore.s
index 8452c5792d3a2..080dfd961899e 100644
--- a/sys/ia64/ia64/locore.s
+++ b/sys/ia64/ia64/locore.s
@@ -424,67 +424,68 @@ STATIC_ENTRY(_reloc, 1)
cmp.eq p6,p0=R_IA64_NONE,r23
(p6) br.cond.dpnt.few 3f
;;
- cmp.eq p6,p0=R_IA64_DIR64LSB,r23
- ;;
+ cmp.eq p6,p0=R_IA64_REL64LSB,r23
(p6) br.cond.dptk.few 4f
;;
- cmp.eq p6,p0=R_IA64_FPTR64LSB,r23
+
+ extr.u r16=r16,32,32 // ELF64_R_SYM(r16)
+ ;;
+ setf.sig f10=r16 // so we can multiply
;;
-(p6) br.cond.dptk.few 5f
+ xma.lu f10=f10,f9,f8 // f10=symtab + r_sym*syment
;;
- cmp.eq p6,p0=R_IA64_REL64LSB,r23
+ getf.sig r16=f10
;;
-(p6) br.cond.dptk.few 4f
+ add r16=8,r16 // address of st_value
+ ;;
+ ld8 r16=[r16] // read symbol value
+ ;;
+ add r16=r16,in0 // relocate symbol value
+ ;;
+
+ cmp.eq p6,p0=R_IA64_DIR64LSB,r23
+(p6) br.cond.dptk.few 5f
+ ;;
+ cmp.eq p6,p0=R_IA64_FPTR64LSB,r23
+(p6) br.cond.dptk.few 6f
;;
-3: cmp.ltu p6,p0=0,r19 // more?
+3:
+ cmp.ltu p6,p0=0,r19 // more?
(p6) br.cond.dptk.few 2b // loop
-
mov r8=0 // success return value
- ;;
br.cond.sptk.few 9f // done
4:
- ld8 r16=[r15] // read value
+ add r16=in0,r17 // BD + A
;;
- add r16=r16,in0 // relocate it
- ;;
- st8 [r15]=r16 // and store it back
+ st8 [r15]=r16 // word64 (LSB)
br.cond.sptk.few 3b
-
+
5:
- extr.u r23=r16,32,32 // ELF64_R_SYM(r16)
- ;;
- setf.sig f10=r23 // so we can multiply
- ;;
- xma.lu f10=f10,f9,f8 // f10=symtab + r_sym*syment
- ;;
- getf.sig r16=f10
- ;;
- add r16=8,r16 // address of st_value
- ;;
- ld8 r16=[r16] // read symbol value
- ;;
- add r16=r16,in0 // relocate symbol value
+ add r16=r16,r17 // S + A
;;
+ st8 [r15]=r16 // word64 (LSB)
+ br.cond.sptk.few 3b
+
+6:
movl r17=@gprel(fptr_storage)
;;
add r17=r17,gp // start of fptrs
;;
-6: cmp.geu p6,p0=r17,r2 // end of fptrs?
-(p6) br.cond.dpnt.few 7f // can't find existing fptr
+7: cmp.geu p6,p0=r17,r2 // end of fptrs?
+(p6) br.cond.dpnt.few 8f // can't find existing fptr
ld8 r20=[r17] // read function from fptr
;;
cmp.eq p6,p0=r16,r20 // same function?
- ;;
+ ;;
(p6) st8 [r15]=r17 // reuse fptr
(p6) br.cond.sptk.few 3b // done
add r17=16,r17 // next fptr
- br.cond.sptk.few 6b
-
-7: // allocate new fptr
+ br.cond.sptk.few 7b
+
+8: // allocate new fptr
mov r8=1 // failure return value
- ;;
cmp.geu p6,p0=r2,r3 // space left?
(p6) br.cond.dpnt.few 9f // bail out
@@ -501,10 +502,10 @@ STATIC_ENTRY(_reloc, 1)
br.ret.sptk.few rp
END(_reloc)
-
+
.data
.align 16
-
-fptr_storage:
+ .global fptr_storage
+fptr_storage:
.space 4096*16 // XXX
-fptr_storage_end:
+fptr_storage_end: