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