Rev 3438 | Rev 3457 | 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; |