#include <machine/asm.h>
#include "assym.h"
.text
ENTRY_NOPROFILE(ia64_change_mode, 0)
rsm psr.i | psr.ic
mov r19=ar.rsc
tbit.nz p6,p7=r14,17
;;
mov ar.rsc=0
(p6) mov r15=7
(p7) mov r15=0
flushrs
srlz.i
;;
mov r16=ar.bsp
mov r17=rp
mov r18=ar.rnat
;;
dep r16=r15,r16,61,3
dep r17=r15,r17,61,3
dep sp=r15,sp,61,3
;;
mov ar.bspstore=r16
mov rp=r17
;;
1: mov r16=ip
mov ar.rnat=r18
mov cr.ipsr=r14
;;
add r16=2f-1b,r16
;;
dep r16=r15,r16,61,3
;;
mov cr.iip=r16
mov cr.ifs=r0
;;
rfi
2: mov ar.rsc=r19
br.ret.sptk.few rp
END(ia64_change_mode)
ENTRY(ia64_physical_mode, 0)
mov r14=psr
mov ret0=psr
movl r15=(IA64_PSR_I|IA64_PSR_IT|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFL|IA64_PSR_DFH)
movl r16=IA64_PSR_BN
;;
andcm r14=r14,r15
;;
or r14=r14,r16
or ret0=ret0,r16
br.cond.sptk.many ia64_change_mode
END(ia64_physical_mode)
ENTRY(ia64_call_efi_physical, 6)
.prologue
.regstk 6,4,5,0
.save ar.pfs,loc0
alloc loc0=ar.pfs,6,4,5,0
;;
.save rp,loc1
mov loc1=rp
;;
.body
br.call.sptk.many rp=ia64_physical_mode
;;
mov loc2=r8
mov loc3=gp
ld8 r14=[in0],8
;;
mov out0=in1
mov out1=in2
mov out2=in3
mov out3=in4
mov out4=in5
ld8 gp=[in0]
;;
mov b6=r14
;;
br.call.sptk.many rp=b6
mov gp=loc3
;;
mov r14=loc2
br.call.sptk.many rp=ia64_change_mode
;;
mov rp=loc1
mov ar.pfs=loc0
;;
br.ret.sptk.many rp
END(ia64_call_efi_physical)
ENTRY(fusufault, 0)
{ .mib
st8.rel [r15]=r0
add ret0=-1,r0
br.ret.sptk rp
;;
}
END(fusufault)
ENTRY(casuptr, 3)
{ .mlx
add r15=PC_CURLWP,r13
movl r14=VM_MAX_ADDRESS
;;
}
{ .mib
ld8 r15=[r15]
cmp.geu p6,p0=in0,r14
(p6) br.dpnt.few 1f
;;
}
{ .mlx
add r15=L_PCB,r15
movl r14=fusufault
;;
}
{ .mmi
ld8 r15=[r15]
;;
mov ar.ccv=in1
add r15=PCB_ONFAULT,r15
;;
}
{ .mmi
st8 [r15]=r14
;;
cmpxchg8.rel ret0=[in0],in2,ar.ccv
nop 0
;;
}
{ .mfb
st8.rel [r15]=r0
nop 0
br.ret.sptk rp
;;
}
1:
{ .mfb
add ret0=-1,r0
nop 0
br.ret.sptk rp
;;
}
END(casuptr)
ENTRY(ufetchstore_fault, 0)
{ .mfb
st8.rel [r15]=r0
nop 0
br.ret.sptk rp
;;
}
END(ufetchstore_fault)
#define UFETCH(load_insn, store_insn) \
{ .mlx ;\
add r15=PC_CURLWP,r13 ;\
movl r14=VM_MAX_ADDRESS ;;\
} ;\
{ .mib ;\
ld8 r15=[r15] ;\
cmp.geu p6,p0=in0,r14 ;\
(p6) br.dpnt.few 1f ;;\
} ;\
{ .mlx ;\
add r15=L_PCB,r15 ;\
movl r14=ufetchstore_fault ;;\
} ;\
{ .mmi ;\
ld8 r15=[r15] ;;\
nop 0 ;\
add r15=PCB_ONFAULT,r15 ;;\
} ;\
{ .mmi ;\
st8 [r15]=r14 ;;\
\
mf ;\
nop 0 ;;\
} ;\
{ .mmi ;\
load_insn r14=[in0] ;;\
st8.rel [r15]=r0 ;\
nop 0 ;;\
} ;\
{ .mib ;\
store_insn [in1]=r14 ;\
mov ret0=r0 ;\
br.ret.sptk rp ;;\
} ;\
1: \
{ .mfb ;\
mov ret0=EFAULT ;\
nop 0 ;\
br.ret.sptk rp ;;\
}
ENTRY(_ufetch_8, 2)
UFETCH(ld1, st1)
END(_ufetch_8)
ENTRY(_ufetch_16, 2)
UFETCH(ld2, st2)
END(_ufetch_16)
ENTRY(_ufetch_32, 2)
UFETCH(ld4, st4)
END(_ufetch_32)
ENTRY(_ufetch_64, 2)
UFETCH(ld8, st8)
END(_ufetch_64)
#define USTORE(store_insn) \
{ .mlx ;\
add r15=PC_CURLWP,r13 ;\
movl r14=VM_MAX_ADDRESS ;;\
} ;\
{ .mib ;\
ld8 r15=[r15] ;\
cmp.geu p6,p0=in0,r14 ;\
(p6) br.dpnt.few 1f ;;\
} ;\
{ .mlx ;\
add r15=L_PCB,r15 ;\
movl r14=ufetchstore_fault ;;\
} ;\
{ .mmi ;\
ld8 r15=[r15] ;;\
nop 0 ;\
add r15=PCB_ONFAULT,r15 ;;\
} ;\
{ .mmi ;\
st8 [r15]=r14 ;;\
\
store_insn [in0]=in1 ;\
nop 0 ;;\
} ;\
{ .mib ;\
st8.rel [r15]=r0 ;\
mov ret0=r0 ;\
br.ret.sptk rp ;;\
} ;\
1: \
{ .mfb ;\
mov ret0=EFAULT ;\
nop 0 ;\
br.ret.sptk rp ;;\
}
ENTRY(_ustore_8, 2)
USTORE(st1.rel)
END(_ustore_8)
ENTRY(_ustore_16, 2)
USTORE(st2.rel)
END(_ustore_16)
ENTRY(_ustore_32, 2)
USTORE(st4.rel)
END(_ustore_32)
ENTRY(_ustore_64, 2)
USTORE(st8.rel)
END(_ustore_64)
ENTRY(ia64_copystr, 4)
mov r14=in2
cmp.eq p6,p0=r0,in2
(p6) br.cond.spnt.few 2f
1: ld1 r15=[in0],1
;;
st1 [in1]=r15,1
add in2=-1,in2
;;
cmp.eq p6,p0=r0,r15
cmp.ne p7,p0=r0,in2
;;
(p6) br.cond.spnt.few 2f
(p7) br.cond.sptk.few 1b
2: cmp.eq p6,p0=r0,in3
(p6) br.cond.dpnt.few 3f
sub r14=r14,in2
;;
st8 [in3]=r14
3: cmp.eq p6,p0=r0,r15
(p6) br.cond.spnt.few 4f
mov ret0=ENAMETOOLONG
br.ret.sptk.few rp
4: mov ret0=0
br.ret.sptk.few rp
END(ia64_copystr)
ENTRY(copyinstr, 4)
.prologue
.regstk 4, 3, 4, 0
.save ar.pfs,loc0
alloc loc0=ar.pfs,4,3,4,0
.save rp,loc1
mov loc1=rp
.body
movl loc2=VM_MAX_ADDRESS
;;
cmp.geu p6,p0=in0,loc2
;;
(p6) br.cond.spnt.few copyefault
movl r14=copyerr
add r15=PC_CURLWP,r13
;;
ld8 r15=[r15]
;;
add r15=L_PCB,r15
;;
ld8 r15=[r15]
;;
add loc2=PCB_ONFAULT,r15
;;
st8 [loc2]=r14
;;
mov out0=in0
mov out1=in1
mov out2=in2
mov out3=in3
;;
br.call.sptk.few rp=ia64_copystr
st8 [loc2]=r0
mov ar.pfs=loc0
mov rp=loc1
br.ret.sptk.few rp
END(copyinstr)
ENTRY(copyoutstr, 4)
.prologue
.regstk 4, 3, 4, 0
.save ar.pfs,loc0
alloc loc0=ar.pfs,4,3,4,0
.save rp,loc1
mov loc1=rp
.body
movl loc2=VM_MAX_ADDRESS
;;
cmp.geu p6,p0=in1,loc2
;;
(p6) br.cond.spnt.few copyefault
movl r14=copyerr
add r15=PC_CURLWP,r13
;;
ld8 r15=[r15]
;;
add r15=L_PCB,r15
;;
ld8 r15=[r15]
;;
add loc2=PCB_ONFAULT,r15
;;
st8 [loc2]=r14
;;
mov out0=in0
mov out1=in1
mov out2=in2
mov out3=in3
;;
br.call.sptk.few rp=ia64_copystr
st8 [loc2]=r0
mov ar.pfs=loc0
mov rp=loc1
br.ret.sptk.few rp
END(copyoutstr)
ENTRY(kcopy, 3)
.prologue
.regstk 3, 3, 3, 0
.save ar.pfs,loc0
alloc loc0=ar.pfs,3,3,3,0
.save rp,loc1
mov loc1=rp
.body
movl r14=copyerr
add r15=PC_CURLWP,r13
;;
ld8 r15=[r15]
;;
add r15=L_PCB,r15
;;
ld8 r15=[r15]
;;
add loc2=PCB_ONFAULT,r15
;;
st8 [loc2]=r14
;;
mov out0=in0
mov out1=in1
mov out2=in2
mov ret0=r0
;;
br.call.sptk.few rp=bcopy
st8 [loc2]=r0
mov ar.pfs=loc0
mov rp=loc1
br.ret.sptk.few rp
END(kcopy)
ENTRY(copyin, 3)
.prologue
.regstk 3, 3, 3, 0
.save ar.pfs,loc0
alloc loc0=ar.pfs,3,3,3,0
.save rp,loc1
mov loc1=rp
.body
movl loc2=VM_MAX_ADDRESS
;;
cmp.geu p6,p0=in0,loc2
;;
(p6) br.cond.spnt.few copyefault
movl r14=copyerr
add r15=PC_CURLWP,r13
;;
ld8 r15=[r15]
;;
add r15=L_PCB,r15
;;
ld8 r15=[r15]
;;
add loc2=PCB_ONFAULT,r15
;;
st8 [loc2]=r14
;;
mov out0=in0
mov out1=in1
mov out2=in2
mov ret0=r0
;;
br.call.sptk.few rp=bcopy
st8 [loc2]=r0
mov ar.pfs=loc0
mov rp=loc1
br.ret.sptk.few rp
END(copyin)
ENTRY(copyout, 3)
.prologue
.regstk 3, 3, 3, 0
.save ar.pfs,loc0
alloc loc0=ar.pfs,3,3,3,0
.save rp,loc1
mov loc1=rp
.body
movl loc2=VM_MAX_ADDRESS
;;
cmp.geu p6,p0=in1,loc2
;;
(p6) br.cond.spnt.few copyefault
movl r14=copyerr
add r15=PC_CURLWP,r13
;;
ld8 r15=[r15]
;;
add r15=L_PCB,r15
;;
ld8 r15=[r15]
;;
add loc2=PCB_ONFAULT,r15
;;
st8 [loc2]=r14
;;
mov out0=in0
mov out1=in1
mov out2=in2
mov ret0=r0
;;
br.call.sptk.few rp=bcopy
st8 [loc2]=r0
mov ar.pfs=loc0
mov rp=loc1
br.ret.sptk.few rp
END(copyout)
ENTRY(copyerr, 0)
add r14=PC_CURLWP,r13 ;;
ld8 r14=[r14] ;;
add r14=L_PCB,r14 ;;
ld8 r14=[r14] ;;
add r14=PCB_ONFAULT,r14 ;;
st8 [r14]=r0
br.ret.sptk.few rp
END(copyerr)
ENTRY(copyefault, 0)
add r14=PC_CURLWP,r13 ;;
ld8 r14=[r14] ;;
add r14=L_PCB,r14 ;;
ld8 r14=[r14] ;;
add r14=PCB_ONFAULT,r14 ;;
st8 [r14]=r0
mov ret0=EFAULT
br.ret.sptk.few rp
END(copyefault)
#if defined(GPROF)
ENTRY_NOPROFILE(_mcount, 4)
alloc loc0 = ar.pfs, 4, 3, 2, 0
mov loc1 = r8
mov loc2 = rp
;;
mov out0 = in2
mov out1 = rp
br.call.sptk rp = __mcount
;;
1:
mov gp = in1
mov r14 = ip
mov b7 = loc2
;;
add r14 = 2f - 1b, r14
mov ar.pfs = loc0
mov rp = in2
;;
mov b7 = r14
mov b6 = loc2
mov r8 = loc1
mov r14 = in0
br.ret.sptk b7
;;
2:
mov ar.pfs = r14
br.sptk b6
;;
END(_mcount)
#endif