Date: Wed, 4 Nov 1998 22:15:53 -0500 (EST) From: Brian Feldman <green@unixhelp.org> To: current@FreeBSD.ORG Subject: RFSIGSHARE: forgot patch ;) Message-ID: <Pine.BSF.4.05.9811042214220.25785-100000@janus.syracuse.net>
next in thread | raw e-mail | index | archive | help
Woops, sorry, here is the patchset :) --- ./i386/linux/linux_dummy.c.orig Thu Nov 6 14:28:52 1997 +++ ./i386/linux/linux_dummy.c Wed Nov 4 20:48:40 1998 @@ -212,13 +212,6 @@ } int -linux_clone(struct proc *p, struct linux_clone_args *args) -{ - printf("Linux-emul(%d): clone() not supported\n", p->p_pid); - return ENOSYS; -} - -int linux_uname(struct proc *p, struct linux_uname_args *args) { printf("Linux-emul(%d): uname() not supported\n", p->p_pid); --- ./i386/linux/linux_misc.c.orig Mon Oct 5 08:40:42 1998 +++ ./i386/linux/linux_misc.c Wed Nov 4 21:13:31 1998 @@ -41,6 +41,7 @@ #include <sys/resourcevar.h> #include <sys/stat.h> #include <sys/sysctl.h> +#include <sys/unistd.h> #include <sys/vnode.h> #include <sys/wait.h> #include <sys/time.h> @@ -557,6 +558,56 @@ return error; if (p->p_retval[1] == 1) p->p_retval[0] = 0; + return 0; +} + +#define CLONE_VM 0x100 +#define CLONE_FS 0x200 +#define CLONE_FILES 0x400 +#define CLONE_SIGHAND 0x800 +#define CLONE_PID 0x1000 + +int +linux_clone(struct proc *p, struct linux_clone_args *args) +{ + int error, ff = RFPROC, top; + struct proc *p2; + +#ifdef SMP + printf("linux_clone(%d): does not work with SMP\n", p->p_pid); + return (EOPNOTSUPP); +#endif +#ifdef DEBUG_CLONE + printf("linux_clone(%#x, %#x)\n", ((int *)args)[0], + ((int *)args)[1]); + if (args->flags & CLONE_PID) + printf("linux_clone: CLONE_PID not yet supported\n"); + if (args->flags & CLONE_FS) + printf("linux_clone: CLONE_FS not yet supported\n"); +#endif + if (args->flags & CLONE_VM) + ff |= RFMEM; + if (args->flags & CLONE_SIGHAND) + ff |= RFSIGSHARE; + ff |= (args->flags & CLONE_FILES) ? RFFDG : RFCFDG; + if (error = fork1(p, ff)) + return error; + p2 = pfind(p->p_retval[0]); + if (p2 == 0) + return ESRCH; + if (args->stack) { + copyin(args->stack, &top, 4); + p2->p_md.md_regs->tf_esp = (int)args->stack; + p2->p_md.md_regs->tf_eip = top; + } + if (args->flags & CLONE_SIGHAND) + p2->p_sigacts = p->p_sigacts; +#ifdef DEBUG_CLONE + copyin(args->stack + 4, &top, 4); + printf("linux_clone: pids %d, %d; child eip=%#x, esp=%#x, *esp=%#x\n", + p->p_pid, p2->p_pid, p2->p_md.md_regs->tf_eip, p2->p_md.md_regs->tf_esp, + top); +#endif return 0; } --- ./i386/linux/linux_proto.h.orig Fri Jul 10 18:30:04 1998 +++ ./i386/linux/linux_proto.h Wed Nov 4 20:48:40 1998 @@ -2,7 +2,7 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * created from Id: syscalls.master,v 1.11 1998/06/09 03:28:14 bde Exp + * created from Id: syscalls.master,v 1.12 1998/07/10 22:30:08 jkh Exp */ #ifndef _LINUX_SYSPROTO_H_ @@ -301,7 +301,8 @@ struct linux_sigcontext * scp; char scp_[PAD_(struct linux_sigcontext *)]; }; struct linux_clone_args { - register_t dummy; + int flags; char flags_[PAD_(int)]; + void * stack; char stack_[PAD_(void *)]; }; struct linux_newuname_args { struct linux_newuname_t * buf; char buf_[PAD_(struct linux_newuname_t *)]; --- ./i386/linux/linux_syscall.h.orig Fri Jul 10 18:30:06 1998 +++ ./i386/linux/linux_syscall.h Wed Nov 4 20:48:40 1998 @@ -2,7 +2,7 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * created from Id: syscalls.master,v 1.11 1998/06/09 03:28:14 bde Exp + * created from Id: syscalls.master,v 1.12 1998/07/10 22:30:08 jkh Exp */ #define LINUX_SYS_linux_setup 0 --- ./i386/linux/linux_sysent.c.orig Fri Jul 10 18:30:07 1998 +++ ./i386/linux/linux_sysent.c Wed Nov 4 20:48:40 1998 @@ -2,7 +2,7 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * created from Id: syscalls.master,v 1.11 1998/06/09 03:28:14 bde Exp + * created from Id: syscalls.master,v 1.12 1998/07/10 22:30:08 jkh Exp */ #include "opt_compat.h" @@ -134,7 +134,7 @@ { 5, (sy_call_t *)linux_ipc }, /* 117 = linux_ipc */ { 1, (sy_call_t *)fsync }, /* 118 = fsync */ { 1, (sy_call_t *)linux_sigreturn }, /* 119 = linux_sigreturn */ - { 0, (sy_call_t *)linux_clone }, /* 120 = linux_clone */ + { 2, (sy_call_t *)linux_clone }, /* 120 = linux_clone */ { 2, (sy_call_t *)setdomainname }, /* 121 = setdomainname */ { 1, (sy_call_t *)linux_newuname }, /* 122 = linux_newuname */ { 3, (sy_call_t *)linux_modify_ldt }, /* 123 = linux_modify_ldt */ --- ./i386/linux/syscalls.master.orig Fri Jul 10 18:30:08 1998 +++ ./i386/linux/syscalls.master Wed Nov 4 20:48:40 1998 @@ -171,7 +171,7 @@ caddr_t ptr); } 118 NOPROTO LINUX { int fsync(int fd); } 119 STD LINUX { int linux_sigreturn(struct linux_sigcontext *scp); } -120 STD LINUX { int linux_clone(void); } +120 STD LINUX { int linux_clone(int flags, void *stack); } 121 NOPROTO LINUX { int setdomainname(char *name, \ int len); } 122 STD LINUX { int linux_newuname(struct linux_newuname_t *buf); } --- ./kern/kern_fork.c.orig Wed Nov 4 20:33:11 1998 +++ ./kern/kern_fork.c Wed Nov 4 20:44:29 1998 @@ -151,6 +151,10 @@ p1->p_pid); return (EOPNOTSUPP); } + if (flags & RFSIGSHARE) { + printf("shared signal space attemped: pid: %d\n", p1->p_pid); + return (EOPNOTSUPP); + } #endif /* @@ -320,6 +324,16 @@ bcopy(p1->p_cred, p2->p_cred, sizeof(*p2->p_cred)); p2->p_cred->p_refcnt = 1; crhold(p1->p_ucred); + + if (flags & RFSIGSHARE) { + p2->p_sig->p_refcnt++; + } else { + p2->p_sig = malloc(sizeof(struct procsig), M_TEMP, M_WAITOK); + p2->p_sig->p_refcnt = 1; + p2->p_sigmask = p1->p_sigmask; + p2->p_sigignore = p1->p_sigignore; + p2->p_sigcatch = p1->p_sigcatch; + } /* bump references to the text vnode (for procfs) */ p2->p_textvp = p1->p_textvp; --- ./kern/kern_exit.c.orig Wed Nov 4 20:45:09 1998 +++ ./kern/kern_exit.c Wed Nov 4 20:46:50 1998 @@ -333,6 +333,11 @@ p->p_limit = NULL; } + if (--p->p_sig->p_refcnt == 0) { + free(p->p_sig, M_TEMP); + p->p_sig = NULL; + } + /* * Finally, call machine-dependent code to release the remaining * resources including address space, the kernel stack and pcb. --- ./kern/init_main.c.orig Wed Nov 4 16:27:04 1998 +++ ./kern/init_main.c Wed Nov 4 16:41:15 1998 @@ -83,6 +83,7 @@ static struct pgrp pgrp0; struct proc proc0; static struct pcred cred0; +static struct procsig procsig0; static struct filedesc0 filedesc0; static struct plimit limit0; static struct vmspace vmspace0; @@ -414,6 +415,11 @@ p->p_cred = &cred0; p->p_ucred = crget(); p->p_ucred->cr_ngroups = 1; /* group 0 */ + + /* Create procsig. */ + p->p_sig = &procsig0; + p->p_sig->p_refcnt = 2; + p->p_sigmask = p->p_sigcatch = p->p_sigignore = 0; /* Create the file descriptor table. */ fdp = &filedesc0; --- ./sys/proc.h.orig Wed Nov 4 20:22:32 1998 +++ ./sys/proc.h Wed Nov 4 20:30:41 1998 @@ -75,6 +75,13 @@ int pg_jobc; /* # procs qualifying pgrp for job control */ }; +struct procsig { + int p_refcnt; + sigset_t p_sigmask; /* Current signal mask. */ + sigset_t p_sigignore; /* Signals being ignored. */ + sigset_t p_sigcatch; /* Signals being caught by user. */ +}; + /* * Description of a process. * @@ -165,12 +172,12 @@ #define p_endzero p_startcopy /* The following fields are all copied upon creation in fork. */ -#define p_startcopy p_sigmask - - sigset_t p_sigmask; /* Current signal mask. */ - sigset_t p_sigignore; /* Signals being ignored. */ - sigset_t p_sigcatch; /* Signals being caught by user. */ +#define p_startcopy p_sig + struct procsig *p_sig; +#define p_sigmask p_sig->p_sigmask +#define p_sigignore p_sig->p_sigignore +#define p_sigcatch p_sig->p_sigcatch u_char p_priority; /* Process priority. */ u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ char p_nice; /* Process "nice" value. */ --- ./sys/unistd.h.orig Wed Nov 4 20:32:28 1998 +++ ./sys/unistd.h Wed Nov 4 20:33:00 1998 @@ -186,6 +186,7 @@ #define RFCENVG (1<<11) /* UNIMPL zero plan9 `env space' */ #define RFCFDG (1<<12) /* zero fd table */ #define RFTHREAD (1<<13) /* enable kernel thread support */ +#define RFSIGSHARE (1<<14) /* share signal masks */ #define RFPPWAIT (1<<31) /* parent sleeps until child exits (vfork) */ #endif /* !_POSIX_SOURCE */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9811042214220.25785-100000>