diff options
author | julian <julian@FreeBSD.org> | 1998-12-19 02:55:34 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1998-12-19 02:55:34 +0000 |
commit | 61490236bcee0615867517e76eb92c1b20075f82 (patch) | |
tree | 9a109f9996daee77886aee1062aa97f90896dd47 /sys/alpha/linux | |
parent | da7c7a2e129d402169d2fbc6d83f596d7d16d83a (diff) | |
download | FreeBSD-src-61490236bcee0615867517e76eb92c1b20075f82.zip FreeBSD-src-61490236bcee0615867517e76eb92c1b20075f82.tar.gz |
Reviewed by: Luoqi Chen, Jordan Hubbard
Submitted by: "Richard Seaman, Jr." <lists@tar.com>
Obtained from: linux :-)
Code to allow Linux Threads to run under FreeBSD.
By default not enabled
This code is dependent on the conditional
COMPAT_LINUX_THREADS (suggested by Garret)
This is not yet a 'real' option but will be within some number of hours.
Diffstat (limited to 'sys/alpha/linux')
-rw-r--r-- | sys/alpha/linux/linux.h | 3 | ||||
-rw-r--r-- | sys/alpha/linux/linux_dummy.c | 9 | ||||
-rw-r--r-- | sys/alpha/linux/linux_sysvec.c | 23 | ||||
-rw-r--r-- | sys/alpha/linux/syscalls.master | 4 |
4 files changed, 27 insertions, 12 deletions
diff --git a/sys/alpha/linux/linux.h b/sys/alpha/linux/linux.h index 691ed55..820028f 100644 --- a/sys/alpha/linux/linux.h +++ b/sys/alpha/linux/linux.h @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux.h,v 1.23 1998/10/05 16:37:36 jfieber Exp $ + * $Id: linux.h,v 1.24 1998/11/12 00:42:08 jkh Exp $ */ #ifndef _I386_LINUX_LINUX_H_ @@ -418,6 +418,7 @@ struct trapframe; #define LINUX_MAP_PRIVATE 0x0002 #define LINUX_MAP_FIXED 0x0010 #define LINUX_MAP_ANON 0x0020 +#define LINUX_MAP_GROWSDOWN 0x0100 /* SystemV ipc defines */ #define LINUX_SEMOP 1 diff --git a/sys/alpha/linux/linux_dummy.c b/sys/alpha/linux/linux_dummy.c index 30a0dba..6a7ce1e 100644 --- a/sys/alpha/linux/linux_dummy.c +++ b/sys/alpha/linux/linux_dummy.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux_dummy.c,v 1.7 1997/10/29 08:17:09 kato Exp $ + * $Id: linux_dummy.c,v 1.8 1997/11/06 19:28:52 phk Exp $ */ #include <sys/param.h> @@ -212,13 +212,6 @@ linux_sysinfo(struct proc *p, struct linux_sysinfo_args *args) } 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); diff --git a/sys/alpha/linux/linux_sysvec.c b/sys/alpha/linux/linux_sysvec.c index 188e3d5..b863951 100644 --- a/sys/alpha/linux/linux_sysvec.c +++ b/sys/alpha/linux/linux_sysvec.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: linux_sysvec.c,v 1.39 1998/12/14 18:54:01 dt Exp $ + * $Id: linux_sysvec.c,v 1.40 1998/12/16 16:28:57 bde Exp $ */ /* XXX we use functions that might not exist. */ @@ -50,6 +50,10 @@ #include <vm/vm_prot.h> #include <vm/vm_page.h> #include <vm/vm_extern.h> +#ifdef COMPAT_LINUX_THREADS +#include <sys/lock.h> /* needed, for now, by vm_map.h */ +#include <vm/vm_map.h> /* needed, for now, for VM_STACK defines */ +#endif /* COMPAT_LINUX_THREADS */ #include <sys/exec.h> #include <sys/kernel.h> #include <sys/module.h> @@ -217,7 +221,24 @@ linux_sendsig(sig_t catcher, int sig, int mask, u_long code) * and the stack can not be grown. useracc will return FALSE * if access is denied. */ +#ifdef COMPAT_LINUX_THREADS +#ifdef USE_VM_STACK +#ifndef USE_VM_STACK_FOR_EXEC + if ((((caddr_t)fp > p->p_vmspace->vm_maxsaddr && + (caddr_t)fp < (caddr_t)USRSTACK && + grow(p, (int)fp) == FALSE) || + (((caddr_t)fp <= p->p_vmspace->vm_maxsaddr || + (caddr_t)fp >= (caddr_t)USRSTACK) && + grow_stack (p, (int)fp) == FALSE)) || +#else + if ((grow_stack (p, (int)fp) == FALSE) || +#endif +#else +#endif /* COMPAT_LINUX_THREADS */ if ((grow(p, (int)fp) == FALSE) || +#ifdef COMPAT_LINUX_THREADS +#endif +#endif /* COMPAT_LINUX_THREADS */ (useracc((caddr_t)fp, sizeof (struct linux_sigframe), B_WRITE) == FALSE)) { /* * Process has trashed its stack; give it an illegal diff --git a/sys/alpha/linux/syscalls.master b/sys/alpha/linux/syscalls.master index 912cb32..3b24f13 100644 --- a/sys/alpha/linux/syscalls.master +++ b/sys/alpha/linux/syscalls.master @@ -1,4 +1,4 @@ - $Id: syscalls.master,v 1.11 1998/06/09 03:28:14 bde Exp $ + $Id: syscalls.master,v 1.12 1998/07/10 22:30:08 jkh Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 ; System call name/number master file (or rather, slave, from LINUX). @@ -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); } |