summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgallatin <gallatin@FreeBSD.org>2001-03-28 01:19:41 +0000
committergallatin <gallatin@FreeBSD.org>2001-03-28 01:19:41 +0000
commitbffff76146178f4d1b6bbc49ac09587cfa9748cc (patch)
treeeff09ff59229297e596667031cc59f4c107566c8
parentd9266b41a23df064770c1328cd76e1083cd63bee (diff)
downloadFreeBSD-src-bffff76146178f4d1b6bbc49ac09587cfa9748cc.zip
FreeBSD-src-bffff76146178f4d1b6bbc49ac09587cfa9748cc.tar.gz
Check whether we need to do a full restore after handling ASTs. If
an AST results in a signal being delivered, we'll need to do a full register restore so as to properly setup the signal handler. This is somewhat of a pessimization, because ast() will be called twice in this case. This fixes several problems that have been reported where signal intensive userland apps (most notably dump) have been SEGV'ing for no fault of their own. Thanks to Peter Jeremy <peter.jeremy@alcatel.com.au> for presenting the AST scenario which led to me fiinally figuring this out. Reviewed by: jhb
-rw-r--r--sys/alpha/alpha/exception.s8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/alpha/alpha/exception.s b/sys/alpha/alpha/exception.s
index f2febd0..bc8ee57 100644
--- a/sys/alpha/alpha/exception.s
+++ b/sys/alpha/alpha/exception.s
@@ -130,15 +130,15 @@
XentSys1: LDGP(pv)
CALL(syscall)
+ /* Handle any AST's. */
+ mov sp, a0 /* only arg is frame */
+ CALL(ast)
+
/* see if we need a full exception_return */
ldq t1, (FRAME_FLAGS*8)(sp)
and t1, FRAME_FLAGS_SYSCALL
beq t1, exception_return
- /* Handle any AST's. */
- mov sp, a0 /* only arg is frame */
- CALL(ast)
-
/* set the hae register if this process has specified a value */
ldq t0, GD_CURPROC(globalp)
beq t0, 3f
OpenPOWER on IntegriCloud