From 0df93eaa9876b45c1b6c1b6b7d1a0f5adbdb045b Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Fri, 22 Jan 2021 00:38:46 -0800 Subject: [PATCH] [kernel] Added the process_kill syscall Added process_kill, and also cleaned up all the disparate types being used for thread/process exit codes. (Now all int32_t.) --- src/include/syscalls.inc | 5 +++-- src/kernel/objects/process.cpp | 2 +- src/kernel/objects/process.h | 4 ++-- src/kernel/objects/thread.cpp | 2 +- src/kernel/objects/thread.h | 4 ++-- src/kernel/syscalls/process.cpp | 15 ++++++++++++++- src/kernel/syscalls/thread.cpp | 2 +- 7 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/include/syscalls.inc b/src/include/syscalls.inc index d0d2541..80304ed 100644 --- a/src/include/syscalls.inc +++ b/src/include/syscalls.inc @@ -10,10 +10,11 @@ SYSCALL(0x0b, object_close, j6_handle_t) SYSCALL(0x10, process_create, j6_handle_t *) SYSCALL(0x11, process_start, j6_handle_t *, uintptr_t) -SYSCALL(0x17, process_exit, int64_t) +SYSCALL(0x11, process_kill, j6_handle_t) +SYSCALL(0x17, process_exit, int32_t) SYSCALL(0x18, thread_create, void *, j6_handle_t *) -SYSCALL(0x19, thread_exit, int64_t) +SYSCALL(0x19, thread_exit, int32_t) SYSCALL(0x1a, thread_pause, void) SYSCALL(0x1b, thread_sleep, uint64_t) diff --git a/src/kernel/objects/process.cpp b/src/kernel/objects/process.cpp index aa82e19..37012ab 100644 --- a/src/kernel/objects/process.cpp +++ b/src/kernel/objects/process.cpp @@ -52,7 +52,7 @@ process::create_kernel_process(page_table *pml4) } void -process::exit(unsigned code) +process::exit(int32_t code) { // TODO: make this thread-safe m_state = state::exited; diff --git a/src/kernel/objects/process.h b/src/kernel/objects/process.h index 14c8a8f..e20dc20 100644 --- a/src/kernel/objects/process.h +++ b/src/kernel/objects/process.h @@ -34,7 +34,7 @@ public: /// Terminate this process. /// \arg code The return code to exit with. - void exit(unsigned code); + void exit(int32_t code); /// Update internal bookkeeping about threads. void update(); @@ -84,7 +84,7 @@ private: // This constructor is called by create_kernel_process process(page_table *kpml4); - uint32_t m_return_code; + int32_t m_return_code; vm_space m_space; diff --git a/src/kernel/objects/thread.cpp b/src/kernel/objects/thread.cpp index 3eb6a9f..524517f 100644 --- a/src/kernel/objects/thread.cpp +++ b/src/kernel/objects/thread.cpp @@ -136,7 +136,7 @@ thread::wake_on_result(kobject *obj, j6_status_t result) } void -thread::exit(uint32_t code) +thread::exit(int32_t code) { m_return_code = code; set_state(state::exited); diff --git a/src/kernel/objects/thread.h b/src/kernel/objects/thread.h index 41c0e7f..dbbaea4 100644 --- a/src/kernel/objects/thread.h +++ b/src/kernel/objects/thread.h @@ -131,7 +131,7 @@ public: /// Terminate this thread. /// \arg code The return code to exit with. - void exit(unsigned code); + void exit(int32_t code); /// Add a stack header that returns to the given address in kernel space. /// \arg rip The address to return to, must be kernel space @@ -173,7 +173,7 @@ private: wait_type m_wait_type; // There should be 1 byte of padding here - uint32_t m_return_code; + int32_t m_return_code; uint64_t m_wait_data; j6_status_t m_wait_result; diff --git a/src/kernel/syscalls/process.cpp b/src/kernel/syscalls/process.cpp index af8f2e6..179c6b6 100644 --- a/src/kernel/syscalls/process.cpp +++ b/src/kernel/syscalls/process.cpp @@ -22,7 +22,20 @@ process_start(j6_handle_t *handle, uintptr_t entrypoint) } j6_status_t -process_exit(int64_t status) +process_kill(j6_handle_t handle) +{ + process &p = process::current(); + process *c = get_handle(handle); + if (!c) return j6_err_invalid_arg; + + log::debug(logs::syscall, "Process %llx killed by process %llx", c->koid(), p.koid()); + c->exit(-1u); + + return j6_status_ok; +} + +j6_status_t +process_exit(int32_t status) { process &p = process::current(); log::debug(logs::syscall, "Process %llx exiting with code %d", p.koid(), status); diff --git a/src/kernel/syscalls/thread.cpp b/src/kernel/syscalls/thread.cpp index 74efede..ba42cc2 100644 --- a/src/kernel/syscalls/thread.cpp +++ b/src/kernel/syscalls/thread.cpp @@ -26,7 +26,7 @@ thread_create(void *rip, j6_handle_t *handle) } j6_status_t -thread_exit(int64_t status) +thread_exit(int32_t status) { thread &th = thread::current(); log::debug(logs::syscall, "Thread %llx exiting with code %d", th.koid(), status);