Rev 2902 | Rev 2908 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2902 | Rev 2903 | ||
---|---|---|---|
Line 226... | Line 226... | ||
226 | interrupts_restore(ipl); |
226 | interrupts_restore(ipl); |
227 | 227 | ||
228 | waitq_sleep(&THREAD->go_wq); |
228 | waitq_sleep(&THREAD->go_wq); |
229 | } |
229 | } |
230 | 230 | ||
231 | void udebug_new_thread_event(struct thread *t) |
231 | void udebug_thread_b_event(struct thread *t) |
232 | { |
232 | { |
233 | call_t *call; |
233 | call_t *call; |
234 | ipl_t ipl; |
234 | ipl_t ipl; |
235 | 235 | ||
236 | ipl = interrupts_disable(); |
236 | ipl = interrupts_disable(); |
237 | spinlock_lock(&THREAD->debug_lock); |
237 | spinlock_lock(&THREAD->debug_lock); |
238 | 238 | ||
239 | klog_printf("udebug_new_thread_event"); |
239 | klog_printf("udebug_thread_b_event"); |
240 | klog_printf("- check state"); |
240 | klog_printf("- check state"); |
241 | 241 | ||
242 | /* Must only generate events when in debugging session */ |
242 | /* Must only generate events when in debugging session */ |
243 | if (THREAD->debug_active != true) { |
243 | if (THREAD->debug_active != true) { |
244 | klog_printf("- debug_active: %s, debug_stop: %s", |
244 | klog_printf("- debug_active: %s, debug_stop: %s", |
Line 251... | Line 251... | ||
251 | 251 | ||
252 | klog_printf("- trigger event"); |
252 | klog_printf("- trigger event"); |
253 | 253 | ||
254 | call = THREAD->debug_go_call; |
254 | call = THREAD->debug_go_call; |
255 | IPC_SET_RETVAL(call->data, 0); |
255 | IPC_SET_RETVAL(call->data, 0); |
256 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_NEW_THREAD); |
256 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
257 | IPC_SET_ARG2(call->data, (unative_t)t); |
257 | IPC_SET_ARG2(call->data, (unative_t)t); |
258 | 258 | ||
259 | /* |
259 | /* |
260 | * Make sure debug_stop is true when going to sleep |
260 | * Make sure debug_stop is true when going to sleep |
261 | * in case we get woken up by DEBUG_END. (At which |
261 | * in case we get woken up by DEBUG_END. (At which |
262 | * point it must be back to the initial true value). |
262 | * point it must be back to the initial true value). |
263 | */ |
263 | */ |
264 | THREAD->debug_stop = true; |
264 | THREAD->debug_stop = true; |
265 | 265 | ||
266 | THREAD->cur_event = UDEBUG_EVENT_NEW_THREAD; |
266 | THREAD->cur_event = UDEBUG_EVENT_THREAD_B; |
267 | spinlock_unlock(&THREAD->debug_lock); |
267 | spinlock_unlock(&THREAD->debug_lock); |
268 | 268 | ||
269 | spinlock_lock(&TASK->lock); |
269 | spinlock_lock(&TASK->lock); |
270 | ipc_answer(&TASK->answerbox, THREAD->debug_go_call); |
270 | ipc_answer(&TASK->answerbox, THREAD->debug_go_call); |
271 | spinlock_unlock(&TASK->lock); |
271 | spinlock_unlock(&TASK->lock); |
Line 274... | Line 274... | ||
274 | klog_printf("- sleep"); |
274 | klog_printf("- sleep"); |
275 | 275 | ||
276 | waitq_sleep(&THREAD->go_wq); |
276 | waitq_sleep(&THREAD->go_wq); |
277 | } |
277 | } |
278 | 278 | ||
- | 279 | void udebug_thread_e_event(void) |
|
- | 280 | { |
|
- | 281 | call_t *call; |
|
- | 282 | ipl_t ipl; |
|
- | 283 | ||
- | 284 | ipl = interrupts_disable(); |
|
- | 285 | spinlock_lock(&THREAD->debug_lock); |
|
- | 286 | ||
- | 287 | klog_printf("udebug_thread_e_event"); |
|
- | 288 | klog_printf("- check state"); |
|
- | 289 | ||
- | 290 | /* Must only generate events when in debugging session */ |
|
- | 291 | if (THREAD->debug_active != true) { |
|
- | 292 | klog_printf("- debug_active: %s, debug_stop: %s", |
|
- | 293 | THREAD->debug_active ? "yes(+)" : "no(-)", |
|
- | 294 | THREAD->debug_stop ? "yes(-)" : "no(+)"); |
|
- | 295 | spinlock_unlock(&THREAD->debug_lock); |
|
- | 296 | interrupts_restore(ipl); |
|
- | 297 | return; |
|
- | 298 | } |
|
- | 299 | ||
- | 300 | klog_printf("- trigger event"); |
|
- | 301 | ||
- | 302 | call = THREAD->debug_go_call; |
|
- | 303 | IPC_SET_RETVAL(call->data, 0); |
|
- | 304 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
|
- | 305 | ||
- | 306 | /* |
|
- | 307 | * Make sure debug_stop is true when going to sleep |
|
- | 308 | * in case we get woken up by DEBUG_END. (At which |
|
- | 309 | * point it must be back to the initial true value). |
|
- | 310 | */ |
|
- | 311 | THREAD->debug_stop = true; |
|
- | 312 | ||
- | 313 | THREAD->cur_event = UDEBUG_EVENT_THREAD_E; |
|
- | 314 | spinlock_unlock(&THREAD->debug_lock); |
|
- | 315 | ||
- | 316 | spinlock_lock(&TASK->lock); |
|
- | 317 | ipc_answer(&TASK->answerbox, THREAD->debug_go_call); |
|
- | 318 | spinlock_unlock(&TASK->lock); |
|
- | 319 | ||
- | 320 | interrupts_restore(ipl); |
|
- | 321 | klog_printf("- sleep"); |
|
- | 322 | ||
- | 323 | waitq_sleep(&THREAD->go_wq); |
|
- | 324 | } |
|
- | 325 | ||
- | 326 | ||
279 | /** |
327 | /** |
280 | * Terminate task debugging session. |
328 | * Terminate task debugging session. |
281 | * |
329 | * |
282 | * \param ta Must be already locked and interrupts must be disabled. |
330 | * \param ta Must be already locked and interrupts must be disabled. |
283 | * \return Zero on success or negative error code. |
331 | * \return Zero on success or negative error code. |