67,6 → 67,9 |
thash_t thash; |
volatile int paused; |
|
breakpoint_t brk_list[MAX_BRKPTS]; |
int lifted_brkpt; |
|
void read_line(char *buffer, int n) |
{ |
char c; |
216,6 → 219,8 |
thread_debug_start(hash); |
} |
|
static unsigned buffer[1024]; |
|
void debug_loop(void *thread_hash_arg) |
{ |
int rc; |
265,10 → 270,45 |
break; |
case UDEBUG_EVENT_BREAKPOINT: |
printf("breakpoint reached\n"); |
usleep(2000*2000); |
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; |
} |
} |