diff options
author | dfr <dfr@FreeBSD.org> | 2001-11-02 10:24:44 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2001-11-02 10:24:44 +0000 |
commit | 71aecf4a81e9b4118714d448f0af015e292ab6f4 (patch) | |
tree | 72d0c7f7030ee2264139def42a47cd8919926e67 | |
parent | 7438cac08a5b71a7a4a62cfe21bfa6f5ab93933d (diff) | |
download | FreeBSD-src-71aecf4a81e9b4118714d448f0af015e292ab6f4.zip FreeBSD-src-71aecf4a81e9b4118714d448f0af015e292ab6f4.tar.gz |
Call ast() from exception_restore when we are restoring to user mode.
-rw-r--r-- | sys/ia64/ia64/exception.S | 20 | ||||
-rw-r--r-- | sys/ia64/ia64/exception.s | 20 |
2 files changed, 24 insertions, 16 deletions
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S index 0352827..acf405e 100644 --- a/sys/ia64/ia64/exception.S +++ b/sys/ia64/ia64/exception.S @@ -948,20 +948,24 @@ ia64_vhpt: .quad 0 */ ENTRY(exception_restore, 0) - rsm psr.ic|psr.dt|psr.i // disable interrupt collection and vm - add r3=16,sp; + alloc r14=ar.pfs,0,0,1,0 // in case we call ast() + add r3=TF_CR_IPSR+16,sp ;; - srlz.i - dep r3=0,r3,61,3 // physical address - ;; - add r16=TF_CR_IPSR,r3 - ;; - ld8 rIPSR=[r16] + ld8 rIPSR=[r3] ;; extr.u r16=rIPSR,32,2 // extract ipsr.cpl ;; cmp.eq p1,p2=r0,r16 // test for return to kernel mode ;; +(p2) add out0=16,sp // trapframe argument to ast() +(p2) br.call.dptk.many rp=ast // note: p1, p2 preserved + + rsm psr.ic|psr.dt|psr.i // disable interrupt collection and vm + add r3=16,sp; + ;; + srlz.i + dep r3=0,r3,61,3 // physical address + ;; (p2) add r16=SIZEOF_TRAPFRAME+16,sp // restore ar.k6 (kernel sp) ;; (p2) mov ar.k6=r16 diff --git a/sys/ia64/ia64/exception.s b/sys/ia64/ia64/exception.s index 0352827..acf405e 100644 --- a/sys/ia64/ia64/exception.s +++ b/sys/ia64/ia64/exception.s @@ -948,20 +948,24 @@ ia64_vhpt: .quad 0 */ ENTRY(exception_restore, 0) - rsm psr.ic|psr.dt|psr.i // disable interrupt collection and vm - add r3=16,sp; + alloc r14=ar.pfs,0,0,1,0 // in case we call ast() + add r3=TF_CR_IPSR+16,sp ;; - srlz.i - dep r3=0,r3,61,3 // physical address - ;; - add r16=TF_CR_IPSR,r3 - ;; - ld8 rIPSR=[r16] + ld8 rIPSR=[r3] ;; extr.u r16=rIPSR,32,2 // extract ipsr.cpl ;; cmp.eq p1,p2=r0,r16 // test for return to kernel mode ;; +(p2) add out0=16,sp // trapframe argument to ast() +(p2) br.call.dptk.many rp=ast // note: p1, p2 preserved + + rsm psr.ic|psr.dt|psr.i // disable interrupt collection and vm + add r3=16,sp; + ;; + srlz.i + dep r3=0,r3,61,3 // physical address + ;; (p2) add r16=SIZEOF_TRAPFRAME+16,sp // restore ar.k6 (kernel sp) ;; (p2) mov ar.k6=r16 |