kernel: add a syscall to duplicate a handle

This commit is contained in:
2026-03-14 22:30:13 +00:00
parent b7f3bd77a7
commit 2d267d2b51
5 changed files with 39 additions and 0 deletions

View File

@@ -23,6 +23,7 @@ static const virt_addr_t syscall_table[] = {
SYSCALL_TABLE_ENTRY(ADDRESS_SPACE_RELEASE, address_space_release),
SYSCALL_TABLE_ENTRY(KERN_LOG, kern_log),
SYSCALL_TABLE_ENTRY(KERN_HANDLE_CLOSE, kern_handle_close),
SYSCALL_TABLE_ENTRY(KERN_HANDLE_DUPLICATE, kern_handle_duplicate),
SYSCALL_TABLE_ENTRY(KERN_CONFIG_GET, kern_config_get),
SYSCALL_TABLE_ENTRY(KERN_CONFIG_SET, kern_config_set),
SYSCALL_TABLE_ENTRY(CHANNEL_CREATE, channel_create),

View File

@@ -4,5 +4,36 @@
kern_status_t sys_kern_handle_close(kern_handle_t handle)
{
struct task *self = current_task();
return task_close_handle(self, handle);
}
kern_status_t sys_kern_handle_duplicate(
kern_handle_t handle,
kern_handle_t *out)
{
struct task *self = current_task();
if (!validate_access_w(self, out, sizeof *out)) {
return KERN_MEMORY_FAULT;
}
unsigned long flags;
task_lock_irqsave(self, &flags);
struct object *obj = NULL;
handle_flags_t handle_flags = 0;
kern_status_t status
= task_resolve_handle(self, handle, &obj, &handle_flags);
if (status != KERN_OK) {
task_unlock_irqrestore(self, flags);
return status;
}
status = task_open_handle(self, obj, handle_flags, out);
object_unref(obj);
task_unlock_irqrestore(self, flags);
return status;
}