summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2002-04-10 16:35:44 +0000
committerdfr <dfr@FreeBSD.org>2002-04-10 16:35:44 +0000
commit5204e59cad0ee69973a65608dd7a6f895e5a2e1f (patch)
treed2bf5d72a31178a7ba733ef95413435d333c4f1f /sys/ia64
parent6cda5b411a9544bca5f9acd8d1ce92cfa8fb1b62 (diff)
downloadFreeBSD-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.S43
-rw-r--r--sys/ia64/ia64/exception.s43
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
OpenPOWER on IntegriCloud