diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 4341d6427..63d90eab8 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -36,6 +36,9 @@ set(emulation_sources unistd/writev.c mman/mman.c mman/madvise.c + mman/msync.c + kqueue/kqueue.c + kqueue/kevent.c unistd/fsync.c unistd/sync.c unistd/fdatasync.c diff --git a/src/kernel/emulation/linux/mman/msync.c b/src/kernel/emulation/linux/mman/msync.c new file mode 100644 index 000000000..5de3fc69d --- /dev/null +++ b/src/kernel/emulation/linux/mman/msync.c @@ -0,0 +1,35 @@ +#include "msync.h" +#include "duct_mman.h" +#include "../errno.h" +#include "../base.h" +#include + +int msync_flags_bsd_to_linux(int flags) +{ + int oflags = 0; + + if (flags & BSD_MS_ASYNC) + oflags |= LINUX_MS_ASYNC; + if (flags & BSD_MS_SYNC) + oflags |= LINUX_MS_SYNC; + if (flags & BSD_MS_INVALIDATE) + oflags |= LINUX_MS_INVALIDATE; + + return oflags; +} + +long sys_msync(void* addr, unsigned long len, int flags) +{ + return sys_msync_nocancel(addr, len, flags); +} + +long sys_msync_nocancel(void* addr, unsigned long len, int flags) +{ + int ret; + + ret = LINUX_SYSCALL(__NR_msync, addr, len, msync_flags_bsd_to_linux(flags)); + if (ret < 0) + ret = errno_linux_to_bsd(ret); + + return ret; +} diff --git a/src/kernel/emulation/linux/mman/msync.h b/src/kernel/emulation/linux/mman/msync.h new file mode 100644 index 000000000..383692c26 --- /dev/null +++ b/src/kernel/emulation/linux/mman/msync.h @@ -0,0 +1,16 @@ +#ifndef LINUX_MSYNC_H +#define LINUX_MSYNC_H + +long sys_msync(void* addr, unsigned long len, int flags); +long sys_msync_nocancel(void* addr, unsigned long len, int flags); + +#define LINUX_MS_ASYNC 1 +#define LINUX_MS_INVALIDATE 2 +#define LINUX_MS_SYNC 4 + +#define BSD_MS_ASYNC 1 +#define BSD_MS_INVALIDATE 2 +#define BSD_MS_SYNC 0x10 + +#endif + diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index a716c6f80..68c099d7d 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -1,9 +1,12 @@ #include "syscalls.h" +#include "kqueue/kqueue.h" +#include "kqueue/kevent.h" #include "unistd/write.h" #include "unistd/read.h" #include "mman/mman.h" #include "mman/madvise.h" +#include "mman/msync.h" #include "unistd/sync.h" #include "unistd/fsync.h" #include "unistd/fdatasync.h" @@ -207,6 +210,7 @@ void* __bsd_syscall_table[600] = { [59] = sys_execve, [60] = sys_umask, [61] = sys_chroot, + [65] = sys_msync, [66] = sys_vfork, [73] = sys_munmap, [74] = sys_mprotect, @@ -321,6 +325,8 @@ void* __bsd_syscall_table[600] = { [347] = sys_getfsstat64, [360] = sys_bsdthread_create, [361] = sys_bsdthread_terminate, + [362] = sys_kqueue, + [363] = sys_kevent, [364] = sys_lchown, [366] = sys_bsdthread_register, [367] = sys_workq_open, @@ -335,6 +341,7 @@ void* __bsd_syscall_table[600] = { [402] = sys_sendmsg_nocancel, [403] = sys_recvfrom_nocancel, [404] = sys_accept_nocancel, + [405] = sys_msync_nocancel, [406] = sys_fcntl_nocancel, [407] = sys_select_nocancel, [408] = sys_fsync_nocancel,