Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2922 → Rev 2923

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