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