Changes in kernel/generic/src/syscall/syscall.c [057d21a:5bcf1f9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/syscall/syscall.c
r057d21a r5bcf1f9 45 45 #include <debug.h> 46 46 #include <ddi/device.h> 47 #include <interrupt.h> 47 48 #include <ipc/sysipc.h> 48 49 #include <synch/futex.h> … … 56 57 57 58 /** Dispatch system call */ 58 unative_t syscall_handler(unative_t a1, unative_t a2, unative_t a3,59 unative_t a4, unative_t a5, unative_t a6, unative_t id)59 sysarg_t syscall_handler(sysarg_t a1, sysarg_t a2, sysarg_t a3, 60 sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id) 60 61 { 61 unative_t rc; 62 62 /* Do userpace accounting */ 63 irq_spinlock_lock(&THREAD->lock, true); 64 thread_update_accounting(true); 65 irq_spinlock_unlock(&THREAD->lock, true); 66 63 67 #ifdef CONFIG_UDEBUG 64 bool debug; 68 /* 69 * An istate_t-compatible record was created on the stack by the 70 * low-level syscall handler. This is the userspace space state 71 * structure. 72 */ 73 THREAD->udebug.uspace_state = istate_get(THREAD); 65 74 66 75 /* 67 76 * Early check for undebugged tasks. We do not lock anything as this 68 * test need not be precise in either way.77 * test need not be precise in either direction. 69 78 */ 70 debug = THREAD->udebug.active; 71 72 if (debug) { 79 if (THREAD->udebug.active) 73 80 udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, 0, false); 74 }75 81 #endif 76 82 83 sysarg_t rc; 77 84 if (id < SYSCALL_END) { 78 85 rc = syscall_table[id](a1, a2, a3, a4, a5, a6); 79 86 } else { 80 87 printf("Task %" PRIu64": Unknown syscall %#" PRIxn, TASK->taskid, id); 81 task_kill(TASK->taskid); 82 thread_exit(); 88 task_kill_self(true); 83 89 } 84 90 … … 87 93 88 94 #ifdef CONFIG_UDEBUG 89 if ( debug) {95 if (THREAD->udebug.active) { 90 96 udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, rc, true); 91 97 92 98 /* 93 99 * Stopping point needed for tasks that only invoke … … 98 104 udebug_stoppable_end(); 99 105 } 106 107 /* Clear userspace state pointer */ 108 THREAD->udebug.uspace_state = NULL; 100 109 #endif 110 111 /* Do kernel accounting */ 112 irq_spinlock_lock(&THREAD->lock, true); 113 thread_update_accounting(false); 114 irq_spinlock_unlock(&THREAD->lock, true); 101 115 102 116 return rc; … … 111 125 (syshandler_t) sys_thread_exit, 112 126 (syshandler_t) sys_thread_get_id, 127 (syshandler_t) sys_thread_usleep, 113 128 114 129 (syshandler_t) sys_task_get_id, 115 130 (syshandler_t) sys_task_set_name, 131 (syshandler_t) sys_task_kill, 132 (syshandler_t) sys_task_exit, 116 133 (syshandler_t) sys_program_spawn_loader, 117 134 118 135 /* Synchronization related syscalls. */ 119 (syshandler_t) sys_futex_sleep _timeout,136 (syshandler_t) sys_futex_sleep, 120 137 (syshandler_t) sys_futex_wakeup, 121 138 (syshandler_t) sys_smc_coherence, … … 139 156 (syshandler_t) sys_ipc_poke, 140 157 (syshandler_t) sys_ipc_hangup, 141 (syshandler_t) sys_ipc_register_irq, 142 (syshandler_t) sys_ipc_unregister_irq, 143 158 (syshandler_t) sys_ipc_connect_kbox, 159 144 160 /* Event notification syscalls. */ 145 161 (syshandler_t) sys_event_subscribe, … … 153 169 (syshandler_t) sys_physmem_map, 154 170 (syshandler_t) sys_iospace_enable, 155 (syshandler_t) sys_preempt_control, 171 (syshandler_t) sys_register_irq, 172 (syshandler_t) sys_unregister_irq, 156 173 157 174 /* Sysinfo syscalls */ 158 (syshandler_t) sys_sysinfo_valid, 159 (syshandler_t) sys_sysinfo_value, 175 (syshandler_t) sys_sysinfo_get_tag, 176 (syshandler_t) sys_sysinfo_get_value, 177 (syshandler_t) sys_sysinfo_get_data_size, 178 (syshandler_t) sys_sysinfo_get_data, 160 179 161 180 /* Debug calls */ 162 181 (syshandler_t) sys_debug_enable_console, 163 (syshandler_t) sys_debug_disable_console, 164 165 (syshandler_t) sys_ipc_connect_kbox 182 (syshandler_t) sys_debug_disable_console 166 183 }; 167 184
Note:
See TracChangeset
for help on using the changeset viewer.