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