Rev 2834 | Rev 2838 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2834 | Rev 2835 | ||
---|---|---|---|
Line 130... | Line 130... | ||
130 | 130 | ||
131 | ipl = interrupts_disable(); |
131 | ipl = interrupts_disable(); |
132 | ta = get_lock_callee_task(phone); |
132 | ta = get_lock_callee_task(phone); |
133 | klog_printf("task %llu", ta->taskid); |
133 | klog_printf("task %llu", ta->taskid); |
134 | 134 | ||
135 | //TODO: UDEBUG_TS_BEGINNING |
135 | if (ta->dt_state == UDEBUG_TS_BEGINNING && |
136 | if (ta->dt_state != UDEBUG_TS_ACTIVE) { |
136 | ta->dt_state != UDEBUG_TS_ACTIVE) { |
137 | spinlock_unlock(&ta->lock); |
137 | spinlock_unlock(&ta->lock); |
138 | interrupts_restore(ipl); |
138 | interrupts_restore(ipl); |
139 | klog_printf("udebug_rp_begin(): task not in TS_BEGINNING"); |
139 | klog_printf("udebug_rp_begin(): task not being debugged"); |
140 | return EINVAL; |
140 | return EINVAL; |
141 | } |
141 | } |
142 | 142 | ||
143 | /* Clear debug_active from all of the task's userspace threads */ |
143 | /* Finish debugging of all userspace threads */ |
144 | - | ||
145 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
144 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
146 | t = list_get_instance(cur, thread_t, th_link); |
145 | t = list_get_instance(cur, thread_t, th_link); |
147 | 146 | ||
148 | spinlock_lock(&t->lock); |
147 | spinlock_lock(&t->lock); |
149 | if ((t->flags & THREAD_FLAG_USPACE) != 0) |
- | |
150 | t->debug_active = true; |
- | |
151 | spinlock_unlock(&t->lock); |
- | |
152 | } |
- | |
153 | 148 | ||
154 | /* Now respond to unanswered GO calls and reset thread states */ |
149 | /* Only process userspace threads */ |
155 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
150 | if ((t->flags & THREAD_FLAG_USPACE) != 0) { |
156 | t = list_get_instance(cur, thread_t, th_link); |
151 | /* Prevent any further debug activity in thread */ |
157 | - | ||
158 | spinlock_lock(&t->lock); |
152 | t->debug_active = false; |
159 | 153 | ||
160 | /* Still has go? */ |
154 | /* Still has go? */ |
161 | if ((t->flags & THREAD_FLAG_USPACE) != 0 && |
- | |
162 | t->debug_stop == false) { |
155 | if (t->debug_stop == false) { |
163 | /* |
156 | /* |
164 | * Yes, so clear go. As debug_active == false, |
157 | * Yes, so clear go. As debug_active == false, |
165 | * this doesn't affect anything. |
158 | * this doesn't affect anything. |
166 | */ |
159 | */ |
167 | t->debug_stop = true; |
160 | t->debug_stop = true; |
168 | 161 | ||
169 | /* Answer GO call */ |
162 | /* Answer GO call */ |
170 | ipc_answer(&ta->answerbox, t->debug_go_call); |
163 | ipc_answer(&ta->answerbox, t->debug_go_call); |
171 | } else { |
164 | } else { |
172 | /* |
165 | /* |
173 | * Debug_stop is already at initial value. |
166 | * Debug_stop is already at initial value. |
174 | * Yet this means the thread needs waking up. |
167 | * Yet this means the thread needs waking up. |
175 | */ |
168 | */ |
176 | waitq_wakeup(&t->go_wq, WAKEUP_FIRST); |
169 | waitq_wakeup(&t->go_wq, WAKEUP_FIRST); |
- | 170 | } |
|
177 | } |
171 | } |
- | 172 | ||
178 | spinlock_unlock(&t->lock); |
173 | spinlock_unlock(&t->lock); |
179 | } |
174 | } |
180 | 175 | ||
181 | ta->dt_state = UDEBUG_TS_INACTIVE; |
176 | ta->dt_state = UDEBUG_TS_INACTIVE; |
182 | 177 |