diff options
author | dfr <dfr@FreeBSD.org> | 2002-04-10 16:35:44 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2002-04-10 16:35:44 +0000 |
commit | 5204e59cad0ee69973a65608dd7a6f895e5a2e1f (patch) | |
tree | d2bf5d72a31178a7ba733ef95413435d333c4f1f /sys/ia64 | |
parent | 6cda5b411a9544bca5f9acd8d1ce92cfa8fb1b62 (diff) | |
download | FreeBSD-src-5204e59cad0ee69973a65608dd7a6f895e5a2e1f.zip FreeBSD-src-5204e59cad0ee69973a65608dd7a6f895e5a2e1f.tar.gz |
Call ast() from the syscall exit path as well as for full exception
restores.
Diffstat (limited to 'sys/ia64')
-rw-r--r-- | sys/ia64/ia64/exception.S | 43 | ||||
-rw-r--r-- | sys/ia64/ia64/exception.s | 43 |
2 files changed, 84 insertions, 2 deletions
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S index fabff37..f89e660 100644 --- a/sys/ia64/ia64/exception.S +++ b/sys/ia64/ia64/exception.S @@ -1406,8 +1406,49 @@ ENTRY(do_syscall, 0) mov out1=r16 // arguments add out2=(8*8),r16 // trapframe pointer br.call.sptk.many rp=syscall // do the work +} { .mmi +3: rsm psr.i // we know that psr.i == 1 + add r14=PC_CURTHREAD,r13 // &curthread + nop.i 0 + ;; +} { .mmi + ld8 r14=[r14] // curthread + ;; + add r14=TD_KSE,r14 // &curthread->td_kse + nop.i 0 + ;; +} { .mmi + ld8 r14=[r14] // curkse + ;; + add r14=KE_FLAGS,r14 // &curkse->ke_flags + nop.i 0 + ;; +} { .mmi + ld4 r14=[r14] // curkse->ke_flags + ;; + nop.m 0 + tbit.nz p6,p7=r14,10 // KEF_ASTPENDING + ;; +} { .mib + nop.m 0 +(p7) tbit.nz.or.andcm p6,p7=r14,11 // KEF_NEEDRESCHED +(p7) br.cond.dptk 2f + ;; +} { .mmi + ssm psr.i // restore interrupts + ;; + srlz.d + mov out0=loc0 // trapframe argument to ast() +} { .mib + nop.m 0 + nop.i 0 + br.call.sptk.many rp=ast +} { .mib + nop.m 0 + nop.i 0 + br 3b } { .mii - ld8 r14=[loc0] // check tf_flags +2: ld8 r14=[loc0] // check tf_flags dep r15=0,loc0,61,3 // physical address of trapframe ;; tbit.z p6,p0=r14,0 // check FRAME_SYSCALL bit diff --git a/sys/ia64/ia64/exception.s b/sys/ia64/ia64/exception.s index fabff37..f89e660 100644 --- a/sys/ia64/ia64/exception.s +++ b/sys/ia64/ia64/exception.s @@ -1406,8 +1406,49 @@ ENTRY(do_syscall, 0) mov out1=r16 // arguments add out2=(8*8),r16 // trapframe pointer br.call.sptk.many rp=syscall // do the work +} { .mmi +3: rsm psr.i // we know that psr.i == 1 + add r14=PC_CURTHREAD,r13 // &curthread + nop.i 0 + ;; +} { .mmi + ld8 r14=[r14] // curthread + ;; + add r14=TD_KSE,r14 // &curthread->td_kse + nop.i 0 + ;; +} { .mmi + ld8 r14=[r14] // curkse + ;; + add r14=KE_FLAGS,r14 // &curkse->ke_flags + nop.i 0 + ;; +} { .mmi + ld4 r14=[r14] // curkse->ke_flags + ;; + nop.m 0 + tbit.nz p6,p7=r14,10 // KEF_ASTPENDING + ;; +} { .mib + nop.m 0 +(p7) tbit.nz.or.andcm p6,p7=r14,11 // KEF_NEEDRESCHED +(p7) br.cond.dptk 2f + ;; +} { .mmi + ssm psr.i // restore interrupts + ;; + srlz.d + mov out0=loc0 // trapframe argument to ast() +} { .mib + nop.m 0 + nop.i 0 + br.call.sptk.many rp=ast +} { .mib + nop.m 0 + nop.i 0 + br 3b } { .mii - ld8 r14=[loc0] // check tf_flags +2: ld8 r14=[loc0] // check tf_flags dep r15=0,loc0,61,3 // physical address of trapframe ;; tbit.z p6,p0=r14,0 // check FRAME_SYSCALL bit |