diff options
author | dfr <dfr@FreeBSD.org> | 2002-04-10 19:26:49 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2002-04-10 19:26:49 +0000 |
commit | c3e2d40f397d61f5575d155ad84f66737b4d7290 (patch) | |
tree | f1b0cb46b0ec40683264ce9e92721a3a6fef9a85 | |
parent | cbaa136e15a591eceb1b56208ef1aa7e64ccd4a9 (diff) | |
download | FreeBSD-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.
-rw-r--r-- | sys/ia64/ia64/support.S | 55 | ||||
-rw-r--r-- | sys/ia64/ia64/support.s | 55 |
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 |