From 41c7e3780d56dfa6638274512370a7ab26a04004 Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 23 Mar 2023 22:25:56 +0100 Subject: [PATCH] kernel: Add support for exit codes and start preparing for waitpid() --- kernel/src/sys/exit.cpp | 11 +++++++++-- kernel/src/thread/Thread.h | 3 +++ libc/include/stdlib.h | 4 ++-- libc/src/stdlib.cpp | 6 +++--- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/kernel/src/sys/exit.cpp b/kernel/src/sys/exit.cpp index adc591c1..5d02f321 100644 --- a/kernel/src/sys/exit.cpp +++ b/kernel/src/sys/exit.cpp @@ -1,7 +1,14 @@ #include "sys/Syscall.h" #include "thread/Scheduler.h" -Result sys_exit(Registers*, SyscallArgs) +Result sys_exit(Registers*, SyscallArgs args) { - kernel_exit(); + u8 status = (u8)args[0]; + + Thread* current = Scheduler::current(); + + current->status = status; + current->state = ThreadState::Exited; + + kernel_yield(); } diff --git a/kernel/src/thread/Thread.h b/kernel/src/thread/Thread.h index 89f81710..3d637f77 100644 --- a/kernel/src/thread/Thread.h +++ b/kernel/src/thread/Thread.h @@ -19,6 +19,7 @@ enum class ThreadState Idle, Runnable, Sleeping, + Exited, Dying }; @@ -64,6 +65,8 @@ struct Thread : public LinkedListNode bool is_kernel { true }; + u8 status { 0 }; + PageDirectory* directory; bool is_idle() diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 1c31d81c..3799a971 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -95,10 +95,10 @@ extern "C" void srand(int); /* Exit the program normally, performing any registered cleanup actions. */ - __noreturn void exit(int); + __noreturn void exit(int status); /* Exit the program abnormally, without performing any registered cleanup actions. */ - __noreturn void _Exit(int); + __noreturn void _Exit(int status); int system(const char*); diff --git a/libc/src/stdlib.cpp b/libc/src/stdlib.cpp index 9bd77c6f..6a880851 100644 --- a/libc/src/stdlib.cpp +++ b/libc/src/stdlib.cpp @@ -94,13 +94,13 @@ extern "C" __noreturn void abort() { - syscall(SYS_exit); + syscall(SYS_exit, 255); __builtin_unreachable(); } - __noreturn void _Exit(int) + __noreturn void _Exit(int status) { - syscall(SYS_exit); + syscall(SYS_exit, status); __builtin_unreachable(); }