* Generalized address checks. The debugger can now also read the commpage. * Added new syscall _kern_get_thread_cpu_state() to get the CPU state of a not running thread. Introduced arch_get_thread_debug_cpu_state() for that purpose, which is only implemented for x86 ATM (uses the new i386_get_thread_user_iframe()). * Don't allow a debugger to change a thread's "esp" anymore. That's the esp register in the kernel. "user_esp" can still be changed. * Generally set RF (resume flag) in eflags in interrupt handlers, not only after a instruction breakpoint debug exception. This should prevent breakpoints from being triggered more than once (e.g. when the breakpoint is on an instruction that can cause a page fault). I still saw those with bdb in VMware, but that might be a VMware bug. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31045 a95241bf-73f2-0310-859d-f6bbb57e9c96
119 lines
1.9 KiB
C++
119 lines
1.9 KiB
C++
/*
|
|
* Copyright 2007, François Revol, [email protected].
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Copyright 2005, Axel Dörfler, [email protected]
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
#include <debugger.h>
|
|
#include <int.h>
|
|
#include <thread.h>
|
|
#include <arch/user_debugger.h>
|
|
|
|
|
|
#warning M68K: WRITEME
|
|
void
|
|
arch_clear_team_debug_info(struct arch_team_debug_info *info)
|
|
{
|
|
}
|
|
|
|
|
|
void
|
|
arch_destroy_team_debug_info(struct arch_team_debug_info *info)
|
|
{
|
|
arch_clear_team_debug_info(info);
|
|
}
|
|
|
|
|
|
void
|
|
arch_clear_thread_debug_info(struct arch_thread_debug_info *info)
|
|
{
|
|
}
|
|
|
|
|
|
void
|
|
arch_destroy_thread_debug_info(struct arch_thread_debug_info *info)
|
|
{
|
|
arch_clear_thread_debug_info(info);
|
|
}
|
|
|
|
|
|
void
|
|
arch_update_thread_single_step()
|
|
{
|
|
if (struct iframe* frame = m68k_get_user_iframe()) {
|
|
struct thread* thread = thread_get_current_thread();
|
|
|
|
// set/clear T1 in SR depending on if single stepping is desired
|
|
// T1 T0
|
|
// 0 0 no tracing
|
|
// 0 1 trace on flow
|
|
// 1 0 single step
|
|
// 1 1 undef
|
|
// note 060 and 020(?) only have T1 bit,
|
|
// but this should be compatible as well.
|
|
if (thread->debug_info.flags & B_THREAD_DEBUG_SINGLE_STEP) {
|
|
frame->cpu.sr &= ~(M68K_SR_T_MASK);
|
|
frame->cpu.sr |= (1 << M68K_SR_T1);
|
|
} else {
|
|
frame->cpu.sr &= ~(M68K_SR_T_MASK);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
arch_set_debug_cpu_state(const struct debug_cpu_state *cpuState)
|
|
{
|
|
}
|
|
|
|
|
|
void
|
|
arch_get_debug_cpu_state(struct debug_cpu_state *cpuState)
|
|
{
|
|
}
|
|
|
|
|
|
status_t
|
|
arch_get_thread_debug_cpu_state(struct thread *thread,
|
|
struct debug_cpu_state *cpuState)
|
|
{
|
|
return B_UNSUPPORTED;
|
|
}
|
|
|
|
|
|
status_t
|
|
arch_set_breakpoint(void *address)
|
|
{
|
|
return B_ERROR;
|
|
}
|
|
|
|
|
|
status_t
|
|
arch_clear_breakpoint(void *address)
|
|
{
|
|
return B_ERROR;
|
|
}
|
|
|
|
|
|
status_t
|
|
arch_set_watchpoint(void *address, uint32 type, int32 length)
|
|
{
|
|
return B_ERROR;
|
|
}
|
|
|
|
|
|
status_t
|
|
arch_clear_watchpoint(void *address)
|
|
{
|
|
return B_ERROR;
|
|
}
|
|
|
|
bool
|
|
arch_has_breakpoints(struct arch_team_debug_info *info)
|
|
{
|
|
return false;
|
|
}
|