summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2001-11-02 10:24:44 +0000
committerdfr <dfr@FreeBSD.org>2001-11-02 10:24:44 +0000
commit71aecf4a81e9b4118714d448f0af015e292ab6f4 (patch)
tree72d0c7f7030ee2264139def42a47cd8919926e67
parent7438cac08a5b71a7a4a62cfe21bfa6f5ab93933d (diff)
downloadFreeBSD-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.S20
-rw-r--r--sys/ia64/ia64/exception.s20
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
OpenPOWER on IntegriCloud