From b0685df77452a62c671dd9af22040a5fd63c27ec Mon Sep 17 00:00:00 2001 From: Doug Rabson Date: Wed, 10 Apr 2002 19:26:49 +0000 Subject: [PATCH] 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. --- sys/ia64/ia64/support.S | 55 +++++++++++++++++++++++++++++++++++++++++ sys/ia64/ia64/support.s | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/sys/ia64/ia64/support.S b/sys/ia64/ia64/support.S index 3bd5d6226c1f..7e6d137f112f 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 3bd5d6226c1f..7e6d137f112f 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