* win32-nat.c (win32_wait): Reset terminal pgrp to GDB.
[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 (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 (current_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 (current_regcache, r, (char *) &l);
394     }
395   else if (r >= 0)
396     regcache_raw_supply (current_regcache, r, context_offset);
397   else
398     {
399       for (r = 0; r < NUM_REGS; r++)
400         do_win32_fetch_inferior_registers (r);
401     }
402
403 #undef I387_ST0_REGNUM
404 }
405
406 static void
407 win32_fetch_inferior_registers (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 (r);
414 }
415
416 static void
417 do_win32_store_inferior_registers (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 (current_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 (r);
428     }
429 }
430
431 /* Store a new register value into the current thread context */
432 static void
433 win32_store_inferior_registers (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 (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 (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       delete_command (NULL, 0);
1779       win32_continue (DBG_CONTINUE, -1);
1780       if (!DebugActiveProcessStop (current_event.dwProcessId))
1781         {
1782           error (_("Can't detach process %lu (error %lu)"),
1783                  current_event.dwProcessId, GetLastError ());
1784           detached = 0;
1785         }
1786       DebugSetProcessKillOnExit (FALSE);
1787     }
1788   if (detached && from_tty)
1789     {
1790       char *exec_file = get_exec_file (0);
1791       if (exec_file == 0)
1792         exec_file = "";
1793       printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1794                          current_event.dwProcessId);
1795       gdb_flush (gdb_stdout);
1796     }
1797   inferior_ptid = null_ptid;
1798   unpush_target (&win32_ops);
1799 }
1800
1801 static char *
1802 win32_pid_to_exec_file (int pid)
1803 {
1804   /* Try to find the process path using the Cygwin internal process list
1805      pid isn't a valid pid, unfortunately.  Use current_event.dwProcessId
1806      instead.  */
1807   /* TODO: Also find native Windows processes using CW_GETPINFO_FULL.  */
1808
1809   static char path[MAX_PATH + 1];
1810   char *path_ptr = NULL;
1811   int cpid;
1812   struct external_pinfo *pinfo;
1813
1814   cygwin_internal (CW_LOCK_PINFO, 1000);
1815   for (cpid = 0;
1816        (pinfo = (struct external_pinfo *)
1817         cygwin_internal (CW_GETPINFO, cpid | CW_NEXTPID));
1818        cpid = pinfo->pid)
1819     {
1820       if (pinfo->dwProcessId == current_event.dwProcessId) /* Got it */
1821        {
1822          cygwin_conv_to_full_posix_path (pinfo->progname, path);
1823          path_ptr = path;
1824          break;
1825        }
1826     }
1827   cygwin_internal (CW_UNLOCK_PINFO);
1828   return path_ptr;
1829 }
1830
1831 /* Print status information about what we're accessing.  */
1832
1833 static void
1834 win32_files_info (struct target_ops *ignore)
1835 {
1836   printf_unfiltered ("\tUsing the running image of %s %s.\n",
1837       attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
1838 }
1839
1840 static void
1841 win32_open (char *arg, int from_tty)
1842 {
1843   error (_("Use the \"run\" command to start a Unix child process."));
1844 }
1845
1846 /* Start an inferior win32 child process and sets inferior_ptid to its pid.
1847    EXEC_FILE is the file to run.
1848    ALLARGS is a string containing the arguments to the program.
1849    ENV is the environment vector to pass.  Errors reported with error().  */
1850
1851 static void
1852 win32_create_inferior (char *exec_file, char *allargs, char **in_env,
1853                        int from_tty)
1854 {
1855   STARTUPINFO si;
1856   PROCESS_INFORMATION pi;
1857   BOOL ret;
1858   DWORD flags;
1859   char *args;
1860   char real_path[MAXPATHLEN];
1861   char *toexec;
1862   char shell[MAX_PATH + 1]; /* Path to shell */
1863   const char *sh;
1864   int tty;
1865   int ostdin, ostdout, ostderr;
1866   const char *inferior_io_terminal = get_inferior_io_terminal ();
1867
1868   if (!exec_file)
1869     error (_("No executable specified, use `target exec'."));
1870
1871   memset (&si, 0, sizeof (si));
1872   si.cb = sizeof (si);
1873
1874   if (!useshell)
1875     {
1876       flags = DEBUG_ONLY_THIS_PROCESS;
1877       cygwin_conv_to_win32_path (exec_file, real_path);
1878       toexec = real_path;
1879     }
1880   else
1881     {
1882       char *newallargs;
1883       sh = getenv ("SHELL");
1884       if (!sh)
1885         sh = "/bin/sh";
1886       cygwin_conv_to_win32_path (sh, shell);
1887       newallargs = alloca (sizeof (" -c 'exec  '") + strlen (exec_file)
1888                            + strlen (allargs) + 2);
1889       sprintf (newallargs, " -c 'exec %s %s'", exec_file, allargs);
1890       allargs = newallargs;
1891       toexec = shell;
1892       flags = DEBUG_PROCESS;
1893     }
1894
1895   if (new_group)
1896     flags |= CREATE_NEW_PROCESS_GROUP;
1897
1898   if (new_console)
1899     flags |= CREATE_NEW_CONSOLE;
1900
1901   attach_flag = 0;
1902
1903   args = alloca (strlen (toexec) + strlen (allargs) + 2);
1904   strcpy (args, toexec);
1905   strcat (args, " ");
1906   strcat (args, allargs);
1907
1908   /* Prepare the environment vars for CreateProcess.  */
1909   cygwin_internal (CW_SYNC_WINENV);
1910
1911   if (!inferior_io_terminal)
1912     tty = ostdin = ostdout = ostderr = -1;
1913   else
1914     {
1915       tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
1916       if (tty < 0)
1917         {
1918           print_sys_errmsg (inferior_io_terminal, errno);
1919           ostdin = ostdout = ostderr = -1;
1920         }
1921       else
1922         {
1923           ostdin = dup (0);
1924           ostdout = dup (1);
1925           ostderr = dup (2);
1926           dup2 (tty, 0);
1927           dup2 (tty, 1);
1928           dup2 (tty, 2);
1929         }
1930     }
1931
1932   win32_init_thread_list ();
1933   ret = CreateProcess (0,
1934                        args,    /* command line */
1935                        NULL,    /* Security */
1936                        NULL,    /* thread */
1937                        TRUE,    /* inherit handles */
1938                        flags,   /* start flags */
1939                        NULL,    /* environment */
1940                        NULL,    /* current directory */
1941                        &si,
1942                        &pi);
1943   if (tty >= 0)
1944     {
1945       close (tty);
1946       dup2 (ostdin, 0);
1947       dup2 (ostdout, 1);
1948       dup2 (ostderr, 2);
1949       close (ostdin);
1950       close (ostdout);
1951       close (ostderr);
1952     }
1953
1954   if (!ret)
1955     error (_("Error creating process %s, (error %d)."),
1956            exec_file, (unsigned) GetLastError ());
1957
1958   CloseHandle (pi.hThread);
1959   CloseHandle (pi.hProcess);
1960
1961   if (useshell && shell[0] != '\0')
1962     saw_create = -1;
1963   else
1964     saw_create = 0;
1965
1966   do_initial_win32_stuff (pi.dwProcessId);
1967
1968   /* win32_continue (DBG_CONTINUE, -1); */
1969 }
1970
1971 static void
1972 win32_mourn_inferior (void)
1973 {
1974   (void) win32_continue (DBG_CONTINUE, -1);
1975   i386_cleanup_dregs();
1976   unpush_target (&win32_ops);
1977   generic_mourn_inferior ();
1978 }
1979
1980 /* Send a SIGINT to the process group.  This acts just like the user typed a
1981    ^C on the controlling terminal. */
1982
1983 static void
1984 win32_stop (void)
1985 {
1986   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1987   CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1988   registers_changed ();         /* refresh register state */
1989 }
1990
1991 static int
1992 win32_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
1993                    int write, struct mem_attrib *mem,
1994                    struct target_ops *target)
1995 {
1996   DWORD done = 0;
1997   if (write)
1998     {
1999       DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
2000                   len, (DWORD) memaddr));
2001       if (!WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
2002                                len, &done))
2003         done = 0;
2004       FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
2005     }
2006   else
2007     {
2008       DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
2009                   len, (DWORD) memaddr));
2010       if (!ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our,
2011                               len, &done))
2012         done = 0;
2013     }
2014   return done;
2015 }
2016
2017 static void
2018 win32_kill_inferior (void)
2019 {
2020   CHECK (TerminateProcess (current_process_handle, 0));
2021
2022   for (;;)
2023     {
2024       if (!win32_continue (DBG_CONTINUE, -1))
2025         break;
2026       if (!WaitForDebugEvent (&current_event, INFINITE))
2027         break;
2028       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2029         break;
2030     }
2031
2032   CHECK (CloseHandle (current_process_handle));
2033
2034   /* this may fail in an attached process so don't check. */
2035   if (current_thread && current_thread->h)
2036     (void) CloseHandle (current_thread->h);
2037   target_mourn_inferior ();     /* or just win32_mourn_inferior? */
2038 }
2039
2040 static void
2041 win32_prepare_to_store (void)
2042 {
2043   /* Do nothing, since we can store individual regs */
2044 }
2045
2046 static int
2047 win32_can_run (void)
2048 {
2049   return 1;
2050 }
2051
2052 static void
2053 win32_close (int x)
2054 {
2055   DEBUG_EVENTS (("gdb: win32_close, inferior_ptid=%d\n",
2056                 PIDGET (inferior_ptid)));
2057 }
2058
2059 /* Convert pid to printable format. */
2060 static char *
2061 cygwin_pid_to_str (ptid_t ptid)
2062 {
2063   static char buf[80];
2064   int pid = PIDGET (ptid);
2065
2066   if ((DWORD) pid == current_event.dwProcessId)
2067     sprintf (buf, "process %d", pid);
2068   else
2069     sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
2070   return buf;
2071 }
2072
2073 typedef struct
2074 {
2075   struct target_ops *target;
2076   bfd_vma addr;
2077 } map_code_section_args;
2078
2079 static void
2080 map_single_dll_code_section (bfd *abfd, asection *sect, void *obj)
2081 {
2082   int old;
2083   int update_coreops;
2084   struct section_table *new_target_sect_ptr;
2085
2086   map_code_section_args *args = (map_code_section_args *) obj;
2087   struct target_ops *target = args->target;
2088   if (sect->flags & SEC_CODE)
2089     {
2090       update_coreops = core_ops.to_sections == target->to_sections;
2091
2092       if (target->to_sections)
2093         {
2094           old = target->to_sections_end - target->to_sections;
2095           target->to_sections = (struct section_table *)
2096             xrealloc ((char *) target->to_sections,
2097                       (sizeof (struct section_table)) * (1 + old));
2098         }
2099       else
2100         {
2101           old = 0;
2102           target->to_sections = (struct section_table *)
2103             xmalloc ((sizeof (struct section_table)));
2104         }
2105       target->to_sections_end = target->to_sections + (1 + old);
2106
2107       /* Update the to_sections field in the core_ops structure
2108          if needed.  */
2109       if (update_coreops)
2110         {
2111           core_ops.to_sections = target->to_sections;
2112           core_ops.to_sections_end = target->to_sections_end;
2113         }
2114       new_target_sect_ptr = target->to_sections + old;
2115       new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
2116       new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
2117         bfd_section_size (abfd, sect);;
2118       new_target_sect_ptr->the_bfd_section = sect;
2119       new_target_sect_ptr->bfd = abfd;
2120     }
2121 }
2122
2123 static int
2124 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
2125 {
2126   bfd *dll_bfd;
2127   map_code_section_args map_args;
2128   asection *lowest_sect;
2129   char *name;
2130   if (dll_name == NULL || target == NULL)
2131     return 0;
2132   name = xstrdup (dll_name);
2133   dll_bfd = bfd_openr (name, "pei-i386");
2134   if (dll_bfd == NULL)
2135     return 0;
2136
2137   if (bfd_check_format (dll_bfd, bfd_object))
2138     {
2139       lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
2140       if (lowest_sect == NULL)
2141         return 0;
2142       map_args.target = target;
2143       map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
2144
2145       bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
2146     }
2147
2148   return 1;
2149 }
2150
2151 static void
2152 core_section_load_dll_symbols (bfd *abfd, asection *sect, void *obj)
2153 {
2154   struct target_ops *target = (struct target_ops *) obj;
2155
2156   DWORD base_addr;
2157
2158   int dll_name_size;
2159   struct win32_pstatus *pstatus;
2160   struct so_list *so;
2161   char *dll_name;
2162   char *buf = NULL;
2163   char *p;
2164   struct objfile *objfile;
2165   const char *dll_basename;
2166
2167   if (strncmp (sect->name, ".module", 7) != 0)
2168     return;
2169
2170   buf = (char *) xmalloc (bfd_get_section_size (sect) + 1);
2171   if (!buf)
2172     {
2173       printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2174       goto out;
2175     }
2176   if (!bfd_get_section_contents (abfd, sect, buf, 0, bfd_get_section_size (sect)))
2177     goto out;
2178
2179   pstatus = (struct win32_pstatus *) buf;
2180
2181   memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
2182   dll_name_size = pstatus->data.module_info.module_name_size;
2183   if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > bfd_get_section_size (sect))
2184       goto out;
2185
2186   dll_name = pstatus->data.module_info.module_name;
2187
2188   if (!(dll_basename = strrchr (dll_name, '/')))
2189     dll_basename = dll_name;
2190   else
2191     dll_basename++;
2192
2193   ALL_OBJFILES (objfile)
2194   {
2195     char *objfile_basename = strrchr (objfile->name, '/');
2196
2197     if (objfile_basename &&
2198         strcasecmp (dll_basename, objfile_basename + 1) == 0)
2199       goto out;
2200   }
2201
2202   base_addr += 0x1000;
2203   dll_name = register_loaded_dll (dll_name, base_addr, 1);
2204
2205   if (!dll_code_sections_add (dll_name, (DWORD) base_addr, target))
2206     printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
2207
2208 out:
2209   if (buf)
2210     xfree (buf);
2211   return;
2212 }
2213
2214 static struct so_list *
2215 win32_current_sos (void)
2216 {
2217   struct so_list *sop;
2218   struct so_list *start = NULL;
2219   struct so_list *last = NULL;
2220
2221   if (!solib_start.next && core_bfd)
2222     {
2223       win32_clear_solib ();
2224       bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols,
2225                              &win32_ops);
2226     }
2227
2228   for (sop = solib_start.next; sop; sop = sop->next)
2229     {
2230       struct so_list *new = XZALLOC (struct so_list);
2231       strcpy (new->so_name, sop->so_name);
2232       strcpy (new->so_original_name, sop->so_original_name);
2233       if (!start)
2234         last = start = new;
2235       else
2236         {
2237           last->next = new;
2238           last = new;
2239         }
2240     }
2241
2242   return start;
2243 }
2244
2245 static void
2246 fetch_elf_core_registers (char *core_reg_sect,
2247                           unsigned core_reg_size,
2248                           int which,
2249                           CORE_ADDR reg_addr)
2250 {
2251   int r;
2252   if (core_reg_size < sizeof (CONTEXT))
2253     {
2254       error (_("Core file register section too small (%u bytes)."), core_reg_size);
2255       return;
2256     }
2257   for (r = 0; r < NUM_REGS; r++)
2258     regcache_raw_supply (current_regcache, r, core_reg_sect + mappings[r]);
2259 }
2260
2261 static int
2262 open_symbol_file_object (void *from_ttyp)
2263 {
2264   return 0;
2265 }
2266
2267 static int
2268 in_dynsym_resolve_code (CORE_ADDR pc)
2269 {
2270   return 0;
2271 }
2272
2273 static void
2274 init_win32_ops (void)
2275 {
2276   win32_ops.to_shortname = "child";
2277   win32_ops.to_longname = "Win32 child process";
2278   win32_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2279   win32_ops.to_open = win32_open;
2280   win32_ops.to_close = win32_close;
2281   win32_ops.to_attach = win32_attach;
2282   win32_ops.to_detach = win32_detach;
2283   win32_ops.to_resume = win32_resume;
2284   win32_ops.to_wait = win32_wait;
2285   win32_ops.to_fetch_registers = win32_fetch_inferior_registers;
2286   win32_ops.to_store_registers = win32_store_inferior_registers;
2287   win32_ops.to_prepare_to_store = win32_prepare_to_store;
2288   win32_ops.deprecated_xfer_memory = win32_xfer_memory;
2289   win32_ops.to_files_info = win32_files_info;
2290   win32_ops.to_insert_breakpoint = memory_insert_breakpoint;
2291   win32_ops.to_remove_breakpoint = memory_remove_breakpoint;
2292   win32_ops.to_terminal_init = terminal_init_inferior;
2293   win32_ops.to_terminal_inferior = terminal_inferior;
2294   win32_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2295   win32_ops.to_terminal_ours = terminal_ours;
2296   win32_ops.to_terminal_save_ours = terminal_save_ours;
2297   win32_ops.to_terminal_info = child_terminal_info;
2298   win32_ops.to_kill = win32_kill_inferior;
2299   win32_ops.to_create_inferior = win32_create_inferior;
2300   win32_ops.to_mourn_inferior = win32_mourn_inferior;
2301   win32_ops.to_can_run = win32_can_run;
2302   win32_ops.to_thread_alive = win32_win32_thread_alive;
2303   win32_ops.to_pid_to_str = cygwin_pid_to_str;
2304   win32_ops.to_stop = win32_stop;
2305   win32_ops.to_stratum = process_stratum;
2306   win32_ops.to_has_all_memory = 1;
2307   win32_ops.to_has_memory = 1;
2308   win32_ops.to_has_stack = 1;
2309   win32_ops.to_has_registers = 1;
2310   win32_ops.to_has_execution = 1;
2311   win32_ops.to_magic = OPS_MAGIC;
2312   win32_ops.to_pid_to_exec_file = win32_pid_to_exec_file;
2313
2314   win32_so_ops.relocate_section_addresses = win32_relocate_section_addresses;
2315   win32_so_ops.free_so = win32_free_so;
2316   win32_so_ops.clear_solib = win32_clear_solib;
2317   win32_so_ops.solib_create_inferior_hook = win32_solib_create_inferior_hook;
2318   win32_so_ops.special_symbol_handling = win32_special_symbol_handling;
2319   win32_so_ops.current_sos = win32_current_sos;
2320   win32_so_ops.open_symbol_file_object = open_symbol_file_object;
2321   win32_so_ops.in_dynsym_resolve_code = in_dynsym_resolve_code;
2322
2323   /* FIXME: Don't do this here.  *_gdbarch_init() should set so_ops. */
2324   current_target_so_ops = &win32_so_ops;
2325 }
2326
2327 static void
2328 set_win32_aliases (char *argv0)
2329 {
2330   add_info_alias ("dll", "sharedlibrary", 1);
2331 }
2332
2333 void
2334 _initialize_win32_nat (void)
2335 {
2336   struct cmd_list_element *c;
2337
2338   init_win32_ops ();
2339
2340   c = add_com ("dll-symbols", class_files, dll_symbol_command,
2341                _("Load dll library symbols from FILE."));
2342   set_cmd_completer (c, filename_completer);
2343
2344   add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
2345
2346   add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2347 Set use of shell to start subprocess."), _("\
2348 Show use of shell to start subprocess."), NULL,
2349                            NULL,
2350                            NULL, /* FIXME: i18n: */
2351                            &setlist, &showlist);
2352
2353   add_setshow_boolean_cmd ("cygwin-exceptions", class_support, &cygwin_exceptions, _("\
2354 Break when an exception is detected in the Cygwin DLL itself."), _("\
2355 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2356                            NULL,
2357                            NULL, /* FIXME: i18n: */
2358                            &setlist, &showlist);
2359
2360   add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2361 Set creation of new console when creating child process."), _("\
2362 Show creation of new console when creating child process."), NULL,
2363                            NULL,
2364                            NULL, /* FIXME: i18n: */
2365                            &setlist, &showlist);
2366
2367   add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2368 Set creation of new group when creating child process."), _("\
2369 Show creation of new group when creating child process."), NULL,
2370                            NULL,
2371                            NULL, /* FIXME: i18n: */
2372                            &setlist, &showlist);
2373
2374   add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2375 Set whether to display execution in child process."), _("\
2376 Show whether to display execution in child process."), NULL,
2377                            NULL,
2378                            NULL, /* FIXME: i18n: */
2379                            &setlist, &showlist);
2380
2381   add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2382 Set whether to display kernel events in child process."), _("\
2383 Show whether to display kernel events in child process."), NULL,
2384                            NULL,
2385                            NULL, /* FIXME: i18n: */
2386                            &setlist, &showlist);
2387
2388   add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2389 Set whether to display memory accesses in child process."), _("\
2390 Show whether to display memory accesses in child process."), NULL,
2391                            NULL,
2392                            NULL, /* FIXME: i18n: */
2393                            &setlist, &showlist);
2394
2395   add_setshow_boolean_cmd ("debugexceptions", class_support,
2396                            &debug_exceptions, _("\
2397 Set whether to display kernel exceptions in child process."), _("\
2398 Show whether to display kernel exceptions in child process."), NULL,
2399                            NULL,
2400                            NULL, /* FIXME: i18n: */
2401                            &setlist, &showlist);
2402
2403   add_prefix_cmd ("w32", class_info, info_w32_command,
2404                   _("Print information specific to Win32 debugging."),
2405                   &info_w32_cmdlist, "info w32 ", 0, &infolist);
2406
2407   add_cmd ("selector", class_info, display_selectors,
2408            _("Display selectors infos."),
2409            &info_w32_cmdlist);
2410   add_target (&win32_ops);
2411   deprecated_init_ui_hook = set_win32_aliases;
2412 }
2413
2414 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
2415
2416 /* Pass the address ADDR to the inferior in the I'th debug register.
2417    Here we just store the address in dr array, the registers will be
2418    actually set up when win32_continue is called.  */
2419 void
2420 cygwin_set_dr (int i, CORE_ADDR addr)
2421 {
2422   if (i < 0 || i > 3)
2423     internal_error (__FILE__, __LINE__,
2424                     _("Invalid register %d in cygwin_set_dr.\n"), i);
2425   dr[i] = (unsigned) addr;
2426   debug_registers_changed = 1;
2427   debug_registers_used = 1;
2428 }
2429
2430 /* Pass the value VAL to the inferior in the DR7 debug control
2431    register.  Here we just store the address in D_REGS, the watchpoint
2432    will be actually set up in win32_wait.  */
2433 void
2434 cygwin_set_dr7 (unsigned val)
2435 {
2436   dr[7] = val;
2437   debug_registers_changed = 1;
2438   debug_registers_used = 1;
2439 }
2440
2441 /* Get the value of the DR6 debug status register from the inferior.
2442    Here we just return the value stored in dr[6]
2443    by the last call to thread_rec for current_event.dwThreadId id.  */
2444 unsigned
2445 cygwin_get_dr6 (void)
2446 {
2447   return dr[6];
2448 }
2449
2450 /* Determine if the thread referenced by "pid" is alive
2451    by "polling" it.  If WaitForSingleObject returns WAIT_OBJECT_0
2452    it means that the pid has died.  Otherwise it is assumed to be alive. */
2453 static int
2454 win32_win32_thread_alive (ptid_t ptid)
2455 {
2456   int pid = PIDGET (ptid);
2457
2458   return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
2459     FALSE : TRUE;
2460 }
2461
2462 static struct core_fns win32_elf_core_fns =
2463 {
2464   bfd_target_elf_flavour,
2465   default_check_format,
2466   default_core_sniffer,
2467   fetch_elf_core_registers,
2468   NULL
2469 };
2470
2471 void
2472 _initialize_core_win32 (void)
2473 {
2474   deprecated_add_core_fns (&win32_elf_core_fns);
2475 }
2476
2477 void
2478 _initialize_check_for_gdb_ini (void)
2479 {
2480   char *homedir;
2481   if (inhibit_gdbinit)
2482     return;
2483
2484   homedir = getenv ("HOME");
2485   if (homedir)
2486     {
2487       char *p;
2488       char *oldini = (char *) alloca (strlen (homedir) +
2489                                       sizeof ("/gdb.ini"));
2490       strcpy (oldini, homedir);
2491       p = strchr (oldini, '\0');
2492       if (p > oldini && p[-1] != '/')
2493         *p++ = '/';
2494       strcpy (p, "gdb.ini");
2495       if (access (oldini, 0) == 0)
2496         {
2497           int len = strlen (oldini);
2498           char *newini = alloca (len + 1);
2499           sprintf (newini, "%.*s.gdbinit",
2500             (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2501           warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2502         }
2503     }
2504 }