From: Pedro Alves Date: Sat, 4 Jul 2009 18:13:28 +0000 (+0000) Subject: * win32-i386-low.c (i386_get_thread_context): Handle systems that X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=912cf4ba32021ba75d11c496e9ffd17bbb15bc64;p=binutils-gdb.git * win32-i386-low.c (i386_get_thread_context): Handle systems that don't support CONTEXT_EXTENDED_REGISTERS. (i386_win32_breakpoint, i386_win32_breakpoint_len): New. (the_low_target): Install them. * win32-low.c (get_child_debug_event): Handle WaitForDebugEvent failing with ERROR_PIPE_NOT_CONNECTED. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 86fe1746ae6..4c3a3a1d3e6 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,13 @@ +2009-07-04 Danny Backx + Pedro Alves + + * win32-i386-low.c (i386_get_thread_context): Handle systems that + don't support CONTEXT_EXTENDED_REGISTERS. + (i386_win32_breakpoint, i386_win32_breakpoint_len): New. + (the_low_target): Install them. + * win32-low.c (get_child_debug_event): Handle WaitForDebugEvent + failing with ERROR_PIPE_NOT_CONNECTED. + 2009-06-30 Doug Evans Pierre Muller diff --git a/gdb/gdbserver/win32-i386-low.c b/gdb/gdbserver/win32-i386-low.c index 7e058a58b56..b610631f494 100644 --- a/gdb/gdbserver/win32-i386-low.c +++ b/gdb/gdbserver/win32-i386-low.c @@ -129,13 +129,28 @@ i386_initial_stuff (void) static void i386_get_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) { - th->context.ContextFlags = \ - CONTEXT_FULL | \ - CONTEXT_FLOATING_POINT | \ - CONTEXT_EXTENDED_REGISTERS | \ - CONTEXT_DEBUG_REGISTERS; + /* Requesting the CONTEXT_EXTENDED_REGISTERS register set fails if + the system doesn't support extended registers. */ + static DWORD extended_registers = CONTEXT_EXTENDED_REGISTERS; - GetThreadContext (th->h, &th->context); + again: + th->context.ContextFlags = (CONTEXT_FULL + | CONTEXT_FLOATING_POINT + | CONTEXT_DEBUG_REGISTERS + | extended_registers); + + if (!GetThreadContext (th->h, &th->context)) + { + DWORD e = GetLastError (); + + if (extended_registers && e == ERROR_INVALID_PARAMETER) + { + extended_registers = 0; + goto again; + } + + error ("GetThreadContext failure %ld\n", (long) e); + } debug_registers_changed = 0; @@ -283,6 +298,9 @@ i386_store_inferior_register (win32_thread_info *th, int r) collect_register (r, context_offset); } +static const unsigned char i386_win32_breakpoint = 0xcc; +#define i386_win32_breakpoint_len 1 + struct win32_target_ops the_low_target = { init_registers_i386, sizeof (mappings) / sizeof (mappings[0]), @@ -293,8 +311,8 @@ struct win32_target_ops the_low_target = { i386_fetch_inferior_register, i386_store_inferior_register, i386_single_step, - NULL, /* breakpoint */ - 0, /* breakpoint_len */ + &i386_win32_breakpoint, + i386_win32_breakpoint_len, i386_insert_point, i386_remove_point, i386_stopped_by_watchpoint, diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index a1380f6030b..bcf16b2ece3 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -1407,7 +1407,22 @@ get_child_debug_event (struct target_waitstatus *ourstatus) interruption, but high enough so gdbserver doesn't become a bottleneck. */ if (!WaitForDebugEvent (¤t_event, 250)) - return 0; + { + DWORD e = GetLastError(); + + if (e == ERROR_PIPE_NOT_CONNECTED) + { + /* This will happen if the loader fails to succesfully + load the application, e.g., if the main executable + tries to pull in a non-existing export from a + DLL. */ + ourstatus->kind = TARGET_WAITKIND_EXITED; + ourstatus->value.integer = 1; + return 1; + } + + return 0; + } } gotevent: