44,6 → 44,7 |
#include <string.h> |
|
#include "cmd.h" |
#include "include/arch.h" |
#include "main.h" |
|
void thread_debug_start(unsigned thread_hash); |
221,10 → 222,44 |
|
static unsigned buffer[1024]; |
|
static void debug_event(thash_t thash, udebug_event_t ev_type, sysarg_t val0) |
{ |
switch (ev_type) { |
case UDEBUG_EVENT_STOP: |
printf("stop event\n"); |
printf("waiting for resume\n"); |
while (paused) { |
usleep(1000000); |
fibril_yield(); |
printf("."); |
} |
printf("resumed\n"); |
break; |
case UDEBUG_EVENT_THREAD_B: |
event_thread_b(val0); |
break; |
case UDEBUG_EVENT_THREAD_E: |
printf("thread 0x%x exited\n", val0); |
abort_debug = true; |
break; |
case UDEBUG_EVENT_BREAKPOINT: |
printf("breakpoint reached\n"); |
arch_event_breakpoint(thash); |
break; |
case UDEBUG_EVENT_TRAP: |
printf("trap event\n"); |
arch_event_trap(thash); |
break; |
default: |
printf("unknown event type %d\n", ev_type); |
break; |
} |
} |
|
void debug_loop(void *thread_hash_arg) |
{ |
int rc; |
unsigned ev_type; |
udebug_event_t ev_type; |
unsigned thread_hash; |
unsigned thread_id; |
unsigned val0, val1; |
241,78 → 276,12 |
rc = udebug_go(app_phone, thread_hash, |
&ev_type, &val0, &val1); |
|
printf("..ev type %d\n", ev_type); |
|
// printf("rc = %d, ev_type=%d\n", rc, ev_type); |
if (ev_type == UDEBUG_EVENT_FINISHED) { |
printf("thread %u debugging finished\n", thread_id); |
break; |
} |
|
if (rc >= 0) { |
switch (ev_type) { |
case UDEBUG_EVENT_STOP: |
printf("stop event\n"); |
printf("waiting for resume\n"); |
while (paused) { |
usleep(1000000); |
fibril_yield(); |
printf("."); |
} |
printf("resumed\n"); |
break; |
case UDEBUG_EVENT_THREAD_B: |
event_thread_b(val0); |
break; |
case UDEBUG_EVENT_THREAD_E: |
printf("thread 0x%x exited\n", val0); |
abort_debug = true; |
break; |
case UDEBUG_EVENT_BREAKPOINT: |
printf("breakpoint reached\n"); |
rc = udebug_regs_read(app_phone, thread_hash, buffer); |
printf("udebug_regs_read -> %d\n", rc); |
int eip_idx = 12; |
int efl_idx = 14; |
printf("EIP was 0x%08x\n", buffer[eip_idx]); |
int brk_addr = buffer[eip_idx] - 1; |
int bi; |
for (bi = 0; bi < MAX_BRKPTS; bi++) |
if (brk_list[bi].set && brk_list[bi].addr == brk_addr) |
break; |
if (bi < MAX_BRKPTS) { |
buffer[eip_idx] = brk_addr; |
buffer[efl_idx] |= 0x0100; /* trap flag */ |
printf("setting EIP to 0x%08x\n", buffer[eip_idx]); |
rc = udebug_regs_write(app_phone, thread_hash, buffer); |
rc = udebug_mem_write(app_phone, &brk_list[bi].back, brk_addr, 1); |
printf("udebug_mem_write(phone, 0x%x, 0x%02x, 1) -> %d\n", brk_addr, brk_list[bi].back, rc); |
lifted_brkpt = bi; |
} else { |
printf("unrecognized breakpoint at 0x%x\n", brk_addr); |
} |
break; |
case UDEBUG_EVENT_TRAP: |
printf("trap event\n"); |
unsigned char brkinstr[1]; |
breakpoint_t *lb = &brk_list[lifted_brkpt]; |
brkinstr[0] = 0xcc; |
rc = udebug_mem_write(app_phone, brkinstr, lb->addr, 1); |
printf("restore breakpoint -> %d\n", rc); |
|
rc = udebug_regs_read(app_phone, thread_hash, buffer); |
printf("udebug_regs_read -> %d\n", rc); |
int efl_idx2 = 14; |
buffer[efl_idx2] &= ~0x0100; /* trap flag */ |
rc = udebug_regs_write(app_phone, thread_hash, buffer); |
break; |
default: |
printf("unknown event type %d\n", ev_type); |
usleep(1000*1000); |
break; |
} |
} |
|
if (rc >= 0) debug_event(thread_hash, ev_type, val0); |
} |
|
printf("debug_loop(%d) exiting\n", thread_id); |