Rev 3438 | Rev 3468 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3438 | Rev 3441 | ||
---|---|---|---|
Line 46... | Line 46... | ||
46 | * so they needn't be protected from the (preemptible) interrupt-initiated |
46 | * so they needn't be protected from the (preemptible) interrupt-initiated |
47 | * code. |
47 | * code. |
48 | */ |
48 | */ |
49 | 49 | ||
50 | #include <synch/waitq.h> |
50 | #include <synch/waitq.h> |
51 | #include <print.h> |
51 | #include <debug.h> |
52 | #include <udebug/udebug.h> |
52 | #include <udebug/udebug.h> |
53 | #include <errno.h> |
53 | #include <errno.h> |
54 | #include <arch.h> |
54 | #include <arch.h> |
55 | 55 | ||
56 | static inline void udebug_int_lock(void) |
56 | static inline void udebug_int_lock(void) |
Line 329... | Line 329... | ||
329 | udebug_int_lock(); |
329 | udebug_int_lock(); |
330 | 330 | ||
331 | mutex_lock(&TASK->udebug.lock); |
331 | mutex_lock(&TASK->udebug.lock); |
332 | mutex_lock(&THREAD->udebug.lock); |
332 | mutex_lock(&THREAD->udebug.lock); |
333 | 333 | ||
334 | printf("udebug_thread_b_event\n"); |
334 | LOG("udebug_thread_b_event\n"); |
335 | printf("- check state\n"); |
335 | LOG("- check state\n"); |
336 | 336 | ||
337 | /* Must only generate events when in debugging session */ |
337 | /* Must only generate events when in debugging session */ |
338 | if (THREAD->udebug.debug_active != true) { |
338 | if (THREAD->udebug.debug_active != true) { |
339 | printf("- debug_active: %s, udebug.stop: %s\n", |
339 | LOG("- debug_active: %s, udebug.stop: %s\n", |
340 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
340 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
341 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
341 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
342 | mutex_unlock(&THREAD->udebug.lock); |
342 | mutex_unlock(&THREAD->udebug.lock); |
343 | mutex_unlock(&TASK->udebug.lock); |
343 | mutex_unlock(&TASK->udebug.lock); |
344 | return; |
344 | return; |
345 | } |
345 | } |
346 | 346 | ||
347 | printf("- trigger event\n"); |
347 | LOG("- trigger event\n"); |
348 | 348 | ||
349 | call = THREAD->udebug.go_call; |
349 | call = THREAD->udebug.go_call; |
350 | THREAD->udebug.go_call = NULL; |
350 | THREAD->udebug.go_call = NULL; |
351 | IPC_SET_RETVAL(call->data, 0); |
351 | IPC_SET_RETVAL(call->data, 0); |
352 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
352 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
Line 363... | Line 363... | ||
363 | ipc_answer(&TASK->answerbox, call); |
363 | ipc_answer(&TASK->answerbox, call); |
364 | 364 | ||
365 | mutex_unlock(&THREAD->udebug.lock); |
365 | mutex_unlock(&THREAD->udebug.lock); |
366 | mutex_unlock(&TASK->udebug.lock); |
366 | mutex_unlock(&TASK->udebug.lock); |
367 | 367 | ||
368 | printf("- sleep\n"); |
368 | LOG("- sleep\n"); |
369 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
369 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
370 | 370 | ||
371 | udebug_int_unlock(); |
371 | udebug_int_unlock(); |
372 | } |
372 | } |
373 | 373 | ||
Line 378... | Line 378... | ||
378 | udebug_int_lock(); |
378 | udebug_int_lock(); |
379 | 379 | ||
380 | mutex_lock(&TASK->udebug.lock); |
380 | mutex_lock(&TASK->udebug.lock); |
381 | mutex_lock(&THREAD->udebug.lock); |
381 | mutex_lock(&THREAD->udebug.lock); |
382 | 382 | ||
383 | // printf("udebug_thread_e_event\n"); |
383 | LOG("udebug_thread_e_event\n"); |
384 | // printf("- check state\n"); |
384 | LOG("- check state\n"); |
385 | 385 | ||
386 | /* Must only generate events when in debugging session */ |
386 | /* Must only generate events when in debugging session */ |
387 | if (THREAD->udebug.debug_active != true) { |
387 | if (THREAD->udebug.debug_active != true) { |
388 | /* printf("- debug_active: %s, udebug.stop: %s\n", |
388 | /* printf("- debug_active: %s, udebug.stop: %s\n", |
389 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
389 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
Line 391... | Line 391... | ||
391 | mutex_unlock(&THREAD->udebug.lock); |
391 | mutex_unlock(&THREAD->udebug.lock); |
392 | mutex_unlock(&TASK->udebug.lock); |
392 | mutex_unlock(&TASK->udebug.lock); |
393 | return; |
393 | return; |
394 | } |
394 | } |
395 | 395 | ||
396 | // printf("- trigger event\n"); |
396 | LOG("- trigger event\n"); |
397 | 397 | ||
398 | call = THREAD->udebug.go_call; |
398 | call = THREAD->udebug.go_call; |
399 | THREAD->udebug.go_call = NULL; |
399 | THREAD->udebug.go_call = NULL; |
400 | IPC_SET_RETVAL(call->data, 0); |
400 | IPC_SET_RETVAL(call->data, 0); |
401 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
401 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
Line 425... | Line 425... | ||
425 | thread_t *t; |
425 | thread_t *t; |
426 | link_t *cur; |
426 | link_t *cur; |
427 | int flags; |
427 | int flags; |
428 | ipl_t ipl; |
428 | ipl_t ipl; |
429 | 429 | ||
430 | printf("udebug_task_cleanup()\n"); |
430 | LOG("udebug_task_cleanup()\n"); |
431 | printf("task %llu\n", ta->taskid); |
431 | LOG("task %" PRIu64 "\n", ta->taskid); |
432 | 432 | ||
433 | udebug_int_lock(); |
433 | udebug_int_lock(); |
434 | 434 | ||
435 | if (ta->udebug.dt_state != UDEBUG_TS_BEGINNING && |
435 | if (ta->udebug.dt_state != UDEBUG_TS_BEGINNING && |
436 | ta->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
436 | ta->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
437 | printf("udebug_task_cleanup(): task not being debugged\n"); |
437 | LOG("udebug_task_cleanup(): task not being debugged\n"); |
438 | return EINVAL; |
438 | return EINVAL; |
439 | } |
439 | } |
440 | 440 | ||
441 | /* Finish debugging of all userspace threads */ |
441 | /* Finish debugging of all userspace threads */ |
442 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
442 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
Line 465... | Line 465... | ||
465 | * this doesn't affect anything. |
465 | * this doesn't affect anything. |
466 | */ |
466 | */ |
467 | t->udebug.stop = true; |
467 | t->udebug.stop = true; |
468 | 468 | ||
469 | /* Answer GO call */ |
469 | /* Answer GO call */ |
470 | printf("answer GO call with EVENT_FINISHED\n"); |
470 | LOG("answer GO call with EVENT_FINISHED\n"); |
471 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
471 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
472 | IPC_SET_ARG1(t->udebug.go_call->data, UDEBUG_EVENT_FINISHED); |
472 | IPC_SET_ARG1(t->udebug.go_call->data, UDEBUG_EVENT_FINISHED); |
473 | 473 | ||
474 | ipc_answer(&ta->answerbox, t->udebug.go_call); |
474 | ipc_answer(&ta->answerbox, t->udebug.go_call); |
475 | t->udebug.go_call = NULL; |
475 | t->udebug.go_call = NULL; |