summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2000-10-19 20:36:31 +0000
committerdfr <dfr@FreeBSD.org>2000-10-19 20:36:31 +0000
commitbf986ce4eaf37ef3dbeb2aeb73b283bfebab468c (patch)
treedbda4a716630caae0a5701380d085b9de1c9cfb2 /sys/ia64
parent8c26f1be2f0b6dac01e9f707d75fb2a0bd8701a7 (diff)
downloadFreeBSD-src-bf986ce4eaf37ef3dbeb2aeb73b283bfebab468c.zip
FreeBSD-src-bf986ce4eaf37ef3dbeb2aeb73b283bfebab468c.tar.gz
* Disable interrupts when restoring a trapframe.
* Make sure we reset ar.k6 (used to hold the kernel stack pointer when we are returning to user mode after a syscall.
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/exception.S6
-rw-r--r--sys/ia64/ia64/exception.s6
2 files changed, 8 insertions, 4 deletions
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S
index 22a482f..786d658 100644
--- a/sys/ia64/ia64/exception.S
+++ b/sys/ia64/ia64/exception.S
@@ -873,7 +873,7 @@ ia64_vhpt: .quad 0
*/
ENTRY(exception_restore, 0)
- rsm psr.ic|psr.dt // disable interrupt collection and vm
+ rsm psr.ic|psr.dt|psr.i // disable interrupt collection and vm
add r3=16,sp;
;;
srlz.d
@@ -1358,12 +1358,14 @@ ENTRY(do_syscall, 0)
(p6) add sp=-16,loc1
(p6) br.dpnt.many exception_restore
- rsm psr.dt|psr.ic // get ready to restore
+ rsm psr.dt|psr.ic|psr.i // get ready to restore
;;
srlz.d // serialise psr.dt and psr.ic
dep r30=0,loc1,61,3 // physical address
mov gp=loc2 // restore user gp
+ add r16=SIZEOF_TRAPFRAME,loc1
;;
+ mov ar.k6=r16 // restore kernel sp
add r30=TF_R+FRAME_SP*8,r30 // &tf_r[FRAME_SP]
mov r15=loc0 // saved syscall number
alloc r14=ar.pfs,0,0,0,0 // discard register frame
diff --git a/sys/ia64/ia64/exception.s b/sys/ia64/ia64/exception.s
index 22a482f..786d658 100644
--- a/sys/ia64/ia64/exception.s
+++ b/sys/ia64/ia64/exception.s
@@ -873,7 +873,7 @@ ia64_vhpt: .quad 0
*/
ENTRY(exception_restore, 0)
- rsm psr.ic|psr.dt // disable interrupt collection and vm
+ rsm psr.ic|psr.dt|psr.i // disable interrupt collection and vm
add r3=16,sp;
;;
srlz.d
@@ -1358,12 +1358,14 @@ ENTRY(do_syscall, 0)
(p6) add sp=-16,loc1
(p6) br.dpnt.many exception_restore
- rsm psr.dt|psr.ic // get ready to restore
+ rsm psr.dt|psr.ic|psr.i // get ready to restore
;;
srlz.d // serialise psr.dt and psr.ic
dep r30=0,loc1,61,3 // physical address
mov gp=loc2 // restore user gp
+ add r16=SIZEOF_TRAPFRAME,loc1
;;
+ mov ar.k6=r16 // restore kernel sp
add r30=TF_R+FRAME_SP*8,r30 // &tf_r[FRAME_SP]
mov r15=loc0 // saved syscall number
alloc r14=ar.pfs,0,0,0,0 // discard register frame
OpenPOWER on IntegriCloud