From bf986ce4eaf37ef3dbeb2aeb73b283bfebab468c Mon Sep 17 00:00:00 2001 From: dfr Date: Thu, 19 Oct 2000 20:36:31 +0000 Subject: * 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. --- sys/ia64/ia64/exception.S | 6 ++++-- sys/ia64/ia64/exception.s | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'sys/ia64') 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 -- cgit v1.1