Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2921 → Rev 2922

/branches/tracing/uspace/app/debug/cmd.c
62,14 → 62,30
uintptr_t addr;
char brkp[1];
int rc;
breakpoint_t *brk;
int i;
 
brk = NULL;
for (i = 0; i < MAX_BRKPTS; i++)
if (brk_list[i].set == 0) brk = brk_list+i;
 
if (!brk) {
printf("too many breakpoints\n");
return;
}
 
(void)argc;
addr = strtoul(argv[1], NULL, 0);
 
printf("You requested a breakpoint at 0x%x\n", addr);
rc = udebug_mem_read(app_phone, &brk->back, addr, 1);
printf("udebug_mem_read() -> %d\n", rc);
brkp[0] = 0xcc;
rc = udebug_mem_write(app_phone, brkp, addr, 1);
printf("udebug_mem_write() -> %d\n", rc);
 
brk->addr = addr;
brk->set = 1;
}
 
void cmd_help(int argc, char *argv[])
/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;
}
}
/branches/tracing/uspace/app/debug/main.h
35,6 → 35,15
#ifndef MAIN_H_
#define MAIN_H_
 
typedef struct {
int set;
unsigned char back;
unsigned addr;
} breakpoint_t;
 
#define MAX_BRKPTS 64
extern breakpoint_t brk_list[MAX_BRKPTS];
 
extern int app_phone;
 
#endif