Просмотр исходного кода

feat(syscall): impl. partial gettid and wait4

greatbridf 1 год назад
Родитель
Сommit
496a4bb31f
2 измененных файлов с 36 добавлено и 1 удалено
  1. 12 0
      gblibc/include/sys/wait.h
  2. 24 1
      src/kernel/syscall.cpp

+ 12 - 0
gblibc/include/sys/wait.h

@@ -3,6 +3,18 @@
 
 #include <sys/types.h>
 
+#define WNOHANG 1
+#define WUNTRACED 2
+
+#define WEXISTATUS(s) (((s) & 0xff00) >> 8)
+#define WTERMSIG(s) ((s) & 0x7f)
+#define WSTOPSIG(s) WEXITSTATUS(s)
+#define WCOREDUMP(s) ((s) & 0x80)
+#define WIFEXITED(s) (!WTERMSIG(s))
+#define WIFSTOPPED(s) (((s) & 0x7f) == 0x7f)
+#define WIFSIGNALED(s) (WTERMSIG(s) && !WIFSTOPPED(s))
+#define WIFCONTINUED(s) ((s) == 0xffff)
+
 #ifdef __cplusplus
 extern "C" {
 #endif

+ 24 - 1
src/kernel/syscall.cpp

@@ -214,7 +214,7 @@ int _syscall_waitpid(interrupt_stack* data)
     SYSCALL_ARG2(int*, arg1);
     SYSCALL_ARG3(int, options);
 
-    if (pid_to_wait != -1 || options != 0)
+    if (pid_to_wait != -1)
         return -EINVAL;
 
     auto& cv = current_process->cv_wait;
@@ -223,6 +223,9 @@ int _syscall_waitpid(interrupt_stack* data)
 
     auto& waitlist = current_process->waitlist;
 
+    // TODO: check if it is waiting for stopped process
+    (void)options;
+
     while (waitlist.empty()) {
         if (current_process->children.empty())
             return -ECHILD;
@@ -249,6 +252,17 @@ int _syscall_waitpid(interrupt_stack* data)
     return pid;
 }
 
+int _syscall_wait4(interrupt_stack* data)
+{
+    SYSCALL_ARG4(void* __user, rusage);
+
+    // TODO: getrusage
+    if (rusage)
+        return -EINVAL;
+
+    return _syscall_waitpid(data);
+}
+
 int _syscall_getdents(interrupt_stack* data)
 {
     SYSCALL_ARG1(int, fd);
@@ -862,6 +876,13 @@ pid_t _syscall_getpgid(interrupt_stack* data)
     return procs->find(pid).pgid;
 }
 
+int _syscall_gettid(interrupt_stack* data)
+{
+    // TODO: real tid
+    (void)data;
+    return current_process->pid;
+}
+
 extern "C" void syscall_entry(interrupt_stack* data)
 {
     int syscall_no = SYSCALL_NO;
@@ -910,6 +931,7 @@ void init_syscall(void)
     syscall_handlers[0x42] = _syscall_setsid;
     syscall_handlers[0x4e] = _syscall_gettimeofday;
     syscall_handlers[0x5b] = _syscall_munmap;
+    syscall_handlers[0x72] = _syscall_wait4;
     syscall_handlers[0x7a] = _syscall_newuname;
     syscall_handlers[0x84] = _syscall_getpgid;
     syscall_handlers[0x8d] = _syscall_getdents;
@@ -924,6 +946,7 @@ void init_syscall(void)
     syscall_handlers[0xc9] = _syscall_geteuid;
     syscall_handlers[0xdc] = _syscall_getdents64;
     syscall_handlers[0xdd] = _syscall_fcntl64;
+    syscall_handlers[0xe0] = _syscall_gettid;
     syscall_handlers[0xef] = _syscall_sendfile64;
     syscall_handlers[0xf3] = _syscall_set_thread_area;
     syscall_handlers[0xfc] = _syscall_exit; // we implement exit_group as exit for now