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