diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 4719f0e95..55dd4817e 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -48,6 +48,7 @@ set(emulation_sources unistd/umask.c unistd/chroot.c process/vfork.c + process/fork.c signal/duct_signals.c signal/kill.c signal/sigaltstack.c diff --git a/src/kernel/emulation/linux/process/fork.c b/src/kernel/emulation/linux/process/fork.c new file mode 100644 index 000000000..91a0118bf --- /dev/null +++ b/src/kernel/emulation/linux/process/fork.c @@ -0,0 +1,24 @@ +#include "fork.h" +#include "../base.h" +#include "../errno.h" +#include "../signal/duct_signals.h" +#include "../../../mach_server/client/lkm.h" +#include + +long sys_fork(void) +{ + int ret; + +#ifdef SYS_fork + ret = LINUX_SYSCALL(__NR_fork); +#else + ret = LINUX_SYSCALL(__NR_clone, LINUX_SIGCHLD, 0); +#endif + if (ret < 0) + ret = errno_linux_to_bsd(ret); + else if (ret == 0) + mach_driver_init(); // re-open /dev/mach + + return ret; +} + diff --git a/src/kernel/emulation/linux/process/fork.h b/src/kernel/emulation/linux/process/fork.h new file mode 100644 index 000000000..315b002ce --- /dev/null +++ b/src/kernel/emulation/linux/process/fork.h @@ -0,0 +1,7 @@ +#ifndef LINUX_FORK_H +#define LINUX_FORK_H + +long sys_fork(void); + +#endif + diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 748e22e5b..91460b040 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -60,10 +60,12 @@ #include "time/utimes.h" #include "time/futimes.h" #include "process/vfork.h" +#include "process/fork.h" #include "wqueue/bsdthread_register.h" void* __bsd_syscall_table[512] = { [1] = sys_exit, + [2] = sys_fork, [3] = sys_read, [4] = sys_write, [5] = sys_open, diff --git a/src/kernel/mach_server/client/lkm.h b/src/kernel/mach_server/client/lkm.h index 01f785190..4c479816b 100644 --- a/src/kernel/mach_server/client/lkm.h +++ b/src/kernel/mach_server/client/lkm.h @@ -1,7 +1,9 @@ #ifndef _LKM_H #define _LKM_H -__attribute__((hidden)) +void mach_driver_init(void); + +__attribute__((visibility("hidden"))) extern int driver_fd; #endif