Rev 2823 | Rev 2826 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2823 | Rev 2825 | ||
|---|---|---|---|
| Line 22... | Line 22... | ||
| 22 | spinlock_lock(&TASK->lock); |
22 | spinlock_lock(&TASK->lock); |
| 23 | 23 | ||
| 24 | nsc = --TASK->not_stoppable_count; |
24 | nsc = --TASK->not_stoppable_count; |
| 25 | db_call = TASK->debug_begin_call; |
25 | db_call = TASK->debug_begin_call; |
| 26 | 26 | ||
| 27 | if (TASK->stop_request == true) { |
27 | if (TASK->dt_state == UDEBUG_TS_BEGINNING) { |
| 28 | klog_printf("udebug_stoppable_begin"); |
28 | klog_printf("udebug_stoppable_begin"); |
| 29 | klog_printf(" - nsc := %d", nsc); |
29 | klog_printf(" - nsc := %d", nsc); |
| 30 | } |
30 | } |
| 31 | 31 | ||
| 32 | if (TASK->stop_request == true && nsc == 0) { |
32 | if (TASK->dt_state == UDEBUG_TS_BEGINNING && nsc == 0) { |
| 33 | TASK->stop_request = false; |
33 | TASK->dt_state = UDEBUG_TS_ACTIVE; |
| 34 | TASK->debug_begin_call = NULL; |
34 | TASK->debug_begin_call = NULL; |
| 35 | spinlock_unlock(&TASK->lock); |
35 | spinlock_unlock(&TASK->lock); |
| 36 | interrupts_restore(ipl); |
36 | interrupts_restore(ipl); |
| 37 | 37 | ||
| 38 | IPC_SET_RETVAL(db_call->data, 0); |
38 | IPC_SET_RETVAL(db_call->data, 0); |
| Line 50... | Line 50... | ||
| 50 | 50 | ||
| 51 | restart: |
51 | restart: |
| 52 | ipl = interrupts_disable(); |
52 | ipl = interrupts_disable(); |
| 53 | spinlock_lock(&TASK->lock); |
53 | spinlock_lock(&TASK->lock); |
| 54 | 54 | ||
| - | 55 | if ((TASK->dt_state == UDEBUG_TS_BEGINNING || |
|
| - | 56 | TASK->dt_state == UDEBUG_TS_ACTIVE) && |
|
| 55 | if (TASK->stop_request) { |
57 | THREAD->debug_stop == true) { |
| 56 | TASK->debug_begin_call = NULL; |
58 | TASK->debug_begin_call = NULL; |
| 57 | spinlock_unlock(&TASK->lock); |
59 | spinlock_unlock(&TASK->lock); |
| 58 | interrupts_restore(ipl); |
60 | interrupts_restore(ipl); |
| 59 | 61 | ||
| 60 | klog_printf("udebug_stoppable_end: waitq_sleep"); |
62 | klog_printf("udebug_stoppable_end: waitq_sleep"); |
| Line 75... | Line 77... | ||
| 75 | ipl_t ipl; |
77 | ipl_t ipl; |
| 76 | 78 | ||
| 77 | ipl = interrupts_disable(); |
79 | ipl = interrupts_disable(); |
| 78 | spinlock_lock(&TASK->lock); |
80 | spinlock_lock(&TASK->lock); |
| 79 | 81 | ||
| 80 | /* being debugged + have go */ |
- | |
| 81 | if (TASK->being_debugged && !TASK->stop_request) { |
82 | if (TASK->dt_state == UDEBUG_TS_ACTIVE) { |
| 82 | klog_printf("udebug_syscall_event"); |
83 | klog_printf("udebug_syscall_event"); |
| 83 | call = TASK->debug_go_call; |
84 | call = TASK->debug_go_call; |
| 84 | IPC_SET_RETVAL(call->data, 0); |
85 | IPC_SET_RETVAL(call->data, 0); |
| 85 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_SYSCALL); |
86 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_SYSCALL); |
| 86 | IPC_SET_ARG2(call->data, id); |
87 | IPC_SET_ARG2(call->data, id); |
| Line 92... | Line 93... | ||
| 92 | THREAD->syscall_args[2] = a3; |
93 | THREAD->syscall_args[2] = a3; |
| 93 | THREAD->syscall_args[3] = a4; |
94 | THREAD->syscall_args[3] = a4; |
| 94 | THREAD->syscall_args[4] = a5; |
95 | THREAD->syscall_args[4] = a5; |
| 95 | THREAD->syscall_args[5] = a6; |
96 | THREAD->syscall_args[5] = a6; |
| 96 | 97 | ||
| - | 98 | /* |
|
| - | 99 | * Make sure debug_stop is true when going to sleep |
|
| - | 100 | * in case we get woken up by DEBUG_END. (At which |
|
| - | 101 | * point it must be back to the initial true value). |
|
| - | 102 | */ |
|
| - | 103 | THREAD->debug_stop = true; |
|
| - | 104 | ||
| 97 | ipc_answer(&TASK->answerbox, TASK->debug_go_call); |
105 | ipc_answer(&TASK->answerbox, TASK->debug_go_call); |
| 98 | spinlock_unlock(&TASK->lock); |
106 | spinlock_unlock(&TASK->lock); |
| 99 | interrupts_restore(ipl); |
107 | interrupts_restore(ipl); |
| 100 | 108 | ||
| 101 | waitq_sleep(&THREAD->go_wq); |
109 | waitq_sleep(&THREAD->go_wq); |