#include #include #include #define SYSCALL_TABLE_ENTRY(id, p) [SYS_##id] = (virt_addr_t)(sys_##p) static const virt_addr_t syscall_table[] = { SYSCALL_TABLE_ENTRY(TASK_EXIT, task_exit), SYSCALL_TABLE_ENTRY(TASK_SELF, task_self), 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_START, thread_start), SYSCALL_TABLE_ENTRY(VM_OBJECT_CREATE, vm_object_create), SYSCALL_TABLE_ENTRY(VM_OBJECT_READ, vm_object_read), SYSCALL_TABLE_ENTRY(VM_OBJECT_WRITE, vm_object_write), SYSCALL_TABLE_ENTRY(VM_OBJECT_COPY, vm_object_copy), SYSCALL_TABLE_ENTRY(VM_REGION_CREATE, vm_region_create), SYSCALL_TABLE_ENTRY(VM_REGION_KILL, vm_region_kill), SYSCALL_TABLE_ENTRY(VM_REGION_READ, vm_region_read), SYSCALL_TABLE_ENTRY(VM_REGION_WRITE, vm_region_write), SYSCALL_TABLE_ENTRY(VM_REGION_MAP_ABSOLUTE, vm_region_map_absolute), SYSCALL_TABLE_ENTRY(VM_REGION_MAP_RELATIVE, vm_region_map_relative), SYSCALL_TABLE_ENTRY(VM_REGION_UNMAP_ABSOLUTE, vm_region_unmap_absolute), SYSCALL_TABLE_ENTRY(VM_REGION_UNMAP_RELATIVE, vm_region_unmap_relative), SYSCALL_TABLE_ENTRY(KERN_LOG, kern_log), SYSCALL_TABLE_ENTRY(KERN_HANDLE_CLOSE, kern_handle_close), 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), SYSCALL_TABLE_ENTRY(PORT_CREATE, port_create), SYSCALL_TABLE_ENTRY(PORT_CONNECT, port_connect), SYSCALL_TABLE_ENTRY(PORT_DISCONNECT, port_disconnect), SYSCALL_TABLE_ENTRY(MSG_SEND, msg_send), SYSCALL_TABLE_ENTRY(MSG_RECV, msg_recv), SYSCALL_TABLE_ENTRY(MSG_REPLY, msg_reply), SYSCALL_TABLE_ENTRY(MSG_READ, msg_read), SYSCALL_TABLE_ENTRY(MSG_READ_HANDLES, msg_read_handles), SYSCALL_TABLE_ENTRY(MSG_WRITE, msg_write), SYSCALL_TABLE_ENTRY(MSG_WRITE_HANDLES, msg_write_handles), }; static const size_t syscall_table_count = sizeof syscall_table / sizeof syscall_table[0]; virt_addr_t syscall_get_function(unsigned int sysid) { if (sysid >= syscall_table_count) { return 0; } return syscall_table[sysid]; }