summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2002-04-10 19:26:49 +0000
committerdfr <dfr@FreeBSD.org>2002-04-10 19:26:49 +0000
commitc3e2d40f397d61f5575d155ad84f66737b4d7290 (patch)
treef1b0cb46b0ec40683264ce9e92721a3a6fef9a85 /sys/ia64
parentcbaa136e15a591eceb1b56208ef1aa7e64ccd4a9 (diff)
downloadFreeBSD-src-c3e2d40f397d61f5575d155ad84f66737b4d7290.zip
FreeBSD-src-c3e2d40f397d61f5575d155ad84f66737b4d7290.tar.gz
Add suhword() and fuhword() for accessing 32-bit values ("half words") in
userland. All these functions should be renamed to be explicit about the size of value being read or written.
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/support.S55
-rw-r--r--sys/ia64/ia64/support.s55
2 files changed, 110 insertions, 0 deletions
diff --git a/sys/ia64/ia64/support.S b/sys/ia64/ia64/support.S
index 3bd5d62..7e6d137 100644
--- a/sys/ia64/ia64/support.S
+++ b/sys/ia64/ia64/support.S
@@ -220,6 +220,34 @@ ENTRY(suword, 2)
END(suword)
+ENTRY(suhword, 2)
+
+ movl r14=VM_MAXUSER_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
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=TD_PCB,r15 // find pcb
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=PCB_ONFAULT,r15
+ ;;
+ st8 [r15]=r14
+ ;;
+ st4.rel [in0]=in1 // try the store
+ ;;
+ st8 [r15]=r0 // clean up
+
+ mov ret0=r0
+ br.ret.sptk.few rp
+
+END(suhword)
+
ENTRY(subyte, 2)
movl r14=VM_MAXUSER_ADDRESS;; // make sure address is ok
@@ -275,6 +303,33 @@ ENTRY(fuword, 1)
END(fuword)
+ENTRY(fuhword, 1)
+
+ movl r14=VM_MAXUSER_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
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=TD_PCB,r15 // find pcb
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=PCB_ONFAULT,r15
+ ;;
+ st8 [r15]=r14
+ ;;
+ ld4.acq ret0=[in0] // try the fetch
+ ;;
+ st8 [r15]=r0 // clean up
+
+ br.ret.sptk.few rp
+
+END(fuhword)
+
ENTRY(fubyte, 1)
movl r14=VM_MAXUSER_ADDRESS;; // make sure address is ok
diff --git a/sys/ia64/ia64/support.s b/sys/ia64/ia64/support.s
index 3bd5d62..7e6d137 100644
--- a/sys/ia64/ia64/support.s
+++ b/sys/ia64/ia64/support.s
@@ -220,6 +220,34 @@ ENTRY(suword, 2)
END(suword)
+ENTRY(suhword, 2)
+
+ movl r14=VM_MAXUSER_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
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=TD_PCB,r15 // find pcb
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=PCB_ONFAULT,r15
+ ;;
+ st8 [r15]=r14
+ ;;
+ st4.rel [in0]=in1 // try the store
+ ;;
+ st8 [r15]=r0 // clean up
+
+ mov ret0=r0
+ br.ret.sptk.few rp
+
+END(suhword)
+
ENTRY(subyte, 2)
movl r14=VM_MAXUSER_ADDRESS;; // make sure address is ok
@@ -275,6 +303,33 @@ ENTRY(fuword, 1)
END(fuword)
+ENTRY(fuhword, 1)
+
+ movl r14=VM_MAXUSER_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
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=TD_PCB,r15 // find pcb
+ ;;
+ ld8 r15=[r15]
+ ;;
+ add r15=PCB_ONFAULT,r15
+ ;;
+ st8 [r15]=r14
+ ;;
+ ld4.acq ret0=[in0] // try the fetch
+ ;;
+ st8 [r15]=r0 // clean up
+
+ br.ret.sptk.few rp
+
+END(fuhword)
+
ENTRY(fubyte, 1)
movl r14=VM_MAXUSER_ADDRESS;; // make sure address is ok
OpenPOWER on IntegriCloud