forked from Imagelibrary/binutils-gdb
* win32-low.c (debug_registers_changed,
debug_registers_used, CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT, CONTEXT_DEBUG_REGISTERS, CONTEXT_DEBUGGER, CONTEXT_DEBUGGER_DR): Delete. (thread_rec): Get context using the low target. (child_add_thread): Call thread_added on the low target, which does the same thing. (regptr): Delete. (do_initial_child_stuff): Remove debug registers references. Set context using the low target. Resume threads after setting the contexts. (child_continue): Remove dead variable. Remove debug registers references. (child_fetch_inferior_registers): Go through the low target. (do_child_store_inferior_registers): Remove. (child_store_inferior_registers): Go through the low target. (win32_resume): Remove debug registers references. Set context using the low target. (handle_exception): Change return type to void. Don't record context here. Set status to TARGET_WAITKIND_SPURIOUS on a first chance exception. (get_child_debug_event): Change return type to void. Remove goto loop. Always return after waiting for debug event. (win32_wait): Convert to switch statement. Handle spurious events. * win32-i386-low.c (debug_registers_changed, debug_registers_used): New. (initial_stuff): Rename to ... (i386_initial_stuff): ... this. Clear debug registers state variables. (store_debug_registers): Delete. (i386_get_thread_context): New. (load_debug_registers): Delete. (i386_set_thread_context): New. (i386_thread_added): New. (single_step): Rename to ... (i386_single_step): ... this. (do_fetch_inferior_registers): Rename to ... (i386_fetch_inferior_register): ... this. (i386_store_inferior_register): New. (the_low_target): Adapt to new interface. * win32-arm-low.c (CONTEXT_FLOATING_POINT): Define. (arm_get_thread_context): New. (arm_set_thread_context): New. (regptr): New. (do_fetch_inferior_registers): Rename to ... (arm_fetch_inferior_register): ... this. (arm_store_inferior_register): New. (arm_wince_breakpoint): Reimplement as unsigned long. (arm_wince_breakpoint_len): Define. (the_low_target): Adapt to new interface. * win32-low.h (target_ops): Remove regmap, store_debug_registers and load_debug_registers. Add get_thread_context, set_thread_context, thread_added and store_inferior_register. Rename fetch_inferior_registers to fetch_inferior_register. (regptr): Remove declaration.
This commit is contained in:
@@ -27,58 +27,83 @@
|
||||
|
||||
static unsigned dr[8];
|
||||
|
||||
static int debug_registers_changed = 0;
|
||||
static int debug_registers_used = 0;
|
||||
|
||||
static void
|
||||
initial_stuff (void)
|
||||
i386_initial_stuff (void)
|
||||
{
|
||||
memset (&dr, 0, sizeof (dr));
|
||||
debug_registers_changed = 0;
|
||||
debug_registers_used = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
store_debug_registers (win32_thread_info *th)
|
||||
i386_get_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event)
|
||||
{
|
||||
dr[0] = th->context.Dr0;
|
||||
dr[1] = th->context.Dr1;
|
||||
dr[2] = th->context.Dr2;
|
||||
dr[3] = th->context.Dr3;
|
||||
dr[6] = th->context.Dr6;
|
||||
dr[7] = th->context.Dr7;
|
||||
}
|
||||
th->context.ContextFlags = \
|
||||
CONTEXT_FULL | \
|
||||
CONTEXT_FLOATING_POINT | \
|
||||
CONTEXT_EXTENDED_REGISTERS | \
|
||||
CONTEXT_DEBUG_REGISTERS;
|
||||
|
||||
static void
|
||||
load_debug_registers (win32_thread_info *th)
|
||||
{
|
||||
th->context.Dr0 = dr[0];
|
||||
th->context.Dr1 = dr[1];
|
||||
th->context.Dr2 = dr[2];
|
||||
th->context.Dr3 = dr[3];
|
||||
/* th->context.Dr6 = dr[6];
|
||||
FIXME: should we set dr6 also ?? */
|
||||
th->context.Dr7 = dr[7];
|
||||
}
|
||||
GetThreadContext (th->h, &th->context);
|
||||
|
||||
/* Fetch register(s) from gdbserver regcache data. */
|
||||
static void
|
||||
do_fetch_inferior_registers (win32_thread_info *th, int r)
|
||||
{
|
||||
char *context_offset = regptr (&th->context, r);
|
||||
debug_registers_changed = 0;
|
||||
|
||||
long l;
|
||||
if (r == FCS_REGNUM)
|
||||
if (th->tid == current_event->dwThreadId)
|
||||
{
|
||||
l = *((long *) context_offset) & 0xffff;
|
||||
supply_register (r, (char *) &l);
|
||||
/* Copy dr values from the current thread. */
|
||||
dr[0] = th->context.Dr0;
|
||||
dr[1] = th->context.Dr1;
|
||||
dr[2] = th->context.Dr2;
|
||||
dr[3] = th->context.Dr3;
|
||||
dr[6] = th->context.Dr6;
|
||||
dr[7] = th->context.Dr7;
|
||||
}
|
||||
else if (r == FOP_REGNUM)
|
||||
{
|
||||
l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
|
||||
supply_register (r, (char *) &l);
|
||||
}
|
||||
else
|
||||
supply_register (r, context_offset);
|
||||
}
|
||||
|
||||
static void
|
||||
single_step (win32_thread_info *th)
|
||||
i386_set_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event)
|
||||
{
|
||||
if (debug_registers_changed)
|
||||
{
|
||||
th->context.Dr0 = dr[0];
|
||||
th->context.Dr1 = dr[1];
|
||||
th->context.Dr2 = dr[2];
|
||||
th->context.Dr3 = dr[3];
|
||||
/* th->context.Dr6 = dr[6];
|
||||
FIXME: should we set dr6 also ?? */
|
||||
th->context.Dr7 = dr[7];
|
||||
}
|
||||
|
||||
SetThreadContext (th->h, &th->context);
|
||||
}
|
||||
|
||||
static void
|
||||
i386_thread_added (win32_thread_info *th)
|
||||
{
|
||||
/* Set the debug registers for the new thread if they are used. */
|
||||
if (debug_registers_used)
|
||||
{
|
||||
th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
|
||||
GetThreadContext (th->h, &th->context);
|
||||
|
||||
th->context.Dr0 = dr[0];
|
||||
th->context.Dr1 = dr[1];
|
||||
th->context.Dr2 = dr[2];
|
||||
th->context.Dr3 = dr[3];
|
||||
/* th->context.Dr6 = dr[6];
|
||||
FIXME: should we set dr6 also ?? */
|
||||
th->context.Dr7 = dr[7];
|
||||
|
||||
SetThreadContext (th->h, &th->context);
|
||||
th->context.ContextFlags = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
i386_single_step (win32_thread_info *th)
|
||||
{
|
||||
th->context.EFlags |= FLAG_TRACE_BIT;
|
||||
}
|
||||
@@ -138,15 +163,45 @@ static const int mappings[] = {
|
||||
};
|
||||
#undef context_offset
|
||||
|
||||
/* Fetch register from gdbserver regcache data. */
|
||||
static void
|
||||
i386_fetch_inferior_register (win32_thread_info *th, int r)
|
||||
{
|
||||
char *context_offset = (char *) &th->context + mappings[r];
|
||||
|
||||
long l;
|
||||
if (r == FCS_REGNUM)
|
||||
{
|
||||
l = *((long *) context_offset) & 0xffff;
|
||||
supply_register (r, (char *) &l);
|
||||
}
|
||||
else if (r == FOP_REGNUM)
|
||||
{
|
||||
l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
|
||||
supply_register (r, (char *) &l);
|
||||
}
|
||||
else
|
||||
supply_register (r, context_offset);
|
||||
}
|
||||
|
||||
/* Store a new register value into the thread context of TH. */
|
||||
static void
|
||||
i386_store_inferior_register (win32_thread_info *th, int r)
|
||||
{
|
||||
char *context_offset = (char *) &th->context + mappings[r];
|
||||
collect_register (r, context_offset);
|
||||
}
|
||||
|
||||
struct win32_target_ops the_low_target = {
|
||||
mappings,
|
||||
sizeof (mappings) / sizeof (mappings[0]),
|
||||
initial_stuff,
|
||||
store_debug_registers,
|
||||
load_debug_registers,
|
||||
do_fetch_inferior_registers,
|
||||
single_step,
|
||||
(const char*)NULL, /* breakpoint */
|
||||
i386_initial_stuff,
|
||||
i386_get_thread_context,
|
||||
i386_set_thread_context,
|
||||
i386_thread_added,
|
||||
i386_fetch_inferior_register,
|
||||
i386_store_inferior_register,
|
||||
i386_single_step,
|
||||
NULL, /* breakpoint */
|
||||
0, /* breakpoint_len */
|
||||
"i386" /* arch_string */
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user