x86: Debugger can now use dr3
This commit is contained in:
@@ -62,7 +62,7 @@ void arch_syscall_64_bit_return_value(void);
|
|||||||
static inline void
|
static inline void
|
||||||
arch_thread_set_current_thread(Thread* t)
|
arch_thread_set_current_thread(Thread* t)
|
||||||
{
|
{
|
||||||
asm volatile("mov %0, %%gs:0" : : "r" (t));
|
asm volatile("mov %0, %%gs:0" : : "r" (t) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,12 +9,7 @@
|
|||||||
#define ARCH_INIT_USER_DEBUG x86_init_user_debug
|
#define ARCH_INIT_USER_DEBUG x86_init_user_debug
|
||||||
|
|
||||||
// number of breakpoints the CPU supports
|
// number of breakpoints the CPU supports
|
||||||
// On 32-bit, DR3 is used to hold the Thread*.
|
#define X86_BREAKPOINT_COUNT 4
|
||||||
#ifdef __x86_64__
|
|
||||||
# define X86_BREAKPOINT_COUNT 4
|
|
||||||
#else
|
|
||||||
# define X86_BREAKPOINT_COUNT 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// debug status register DR6
|
// debug status register DR6
|
||||||
enum {
|
enum {
|
||||||
|
|||||||
@@ -1202,13 +1202,13 @@ arch_debug_get_interrupt_pc(bool* _isSyscall)
|
|||||||
void
|
void
|
||||||
arch_debug_unset_current_thread(void)
|
arch_debug_unset_current_thread(void)
|
||||||
{
|
{
|
||||||
#ifdef __x86_64__
|
|
||||||
// Can't just write 0 to the GS base, that will cause the read from %gs:0
|
// Can't just write 0 to the GS base, that will cause the read from %gs:0
|
||||||
// to fault. Instead point it at a NULL pointer, %gs:0 will get this value.
|
// to fault. Instead point it at a NULL pointer, %gs:0 will get this value.
|
||||||
static Thread* unsetThread = NULL;
|
static Thread* unsetThread = NULL;
|
||||||
|
#ifdef __x86_64__
|
||||||
x86_write_msr(IA32_MSR_GS_BASE, (addr_t)&unsetThread);
|
x86_write_msr(IA32_MSR_GS_BASE, (addr_t)&unsetThread);
|
||||||
#else
|
#else
|
||||||
x86_write_dr3(NULL);
|
asm volatile("mov %0, %%gs:0" : : "r" (unsetThread) : "memory");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -201,10 +201,7 @@ install_breakpoints(const arch_team_debug_info& teamInfo)
|
|||||||
asm("mov %0, %%dr0" : : "r"(teamInfo.breakpoints[0].address));
|
asm("mov %0, %%dr0" : : "r"(teamInfo.breakpoints[0].address));
|
||||||
asm("mov %0, %%dr1" : : "r"(teamInfo.breakpoints[1].address));
|
asm("mov %0, %%dr1" : : "r"(teamInfo.breakpoints[1].address));
|
||||||
asm("mov %0, %%dr2" : : "r"(teamInfo.breakpoints[2].address));
|
asm("mov %0, %%dr2" : : "r"(teamInfo.breakpoints[2].address));
|
||||||
#ifdef __x86_64__
|
|
||||||
asm("mov %0, %%dr3" : : "r"(teamInfo.breakpoints[3].address));
|
asm("mov %0, %%dr3" : : "r"(teamInfo.breakpoints[3].address));
|
||||||
// DR3 is used to hold the current Thread* on 32.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// enable breakpoints
|
// enable breakpoints
|
||||||
asm("mov %0, %%dr7" : : "r"(teamInfo.dr7));
|
asm("mov %0, %%dr7" : : "r"(teamInfo.dr7));
|
||||||
|
|||||||
Reference in New Issue
Block a user