diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index e025a338d..ef57c0f49 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -210,6 +210,7 @@ set(emulation_sources ioctl/socket.c ext/sysinfo.c ext/uname.c + ext/nanosleep.c ext/epoll_create.c ext/epoll_create1.c ext/epoll_ctl.c diff --git a/src/kernel/emulation/linux/ext/nanosleep.c b/src/kernel/emulation/linux/ext/nanosleep.c new file mode 100644 index 000000000..6784d75ca --- /dev/null +++ b/src/kernel/emulation/linux/ext/nanosleep.c @@ -0,0 +1,21 @@ +#include "sys/utsname.h" +#include "../base.h" +#include "../errno.h" +#include + +extern void cerror(int e); + +int __linux_nanosleep(struct timespec* ts, struct timespec* rem) +{ + int rv; + + rv = LINUX_SYSCALL(__NR_nanosleep, ts, rem); + if (rv < 0) + { + cerror(errno_linux_to_bsd(-rv)); + return -1; + } + + return rv; +} + diff --git a/src/kernel/emulation/linux/mach/mach_traps.c b/src/kernel/emulation/linux/mach/mach_traps.c index 1d5a15166..a5468de83 100644 --- a/src/kernel/emulation/linux/mach/mach_traps.c +++ b/src/kernel/emulation/linux/mach/mach_traps.c @@ -506,13 +506,19 @@ boolean_t swtch_impl(void) return 0; } +extern int __linux_nanosleep(struct timespec* tv, struct timespec* rem); kern_return_t syscall_thread_switch_impl( mach_port_name_t thread_name, int option, mach_msg_timeout_t option_time) { - UNIMPLEMENTED_TRAP(); - return KERN_FAILURE; + struct timespec tv = { + .tv_sec = 0, + .tv_nsec = 1000000 + }; + // Sleep for 1ms + __linux_nanosleep(&tv, &tv); + return KERN_SUCCESS; } mach_port_name_t task_self_trap_impl(void)