Index: gdb/gdbserver/win32-low.c |
diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c |
index 4d5fe67181c19f6f7d4fe514842b777e9af26e46..979eedd5f8056246662196ff7e6f35dbd724b2f8 100644 |
--- a/gdb/gdbserver/win32-low.c |
+++ b/gdb/gdbserver/win32-low.c |
@@ -1,5 +1,5 @@ |
/* Low level interface to Windows debugging, for gdbserver. |
- Copyright (C) 2006-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2006-2013 Free Software Foundation, Inc. |
Contributed by Leo Zayas. Based on "win32-nat.c" from GDB. |
@@ -25,6 +25,8 @@ |
#include "mem-break.h" |
#include "win32-low.h" |
#include "gdbthread.h" |
+#include "dll.h" |
+#include "hostio.h" |
#include <stdint.h> |
#include <windows.h> |
@@ -32,7 +34,6 @@ |
#include <imagehlp.h> |
#include <tlhelp32.h> |
#include <psapi.h> |
-#include <sys/param.h> |
#include <process.h> |
#ifndef USE_WIN32API |
@@ -87,12 +88,14 @@ static int soft_interrupt_requested = 0; |
by suspending all the threads. */ |
static int faked_breakpoint = 0; |
+const struct target_desc *win32_tdesc; |
+ |
#define NUM_REGS (the_low_target.num_regs) |
-typedef BOOL WINAPI (*winapi_DebugActiveProcessStop) (DWORD dwProcessId); |
-typedef BOOL WINAPI (*winapi_DebugSetProcessKillOnExit) (BOOL KillOnExit); |
-typedef BOOL WINAPI (*winapi_DebugBreakProcess) (HANDLE); |
-typedef BOOL WINAPI (*winapi_GenerateConsoleCtrlEvent) (DWORD, DWORD); |
+typedef BOOL (WINAPI *winapi_DebugActiveProcessStop) (DWORD dwProcessId); |
+typedef BOOL (WINAPI *winapi_DebugSetProcessKillOnExit) (BOOL KillOnExit); |
+typedef BOOL (WINAPI *winapi_DebugBreakProcess) (HANDLE); |
+typedef BOOL (WINAPI *winapi_GenerateConsoleCtrlEvent) (DWORD, DWORD); |
static void win32_resume (struct thread_resume *resume_info, size_t n); |
@@ -193,9 +196,6 @@ child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb) |
th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb; |
add_thread (ptid, th); |
- set_inferior_regcache_data ((struct thread_info *) |
- find_inferior_id (&all_threads, ptid), |
- new_register_cache ()); |
if (the_low_target.thread_added != NULL) |
(*the_low_target.thread_added) (th); |
@@ -280,21 +280,30 @@ static int |
child_xfer_memory (CORE_ADDR memaddr, char *our, int len, |
int write, struct target_ops *target) |
{ |
- SIZE_T done; |
+ BOOL success; |
+ SIZE_T done = 0; |
+ DWORD lasterror = 0; |
uintptr_t addr = (uintptr_t) memaddr; |
if (write) |
{ |
- WriteProcessMemory (current_process_handle, (LPVOID) addr, |
- (LPCVOID) our, len, &done); |
+ success = WriteProcessMemory (current_process_handle, (LPVOID) addr, |
+ (LPCVOID) our, len, &done); |
+ if (!success) |
+ lasterror = GetLastError (); |
FlushInstructionCache (current_process_handle, (LPCVOID) addr, len); |
} |
else |
{ |
- ReadProcessMemory (current_process_handle, (LPCVOID) addr, (LPVOID) our, |
- len, &done); |
+ success = ReadProcessMemory (current_process_handle, (LPCVOID) addr, |
+ (LPVOID) our, len, &done); |
+ if (!success) |
+ lasterror = GetLastError (); |
} |
- return done; |
+ if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0) |
+ return done; |
+ else |
+ return success ? done : -1; |
} |
/* Clear out any old thread list and reinitialize it to a pristine |
@@ -308,6 +317,8 @@ child_init_thread_list (void) |
static void |
do_initial_child_stuff (HANDLE proch, DWORD pid, int attached) |
{ |
+ struct process_info *proc; |
+ |
last_sig = GDB_SIGNAL_0; |
current_process_handle = proch; |
@@ -319,7 +330,8 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached) |
memset (¤t_event, 0, sizeof (current_event)); |
- add_process (pid, attached); |
+ proc = add_process (pid, attached); |
+ proc->tdesc = win32_tdesc; |
child_init_thread_list (); |
if (the_low_target.initial_stuff != NULL) |
@@ -448,7 +460,7 @@ strwinerror (DWORD error) |
LocalFree (msgbuf); |
} |
else |
- sprintf (buf, "unknown win32 error (%ld)", error); |
+ sprintf (buf, "unknown win32 error (%u)", (unsigned) error); |
SetLastError (lasterr); |
return buf; |
@@ -513,7 +525,7 @@ static int |
win32_create_inferior (char *program, char **program_args) |
{ |
#ifndef USE_WIN32API |
- char real_path[MAXPATHLEN]; |
+ char real_path[PATH_MAX]; |
char *orig_path, *new_path, *path_ptr; |
#endif |
BOOL ret; |
@@ -544,8 +556,7 @@ win32_create_inferior (char *program, char **program_args) |
cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, new_path, size); |
setenv ("PATH", new_path, 1); |
} |
- cygwin_conv_path (CCP_POSIX_TO_WIN_A, program, real_path, |
- MAXPATHLEN); |
+ cygwin_conv_path (CCP_POSIX_TO_WIN_A, program, real_path, PATH_MAX); |
program = real_path; |
#endif |
@@ -1317,10 +1328,10 @@ handle_exception (struct target_waitstatus *ourstatus) |
ourstatus->kind = TARGET_WAITKIND_SPURIOUS; |
return; |
} |
- OUTMSG2 (("gdbserver: unknown target exception 0x%08lx at 0x%s", |
- current_event.u.Exception.ExceptionRecord.ExceptionCode, |
- phex_nz ((uintptr_t) current_event.u.Exception.ExceptionRecord. |
- ExceptionAddress, sizeof (uintptr_t)))); |
+ OUTMSG2 (("gdbserver: unknown target exception 0x%08x at 0x%s", |
+ (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode, |
+ phex_nz ((uintptr_t) current_event.u.Exception.ExceptionRecord. |
+ ExceptionAddress, sizeof (uintptr_t)))); |
ourstatus->value.sig = GDB_SIGNAL_UNKNOWN; |
break; |
} |
@@ -1452,7 +1463,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
{ |
case CREATE_THREAD_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT " |
- "for pid=%d tid=%x)\n", |
+ "for pid=%u tid=%x)\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
@@ -1465,7 +1476,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case EXIT_THREAD_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
child_delete_thread (current_event.dwProcessId, |
@@ -1476,7 +1487,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case CREATE_PROCESS_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
CloseHandle (current_event.u.CreateProcessInfo.hFile); |
@@ -1510,7 +1521,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case EXIT_PROCESS_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
ourstatus->kind = TARGET_WAITKIND_EXITED; |
@@ -1522,7 +1533,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case LOAD_DLL_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
CloseHandle (current_event.u.LoadDll.hFile); |
@@ -1534,7 +1545,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case UNLOAD_DLL_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
handle_unload_dll (); |
@@ -1544,7 +1555,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case EXCEPTION_DEBUG_EVENT: |
OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
handle_exception (ourstatus); |
@@ -1553,7 +1564,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
case OUTPUT_DEBUG_STRING_EVENT: |
/* A message from the kernel (or Cygwin). */ |
OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT " |
- "for pid=%d tid=%x\n", |
+ "for pid=%u tid=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId)); |
handle_output_debug_string (ourstatus); |
@@ -1561,10 +1572,10 @@ get_child_debug_event (struct target_waitstatus *ourstatus) |
default: |
OUTMSG2 (("gdbserver: kernel event unknown " |
- "for pid=%d tid=%x code=%ld\n", |
+ "for pid=%u tid=%x code=%x\n", |
(unsigned) current_event.dwProcessId, |
(unsigned) current_event.dwThreadId, |
- current_event.dwDebugEventCode)); |
+ (unsigned) current_event.dwDebugEventCode)); |
break; |
} |