summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/init_main.c8
-rw-r--r--sys/kern/init_sysent.c12
-rw-r--r--sys/kern/kern_exit.c33
-rw-r--r--sys/kern/kern_fork.c16
-rw-r--r--sys/kern/makesyscalls.sh3
-rw-r--r--sys/kern/sys_generic.c6
-rw-r--r--sys/kern/syscalls.c12
-rw-r--r--sys/kern/syscalls.master14
8 files changed, 98 insertions, 6 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index b485553..949dad8 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* @(#)init_main.c 8.9 (Berkeley) 1/21/94
- * $Id: init_main.c,v 1.62 1997/05/11 18:05:36 tegge Exp $
+ * $Id: init_main.c,v 1.63 1997/05/29 04:52:03 peter Exp $
*/
#include "opt_rlimit.h"
@@ -339,6 +339,12 @@ proc0_init(dummy)
p->p_rtprio.type = RTP_PRIO_NORMAL;
p->p_rtprio.prio = 0;
+/*
+ * Link for kernel based threads
+ */
+ p->p_peers = 0;
+ p->p_leader = p;
+
bcopy("swapper", p->p_comm, sizeof ("swapper"));
/* Create credentials. */
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index 2a92d91..29b435f 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -346,4 +346,16 @@ struct sysent sysent[] = {
{ 0, (sy_call_t *)nosys }, /* 311 = setresuid */
{ 0, (sy_call_t *)nosys }, /* 312 = setresgid */
{ 3, (sy_call_t *)signanosleep }, /* 313 = signanosleep */
+ { 1, (sy_call_t *)aio_return }, /* 314 = aio_return */
+ { 3, (sy_call_t *)aio_suspend }, /* 315 = aio_suspend */
+ { 2, (sy_call_t *)aio_cancel }, /* 316 = aio_cancel */
+ { 1, (sy_call_t *)aio_error }, /* 317 = aio_error */
+ { 1, (sy_call_t *)aio_read }, /* 318 = aio_read */
+ { 1, (sy_call_t *)aio_write }, /* 319 = aio_write */
+ { 4, (sy_call_t *)lio_listio }, /* 320 = lio_listio */
+ { 0, (sy_call_t *)yield }, /* 321 = yield */
+ { 1, (sy_call_t *)thr_sleep }, /* 322 = thr_sleep */
+ { 1, (sy_call_t *)thr_wakeup }, /* 323 = thr_wakeup */
+ { 1, (sy_call_t *)mlockall }, /* 324 = mlockall */
+ { 0, (sy_call_t *)munlockall }, /* 325 = munlockall */
};
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index efe1dc6..e5be44e 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
- * $Id: kern_exit.c,v 1.47 1997/04/07 07:16:00 peter Exp $
+ * $Id: kern_exit.c,v 1.48 1997/05/22 07:25:20 phk Exp $
*/
#include "opt_ktrace.h"
@@ -125,6 +125,37 @@ exit1(p, rv)
WTERMSIG(rv), WEXITSTATUS(rv));
panic("Going nowhere without my init!");
}
+
+ /* are we a task leader? */
+ if(p == p->p_leader) {
+ struct kill_args killArgs;
+ killArgs.signum = SIGKILL;
+ q = p->p_peers;
+ while(q) {
+ killArgs.pid = q->p_pid;
+ /*
+ * The interface for kill is better
+ * than the internal signal
+ */
+ kill(p, &killArgs, &rv);
+ nq = q;
+ q = q->p_peers;
+ /*
+ * orphan the threads so we don't mess up
+ * when they call exit
+ */
+ nq->p_peers = 0;
+ nq->p_leader = nq;
+ }
+
+ /* otherwise are we a peer? */
+ } else if(p->p_peers) {
+ q = p->p_leader;
+ while(q->p_peers != p)
+ q = q->p_peers;
+ q->p_peers = p->p_peers;
+ }
+
#ifdef PGINPROF
vmsizmon();
#endif
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index ac82dff..33e961f 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
- * $Id: kern_fork.c,v 1.41 1997/04/26 15:59:50 peter Exp $
+ * $Id: kern_fork.c,v 1.42 1997/05/29 04:52:04 peter Exp $
*/
#include "opt_ktrace.h"
@@ -218,6 +218,20 @@ fork1(p1, flags, retval)
/* Allocate new proc. */
MALLOC(newproc, struct proc *, sizeof(struct proc), M_PROC, M_WAITOK);
+/*
+ * Setup linkage for kernel based threading
+ */
+ if((flags & RFTHREAD) != 0) {
+ newproc->p_peers = p1->p_peers;
+ p1->p_peers = newproc;
+ newproc->p_leader = p1->p_leader;
+ } else {
+ newproc->p_peers = 0;
+ newproc->p_leader = newproc;
+ }
+
+ newproc->p_wakeup = 0;
+
/*
* Find an unused process ID. We remember a range of unused IDs
* ready to use (from nextpid+1 through pidchecked-1).
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
index 9fb06a1..2af3872 100644
--- a/sys/kern/makesyscalls.sh
+++ b/sys/kern/makesyscalls.sh
@@ -1,6 +1,6 @@
#! /bin/sh -
# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
-# $Id: makesyscalls.sh,v 1.21 1997/02/22 09:39:14 peter Exp $
+# $Id: makesyscalls.sh,v 1.22 1997/03/29 11:11:18 peter Exp $
set -e
@@ -105,6 +105,7 @@ s/\$//g
printf " * created from%s\n */\n\n", $0 > sysarg
printf("#ifndef %s\n", sysproto_h) > sysarg
printf("#define\t%s\n\n", sysproto_h) > sysarg
+ printf "#include <sys/aio.h>\n" > sysarg
printf "#include <sys/signal.h>\n\n", $0 > sysarg
printf " * created from%s\n */\n\n", $0 > sysnames
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 2bcfd68..4f0cc23 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)sys_generic.c 8.5 (Berkeley) 1/21/94
- * $Id: sys_generic.c,v 1.25 1997/03/23 03:36:23 bde Exp $
+ * $Id: sys_generic.c,v 1.26 1997/03/24 11:52:25 bde Exp $
*/
#include "opt_ktrace.h"
@@ -99,6 +99,7 @@ read(p, uap, retval)
aiov.iov_len = uap->nbyte;
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
+ auio.uio_offset = -1;
auio.uio_resid = uap->nbyte;
if (auio.uio_resid < 0)
@@ -176,6 +177,7 @@ readv(p, uap, retval)
auio.uio_rw = UIO_READ;
auio.uio_segflg = UIO_USERSPACE;
auio.uio_procp = p;
+ auio.uio_offset = -1;
if ((error = copyin((caddr_t)uap->iovp, (caddr_t)iov, iovlen)))
goto done;
auio.uio_resid = 0;
@@ -250,6 +252,7 @@ write(p, uap, retval)
aiov.iov_len = uap->nbyte;
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
+ auio.uio_offset = -1;
auio.uio_resid = uap->nbyte;
auio.uio_rw = UIO_WRITE;
auio.uio_segflg = UIO_USERSPACE;
@@ -327,6 +330,7 @@ writev(p, uap, retval)
auio.uio_rw = UIO_WRITE;
auio.uio_segflg = UIO_USERSPACE;
auio.uio_procp = p;
+ auio.uio_offset = -1;
if ((error = copyin((caddr_t)uap->iovp, (caddr_t)iov, iovlen)))
goto done;
auio.uio_resid = 0;
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 4dda7cf..b824925 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -335,4 +335,16 @@ char *syscallnames[] = {
"#311", /* 311 = setresuid */
"#312", /* 312 = setresgid */
"signanosleep", /* 313 = signanosleep */
+ "aio_return", /* 314 = aio_return */
+ "aio_suspend", /* 315 = aio_suspend */
+ "aio_cancel", /* 316 = aio_cancel */
+ "aio_error", /* 317 = aio_error */
+ "aio_read", /* 318 = aio_read */
+ "aio_write", /* 319 = aio_write */
+ "lio_listio", /* 320 = lio_listio */
+ "yield", /* 321 = yield */
+ "thr_sleep", /* 322 = thr_sleep */
+ "thr_wakeup", /* 323 = thr_wakeup */
+ "mlockall", /* 324 = mlockall */
+ "munlockall", /* 325 = munlockall */
};
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 82ceb9d..d944470f1 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -1,4 +1,4 @@
- $Id: syscalls.master,v 1.38 1997/05/08 14:07:11 peter Exp $
+ $Id: syscalls.master,v 1.39 1997/06/01 08:52:38 peter Exp $
; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94
;
; System call name/number master file.
@@ -462,3 +462,15 @@
312 UNIMPL NOHIDE setresgid
313 STD BSD { int signanosleep(const struct timespec *rqtp, \
struct timespec *rmtp, sigset_t *mask); }
+314 STD BSD { int aio_return(struct aiocb *aiocbp); }
+315 STD BSD { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
+316 STD BSD { int aio_cancel(int fd, struct aiocb *aiocbp); }
+317 STD BSD { int aio_error(struct aiocb *aiocbp); }
+318 STD BSD { int aio_read(struct aiocb *aiocbp); }
+319 STD BSD { int aio_write(struct aiocb *aiocbp); }
+320 STD BSD { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
+321 STD BSD { int yield(void); }
+322 STD BSD { int thr_sleep(const struct timespec *timeout); }
+323 STD BSD { int thr_wakeup(pid_t pid); }
+324 STD BSD { int mlockall(int how); }
+325 STD BSD { int munlockall(void); }
OpenPOWER on IntegriCloud