diff options
author | Pedro Alves <pedro@codesourcery.com> | 2007-05-10 21:48:56 +0000 |
---|---|---|
committer | Pedro Alves <pedro@codesourcery.com> | 2007-05-10 21:48:56 +0000 |
commit | abb2b892c20a80c4901384a172ecde13c6fe5c14 (patch) | |
tree | 01b9a587db9c91ce50ce993f09e08637dda2bd82 /gdb/gdbserver/win32-arm-low.c | |
parent | 637f7d589ae8d57e1996dcc93167ded09aaea56d (diff) | |
download | gdb-abb2b892c20a80c4901384a172ecde13c6fe5c14.tar.gz |
* 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.
Diffstat (limited to 'gdb/gdbserver/win32-arm-low.c')
-rw-r--r-- | gdb/gdbserver/win32-arm-low.c | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/gdb/gdbserver/win32-arm-low.c b/gdb/gdbserver/win32-arm-low.c index 08c5a0945e4..6c4b80a4819 100644 --- a/gdb/gdbserver/win32-arm-low.c +++ b/gdb/gdbserver/win32-arm-low.c @@ -20,12 +20,24 @@ #include "server.h" #include "win32-low.h" -/* Fetch register(s) from gdbserver regcache data. */ +#ifndef CONTEXT_FLOATING_POINT +#define CONTEXT_FLOATING_POINT 0 +#endif + static void -do_fetch_inferior_registers (win32_thread_info *th, int r) +arm_get_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) { - char *context_offset = regptr (&th->context, r); - supply_register (r, context_offset); + th->context.ContextFlags = \ + CONTEXT_FULL | \ + CONTEXT_FLOATING_POINT; + + GetThreadContext (th->h, &th->context); +} + +static void +arm_set_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) +{ + SetThreadContext (th->h, &th->context); } #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x)) @@ -59,18 +71,53 @@ static const int mappings[] = { }; #undef context_offset -static const unsigned char arm_wince_le_breakpoint[] = - { 0x10, 0x00, 0x00, 0xe6 }; +/* Return a pointer into a CONTEXT field indexed by gdb register number. + Return a pointer to an dummy register holding zero if there is no + corresponding CONTEXT field for the given register number. */ +static char * +regptr (CONTEXT* c, int r) +{ + if (mappings[r] < 0) + { + static ULONG zero; + /* Always force value to zero, in case the user tried to write + to this register before. */ + zero = 0; + return (char *) &zero; + } + else + return (char *) c + mappings[r]; +} + +/* Fetch register from gdbserver regcache data. */ +static void +arm_fetch_inferior_register (win32_thread_info *th, int r) +{ + char *context_offset = regptr (&th->context, r); + supply_register (r, context_offset); +} + +/* Store a new register value into the thread context of TH. */ +static void +arm_store_inferior_register (win32_thread_info *th, int r) +{ + collect_register (r, regptr (&th->context, r)); +} + +/* Correct in either endianness. We do not support Thumb yet. */ +static const unsigned long arm_wince_breakpoint = 0xe6000001; +#define arm_wince_breakpoint_len 4 struct win32_target_ops the_low_target = { - mappings, sizeof (mappings) / sizeof (mappings[0]), NULL, /* initial_stuff */ - NULL, /* store_debug_registers */ - NULL, /* load_debug_registers */ - do_fetch_inferior_registers, + arm_get_thread_context, + arm_set_thread_context, + NULL, /* thread_added */ + arm_fetch_inferior_register, + arm_store_inferior_register, NULL, /* single_step */ - arm_wince_le_breakpoint, - sizeof (arm_wince_le_breakpoint) / sizeof (arm_wince_le_breakpoint[0]), + (const unsigned char *) &arm_wince_breakpoint, + arm_wince_breakpoint_len, "arm" /* arch_string */ }; |