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