kernel: add a syscall to query generic information about an object

This commit is contained in:
2026-03-29 11:50:37 +01:00
parent 62770f4ab2
commit 04617e81e3
7 changed files with 42 additions and 0 deletions
+3
View File
@@ -195,6 +195,9 @@ extern kern_status_t sys_msg_write(
extern kern_status_t sys_kern_object_wait( extern kern_status_t sys_kern_object_wait(
kern_wait_item_t *items, kern_wait_item_t *items,
size_t nr_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_create(kern_handle_t *out);
extern kern_status_t sys_vm_controller_recv( extern kern_status_t sys_vm_controller_recv(
+1
View File
@@ -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 vm_controller_supply_pages SYS_VM_CONTROLLER_SUPPLY_PAGES 6
SYSCALL_GATE kern_object_wait SYS_KERN_OBJECT_WAIT 2 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_wait SYS_FUTEX_WAIT 3
SYSCALL_GATE futex_wake SYS_FUTEX_WAKE 3 SYSCALL_GATE futex_wake SYS_FUTEX_WAKE 3
+3
View File
@@ -4,5 +4,8 @@
#include <mango/types.h> #include <mango/types.h>
extern kern_status_t kern_object_wait(kern_wait_item_t *items, size_t nr_items); 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 #endif
+1
View File
@@ -49,5 +49,6 @@
#define SYS_VM_CONTROLLER_SUPPLY_PAGES 46 #define SYS_VM_CONTROLLER_SUPPLY_PAGES 46
#define SYS_FUTEX_WAIT 47 #define SYS_FUTEX_WAIT 47
#define SYS_FUTEX_WAKE 48 #define SYS_FUTEX_WAKE 48
#define SYS_KERN_OBJECT_QUERY 49
#endif #endif
+4
View File
@@ -109,6 +109,10 @@ typedef unsigned short equeue_packet_type_t;
typedef unsigned int umode_t; typedef unsigned int umode_t;
typedef struct {
koid_t obj_id;
} kern_object_info_t;
typedef struct { typedef struct {
virt_addr_t io_base; virt_addr_t io_base;
size_t io_len; size_t io_len;
+1
View File
@@ -52,6 +52,7 @@ static const virt_addr_t syscall_table[] = {
VM_CONTROLLER_SUPPLY_PAGES, VM_CONTROLLER_SUPPLY_PAGES,
vm_controller_supply_pages), vm_controller_supply_pages),
SYSCALL_TABLE_ENTRY(KERN_OBJECT_WAIT, kern_object_wait), 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_WAIT, futex_wait),
SYSCALL_TABLE_ENTRY(FUTEX_WAKE, futex_wake), SYSCALL_TABLE_ENTRY(FUTEX_WAKE, futex_wake),
}; };
+29
View File
@@ -80,3 +80,32 @@ cleanup:
self_thread->tr_state = THREAD_READY; self_thread->tr_state = THREAD_READY;
return status; 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;
}