From 110f625f04cb2fb8757aca7f61e15693d6acd6d7 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 22 Mar 2026 19:02:31 +0000 Subject: [PATCH] syscall: task: implement thread_self --- include/kernel/syscall.h | 1 + libmango/arch/x86_64/syscall.S | 3 +- libmango/include-user/mango/task.h | 1 + libmango/include/mango/syscall.h | 95 +++++++++++++++--------------- syscall/dispatch.c | 1 + syscall/task.c | 31 ++++++++++ 6 files changed, 84 insertions(+), 48 deletions(-) diff --git a/include/kernel/syscall.h b/include/kernel/syscall.h index b8476c0..02494fa 100644 --- a/include/kernel/syscall.h +++ b/include/kernel/syscall.h @@ -67,6 +67,7 @@ extern kern_status_t sys_task_config_set( const void *ptr, size_t len); +extern kern_status_t sys_thread_self(kern_handle_t *out); extern kern_status_t sys_thread_start(kern_handle_t thread); extern kern_status_t sys_thread_exit(void); extern kern_status_t sys_thread_config_get( diff --git a/libmango/arch/x86_64/syscall.S b/libmango/arch/x86_64/syscall.S index 6c7eebb..8bbe42b 100644 --- a/libmango/arch/x86_64/syscall.S +++ b/libmango/arch/x86_64/syscall.S @@ -56,13 +56,14 @@ .endm SYSCALL_GATE task_exit SYS_TASK_EXIT 1 -SYSCALL_GATE task_self SYS_TASK_SELF 0 +SYSCALL_GATE task_self SYS_TASK_SELF 1 SYSCALL_GATE task_create SYS_TASK_CREATE 5 SYSCALL_GATE task_create_thread SYS_TASK_CREATE_THREAD 6 SYSCALL_GATE task_get_address_space SYS_TASK_GET_ADDRESS_SPACE 1 SYSCALL_GATE task_config_get SYS_TASK_CONFIG_GET 4 SYSCALL_GATE task_config_set SYS_TASK_CONFIG_SET 4 +SYSCALL_GATE thread_self SYS_THREAD_SELF 1 SYSCALL_GATE thread_start SYS_THREAD_START 1 SYSCALL_GATE thread_exit SYS_THREAD_EXIT 0 SYSCALL_GATE thread_config_get SYS_THREAD_CONFIG_GET 4 diff --git a/libmango/include-user/mango/task.h b/libmango/include-user/mango/task.h index 11217ff..b2136bc 100644 --- a/libmango/include-user/mango/task.h +++ b/libmango/include-user/mango/task.h @@ -34,6 +34,7 @@ extern kern_status_t task_config_set( const void *ptr, size_t len); +extern kern_status_t thread_self(kern_handle_t *out); extern kern_status_t thread_start(kern_handle_t thread); extern kern_status_t thread_exit(void); extern kern_status_t thread_config_get( diff --git a/libmango/include/mango/syscall.h b/libmango/include/mango/syscall.h index 08b8aa0..1151597 100644 --- a/libmango/include/mango/syscall.h +++ b/libmango/include/mango/syscall.h @@ -1,52 +1,53 @@ #ifndef MANGO_SYSCALL_H_ #define MANGO_SYSCALL_H_ -#define SYS_KERN_LOG 0x00u -#define SYS_KERN_HANDLE_CLOSE 0x01u -#define SYS_KERN_HANDLE_DUPLICATE 0x02u -#define SYS_KERN_CONFIG_GET 0x03u -#define SYS_KERN_CONFIG_SET 0x04u -#define SYS_KERN_OBJECT_WAIT 0x05u -#define SYS_KERN_OBJECT_WAIT_ASYNC 0x06u -#define SYS_TASK_EXIT 0x07u -#define SYS_TASK_SELF 0x08u -#define SYS_TASK_CREATE 0x09u -#define SYS_TASK_CREATE_THREAD 0x0Au -#define SYS_TASK_GET_ADDRESS_SPACE 0x0Bu -#define SYS_TASK_CONFIG_GET 0x2Au -#define SYS_TASK_CONFIG_SET 0x2Bu -#define SYS_THREAD_START 0x0Cu -#define SYS_THREAD_EXIT 0x2Eu -#define SYS_THREAD_CONFIG_GET 0x2Cu -#define SYS_THREAD_CONFIG_SET 0x2Du -#define SYS_VM_OBJECT_CREATE 0x0Du -#define SYS_VM_OBJECT_READ 0x0Eu -#define SYS_VM_OBJECT_WRITE 0x0Fu -#define SYS_VM_OBJECT_COPY 0x10u -#define SYS_ADDRESS_SPACE_READ 0x11u -#define SYS_ADDRESS_SPACE_WRITE 0x12u -#define SYS_ADDRESS_SPACE_MAP 0x13u -#define SYS_ADDRESS_SPACE_UNMAP 0x14u -#define SYS_ADDRESS_SPACE_RESERVE 0x15u -#define SYS_ADDRESS_SPACE_RELEASE 0x16u -#define SYS_MSG_SEND 0x17u -#define SYS_MSG_RECV 0x18u -#define SYS_MSG_REPLY 0x19u -#define SYS_MSG_READ 0x1Au -#define SYS_MSG_WRITE 0x1Bu -#define SYS_CHANNEL_CREATE 0x1Cu -#define SYS_PORT_CREATE 0x1Du -#define SYS_PORT_CONNECT 0x1Eu -#define SYS_PORT_DISCONNECT 0x1Fu -#define SYS_EQUEUE_CREATE 0x20u -#define SYS_EQUEUE_DEQUEUE 0x21u -#define SYS_VM_CONTROLLER_CREATE 0x22u -#define SYS_VM_CONTROLLER_RECV 0x23u -#define SYS_VM_CONTROLLER_RECV_ASYNC 0x24u -#define SYS_VM_CONTROLLER_CREATE_OBJECT 0x25u -#define SYS_VM_CONTROLLER_DETACH_OBJECT 0x26u -#define SYS_VM_CONTROLLER_SUPPLY_PAGES 0x27u -#define SYS_FUTEX_WAIT 0x28u -#define SYS_FUTEX_WAKE 0x29u +#define SYS_KERN_LOG 1 +#define SYS_KERN_HANDLE_CLOSE 2 +#define SYS_KERN_HANDLE_DUPLICATE 3 +#define SYS_KERN_CONFIG_GET 4 +#define SYS_KERN_CONFIG_SET 5 +#define SYS_KERN_OBJECT_WAIT 6 +#define SYS_KERN_OBJECT_WAIT_ASYNC 7 +#define SYS_TASK_EXIT 8 +#define SYS_TASK_SELF 9 +#define SYS_TASK_CREATE 10 +#define SYS_TASK_CREATE_THREAD 11 +#define SYS_TASK_GET_ADDRESS_SPACE 12 +#define SYS_TASK_CONFIG_GET 13 +#define SYS_TASK_CONFIG_SET 14 +#define SYS_THREAD_SELF 15 +#define SYS_THREAD_START 16 +#define SYS_THREAD_EXIT 17 +#define SYS_THREAD_CONFIG_GET 18 +#define SYS_THREAD_CONFIG_SET 19 +#define SYS_VM_OBJECT_CREATE 20 +#define SYS_VM_OBJECT_READ 21 +#define SYS_VM_OBJECT_WRITE 22 +#define SYS_VM_OBJECT_COPY 23 +#define SYS_ADDRESS_SPACE_READ 24 +#define SYS_ADDRESS_SPACE_WRITE 25 +#define SYS_ADDRESS_SPACE_MAP 26 +#define SYS_ADDRESS_SPACE_UNMAP 27 +#define SYS_ADDRESS_SPACE_RESERVE 28 +#define SYS_ADDRESS_SPACE_RELEASE 29 +#define SYS_MSG_SEND 30 +#define SYS_MSG_RECV 31 +#define SYS_MSG_REPLY 32 +#define SYS_MSG_READ 33 +#define SYS_MSG_WRITE 34 +#define SYS_CHANNEL_CREATE 35 +#define SYS_PORT_CREATE 36 +#define SYS_PORT_CONNECT 37 +#define SYS_PORT_DISCONNECT 38 +#define SYS_EQUEUE_CREATE 39 +#define SYS_EQUEUE_DEQUEUE 40 +#define SYS_VM_CONTROLLER_CREATE 41 +#define SYS_VM_CONTROLLER_RECV 42 +#define SYS_VM_CONTROLLER_RECV_ASYNC 43 +#define SYS_VM_CONTROLLER_CREATE_OBJECT 44 +#define SYS_VM_CONTROLLER_DETACH_OBJECT 45 +#define SYS_VM_CONTROLLER_SUPPLY_PAGES 46 +#define SYS_FUTEX_WAIT 47 +#define SYS_FUTEX_WAKE 48 #endif diff --git a/syscall/dispatch.c b/syscall/dispatch.c index 64210be..6c63f72 100644 --- a/syscall/dispatch.c +++ b/syscall/dispatch.c @@ -10,6 +10,7 @@ static const virt_addr_t syscall_table[] = { SYSCALL_TABLE_ENTRY(TASK_CREATE, task_create), SYSCALL_TABLE_ENTRY(TASK_CREATE_THREAD, task_create_thread), SYSCALL_TABLE_ENTRY(TASK_GET_ADDRESS_SPACE, task_get_address_space), + SYSCALL_TABLE_ENTRY(THREAD_SELF, thread_self), SYSCALL_TABLE_ENTRY(THREAD_START, thread_start), SYSCALL_TABLE_ENTRY(THREAD_EXIT, thread_exit), SYSCALL_TABLE_ENTRY(THREAD_CONFIG_GET, thread_config_get), diff --git a/syscall/task.c b/syscall/task.c index 81fa45e..9b2f72a 100644 --- a/syscall/task.c +++ b/syscall/task.c @@ -262,6 +262,37 @@ kern_status_t sys_task_get_address_space( return KERN_OK; } +kern_status_t sys_thread_self(kern_handle_t *out) +{ + struct task *self = current_task(); + if (!validate_access_w(self, out, sizeof *out)) { + return KERN_MEMORY_FAULT; + } + + struct thread *self_thread = current_thread(); + + unsigned long flags; + task_lock_irqsave(self, &flags); + + struct handle *handle_slot = NULL; + kern_handle_t handle; + kern_status_t status = handle_table_alloc_handle( + self->t_handles, + &handle_slot, + &handle); + task_unlock_irqrestore(self, flags); + + if (status != KERN_OK) { + return status; + } + + object_add_handle(&self_thread->tr_base); + handle_slot->h_object = &self_thread->tr_base; + + *out = handle; + return KERN_OK; +} + kern_status_t sys_thread_start(kern_handle_t thread_handle) { unsigned long flags;