diff options
author | Pedro Alves <palves@redhat.com> | 2010-08-25 14:40:21 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2010-08-25 14:40:21 +0000 |
commit | 964e4306f80f7da4474eea57ce49492b73611acb (patch) | |
tree | a808e253ab7d90c5d2f355039eb559f32cd14156 /gdb/gdbserver/win32-i386-low.c | |
parent | 4563a8602899e7270a6a0d8dd5da822c6680c6ba (diff) | |
download | binutils-gdb-964e4306f80f7da4474eea57ce49492b73611acb.tar.gz |
PR threads/10729
* linux-x86-low.c (update_debug_registers_callback): New.
(i386_dr_low_set_addr): Use it.
(i386_dr_low_get_addr): New.
(i386_dr_low_set_control): Use update_debug_registers_callback.
(i386_dr_low_get_control): New.
(i386_dr_low_get_status): Adjust.
* linux-low.c (linux_stop_lwp): New.
* linux-low.h (linux_stop_lwp): Declare.
* i386-low.c (I386_DR_GET_RW_LEN): Take the dr7 contents as
argument instead of a i386_debug_reg_state.
(I386_DR_WATCH_HIT): Take the dr6 contents as argument instead of
a i386_debug_reg_state.
(i386_insert_aligned_watchpoint): Adjust.
(i386_remove_aligned_watchpoint): Adjust.
(i386_low_stopped_data_address): Read the debug registers from the
inferior instead of from the mirrors.
* i386-low.h (struct i386_debug_reg_state): Extend comment.
(i386_dr_low_get_addr): Declare.
(i386_dr_low_get_control): Declare.
(i386_dr_low_get_status): Change prototype.
* win32-i386-low.c (dr_status_mirror, dr_control_mirror): New globals.
(i386_dr_low_get_addr): New.
(i386_dr_low_get_control): New.
(i386_dr_low_get_status): Adjust prototype. Return
dr_status_mirror.
(i386_initial_stuff): Clear dr_status_mirror and
dr_control_mirror.
(i386_get_thread_context): Adjust.
(i386_set_thread_context): Adjust.
(i386_thread_added): Adjust.
Diffstat (limited to 'gdb/gdbserver/win32-i386-low.c')
-rw-r--r-- | gdb/gdbserver/win32-i386-low.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/gdb/gdbserver/win32-i386-low.c b/gdb/gdbserver/win32-i386-low.c index 2e67615497e..2d772113337 100644 --- a/gdb/gdbserver/win32-i386-low.c +++ b/gdb/gdbserver/win32-i386-low.c @@ -37,6 +37,8 @@ void init_registers_i386 (void); #endif static struct i386_debug_reg_state debug_reg_state; +static unsigned dr_status_mirror; +static unsigned dr_control_mirror; static int debug_registers_changed = 0; static int debug_registers_used = 0; @@ -56,6 +58,14 @@ i386_dr_low_set_addr (const struct i386_debug_reg_state *state, int regnum) debug_registers_used = 1; } +CORE_ADDR +i386_dr_low_get_addr (int regnum) +{ + gdb_assert (DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR); + + return debug_reg_state.dr_mirror[regnum]; +} + /* Update the inferior's DR7 debug control register from STATE. */ void @@ -68,14 +78,21 @@ i386_dr_low_set_control (const struct i386_debug_reg_state *state) debug_registers_used = 1; } +unsigned +i386_dr_low_get_control (void) +{ + return dr_control_mirror; +} + /* Get the value of the DR6 debug status register from the inferior and record it in STATE. */ -void -i386_dr_low_get_status (struct i386_debug_reg_state *state) +unsigned +i386_dr_low_get_status (void) { /* We don't need to do anything here, the last call to thread_rec for current_event.dwThreadId id has already set it. */ + return dr_status_mirror; } /* Watchpoint support. */ @@ -133,6 +150,8 @@ i386_initial_stuff (void) i386_low_init_dregs (&debug_reg_state); debug_registers_changed = 0; debug_registers_used = 0; + dr_status_mirror = 0; + dr_control_mirror = 0; } static void @@ -171,8 +190,8 @@ i386_get_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) dr->dr_mirror[1] = th->context.Dr1; dr->dr_mirror[2] = th->context.Dr2; dr->dr_mirror[3] = th->context.Dr3; - dr->dr_status_mirror = th->context.Dr6; - dr->dr_control_mirror = th->context.Dr7; + dr_status_mirror = th->context.Dr6; + dr_control_mirror = th->context.Dr7; } } @@ -186,9 +205,9 @@ i386_set_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) th->context.Dr1 = dr->dr_mirror[1]; th->context.Dr2 = dr->dr_mirror[2]; th->context.Dr3 = dr->dr_mirror[3]; - /* th->context.Dr6 = dr->dr_status_mirror; + /* th->context.Dr6 = dr_status_mirror; FIXME: should we set dr6 also ?? */ - th->context.Dr7 = dr->dr_control_mirror; + th->context.Dr7 = dr_control_mirror; } SetThreadContext (th->h, &th->context); @@ -208,9 +227,9 @@ i386_thread_added (win32_thread_info *th) th->context.Dr1 = dr->dr_mirror[1]; th->context.Dr2 = dr->dr_mirror[2]; th->context.Dr3 = dr->dr_mirror[3]; - /* th->context.Dr6 = dr->dr_status_mirror; + /* th->context.Dr6 = dr_status_mirror; FIXME: should we set dr6 also ?? */ - th->context.Dr7 = dr->dr_control_mirror; + th->context.Dr7 = dr_control_mirror; SetThreadContext (th->h, &th->context); th->context.ContextFlags = 0; |