aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2003-05-27 01:00:12 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2003-05-27 01:00:12 +0000
commita47e5d473bd2df9fbc923483f4a0775ebdfff039 (patch)
treef8b249faadd31ff6ea0d8d91f281609ae6a492ad
parent941a05766365b7fe84408c90d60461474eef2457 (diff)
Notes
-rw-r--r--sys/ia64/ia64/machdep.c6
-rw-r--r--sys/ia64/ia64/support.S535
-rw-r--r--sys/ia64/ia64/support.s535
3 files changed, 840 insertions, 236 deletions
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index 7386ce33cf862..65e98ff95fc89 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -1366,9 +1366,3 @@ ia64_pack_bundle(u_int64_t *lowp, u_int64_t *highp,
*lowp = low;
*highp = high;
}
-
-intptr_t
-casuptr(intptr_t *p, intptr_t old, intptr_t new)
-{
- return (-1);
-}
diff --git a/sys/ia64/ia64/support.S b/sys/ia64/ia64/support.S
index 7403a017bf3cb..252ab23b2b5b4 100644
--- a/sys/ia64/ia64/support.S
+++ b/sys/ia64/ia64/support.S
@@ -181,179 +181,484 @@ ENTRY(ia64_call_efi_physical, 6)
END(ia64_call_efi_physical)
/**************************************************************************/
-
+
+ENTRY(fusufault, 0)
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault.
+ add ret0=-1,r0
+ br.ret.sptk rp
+ ;;
+}
+END(fusufault)
+
/*
- * fu{byte,word} : fetch a byte (word) from user memory
+ * casuptr(intptr_t *p, intptr_t old, intptr_t new)
+ * Perform a compare-exchange in user space.
*/
-
-ENTRY(suword64, 2)
-XENTRY(suword)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
-
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(casuptr, 3)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ mov ar.ccv=in1
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- add r15=PCB_ONFAULT,r15
+ cmpxchg8.rel ret0=[in0],in2,ar.ccv
+ nop 0
;;
- st8 [r15]=r14
+}
+{ .mfb
+ st8.rel [r15]=r0 // Clear onfault
+ nop 0
+ br.ret.sptk rp
;;
- st8.rel [in0]=in1 // try the store
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
;;
- st8 [r15]=r0 // clean up
+}
+END(casuptr)
- mov ret0=r0
- br.ret.sptk.few rp
-END(suword64)
-
-ENTRY(suword32, 2)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+/*
+ * subyte(void *addr, int byte)
+ * suword16(void *addr, int word)
+ * suword32(void *addr, int word)
+ * suword64|suword(void *addr, long word)
+ * Store in user space
+ */
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(subyte, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
;;
- add r15=PCB_ONFAULT,r15
+ nop 0
+ add r15=PCB_ONFAULT,r15
;;
- st8 [r15]=r14
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- st4.rel [in0]=in1 // try the store
+ st1.rel [in0]=in1
+ nop 0
;;
- st8 [r15]=r0 // clean up
-
- mov ret0=r0
- br.ret.sptk.few rp
-END(suword32)
-
-ENTRY(subyte, 2)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(subyte)
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(suword16, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
;;
- add r15=PCB_ONFAULT,r15
+ nop 0
+ add r15=PCB_ONFAULT,r15
;;
- st8 [r15]=r14
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- st1.rel [in0]=in1 // try the store
+ st2.rel [in0]=in1
+ nop 0
;;
- st8 [r15]=r0 // clean up
-
- mov ret0=r0
- br.ret.sptk.few rp
-END(subyte)
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suword16)
-ENTRY(fuword64, 1)
-XENTRY(fuword)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+ENTRY(suword32, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
+ ;;
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
+ ;;
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
+ ;;
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
+ ;;
+ st4.rel [in0]=in1
+ nop 0
+ ;;
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suword32)
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(suword64, 2)
+XENTRY(suword)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
;;
- add r15=PCB_ONFAULT,r15
+ nop 0
+ add r15=PCB_ONFAULT,r15
;;
- st8 [r15]=r14
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- ld8.acq ret0=[in0] // try the fetch
+ st8.rel [in0]=in1
+ nop 0
;;
- st8 [r15]=r0 // clean up
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suword64)
- br.ret.sptk.few rp
-END(fuword64)
+/*
+ * fubyte(void *addr, int byte)
+ * fuword16(void *addr, int word)
+ * fuword32(void *addr, int word)
+ * fuword64|fuword(void *addr, long word)
+ * Fetch from user space
+ */
-ENTRY(fuword32, 1)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+ENTRY(fubyte, 1)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
+ ;;
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
+ ;;
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
+ ;;
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
+ ;;
+ mf
+ nop 0
+ ;;
+}
+{ .mmb
+ ld1 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(fubyte)
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(fuword16, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- add r15=PCB_ONFAULT,r15
+ mf
+ nop 0
;;
- st8 [r15]=r14
+}
+{ .mmb
+ ld2 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
;;
- ld4.acq ret0=[in0] // try the fetch
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
;;
- st8 [r15]=r0 // clean up
+}
+END(fuword16)
- br.ret.sptk.few rp
+ENTRY(fuword32, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
+ ;;
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
+ ;;
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
+ ;;
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
+ ;;
+ mf
+ nop 0
+ ;;
+}
+{ .mmb
+ ld4 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
END(fuword32)
-ENTRY(fubyte, 1)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
-
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(fuword64, 2)
+XENTRY(fuword)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- add r15=PCB_ONFAULT,r15
+ mf
+ nop 0
;;
- st8 [r15]=r14
+}
+{ .mmb
+ ld8 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
;;
- ld1.acq ret0=[in0] // try the fetch
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
;;
- st8 [r15]=r0 // clean up
+}
+END(fuword64)
+
+/*
+ * fuswintr(void *addr)
+ * suswintr(void *addr)
+ */
- br.ret.sptk.few rp
-END(fubyte)
-
-ENTRY(fusufault, 0)
- st8 [r15]=r0 ;; // r15 points at onfault
- mov ret0=r0
- br.ret.sptk.few rp
-END(fusufault)
-
ENTRY(fswintrberr, 0)
-XENTRY(fuswintr) /* XXX 16 bit short for profiling */
-XENTRY(suswintr) /* XXX 16 bit short for profiling */
- mov ret0=-1
- br.ret.sptk.few rp
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
END(fswintrberr)
-
+
+ENTRY(fuswintr, 1)
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(fuswintr)
+
+ENTRY(suswintr, 0)
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suswintr)
+
/**************************************************************************/
/*
diff --git a/sys/ia64/ia64/support.s b/sys/ia64/ia64/support.s
index 7403a017bf3cb..252ab23b2b5b4 100644
--- a/sys/ia64/ia64/support.s
+++ b/sys/ia64/ia64/support.s
@@ -181,179 +181,484 @@ ENTRY(ia64_call_efi_physical, 6)
END(ia64_call_efi_physical)
/**************************************************************************/
-
+
+ENTRY(fusufault, 0)
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault.
+ add ret0=-1,r0
+ br.ret.sptk rp
+ ;;
+}
+END(fusufault)
+
/*
- * fu{byte,word} : fetch a byte (word) from user memory
+ * casuptr(intptr_t *p, intptr_t old, intptr_t new)
+ * Perform a compare-exchange in user space.
*/
-
-ENTRY(suword64, 2)
-XENTRY(suword)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
-
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(casuptr, 3)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ mov ar.ccv=in1
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- add r15=PCB_ONFAULT,r15
+ cmpxchg8.rel ret0=[in0],in2,ar.ccv
+ nop 0
;;
- st8 [r15]=r14
+}
+{ .mfb
+ st8.rel [r15]=r0 // Clear onfault
+ nop 0
+ br.ret.sptk rp
;;
- st8.rel [in0]=in1 // try the store
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
;;
- st8 [r15]=r0 // clean up
+}
+END(casuptr)
- mov ret0=r0
- br.ret.sptk.few rp
-END(suword64)
-
-ENTRY(suword32, 2)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+/*
+ * subyte(void *addr, int byte)
+ * suword16(void *addr, int word)
+ * suword32(void *addr, int word)
+ * suword64|suword(void *addr, long word)
+ * Store in user space
+ */
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(subyte, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
;;
- add r15=PCB_ONFAULT,r15
+ nop 0
+ add r15=PCB_ONFAULT,r15
;;
- st8 [r15]=r14
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- st4.rel [in0]=in1 // try the store
+ st1.rel [in0]=in1
+ nop 0
;;
- st8 [r15]=r0 // clean up
-
- mov ret0=r0
- br.ret.sptk.few rp
-END(suword32)
-
-ENTRY(subyte, 2)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(subyte)
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(suword16, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
;;
- add r15=PCB_ONFAULT,r15
+ nop 0
+ add r15=PCB_ONFAULT,r15
;;
- st8 [r15]=r14
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- st1.rel [in0]=in1 // try the store
+ st2.rel [in0]=in1
+ nop 0
;;
- st8 [r15]=r0 // clean up
-
- mov ret0=r0
- br.ret.sptk.few rp
-END(subyte)
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suword16)
-ENTRY(fuword64, 1)
-XENTRY(fuword)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+ENTRY(suword32, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
+ ;;
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
+ ;;
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
+ ;;
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
+ ;;
+ st4.rel [in0]=in1
+ nop 0
+ ;;
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suword32)
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(suword64, 2)
+XENTRY(suword)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
;;
- add r15=PCB_ONFAULT,r15
+ nop 0
+ add r15=PCB_ONFAULT,r15
;;
- st8 [r15]=r14
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- ld8.acq ret0=[in0] // try the fetch
+ st8.rel [in0]=in1
+ nop 0
;;
- st8 [r15]=r0 // clean up
+}
+{ .mib
+ st8.rel [r15]=r0 // Clear onfault
+ mov ret0=r0
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suword64)
- br.ret.sptk.few rp
-END(fuword64)
+/*
+ * fubyte(void *addr, int byte)
+ * fuword16(void *addr, int word)
+ * fuword32(void *addr, int word)
+ * fuword64|fuword(void *addr, long word)
+ * Fetch from user space
+ */
-ENTRY(fuword32, 1)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
+ENTRY(fubyte, 1)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
+ ;;
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
+ ;;
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
+ ;;
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
+ ;;
+ mf
+ nop 0
+ ;;
+}
+{ .mmb
+ ld1 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(fubyte)
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(fuword16, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- add r15=PCB_ONFAULT,r15
+ mf
+ nop 0
;;
- st8 [r15]=r14
+}
+{ .mmb
+ ld2 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
;;
- ld4.acq ret0=[in0] // try the fetch
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
;;
- st8 [r15]=r0 // clean up
+}
+END(fuword16)
- br.ret.sptk.few rp
+ENTRY(fuword32, 2)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
+ ;;
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
+ ;;
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
+ ;;
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
+ ;;
+ mf
+ nop 0
+ ;;
+}
+{ .mmb
+ ld4 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
+ ;;
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
END(fuword32)
-ENTRY(fubyte, 1)
- movl r14=VM_MAX_ADDRESS;; // make sure address is ok
- cmp.geu p6,p0=in0,r14
-(p6) br.dpnt.few fusufault
-
- movl r14=fusufault // set up fault handler.
- add r15=PC_CURTHREAD,r13 // find curthread
+ENTRY(fuword64, 2)
+XENTRY(fuword)
+{ .mlx
+ add r15=PC_CURTHREAD,r13
+ movl r14=VM_MAX_ADDRESS
;;
- ld8 r15=[r15]
+}
+{ .mib
+ ld8 r15=[r15] // r15 = curthread
+ cmp.geu p6,p0=in0,r14
+(p6) br.dpnt.few 1f
;;
- add r15=TD_PCB,r15 // find pcb
+}
+{ .mlx
+ add r15=TD_PCB,r15
+ movl r14=fusufault
;;
- ld8 r15=[r15]
+}
+{ .mmi
+ ld8 r15=[r15] // r15 = PCB
+ ;;
+ nop 0
+ add r15=PCB_ONFAULT,r15
+ ;;
+}
+{ .mmi
+ st8 [r15]=r14 // Set onfault
;;
- add r15=PCB_ONFAULT,r15
+ mf
+ nop 0
;;
- st8 [r15]=r14
+}
+{ .mmb
+ ld8 ret0=[in0]
+ st8.rel [r15]=r0 // Clear onfault
+ br.ret.sptk rp
;;
- ld1.acq ret0=[in0] // try the fetch
+}
+1:
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
;;
- st8 [r15]=r0 // clean up
+}
+END(fuword64)
+
+/*
+ * fuswintr(void *addr)
+ * suswintr(void *addr)
+ */
- br.ret.sptk.few rp
-END(fubyte)
-
-ENTRY(fusufault, 0)
- st8 [r15]=r0 ;; // r15 points at onfault
- mov ret0=r0
- br.ret.sptk.few rp
-END(fusufault)
-
ENTRY(fswintrberr, 0)
-XENTRY(fuswintr) /* XXX 16 bit short for profiling */
-XENTRY(suswintr) /* XXX 16 bit short for profiling */
- mov ret0=-1
- br.ret.sptk.few rp
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
END(fswintrberr)
-
+
+ENTRY(fuswintr, 1)
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(fuswintr)
+
+ENTRY(suswintr, 0)
+{ .mfb
+ add ret0=-1,r0
+ nop 0
+ br.ret.sptk rp
+ ;;
+}
+END(suswintr)
+
/**************************************************************************/
/*