Rev 4380 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4380 | Rev 4390 | ||
---|---|---|---|
Line 49... | Line 49... | ||
49 | #include "dthread.h" |
49 | #include "dthread.h" |
50 | #include "breakpoint.h" |
50 | #include "breakpoint.h" |
51 | #include "include/arch.h" |
51 | #include "include/arch.h" |
52 | #include "main.h" |
52 | #include "main.h" |
53 | 53 | ||
54 | void thread_debug_start(unsigned thread_hash); |
54 | void thread_debug_start(thash_t thread_hash); |
55 | 55 | ||
56 | #define IN_BUF_SIZE 64 |
56 | #define IN_BUF_SIZE 64 |
57 | static char in_buf[IN_BUF_SIZE]; |
57 | static char in_buf[IN_BUF_SIZE]; |
58 | 58 | ||
59 | #define MAX_ARGC 10 |
59 | #define MAX_ARGC 10 |
Line 319... | Line 319... | ||
319 | *n = tb_copied / sizeof(thash_t); |
319 | *n = tb_copied / sizeof(thash_t); |
320 | 320 | ||
321 | cons_printf("thread hashes:"); |
321 | cons_printf("thread hashes:"); |
322 | 322 | ||
323 | for (i = 0; i < *n; ++i) { |
323 | for (i = 0; i < *n; ++i) { |
324 | cons_printf("0x%x\n", thash_buf[i]); |
324 | cons_printf("0x%lx\n", thash_buf[i]); |
325 | } |
325 | } |
326 | 326 | ||
327 | cons_printf("Total of %u threads\n", *n); |
327 | cons_printf("Total of %u threads\n", *n); |
328 | 328 | ||
329 | *thash_buf_ptr = thash_buf; |
329 | *thash_buf_ptr = thash_buf; |
330 | 330 | ||
331 | return 0; |
331 | return 0; |
332 | } |
332 | } |
333 | 333 | ||
334 | static void event_thread_b(unsigned hash) |
334 | static void event_thread_b(thash_t hash) |
335 | { |
335 | { |
336 | async_serialize_start(); |
336 | async_serialize_start(); |
337 | cons_printf("new thread, hash 0x%x\n", hash); |
337 | cons_printf("new thread, hash 0x%lx\n", hash); |
338 | async_serialize_end(); |
338 | async_serialize_end(); |
339 | 339 | ||
340 | thread_debug_start(hash); |
340 | thread_debug_start(hash); |
341 | } |
341 | } |
342 | 342 | ||
Line 368... | Line 368... | ||
368 | 368 | ||
369 | static int debug_loop(void *dt_arg) |
369 | static int debug_loop(void *dt_arg) |
370 | { |
370 | { |
371 | int rc; |
371 | int rc; |
372 | udebug_event_t ev_type; |
372 | udebug_event_t ev_type; |
373 | unsigned val0, val1; |
373 | sysarg_t val0, val1; |
374 | dthread_t *dt; |
374 | dthread_t *dt; |
375 | 375 | ||
376 | dt = (dthread_t *)dt_arg; |
376 | dt = (dthread_t *)dt_arg; |
377 | 377 | ||
378 | cons_printf("debug_loop(%d)\n", dt->id); |
378 | cons_printf("debug_loop(%d)\n", dt->id); |
379 | 379 | ||
380 | while (!abort_debug) { |
380 | while (!abort_debug) { |
381 | - | ||
382 | /* Run thread until an event occurs */ |
381 | /* Run thread until an event occurs */ |
383 | rc = udebug_go(app_phone, dt->hash, &ev_type, &val0, &val1); |
382 | rc = udebug_go(app_phone, dt->hash, &ev_type, &val0, &val1); |
- | 383 | if (rc < 0) { |
|
- | 384 | cons_printf("Failed resuming thread (%d).\n", rc); |
|
- | 385 | return rc; |
|
- | 386 | } |
|
384 | 387 | ||
385 | if (ev_type == UDEBUG_EVENT_FINISHED) { |
388 | if (ev_type == UDEBUG_EVENT_FINISHED) { |
386 | cons_printf("thread %u debugging finished\n", dt->id); |
389 | cons_printf("thread %u debugging finished\n", dt->id); |
387 | break; |
390 | break; |
388 | } |
391 | } |
389 | if (rc >= 0) debug_event(dt->hash, ev_type, val0); |
392 | debug_event(dt->hash, ev_type, val0); |
390 | } |
393 | } |
391 | 394 | ||
392 | cons_printf("debug_loop(%d) exiting\n", dt->id); |
395 | cons_printf("debug_loop(%d) exiting\n", dt->id); |
393 | return 0; |
396 | return 0; |
394 | } |
397 | } |
395 | 398 | ||
396 | void thread_debug_start(unsigned thash) |
399 | void thread_debug_start(thash_t thash) |
397 | { |
400 | { |
398 | fid_t fid; |
401 | fid_t fid; |
399 | dthread_t *dt; |
402 | dthread_t *dt; |
400 | 403 | ||
401 | dt = dthread_new(thash); |
404 | dt = dthread_new(thash); |