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