Rev 2899 | Rev 2902 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2899 | Rev 2901 | ||
---|---|---|---|
Line 166... | Line 166... | ||
166 | interrupts_restore(ipl); |
166 | interrupts_restore(ipl); |
167 | } |
167 | } |
168 | } |
168 | } |
169 | 169 | ||
170 | void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3, |
170 | void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3, |
171 | unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc) |
171 | unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc, |
- | 172 | bool end_variant) |
|
172 | { |
173 | { |
173 | call_t *call; |
174 | call_t *call; |
174 | ipl_t ipl; |
175 | ipl_t ipl; |
- | 176 | udebug_event_t etype; |
|
- | 177 | ||
- | 178 | etype = end_variant ? UDEBUG_EVENT_SYSCALL_E : UDEBUG_EVENT_SYSCALL_B; |
|
175 | 179 | ||
176 | ipl = interrupts_disable(); |
180 | ipl = interrupts_disable(); |
177 | spinlock_lock(&THREAD->debug_lock); |
181 | spinlock_lock(&THREAD->debug_lock); |
178 | 182 | ||
179 | /* Must only generate events when in debugging session and have go */ |
183 | /* Must only generate events when in debugging session and have go */ |
180 | if (THREAD->debug_active != true || |
184 | if (THREAD->debug_active != true || |
181 | THREAD->debug_stop == true || |
185 | THREAD->debug_stop == true || |
182 | (TASK->debug_evmask & UDEBUG_EM_SYSCALL) == 0) { |
186 | (TASK->debug_evmask & UDEBUG_EVMASK(etype)) == 0) { |
183 | spinlock_unlock(&THREAD->debug_lock); |
187 | spinlock_unlock(&THREAD->debug_lock); |
184 | interrupts_restore(ipl); |
188 | interrupts_restore(ipl); |
185 | return; |
189 | return; |
186 | } |
190 | } |
187 | 191 | ||
188 | klog_printf("udebug_syscall_event"); |
192 | klog_printf("udebug_syscall_event"); |
189 | call = THREAD->debug_go_call; |
193 | call = THREAD->debug_go_call; |
190 | IPC_SET_RETVAL(call->data, 0); |
194 | IPC_SET_RETVAL(call->data, 0); |
191 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_SYSCALL); |
195 | IPC_SET_ARG1(call->data, etype); |
192 | IPC_SET_ARG2(call->data, id); |
196 | IPC_SET_ARG2(call->data, id); |
193 | IPC_SET_ARG3(call->data, rc); |
197 | IPC_SET_ARG3(call->data, rc); |
194 | klog_printf("udebug_syscall_event/ipc_answer"); |
198 | klog_printf("udebug_syscall_event/ipc_answer"); |
195 | 199 | ||
196 | THREAD->syscall_args[0] = a1; |
200 | THREAD->syscall_args[0] = a1; |
Line 205... | Line 209... | ||
205 | * in case we get woken up by DEBUG_END. (At which |
209 | * in case we get woken up by DEBUG_END. (At which |
206 | * point it must be back to the initial true value). |
210 | * point it must be back to the initial true value). |
207 | */ |
211 | */ |
208 | THREAD->debug_stop = true; |
212 | THREAD->debug_stop = true; |
209 | 213 | ||
210 | THREAD->cur_event = UDEBUG_EVENT_SYSCALL; |
214 | THREAD->cur_event = etype; |
211 | spinlock_unlock(&THREAD->debug_lock); |
215 | spinlock_unlock(&THREAD->debug_lock); |
212 | 216 | ||
213 | spinlock_lock(&TASK->lock); |
217 | spinlock_lock(&TASK->lock); |
214 | ipc_answer(&TASK->answerbox, THREAD->debug_go_call); |
218 | ipc_answer(&TASK->answerbox, THREAD->debug_go_call); |
215 | spinlock_unlock(&TASK->lock); |
219 | spinlock_unlock(&TASK->lock); |