Rev 2938 | Rev 2940 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2938 | Rev 2939 | ||
---|---|---|---|
Line 65... | Line 65... | ||
65 | int next_thread_id; |
65 | int next_thread_id; |
66 | 66 | ||
67 | int app_phone; |
67 | int app_phone; |
68 | volatile bool abort_debug; |
68 | volatile bool abort_debug; |
69 | 69 | ||
70 | thash_t thash; |
- | |
71 | volatile int paused; |
70 | volatile int paused; |
72 | 71 | ||
73 | breakpoint_t brk_list[MAX_BRKPTS]; |
72 | breakpoint_t brk_list[MAX_BRKPTS]; |
74 | int lifted_brkpt; |
73 | int lifted_brkpt; |
75 | 74 | ||
Line 140... | Line 139... | ||
140 | (*cmd_table[idx_found].proc)(cmd_argc, cmd_argv); |
139 | (*cmd_table[idx_found].proc)(cmd_argc, cmd_argv); |
141 | } |
140 | } |
142 | 141 | ||
143 | static void thread_stop(void) |
142 | static void thread_stop(void) |
144 | { |
143 | { |
- | 144 | dthread_t *dt; |
|
- | 145 | ||
- | 146 | dt = dthread_get(); |
|
145 | cons_printf("[t] stopped\n"); |
147 | cons_printf("[thread %d] stopped\n", dt->id); |
146 | fcv_wait(&go_cv); |
148 | dthread_stop_me(); |
147 | cons_printf("[t] go\n"); |
149 | cons_printf("[thread %d] go\n", dt->id); |
148 | } |
150 | } |
149 | 151 | ||
150 | /* |
152 | /* |
151 | * Called by a fibril (from arch code) when a breakpoint is hit. |
153 | * Called by a fibril (from arch code) when a breakpoint is hit. |
152 | */ |
154 | */ |
Line 220... | Line 222... | ||
220 | static void debug_event(thash_t thash, udebug_event_t ev_type, sysarg_t val0) |
222 | static void debug_event(thash_t thash, udebug_event_t ev_type, sysarg_t val0) |
221 | { |
223 | { |
222 | switch (ev_type) { |
224 | switch (ev_type) { |
223 | case UDEBUG_EVENT_STOP: |
225 | case UDEBUG_EVENT_STOP: |
224 | cons_printf("stop event\n"); |
226 | cons_printf("stop event\n"); |
225 | cons_printf("waiting for resume\n"); |
- | |
226 | while (paused) { |
- | |
227 | usleep(1000000); |
- | |
228 | fibril_yield(); |
227 | thread_stop(); |
229 | cons_printf("."); |
- | |
230 | } |
- | |
231 | cons_printf("resumed\n"); |
- | |
232 | break; |
228 | break; |
233 | case UDEBUG_EVENT_THREAD_B: |
229 | case UDEBUG_EVENT_THREAD_B: |
234 | event_thread_b(val0); |
230 | event_thread_b(val0); |
235 | break; |
231 | break; |
236 | case UDEBUG_EVENT_THREAD_E: |
232 | case UDEBUG_EVENT_THREAD_E: |
Line 268... | Line 264... | ||
268 | 264 | ||
269 | if (ev_type == UDEBUG_EVENT_FINISHED) { |
265 | if (ev_type == UDEBUG_EVENT_FINISHED) { |
270 | cons_printf("thread %u debugging finished\n", dt->id); |
266 | cons_printf("thread %u debugging finished\n", dt->id); |
271 | break; |
267 | break; |
272 | } |
268 | } |
273 | if (rc >= 0) debug_event(thash, ev_type, val0); |
269 | if (rc >= 0) debug_event(dt->hash, ev_type, val0); |
274 | } |
270 | } |
275 | 271 | ||
276 | cons_printf("debug_loop(%d) exiting\n", dt->id); |
272 | cons_printf("debug_loop(%d) exiting\n", dt->id); |
277 | } |
273 | } |
278 | 274 | ||
Line 285... | Line 281... | ||
285 | 281 | ||
286 | fid = fibril_create(debug_loop, (void *)dt); |
282 | fid = fibril_create(debug_loop, (void *)dt); |
287 | if (fid == 0) { |
283 | if (fid == 0) { |
288 | cons_printf("Warning: Failed creating fibril\n"); |
284 | cons_printf("Warning: Failed creating fibril\n"); |
289 | } |
285 | } |
- | 286 | dt->fid = fid; |
|
- | 287 | ||
290 | fibril_add_ready(fid); |
288 | fibril_add_ready(fid); |
291 | } |
289 | } |
292 | 290 | ||
293 | void debug_active_task(void) |
291 | void debug_active_task(void) |
294 | { |
292 | { |