Rev 3108 | Rev 3426 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3108 | Rev 3424 | ||
---|---|---|---|
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 <console/klog.h> |
51 | #include <print.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 286... | Line 286... | ||
286 | mutex_unlock(&THREAD->udebug.lock); |
286 | mutex_unlock(&THREAD->udebug.lock); |
287 | mutex_unlock(&TASK->udebug.lock); |
287 | mutex_unlock(&TASK->udebug.lock); |
288 | return; |
288 | return; |
289 | } |
289 | } |
290 | 290 | ||
291 | //klog_printf("udebug_syscall_event"); |
291 | //printf("udebug_syscall_event\n"); |
292 | call = THREAD->udebug.go_call; |
292 | call = THREAD->udebug.go_call; |
293 | THREAD->udebug.go_call = NULL; |
293 | THREAD->udebug.go_call = NULL; |
294 | 294 | ||
295 | IPC_SET_RETVAL(call->data, 0); |
295 | IPC_SET_RETVAL(call->data, 0); |
296 | IPC_SET_ARG1(call->data, etype); |
296 | IPC_SET_ARG1(call->data, etype); |
297 | IPC_SET_ARG2(call->data, id); |
297 | IPC_SET_ARG2(call->data, id); |
298 | IPC_SET_ARG3(call->data, rc); |
298 | IPC_SET_ARG3(call->data, rc); |
299 | //klog_printf("udebug_syscall_event/ipc_answer"); |
299 | //printf("udebug_syscall_event/ipc_answer\n"); |
300 | 300 | ||
301 | THREAD->udebug.syscall_args[0] = a1; |
301 | THREAD->udebug.syscall_args[0] = a1; |
302 | THREAD->udebug.syscall_args[1] = a2; |
302 | THREAD->udebug.syscall_args[1] = a2; |
303 | THREAD->udebug.syscall_args[2] = a3; |
303 | THREAD->udebug.syscall_args[2] = a3; |
304 | THREAD->udebug.syscall_args[3] = a4; |
304 | THREAD->udebug.syscall_args[3] = a4; |
Line 330... | Line 330... | ||
330 | udebug_int_lock(); |
330 | udebug_int_lock(); |
331 | 331 | ||
332 | mutex_lock(&TASK->udebug.lock); |
332 | mutex_lock(&TASK->udebug.lock); |
333 | mutex_lock(&THREAD->udebug.lock); |
333 | mutex_lock(&THREAD->udebug.lock); |
334 | 334 | ||
335 | klog_printf("udebug_thread_b_event"); |
335 | printf("udebug_thread_b_event\n"); |
336 | klog_printf("- check state"); |
336 | printf("- check state\n"); |
337 | 337 | ||
338 | /* Must only generate events when in debugging session */ |
338 | /* Must only generate events when in debugging session */ |
339 | if (THREAD->udebug.debug_active != true) { |
339 | if (THREAD->udebug.debug_active != true) { |
340 | klog_printf("- debug_active: %s, udebug.stop: %s", |
340 | printf("- debug_active: %s, udebug.stop: %s\n", |
341 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
341 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
342 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
342 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
343 | mutex_unlock(&THREAD->udebug.lock); |
343 | mutex_unlock(&THREAD->udebug.lock); |
344 | mutex_unlock(&TASK->udebug.lock); |
344 | mutex_unlock(&TASK->udebug.lock); |
345 | return; |
345 | return; |
346 | } |
346 | } |
347 | 347 | ||
348 | klog_printf("- trigger event"); |
348 | printf("- trigger event\n"); |
349 | 349 | ||
350 | call = THREAD->udebug.go_call; |
350 | call = THREAD->udebug.go_call; |
351 | THREAD->udebug.go_call = NULL; |
351 | THREAD->udebug.go_call = NULL; |
352 | IPC_SET_RETVAL(call->data, 0); |
352 | IPC_SET_RETVAL(call->data, 0); |
353 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
353 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
Line 364... | Line 364... | ||
364 | ipc_answer(&TASK->answerbox, call); |
364 | ipc_answer(&TASK->answerbox, call); |
365 | 365 | ||
366 | mutex_unlock(&THREAD->udebug.lock); |
366 | mutex_unlock(&THREAD->udebug.lock); |
367 | mutex_unlock(&TASK->udebug.lock); |
367 | mutex_unlock(&TASK->udebug.lock); |
368 | 368 | ||
369 | klog_printf("- sleep"); |
369 | printf("- sleep\n"); |
370 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
370 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
371 | 371 | ||
372 | udebug_int_unlock(); |
372 | udebug_int_unlock(); |
373 | } |
373 | } |
374 | 374 | ||
Line 379... | Line 379... | ||
379 | udebug_int_lock(); |
379 | udebug_int_lock(); |
380 | 380 | ||
381 | mutex_lock(&TASK->udebug.lock); |
381 | mutex_lock(&TASK->udebug.lock); |
382 | mutex_lock(&THREAD->udebug.lock); |
382 | mutex_lock(&THREAD->udebug.lock); |
383 | 383 | ||
384 | klog_printf("udebug_thread_e_event"); |
384 | printf("udebug_thread_e_event\n"); |
385 | klog_printf("- check state"); |
385 | printf("- check state\n"); |
386 | 386 | ||
387 | /* Must only generate events when in debugging session */ |
387 | /* Must only generate events when in debugging session */ |
388 | if (THREAD->udebug.debug_active != true) { |
388 | if (THREAD->udebug.debug_active != true) { |
389 | klog_printf("- debug_active: %s, udebug.stop: %s", |
389 | printf("- debug_active: %s, udebug.stop: %s\n", |
390 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
390 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
391 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
391 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
392 | mutex_unlock(&THREAD->udebug.lock); |
392 | mutex_unlock(&THREAD->udebug.lock); |
393 | mutex_unlock(&TASK->udebug.lock); |
393 | mutex_unlock(&TASK->udebug.lock); |
394 | return; |
394 | return; |
395 | } |
395 | } |
396 | 396 | ||
397 | klog_printf("- trigger event"); |
397 | printf("- trigger event\n"); |
398 | 398 | ||
399 | call = THREAD->udebug.go_call; |
399 | call = THREAD->udebug.go_call; |
400 | THREAD->udebug.go_call = NULL; |
400 | THREAD->udebug.go_call = NULL; |
401 | IPC_SET_RETVAL(call->data, 0); |
401 | IPC_SET_RETVAL(call->data, 0); |
402 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
402 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
Line 439... | Line 439... | ||
439 | mutex_unlock(&TASK->udebug.lock); |
439 | mutex_unlock(&TASK->udebug.lock); |
440 | udebug_int_unlock(); |
440 | udebug_int_unlock(); |
441 | return; |
441 | return; |
442 | } |
442 | } |
443 | 443 | ||
444 | klog_printf("udebug_breakpoint/trap_event"); |
444 | printf("udebug_breakpoint/trap_event\n"); |
445 | call = THREAD->udebug.go_call; |
445 | call = THREAD->udebug.go_call; |
446 | THREAD->udebug.go_call = NULL; |
446 | THREAD->udebug.go_call = NULL; |
447 | 447 | ||
448 | IPC_SET_RETVAL(call->data, 0); |
448 | IPC_SET_RETVAL(call->data, 0); |
449 | IPC_SET_ARG1(call->data, etype); |
449 | IPC_SET_ARG1(call->data, etype); |
Line 455... | Line 455... | ||
455 | * point it must be back to the initial true value). |
455 | * point it must be back to the initial true value). |
456 | */ |
456 | */ |
457 | THREAD->udebug.stop = true; |
457 | THREAD->udebug.stop = true; |
458 | THREAD->udebug.cur_event = etype; |
458 | THREAD->udebug.cur_event = etype; |
459 | 459 | ||
460 | klog_printf("- send answer"); |
460 | printf("- send answer\n"); |
461 | ipc_answer(&TASK->answerbox, call); |
461 | ipc_answer(&TASK->answerbox, call); |
462 | 462 | ||
463 | mutex_unlock(&THREAD->udebug.lock); |
463 | mutex_unlock(&THREAD->udebug.lock); |
464 | mutex_unlock(&TASK->udebug.lock); |
464 | mutex_unlock(&TASK->udebug.lock); |
465 | 465 | ||
Line 489... | Line 489... | ||
489 | thread_t *t; |
489 | thread_t *t; |
490 | link_t *cur; |
490 | link_t *cur; |
491 | int flags; |
491 | int flags; |
492 | ipl_t ipl; |
492 | ipl_t ipl; |
493 | 493 | ||
494 | klog_printf("udebug_task_cleanup()"); |
494 | printf("udebug_task_cleanup()\n"); |
495 | klog_printf("task %llu", ta->taskid); |
495 | printf("task %llu\n", ta->taskid); |
496 | 496 | ||
497 | udebug_int_lock(); |
497 | udebug_int_lock(); |
498 | 498 | ||
499 | if (ta->udebug.dt_state != UDEBUG_TS_BEGINNING && |
499 | if (ta->udebug.dt_state != UDEBUG_TS_BEGINNING && |
500 | ta->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
500 | ta->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
501 | klog_printf("udebug_task_cleanup(): task not being debugged"); |
501 | printf("udebug_task_cleanup(): task not being debugged\n"); |
502 | return EINVAL; |
502 | return EINVAL; |
503 | } |
503 | } |
504 | 504 | ||
505 | /* Finish debugging of all userspace threads */ |
505 | /* Finish debugging of all userspace threads */ |
506 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
506 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
Line 529... | Line 529... | ||
529 | * this doesn't affect anything. |
529 | * this doesn't affect anything. |
530 | */ |
530 | */ |
531 | t->udebug.stop = true; |
531 | t->udebug.stop = true; |
532 | 532 | ||
533 | /* Answer GO call */ |
533 | /* Answer GO call */ |
534 | klog_printf("answer GO call with EVENT_FINISHED"); |
534 | printf("answer GO call with EVENT_FINISHED\n"); |
535 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
535 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
536 | IPC_SET_ARG1(t->udebug.go_call->data, UDEBUG_EVENT_FINISHED); |
536 | IPC_SET_ARG1(t->udebug.go_call->data, UDEBUG_EVENT_FINISHED); |
537 | 537 | ||
538 | ipc_answer(&ta->answerbox, t->udebug.go_call); |
538 | ipc_answer(&ta->answerbox, t->udebug.go_call); |
539 | t->udebug.go_call = NULL; |
539 | t->udebug.go_call = NULL; |