summaryrefslogtreecommitdiff
path: root/lib/libc_r
diff options
context:
space:
mode:
authorMarco S Hyman <marc@cvs.openbsd.org>2001-12-18 03:47:53 +0000
committerMarco S Hyman <marc@cvs.openbsd.org>2001-12-18 03:47:53 +0000
commit3f6ad1541f30e14fda5488e47e3774dd6fb10b9a (patch)
treed3cdc4cf1ed8284153277da0953e0450d650c928 /lib/libc_r
parent6fbd59e5a79f6f04b565a379745844c4aa62f773 (diff)
Allow the scheduler to return to the signal handler and the signal
handler to return instead of calling sigreturn directly. This works around an apparent bug in sparc sigreturn handling. ok fgs@ and noone else has bitched
Diffstat (limited to 'lib/libc_r')
-rw-r--r--lib/libc_r/uthread/uthread_kern.c9
-rw-r--r--lib/libc_r/uthread/uthread_sig.c18
2 files changed, 19 insertions, 8 deletions
diff --git a/lib/libc_r/uthread/uthread_kern.c b/lib/libc_r/uthread/uthread_kern.c
index d9a6108397b..c055b61cb39 100644
--- a/lib/libc_r/uthread/uthread_kern.c
+++ b/lib/libc_r/uthread/uthread_kern.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uthread_kern.c,v 1.17 2001/12/08 14:51:36 fgsch Exp $ */
+/* $OpenBSD: uthread_kern.c,v 1.18 2001/12/18 03:47:52 marc Exp $ */
/*
* Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
* All rights reserved.
@@ -546,7 +546,12 @@ _thread_kern_sched(struct sigcontext * scp)
PTHREAD_CANCEL_ASYNCHRONOUS) != 0))
pthread_testcancel();
- _thread_sys_sigreturn(&_thread_run->saved_sigcontext);
+ /* return to signal handler. This code
+ should be:
+ _thread_sys_sigreturn(&_thread_run->saved_sigcontext);
+ but that doesn't currently work on the
+ sparc */
+ return;
} else {
/*
* This is the normal way out of the scheduler.
diff --git a/lib/libc_r/uthread/uthread_sig.c b/lib/libc_r/uthread/uthread_sig.c
index c13d2050441..2755ba4747a 100644
--- a/lib/libc_r/uthread/uthread_sig.c
+++ b/lib/libc_r/uthread/uthread_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uthread_sig.c,v 1.10 2001/11/05 22:53:28 marc Exp $ */
+/* $OpenBSD: uthread_sig.c,v 1.11 2001/12/18 03:47:52 marc Exp $ */
/*
* Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
* All rights reserved.
@@ -93,11 +93,17 @@ _thread_sig_handler(int sig, int code, struct sigcontext * scp)
*/
_thread_kern_sched(scp);
- /*
- * This point should not be reached, so abort the
- * process:
- */
- PANIC("Returned to signal function from scheduler");
+ /* The scheduler currently returns here instead
+ of calling sigreturn due to a sparc sigreturn
+ bug. We should also return. That brings
+ us back to the sigtramp code which will
+ sigreturn to the context stored on the current
+ stack (which is the same as scp, above).
+ The code originally did this:
+
+ PANIC("Returned to signal function from scheduler");
+ */
+ return;
}
}
/*