diff options
| author | Marcel Moolenaar <marcel@FreeBSD.org> | 2003-05-27 01:00:12 +0000 |
|---|---|---|
| committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2003-05-27 01:00:12 +0000 |
| commit | a47e5d473bd2df9fbc923483f4a0775ebdfff039 (patch) | |
| tree | f8b249faadd31ff6ea0d8d91f281609ae6a492ad | |
| parent | 941a05766365b7fe84408c90d60461474eef2457 (diff) | |
Notes
| -rw-r--r-- | sys/ia64/ia64/machdep.c | 6 | ||||
| -rw-r--r-- | sys/ia64/ia64/support.S | 535 | ||||
| -rw-r--r-- | sys/ia64/ia64/support.s | 535 |
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) + /**************************************************************************/ /* |
