Rev 3870 | Rev 4386 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3870 | Rev 4384 | ||
---|---|---|---|
Line 269... | Line 269... | ||
269 | mutex_unlock(&THREAD->udebug.lock); |
269 | mutex_unlock(&THREAD->udebug.lock); |
270 | mutex_unlock(&TASK->udebug.lock); |
270 | mutex_unlock(&TASK->udebug.lock); |
271 | return; |
271 | return; |
272 | } |
272 | } |
273 | 273 | ||
274 | //printf("udebug_syscall_event\n"); |
274 | /* Fill in the GO response. */ |
275 | call = THREAD->udebug.go_call; |
275 | call = THREAD->udebug.go_call; |
276 | THREAD->udebug.go_call = NULL; |
276 | THREAD->udebug.go_call = NULL; |
277 | 277 | ||
278 | IPC_SET_RETVAL(call->data, 0); |
278 | IPC_SET_RETVAL(call->data, 0); |
279 | IPC_SET_ARG1(call->data, etype); |
279 | IPC_SET_ARG1(call->data, etype); |
280 | IPC_SET_ARG2(call->data, id); |
280 | IPC_SET_ARG2(call->data, id); |
281 | IPC_SET_ARG3(call->data, rc); |
281 | IPC_SET_ARG3(call->data, rc); |
282 | //printf("udebug_syscall_event/ipc_answer\n"); |
- | |
283 | 282 | ||
284 | THREAD->udebug.syscall_args[0] = a1; |
283 | THREAD->udebug.syscall_args[0] = a1; |
285 | THREAD->udebug.syscall_args[1] = a2; |
284 | THREAD->udebug.syscall_args[1] = a2; |
286 | THREAD->udebug.syscall_args[2] = a3; |
285 | THREAD->udebug.syscall_args[2] = a3; |
287 | THREAD->udebug.syscall_args[3] = a4; |
286 | THREAD->udebug.syscall_args[3] = a4; |
Line 327... | Line 326... | ||
327 | mutex_lock(&TASK->udebug.lock); |
326 | mutex_lock(&TASK->udebug.lock); |
328 | mutex_lock(&THREAD->udebug.lock); |
327 | mutex_lock(&THREAD->udebug.lock); |
329 | 328 | ||
330 | thread_attach(t, ta); |
329 | thread_attach(t, ta); |
331 | 330 | ||
332 | LOG("udebug_thread_b_event\n"); |
- | |
333 | LOG("- check state\n"); |
331 | LOG("Check state"); |
334 | 332 | ||
335 | /* Must only generate events when in debugging session */ |
333 | /* Must only generate events when in debugging session */ |
336 | if (THREAD->udebug.active != true) { |
334 | if (THREAD->udebug.active != true) { |
337 | LOG("- udebug.active: %s, udebug.go: %s\n", |
335 | LOG("udebug.active: %s, udebug.go: %s", |
338 | THREAD->udebug.active ? "yes(+)" : "no(-)", |
336 | THREAD->udebug.active ? "Yes(+)" : "No", |
339 | THREAD->udebug.go ? "yes(-)" : "no(+)"); |
337 | THREAD->udebug.go ? "Yes(-)" : "No"); |
340 | mutex_unlock(&THREAD->udebug.lock); |
338 | mutex_unlock(&THREAD->udebug.lock); |
341 | mutex_unlock(&TASK->udebug.lock); |
339 | mutex_unlock(&TASK->udebug.lock); |
342 | return; |
340 | return; |
343 | } |
341 | } |
344 | 342 | ||
345 | LOG("- trigger event\n"); |
343 | LOG("Trigger event"); |
346 | - | ||
347 | call = THREAD->udebug.go_call; |
344 | call = THREAD->udebug.go_call; |
348 | THREAD->udebug.go_call = NULL; |
345 | THREAD->udebug.go_call = NULL; |
349 | IPC_SET_RETVAL(call->data, 0); |
346 | IPC_SET_RETVAL(call->data, 0); |
350 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
347 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
351 | IPC_SET_ARG2(call->data, (unative_t)t); |
348 | IPC_SET_ARG2(call->data, (unative_t)t); |
Line 361... | Line 358... | ||
361 | ipc_answer(&TASK->answerbox, call); |
358 | ipc_answer(&TASK->answerbox, call); |
362 | 359 | ||
363 | mutex_unlock(&THREAD->udebug.lock); |
360 | mutex_unlock(&THREAD->udebug.lock); |
364 | mutex_unlock(&TASK->udebug.lock); |
361 | mutex_unlock(&TASK->udebug.lock); |
365 | 362 | ||
366 | LOG("- sleep\n"); |
363 | LOG("Wait for Go"); |
367 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
364 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
368 | } |
365 | } |
369 | 366 | ||
370 | /** Thread-termination event hook. |
367 | /** Thread-termination event hook. |
371 | * |
368 | * |
Line 377... | Line 374... | ||
377 | call_t *call; |
374 | call_t *call; |
378 | 375 | ||
379 | mutex_lock(&TASK->udebug.lock); |
376 | mutex_lock(&TASK->udebug.lock); |
380 | mutex_lock(&THREAD->udebug.lock); |
377 | mutex_lock(&THREAD->udebug.lock); |
381 | 378 | ||
382 | LOG("udebug_thread_e_event\n"); |
- | |
383 | LOG("- check state\n"); |
379 | LOG("Check state"); |
384 | 380 | ||
385 | /* Must only generate events when in debugging session. */ |
381 | /* Must only generate events when in debugging session. */ |
386 | if (THREAD->udebug.active != true) { |
382 | if (THREAD->udebug.active != true) { |
387 | /* printf("- udebug.active: %s, udebug.go: %s\n", |
383 | LOG("udebug.active: %s, udebug.go: %s", |
388 | THREAD->udebug.active ? "yes(+)" : "no(-)", |
384 | THREAD->udebug.active ? "Yes" : "No", |
389 | THREAD->udebug.go ? "yes(-)" : "no(+)");*/ |
385 | THREAD->udebug.go ? "Yes" : "No"); |
390 | mutex_unlock(&THREAD->udebug.lock); |
386 | mutex_unlock(&THREAD->udebug.lock); |
391 | mutex_unlock(&TASK->udebug.lock); |
387 | mutex_unlock(&TASK->udebug.lock); |
392 | return; |
388 | return; |
393 | } |
389 | } |
394 | 390 | ||
395 | LOG("- trigger event\n"); |
391 | LOG("Trigger event"); |
396 | - | ||
397 | call = THREAD->udebug.go_call; |
392 | call = THREAD->udebug.go_call; |
398 | THREAD->udebug.go_call = NULL; |
393 | THREAD->udebug.go_call = NULL; |
399 | IPC_SET_RETVAL(call->data, 0); |
394 | IPC_SET_RETVAL(call->data, 0); |
400 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
395 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
401 | 396 | ||
Line 430... | Line 425... | ||
430 | thread_t *t; |
425 | thread_t *t; |
431 | link_t *cur; |
426 | link_t *cur; |
432 | int flags; |
427 | int flags; |
433 | ipl_t ipl; |
428 | ipl_t ipl; |
434 | 429 | ||
435 | LOG("udebug_task_cleanup()\n"); |
- | |
436 | LOG("task %" PRIu64 "\n", ta->taskid); |
- | |
437 | - | ||
438 | if (ta->udebug.dt_state != UDEBUG_TS_BEGINNING && |
430 | if (ta->udebug.dt_state != UDEBUG_TS_BEGINNING && |
439 | ta->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
431 | ta->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
440 | LOG("udebug_task_cleanup(): task not being debugged\n"); |
- | |
441 | return EINVAL; |
432 | return EINVAL; |
442 | } |
433 | } |
443 | 434 | ||
- | 435 | LOG("Task %" PRIu64, ta->taskid); |
|
- | 436 | ||
444 | /* Finish debugging of all userspace threads */ |
437 | /* Finish debugging of all userspace threads */ |
445 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
438 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
446 | t = list_get_instance(cur, thread_t, th_link); |
439 | t = list_get_instance(cur, thread_t, th_link); |
447 | 440 | ||
448 | mutex_lock(&t->udebug.lock); |
441 | mutex_lock(&t->udebug.lock); |
Line 468... | Line 461... | ||
468 | * this doesn't affect anything. |
461 | * this doesn't affect anything. |
469 | */ |
462 | */ |
470 | t->udebug.go = false; |
463 | t->udebug.go = false; |
471 | 464 | ||
472 | /* Answer GO call */ |
465 | /* Answer GO call */ |
473 | LOG("answer GO call with EVENT_FINISHED\n"); |
466 | LOG("Answer GO call with EVENT_FINISHED."); |
474 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
467 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
475 | IPC_SET_ARG1(t->udebug.go_call->data, |
468 | IPC_SET_ARG1(t->udebug.go_call->data, |
476 | UDEBUG_EVENT_FINISHED); |
469 | UDEBUG_EVENT_FINISHED); |
477 | 470 | ||
478 | ipc_answer(&ta->answerbox, t->udebug.go_call); |
471 | ipc_answer(&ta->answerbox, t->udebug.go_call); |