/branches/tracing/kernel/generic/include/udebug/udebug.h |
---|
145,7 → 145,8 |
UDEBUG_EVENT_SYSCALL_E, /**< After finishing syscall execution */ |
UDEBUG_EVENT_THREAD_B, /**< The task created a new thread */ |
UDEBUG_EVENT_THREAD_E, /**< A thread exited */ |
UDEBUG_EVENT_BREAKPOINT /**< Breakpoint instruction executed */ |
UDEBUG_EVENT_BREAKPOINT, /**< Breakpoint instruction executed */ |
UDEBUG_EVENT_TRAP /**< Single-step trap */ |
} udebug_event_t; |
#define UDEBUG_EVMASK(event) (1 << ((event) - 1)) |
158,6 → 159,7 |
UDEBUG_EM_THREAD_B = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B), |
UDEBUG_EM_THREAD_E = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E), |
UDEBUG_EM_BREAKPOINT = UDEBUG_EVMASK(UDEBUG_EVENT_BREAKPOINT), |
UDEBUG_EM_TRAP = UDEBUG_EVMASK(UDEBUG_EVENT_TRAP), |
UDEBUG_EM_ALL = |
UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) | |
UDEBUG_EVMASK(UDEBUG_EVENT_STOP) | |
165,7 → 167,8 |
UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) | |
UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B) | |
UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E) | |
UDEBUG_EVMASK(UDEBUG_EVENT_BREAKPOINT) |
UDEBUG_EVMASK(UDEBUG_EVENT_BREAKPOINT) | |
UDEBUG_EVMASK(UDEBUG_EVENT_TRAP) |
} udebug_evmask_t; |
#ifdef KERNEL |
195,6 → 198,7 |
void udebug_stoppable_end(void); |
void udebug_breakpoint_event(uintptr_t addr); |
void udebug_trap_event(uintptr_t addr); |
int udebug_task_cleanup(struct task *ta); |
/branches/tracing/kernel/generic/src/udebug/udebug.c |
---|
329,14 → 329,11 |
/* This event does not sleep - debugging has finished in this thread */ |
} |
void udebug_breakpoint_event(uintptr_t addr) |
static void breakpoint_trap_event(uintptr_t addr, udebug_event_t etype) |
{ |
call_t *call; |
ipl_t ipl; |
udebug_event_t etype; |
etype = UDEBUG_EVENT_BREAKPOINT; |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->debug_lock); |
349,7 → 346,7 |
return; |
} |
klog_printf("udebug_breakpoint_event"); |
klog_printf("udebug_breakpoint/trap_event"); |
call = THREAD->debug_go_call; |
IPC_SET_RETVAL(call->data, 0); |
IPC_SET_ARG1(call->data, etype); |
374,7 → 371,16 |
udebug_wait_for_go(&THREAD->go_wq); |
} |
void udebug_breakpoint_event(uintptr_t addr) |
{ |
breakpoint_trap_event(addr, UDEBUG_EVENT_BREAKPOINT); |
} |
void udebug_trap_event(uintptr_t addr) |
{ |
breakpoint_trap_event(addr, UDEBUG_EVENT_TRAP); |
} |
/** |
* Terminate task debugging session. |
* |
/branches/tracing/kernel/arch/amd64/src/debugger.c |
---|
328,6 → 328,19 |
unative_t dr6; |
int i; |
dr6 = read_dr6(); |
if (dr6 & DR6_BS) { |
if (THREAD && istate_from_uspace(istate)) { |
/* |
* The userspace thread has TF set and executed |
* an instruction |
*/ |
udebug_trap_event(istate->eip); |
return; |
} |
} |
/* Set RF to restart the instruction */ |
#ifdef amd64 |
istate->rflags |= RFLAGS_RF; |
335,7 → 348,6 |
istate->eflags |= EFLAGS_RF; |
#endif |
dr6 = read_dr6(); |
for (i=0; i < BKPOINTS_MAX; i++) { |
if (dr6 & (1 << i)) { |
dr6 &= ~ (1 << i); |
/branches/tracing/kernel/arch/ia32/include/cpu.h |
---|
54,6 → 54,10 |
#define CR4_OSFXSR_MASK (1<<9) |
#define DR6_BT (1<<15) |
#define DR6_BS (1<<14) |
#define DR6_BD (1<<13) |
#endif |
/** @} |