]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/win32-nat.c
Approved by Jim Blandy (jimb@redhat.com).
[thirdparty/binutils-gdb.git] / gdb / win32-nat.c
CommitLineData
c906108c 1/* Target-vector operations for controlling win32 child processes, for GDB.
0a65a603
AC
2
3 Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free
4 Software Foundation, Inc.
5
e6433c28 6 Contributed by Cygnus Solutions, A Red Hat Company.
c906108c
SS
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without eve nthe implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
c5aa993b 22 Foundation, Inc., 59 Temple Place - Suite 330,
4e052eda 23 Boston, MA 02111-1307, USA. */
c906108c 24
dfe7f3ac 25/* Originally by Steve Chamberlain, sac@cygnus.com */
c906108c
SS
26
27/* We assume we're being built with and will be used for cygwin. */
28
29#include "defs.h"
97da3b20 30#include "tm.h" /* required for SSE registers */
c906108c
SS
31#include "frame.h" /* required by inferior.h */
32#include "inferior.h"
33#include "target.h"
c906108c
SS
34#include "gdbcore.h"
35#include "command.h"
fa58ee11 36#include "completer.h"
4e052eda 37#include "regcache.h"
2a3d5645 38#include "top.h"
c25b74ac 39#include "i386-tdep.h"
c906108c
SS
40#include <signal.h>
41#include <sys/types.h>
42#include <fcntl.h>
43#include <stdlib.h>
c906108c 44#include <windows.h>
c2d11a7d 45#include <imagehlp.h>
29fe111d 46#include <sys/cygwin.h>
c906108c
SS
47
48#include "buildsym.h"
49#include "symfile.h"
50#include "objfiles.h"
51#include "gdb_string.h"
52#include "gdbthread.h"
53#include "gdbcmd.h"
54#include <sys/param.h>
c2d11a7d 55#include <unistd.h>
c906108c 56
7a292a7a 57/* The ui's event loop. */
507f3c78 58extern int (*ui_loop_hook) (int signo);
7a292a7a
SS
59
60/* If we're not using the old Cygwin header file set, define the
61 following which never should have been in the generic Win32 API
62 headers in the first place since they were our own invention... */
63#ifndef _GNU_H_WINDOWS_H
9d3789f7 64enum
8e860359
CF
65 {
66 FLAG_TRACE_BIT = 0x100,
67 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
68 };
7a292a7a 69#endif
8e860359
CF
70#include <sys/procfs.h>
71#include <psapi.h>
7a292a7a 72
97da3b20 73#ifdef HAVE_SSE_REGS
fa4ba8da
PM
74#define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
75 | CONTEXT_EXTENDED_REGISTERS
97da3b20 76#else
fa4ba8da 77#define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS
97da3b20
CF
78#endif
79
fa4ba8da
PM
80static unsigned dr[8];
81static int debug_registers_changed = 0;
82static int debug_registers_used = 0;
97da3b20 83
c906108c
SS
84/* The string sent by cygwin when it processes a signal.
85 FIXME: This should be in a cygwin include file. */
86#define CYGWIN_SIGNAL_STRING "cygwin: signal"
87
29fe111d 88#define CHECK(x) check (x, __FILE__,__LINE__)
dfe7f3ac 89#define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
4e52d31c
PM
90#define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
91#define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
92#define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
c906108c
SS
93
94/* Forward declaration */
95extern struct target_ops child_ops;
96
a14ed312 97static void child_stop (void);
39f77062 98static int win32_child_thread_alive (ptid_t);
a14ed312 99void child_kill_inferior (void);
c906108c 100
7393af7c
PM
101static enum target_signal last_sig = TARGET_SIGNAL_0;
102/* Set if a signal was received from the debugged process */
103
c906108c
SS
104/* Thread information structure used to track information that is
105 not available in gdb's thread structure. */
106typedef struct thread_info_struct
c5aa993b
JM
107 {
108 struct thread_info_struct *next;
109 DWORD id;
110 HANDLE h;
111 char *name;
112 int suspend_count;
113 CONTEXT context;
c2d11a7d 114 STACKFRAME sf;
8e860359
CF
115 }
116thread_info;
c2d11a7d 117
29fe111d 118static thread_info thread_head;
c906108c 119
c906108c
SS
120/* The process and thread handles for the above context. */
121
122static DEBUG_EVENT current_event; /* The current debug event from
123 WaitForDebugEvent */
124static HANDLE current_process_handle; /* Currently executing process */
125static thread_info *current_thread; /* Info on currently selected thread */
c5aa993b 126static DWORD main_thread_id; /* Thread ID of the main thread */
c906108c
SS
127
128/* Counts of things. */
129static int exception_count = 0;
130static int event_count = 0;
dfe7f3ac 131static int saw_create;
c906108c
SS
132
133/* User options. */
134static int new_console = 0;
c2d11a7d 135static int new_group = 1;
dfe7f3ac
CF
136static int debug_exec = 0; /* show execution */
137static int debug_events = 0; /* show events from kernel */
138static int debug_memory = 0; /* show target memory accesses */
c906108c 139static int debug_exceptions = 0; /* show target exceptions */
dfe7f3ac
CF
140static int useshell = 0; /* use shell for subprocesses */
141
142/* Path to shell */
143static char shell[MAX_PATH + 1];
c906108c
SS
144
145/* This vector maps GDB's idea of a register's number into an address
146 in the win32 exception context vector.
147
148 It also contains the bit mask needed to load the register in question.
149
150 One day we could read a reg, we could inspect the context we
151 already have loaded, if it doesn't have the bit set that we need,
152 we read that set of registers in using GetThreadContext. If the
153 context already contains what we need, we just unpack it. Then to
154 write a register, first we have to ensure that the context contains
155 the other regs of the group, and then we copy the info in and set
156 out bit. */
157
158#define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
159static const int mappings[] =
160{
c5aa993b
JM
161 context_offset (Eax),
162 context_offset (Ecx),
163 context_offset (Edx),
164 context_offset (Ebx),
165 context_offset (Esp),
166 context_offset (Ebp),
167 context_offset (Esi),
168 context_offset (Edi),
169 context_offset (Eip),
170 context_offset (EFlags),
171 context_offset (SegCs),
172 context_offset (SegSs),
173 context_offset (SegDs),
174 context_offset (SegEs),
175 context_offset (SegFs),
176 context_offset (SegGs),
177 context_offset (FloatSave.RegisterArea[0 * 10]),
178 context_offset (FloatSave.RegisterArea[1 * 10]),
179 context_offset (FloatSave.RegisterArea[2 * 10]),
180 context_offset (FloatSave.RegisterArea[3 * 10]),
181 context_offset (FloatSave.RegisterArea[4 * 10]),
182 context_offset (FloatSave.RegisterArea[5 * 10]),
183 context_offset (FloatSave.RegisterArea[6 * 10]),
184 context_offset (FloatSave.RegisterArea[7 * 10]),
c2d11a7d
JM
185 context_offset (FloatSave.ControlWord),
186 context_offset (FloatSave.StatusWord),
187 context_offset (FloatSave.TagWord),
188 context_offset (FloatSave.ErrorSelector),
189 context_offset (FloatSave.ErrorOffset),
190 context_offset (FloatSave.DataSelector),
191 context_offset (FloatSave.DataOffset),
ed9a39eb 192 context_offset (FloatSave.ErrorSelector)
97da3b20
CF
193#ifdef HAVE_SSE_REGS
194 /* XMM0-7 */ ,
441532d7
PM
195 context_offset (ExtendedRegisters[10*16]),
196 context_offset (ExtendedRegisters[11*16]),
197 context_offset (ExtendedRegisters[12*16]),
198 context_offset (ExtendedRegisters[13*16]),
199 context_offset (ExtendedRegisters[14*16]),
200 context_offset (ExtendedRegisters[15*16]),
201 context_offset (ExtendedRegisters[16*16]),
202 context_offset (ExtendedRegisters[17*16]),
203 /* MXCSR */
204 context_offset (ExtendedRegisters[24])
97da3b20 205#endif
c906108c
SS
206};
207
ed9a39eb
JM
208#undef context_offset
209
c906108c
SS
210/* This vector maps the target's idea of an exception (extracted
211 from the DEBUG_EVENT structure) to GDB's idea. */
212
213struct xlate_exception
214 {
215 int them;
216 enum target_signal us;
217 };
218
219static const struct xlate_exception
220 xlate[] =
221{
222 {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
223 {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
224 {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
225 {DBG_CONTROL_C, TARGET_SIGNAL_INT},
226 {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
7393af7c 227 {STATUS_FLOAT_DIVIDE_BY_ZERO, TARGET_SIGNAL_FPE},
c906108c
SS
228 {-1, -1}};
229
fa4ba8da
PM
230static void
231check (BOOL ok, const char *file, int line)
232{
233 if (!ok)
dfe7f3ac 234 printf_filtered ("error return %s:%d was %lu\n", file, line,
fa4ba8da
PM
235 GetLastError ());
236}
237
238
c906108c
SS
239/* Find a thread record given a thread id.
240 If get_context then also retrieve the context for this
241 thread. */
242static thread_info *
243thread_rec (DWORD id, int get_context)
244{
245 thread_info *th;
246
c5aa993b 247 for (th = &thread_head; (th = th->next) != NULL;)
c906108c
SS
248 if (th->id == id)
249 {
250 if (!th->suspend_count && get_context)
251 {
8a892701 252 if (get_context > 0 && id != current_event.dwThreadId)
c906108c
SS
253 th->suspend_count = SuspendThread (th->h) + 1;
254 else if (get_context < 0)
255 th->suspend_count = -1;
256
97da3b20 257 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
c906108c 258 GetThreadContext (th->h, &th->context);
fa4ba8da
PM
259 if (id == current_event.dwThreadId)
260 {
261 /* Copy dr values from that thread. */
262 dr[0] = th->context.Dr0;
263 dr[1] = th->context.Dr1;
264 dr[2] = th->context.Dr2;
265 dr[3] = th->context.Dr3;
266 dr[6] = th->context.Dr6;
267 dr[7] = th->context.Dr7;
268 }
c906108c
SS
269 }
270 return th;
271 }
272
273 return NULL;
274}
275
276/* Add a thread to the thread list */
277static thread_info *
c5aa993b 278child_add_thread (DWORD id, HANDLE h)
c906108c
SS
279{
280 thread_info *th;
281
282 if ((th = thread_rec (id, FALSE)))
283 return th;
284
285 th = (thread_info *) xmalloc (sizeof (*th));
c5aa993b 286 memset (th, 0, sizeof (*th));
c906108c
SS
287 th->id = id;
288 th->h = h;
289 th->next = thread_head.next;
290 thread_head.next = th;
39f77062 291 add_thread (pid_to_ptid (id));
dfe7f3ac 292 /* Set the debug registers for the new thread in they are used. */
fa4ba8da
PM
293 if (debug_registers_used)
294 {
295 /* Only change the value of the debug registers. */
296 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
297 CHECK (GetThreadContext (th->h, &th->context));
298 th->context.Dr0 = dr[0];
299 th->context.Dr1 = dr[1];
300 th->context.Dr2 = dr[2];
301 th->context.Dr3 = dr[3];
302 /* th->context.Dr6 = dr[6];
303 FIXME: should we set dr6 also ?? */
304 th->context.Dr7 = dr[7];
305 CHECK (SetThreadContext (th->h, &th->context));
306 th->context.ContextFlags = 0;
307 }
c906108c
SS
308 return th;
309}
310
311/* Clear out any old thread list and reintialize it to a
312 pristine state. */
313static void
fba45db2 314child_init_thread_list (void)
c906108c
SS
315{
316 thread_info *th = &thread_head;
317
318 DEBUG_EVENTS (("gdb: child_init_thread_list\n"));
319 init_thread_list ();
320 while (th->next != NULL)
321 {
322 thread_info *here = th->next;
323 th->next = here->next;
324 (void) CloseHandle (here->h);
b8c9b27d 325 xfree (here);
c906108c
SS
326 }
327}
328
329/* Delete a thread from the list of threads */
330static void
331child_delete_thread (DWORD id)
332{
333 thread_info *th;
334
335 if (info_verbose)
39f77062
KB
336 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (pid_to_ptid (id)));
337 delete_thread (pid_to_ptid (id));
c906108c
SS
338
339 for (th = &thread_head;
340 th->next != NULL && th->next->id != id;
341 th = th->next)
342 continue;
343
344 if (th->next != NULL)
345 {
346 thread_info *here = th->next;
347 th->next = here->next;
348 CloseHandle (here->h);
b8c9b27d 349 xfree (here);
c906108c
SS
350 }
351}
352
c906108c
SS
353static void
354do_child_fetch_inferior_registers (int r)
355{
c2d11a7d
JM
356 char *context_offset = ((char *) &current_thread->context) + mappings[r];
357 long l;
358 if (r == FCS_REGNUM)
359 {
8e860359 360 l = *((long *) context_offset) & 0xffff;
c2d11a7d
JM
361 supply_register (r, (char *) &l);
362 }
363 else if (r == FOP_REGNUM)
364 {
8e860359 365 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
c2d11a7d
JM
366 supply_register (r, (char *) &l);
367 }
368 else if (r >= 0)
ed9a39eb 369 supply_register (r, context_offset);
c906108c
SS
370 else
371 {
372 for (r = 0; r < NUM_REGS; r++)
373 do_child_fetch_inferior_registers (r);
374 }
375}
376
377static void
378child_fetch_inferior_registers (int r)
379{
39f77062 380 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
c906108c
SS
381 do_child_fetch_inferior_registers (r);
382}
383
384static void
385do_child_store_inferior_registers (int r)
386{
387 if (r >= 0)
388 read_register_gen (r, ((char *) &current_thread->context) + mappings[r]);
389 else
390 {
391 for (r = 0; r < NUM_REGS; r++)
392 do_child_store_inferior_registers (r);
393 }
394}
395
396/* Store a new register value into the current thread context */
397static void
398child_store_inferior_registers (int r)
399{
39f77062 400 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
c906108c
SS
401 do_child_store_inferior_registers (r);
402}
403
c2d11a7d
JM
404static int psapi_loaded = 0;
405static HMODULE psapi_module_handle = NULL;
8e860359
CF
406static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
407static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
408static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
c2d11a7d 409
3bccec63 410int
8e860359 411psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
c2d11a7d
JM
412{
413 DWORD len;
414 MODULEINFO mi;
415 int i;
8e860359
CF
416 HMODULE dh_buf[1];
417 HMODULE *DllHandle = dh_buf;
c2d11a7d
JM
418 DWORD cbNeeded;
419 BOOL ok;
420
421 if (!psapi_loaded ||
8e860359
CF
422 psapi_EnumProcessModules == NULL ||
423 psapi_GetModuleInformation == NULL ||
424 psapi_GetModuleFileNameExA == NULL)
c2d11a7d 425 {
8e860359
CF
426 if (psapi_loaded)
427 goto failed;
c2d11a7d
JM
428 psapi_loaded = 1;
429 psapi_module_handle = LoadLibrary ("psapi.dll");
430 if (!psapi_module_handle)
8e860359
CF
431 {
432 /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
433 goto failed;
434 }
435 psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
c2d11a7d
JM
436 psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
437 psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
8e860359
CF
438 "GetModuleFileNameExA");
439 if (psapi_EnumProcessModules == NULL ||
440 psapi_GetModuleInformation == NULL ||
441 psapi_GetModuleFileNameExA == NULL)
c2d11a7d
JM
442 goto failed;
443 }
444
445 cbNeeded = 0;
446 ok = (*psapi_EnumProcessModules) (current_process_handle,
8e860359
CF
447 DllHandle,
448 sizeof (HMODULE),
449 &cbNeeded);
c2d11a7d
JM
450
451 if (!ok || !cbNeeded)
452 goto failed;
453
8e860359 454 DllHandle = (HMODULE *) alloca (cbNeeded);
c2d11a7d
JM
455 if (!DllHandle)
456 goto failed;
457
458 ok = (*psapi_EnumProcessModules) (current_process_handle,
8e860359
CF
459 DllHandle,
460 cbNeeded,
461 &cbNeeded);
c2d11a7d
JM
462 if (!ok)
463 goto failed;
464
29fe111d 465 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
c2d11a7d
JM
466 {
467 if (!(*psapi_GetModuleInformation) (current_process_handle,
8e860359
CF
468 DllHandle[i],
469 &mi,
470 sizeof (mi)))
c2d11a7d
JM
471 error ("Can't get module info");
472
473 len = (*psapi_GetModuleFileNameExA) (current_process_handle,
8e860359
CF
474 DllHandle[i],
475 dll_name_ret,
476 MAX_PATH);
c2d11a7d 477 if (len == 0)
29fe111d 478 error ("Error getting dll name: %u\n", GetLastError ());
c2d11a7d
JM
479
480 if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
481 return 1;
482 }
483
484failed:
485 dll_name_ret[0] = '\0';
486 return 0;
487}
488
450005e7
CF
489/* Encapsulate the information required in a call to
490 symbol_file_add_args */
8a892701
CF
491struct safe_symbol_file_add_args
492{
493 char *name;
494 int from_tty;
495 struct section_addr_info *addrs;
496 int mainline;
497 int flags;
7c5c87c0 498 struct ui_file *err, *out;
8a892701
CF
499 struct objfile *ret;
500};
501
02e423b9
CF
502/* Maintain a linked list of "so" information. */
503struct so_stuff
504{
d3ff4a77 505 struct so_stuff *next;
02e423b9 506 DWORD load_addr;
7470a420 507 int loaded;
d3ff4a77 508 struct objfile *objfile;
7470a420
CF
509 char name[1];
510} solib_start, *solib_end;
02e423b9 511
450005e7
CF
512/* Call symbol_file_add with stderr redirected. We don't care if there
513 are errors. */
8a892701
CF
514static int
515safe_symbol_file_add_stub (void *argv)
516{
517#define p ((struct safe_symbol_file_add_args *)argv)
fefd0a37 518 struct so_stuff *so = &solib_start;
02e423b9
CF
519
520 while ((so = so->next))
7470a420 521 if (so->loaded && strcasecmp (so->name, p->name) == 0)
02e423b9 522 return 0;
8a892701
CF
523 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
524 return !!p->ret;
525#undef p
526}
527
450005e7 528/* Restore gdb's stderr after calling symbol_file_add */
8a892701 529static void
7c5c87c0 530safe_symbol_file_add_cleanup (void *p)
8a892701 531{
8e860359 532#define sp ((struct safe_symbol_file_add_args *)p)
450005e7 533 gdb_flush (gdb_stderr);
7c5c87c0 534 gdb_flush (gdb_stdout);
d3ff4a77 535 ui_file_delete (gdb_stderr);
7c5c87c0 536 ui_file_delete (gdb_stdout);
d3ff4a77 537 gdb_stderr = sp->err;
9d3789f7 538 gdb_stdout = sp->out;
8e860359 539#undef sp
8a892701
CF
540}
541
450005e7 542/* symbol_file_add wrapper that prevents errors from being displayed. */
8a892701
CF
543static struct objfile *
544safe_symbol_file_add (char *name, int from_tty,
545 struct section_addr_info *addrs,
546 int mainline, int flags)
8a892701
CF
547{
548 struct safe_symbol_file_add_args p;
549 struct cleanup *cleanup;
550
7c5c87c0 551 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
8a892701 552
7c5c87c0
CF
553 p.err = gdb_stderr;
554 p.out = gdb_stdout;
450005e7 555 gdb_flush (gdb_stderr);
7c5c87c0 556 gdb_flush (gdb_stdout);
d3ff4a77 557 gdb_stderr = ui_file_new ();
7c5c87c0 558 gdb_stdout = ui_file_new ();
8a892701
CF
559 p.name = name;
560 p.from_tty = from_tty;
561 p.addrs = addrs;
562 p.mainline = mainline;
563 p.flags = flags;
564 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
565
566 do_cleanups (cleanup);
567 return p.ret;
568}
569
450005e7
CF
570/* Remember the maximum DLL length for printing in info dll command. */
571int max_dll_name_len;
572
8e860359
CF
573static void
574register_loaded_dll (const char *name, DWORD load_addr)
575{
576 struct so_stuff *so;
7470a420 577 char ppath[MAX_PATH + 1];
3f8ad85b
CF
578 char buf[MAX_PATH + 1];
579 char cwd[MAX_PATH + 1];
580 char *p;
581 WIN32_FIND_DATA w32_fd;
582 HANDLE h = FindFirstFile(name, &w32_fd);
583 size_t len;
584
097f6b0b 585 if (h != INVALID_HANDLE_VALUE)
3f8ad85b 586 {
c914e0cc
CF
587 FindClose (h);
588 strcpy (buf, name);
589 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
590 {
591 p = strrchr (buf, '\\');
592 if (p)
593 p[1] = '\0';
594 SetCurrentDirectory (buf);
595 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
596 SetCurrentDirectory (cwd);
597 }
3f8ad85b
CF
598 }
599
600 cygwin_conv_to_posix_path (buf, ppath);
7470a420
CF
601 so = (struct so_stuff *) xmalloc (sizeof (struct so_stuff) + strlen (ppath) + 8 + 1);
602 so->loaded = 0;
8e860359 603 so->load_addr = load_addr;
d3ff4a77
CF
604 so->next = NULL;
605 so->objfile = NULL;
7470a420 606 strcpy (so->name, ppath);
8e860359
CF
607
608 solib_end->next = so;
609 solib_end = so;
3f8ad85b
CF
610 len = strlen (ppath);
611 if (len > max_dll_name_len)
612 max_dll_name_len = len;
8e860359
CF
613}
614
dfe7f3ac
CF
615char *
616get_image_name (HANDLE h, void *address, int unicode)
617{
618 static char buf[(2 * MAX_PATH) + 1];
619 DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
620 char *address_ptr;
621 int len = 0;
622 char b[2];
623 DWORD done;
624
625 /* Attempt to read the name of the dll that was detected.
626 This is documented to work only when actively debugging
627 a program. It will not work for attached processes. */
628 if (address == NULL)
629 return NULL;
630
631 ReadProcessMemory (h, address, &address_ptr, sizeof (address_ptr), &done);
632
633 /* See if we could read the address of a string, and that the
634 address isn't null. */
635
636 if (done != sizeof (address_ptr) || !address_ptr)
637 return NULL;
638
639 /* Find the length of the string */
640 do
641 {
642 ReadProcessMemory (h, address_ptr + len * size, &b, size, &done);
643 len++;
644 }
645 while ((b[0] != 0 || b[size - 1] != 0) && done == size);
646
647 if (!unicode)
648 ReadProcessMemory (h, address_ptr, buf, len, &done);
649 else
650 {
651 WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
652 ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
653 &done);
654
655 WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
656 }
657
658 return buf;
659}
660
c906108c
SS
661/* Wait for child to do something. Return pid of child, or -1 in case
662 of error; store status through argument pointer OURSTATUS. */
c906108c 663static int
0a65a603 664handle_load_dll (void *dummy)
c906108c 665{
c5aa993b 666 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
c906108c 667 char dll_buf[MAX_PATH + 1];
450005e7 668 char *dll_name = NULL;
450005e7 669 char *p;
c906108c 670
c5aa993b 671 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
c906108c 672
c2d11a7d 673 if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
8e860359 674 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
c906108c 675
c2d11a7d 676 dll_name = dll_buf;
c906108c 677
dfe7f3ac
CF
678 if (*dll_name == '\0')
679 dll_name = get_image_name (current_process_handle, event->lpImageName, event->fUnicode);
c906108c
SS
680 if (!dll_name)
681 return 1;
682
8e860359 683 register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000);
450005e7
CF
684
685 return 1;
686}
687
d3ff4a77 688static int
0a65a603 689handle_unload_dll (void *dummy)
d3ff4a77
CF
690{
691 DWORD lpBaseOfDll = (DWORD) current_event.u.UnloadDll.lpBaseOfDll + 0x1000;
692 struct so_stuff *so;
693
694 for (so = &solib_start; so->next != NULL; so = so->next)
695 if (so->next->load_addr == lpBaseOfDll)
696 {
697 struct so_stuff *sodel = so->next;
698 so->next = sodel->next;
699 if (!so->next)
700 solib_end = so;
701 if (sodel->objfile)
702 free_objfile (sodel->objfile);
703 xfree(sodel);
704 return 1;
705 }
706 error ("Error: dll starting at 0x%lx not found.\n", (DWORD) lpBaseOfDll);
707
708 return 0;
709}
710
450005e7
CF
711/* Return name of last loaded DLL. */
712char *
0a65a603 713child_solib_loaded_library_pathname (int pid)
450005e7 714{
8e860359 715 return !solib_end || !solib_end->name[0] ? NULL : solib_end->name;
450005e7
CF
716}
717
718/* Clear list of loaded DLLs. */
719void
720child_clear_solibs (void)
721{
722 struct so_stuff *so, *so1 = solib_start.next;
723
724 while ((so = so1) != NULL)
725 {
726 so1 = so->next;
b8c9b27d 727 xfree (so);
450005e7
CF
728 }
729
730 solib_start.next = NULL;
d3ff4a77 731 solib_start.objfile = NULL;
450005e7
CF
732 solib_end = &solib_start;
733 max_dll_name_len = sizeof ("DLL Name") - 1;
734}
735
736/* Add DLL symbol information. */
d3ff4a77 737static struct objfile *
02e423b9 738solib_symbols_add (char *name, int from_tty, CORE_ADDR load_addr)
450005e7
CF
739{
740 struct section_addr_info section_addrs;
741
c906108c
SS
742 /* The symbols in a dll are offset by 0x1000, which is the
743 the offset from 0 of the first byte in an image - because
8a892701 744 of the file header and the section alignment. */
c906108c 745
8e860359 746 if (!name || !name[0])
d3ff4a77 747 return NULL;
450005e7
CF
748
749 memset (&section_addrs, 0, sizeof (section_addrs));
0aa9cf96 750 section_addrs.other[0].name = ".text";
8e860359 751 section_addrs.other[0].addr = load_addr;
d3ff4a77 752 return safe_symbol_file_add (name, from_tty, NULL, 0, OBJF_SHARED);
450005e7
CF
753}
754
755/* Load DLL symbol info. */
756void
7470a420 757dll_symbol_command (char *args, int from_tty)
450005e7 758{
8e860359 759 int n;
450005e7 760 dont_repeat ();
8e860359 761
450005e7
CF
762 if (args == NULL)
763 error ("dll-symbols requires a file name");
764
8e860359
CF
765 n = strlen (args);
766 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
767 {
768 char *newargs = (char *) alloca (n + 4 + 1);
769 strcpy (newargs, args);
770 strcat (newargs, ".dll");
771 args = newargs;
772 }
773
7470a420 774 safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
8e860359 775}
450005e7
CF
776
777/* List currently loaded DLLs. */
778void
0a65a603 779info_dll_command (char *ignore, int from_tty)
450005e7
CF
780{
781 struct so_stuff *so = &solib_start;
782
783 if (!so->next)
784 return;
785
dfe7f3ac 786 printf_filtered ("%*s Load Address\n", -max_dll_name_len, "DLL Name");
450005e7 787 while ((so = so->next) != NULL)
7c5c87c0 788 printf_filtered ("%*s %08lx\n", -max_dll_name_len, so->name, so->load_addr);
450005e7
CF
789
790 return;
c906108c
SS
791}
792
793/* Handle DEBUG_STRING output from child process.
794 Cygwin prepends its messages with a "cygwin:". Interpret this as
795 a Cygwin signal. Otherwise just print the string as a warning. */
796static int
797handle_output_debug_string (struct target_waitstatus *ourstatus)
798{
799 char *s;
800 int gotasig = FALSE;
801
802 if (!target_read_string
c5aa993b 803 ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
c906108c
SS
804 || !s || !*s)
805 return gotasig;
806
ed9a39eb 807 if (strncmp (s, CYGWIN_SIGNAL_STRING, sizeof (CYGWIN_SIGNAL_STRING) - 1) != 0)
c906108c 808 {
ed9a39eb 809 if (strncmp (s, "cYg", 3) != 0)
29fe111d 810 warning ("%s", s);
c906108c 811 }
ed9a39eb 812 else
c906108c
SS
813 {
814 char *p;
c2d11a7d
JM
815 int sig = strtol (s + sizeof (CYGWIN_SIGNAL_STRING) - 1, &p, 0);
816 gotasig = target_signal_from_host (sig);
7a292a7a
SS
817 ourstatus->value.sig = gotasig;
818 if (gotasig)
c906108c
SS
819 ourstatus->kind = TARGET_WAITKIND_STOPPED;
820 }
821
b8c9b27d 822 xfree (s);
c906108c
SS
823 return gotasig;
824}
825
c1748f97
PM
826static int
827display_selector (HANDLE thread, DWORD sel)
828{
829 LDT_ENTRY info;
830 if (GetThreadSelectorEntry (thread, sel, &info))
831 {
832 int base, limit;
833 printf_filtered ("0x%03lx: ", sel);
834 if (!info.HighWord.Bits.Pres)
835 {
836 puts_filtered ("Segment not present\n");
837 return 0;
838 }
839 base = (info.HighWord.Bits.BaseHi << 24) +
840 (info.HighWord.Bits.BaseMid << 16)
841 + info.BaseLow;
842 limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
843 if (info.HighWord.Bits.Granularity)
844 limit = (limit << 12) | 0xfff;
845 printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
846 if (info.HighWord.Bits.Default_Big)
847 puts_filtered(" 32-bit ");
848 else
849 puts_filtered(" 16-bit ");
850 switch ((info.HighWord.Bits.Type & 0xf) >> 1)
851 {
852 case 0:
853 puts_filtered ("Data (Read-Only, Exp-up");
854 break;
855 case 1:
856 puts_filtered ("Data (Read/Write, Exp-up");
857 break;
858 case 2:
859 puts_filtered ("Unused segment (");
860 break;
861 case 3:
862 puts_filtered ("Data (Read/Write, Exp-down");
863 break;
864 case 4:
865 puts_filtered ("Code (Exec-Only, N.Conf");
866 break;
867 case 5:
868 puts_filtered ("Code (Exec/Read, N.Conf");
869 break;
870 case 6:
871 puts_filtered ("Code (Exec-Only, Conf");
872 break;
873 case 7:
874 puts_filtered ("Code (Exec/Read, Conf");
875 break;
876 default:
877 printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
878 }
879 if ((info.HighWord.Bits.Type & 0x1) == 0)
880 puts_filtered(", N.Acc");
881 puts_filtered (")\n");
882 if ((info.HighWord.Bits.Type & 0x10) == 0)
883 puts_filtered("System selector ");
884 printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
885 if (info.HighWord.Bits.Granularity)
886 puts_filtered ("Page granular.\n");
887 else
888 puts_filtered ("Byte granular.\n");
889 return 1;
890 }
891 else
892 {
893 printf_filtered ("Invalid selector 0x%lx.\n",sel);
894 return 0;
895 }
896}
897
898static void
899display_selectors (char * args, int from_tty)
900{
901 if (!current_thread)
902 {
903 puts_filtered ("Impossible to display selectors now.\n");
904 return;
905 }
906 if (!args)
907 {
908
909 puts_filtered ("Selector $cs\n");
910 display_selector (current_thread->h,
911 current_thread->context.SegCs);
912 puts_filtered ("Selector $ds\n");
913 display_selector (current_thread->h,
914 current_thread->context.SegDs);
915 puts_filtered ("Selector $es\n");
916 display_selector (current_thread->h,
917 current_thread->context.SegEs);
918 puts_filtered ("Selector $ss\n");
919 display_selector (current_thread->h,
920 current_thread->context.SegSs);
921 puts_filtered ("Selector $fs\n");
922 display_selector (current_thread->h,
923 current_thread->context.SegFs);
924 puts_filtered ("Selector $gs\n");
925 display_selector (current_thread->h,
926 current_thread->context.SegGs);
927 }
928 else
929 {
930 int sel;
931 sel = parse_and_eval_long (args);
932 printf_filtered ("Selector \"%s\"\n",args);
933 display_selector (current_thread->h, sel);
934 }
935}
936
937static struct cmd_list_element *info_w32_cmdlist = NULL;
938
939static void
940info_w32_command (char *args, int from_tty)
941{
942 help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
943}
944
945
7393af7c 946#define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
4e52d31c 947 printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
7393af7c
PM
948 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
949
c906108c 950static int
450005e7 951handle_exception (struct target_waitstatus *ourstatus)
c906108c 952{
c906108c 953 thread_info *th;
29fe111d 954 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
c906108c 955
29fe111d 956 ourstatus->kind = TARGET_WAITKIND_STOPPED;
8a892701 957
c906108c
SS
958 /* Record the context of the current thread */
959 th = thread_rec (current_event.dwThreadId, -1);
960
29fe111d 961 switch (code)
c906108c
SS
962 {
963 case EXCEPTION_ACCESS_VIOLATION:
7393af7c
PM
964 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
965 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
966 break;
967 case STATUS_STACK_OVERFLOW:
968 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
c906108c 969 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
7393af7c
PM
970 break;
971 case STATUS_FLOAT_DENORMAL_OPERAND:
972 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
973 ourstatus->value.sig = TARGET_SIGNAL_FPE;
974 break;
975 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
976 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
977 ourstatus->value.sig = TARGET_SIGNAL_FPE;
978 break;
979 case STATUS_FLOAT_INEXACT_RESULT:
980 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
981 ourstatus->value.sig = TARGET_SIGNAL_FPE;
982 break;
983 case STATUS_FLOAT_INVALID_OPERATION:
984 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
985 ourstatus->value.sig = TARGET_SIGNAL_FPE;
986 break;
987 case STATUS_FLOAT_OVERFLOW:
988 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
989 ourstatus->value.sig = TARGET_SIGNAL_FPE;
990 break;
991 case STATUS_FLOAT_STACK_CHECK:
992 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
993 ourstatus->value.sig = TARGET_SIGNAL_FPE;
c906108c 994 break;
0d06e24b 995 case STATUS_FLOAT_UNDERFLOW:
7393af7c
PM
996 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
997 ourstatus->value.sig = TARGET_SIGNAL_FPE;
998 break;
0d06e24b 999 case STATUS_FLOAT_DIVIDE_BY_ZERO:
7393af7c
PM
1000 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1001 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1002 break;
0d06e24b 1003 case STATUS_INTEGER_DIVIDE_BY_ZERO:
7393af7c 1004 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
0d06e24b 1005 ourstatus->value.sig = TARGET_SIGNAL_FPE;
0d06e24b 1006 break;
7393af7c
PM
1007 case STATUS_INTEGER_OVERFLOW:
1008 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1009 ourstatus->value.sig = TARGET_SIGNAL_FPE;
c906108c
SS
1010 break;
1011 case EXCEPTION_BREAKPOINT:
7393af7c 1012 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
c906108c
SS
1013 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1014 break;
1015 case DBG_CONTROL_C:
7393af7c 1016 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
c906108c 1017 ourstatus->value.sig = TARGET_SIGNAL_INT;
5b421780
PM
1018 break;
1019 case DBG_CONTROL_BREAK:
7393af7c 1020 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
5b421780 1021 ourstatus->value.sig = TARGET_SIGNAL_INT;
c906108c
SS
1022 break;
1023 case EXCEPTION_SINGLE_STEP:
7393af7c 1024 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
c906108c
SS
1025 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1026 break;
8227c82d 1027 case EXCEPTION_ILLEGAL_INSTRUCTION:
7393af7c
PM
1028 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1029 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1030 break;
1031 case EXCEPTION_PRIV_INSTRUCTION:
1032 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1033 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1034 break;
1035 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1036 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
8227c82d
CF
1037 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1038 break;
c906108c 1039 default:
02e423b9
CF
1040 if (current_event.u.Exception.dwFirstChance)
1041 return 0;
29fe111d 1042 printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
c5aa993b 1043 current_event.u.Exception.ExceptionRecord.ExceptionCode,
8e860359 1044 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
c906108c
SS
1045 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1046 break;
1047 }
1048 exception_count++;
7393af7c 1049 last_sig = ourstatus->value.sig;
c906108c
SS
1050 return 1;
1051}
1052
1053/* Resume all artificially suspended threads if we are continuing
1054 execution */
1055static BOOL
8a892701 1056child_continue (DWORD continue_status, int id)
c906108c
SS
1057{
1058 int i;
1059 thread_info *th;
1060 BOOL res;
1061
7393af7c
PM
1062 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
1063 current_event.dwProcessId, current_event.dwThreadId,
dfe7f3ac 1064 continue_status == DBG_CONTINUE ?
7393af7c 1065 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
7a292a7a
SS
1066 res = ContinueDebugEvent (current_event.dwProcessId,
1067 current_event.dwThreadId,
1068 continue_status);
c2d11a7d 1069 continue_status = 0;
7a292a7a 1070 if (res)
c5aa993b 1071 for (th = &thread_head; (th = th->next) != NULL;)
29fe111d 1072 if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
c906108c 1073 {
fa4ba8da 1074
c906108c
SS
1075 for (i = 0; i < th->suspend_count; i++)
1076 (void) ResumeThread (th->h);
1077 th->suspend_count = 0;
fa4ba8da
PM
1078 if (debug_registers_changed)
1079 {
1080 /* Only change the value of the debug reisters */
1081 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
1082 th->context.Dr0 = dr[0];
1083 th->context.Dr1 = dr[1];
1084 th->context.Dr2 = dr[2];
1085 th->context.Dr3 = dr[3];
1086 /* th->context.Dr6 = dr[6];
dfe7f3ac 1087 FIXME: should we set dr6 also ?? */
fa4ba8da
PM
1088 th->context.Dr7 = dr[7];
1089 CHECK (SetThreadContext (th->h, &th->context));
1090 th->context.ContextFlags = 0;
1091 }
c906108c
SS
1092 }
1093
fa4ba8da 1094 debug_registers_changed = 0;
c906108c
SS
1095 return res;
1096}
1097
8a892701
CF
1098/* Get the next event from the child. Return 1 if the event requires
1099 handling by WFI (or whatever).
1100 */
c2d11a7d 1101static int
0a65a603 1102get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
c2d11a7d
JM
1103{
1104 BOOL debug_event;
8a892701
CF
1105 DWORD continue_status, event_code;
1106 thread_info *th = NULL;
1107 static thread_info dummy_thread_info;
450005e7 1108 int retval = 0;
c2d11a7d 1109
7393af7c 1110 last_sig = TARGET_SIGNAL_0;
9d3789f7 1111
8a892701 1112 if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
29fe111d 1113 goto out;
c2d11a7d
JM
1114
1115 event_count++;
1116 continue_status = DBG_CONTINUE;
c2d11a7d 1117
8a892701 1118 event_code = current_event.dwDebugEventCode;
450005e7 1119 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
8a892701
CF
1120
1121 switch (event_code)
c2d11a7d
JM
1122 {
1123 case CREATE_THREAD_DEBUG_EVENT:
1124 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
8a892701
CF
1125 (unsigned) current_event.dwProcessId,
1126 (unsigned) current_event.dwThreadId,
1127 "CREATE_THREAD_DEBUG_EVENT"));
dfe7f3ac
CF
1128 if (saw_create != 1)
1129 break;
c2d11a7d 1130 /* Record the existence of this thread */
8a892701
CF
1131 th = child_add_thread (current_event.dwThreadId,
1132 current_event.u.CreateThread.hThread);
c2d11a7d
JM
1133 if (info_verbose)
1134 printf_unfiltered ("[New %s]\n",
39f77062
KB
1135 target_pid_to_str (
1136 pid_to_ptid (current_event.dwThreadId)));
450005e7 1137 retval = current_event.dwThreadId;
c2d11a7d
JM
1138 break;
1139
1140 case EXIT_THREAD_DEBUG_EVENT:
1141 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1142 (unsigned) current_event.dwProcessId,
1143 (unsigned) current_event.dwThreadId,
1144 "EXIT_THREAD_DEBUG_EVENT"));
dfe7f3ac
CF
1145 if (saw_create != 1)
1146 break;
c2d11a7d 1147 child_delete_thread (current_event.dwThreadId);
8a892701 1148 th = &dummy_thread_info;
c2d11a7d
JM
1149 break;
1150
1151 case CREATE_PROCESS_DEBUG_EVENT:
1152 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1153 (unsigned) current_event.dwProcessId,
1154 (unsigned) current_event.dwThreadId,
1155 "CREATE_PROCESS_DEBUG_EVENT"));
700b351b 1156 CloseHandle (current_event.u.CreateProcessInfo.hFile);
dfe7f3ac
CF
1157 if (++saw_create != 1)
1158 {
1159 CloseHandle (current_event.u.CreateProcessInfo.hProcess);
1160 break;
1161 }
c2d11a7d 1162
dfe7f3ac 1163 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
9d3789f7 1164 main_thread_id = current_event.dwThreadId;
c2d11a7d 1165 /* Add the main thread */
9d3789f7 1166#if 0
450005e7
CF
1167 th = child_add_thread (current_event.dwProcessId,
1168 current_event.u.CreateProcessInfo.hProcess);
9d3789f7
CF
1169#endif
1170 th = child_add_thread (main_thread_id,
8a892701 1171 current_event.u.CreateProcessInfo.hThread);
9d3789f7 1172 retval = ourstatus->value.related_pid = current_event.dwThreadId;
c2d11a7d
JM
1173 break;
1174
1175 case EXIT_PROCESS_DEBUG_EVENT:
1176 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1177 (unsigned) current_event.dwProcessId,
1178 (unsigned) current_event.dwThreadId,
1179 "EXIT_PROCESS_DEBUG_EVENT"));
dfe7f3ac
CF
1180 if (saw_create != 1)
1181 break;
c2d11a7d
JM
1182 ourstatus->kind = TARGET_WAITKIND_EXITED;
1183 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1184 CloseHandle (current_process_handle);
9d3789f7 1185 retval = main_thread_id;
8a892701 1186 break;
c2d11a7d
JM
1187
1188 case LOAD_DLL_DEBUG_EVENT:
1189 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1190 (unsigned) current_event.dwProcessId,
1191 (unsigned) current_event.dwThreadId,
1192 "LOAD_DLL_DEBUG_EVENT"));
700b351b 1193 CloseHandle (current_event.u.LoadDll.hFile);
dfe7f3ac
CF
1194 if (saw_create != 1)
1195 break;
8a892701 1196 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
c2d11a7d 1197 registers_changed (); /* mark all regs invalid */
450005e7
CF
1198 ourstatus->kind = TARGET_WAITKIND_LOADED;
1199 ourstatus->value.integer = 0;
9d3789f7 1200 retval = main_thread_id;
c2d11a7d
JM
1201 break;
1202
1203 case UNLOAD_DLL_DEBUG_EVENT:
1204 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1205 (unsigned) current_event.dwProcessId,
1206 (unsigned) current_event.dwThreadId,
1207 "UNLOAD_DLL_DEBUG_EVENT"));
dfe7f3ac
CF
1208 if (saw_create != 1)
1209 break;
d3ff4a77
CF
1210 catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
1211 registers_changed (); /* mark all regs invalid */
1212 /* ourstatus->kind = TARGET_WAITKIND_UNLOADED;
3bccec63 1213 does not exist yet. */
d3ff4a77 1214 break;
c2d11a7d
JM
1215
1216 case EXCEPTION_DEBUG_EVENT:
1217 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1218 (unsigned) current_event.dwProcessId,
1219 (unsigned) current_event.dwThreadId,
1220 "EXCEPTION_DEBUG_EVENT"));
dfe7f3ac
CF
1221 if (saw_create != 1)
1222 break;
02e423b9
CF
1223 if (handle_exception (ourstatus))
1224 retval = current_event.dwThreadId;
c2d11a7d
JM
1225 break;
1226
8a892701 1227 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
c2d11a7d 1228 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
8a892701
CF
1229 (unsigned) current_event.dwProcessId,
1230 (unsigned) current_event.dwThreadId,
1231 "OUTPUT_DEBUG_STRING_EVENT"));
dfe7f3ac
CF
1232 if (saw_create != 1)
1233 break;
8e860359 1234 if (handle_output_debug_string (ourstatus))
9d3789f7 1235 retval = main_thread_id;
c2d11a7d 1236 break;
9d3789f7 1237
c2d11a7d 1238 default:
dfe7f3ac
CF
1239 if (saw_create != 1)
1240 break;
29fe111d
CF
1241 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1242 (DWORD) current_event.dwProcessId,
1243 (DWORD) current_event.dwThreadId);
1244 printf_unfiltered (" unknown event code %ld\n",
c2d11a7d
JM
1245 current_event.dwDebugEventCode);
1246 break;
1247 }
1248
dfe7f3ac 1249 if (!retval || saw_create != 1)
8a892701 1250 CHECK (child_continue (continue_status, -1));
450005e7 1251 else
9d3789f7 1252 {
8e860359 1253 current_thread = th ? : thread_rec (current_event.dwThreadId, TRUE);
39f77062 1254 inferior_ptid = pid_to_ptid (retval);
9d3789f7 1255 }
c2d11a7d
JM
1256
1257out:
450005e7 1258 return retval;
c2d11a7d
JM
1259}
1260
c2d11a7d 1261/* Wait for interesting events to occur in the target process. */
39f77062
KB
1262static ptid_t
1263child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
c906108c 1264{
39f77062
KB
1265 int pid = PIDGET (ptid);
1266
c906108c
SS
1267 /* We loop when we get a non-standard exception rather than return
1268 with a SPURIOUS because resume can try and step or modify things,
1269 which needs a current_thread->h. But some of these exceptions mark
1270 the birth or death of threads, which mean that the current thread
1271 isn't necessarily what you think it is. */
1272
1273 while (1)
450005e7
CF
1274 {
1275 int retval = get_child_debug_event (pid, ourstatus);
1276 if (retval)
39f77062 1277 return pid_to_ptid (retval);
450005e7
CF
1278 else
1279 {
1280 int detach = 0;
c906108c 1281
450005e7
CF
1282 if (ui_loop_hook != NULL)
1283 detach = ui_loop_hook (0);
7a292a7a 1284
450005e7
CF
1285 if (detach)
1286 child_kill_inferior ();
1287 }
1288 }
c906108c
SS
1289}
1290
9d3789f7
CF
1291static void
1292do_initial_child_stuff (DWORD pid)
1293{
1294 extern int stop_after_trap;
fa4ba8da 1295 int i;
9d3789f7 1296
7393af7c 1297 last_sig = TARGET_SIGNAL_0;
9d3789f7
CF
1298 event_count = 0;
1299 exception_count = 0;
fa4ba8da 1300 debug_registers_changed = 0;
dfe7f3ac 1301 debug_registers_used = 0;
fa4ba8da
PM
1302 for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1303 dr[i] = 0;
9d3789f7
CF
1304 current_event.dwProcessId = pid;
1305 memset (&current_event, 0, sizeof (current_event));
1306 push_target (&child_ops);
1307 child_init_thread_list ();
1308 child_clear_solibs ();
1309 clear_proceed_status ();
1310 init_wait_for_inferior ();
1311
1312 target_terminal_init ();
1313 target_terminal_inferior ();
1314
1315 while (1)
1316 {
1317 stop_after_trap = 1;
1318 wait_for_inferior ();
1319 if (stop_signal != TARGET_SIGNAL_TRAP)
1320 resume (0, stop_signal);
1321 else
1322 break;
1323 }
1324 stop_after_trap = 0;
1325 return;
1326}
1327
02cc9f49
CV
1328/* Since Windows XP, detaching from a process is supported by Windows.
1329 The following code tries loading the appropriate functions dynamically.
1330 If loading these functions succeeds use them to actually detach from
1331 the inferior process, otherwise behave as usual, pretending that
1332 detach has worked. */
1333static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
1334static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
1335
1336static int
1337has_detach_ability ()
1338{
1339 static HMODULE kernel32 = NULL;
1340
1341 if (!kernel32)
1342 kernel32 = LoadLibrary ("kernel32.dll");
1343 if (kernel32)
1344 {
1345 if (!DebugSetProcessKillOnExit)
1346 DebugSetProcessKillOnExit = GetProcAddress (kernel32,
1347 "DebugSetProcessKillOnExit");
1348 if (!DebugActiveProcessStop)
1349 DebugActiveProcessStop = GetProcAddress (kernel32,
1350 "DebugActiveProcessStop");
1351 if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
1352 return 1;
1353 }
1354 return 0;
1355}
c906108c 1356
02cc9f49 1357/* Attach to process PID, then initialize for debugging it. */
c906108c 1358static void
fba45db2 1359child_attach (char *args, int from_tty)
c906108c
SS
1360{
1361 BOOL ok;
559e75c0 1362 DWORD pid;
c906108c
SS
1363
1364 if (!args)
1365 error_no_arg ("process-id to attach");
1366
559e75c0 1367 pid = strtoul (args, 0, 0);
9d3789f7 1368 ok = DebugActiveProcess (pid);
c906108c
SS
1369
1370 if (!ok)
1371 error ("Can't attach to process.");
1372
02cc9f49
CV
1373 if (has_detach_ability ())
1374 {
1375 attach_flag = 1;
1376 DebugSetProcessKillOnExit (FALSE);
1377 }
1378
c906108c
SS
1379 if (from_tty)
1380 {
1381 char *exec_file = (char *) get_exec_file (0);
1382
1383 if (exec_file)
1384 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
39f77062 1385 target_pid_to_str (pid_to_ptid (pid)));
c906108c
SS
1386 else
1387 printf_unfiltered ("Attaching to %s\n",
39f77062 1388 target_pid_to_str (pid_to_ptid (pid)));
c906108c
SS
1389
1390 gdb_flush (gdb_stdout);
1391 }
1392
9d3789f7
CF
1393 do_initial_child_stuff (pid);
1394 target_terminal_ours ();
c906108c
SS
1395}
1396
1397static void
0a65a603 1398child_detach (char *args, int from_tty)
c906108c 1399{
02cc9f49
CV
1400 int detached = 1;
1401
1402 if (has_detach_ability ())
1403 {
1404 delete_command (NULL, 0);
1405 child_continue (DBG_CONTINUE, -1);
1406 if (!DebugActiveProcessStop (current_event.dwProcessId))
3bccec63 1407 {
02cc9f49
CV
1408 error ("Can't detach process %lu (error %lu)",
1409 current_event.dwProcessId, GetLastError ());
1410 detached = 0;
3bccec63 1411 }
02cc9f49
CV
1412 DebugSetProcessKillOnExit (FALSE);
1413 }
1414 if (detached && from_tty)
c906108c
SS
1415 {
1416 char *exec_file = get_exec_file (0);
1417 if (exec_file == 0)
1418 exec_file = "";
02cc9f49
CV
1419 printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1420 current_event.dwProcessId);
c906108c
SS
1421 gdb_flush (gdb_stdout);
1422 }
39f77062 1423 inferior_ptid = null_ptid;
c906108c
SS
1424 unpush_target (&child_ops);
1425}
1426
1427/* Print status information about what we're accessing. */
1428
1429static void
0a65a603 1430child_files_info (struct target_ops *ignore)
c906108c
SS
1431{
1432 printf_unfiltered ("\tUsing the running image of %s %s.\n",
39f77062 1433 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
c906108c
SS
1434}
1435
1436/* ARGSUSED */
1437static void
0a65a603 1438child_open (char *arg, int from_tty)
c906108c
SS
1439{
1440 error ("Use the \"run\" command to start a Unix child process.");
1441}
1442
39f77062 1443/* Start an inferior win32 child process and sets inferior_ptid to its pid.
c906108c
SS
1444 EXEC_FILE is the file to run.
1445 ALLARGS is a string containing the arguments to the program.
1446 ENV is the environment vector to pass. Errors reported with error(). */
1447
1448static void
fba45db2 1449child_create_inferior (char *exec_file, char *allargs, char **env)
c906108c 1450{
c906108c
SS
1451 char *winenv;
1452 char *temp;
c5aa993b 1453 int envlen;
c906108c 1454 int i;
c906108c
SS
1455 STARTUPINFO si;
1456 PROCESS_INFORMATION pi;
c906108c
SS
1457 BOOL ret;
1458 DWORD flags;
1459 char *args;
dfe7f3ac
CF
1460 char real_path[MAXPATHLEN];
1461 char *toexec;
c906108c
SS
1462
1463 if (!exec_file)
450005e7 1464 error ("No executable specified, use `target exec'.\n");
c906108c
SS
1465
1466 memset (&si, 0, sizeof (si));
1467 si.cb = sizeof (si);
1468
dfe7f3ac 1469 flags = 0;
c906108c
SS
1470
1471 if (new_group)
1472 flags |= CREATE_NEW_PROCESS_GROUP;
1473
1474 if (new_console)
1475 flags |= CREATE_NEW_CONSOLE;
1476
dfe7f3ac
CF
1477 if (!useshell || !shell[0])
1478 {
1479 flags = DEBUG_ONLY_THIS_PROCESS;
1480 cygwin_conv_to_win32_path (exec_file, real_path);
1481 toexec = real_path;
1482 }
1483 else
1484 {
1485 char *newallargs = alloca (sizeof (" -c 'exec '") + strlen (exec_file) + strlen (allargs) + 2);
1486 sprintf (newallargs, " -c 'exec %s %s'", exec_file, allargs);
1487 allargs = newallargs;
1488 toexec = shell;
1489 flags = DEBUG_PROCESS;
1490 }
c906108c 1491
dfe7f3ac
CF
1492 args = alloca (strlen (toexec) + strlen (allargs) + 2);
1493 strcpy (args, toexec);
c906108c
SS
1494 strcat (args, " ");
1495 strcat (args, allargs);
1496
1497 /* Prepare the environment vars for CreateProcess. */
1498 {
1499 /* This code use to assume all env vars were file names and would
1500 translate them all to win32 style. That obviously doesn't work in the
1501 general case. The current rule is that we only translate PATH.
1502 We need to handle PATH because we're about to call CreateProcess and
1503 it uses PATH to find DLL's. Fortunately PATH has a well-defined value
1504 in both posix and win32 environments. cygwin.dll will change it back
1505 to posix style if necessary. */
1506
1507 static const char *conv_path_names[] =
c5aa993b
JM
1508 {
1509 "PATH=",
1510 0
1511 };
c906108c
SS
1512
1513 /* CreateProcess takes the environment list as a null terminated set of
1514 strings (i.e. two nulls terminate the list). */
1515
1516 /* Get total size for env strings. */
1517 for (envlen = 0, i = 0; env[i] && *env[i]; i++)
1518 {
1519 int j, len;
1520
1521 for (j = 0; conv_path_names[j]; j++)
1522 {
1523 len = strlen (conv_path_names[j]);
1524 if (strncmp (conv_path_names[j], env[i], len) == 0)
1525 {
29fe111d 1526 if (cygwin_posix_path_list_p (env[i] + len))
c906108c 1527 envlen += len
29fe111d 1528 + cygwin_posix_to_win32_path_list_buf_size (env[i] + len);
c906108c
SS
1529 else
1530 envlen += strlen (env[i]) + 1;
1531 break;
1532 }
1533 }
1534 if (conv_path_names[j] == NULL)
1535 envlen += strlen (env[i]) + 1;
1536 }
1537
1538 winenv = alloca (envlen + 1);
1539
1540 /* Copy env strings into new buffer. */
1541 for (temp = winenv, i = 0; env[i] && *env[i]; i++)
1542 {
1543 int j, len;
1544
1545 for (j = 0; conv_path_names[j]; j++)
1546 {
1547 len = strlen (conv_path_names[j]);
1548 if (strncmp (conv_path_names[j], env[i], len) == 0)
1549 {
29fe111d 1550 if (cygwin_posix_path_list_p (env[i] + len))
c906108c
SS
1551 {
1552 memcpy (temp, env[i], len);
29fe111d 1553 cygwin_posix_to_win32_path_list (env[i] + len, temp + len);
c906108c
SS
1554 }
1555 else
1556 strcpy (temp, env[i]);
1557 break;
1558 }
1559 }
1560 if (conv_path_names[j] == NULL)
1561 strcpy (temp, env[i]);
1562
1563 temp += strlen (temp) + 1;
1564 }
1565
1566 /* Final nil string to terminate new env. */
1567 *temp = 0;
1568 }
1569
1570 ret = CreateProcess (0,
c5aa993b 1571 args, /* command line */
c906108c
SS
1572 NULL, /* Security */
1573 NULL, /* thread */
1574 TRUE, /* inherit handles */
1575 flags, /* start flags */
1576 winenv,
1577 NULL, /* current directory */
1578 &si,
1579 &pi);
1580 if (!ret)
c5aa993b 1581 error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
c906108c 1582
700b351b
CF
1583 CloseHandle (pi.hThread);
1584 CloseHandle (pi.hProcess);
dfe7f3ac
CF
1585
1586 if (useshell && shell[0] != '\0')
1587 saw_create = -1;
1588 else
1589 saw_create = 0;
1590
9d3789f7 1591 do_initial_child_stuff (pi.dwProcessId);
ed9a39eb 1592
8e860359 1593 /* child_continue (DBG_CONTINUE, -1); */
c2d11a7d 1594 proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
c906108c
SS
1595}
1596
1597static void
fba45db2 1598child_mourn_inferior (void)
c906108c 1599{
8a892701 1600 (void) child_continue (DBG_CONTINUE, -1);
fa4ba8da 1601 i386_cleanup_dregs();
c906108c
SS
1602 unpush_target (&child_ops);
1603 generic_mourn_inferior ();
1604}
1605
1606/* Send a SIGINT to the process group. This acts just like the user typed a
1607 ^C on the controlling terminal. */
1608
1609static void
fba45db2 1610child_stop (void)
c906108c
SS
1611{
1612 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
c2d11a7d 1613 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
c5aa993b 1614 registers_changed (); /* refresh register state */
c906108c
SS
1615}
1616
1617int
1618child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
0a65a603
AC
1619 int write, struct mem_attrib *mem,
1620 struct target_ops *target)
c906108c
SS
1621{
1622 DWORD done;
1623 if (write)
1624 {
29fe111d
CF
1625 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1626 len, (DWORD) memaddr));
c906108c
SS
1627 WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
1628 len, &done);
1629 FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
1630 }
1631 else
1632 {
29fe111d
CF
1633 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
1634 len, (DWORD) memaddr));
c906108c
SS
1635 ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our, len,
1636 &done);
1637 }
1638 return done;
1639}
1640
1641void
1642child_kill_inferior (void)
1643{
1644 CHECK (TerminateProcess (current_process_handle, 0));
1645
1646 for (;;)
1647 {
8a892701 1648 if (!child_continue (DBG_CONTINUE, -1))
c906108c
SS
1649 break;
1650 if (!WaitForDebugEvent (&current_event, INFINITE))
1651 break;
1652 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
1653 break;
1654 }
1655
1656 CHECK (CloseHandle (current_process_handle));
1657
1658 /* this may fail in an attached process so don't check. */
1659 (void) CloseHandle (current_thread->h);
c5aa993b 1660 target_mourn_inferior (); /* or just child_mourn_inferior? */
c906108c
SS
1661}
1662
1663void
39f77062 1664child_resume (ptid_t ptid, int step, enum target_signal sig)
c906108c 1665{
c906108c 1666 thread_info *th;
7393af7c
PM
1667 DWORD continue_status = DBG_CONTINUE;
1668
39f77062 1669 int pid = PIDGET (ptid);
8a892701 1670
7393af7c
PM
1671 if (sig != TARGET_SIGNAL_0)
1672 {
1673 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1674 {
1675 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1676 }
1677 else if (sig == last_sig)
1678 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1679 else
1680#if 0
1681/* This code does not seem to work, because
1682 the kernel does probably not consider changes in the ExceptionRecord
dfe7f3ac 1683 structure when passing the exception to the inferior.
7393af7c
PM
1684 Note that this seems possible in the exception handler itself. */
1685 {
1686 int i;
1687 for (i = 0; xlate[i].them != -1; i++)
1688 if (xlate[i].us == sig)
1689 {
1690 current_event.u.Exception.ExceptionRecord.ExceptionCode =
1691 xlate[i].them;
1692 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1693 break;
1694 }
1695 if (continue_status == DBG_CONTINUE)
1696 {
1697 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1698 }
1699 }
1700#endif
dfe7f3ac 1701 DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
7393af7c
PM
1702 last_sig));
1703 }
1704
1705 last_sig = TARGET_SIGNAL_0;
c906108c
SS
1706
1707 DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
1708 pid, step, sig));
1709
1710 /* Get context for currently selected thread */
1711 th = thread_rec (current_event.dwThreadId, FALSE);
450005e7 1712 if (th)
c906108c 1713 {
450005e7
CF
1714 if (step)
1715 {
1716 /* Single step by setting t bit */
1717 child_fetch_inferior_registers (PS_REGNUM);
1718 th->context.EFlags |= FLAG_TRACE_BIT;
1719 }
c906108c 1720
450005e7
CF
1721 if (th->context.ContextFlags)
1722 {
fa4ba8da
PM
1723 if (debug_registers_changed)
1724 {
dfe7f3ac
CF
1725 th->context.Dr0 = dr[0];
1726 th->context.Dr1 = dr[1];
1727 th->context.Dr2 = dr[2];
1728 th->context.Dr3 = dr[3];
1729 /* th->context.Dr6 = dr[6];
1730 FIXME: should we set dr6 also ?? */
1731 th->context.Dr7 = dr[7];
fa4ba8da 1732 }
450005e7
CF
1733 CHECK (SetThreadContext (th->h, &th->context));
1734 th->context.ContextFlags = 0;
1735 }
c906108c
SS
1736 }
1737
1738 /* Allow continuing with the same signal that interrupted us.
1739 Otherwise complain. */
c906108c 1740
8a892701 1741 child_continue (continue_status, pid);
c906108c
SS
1742}
1743
1744static void
fba45db2 1745child_prepare_to_store (void)
c906108c
SS
1746{
1747 /* Do nothing, since we can store individual regs */
1748}
1749
1750static int
fba45db2 1751child_can_run (void)
c906108c
SS
1752{
1753 return 1;
1754}
1755
1756static void
0a65a603 1757child_close (int x)
c906108c 1758{
39f77062 1759 DEBUG_EVENTS (("gdb: child_close, inferior_ptid=%d\n",
3bccec63 1760 PIDGET (inferior_ptid)));
c906108c
SS
1761}
1762
c5aa993b 1763struct target_ops child_ops;
c906108c 1764
c5aa993b
JM
1765static void
1766init_child_ops (void)
c906108c 1767{
c5aa993b
JM
1768 child_ops.to_shortname = "child";
1769 child_ops.to_longname = "Win32 child process";
1770 child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
1771 child_ops.to_open = child_open;
1772 child_ops.to_close = child_close;
1773 child_ops.to_attach = child_attach;
1774 child_ops.to_detach = child_detach;
1775 child_ops.to_resume = child_resume;
1776 child_ops.to_wait = child_wait;
1777 child_ops.to_fetch_registers = child_fetch_inferior_registers;
1778 child_ops.to_store_registers = child_store_inferior_registers;
1779 child_ops.to_prepare_to_store = child_prepare_to_store;
1780 child_ops.to_xfer_memory = child_xfer_memory;
1781 child_ops.to_files_info = child_files_info;
1782 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
1783 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
1784 child_ops.to_terminal_init = terminal_init_inferior;
1785 child_ops.to_terminal_inferior = terminal_inferior;
1786 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
1787 child_ops.to_terminal_ours = terminal_ours;
1788 child_ops.to_terminal_info = child_terminal_info;
1789 child_ops.to_kill = child_kill_inferior;
1790 child_ops.to_load = 0;
1791 child_ops.to_lookup_symbol = 0;
1792 child_ops.to_create_inferior = child_create_inferior;
1793 child_ops.to_mourn_inferior = child_mourn_inferior;
1794 child_ops.to_can_run = child_can_run;
1795 child_ops.to_notice_signals = 0;
1796 child_ops.to_thread_alive = win32_child_thread_alive;
ed9a39eb 1797 child_ops.to_pid_to_str = cygwin_pid_to_str;
c5aa993b
JM
1798 child_ops.to_stop = child_stop;
1799 child_ops.to_stratum = process_stratum;
1800 child_ops.DONT_USE = 0;
1801 child_ops.to_has_all_memory = 1;
1802 child_ops.to_has_memory = 1;
1803 child_ops.to_has_stack = 1;
1804 child_ops.to_has_registers = 1;
1805 child_ops.to_has_execution = 1;
1806 child_ops.to_sections = 0;
1807 child_ops.to_sections_end = 0;
1808 child_ops.to_magic = OPS_MAGIC;
c906108c
SS
1809}
1810
1811void
fba45db2 1812_initialize_inftarg (void)
c906108c 1813{
fa58ee11 1814 struct cmd_list_element *c;
dfe7f3ac 1815 const char *sh;
fa58ee11 1816
c5aa993b 1817 init_child_ops ();
c906108c 1818
fa58ee11
EZ
1819 c = add_com ("dll-symbols", class_files, dll_symbol_command,
1820 "Load dll library symbols from FILE.");
1821 c->completer = filename_completer;
450005e7 1822
dfe7f3ac
CF
1823 sh = getenv ("SHELL");
1824 if (!sh)
1825 sh = "/bin/sh";
1826 if (access (sh, X_OK) != 0)
1827 {
1828 shell[0] = '\0';
1829 useshell = 0;
1830 }
1831 else
1832 {
1833 cygwin_conv_to_win32_path (sh, shell);
1834 useshell = 1;
1835 }
1836
450005e7
CF
1837 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
1838
dfe7f3ac
CF
1839 add_show_from_set (add_set_cmd ("shell", class_support, var_boolean,
1840 (char *) &useshell,
1841 "Set use of shell to start subprocess.",
1842 &setlist),
1843 &showlist);
1844
450005e7 1845 add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean,
8e860359
CF
1846 (char *) &new_console,
1847 "Set creation of new console when creating child process.",
1848 &setlist),
1849 &showlist);
c906108c 1850
450005e7 1851 add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean,
8e860359
CF
1852 (char *) &new_group,
1853 "Set creation of new group when creating child process.",
1854 &setlist),
1855 &showlist);
c906108c 1856
450005e7 1857 add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean,
8e860359
CF
1858 (char *) &debug_exec,
1859 "Set whether to display execution in child process.",
1860 &setlist),
1861 &showlist);
c906108c 1862
450005e7 1863 add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean,
8e860359
CF
1864 (char *) &debug_events,
1865 "Set whether to display kernel events in child process.",
1866 &setlist),
1867 &showlist);
c906108c 1868
450005e7 1869 add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean,
8e860359
CF
1870 (char *) &debug_memory,
1871 "Set whether to display memory accesses in child process.",
1872 &setlist),
1873 &showlist);
c906108c 1874
450005e7 1875 add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
8e860359
CF
1876 (char *) &debug_exceptions,
1877 "Set whether to display kernel exceptions in child process.",
1878 &setlist),
1879 &showlist);
c906108c 1880
450005e7
CF
1881 add_info ("dll", info_dll_command, "Status of loaded DLLs.");
1882 add_info_alias ("sharedlibrary", "dll", 1);
1883
c1748f97
PM
1884 add_prefix_cmd ("w32", class_info, info_w32_command,
1885 "Print information specific to Win32 debugging.",
1886 &info_w32_cmdlist, "info w32 ", 0, &infolist);
1887
1888 add_cmd ("selector", class_info, display_selectors,
1889 "Display selectors infos.",
1890 &info_w32_cmdlist);
1891
c906108c
SS
1892 add_target (&child_ops);
1893}
1894
fa4ba8da
PM
1895/* Hardware watchpoint support, adapted from go32-nat.c code. */
1896
1897/* Pass the address ADDR to the inferior in the I'th debug register.
1898 Here we just store the address in dr array, the registers will be
1899 actually set up when child_continue is called. */
1900void
1901cygwin_set_dr (int i, CORE_ADDR addr)
1902{
1903 if (i < 0 || i > 3)
1904 internal_error (__FILE__, __LINE__,
1905 "Invalid register %d in cygwin_set_dr.\n", i);
1906 dr[i] = (unsigned) addr;
1907 debug_registers_changed = 1;
1908 debug_registers_used = 1;
1909}
1910
1911/* Pass the value VAL to the inferior in the DR7 debug control
1912 register. Here we just store the address in D_REGS, the watchpoint
1913 will be actually set up in child_wait. */
1914void
1915cygwin_set_dr7 (unsigned val)
1916{
1917 dr[7] = val;
1918 debug_registers_changed = 1;
1919 debug_registers_used = 1;
1920}
1921
1922/* Get the value of the DR6 debug status register from the inferior.
1923 Here we just return the value stored in dr[6]
1924 by the last call to thread_rec for current_event.dwThreadId id. */
1925unsigned
1926cygwin_get_dr6 (void)
1927{
1928 return dr[6];
1929}
1930
1931
c906108c
SS
1932/* Determine if the thread referenced by "pid" is alive
1933 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
1934 it means that the pid has died. Otherwise it is assumed to be alive. */
1935static int
39f77062 1936win32_child_thread_alive (ptid_t ptid)
c906108c 1937{
39f77062
KB
1938 int pid = PIDGET (ptid);
1939
c5aa993b
JM
1940 return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
1941 FALSE : TRUE;
c906108c
SS
1942}
1943
1944/* Convert pid to printable format. */
1945char *
39f77062 1946cygwin_pid_to_str (ptid_t ptid)
c906108c
SS
1947{
1948 static char buf[80];
39f77062
KB
1949 int pid = PIDGET (ptid);
1950
29fe111d 1951 if ((DWORD) pid == current_event.dwProcessId)
b69571f5 1952 sprintf (buf, "process %d", pid);
c906108c 1953 else
b69571f5 1954 sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
c906108c
SS
1955 return buf;
1956}
8e860359
CF
1957
1958static int
1959core_dll_symbols_add (char *dll_name, DWORD base_addr)
1960{
1961 struct objfile *objfile;
1962 char *objfile_basename;
1963 const char *dll_basename;
1964
1965 if (!(dll_basename = strrchr (dll_name, '/')))
1966 dll_basename = dll_name;
1967 else
1968 dll_basename++;
1969
1970 ALL_OBJFILES (objfile)
1971 {
1972 objfile_basename = strrchr (objfile->name, '/');
1973
1974 if (objfile_basename &&
1975 strcmp (dll_basename, objfile_basename + 1) == 0)
1976 {
1977 printf_unfiltered ("%08lx:%s (symbols previously loaded)\n",
1978 base_addr, dll_name);
1979 goto out;
1980 }
1981 }
1982
1983 register_loaded_dll (dll_name, base_addr + 0x1000);
02e423b9 1984 solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
8e860359
CF
1985
1986out:
1987 return 1;
1988}
1989
1990typedef struct
1991{
1992 struct target_ops *target;
1993 bfd_vma addr;
1994}
1995map_code_section_args;
1996
1997static void
554cb486 1998map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
8e860359
CF
1999{
2000 int old;
2001 int update_coreops;
2002 struct section_table *new_target_sect_ptr;
2003
2004 map_code_section_args *args = (map_code_section_args *) obj;
2005 struct target_ops *target = args->target;
2006 if (sect->flags & SEC_CODE)
2007 {
2008 update_coreops = core_ops.to_sections == target->to_sections;
2009
2010 if (target->to_sections)
2011 {
2012 old = target->to_sections_end - target->to_sections;
2013 target->to_sections = (struct section_table *)
2014 xrealloc ((char *) target->to_sections,
2015 (sizeof (struct section_table)) * (1 + old));
2016 }
2017 else
2018 {
2019 old = 0;
2020 target->to_sections = (struct section_table *)
2021 xmalloc ((sizeof (struct section_table)));
2022 }
2023 target->to_sections_end = target->to_sections + (1 + old);
2024
2025 /* Update the to_sections field in the core_ops structure
3bccec63 2026 if needed. */
8e860359
CF
2027 if (update_coreops)
2028 {
2029 core_ops.to_sections = target->to_sections;
2030 core_ops.to_sections_end = target->to_sections_end;
2031 }
2032 new_target_sect_ptr = target->to_sections + old;
2033 new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
2034 new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
2035 bfd_section_size (abfd, sect);;
2036 new_target_sect_ptr->the_bfd_section = sect;
2037 new_target_sect_ptr->bfd = abfd;
2038 }
2039}
2040
2041static int
2042dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
2043{
2044 bfd *dll_bfd;
2045 map_code_section_args map_args;
2046 asection *lowest_sect;
2047 char *name;
2048 if (dll_name == NULL || target == NULL)
2049 return 0;
66ed1d85 2050 name = xstrdup (dll_name);
8e860359
CF
2051 dll_bfd = bfd_openr (name, "pei-i386");
2052 if (dll_bfd == NULL)
2053 return 0;
2054
2055 if (bfd_check_format (dll_bfd, bfd_object))
2056 {
2057 lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
2058 if (lowest_sect == NULL)
2059 return 0;
2060 map_args.target = target;
2061 map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
2062
554cb486 2063 bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
8e860359
CF
2064 }
2065
2066 return 1;
2067}
2068
2069static void
554cb486 2070core_section_load_dll_symbols (bfd * abfd, asection * sect, void *obj)
8e860359
CF
2071{
2072 struct target_ops *target = (struct target_ops *) obj;
2073
2074 DWORD base_addr;
2075
2076 int dll_name_size;
2077 char *dll_name = NULL;
2078 char *buf = NULL;
2079 struct win32_pstatus *pstatus;
2080 char *p;
2081
2082 if (strncmp (sect->name, ".module", 7))
2083 return;
2084
2085 buf = (char *) xmalloc (sect->_raw_size + 1);
2086 if (!buf)
2087 {
2088 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2089 goto out;
2090 }
2091 if (!bfd_get_section_contents (abfd, sect, buf, 0, sect->_raw_size))
2092 goto out;
2093
2094 pstatus = (struct win32_pstatus *) buf;
2095
2096 memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
2097 dll_name_size = pstatus->data.module_info.module_name_size;
2098 if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > sect->_raw_size)
2099 goto out;
2100
2101 dll_name = (char *) xmalloc (dll_name_size + 1);
2102 if (!dll_name)
2103 {
2104 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2105 goto out;
2106 }
2107 strncpy (dll_name, pstatus->data.module_info.module_name, dll_name_size);
2108
2109 while ((p = strchr (dll_name, '\\')))
2110 *p = '/';
2111
2112 if (!core_dll_symbols_add (dll_name, (DWORD) base_addr))
2113 printf_unfiltered ("%s: Failed to load dll symbols.\n", dll_name);
2114
2115 if (!dll_code_sections_add (dll_name, (DWORD) base_addr + 0x1000, target))
2116 printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
2117
2118out:
2119 if (buf)
b8c9b27d 2120 xfree (buf);
8e860359 2121 if (dll_name)
b8c9b27d 2122 xfree (dll_name);
8e860359
CF
2123 return;
2124}
2125
2126void
0a65a603
AC
2127child_solib_add (char *filename, int from_tty, struct target_ops *target,
2128 int readsyms)
8e860359 2129{
990f9fe3
FF
2130 if (!readsyms)
2131 return;
8e860359
CF
2132 if (core_bfd)
2133 {
2134 child_clear_solibs ();
2135 bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols, target);
2136 }
2137 else
2138 {
2139 if (solib_end && solib_end->name)
d3ff4a77 2140 solib_end->objfile = solib_symbols_add (solib_end->name, from_tty,
3bccec63 2141 solib_end->load_addr);
8e860359
CF
2142 }
2143}
2144
2145static void
2146fetch_elf_core_registers (char *core_reg_sect,
2147 unsigned core_reg_size,
2148 int which,
2149 CORE_ADDR reg_addr)
2150{
2151 int r;
2152 if (core_reg_size < sizeof (CONTEXT))
2153 {
2154 error ("Core file register section too small (%u bytes).", core_reg_size);
2155 return;
2156 }
2157 for (r = 0; r < NUM_REGS; r++)
2158 supply_register (r, core_reg_sect + mappings[r]);
2159}
2160
2161static struct core_fns win32_elf_core_fns =
2162{
2163 bfd_target_elf_flavour,
2164 default_check_format,
2165 default_core_sniffer,
2166 fetch_elf_core_registers,
2167 NULL
2168};
2169
2170void
0613c401 2171_initialize_core_win32 (void)
8e860359
CF
2172{
2173 add_core_fns (&win32_elf_core_fns);
2174}
2a3d5645
CF
2175
2176void
2177_initialize_check_for_gdb_ini (void)
2178{
2179 char *homedir;
2180 if (inhibit_gdbinit)
2181 return;
2182
2183 homedir = getenv ("HOME");
2184 if (homedir)
2185 {
2186 char *p;
2187 char *oldini = (char *) alloca (strlen (homedir) +
2188 sizeof ("/gdb.ini"));
2189 strcpy (oldini, homedir);
2190 p = strchr (oldini, '\0');
2191 if (p > oldini && p[-1] != '/')
2192 *p++ = '/';
2193 strcpy (p, "gdb.ini");
2194 if (access (oldini, 0) == 0)
2195 {
2196 int len = strlen (oldini);
2197 char *newini = alloca (len + 1);
dfe7f3ac 2198 sprintf (newini, "%.*s.gdbinit",
58fa08f0 2199 (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2a3d5645
CF
2200 warning ("obsolete '%s' found. Rename to '%s'.", oldini, newini);
2201 }
2202 }
2203}