From 04617e81e3ceadf3c0d1f1ff51fe8292a0a63508 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 29 Mar 2026 11:50:37 +0100 Subject: [PATCH] kernel: add a syscall to query generic information about an object --- include/kernel/syscall.h | 3 +++ libmango/arch/x86_64/syscall.S | 1 + libmango/include-user/mango/object.h | 3 +++ libmango/include/mango/syscall.h | 1 + libmango/include/mango/types.h | 4 ++++ syscall/dispatch.c | 1 + syscall/object.c | 29 ++++++++++++++++++++++++++++ 7 files changed, 42 insertions(+) diff --git a/include/kernel/syscall.h b/include/kernel/syscall.h index a8e281a..1261a64 100644 --- a/include/kernel/syscall.h +++ b/include/kernel/syscall.h @@ -195,6 +195,9 @@ extern kern_status_t sys_msg_write( extern kern_status_t sys_kern_object_wait( kern_wait_item_t *items, size_t nr_items); +extern kern_status_t sys_kern_object_query( + kern_handle_t object, + kern_object_info_t *out); extern kern_status_t sys_vm_controller_create(kern_handle_t *out); extern kern_status_t sys_vm_controller_recv( diff --git a/libmango/arch/x86_64/syscall.S b/libmango/arch/x86_64/syscall.S index 2c9af73..c47d0c9 100644 --- a/libmango/arch/x86_64/syscall.S +++ b/libmango/arch/x86_64/syscall.S @@ -105,6 +105,7 @@ SYSCALL_GATE vm_controller_detach_object SYS_VM_CONTROLLER_DETACH_OBJECT 2 SYSCALL_GATE vm_controller_supply_pages SYS_VM_CONTROLLER_SUPPLY_PAGES 6 SYSCALL_GATE kern_object_wait SYS_KERN_OBJECT_WAIT 2 +SYSCALL_GATE kern_object_query SYS_KERN_OBJECT_QUERY 2 SYSCALL_GATE futex_wait SYS_FUTEX_WAIT 3 SYSCALL_GATE futex_wake SYS_FUTEX_WAKE 3 diff --git a/libmango/include-user/mango/object.h b/libmango/include-user/mango/object.h index 98ff2aa..a76c938 100644 --- a/libmango/include-user/mango/object.h +++ b/libmango/include-user/mango/object.h @@ -4,5 +4,8 @@ #include extern kern_status_t kern_object_wait(kern_wait_item_t *items, size_t nr_items); +extern kern_status_t kern_object_query( + kern_handle_t handle, + kern_object_info_t *out); #endif diff --git a/libmango/include/mango/syscall.h b/libmango/include/mango/syscall.h index f18871e..394e2dd 100644 --- a/libmango/include/mango/syscall.h +++ b/libmango/include/mango/syscall.h @@ -49,5 +49,6 @@ #define SYS_VM_CONTROLLER_SUPPLY_PAGES 46 #define SYS_FUTEX_WAIT 47 #define SYS_FUTEX_WAKE 48 +#define SYS_KERN_OBJECT_QUERY 49 #endif diff --git a/libmango/include/mango/types.h b/libmango/include/mango/types.h index 4fc69dc..9b6ac21 100644 --- a/libmango/include/mango/types.h +++ b/libmango/include/mango/types.h @@ -109,6 +109,10 @@ typedef unsigned short equeue_packet_type_t; typedef unsigned int umode_t; +typedef struct { + koid_t obj_id; +} kern_object_info_t; + typedef struct { virt_addr_t io_base; size_t io_len; diff --git a/syscall/dispatch.c b/syscall/dispatch.c index 0a02447..1446471 100644 --- a/syscall/dispatch.c +++ b/syscall/dispatch.c @@ -52,6 +52,7 @@ static const virt_addr_t syscall_table[] = { VM_CONTROLLER_SUPPLY_PAGES, vm_controller_supply_pages), SYSCALL_TABLE_ENTRY(KERN_OBJECT_WAIT, kern_object_wait), + SYSCALL_TABLE_ENTRY(KERN_OBJECT_QUERY, kern_object_query), SYSCALL_TABLE_ENTRY(FUTEX_WAIT, futex_wait), SYSCALL_TABLE_ENTRY(FUTEX_WAKE, futex_wake), }; diff --git a/syscall/object.c b/syscall/object.c index 5c9f939..0d3ffc1 100644 --- a/syscall/object.c +++ b/syscall/object.c @@ -80,3 +80,32 @@ cleanup: self_thread->tr_state = THREAD_READY; return status; } + +kern_status_t sys_kern_object_query( + kern_handle_t object_handle, + kern_object_info_t *out) +{ + struct task *self = current_task(); + + if (!out) { + return KERN_INVALID_ARGUMENT; + } + + if (!validate_access_w(self, out, sizeof *out)) { + return KERN_MEMORY_FAULT; + } + + struct object *obj = NULL; + handle_flags_t flags = 0; + kern_status_t status + = task_resolve_handle(self, object_handle, &obj, &flags); + if (status != KERN_OK) { + return status; + } + + out->obj_id = obj->ob_id; + + object_unref(obj); + + return KERN_OK; +}