Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2921 → Rev 2922

/branches/tracing/uspace/app/debug/main.c
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;
}
}