From owner-freebsd-current Tue Nov 3 09:52:53 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id JAA12653 for freebsd-current-outgoing; Tue, 3 Nov 1998 09:52:53 -0800 (PST) (envelope-from owner-freebsd-current@FreeBSD.ORG) Received: from zone.syracuse.net (zone.syracuse.net [205.232.47.17]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id JAA12642 for ; Tue, 3 Nov 1998 09:52:45 -0800 (PST) (envelope-from green@zone.syracuse.net) Received: from localhost (green@localhost) by zone.syracuse.net (8.8.8/8.8.7) with ESMTP id MAA00131 for ; Tue, 3 Nov 1998 12:52:35 -0500 (EST) Date: Tue, 3 Nov 1998 12:52:35 -0500 (EST) From: Brian Feldman To: current@FreeBSD.ORG Subject: linux_clone news Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG Linux_clone() works! Or at least it seems to work correctly now. I have a proper patchset now as well, attached at the end of this message. Bad news: linuxthreads still does not work right. Altho I seem to have corrected and redone the inaccurate parts of my code (thanks SO MUCH Luoqi, you were really key in helping me here :), there seems to be some kind of spinning pthread_create(). If anyone would like to apply my Linux emulation patches, download LinuxThreads, and work on helping the state of FreeBSD's Linux emulation out here, please do! Cheers, Brian Feldman --cut here---patch begins--- diff -u usr/src/sys/i386/linux/linux_dummy.c /usr/src/sys/i386/linux/linux_dummy.c --- usr/src/sys/i386/linux/linux_dummy.c Thu Nov 6 14:28:52 1997 +++ /usr/src/sys/i386/linux/linux_dummy.c Mon Nov 2 20:40:16 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); diff -u usr/src/sys/i386/linux/linux_misc.c /usr/src/sys/i386/linux/linux_misc.c --- usr/src/sys/i386/linux/linux_misc.c Mon Oct 5 08:40:42 1998 +++ /usr/src/sys/i386/linux/linux_misc.c Tue Nov 3 10:55:49 1998 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -557,6 +558,50 @@ 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 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"); + if (args->flags & CLONE_SIGHAND) + printf("linux_clone: CLONE_SIGHAND not yet supported\n"); +#endif + if (args->flags & CLONE_VM) + ff |= RFMEM; + 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; + } +#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; } diff -u usr/src/sys/i386/linux/linux_proto.h /usr/src/sys/i386/linux/linux_proto.h --- usr/src/sys/i386/linux/linux_proto.h Fri Jul 10 18:30:04 1998 +++ /usr/src/sys/i386/linux/linux_proto.h Tue Nov 3 09:31:51 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 *)]; Only in usr/src/sys/i386/linux/: linux_proto.h.bak diff -u usr/src/sys/i386/linux/linux_syscall.h /usr/src/sys/i386/linux/linux_syscall.h --- usr/src/sys/i386/linux/linux_syscall.h Fri Jul 10 18:30:06 1998 +++ /usr/src/sys/i386/linux/linux_syscall.h Tue Nov 3 09:31:51 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 Only in usr/src/sys/i386/linux/: linux_syscall.h.bak diff -u usr/src/sys/i386/linux/linux_sysent.c /usr/src/sys/i386/linux/linux_sysent.c --- usr/src/sys/i386/linux/linux_sysent.c Fri Jul 10 18:30:07 1998 +++ /usr/src/sys/i386/linux/linux_sysent.c Tue Nov 3 09:31:51 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 */ Only in usr/src/sys/i386/linux/: linux_sysent.c.bak diff -u usr/src/sys/i386/linux/syscalls.master /usr/src/sys/i386/linux/syscalls.master --- usr/src/sys/i386/linux/syscalls.master Fri Jul 10 18:30:08 1998 +++ /usr/src/sys/i386/linux/syscalls.master Tue Nov 3 09:31:44 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); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message