kernel: add a syscall to query generic information about an object
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user