* target.h (struct regcache): Add forward declaration.
[external/binutils.git] / gdb / windows-nat.c
1 /* Target-vector operations for controlling win32 child processes, for GDB.
2
3    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4    2005, 2006, 2007 Free Software Foundation, Inc.
5
6    Contributed by Cygnus Solutions, A Red Hat Company.
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
22    Foundation, Inc., 51 Franklin Street, Fifth Floor,
23    Boston, MA 02110-1301, USA.  */
24
25 /* Originally by Steve Chamberlain, sac@cygnus.com */
26
27 /* We assume we're being built with and will be used for cygwin.  */
28
29 #include "defs.h"
30 #include "frame.h"              /* required by inferior.h */
31 #include "inferior.h"
32 #include "target.h"
33 #include "exceptions.h"
34 #include "gdbcore.h"
35 #include "command.h"
36 #include "completer.h"
37 #include "regcache.h"
38 #include "top.h"
39 #include <signal.h>
40 #include <sys/types.h>
41 #include <fcntl.h>
42 #include <stdlib.h>
43 #include <windows.h>
44 #include <imagehlp.h>
45 #include <sys/cygwin.h>
46 #include <signal.h>
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>
55 #include <unistd.h>
56 #include "exec.h"
57 #include "solist.h"
58 #include "solib.h"
59
60 #include "i386-tdep.h"
61 #include "i387-tdep.h"
62
63 static struct target_ops win32_ops;
64 static struct target_so_ops win32_so_ops;
65
66 /* The starting and ending address of the cygwin1.dll text segment. */
67 static bfd_vma cygwin_load_start;
68 static bfd_vma cygwin_load_end;
69
70 static int have_saved_context;  /* True if we've saved context from a cygwin signal. */
71 static CONTEXT saved_context;   /* Containes the saved context from a cygwin signal. */
72
73 /* If we're not using the old Cygwin header file set, define the
74    following which never should have been in the generic Win32 API
75    headers in the first place since they were our own invention... */
76 #ifndef _GNU_H_WINDOWS_H
77 enum
78   {
79     FLAG_TRACE_BIT = 0x100,
80     CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
81   };
82 #endif
83 #include <sys/procfs.h>
84 #include <psapi.h>
85
86 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
87         | CONTEXT_EXTENDED_REGISTERS
88
89 static unsigned dr[8];
90 static int debug_registers_changed;
91 static int debug_registers_used;
92
93 /* The string sent by cygwin when it processes a signal.
94    FIXME: This should be in a cygwin include file. */
95 #ifndef _CYGWIN_SIGNAL_STRING
96 #define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
97 #endif
98
99 #define CHECK(x)        check (x, __FILE__,__LINE__)
100 #define DEBUG_EXEC(x)   if (debug_exec)         printf_unfiltered x
101 #define DEBUG_EVENTS(x) if (debug_events)       printf_unfiltered x
102 #define DEBUG_MEM(x)    if (debug_memory)       printf_unfiltered x
103 #define DEBUG_EXCEPT(x) if (debug_exceptions)   printf_unfiltered x
104
105 static void win32_stop (void);
106 static int win32_win32_thread_alive (ptid_t);
107 static void win32_kill_inferior (void);
108
109 static enum target_signal last_sig = TARGET_SIGNAL_0;
110 /* Set if a signal was received from the debugged process */
111
112 /* Thread information structure used to track information that is
113    not available in gdb's thread structure. */
114 typedef struct thread_info_struct
115   {
116     struct thread_info_struct *next;
117     DWORD id;
118     HANDLE h;
119     char *name;
120     int suspend_count;
121     int reload_context;
122     CONTEXT context;
123     STACKFRAME sf;
124   }
125 thread_info;
126
127 static thread_info thread_head;
128
129 /* The process and thread handles for the above context. */
130
131 static DEBUG_EVENT current_event;       /* The current debug event from
132                                            WaitForDebugEvent */
133 static HANDLE current_process_handle;   /* Currently executing process */
134 static thread_info *current_thread;     /* Info on currently selected thread */
135 static DWORD main_thread_id;            /* Thread ID of the main thread */
136
137 /* Counts of things. */
138 static int exception_count = 0;
139 static int event_count = 0;
140 static int saw_create;
141
142 /* User options. */
143 static int new_console = 0;
144 static int cygwin_exceptions = 0;
145 static int new_group = 1;
146 static int debug_exec = 0;              /* show execution */
147 static int debug_events = 0;            /* show events from kernel */
148 static int debug_memory = 0;            /* show target memory accesses */
149 static int debug_exceptions = 0;        /* show target exceptions */
150 static int useshell = 0;                /* use shell for subprocesses */
151
152 /* This vector maps GDB's idea of a register's number into an address
153    in the win32 exception context vector.
154
155    It also contains the bit mask needed to load the register in question.
156
157    One day we could read a reg, we could inspect the context we
158    already have loaded, if it doesn't have the bit set that we need,
159    we read that set of registers in using GetThreadContext.  If the
160    context already contains what we need, we just unpack it. Then to
161    write a register, first we have to ensure that the context contains
162    the other regs of the group, and then we copy the info in and set
163    out bit. */
164
165 #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
166 static const int mappings[] =
167 {
168   context_offset (Eax),
169   context_offset (Ecx),
170   context_offset (Edx),
171   context_offset (Ebx),
172   context_offset (Esp),
173   context_offset (Ebp),
174   context_offset (Esi),
175   context_offset (Edi),
176   context_offset (Eip),
177   context_offset (EFlags),
178   context_offset (SegCs),
179   context_offset (SegSs),
180   context_offset (SegDs),
181   context_offset (SegEs),
182   context_offset (SegFs),
183   context_offset (SegGs),
184   context_offset (FloatSave.RegisterArea[0 * 10]),
185   context_offset (FloatSave.RegisterArea[1 * 10]),
186   context_offset (FloatSave.RegisterArea[2 * 10]),
187   context_offset (FloatSave.RegisterArea[3 * 10]),
188   context_offset (FloatSave.RegisterArea[4 * 10]),
189   context_offset (FloatSave.RegisterArea[5 * 10]),
190   context_offset (FloatSave.RegisterArea[6 * 10]),
191   context_offset (FloatSave.RegisterArea[7 * 10]),
192   context_offset (FloatSave.ControlWord),
193   context_offset (FloatSave.StatusWord),
194   context_offset (FloatSave.TagWord),
195   context_offset (FloatSave.ErrorSelector),
196   context_offset (FloatSave.ErrorOffset),
197   context_offset (FloatSave.DataSelector),
198   context_offset (FloatSave.DataOffset),
199   context_offset (FloatSave.ErrorSelector)
200   /* XMM0-7 */ ,
201   context_offset (ExtendedRegisters[10*16]),
202   context_offset (ExtendedRegisters[11*16]),
203   context_offset (ExtendedRegisters[12*16]),
204   context_offset (ExtendedRegisters[13*16]),
205   context_offset (ExtendedRegisters[14*16]),
206   context_offset (ExtendedRegisters[15*16]),
207   context_offset (ExtendedRegisters[16*16]),
208   context_offset (ExtendedRegisters[17*16]),
209   /* MXCSR */
210   context_offset (ExtendedRegisters[24])
211 };
212
213 #undef context_offset
214
215 /* This vector maps the target's idea of an exception (extracted
216    from the DEBUG_EVENT structure) to GDB's idea. */
217
218 struct xlate_exception
219   {
220     int them;
221     enum target_signal us;
222   };
223
224 static const struct xlate_exception
225   xlate[] =
226 {
227   {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
228   {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
229   {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
230   {DBG_CONTROL_C, TARGET_SIGNAL_INT},
231   {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
232   {STATUS_FLOAT_DIVIDE_BY_ZERO, TARGET_SIGNAL_FPE},
233   {-1, -1}};
234
235 static void
236 check (BOOL ok, const char *file, int line)
237 {
238   if (!ok)
239     printf_filtered ("error return %s:%d was %lu\n", file, line,
240                      GetLastError ());
241 }
242
243 /* Find a thread record given a thread id.
244    If get_context then also retrieve the context for this
245    thread. */
246 static thread_info *
247 thread_rec (DWORD id, int get_context)
248 {
249   thread_info *th;
250
251   for (th = &thread_head; (th = th->next) != NULL;)
252     if (th->id == id)
253       {
254         if (!th->suspend_count && get_context)
255           {
256             if (get_context > 0 && id != current_event.dwThreadId)
257               th->suspend_count = SuspendThread (th->h) + 1;
258             else if (get_context < 0)
259               th->suspend_count = -1;
260             th->reload_context = 1;
261           }
262         return th;
263       }
264
265   return NULL;
266 }
267
268 /* Add a thread to the thread list */
269 static thread_info *
270 win32_add_thread (DWORD id, HANDLE h)
271 {
272   thread_info *th;
273
274   if ((th = thread_rec (id, FALSE)))
275     return th;
276
277   th = XZALLOC (thread_info);
278   th->id = id;
279   th->h = h;
280   th->next = thread_head.next;
281   thread_head.next = th;
282   add_thread (pid_to_ptid (id));
283   /* Set the debug registers for the new thread in they are used.  */
284   if (debug_registers_used)
285     {
286       /* Only change the value of the debug registers.  */
287       th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
288       CHECK (GetThreadContext (th->h, &th->context));
289       th->context.Dr0 = dr[0];
290       th->context.Dr1 = dr[1];
291       th->context.Dr2 = dr[2];
292       th->context.Dr3 = dr[3];
293       /* th->context.Dr6 = dr[6];
294       FIXME: should we set dr6 also ?? */
295       th->context.Dr7 = dr[7];
296       CHECK (SetThreadContext (th->h, &th->context));
297       th->context.ContextFlags = 0;
298     }
299   return th;
300 }
301
302 /* Clear out any old thread list and reintialize it to a
303    pristine state. */
304 static void
305 win32_init_thread_list (void)
306 {
307   thread_info *th = &thread_head;
308
309   DEBUG_EVENTS (("gdb: win32_init_thread_list\n"));
310   init_thread_list ();
311   while (th->next != NULL)
312     {
313       thread_info *here = th->next;
314       th->next = here->next;
315       (void) CloseHandle (here->h);
316       xfree (here);
317     }
318   thread_head.next = NULL;
319 }
320
321 /* Delete a thread from the list of threads */
322 static void
323 win32_delete_thread (DWORD id)
324 {
325   thread_info *th;
326
327   if (info_verbose)
328     printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (pid_to_ptid (id)));
329   delete_thread (pid_to_ptid (id));
330
331   for (th = &thread_head;
332        th->next != NULL && th->next->id != id;
333        th = th->next)
334     continue;
335
336   if (th->next != NULL)
337     {
338       thread_info *here = th->next;
339       th->next = here->next;
340       CloseHandle (here->h);
341       xfree (here);
342     }
343 }
344
345 static void
346 do_win32_fetch_inferior_registers (struct regcache *regcache, int r)
347 {
348   char *context_offset = ((char *) &current_thread->context) + mappings[r];
349   long l;
350
351   if (!current_thread)
352     return;     /* Windows sometimes uses a non-existent thread id in its
353                    events */
354
355   if (current_thread->reload_context)
356     {
357 #ifdef __COPY_CONTEXT_SIZE
358       if (have_saved_context)
359         {
360           /* Lie about where the program actually is stopped since cygwin has informed us that
361              we should consider the signal to have occurred at another location which is stored
362              in "saved_context. */
363           memcpy (&current_thread->context, &saved_context, __COPY_CONTEXT_SIZE);
364           have_saved_context = 0;
365         }
366       else
367 #endif
368         {
369           thread_info *th = current_thread;
370           th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
371           GetThreadContext (th->h, &th->context);
372           /* Copy dr values from that thread.  */
373           dr[0] = th->context.Dr0;
374           dr[1] = th->context.Dr1;
375           dr[2] = th->context.Dr2;
376           dr[3] = th->context.Dr3;
377           dr[6] = th->context.Dr6;
378           dr[7] = th->context.Dr7;
379         }
380       current_thread->reload_context = 0;
381     }
382
383 #define I387_ST0_REGNUM I386_ST0_REGNUM
384
385   if (r == I387_FISEG_REGNUM)
386     {
387       l = *((long *) context_offset) & 0xffff;
388       regcache_raw_supply (regcache, r, (char *) &l);
389     }
390   else if (r == I387_FOP_REGNUM)
391     {
392       l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
393       regcache_raw_supply (regcache, r, (char *) &l);
394     }
395   else if (r >= 0)
396     regcache_raw_supply (regcache, r, context_offset);
397   else
398     {
399       for (r = 0; r < NUM_REGS; r++)
400         do_win32_fetch_inferior_registers (regcache, r);
401     }
402
403 #undef I387_ST0_REGNUM
404 }
405
406 static void
407 win32_fetch_inferior_registers (struct regcache *regcache, int r)
408 {
409   current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
410   /* Check if current_thread exists.  Windows sometimes uses a non-existent
411      thread id in its events */
412   if (current_thread)
413     do_win32_fetch_inferior_registers (regcache, r);
414 }
415
416 static void
417 do_win32_store_inferior_registers (const struct regcache *regcache, int r)
418 {
419   if (!current_thread)
420     /* Windows sometimes uses a non-existent thread id in its events */;
421   else if (r >= 0)
422     regcache_raw_collect (regcache, r,
423                           ((char *) &current_thread->context) + mappings[r]);
424   else
425     {
426       for (r = 0; r < NUM_REGS; r++)
427         do_win32_store_inferior_registers (regcache, r);
428     }
429 }
430
431 /* Store a new register value into the current thread context */
432 static void
433 win32_store_inferior_registers (struct regcache *regcache, int r)
434 {
435   current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
436   /* Check if current_thread exists.  Windows sometimes uses a non-existent
437      thread id in its events */
438   if (current_thread)
439     do_win32_store_inferior_registers (regcache, r);
440 }
441
442 static int psapi_loaded = 0;
443 static HMODULE psapi_module_handle = NULL;
444 static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
445 static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
446 static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
447
448 static int
449 psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
450 {
451   DWORD len;
452   MODULEINFO mi;
453   int i;
454   HMODULE dh_buf[1];
455   HMODULE *DllHandle = dh_buf;
456   DWORD cbNeeded;
457   BOOL ok;
458
459   if (!psapi_loaded ||
460       psapi_EnumProcessModules == NULL ||
461       psapi_GetModuleInformation == NULL ||
462       psapi_GetModuleFileNameExA == NULL)
463     {
464       if (psapi_loaded)
465         goto failed;
466       psapi_loaded = 1;
467       psapi_module_handle = LoadLibrary ("psapi.dll");
468       if (!psapi_module_handle)
469         {
470           /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
471           goto failed;
472         }
473       psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
474       psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
475       psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
476                                                     "GetModuleFileNameExA");
477       if (psapi_EnumProcessModules == NULL ||
478           psapi_GetModuleInformation == NULL ||
479           psapi_GetModuleFileNameExA == NULL)
480         goto failed;
481     }
482
483   cbNeeded = 0;
484   ok = (*psapi_EnumProcessModules) (current_process_handle,
485                                     DllHandle,
486                                     sizeof (HMODULE),
487                                     &cbNeeded);
488
489   if (!ok || !cbNeeded)
490     goto failed;
491
492   DllHandle = (HMODULE *) alloca (cbNeeded);
493   if (!DllHandle)
494     goto failed;
495
496   ok = (*psapi_EnumProcessModules) (current_process_handle,
497                                     DllHandle,
498                                     cbNeeded,
499                                     &cbNeeded);
500   if (!ok)
501     goto failed;
502
503   for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
504     {
505       if (!(*psapi_GetModuleInformation) (current_process_handle,
506                                           DllHandle[i],
507                                           &mi,
508                                           sizeof (mi)))
509         error (_("Can't get module info"));
510
511       len = (*psapi_GetModuleFileNameExA) (current_process_handle,
512                                            DllHandle[i],
513                                            dll_name_ret,
514                                            MAX_PATH);
515       if (len == 0)
516         error (_("Error getting dll name: %u."), (unsigned) GetLastError ());
517
518       if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
519         return 1;
520     }
521
522 failed:
523   dll_name_ret[0] = '\0';
524   return 0;
525 }
526
527 /* Encapsulate the information required in a call to
528    symbol_file_add_args */
529 struct safe_symbol_file_add_args
530 {
531   char *name;
532   int from_tty;
533   struct section_addr_info *addrs;
534   int mainline;
535   int flags;
536   struct ui_file *err, *out;
537   struct objfile *ret;
538 };
539
540 /* Maintain a linked list of "so" information. */
541 struct lm_info
542 {
543   DWORD load_addr;
544 };
545
546 static struct so_list solib_start, *solib_end;
547
548 /* Call symbol_file_add with stderr redirected.  We don't care if there
549    are errors. */
550 static int
551 safe_symbol_file_add_stub (void *argv)
552 {
553 #define p ((struct safe_symbol_file_add_args *) argv)
554   struct so_list *so = &solib_start;
555
556   p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
557   return !!p->ret;
558 #undef p
559 }
560
561 /* Restore gdb's stderr after calling symbol_file_add */
562 static void
563 safe_symbol_file_add_cleanup (void *p)
564 {
565 #define sp ((struct safe_symbol_file_add_args *)p)
566   gdb_flush (gdb_stderr);
567   gdb_flush (gdb_stdout);
568   ui_file_delete (gdb_stderr);
569   ui_file_delete (gdb_stdout);
570   gdb_stderr = sp->err;
571   gdb_stdout = sp->out;
572 #undef sp
573 }
574
575 /* symbol_file_add wrapper that prevents errors from being displayed. */
576 static struct objfile *
577 safe_symbol_file_add (char *name, int from_tty,
578                       struct section_addr_info *addrs,
579                       int mainline, int flags)
580 {
581   struct safe_symbol_file_add_args p;
582   struct cleanup *cleanup;
583
584   cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
585
586   p.err = gdb_stderr;
587   p.out = gdb_stdout;
588   gdb_flush (gdb_stderr);
589   gdb_flush (gdb_stdout);
590   gdb_stderr = ui_file_new ();
591   gdb_stdout = ui_file_new ();
592   p.name = name;
593   p.from_tty = from_tty;
594   p.addrs = addrs;
595   p.mainline = mainline;
596   p.flags = flags;
597   catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
598
599   do_cleanups (cleanup);
600   return p.ret;
601 }
602
603 /* Get the loaded address of all sections, given that .text was loaded
604    at text_load. Assumes that all sections are subject to the same
605    relocation offset. Returns NULL if problems occur or if the
606    sections were not relocated. */
607
608 static struct section_addr_info *
609 get_relocated_section_addrs (bfd *abfd, CORE_ADDR text_load)
610 {
611   struct section_addr_info *result = NULL;
612   int section_count = bfd_count_sections (abfd);
613   asection *text_section = bfd_get_section_by_name (abfd, ".text");
614   CORE_ADDR text_vma;
615
616   if (!text_section)
617     {
618       /* Couldn't get the .text section. Weird. */
619     }
620   else if (text_load == (text_vma = bfd_get_section_vma (abfd, text_section)))
621     {
622       /* DLL wasn't relocated. */
623     }
624   else
625     {
626       /* Figure out all sections' loaded addresses. The offset here is
627          such that taking a bfd_get_section_vma() result and adding
628          offset will give the real load address of the section. */
629
630       CORE_ADDR offset = text_load - text_vma;
631
632       struct section_table *table_start = NULL;
633       struct section_table *table_end = NULL;
634       struct section_table *iter = NULL;
635
636       build_section_table (abfd, &table_start, &table_end);
637
638       for (iter = table_start; iter < table_end; ++iter)
639         {
640           /* Relocated addresses. */
641           iter->addr += offset;
642           iter->endaddr += offset;
643         }
644
645       result = build_section_addr_info_from_section_table (table_start,
646                                                            table_end);
647
648       xfree (table_start);
649     }
650
651   return result;
652 }
653
654 /* Add DLL symbol information. */
655 static void
656 solib_symbols_add (struct so_list *so, CORE_ADDR load_addr)
657 {
658   struct section_addr_info *addrs = NULL;
659   static struct objfile *result = NULL;
660   char *name = so->so_name;
661   bfd *abfd = NULL;
662   char *p;
663
664   /* The symbols in a dll are offset by 0x1000, which is the
665      the offset from 0 of the first byte in an image - because
666      of the file header and the section alignment. */
667
668   if (!name || !name[0])
669     return;
670
671   abfd = bfd_openr (name, "pei-i386");
672
673   if (!abfd)
674     {
675       /* pei failed - try pe */
676       abfd = bfd_openr (name, "pe-i386");
677     }
678
679   if (abfd)
680     {
681       if (bfd_check_format (abfd, bfd_object))
682         addrs = get_relocated_section_addrs (abfd, load_addr);
683     }
684
685   if (addrs)
686     {
687       result = safe_symbol_file_add (name, 0, addrs, 0, OBJF_SHARED);
688       free_section_addr_info (addrs);
689     }
690   else
691     {
692       /* Fallback on handling just the .text section. */
693       struct cleanup *my_cleanups;
694
695       addrs = alloc_section_addr_info (1);
696       my_cleanups = make_cleanup (xfree, addrs);
697       addrs->other[0].name = ".text";
698       addrs->other[0].addr = load_addr;
699
700       result = safe_symbol_file_add (name, 0, addrs, 0, OBJF_SHARED);
701       do_cleanups (my_cleanups);
702     }
703
704   p = strchr (so->so_name, '\0') - (sizeof ("/cygwin1.dll") - 1);
705   if (p >= so->so_name && strcasecmp (p, "/cygwin1.dll") == 0)
706     {
707       asection *text = bfd_get_section_by_name (abfd, ".text");
708       cygwin_load_start = bfd_section_vma (abfd, text);
709       cygwin_load_end = cygwin_load_start + bfd_section_size (abfd, text);
710     }
711
712   bfd_close (abfd);
713
714   so->symbols_loaded = !!result;
715   return;
716 }
717
718 static char *
719 register_loaded_dll (const char *name, DWORD load_addr, int readsyms)
720 {
721   struct so_list *so;
722   char buf[MAX_PATH + 1];
723   char cwd[MAX_PATH + 1];
724   char *p;
725   WIN32_FIND_DATA w32_fd;
726   HANDLE h = FindFirstFile(name, &w32_fd);
727   MEMORY_BASIC_INFORMATION m;
728   size_t len;
729
730   if (h == INVALID_HANDLE_VALUE)
731     strcpy (buf, name);
732   else
733     {
734       FindClose (h);
735       strcpy (buf, name);
736       if (GetCurrentDirectory (MAX_PATH + 1, cwd))
737         {
738           p = strrchr (buf, '\\');
739           if (p)
740             p[1] = '\0';
741           SetCurrentDirectory (buf);
742           GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
743           SetCurrentDirectory (cwd);
744         }
745     }
746
747   if (strcasecmp (buf, "ntdll.dll") == 0)
748     {
749       GetSystemDirectory (buf, sizeof (buf));
750       strcat (buf, "\\ntdll.dll");
751     }
752   so = XZALLOC (struct so_list);
753   so->lm_info = (struct lm_info *) xmalloc (sizeof (struct lm_info));
754   so->lm_info->load_addr = load_addr;
755   cygwin_conv_to_posix_path (buf, so->so_name);
756   strcpy (so->so_original_name, so->so_name);
757
758   solib_end->next = so;
759   solib_end = so;
760   len = strlen (so->so_name);
761   if (readsyms)
762     solib_symbols_add (so, (CORE_ADDR) load_addr);
763
764   return so->so_name;
765 }
766
767 static char *
768 get_image_name (HANDLE h, void *address, int unicode)
769 {
770   static char buf[(2 * MAX_PATH) + 1];
771   DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
772   char *address_ptr;
773   int len = 0;
774   char b[2];
775   DWORD done;
776
777   /* Attempt to read the name of the dll that was detected.
778      This is documented to work only when actively debugging
779      a program.  It will not work for attached processes. */
780   if (address == NULL)
781     return NULL;
782
783   /* See if we could read the address of a string, and that the
784      address isn't null. */
785   if (!ReadProcessMemory (h, address,  &address_ptr, sizeof (address_ptr), &done)
786       || done != sizeof (address_ptr) || !address_ptr)
787     return NULL;
788
789   /* Find the length of the string */
790   while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
791          && (b[0] != 0 || b[size - 1] != 0) && done == size)
792     continue;
793
794   if (!unicode)
795     ReadProcessMemory (h, address_ptr, buf, len, &done);
796   else
797     {
798       WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
799       ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
800                          &done);
801
802       WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
803     }
804
805   return buf;
806 }
807
808 /* Wait for child to do something.  Return pid of child, or -1 in case
809    of error; store status through argument pointer OURSTATUS.  */
810 static int
811 handle_load_dll (void *dummy)
812 {
813   LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
814   char dll_buf[MAX_PATH + 1];
815   char *dll_name = NULL;
816
817   dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
818
819   if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
820     dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
821
822   dll_name = dll_buf;
823
824   if (*dll_name == '\0')
825     dll_name = get_image_name (current_process_handle, event->lpImageName, event->fUnicode);
826   if (!dll_name)
827     return 1;
828
829   register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000, auto_solib_add);
830
831   return 1;
832 }
833
834 static void
835 win32_free_so (struct so_list *so)
836 {
837   if (so->lm_info)
838     xfree (so->lm_info);
839 }
840
841 static void
842 win32_relocate_section_addresses (struct so_list *so,
843                                   struct section_table *sec)
844 {
845   /* FIXME */
846   return;
847 }
848
849 static void
850 win32_solib_create_inferior_hook (void)
851 {
852   solib_add (NULL, 0, NULL, auto_solib_add);
853   return;
854 }
855
856 static int
857 handle_unload_dll (void *dummy)
858 {
859   DWORD lpBaseOfDll = (DWORD) current_event.u.UnloadDll.lpBaseOfDll + 0x1000;
860   struct so_list *so;
861
862   for (so = &solib_start; so->next != NULL; so = so->next)
863     if (so->next->lm_info->load_addr == lpBaseOfDll)
864       {
865         struct so_list *sodel = so->next;
866         so->next = sodel->next;
867         if (!so->next)
868           solib_end = so;
869         free_so (sodel);
870         solib_add (NULL, 0, NULL, auto_solib_add);
871         return 1;
872       }
873
874   error (_("Error: dll starting at 0x%lx not found."), (DWORD) lpBaseOfDll);
875
876   return 0;
877 }
878
879 /* Clear list of loaded DLLs. */
880 static void
881 win32_clear_solib (void)
882 {
883   solib_start.next = NULL;
884   solib_end = &solib_start;
885 }
886
887 static void
888 win32_special_symbol_handling (void)
889 {
890   return;
891 }
892
893 /* Load DLL symbol info. */
894 void
895 dll_symbol_command (char *args, int from_tty)
896 {
897   int n;
898   dont_repeat ();
899
900   if (args == NULL)
901     error (_("dll-symbols requires a file name"));
902
903   n = strlen (args);
904   if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
905     {
906       char *newargs = (char *) alloca (n + 4 + 1);
907       strcpy (newargs, args);
908       strcat (newargs, ".dll");
909       args = newargs;
910     }
911
912   safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
913 }
914
915 /* Handle DEBUG_STRING output from child process.
916    Cygwin prepends its messages with a "cygwin:".  Interpret this as
917    a Cygwin signal.  Otherwise just print the string as a warning. */
918 static int
919 handle_output_debug_string (struct target_waitstatus *ourstatus)
920 {
921   char *s = NULL;
922   int retval = 0;
923
924   if (!target_read_string
925     ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
926       || !s || !*s)
927     /* nothing to do */;
928   else if (strncmp (s, _CYGWIN_SIGNAL_STRING, sizeof (_CYGWIN_SIGNAL_STRING) - 1) != 0)
929     {
930       if (strncmp (s, "cYg", 3) != 0)
931         warning (("%s"), s);
932     }
933 #ifdef __COPY_CONTEXT_SIZE
934   else
935     {
936       /* Got a cygwin signal marker.  A cygwin signal is followed by the signal number
937          itself and then optionally followed by the thread id and address to saved context
938          within the DLL.  If these are supplied, then the given thread is assumed to have
939          issued the signal and the context from the thread is assumed to be stored at the
940          given address in the inferior.  Tell gdb to treat this like a real signal.  */
941       char *p;
942       int sig = strtol (s + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
943       int gotasig = target_signal_from_host (sig);
944       ourstatus->value.sig = gotasig;
945       if (gotasig)
946         {
947           LPCVOID x;
948           DWORD n;
949           ourstatus->kind = TARGET_WAITKIND_STOPPED;
950           retval = strtoul (p, &p, 0);
951           if (!retval)
952             retval = main_thread_id;
953           else if ((x = (LPCVOID) strtoul (p, &p, 0))
954                    && ReadProcessMemory (current_process_handle, x,
955                                          &saved_context, __COPY_CONTEXT_SIZE, &n)
956                    && n == __COPY_CONTEXT_SIZE)
957             have_saved_context = 1;
958           current_event.dwThreadId = retval;
959         }
960     }
961 #endif
962
963   if (s)
964     xfree (s);
965   return retval;
966 }
967
968 static int
969 display_selector (HANDLE thread, DWORD sel)
970 {
971   LDT_ENTRY info;
972   if (GetThreadSelectorEntry (thread, sel, &info))
973     {
974       int base, limit;
975       printf_filtered ("0x%03lx: ", sel);
976       if (!info.HighWord.Bits.Pres)
977         {
978           puts_filtered ("Segment not present\n");
979           return 0;
980         }
981       base = (info.HighWord.Bits.BaseHi << 24) +
982              (info.HighWord.Bits.BaseMid << 16)
983              + info.BaseLow;
984       limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
985       if (info.HighWord.Bits.Granularity)
986         limit = (limit << 12) | 0xfff;
987       printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
988       if (info.HighWord.Bits.Default_Big)
989         puts_filtered(" 32-bit ");
990       else
991         puts_filtered(" 16-bit ");
992       switch ((info.HighWord.Bits.Type & 0xf) >> 1)
993         {
994         case 0:
995           puts_filtered ("Data (Read-Only, Exp-up");
996           break;
997         case 1:
998           puts_filtered ("Data (Read/Write, Exp-up");
999           break;
1000         case 2:
1001           puts_filtered ("Unused segment (");
1002           break;
1003         case 3:
1004           puts_filtered ("Data (Read/Write, Exp-down");
1005           break;
1006         case 4:
1007           puts_filtered ("Code (Exec-Only, N.Conf");
1008           break;
1009         case 5:
1010           puts_filtered ("Code (Exec/Read, N.Conf");
1011           break;
1012         case 6:
1013           puts_filtered ("Code (Exec-Only, Conf");
1014           break;
1015         case 7:
1016           puts_filtered ("Code (Exec/Read, Conf");
1017           break;
1018         default:
1019           printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
1020         }
1021       if ((info.HighWord.Bits.Type & 0x1) == 0)
1022         puts_filtered(", N.Acc");
1023       puts_filtered (")\n");
1024       if ((info.HighWord.Bits.Type & 0x10) == 0)
1025         puts_filtered("System selector ");
1026       printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
1027       if (info.HighWord.Bits.Granularity)
1028         puts_filtered ("Page granular.\n");
1029       else
1030         puts_filtered ("Byte granular.\n");
1031       return 1;
1032     }
1033   else
1034     {
1035       printf_filtered ("Invalid selector 0x%lx.\n",sel);
1036       return 0;
1037     }
1038 }
1039
1040 static void
1041 display_selectors (char * args, int from_tty)
1042 {
1043   if (!current_thread)
1044     {
1045       puts_filtered ("Impossible to display selectors now.\n");
1046       return;
1047     }
1048   if (!args)
1049     {
1050
1051       puts_filtered ("Selector $cs\n");
1052       display_selector (current_thread->h,
1053         current_thread->context.SegCs);
1054       puts_filtered ("Selector $ds\n");
1055       display_selector (current_thread->h,
1056         current_thread->context.SegDs);
1057       puts_filtered ("Selector $es\n");
1058       display_selector (current_thread->h,
1059         current_thread->context.SegEs);
1060       puts_filtered ("Selector $ss\n");
1061       display_selector (current_thread->h,
1062         current_thread->context.SegSs);
1063       puts_filtered ("Selector $fs\n");
1064       display_selector (current_thread->h,
1065         current_thread->context.SegFs);
1066       puts_filtered ("Selector $gs\n");
1067       display_selector (current_thread->h,
1068         current_thread->context.SegGs);
1069     }
1070   else
1071     {
1072       int sel;
1073       sel = parse_and_eval_long (args);
1074       printf_filtered ("Selector \"%s\"\n",args);
1075       display_selector (current_thread->h, sel);
1076     }
1077 }
1078
1079 static struct cmd_list_element *info_w32_cmdlist = NULL;
1080
1081 static void
1082 info_w32_command (char *args, int from_tty)
1083 {
1084   help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
1085 }
1086
1087
1088 #define DEBUG_EXCEPTION_SIMPLE(x)       if (debug_exceptions) \
1089   printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
1090   (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
1091
1092 static int
1093 handle_exception (struct target_waitstatus *ourstatus)
1094 {
1095   thread_info *th;
1096   DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
1097
1098   ourstatus->kind = TARGET_WAITKIND_STOPPED;
1099
1100   /* Record the context of the current thread */
1101   th = thread_rec (current_event.dwThreadId, -1);
1102
1103   switch (code)
1104     {
1105     case EXCEPTION_ACCESS_VIOLATION:
1106       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1107       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1108       {
1109         /* See if the access violation happened within the cygwin DLL itself.  Cygwin uses
1110            a kind of exception handling to deal with passed-in invalid addresses. gdb
1111            should not treat these as real SEGVs since they will be silently handled by
1112            cygwin.  A real SEGV will (theoretically) be caught by cygwin later in the process
1113            and will be sent as a cygwin-specific-signal.  So, ignore SEGVs if they show up
1114            within the text segment of the DLL itself. */
1115         char *fn;
1116         bfd_vma addr = (bfd_vma) current_event.u.Exception.ExceptionRecord.ExceptionAddress;
1117         if ((!cygwin_exceptions && (addr >= cygwin_load_start && addr < cygwin_load_end))
1118             || (find_pc_partial_function (addr, &fn, NULL, NULL)
1119                 && strncmp (fn, "KERNEL32!IsBad", strlen ("KERNEL32!IsBad")) == 0))
1120           return 0;
1121       }
1122       break;
1123     case STATUS_STACK_OVERFLOW:
1124       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1125       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1126       break;
1127     case STATUS_FLOAT_DENORMAL_OPERAND:
1128       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1129       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1130       break;
1131     case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1132       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1133       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1134       break;
1135     case STATUS_FLOAT_INEXACT_RESULT:
1136       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1137       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1138       break;
1139     case STATUS_FLOAT_INVALID_OPERATION:
1140       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1141       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1142       break;
1143     case STATUS_FLOAT_OVERFLOW:
1144       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1145       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1146       break;
1147     case STATUS_FLOAT_STACK_CHECK:
1148       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1149       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1150       break;
1151     case STATUS_FLOAT_UNDERFLOW:
1152       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1153       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1154       break;
1155     case STATUS_FLOAT_DIVIDE_BY_ZERO:
1156       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1157       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1158       break;
1159     case STATUS_INTEGER_DIVIDE_BY_ZERO:
1160       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1161       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1162       break;
1163     case STATUS_INTEGER_OVERFLOW:
1164       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1165       ourstatus->value.sig = TARGET_SIGNAL_FPE;
1166       break;
1167     case EXCEPTION_BREAKPOINT:
1168       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1169       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1170       break;
1171     case DBG_CONTROL_C:
1172       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1173       ourstatus->value.sig = TARGET_SIGNAL_INT;
1174       break;
1175     case DBG_CONTROL_BREAK:
1176       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1177       ourstatus->value.sig = TARGET_SIGNAL_INT;
1178       break;
1179     case EXCEPTION_SINGLE_STEP:
1180       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1181       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1182       break;
1183     case EXCEPTION_ILLEGAL_INSTRUCTION:
1184       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1185       ourstatus->value.sig = TARGET_SIGNAL_ILL;
1186       break;
1187     case EXCEPTION_PRIV_INSTRUCTION:
1188       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1189       ourstatus->value.sig = TARGET_SIGNAL_ILL;
1190       break;
1191     case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1192       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1193       ourstatus->value.sig = TARGET_SIGNAL_ILL;
1194       break;
1195     default:
1196       /* Treat unhandled first chance exceptions specially. */
1197       if (current_event.u.Exception.dwFirstChance)
1198         return -1;
1199       printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
1200                     current_event.u.Exception.ExceptionRecord.ExceptionCode,
1201         (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
1202       ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1203       break;
1204     }
1205   exception_count++;
1206   last_sig = ourstatus->value.sig;
1207   return 1;
1208 }
1209
1210 /* Resume all artificially suspended threads if we are continuing
1211    execution */
1212 static BOOL
1213 win32_continue (DWORD continue_status, int id)
1214 {
1215   int i;
1216   thread_info *th;
1217   BOOL res;
1218
1219   DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
1220                   current_event.dwProcessId, current_event.dwThreadId,
1221                   continue_status == DBG_CONTINUE ?
1222                   "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1223   res = ContinueDebugEvent (current_event.dwProcessId,
1224                             current_event.dwThreadId,
1225                             continue_status);
1226   if (res)
1227     for (th = &thread_head; (th = th->next) != NULL;)
1228       if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
1229         {
1230
1231           for (i = 0; i < th->suspend_count; i++)
1232             (void) ResumeThread (th->h);
1233           th->suspend_count = 0;
1234           if (debug_registers_changed)
1235             {
1236               /* Only change the value of the debug registers */
1237               th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
1238               th->context.Dr0 = dr[0];
1239               th->context.Dr1 = dr[1];
1240               th->context.Dr2 = dr[2];
1241               th->context.Dr3 = dr[3];
1242               /* th->context.Dr6 = dr[6];
1243                  FIXME: should we set dr6 also ?? */
1244               th->context.Dr7 = dr[7];
1245               CHECK (SetThreadContext (th->h, &th->context));
1246               th->context.ContextFlags = 0;
1247             }
1248         }
1249
1250   debug_registers_changed = 0;
1251   return res;
1252 }
1253
1254 /* Called in pathological case where Windows fails to send a
1255    CREATE_PROCESS_DEBUG_EVENT after an attach.  */
1256 static DWORD
1257 fake_create_process (void)
1258 {
1259   current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1260                                         current_event.dwProcessId);
1261   main_thread_id = current_event.dwThreadId;
1262   current_thread = win32_add_thread (main_thread_id,
1263                                      current_event.u.CreateThread.hThread);
1264   return main_thread_id;
1265 }
1266
1267 static void
1268 win32_resume (ptid_t ptid, int step, enum target_signal sig)
1269 {
1270   thread_info *th;
1271   DWORD continue_status = DBG_CONTINUE;
1272
1273   int pid = PIDGET (ptid);
1274
1275   if (sig != TARGET_SIGNAL_0)
1276     {
1277       if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1278         {
1279           DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1280         }
1281       else if (sig == last_sig)
1282         continue_status = DBG_EXCEPTION_NOT_HANDLED;
1283       else
1284 #if 0
1285 /* This code does not seem to work, because
1286   the kernel does probably not consider changes in the ExceptionRecord
1287   structure when passing the exception to the inferior.
1288   Note that this seems possible in the exception handler itself.  */
1289         {
1290           int i;
1291           for (i = 0; xlate[i].them != -1; i++)
1292             if (xlate[i].us == sig)
1293               {
1294                 current_event.u.Exception.ExceptionRecord.ExceptionCode =
1295                   xlate[i].them;
1296                 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1297                 break;
1298               }
1299           if (continue_status == DBG_CONTINUE)
1300             {
1301               DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1302             }
1303         }
1304 #endif
1305         DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1306           last_sig));
1307     }
1308
1309   last_sig = TARGET_SIGNAL_0;
1310
1311   DEBUG_EXEC (("gdb: win32_resume (pid=%d, step=%d, sig=%d);\n",
1312                pid, step, sig));
1313
1314   /* Get context for currently selected thread */
1315   th = thread_rec (current_event.dwThreadId, FALSE);
1316   if (th)
1317     {
1318       if (step)
1319         {
1320           /* Single step by setting t bit */
1321           win32_fetch_inferior_registers (current_regcache, PS_REGNUM);
1322           th->context.EFlags |= FLAG_TRACE_BIT;
1323         }
1324
1325       if (th->context.ContextFlags)
1326         {
1327           if (debug_registers_changed)
1328             {
1329               th->context.Dr0 = dr[0];
1330               th->context.Dr1 = dr[1];
1331               th->context.Dr2 = dr[2];
1332               th->context.Dr3 = dr[3];
1333               /* th->context.Dr6 = dr[6];
1334                FIXME: should we set dr6 also ?? */
1335               th->context.Dr7 = dr[7];
1336             }
1337           CHECK (SetThreadContext (th->h, &th->context));
1338           th->context.ContextFlags = 0;
1339         }
1340     }
1341
1342   /* Allow continuing with the same signal that interrupted us.
1343      Otherwise complain. */
1344
1345   win32_continue (continue_status, pid);
1346 }
1347
1348 /* Get the next event from the child.  Return 1 if the event requires
1349    handling by WFI (or whatever).
1350  */
1351 static int
1352 get_win32_debug_event (int pid, struct target_waitstatus *ourstatus)
1353 {
1354   BOOL debug_event;
1355   DWORD continue_status, event_code;
1356   thread_info *th;
1357   static thread_info dummy_thread_info;
1358   int retval = 0;
1359   ptid_t ptid = {-1};
1360
1361   last_sig = TARGET_SIGNAL_0;
1362
1363   if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
1364     goto out;
1365
1366   event_count++;
1367   continue_status = DBG_CONTINUE;
1368
1369   event_code = current_event.dwDebugEventCode;
1370   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1371   th = NULL;
1372   have_saved_context = 0;
1373
1374   switch (event_code)
1375     {
1376     case CREATE_THREAD_DEBUG_EVENT:
1377       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
1378                      (unsigned) current_event.dwProcessId,
1379                      (unsigned) current_event.dwThreadId,
1380                      "CREATE_THREAD_DEBUG_EVENT"));
1381       if (saw_create != 1)
1382         {
1383           if (!saw_create && attach_flag)
1384             {
1385               /* Kludge around a Windows bug where first event is a create
1386                  thread event.  Caused when attached process does not have
1387                  a main thread. */
1388               retval = ourstatus->value.related_pid = fake_create_process ();
1389               saw_create++;
1390             }
1391           break;
1392         }
1393       /* Record the existence of this thread */
1394       th = win32_add_thread (current_event.dwThreadId,
1395                              current_event.u.CreateThread.hThread);
1396       if (info_verbose)
1397         printf_unfiltered ("[New %s]\n",
1398                            target_pid_to_str (
1399                              pid_to_ptid (current_event.dwThreadId)));
1400       retval = current_event.dwThreadId;
1401       break;
1402
1403     case EXIT_THREAD_DEBUG_EVENT:
1404       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1405                      (unsigned) current_event.dwProcessId,
1406                      (unsigned) current_event.dwThreadId,
1407                      "EXIT_THREAD_DEBUG_EVENT"));
1408       if (current_event.dwThreadId != main_thread_id)
1409         {
1410           win32_delete_thread (current_event.dwThreadId);
1411           th = &dummy_thread_info;
1412         }
1413       break;
1414
1415     case CREATE_PROCESS_DEBUG_EVENT:
1416       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1417                      (unsigned) current_event.dwProcessId,
1418                      (unsigned) current_event.dwThreadId,
1419                      "CREATE_PROCESS_DEBUG_EVENT"));
1420       CloseHandle (current_event.u.CreateProcessInfo.hFile);
1421       if (++saw_create != 1)
1422         {
1423           CloseHandle (current_event.u.CreateProcessInfo.hProcess);
1424           break;
1425         }
1426
1427       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1428       if (main_thread_id)
1429         win32_delete_thread (main_thread_id);
1430       main_thread_id = current_event.dwThreadId;
1431       /* Add the main thread */
1432       th = win32_add_thread (main_thread_id,
1433                              current_event.u.CreateProcessInfo.hThread);
1434       retval = ourstatus->value.related_pid = current_event.dwThreadId;
1435       break;
1436
1437     case EXIT_PROCESS_DEBUG_EVENT:
1438       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1439                      (unsigned) current_event.dwProcessId,
1440                      (unsigned) current_event.dwThreadId,
1441                      "EXIT_PROCESS_DEBUG_EVENT"));
1442       if (saw_create != 1)
1443         break;
1444       ourstatus->kind = TARGET_WAITKIND_EXITED;
1445       ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1446       CloseHandle (current_process_handle);
1447       retval = main_thread_id;
1448       break;
1449
1450     case LOAD_DLL_DEBUG_EVENT:
1451       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1452                      (unsigned) current_event.dwProcessId,
1453                      (unsigned) current_event.dwThreadId,
1454                      "LOAD_DLL_DEBUG_EVENT"));
1455       CloseHandle (current_event.u.LoadDll.hFile);
1456       if (saw_create != 1)
1457         break;
1458       catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
1459       registers_changed ();     /* mark all regs invalid */
1460       ourstatus->kind = TARGET_WAITKIND_LOADED;
1461       ourstatus->value.integer = 0;
1462       retval = main_thread_id;
1463       re_enable_breakpoints_in_shlibs ();
1464       break;
1465
1466     case UNLOAD_DLL_DEBUG_EVENT:
1467       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1468                      (unsigned) current_event.dwProcessId,
1469                      (unsigned) current_event.dwThreadId,
1470                      "UNLOAD_DLL_DEBUG_EVENT"));
1471       if (saw_create != 1)
1472         break;
1473       catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
1474       registers_changed ();     /* mark all regs invalid */
1475       /* ourstatus->kind = TARGET_WAITKIND_UNLOADED;
1476          does not exist yet. */
1477       break;
1478
1479     case EXCEPTION_DEBUG_EVENT:
1480       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1481                      (unsigned) current_event.dwProcessId,
1482                      (unsigned) current_event.dwThreadId,
1483                      "EXCEPTION_DEBUG_EVENT"));
1484       if (saw_create != 1)
1485         break;
1486       switch (handle_exception (ourstatus))
1487         {
1488         case 0:
1489           continue_status = DBG_EXCEPTION_NOT_HANDLED;
1490           break;
1491         case 1:
1492           retval = current_event.dwThreadId;
1493           break;
1494         case -1:
1495           last_sig = 1;
1496           continue_status = -1;
1497           break;
1498         }
1499       break;
1500
1501     case OUTPUT_DEBUG_STRING_EVENT:     /* message from the kernel */
1502       DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1503                      (unsigned) current_event.dwProcessId,
1504                      (unsigned) current_event.dwThreadId,
1505                      "OUTPUT_DEBUG_STRING_EVENT"));
1506       if (saw_create != 1)
1507         break;
1508       retval = handle_output_debug_string (ourstatus);
1509       break;
1510
1511     default:
1512       if (saw_create != 1)
1513         break;
1514       printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1515                          (DWORD) current_event.dwProcessId,
1516                          (DWORD) current_event.dwThreadId);
1517       printf_unfiltered ("                 unknown event code %ld\n",
1518                          current_event.dwDebugEventCode);
1519       break;
1520     }
1521
1522   if (!retval || saw_create != 1)
1523     {
1524       if (continue_status == -1)
1525         win32_resume (ptid, 0, 1);
1526       else
1527         CHECK (win32_continue (continue_status, -1));
1528     }
1529   else
1530     {
1531       inferior_ptid = pid_to_ptid (retval);
1532       current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
1533     }
1534
1535 out:
1536   return retval;
1537 }
1538
1539 /* Wait for interesting events to occur in the target process. */
1540 static ptid_t
1541 win32_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
1542 {
1543   int pid = PIDGET (ptid);
1544
1545   target_terminal_ours ();
1546
1547   /* We loop when we get a non-standard exception rather than return
1548      with a SPURIOUS because resume can try and step or modify things,
1549      which needs a current_thread->h.  But some of these exceptions mark
1550      the birth or death of threads, which mean that the current thread
1551      isn't necessarily what you think it is. */
1552
1553   while (1)
1554     {
1555       int retval = get_win32_debug_event (pid, ourstatus);
1556       if (retval)
1557         return pid_to_ptid (retval);
1558       else
1559         {
1560           int detach = 0;
1561
1562           if (deprecated_ui_loop_hook != NULL)
1563             detach = deprecated_ui_loop_hook (0);
1564
1565           if (detach)
1566             win32_kill_inferior ();
1567         }
1568     }
1569 }
1570
1571 static void
1572 do_initial_win32_stuff (DWORD pid)
1573 {
1574   extern int stop_after_trap;
1575   int i;
1576
1577   last_sig = TARGET_SIGNAL_0;
1578   event_count = 0;
1579   exception_count = 0;
1580   debug_registers_changed = 0;
1581   debug_registers_used = 0;
1582   for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1583     dr[i] = 0;
1584   current_event.dwProcessId = pid;
1585   memset (&current_event, 0, sizeof (current_event));
1586   push_target (&win32_ops);
1587   disable_breakpoints_in_shlibs (1);
1588   win32_clear_solib ();
1589   clear_proceed_status ();
1590   init_wait_for_inferior ();
1591
1592   terminal_init_inferior_with_pgrp (pid);
1593   target_terminal_inferior ();
1594
1595   while (1)
1596     {
1597       stop_after_trap = 1;
1598       wait_for_inferior ();
1599       if (stop_signal != TARGET_SIGNAL_TRAP)
1600         resume (0, stop_signal);
1601       else
1602         break;
1603     }
1604   stop_after_trap = 0;
1605   return;
1606 }
1607
1608 /* Since Windows XP, detaching from a process is supported by Windows.
1609    The following code tries loading the appropriate functions dynamically.
1610    If loading these functions succeeds use them to actually detach from
1611    the inferior process, otherwise behave as usual, pretending that
1612    detach has worked. */
1613 static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
1614 static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
1615
1616 static int
1617 has_detach_ability (void)
1618 {
1619   static HMODULE kernel32 = NULL;
1620
1621   if (!kernel32)
1622     kernel32 = LoadLibrary ("kernel32.dll");
1623   if (kernel32)
1624     {
1625       if (!DebugSetProcessKillOnExit)
1626         DebugSetProcessKillOnExit = GetProcAddress (kernel32,
1627                                                  "DebugSetProcessKillOnExit");
1628       if (!DebugActiveProcessStop)
1629         DebugActiveProcessStop = GetProcAddress (kernel32,
1630                                                  "DebugActiveProcessStop");
1631       if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
1632         return 1;
1633     }
1634   return 0;
1635 }
1636
1637 /* Try to set or remove a user privilege to the current process.  Return -1
1638    if that fails, the previous setting of that privilege otherwise.
1639
1640    This code is copied from the Cygwin source code and rearranged to allow
1641    dynamically loading of the needed symbols from advapi32 which is only
1642    available on NT/2K/XP. */
1643 static int
1644 set_process_privilege (const char *privilege, BOOL enable)
1645 {
1646   static HMODULE advapi32 = NULL;
1647   static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE);
1648   static BOOL WINAPI (*LookupPrivilegeValue)(LPCSTR, LPCSTR, PLUID);
1649   static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES,
1650                                               DWORD, PTOKEN_PRIVILEGES, PDWORD);
1651
1652   HANDLE token_hdl = NULL;
1653   LUID restore_priv;
1654   TOKEN_PRIVILEGES new_priv, orig_priv;
1655   int ret = -1;
1656   DWORD size;
1657
1658   if (GetVersion () >= 0x80000000)  /* No security availbale on 9x/Me */
1659     return 0;
1660
1661   if (!advapi32)
1662     {
1663       if (!(advapi32 = LoadLibrary ("advapi32.dll")))
1664         goto out;
1665       if (!OpenProcessToken)
1666         OpenProcessToken = GetProcAddress (advapi32, "OpenProcessToken");
1667       if (!LookupPrivilegeValue)
1668         LookupPrivilegeValue = GetProcAddress (advapi32,
1669                                                "LookupPrivilegeValueA");
1670       if (!AdjustTokenPrivileges)
1671         AdjustTokenPrivileges = GetProcAddress (advapi32,
1672                                                 "AdjustTokenPrivileges");
1673       if (!OpenProcessToken || !LookupPrivilegeValue || !AdjustTokenPrivileges)
1674         {
1675           advapi32 = NULL;
1676           goto out;
1677         }
1678     }
1679
1680   if (!OpenProcessToken (GetCurrentProcess (),
1681                          TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1682                          &token_hdl))
1683     goto out;
1684
1685   if (!LookupPrivilegeValue (NULL, privilege, &restore_priv))
1686     goto out;
1687
1688   new_priv.PrivilegeCount = 1;
1689   new_priv.Privileges[0].Luid = restore_priv;
1690   new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1691
1692   if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1693                               sizeof orig_priv, &orig_priv, &size))
1694     goto out;
1695 #if 0
1696   /* Disabled, otherwise every `attach' in an unprivileged user session
1697      would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1698      win32_attach(). */
1699   /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1700      be enabled. GetLastError () returns an correct error code, though. */
1701   if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1702     goto out;
1703 #endif
1704
1705   ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1706
1707 out:
1708   if (token_hdl)
1709     CloseHandle (token_hdl);
1710
1711   return ret;
1712 }
1713
1714 /* Attach to process PID, then initialize for debugging it.  */
1715 static void
1716 win32_attach (char *args, int from_tty)
1717 {
1718   BOOL ok;
1719   DWORD pid;
1720
1721   if (!args)
1722     error_no_arg (_("process-id to attach"));
1723
1724   if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1725     {
1726       printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1727       printf_unfiltered ("This can cause attach to fail on Windows NT/2K/XP\n");
1728     }
1729
1730   pid = strtoul (args, 0, 0);           /* Windows pid */
1731
1732   win32_init_thread_list ();
1733   ok = DebugActiveProcess (pid);
1734   saw_create = 0;
1735
1736   if (!ok)
1737     {
1738       /* Try fall back to Cygwin pid */
1739       pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1740
1741       if (pid > 0)
1742         ok = DebugActiveProcess (pid);
1743
1744       if (!ok)
1745         error (_("Can't attach to process."));
1746     }
1747
1748   if (has_detach_ability ())
1749     DebugSetProcessKillOnExit (FALSE);
1750
1751   attach_flag = 1;
1752
1753   if (from_tty)
1754     {
1755       char *exec_file = (char *) get_exec_file (0);
1756
1757       if (exec_file)
1758         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1759                            target_pid_to_str (pid_to_ptid (pid)));
1760       else
1761         printf_unfiltered ("Attaching to %s\n",
1762                            target_pid_to_str (pid_to_ptid (pid)));
1763
1764       gdb_flush (gdb_stdout);
1765     }
1766
1767   do_initial_win32_stuff (pid);
1768   target_terminal_ours ();
1769 }
1770
1771 static void
1772 win32_detach (char *args, int from_tty)
1773 {
1774   int detached = 1;
1775
1776   if (has_detach_ability ())
1777     {
1778       ptid_t ptid = {-1};
1779       win32_resume (ptid, 0, TARGET_SIGNAL_0);
1780
1781       if (!DebugActiveProcessStop (current_event.dwProcessId))
1782         {
1783           error (_("Can't detach process %lu (error %lu)"),
1784                  current_event.dwProcessId, GetLastError ());
1785           detached = 0;
1786         }
1787       DebugSetProcessKillOnExit (FALSE);
1788     }
1789   if (detached && from_tty)
1790     {
1791       char *exec_file = get_exec_file (0);
1792       if (exec_file == 0)
1793         exec_file = "";
1794       printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1795                          current_event.dwProcessId);
1796       gdb_flush (gdb_stdout);
1797     }
1798   inferior_ptid = null_ptid;
1799   unpush_target (&win32_ops);
1800 }
1801
1802 static char *
1803 win32_pid_to_exec_file (int pid)
1804 {
1805   /* Try to find the process path using the Cygwin internal process list
1806      pid isn't a valid pid, unfortunately.  Use current_event.dwProcessId
1807      instead.  */
1808   /* TODO: Also find native Windows processes using CW_GETPINFO_FULL.  */
1809
1810   static char path[MAX_PATH + 1];
1811   char *path_ptr = NULL;
1812   int cpid;
1813   struct external_pinfo *pinfo;
1814
1815   cygwin_internal (CW_LOCK_PINFO, 1000);
1816   for (cpid = 0;
1817        (pinfo = (struct external_pinfo *)
1818         cygwin_internal (CW_GETPINFO, cpid | CW_NEXTPID));
1819        cpid = pinfo->pid)
1820     {
1821       if (pinfo->dwProcessId == current_event.dwProcessId) /* Got it */
1822        {
1823          cygwin_conv_to_full_posix_path (pinfo->progname, path);
1824          path_ptr = path;
1825          break;
1826        }
1827     }
1828   cygwin_internal (CW_UNLOCK_PINFO);
1829   return path_ptr;
1830 }
1831
1832 /* Print status information about what we're accessing.  */
1833
1834 static void
1835 win32_files_info (struct target_ops *ignore)
1836 {
1837   printf_unfiltered ("\tUsing the running image of %s %s.\n",
1838       attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
1839 }
1840
1841 static void
1842 win32_open (char *arg, int from_tty)
1843 {
1844   error (_("Use the \"run\" command to start a Unix child process."));
1845 }
1846
1847 /* Start an inferior win32 child process and sets inferior_ptid to its pid.
1848    EXEC_FILE is the file to run.
1849    ALLARGS is a string containing the arguments to the program.
1850    ENV is the environment vector to pass.  Errors reported with error().  */
1851
1852 static void
1853 win32_create_inferior (char *exec_file, char *allargs, char **in_env,
1854                        int from_tty)
1855 {
1856   STARTUPINFO si;
1857   PROCESS_INFORMATION pi;
1858   BOOL ret;
1859   DWORD flags;
1860   char *args;
1861   char real_path[MAXPATHLEN];
1862   char *toexec;
1863   char shell[MAX_PATH + 1]; /* Path to shell */
1864   const char *sh;
1865   int tty;
1866   int ostdin, ostdout, ostderr;
1867   const char *inferior_io_terminal = get_inferior_io_terminal ();
1868
1869   if (!exec_file)
1870     error (_("No executable specified, use `target exec'."));
1871
1872   memset (&si, 0, sizeof (si));
1873   si.cb = sizeof (si);
1874
1875   if (!useshell)
1876     {
1877       flags = DEBUG_ONLY_THIS_PROCESS;
1878       cygwin_conv_to_win32_path (exec_file, real_path);
1879       toexec = real_path;
1880     }
1881   else
1882     {
1883       char *newallargs;
1884       sh = getenv ("SHELL");
1885       if (!sh)
1886         sh = "/bin/sh";
1887       cygwin_conv_to_win32_path (sh, shell);
1888       newallargs = alloca (sizeof (" -c 'exec  '") + strlen (exec_file)
1889                            + strlen (allargs) + 2);
1890       sprintf (newallargs, " -c 'exec %s %s'", exec_file, allargs);
1891       allargs = newallargs;
1892       toexec = shell;
1893       flags = DEBUG_PROCESS;
1894     }
1895
1896   if (new_group)
1897     flags |= CREATE_NEW_PROCESS_GROUP;
1898
1899   if (new_console)
1900     flags |= CREATE_NEW_CONSOLE;
1901
1902   attach_flag = 0;
1903
1904   args = alloca (strlen (toexec) + strlen (allargs) + 2);
1905   strcpy (args, toexec);
1906   strcat (args, " ");
1907   strcat (args, allargs);
1908
1909   /* Prepare the environment vars for CreateProcess.  */
1910   cygwin_internal (CW_SYNC_WINENV);
1911
1912   if (!inferior_io_terminal)
1913     tty = ostdin = ostdout = ostderr = -1;
1914   else
1915     {
1916       tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
1917       if (tty < 0)
1918         {
1919           print_sys_errmsg (inferior_io_terminal, errno);
1920           ostdin = ostdout = ostderr = -1;
1921         }
1922       else
1923         {
1924           ostdin = dup (0);
1925           ostdout = dup (1);
1926           ostderr = dup (2);
1927           dup2 (tty, 0);
1928           dup2 (tty, 1);
1929           dup2 (tty, 2);
1930         }
1931     }
1932
1933   win32_init_thread_list ();
1934   ret = CreateProcess (0,
1935                        args,    /* command line */
1936                        NULL,    /* Security */
1937                        NULL,    /* thread */
1938                        TRUE,    /* inherit handles */
1939                        flags,   /* start flags */
1940                        NULL,    /* environment */
1941                        NULL,    /* current directory */
1942                        &si,
1943                        &pi);
1944   if (tty >= 0)
1945     {
1946       close (tty);
1947       dup2 (ostdin, 0);
1948       dup2 (ostdout, 1);
1949       dup2 (ostderr, 2);
1950       close (ostdin);
1951       close (ostdout);
1952       close (ostderr);
1953     }
1954
1955   if (!ret)
1956     error (_("Error creating process %s, (error %d)."),
1957            exec_file, (unsigned) GetLastError ());
1958
1959   CloseHandle (pi.hThread);
1960   CloseHandle (pi.hProcess);
1961
1962   if (useshell && shell[0] != '\0')
1963     saw_create = -1;
1964   else
1965     saw_create = 0;
1966
1967   do_initial_win32_stuff (pi.dwProcessId);
1968
1969   /* win32_continue (DBG_CONTINUE, -1); */
1970 }
1971
1972 static void
1973 win32_mourn_inferior (void)
1974 {
1975   (void) win32_continue (DBG_CONTINUE, -1);
1976   i386_cleanup_dregs();
1977   unpush_target (&win32_ops);
1978   generic_mourn_inferior ();
1979 }
1980
1981 /* Send a SIGINT to the process group.  This acts just like the user typed a
1982    ^C on the controlling terminal. */
1983
1984 static void
1985 win32_stop (void)
1986 {
1987   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1988   CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1989   registers_changed ();         /* refresh register state */
1990 }
1991
1992 static int
1993 win32_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
1994                    int write, struct mem_attrib *mem,
1995                    struct target_ops *target)
1996 {
1997   DWORD done = 0;
1998   if (write)
1999     {
2000       DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
2001                   len, (DWORD) memaddr));
2002       if (!WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
2003                                len, &done))
2004         done = 0;
2005       FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
2006     }
2007   else
2008     {
2009       DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
2010                   len, (DWORD) memaddr));
2011       if (!ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our,
2012                               len, &done))
2013         done = 0;
2014     }
2015   return done;
2016 }
2017
2018 static void
2019 win32_kill_inferior (void)
2020 {
2021   CHECK (TerminateProcess (current_process_handle, 0));
2022
2023   for (;;)
2024     {
2025       if (!win32_continue (DBG_CONTINUE, -1))
2026         break;
2027       if (!WaitForDebugEvent (&current_event, INFINITE))
2028         break;
2029       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2030         break;
2031     }
2032
2033   CHECK (CloseHandle (current_process_handle));
2034
2035   /* this may fail in an attached process so don't check. */
2036   if (current_thread && current_thread->h)
2037     (void) CloseHandle (current_thread->h);
2038   target_mourn_inferior ();     /* or just win32_mourn_inferior? */
2039 }
2040
2041 static void
2042 win32_prepare_to_store (void)
2043 {
2044   /* Do nothing, since we can store individual regs */
2045 }
2046
2047 static int
2048 win32_can_run (void)
2049 {
2050   return 1;
2051 }
2052
2053 static void
2054 win32_close (int x)
2055 {
2056   DEBUG_EVENTS (("gdb: win32_close, inferior_ptid=%d\n",
2057                 PIDGET (inferior_ptid)));
2058 }
2059
2060 /* Convert pid to printable format. */
2061 static char *
2062 cygwin_pid_to_str (ptid_t ptid)
2063 {
2064   static char buf[80];
2065   int pid = PIDGET (ptid);
2066
2067   if ((DWORD) pid == current_event.dwProcessId)
2068     sprintf (buf, "process %d", pid);
2069   else
2070     sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
2071   return buf;
2072 }
2073
2074 typedef struct
2075 {
2076   struct target_ops *target;
2077   bfd_vma addr;
2078 } map_code_section_args;
2079
2080 static void
2081 map_single_dll_code_section (bfd *abfd, asection *sect, void *obj)
2082 {
2083   int old;
2084   int update_coreops;
2085   struct section_table *new_target_sect_ptr;
2086
2087   map_code_section_args *args = (map_code_section_args *) obj;
2088   struct target_ops *target = args->target;
2089   if (sect->flags & SEC_CODE)
2090     {
2091       update_coreops = core_ops.to_sections == target->to_sections;
2092
2093       if (target->to_sections)
2094         {
2095           old = target->to_sections_end - target->to_sections;
2096           target->to_sections = (struct section_table *)
2097             xrealloc ((char *) target->to_sections,
2098                       (sizeof (struct section_table)) * (1 + old));
2099         }
2100       else
2101         {
2102           old = 0;
2103           target->to_sections = (struct section_table *)
2104             xmalloc ((sizeof (struct section_table)));
2105         }
2106       target->to_sections_end = target->to_sections + (1 + old);
2107
2108       /* Update the to_sections field in the core_ops structure
2109          if needed.  */
2110       if (update_coreops)
2111         {
2112           core_ops.to_sections = target->to_sections;
2113           core_ops.to_sections_end = target->to_sections_end;
2114         }
2115       new_target_sect_ptr = target->to_sections + old;
2116       new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
2117       new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
2118         bfd_section_size (abfd, sect);;
2119       new_target_sect_ptr->the_bfd_section = sect;
2120       new_target_sect_ptr->bfd = abfd;
2121     }
2122 }
2123
2124 static int
2125 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
2126 {
2127   bfd *dll_bfd;
2128   map_code_section_args map_args;
2129   asection *lowest_sect;
2130   char *name;
2131   if (dll_name == NULL || target == NULL)
2132     return 0;
2133   name = xstrdup (dll_name);
2134   dll_bfd = bfd_openr (name, "pei-i386");
2135   if (dll_bfd == NULL)
2136     return 0;
2137
2138   if (bfd_check_format (dll_bfd, bfd_object))
2139     {
2140       lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
2141       if (lowest_sect == NULL)
2142         return 0;
2143       map_args.target = target;
2144       map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
2145
2146       bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
2147     }
2148
2149   return 1;
2150 }
2151
2152 static void
2153 core_section_load_dll_symbols (bfd *abfd, asection *sect, void *obj)
2154 {
2155   struct target_ops *target = (struct target_ops *) obj;
2156
2157   DWORD base_addr;
2158
2159   int dll_name_size;
2160   struct win32_pstatus *pstatus;
2161   struct so_list *so;
2162   char *dll_name;
2163   char *buf = NULL;
2164   char *p;
2165   struct objfile *objfile;
2166   const char *dll_basename;
2167
2168   if (strncmp (sect->name, ".module", 7) != 0)
2169     return;
2170
2171   buf = (char *) xmalloc (bfd_get_section_size (sect) + 1);
2172   if (!buf)
2173     {
2174       printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2175       goto out;
2176     }
2177   if (!bfd_get_section_contents (abfd, sect, buf, 0, bfd_get_section_size (sect)))
2178     goto out;
2179
2180   pstatus = (struct win32_pstatus *) buf;
2181
2182   memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
2183   dll_name_size = pstatus->data.module_info.module_name_size;
2184   if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > bfd_get_section_size (sect))
2185       goto out;
2186
2187   dll_name = pstatus->data.module_info.module_name;
2188
2189   if (!(dll_basename = strrchr (dll_name, '/')))
2190     dll_basename = dll_name;
2191   else
2192     dll_basename++;
2193
2194   ALL_OBJFILES (objfile)
2195   {
2196     char *objfile_basename = strrchr (objfile->name, '/');
2197
2198     if (objfile_basename &&
2199         strcasecmp (dll_basename, objfile_basename + 1) == 0)
2200       goto out;
2201   }
2202
2203   base_addr += 0x1000;
2204   dll_name = register_loaded_dll (dll_name, base_addr, 1);
2205
2206   if (!dll_code_sections_add (dll_name, (DWORD) base_addr, target))
2207     printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
2208
2209 out:
2210   if (buf)
2211     xfree (buf);
2212   return;
2213 }
2214
2215 static struct so_list *
2216 win32_current_sos (void)
2217 {
2218   struct so_list *sop;
2219   struct so_list *start = NULL;
2220   struct so_list *last = NULL;
2221
2222   if (!solib_start.next && core_bfd)
2223     {
2224       win32_clear_solib ();
2225       bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols,
2226                              &win32_ops);
2227     }
2228
2229   for (sop = solib_start.next; sop; sop = sop->next)
2230     {
2231       struct so_list *new = XZALLOC (struct so_list);
2232       strcpy (new->so_name, sop->so_name);
2233       strcpy (new->so_original_name, sop->so_original_name);
2234       if (!start)
2235         last = start = new;
2236       else
2237         {
2238           last->next = new;
2239           last = new;
2240         }
2241     }
2242
2243   return start;
2244 }
2245
2246 static void
2247 fetch_elf_core_registers (struct regcache *regcache,
2248                           char *core_reg_sect,
2249                           unsigned core_reg_size,
2250                           int which,
2251                           CORE_ADDR reg_addr)
2252 {
2253   int r;
2254   if (core_reg_size < sizeof (CONTEXT))
2255     {
2256       error (_("Core file register section too small (%u bytes)."), core_reg_size);
2257       return;
2258     }
2259   for (r = 0; r < NUM_REGS; r++)
2260     regcache_raw_supply (regcache, r, core_reg_sect + mappings[r]);
2261 }
2262
2263 static int
2264 open_symbol_file_object (void *from_ttyp)
2265 {
2266   return 0;
2267 }
2268
2269 static int
2270 in_dynsym_resolve_code (CORE_ADDR pc)
2271 {
2272   return 0;
2273 }
2274
2275 static void
2276 init_win32_ops (void)
2277 {
2278   win32_ops.to_shortname = "child";
2279   win32_ops.to_longname = "Win32 child process";
2280   win32_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2281   win32_ops.to_open = win32_open;
2282   win32_ops.to_close = win32_close;
2283   win32_ops.to_attach = win32_attach;
2284   win32_ops.to_detach = win32_detach;
2285   win32_ops.to_resume = win32_resume;
2286   win32_ops.to_wait = win32_wait;
2287   win32_ops.to_fetch_registers = win32_fetch_inferior_registers;
2288   win32_ops.to_store_registers = win32_store_inferior_registers;
2289   win32_ops.to_prepare_to_store = win32_prepare_to_store;
2290   win32_ops.deprecated_xfer_memory = win32_xfer_memory;
2291   win32_ops.to_files_info = win32_files_info;
2292   win32_ops.to_insert_breakpoint = memory_insert_breakpoint;
2293   win32_ops.to_remove_breakpoint = memory_remove_breakpoint;
2294   win32_ops.to_terminal_init = terminal_init_inferior;
2295   win32_ops.to_terminal_inferior = terminal_inferior;
2296   win32_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2297   win32_ops.to_terminal_ours = terminal_ours;
2298   win32_ops.to_terminal_save_ours = terminal_save_ours;
2299   win32_ops.to_terminal_info = child_terminal_info;
2300   win32_ops.to_kill = win32_kill_inferior;
2301   win32_ops.to_create_inferior = win32_create_inferior;
2302   win32_ops.to_mourn_inferior = win32_mourn_inferior;
2303   win32_ops.to_can_run = win32_can_run;
2304   win32_ops.to_thread_alive = win32_win32_thread_alive;
2305   win32_ops.to_pid_to_str = cygwin_pid_to_str;
2306   win32_ops.to_stop = win32_stop;
2307   win32_ops.to_stratum = process_stratum;
2308   win32_ops.to_has_all_memory = 1;
2309   win32_ops.to_has_memory = 1;
2310   win32_ops.to_has_stack = 1;
2311   win32_ops.to_has_registers = 1;
2312   win32_ops.to_has_execution = 1;
2313   win32_ops.to_magic = OPS_MAGIC;
2314   win32_ops.to_pid_to_exec_file = win32_pid_to_exec_file;
2315
2316   win32_so_ops.relocate_section_addresses = win32_relocate_section_addresses;
2317   win32_so_ops.free_so = win32_free_so;
2318   win32_so_ops.clear_solib = win32_clear_solib;
2319   win32_so_ops.solib_create_inferior_hook = win32_solib_create_inferior_hook;
2320   win32_so_ops.special_symbol_handling = win32_special_symbol_handling;
2321   win32_so_ops.current_sos = win32_current_sos;
2322   win32_so_ops.open_symbol_file_object = open_symbol_file_object;
2323   win32_so_ops.in_dynsym_resolve_code = in_dynsym_resolve_code;
2324
2325   /* FIXME: Don't do this here.  *_gdbarch_init() should set so_ops. */
2326   current_target_so_ops = &win32_so_ops;
2327 }
2328
2329 static void
2330 set_win32_aliases (char *argv0)
2331 {
2332   add_info_alias ("dll", "sharedlibrary", 1);
2333 }
2334
2335 void
2336 _initialize_win32_nat (void)
2337 {
2338   struct cmd_list_element *c;
2339
2340   init_win32_ops ();
2341
2342   c = add_com ("dll-symbols", class_files, dll_symbol_command,
2343                _("Load dll library symbols from FILE."));
2344   set_cmd_completer (c, filename_completer);
2345
2346   add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
2347
2348   add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2349 Set use of shell to start subprocess."), _("\
2350 Show use of shell to start subprocess."), NULL,
2351                            NULL,
2352                            NULL, /* FIXME: i18n: */
2353                            &setlist, &showlist);
2354
2355   add_setshow_boolean_cmd ("cygwin-exceptions", class_support, &cygwin_exceptions, _("\
2356 Break when an exception is detected in the Cygwin DLL itself."), _("\
2357 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2358                            NULL,
2359                            NULL, /* FIXME: i18n: */
2360                            &setlist, &showlist);
2361
2362   add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2363 Set creation of new console when creating child process."), _("\
2364 Show creation of new console when creating child process."), NULL,
2365                            NULL,
2366                            NULL, /* FIXME: i18n: */
2367                            &setlist, &showlist);
2368
2369   add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2370 Set creation of new group when creating child process."), _("\
2371 Show creation of new group when creating child process."), NULL,
2372                            NULL,
2373                            NULL, /* FIXME: i18n: */
2374                            &setlist, &showlist);
2375
2376   add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2377 Set whether to display execution in child process."), _("\
2378 Show whether to display execution in child process."), NULL,
2379                            NULL,
2380                            NULL, /* FIXME: i18n: */
2381                            &setlist, &showlist);
2382
2383   add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2384 Set whether to display kernel events in child process."), _("\
2385 Show whether to display kernel events in child process."), NULL,
2386                            NULL,
2387                            NULL, /* FIXME: i18n: */
2388                            &setlist, &showlist);
2389
2390   add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2391 Set whether to display memory accesses in child process."), _("\
2392 Show whether to display memory accesses in child process."), NULL,
2393                            NULL,
2394                            NULL, /* FIXME: i18n: */
2395                            &setlist, &showlist);
2396
2397   add_setshow_boolean_cmd ("debugexceptions", class_support,
2398                            &debug_exceptions, _("\
2399 Set whether to display kernel exceptions in child process."), _("\
2400 Show whether to display kernel exceptions in child process."), NULL,
2401                            NULL,
2402                            NULL, /* FIXME: i18n: */
2403                            &setlist, &showlist);
2404
2405   add_prefix_cmd ("w32", class_info, info_w32_command,
2406                   _("Print information specific to Win32 debugging."),
2407                   &info_w32_cmdlist, "info w32 ", 0, &infolist);
2408
2409   add_cmd ("selector", class_info, display_selectors,
2410            _("Display selectors infos."),
2411            &info_w32_cmdlist);
2412   add_target (&win32_ops);
2413   deprecated_init_ui_hook = set_win32_aliases;
2414 }
2415
2416 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
2417
2418 /* Pass the address ADDR to the inferior in the I'th debug register.
2419    Here we just store the address in dr array, the registers will be
2420    actually set up when win32_continue is called.  */
2421 void
2422 cygwin_set_dr (int i, CORE_ADDR addr)
2423 {
2424   if (i < 0 || i > 3)
2425     internal_error (__FILE__, __LINE__,
2426                     _("Invalid register %d in cygwin_set_dr.\n"), i);
2427   dr[i] = (unsigned) addr;
2428   debug_registers_changed = 1;
2429   debug_registers_used = 1;
2430 }
2431
2432 /* Pass the value VAL to the inferior in the DR7 debug control
2433    register.  Here we just store the address in D_REGS, the watchpoint
2434    will be actually set up in win32_wait.  */
2435 void
2436 cygwin_set_dr7 (unsigned val)
2437 {
2438   dr[7] = val;
2439   debug_registers_changed = 1;
2440   debug_registers_used = 1;
2441 }
2442
2443 /* Get the value of the DR6 debug status register from the inferior.
2444    Here we just return the value stored in dr[6]
2445    by the last call to thread_rec for current_event.dwThreadId id.  */
2446 unsigned
2447 cygwin_get_dr6 (void)
2448 {
2449   return dr[6];
2450 }
2451
2452 /* Determine if the thread referenced by "pid" is alive
2453    by "polling" it.  If WaitForSingleObject returns WAIT_OBJECT_0
2454    it means that the pid has died.  Otherwise it is assumed to be alive. */
2455 static int
2456 win32_win32_thread_alive (ptid_t ptid)
2457 {
2458   int pid = PIDGET (ptid);
2459
2460   return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
2461     FALSE : TRUE;
2462 }
2463
2464 static struct core_fns win32_elf_core_fns =
2465 {
2466   bfd_target_elf_flavour,
2467   default_check_format,
2468   default_core_sniffer,
2469   fetch_elf_core_registers,
2470   NULL
2471 };
2472
2473 void
2474 _initialize_core_win32 (void)
2475 {
2476   deprecated_add_core_fns (&win32_elf_core_fns);
2477 }
2478
2479 void
2480 _initialize_check_for_gdb_ini (void)
2481 {
2482   char *homedir;
2483   if (inhibit_gdbinit)
2484     return;
2485
2486   homedir = getenv ("HOME");
2487   if (homedir)
2488     {
2489       char *p;
2490       char *oldini = (char *) alloca (strlen (homedir) +
2491                                       sizeof ("/gdb.ini"));
2492       strcpy (oldini, homedir);
2493       p = strchr (oldini, '\0');
2494       if (p > oldini && p[-1] != '/')
2495         *p++ = '/';
2496       strcpy (p, "gdb.ini");
2497       if (access (oldini, 0) == 0)
2498         {
2499           int len = strlen (oldini);
2500           char *newini = alloca (len + 1);
2501           sprintf (newini, "%.*s.gdbinit",
2502             (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2503           warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2504         }
2505     }
2506 }