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