diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 02638a975..71d2745b7 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -20,7 +20,8 @@ set(emulation_sources unistd/pwrite.c unistd/readv.c unistd/writev.c - mman.c + mman/mman.c + mman/madvise.c unistd/fsync.c unistd/sync.c unistd/fdatasync.c @@ -117,7 +118,7 @@ set(emulation_sources syscalls-amd64.asm ) -set_source_files_properties(mman.c PROPERTIES COMPILE_FLAGS +set_source_files_properties(mman/mman.c PROPERTIES COMPILE_FLAGS "-I${DARLING_TOP_DIRECTORY}/platform-include") set_source_files_properties(signal/duct_signals.c PROPERTIES COMPILE_FLAGS "-I${DARLING_TOP_DIRECTORY}/platform-include -I${DARLING_TOP_DIRECTORY}/src/libc/include -nostdinc") diff --git a/src/kernel/emulation/linux/duct_mman.h b/src/kernel/emulation/linux/mman/duct_mman.h similarity index 96% rename from src/kernel/emulation/linux/duct_mman.h rename to src/kernel/emulation/linux/mman/duct_mman.h index 8a5da11fb..2981a13e7 100644 --- a/src/kernel/emulation/linux/duct_mman.h +++ b/src/kernel/emulation/linux/mman/duct_mman.h @@ -47,7 +47,7 @@ #define LINUX_MCL_CURRENT 1 #define LINUX_MCL_FUTURE 2 -#include "../../../../platform-include/sys/mman.h" +#include "../../../../../platform-include/sys/mman.h" #endif diff --git a/src/kernel/emulation/linux/mman/madvise.c b/src/kernel/emulation/linux/mman/madvise.c new file mode 100644 index 000000000..9fff3cbb0 --- /dev/null +++ b/src/kernel/emulation/linux/mman/madvise.c @@ -0,0 +1,23 @@ +#include "madvise.h" +#include "../errno.h" +#include "../base.h" +#include "../../../../../platform-include/sys/errno.h" +#include + +long sys_madvise(void* addr, unsigned long len, int advice) +{ + int ret; + + // advice < 0 are identical between OS X and Linux + // advice >= 5 are specific to OS X/BSD + if (advice >= 5) + return -ENOTSUP; + + ret = LINUX_SYSCALL(__NR_madvise, addr, len, advice); + + if (ret < 0) + ret = errno_linux_to_bsd(ret); + + return ret; +} + diff --git a/src/kernel/emulation/linux/mman/madvise.h b/src/kernel/emulation/linux/mman/madvise.h new file mode 100644 index 000000000..2ef72e0cb --- /dev/null +++ b/src/kernel/emulation/linux/mman/madvise.h @@ -0,0 +1,7 @@ +#ifndef LINUX_MADVISE_H +#define LINUX_MADVISE_H + +long sys_madvise(void* addr, unsigned long len, int advice); + +#endif + diff --git a/src/kernel/emulation/linux/mman.c b/src/kernel/emulation/linux/mman/mman.c similarity index 97% rename from src/kernel/emulation/linux/mman.c rename to src/kernel/emulation/linux/mman/mman.c index 451d8eda7..4cc2b061b 100644 --- a/src/kernel/emulation/linux/mman.c +++ b/src/kernel/emulation/linux/mman/mman.c @@ -1,7 +1,7 @@ #include "mman.h" #include "duct_mman.h" -#include "errno.h" -#include "base.h" +#include "../errno.h" +#include "../base.h" #include static int prot_bsd_to_linux(int prot) diff --git a/src/kernel/emulation/linux/mman.h b/src/kernel/emulation/linux/mman/mman.h similarity index 100% rename from src/kernel/emulation/linux/mman.h rename to src/kernel/emulation/linux/mman/mman.h diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 945849ade..e8335b9c8 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -2,8 +2,8 @@ #include "unistd/write.h" #include "unistd/read.h" -#include "mman.h" - +#include "mman/mman.h" +#include "mman/madvise.h" #include "unistd/sync.h" #include "unistd/fsync.h" #include "unistd/fdatasync.h" @@ -125,6 +125,7 @@ void* __bsd_syscall_table[512] = { [66] = sys_vfork, [73] = sys_munmap, [74] = sys_mprotect, + [75] = sys_madvise, [78] = sys_mincore, [90] = sys_dup2, [92] = sys_fcntl,