Change cpu for vptestnmd and vptestnmq instructions.
[deliverable/binutils-gdb.git] / gdb / windows-nat.c
CommitLineData
dc05df57 1/* Target-vector operations for controlling windows child processes, for GDB.
0a65a603 2
ecd75fc8 3 Copyright (C) 1995-2014 Free Software Foundation, Inc.
0a65a603 4
e6433c28 5 Contributed by Cygnus Solutions, A Red Hat Company.
e88c49c3 6
24e60978
SC
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
24e60978
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
a9762ec7 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
24e60978
SC
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24e60978 21
dfe7f3ac 22/* Originally by Steve Chamberlain, sac@cygnus.com */
24e60978
SC
23
24#include "defs.h"
25#include "frame.h" /* required by inferior.h */
26#include "inferior.h"
27#include "target.h"
60250e8b 28#include "exceptions.h"
24e60978
SC
29#include "gdbcore.h"
30#include "command.h"
fa58ee11 31#include "completer.h"
4e052eda 32#include "regcache.h"
2a3d5645 33#include "top.h"
403d9909
CF
34#include <signal.h>
35#include <sys/types.h>
36#include <fcntl.h>
37#include <stdlib.h>
38#include <windows.h>
39#include <imagehlp.h>
2b008701 40#include <psapi.h>
10325bc5 41#ifdef __CYGWIN__
b7ff339d 42#include <wchar.h>
403d9909 43#include <sys/cygwin.h>
b7ff339d 44#include <cygwin/version.h>
10325bc5 45#endif
cad9cd60 46
24e60978 47#include "buildsym.h"
0ba1096a 48#include "filenames.h"
1ef980b9
SC
49#include "symfile.h"
50#include "objfiles.h"
92107356 51#include "gdb_bfd.h"
de1b3c3d 52#include "gdb_obstack.h"
0e9f083f 53#include <string.h>
fdfa3315 54#include "gdbthread.h"
24e60978 55#include "gdbcmd.h"
1e37c281 56#include <unistd.h>
4646aa9d 57#include "exec.h"
3ee6f623 58#include "solist.h"
3cb8e7f6 59#include "solib.h"
de1b3c3d 60#include "xml-support.h"
24e60978 61
6c7de422
MK
62#include "i386-tdep.h"
63#include "i387-tdep.h"
64
31b060a2
CF
65#include "windows-tdep.h"
66#include "windows-nat.h"
9bb9e8ad 67#include "i386-nat.h"
ecc13e53 68#include "complaints.h"
de1b3c3d 69
418c6cb3 70#define AdjustTokenPrivileges dyn_AdjustTokenPrivileges
2b008701
CF
71#define DebugActiveProcessStop dyn_DebugActiveProcessStop
72#define DebugBreakProcess dyn_DebugBreakProcess
73#define DebugSetProcessKillOnExit dyn_DebugSetProcessKillOnExit
74#define EnumProcessModules dyn_EnumProcessModules
2b008701 75#define GetModuleInformation dyn_GetModuleInformation
418c6cb3
CF
76#define LookupPrivilegeValueA dyn_LookupPrivilegeValueA
77#define OpenProcessToken dyn_OpenProcessToken
cd44747c
PM
78#define GetConsoleFontSize dyn_GetConsoleFontSize
79#define GetCurrentConsoleFont dyn_GetCurrentConsoleFont
2b008701 80
418c6cb3
CF
81static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES,
82 DWORD, PTOKEN_PRIVILEGES, PDWORD);
2b008701
CF
83static BOOL WINAPI (*DebugActiveProcessStop) (DWORD);
84static BOOL WINAPI (*DebugBreakProcess) (HANDLE);
85static BOOL WINAPI (*DebugSetProcessKillOnExit) (BOOL);
86static BOOL WINAPI (*EnumProcessModules) (HANDLE, HMODULE *, DWORD,
87 LPDWORD);
2b008701
CF
88static BOOL WINAPI (*GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO,
89 DWORD);
418c6cb3
CF
90static BOOL WINAPI (*LookupPrivilegeValueA)(LPCSTR, LPCSTR, PLUID);
91static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE);
581e13c1
MS
92static BOOL WINAPI (*GetCurrentConsoleFont) (HANDLE, BOOL,
93 CONSOLE_FONT_INFO *);
cd44747c 94static COORD WINAPI (*GetConsoleFontSize) (HANDLE, DWORD);
2b008701 95
dc05df57 96static struct target_ops windows_ops;
3ee6f623 97
b3c613f2
CF
98#undef STARTUPINFO
99#undef CreateProcess
100#undef GetModuleFileNameEx
101
102#ifndef __CYGWIN__
103# define __PMAX (MAX_PATH + 1)
104 static DWORD WINAPI (*GetModuleFileNameEx) (HANDLE, HMODULE, LPSTR, DWORD);
105# define STARTUPINFO STARTUPINFOA
106# define CreateProcess CreateProcessA
107# define GetModuleFileNameEx_name "GetModuleFileNameExA"
108# define bad_GetModuleFileNameEx bad_GetModuleFileNameExA
109#else
110# define __PMAX PATH_MAX
581e13c1 111/* The starting and ending address of the cygwin1.dll text segment. */
b3c613f2
CF
112 static CORE_ADDR cygwin_load_start;
113 static CORE_ADDR cygwin_load_end;
b3c613f2
CF
114# define __USEWIDE
115 typedef wchar_t cygwin_buf_t;
581e13c1
MS
116 static DWORD WINAPI (*GetModuleFileNameEx) (HANDLE, HMODULE,
117 LPWSTR, DWORD);
b3c613f2
CF
118# define STARTUPINFO STARTUPINFOW
119# define CreateProcess CreateProcessW
120# define GetModuleFileNameEx_name "GetModuleFileNameExW"
121# define bad_GetModuleFileNameEx bad_GetModuleFileNameExW
10325bc5 122#endif
a244bdca 123
581e13c1
MS
124static int have_saved_context; /* True if we've saved context from a
125 cygwin signal. */
126static CONTEXT saved_context; /* Containes the saved context from a
127 cygwin signal. */
a244bdca 128
0714f9bf
SS
129/* If we're not using the old Cygwin header file set, define the
130 following which never should have been in the generic Win32 API
581e13c1 131 headers in the first place since they were our own invention... */
0714f9bf 132#ifndef _GNU_H_WINDOWS_H
9d3789f7 133enum
8e860359
CF
134 {
135 FLAG_TRACE_BIT = 0x100,
136 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
137 };
0714f9bf
SS
138#endif
139
5851ab76
JB
140#ifndef CONTEXT_EXTENDED_REGISTERS
141/* This macro is only defined on ia32. It only makes sense on this target,
142 so define it as zero if not already defined. */
143#define CONTEXT_EXTENDED_REGISTERS 0
144#endif
145
fa4ba8da
PM
146#define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
147 | CONTEXT_EXTENDED_REGISTERS
97da3b20 148
41b4aadc 149static uintptr_t dr[8];
87a45c96
CF
150static int debug_registers_changed;
151static int debug_registers_used;
16d905e2
CF
152
153static int windows_initialization_done;
6537bb24 154#define DR6_CLEAR_VALUE 0xffff0ff0
97da3b20 155
3cee93ac 156/* The string sent by cygwin when it processes a signal.
581e13c1 157 FIXME: This should be in a cygwin include file. */
3929abe9
CF
158#ifndef _CYGWIN_SIGNAL_STRING
159#define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
160#endif
3cee93ac 161
29fe111d 162#define CHECK(x) check (x, __FILE__,__LINE__)
dfe7f3ac 163#define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
4e52d31c
PM
164#define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
165#define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
166#define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
24e60978 167
1eab8a48 168static void windows_stop (struct target_ops *self, ptid_t);
02529b48 169static int windows_thread_alive (struct target_ops *, ptid_t);
7d85a9c0 170static void windows_kill_inferior (struct target_ops *);
3cee93ac 171
9bb9e8ad
PM
172static void cygwin_set_dr (int i, CORE_ADDR addr);
173static void cygwin_set_dr7 (unsigned long val);
a961bc18 174static CORE_ADDR cygwin_get_dr (int i);
9bb9e8ad 175static unsigned long cygwin_get_dr6 (void);
a961bc18 176static unsigned long cygwin_get_dr7 (void);
9bb9e8ad 177
a493e3e2 178static enum gdb_signal last_sig = GDB_SIGNAL_0;
581e13c1 179/* Set if a signal was received from the debugged process. */
7393af7c 180
3cee93ac 181/* Thread information structure used to track information that is
6537bb24 182 not available in gdb's thread structure. */
3cee93ac 183typedef struct thread_info_struct
3a4b77d8
JM
184 {
185 struct thread_info_struct *next;
186 DWORD id;
187 HANDLE h;
711e434b 188 CORE_ADDR thread_local_base;
3a4b77d8 189 char *name;
6537bb24 190 int suspended;
3ade5333 191 int reload_context;
3a4b77d8 192 CONTEXT context;
1e37c281 193 STACKFRAME sf;
8e860359
CF
194 }
195thread_info;
1e37c281 196
29fe111d 197static thread_info thread_head;
24e60978 198
581e13c1 199/* The process and thread handles for the above context. */
24e60978 200
3cee93ac
CF
201static DEBUG_EVENT current_event; /* The current debug event from
202 WaitForDebugEvent */
203static HANDLE current_process_handle; /* Currently executing process */
204static thread_info *current_thread; /* Info on currently selected thread */
349b409f 205static DWORD main_thread_id; /* Thread ID of the main thread */
24e60978 206
581e13c1 207/* Counts of things. */
24e60978
SC
208static int exception_count = 0;
209static int event_count = 0;
dfe7f3ac 210static int saw_create;
bf25528d 211static int open_process_used = 0;
24e60978 212
581e13c1 213/* User options. */
24e60978 214static int new_console = 0;
10325bc5 215#ifdef __CYGWIN__
09280ddf 216static int cygwin_exceptions = 0;
10325bc5 217#endif
1e37c281 218static int new_group = 1;
dfe7f3ac
CF
219static int debug_exec = 0; /* show execution */
220static int debug_events = 0; /* show events from kernel */
221static int debug_memory = 0; /* show target memory accesses */
1ef980b9 222static int debug_exceptions = 0; /* show target exceptions */
dfe7f3ac
CF
223static int useshell = 0; /* use shell for subprocesses */
224
7e63b4e4 225/* This vector maps GDB's idea of a register's number into an offset
dc05df57 226 in the windows exception context vector.
24e60978 227
3cee93ac 228 It also contains the bit mask needed to load the register in question.
24e60978 229
7e63b4e4
JB
230 The contents of this table can only be computed by the units
231 that provide CPU-specific support for Windows native debugging.
232 These units should set the table by calling
dc05df57 233 windows_set_context_register_offsets.
7e63b4e4 234
24e60978
SC
235 One day we could read a reg, we could inspect the context we
236 already have loaded, if it doesn't have the bit set that we need,
237 we read that set of registers in using GetThreadContext. If the
581e13c1 238 context already contains what we need, we just unpack it. Then to
24e60978
SC
239 write a register, first we have to ensure that the context contains
240 the other regs of the group, and then we copy the info in and set
581e13c1 241 out bit. */
24e60978 242
7e63b4e4 243static const int *mappings;
d3a09475 244
d40dc7a8
JB
245/* The function to use in order to determine whether a register is
246 a segment register or not. */
247static segment_register_p_ftype *segment_register_p;
248
24e60978 249/* This vector maps the target's idea of an exception (extracted
581e13c1 250 from the DEBUG_EVENT structure) to GDB's idea. */
24e60978
SC
251
252struct xlate_exception
253 {
254 int them;
2ea28649 255 enum gdb_signal us;
24e60978
SC
256 };
257
24e60978
SC
258static const struct xlate_exception
259 xlate[] =
260{
a493e3e2
PA
261 {EXCEPTION_ACCESS_VIOLATION, GDB_SIGNAL_SEGV},
262 {STATUS_STACK_OVERFLOW, GDB_SIGNAL_SEGV},
263 {EXCEPTION_BREAKPOINT, GDB_SIGNAL_TRAP},
264 {DBG_CONTROL_C, GDB_SIGNAL_INT},
265 {EXCEPTION_SINGLE_STEP, GDB_SIGNAL_TRAP},
266 {STATUS_FLOAT_DIVIDE_BY_ZERO, GDB_SIGNAL_FPE},
24e60978
SC
267 {-1, -1}};
268
7e63b4e4
JB
269/* Set the MAPPINGS static global to OFFSETS.
270 See the description of MAPPINGS for more details. */
271
272void
dc05df57 273windows_set_context_register_offsets (const int *offsets)
7e63b4e4
JB
274{
275 mappings = offsets;
276}
277
d40dc7a8
JB
278/* See windows-nat.h. */
279
280void
281windows_set_segment_register_p (segment_register_p_ftype *fun)
282{
283 segment_register_p = fun;
284}
285
fa4ba8da
PM
286static void
287check (BOOL ok, const char *file, int line)
288{
289 if (!ok)
d50a0ce2
CV
290 printf_filtered ("error return %s:%d was %u\n", file, line,
291 (unsigned) GetLastError ());
fa4ba8da
PM
292}
293
6537bb24
PA
294/* Find a thread record given a thread id. If GET_CONTEXT is not 0,
295 then also retrieve the context for this thread. If GET_CONTEXT is
296 negative, then don't suspend the thread. */
3cee93ac
CF
297static thread_info *
298thread_rec (DWORD id, int get_context)
24e60978 299{
3cee93ac
CF
300 thread_info *th;
301
3a4b77d8 302 for (th = &thread_head; (th = th->next) != NULL;)
3cee93ac
CF
303 if (th->id == id)
304 {
6537bb24 305 if (!th->suspended && get_context)
3cee93ac 306 {
8a892701 307 if (get_context > 0 && id != current_event.dwThreadId)
6537bb24
PA
308 {
309 if (SuspendThread (th->h) == (DWORD) -1)
310 {
311 DWORD err = GetLastError ();
22128028 312
80e88e1a 313 warning (_("SuspendThread (tid=0x%x) failed."
2ed3e009 314 " (winerr %u)"),
80e88e1a 315 (unsigned) id, (unsigned) err);
6537bb24
PA
316 return NULL;
317 }
318 th->suspended = 1;
319 }
3cee93ac 320 else if (get_context < 0)
6537bb24 321 th->suspended = -1;
3ade5333 322 th->reload_context = 1;
3cee93ac
CF
323 }
324 return th;
325 }
326
327 return NULL;
328}
329
2dc38344 330/* Add a thread to the thread list. */
3cee93ac 331static thread_info *
711e434b 332windows_add_thread (ptid_t ptid, HANDLE h, void *tlb)
3cee93ac
CF
333{
334 thread_info *th;
2dc38344
PA
335 DWORD id;
336
337 gdb_assert (ptid_get_tid (ptid) != 0);
338
339 id = ptid_get_tid (ptid);
3cee93ac
CF
340
341 if ((th = thread_rec (id, FALSE)))
342 return th;
343
41bf6aca 344 th = XCNEW (thread_info);
3cee93ac
CF
345 th->id = id;
346 th->h = h;
711e434b 347 th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb;
3cee93ac
CF
348 th->next = thread_head.next;
349 thread_head.next = th;
2dc38344
PA
350 add_thread (ptid);
351 /* Set the debug registers for the new thread if they are used. */
fa4ba8da
PM
352 if (debug_registers_used)
353 {
354 /* Only change the value of the debug registers. */
355 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
356 CHECK (GetThreadContext (th->h, &th->context));
357 th->context.Dr0 = dr[0];
358 th->context.Dr1 = dr[1];
359 th->context.Dr2 = dr[2];
360 th->context.Dr3 = dr[3];
6537bb24 361 th->context.Dr6 = DR6_CLEAR_VALUE;
fa4ba8da
PM
362 th->context.Dr7 = dr[7];
363 CHECK (SetThreadContext (th->h, &th->context));
364 th->context.ContextFlags = 0;
365 }
3cee93ac 366 return th;
24e60978
SC
367}
368
3cee93ac 369/* Clear out any old thread list and reintialize it to a
581e13c1 370 pristine state. */
24e60978 371static void
dc05df57 372windows_init_thread_list (void)
24e60978 373{
3cee93ac
CF
374 thread_info *th = &thread_head;
375
dc05df57 376 DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
3cee93ac
CF
377 init_thread_list ();
378 while (th->next != NULL)
24e60978 379 {
3cee93ac
CF
380 thread_info *here = th->next;
381 th->next = here->next;
b8c9b27d 382 xfree (here);
24e60978 383 }
059198c1 384 thread_head.next = NULL;
3cee93ac
CF
385}
386
581e13c1 387/* Delete a thread from the list of threads. */
3cee93ac 388static void
e0ea48a0 389windows_delete_thread (ptid_t ptid, DWORD exit_code)
3cee93ac
CF
390{
391 thread_info *th;
2dc38344
PA
392 DWORD id;
393
394 gdb_assert (ptid_get_tid (ptid) != 0);
395
396 id = ptid_get_tid (ptid);
3cee93ac
CF
397
398 if (info_verbose)
2dc38344 399 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (ptid));
e0ea48a0
EZ
400 else if (print_thread_events && id != main_thread_id)
401 printf_unfiltered (_("[%s exited with code %u]\n"),
564eac42 402 target_pid_to_str (ptid), (unsigned) exit_code);
2dc38344 403 delete_thread (ptid);
3cee93ac
CF
404
405 for (th = &thread_head;
406 th->next != NULL && th->next->id != id;
407 th = th->next)
408 continue;
409
410 if (th->next != NULL)
24e60978 411 {
3cee93ac
CF
412 thread_info *here = th->next;
413 th->next = here->next;
b8c9b27d 414 xfree (here);
24e60978
SC
415 }
416}
417
3cee93ac 418static void
dc05df57 419do_windows_fetch_inferior_registers (struct regcache *regcache, int r)
24e60978 420{
1e37c281 421 char *context_offset = ((char *) &current_thread->context) + mappings[r];
20a6ec49
MD
422 struct gdbarch *gdbarch = get_regcache_arch (regcache);
423 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1e37c281 424 long l;
6c7de422 425
3ade5333 426 if (!current_thread)
d6dc8049 427 return; /* Windows sometimes uses a non-existent thread id in its
581e13c1 428 events. */
3ade5333
CF
429
430 if (current_thread->reload_context)
431 {
cb832706 432#ifdef __COPY_CONTEXT_SIZE
a244bdca
CF
433 if (have_saved_context)
434 {
581e13c1
MS
435 /* Lie about where the program actually is stopped since
436 cygwin has informed us that we should consider the signal
437 to have occurred at another location which is stored in
438 "saved_context. */
439 memcpy (&current_thread->context, &saved_context,
440 __COPY_CONTEXT_SIZE);
a244bdca
CF
441 have_saved_context = 0;
442 }
443 else
cb832706 444#endif
a244bdca
CF
445 {
446 thread_info *th = current_thread;
447 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
448 GetThreadContext (th->h, &th->context);
2b008701 449 /* Copy dr values from that thread.
581e13c1
MS
450 But only if there were not modified since last stop.
451 PR gdb/2388 */
88616312
PM
452 if (!debug_registers_changed)
453 {
454 dr[0] = th->context.Dr0;
455 dr[1] = th->context.Dr1;
456 dr[2] = th->context.Dr2;
457 dr[3] = th->context.Dr3;
458 dr[6] = th->context.Dr6;
459 dr[7] = th->context.Dr7;
460 }
a244bdca 461 }
3ade5333
CF
462 current_thread->reload_context = 0;
463 }
464
20a6ec49 465 if (r == I387_FISEG_REGNUM (tdep))
1e37c281 466 {
8e860359 467 l = *((long *) context_offset) & 0xffff;
56be3814 468 regcache_raw_supply (regcache, r, (char *) &l);
1e37c281 469 }
20a6ec49 470 else if (r == I387_FOP_REGNUM (tdep))
1e37c281 471 {
8e860359 472 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
56be3814 473 regcache_raw_supply (regcache, r, (char *) &l);
1e37c281 474 }
d40dc7a8
JB
475 else if (segment_register_p (r))
476 {
477 /* GDB treats segment registers as 32bit registers, but they are
478 in fact only 16 bits long. Make sure we do not read extra
479 bits from our source buffer. */
480 l = *((long *) context_offset) & 0xffff;
481 regcache_raw_supply (regcache, r, (char *) &l);
482 }
1e37c281 483 else if (r >= 0)
56be3814 484 regcache_raw_supply (regcache, r, context_offset);
3cee93ac 485 else
24e60978 486 {
20a6ec49 487 for (r = 0; r < gdbarch_num_regs (gdbarch); r++)
dc05df57 488 do_windows_fetch_inferior_registers (regcache, r);
24e60978 489 }
3cee93ac
CF
490}
491
492static void
28439f5e
PA
493windows_fetch_inferior_registers (struct target_ops *ops,
494 struct regcache *regcache, int r)
3cee93ac 495{
2dc38344 496 current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
d6dc8049 497 /* Check if current_thread exists. Windows sometimes uses a non-existent
581e13c1 498 thread id in its events. */
3ade5333 499 if (current_thread)
dc05df57 500 do_windows_fetch_inferior_registers (regcache, r);
3cee93ac
CF
501}
502
503static void
dc05df57 504do_windows_store_inferior_registers (const struct regcache *regcache, int r)
3cee93ac 505{
3ade5333 506 if (!current_thread)
581e13c1 507 /* Windows sometimes uses a non-existent thread id in its events. */;
3ade5333 508 else if (r >= 0)
56be3814 509 regcache_raw_collect (regcache, r,
822c9732 510 ((char *) &current_thread->context) + mappings[r]);
24e60978
SC
511 else
512 {
40a6adc1 513 for (r = 0; r < gdbarch_num_regs (get_regcache_arch (regcache)); r++)
dc05df57 514 do_windows_store_inferior_registers (regcache, r);
24e60978
SC
515 }
516}
517
581e13c1 518/* Store a new register value into the current thread context. */
3cee93ac 519static void
28439f5e
PA
520windows_store_inferior_registers (struct target_ops *ops,
521 struct regcache *regcache, int r)
3cee93ac 522{
2dc38344 523 current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
d6dc8049 524 /* Check if current_thread exists. Windows sometimes uses a non-existent
581e13c1 525 thread id in its events. */
3ade5333 526 if (current_thread)
dc05df57 527 do_windows_store_inferior_registers (regcache, r);
3cee93ac 528}
24e60978 529
450005e7 530/* Encapsulate the information required in a call to
581e13c1 531 symbol_file_add_args. */
8a892701
CF
532struct safe_symbol_file_add_args
533{
534 char *name;
535 int from_tty;
536 struct section_addr_info *addrs;
537 int mainline;
538 int flags;
7c5c87c0 539 struct ui_file *err, *out;
8a892701
CF
540 struct objfile *ret;
541};
542
581e13c1 543/* Maintain a linked list of "so" information. */
3ee6f623 544struct lm_info
02e423b9 545{
d3653bf6 546 LPVOID load_addr;
3ee6f623
CF
547};
548
549static struct so_list solib_start, *solib_end;
02e423b9 550
450005e7 551/* Call symbol_file_add with stderr redirected. We don't care if there
581e13c1 552 are errors. */
8a892701
CF
553static int
554safe_symbol_file_add_stub (void *argv)
555{
3ee6f623 556#define p ((struct safe_symbol_file_add_args *) argv)
7eedccfa
PP
557 const int add_flags = ((p->from_tty ? SYMFILE_VERBOSE : 0)
558 | (p->mainline ? SYMFILE_MAINLINE : 0));
559 p->ret = symbol_file_add (p->name, add_flags, p->addrs, p->flags);
8a892701
CF
560 return !!p->ret;
561#undef p
562}
563
581e13c1 564/* Restore gdb's stderr after calling symbol_file_add. */
8a892701 565static void
7c5c87c0 566safe_symbol_file_add_cleanup (void *p)
8a892701 567{
8e860359 568#define sp ((struct safe_symbol_file_add_args *)p)
450005e7 569 gdb_flush (gdb_stderr);
7c5c87c0 570 gdb_flush (gdb_stdout);
d3ff4a77 571 ui_file_delete (gdb_stderr);
7c5c87c0 572 ui_file_delete (gdb_stdout);
d3ff4a77 573 gdb_stderr = sp->err;
9d3789f7 574 gdb_stdout = sp->out;
8e860359 575#undef sp
8a892701
CF
576}
577
581e13c1 578/* symbol_file_add wrapper that prevents errors from being displayed. */
8a892701
CF
579static struct objfile *
580safe_symbol_file_add (char *name, int from_tty,
581 struct section_addr_info *addrs,
582 int mainline, int flags)
8a892701
CF
583{
584 struct safe_symbol_file_add_args p;
585 struct cleanup *cleanup;
586
7c5c87c0 587 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
8a892701 588
7c5c87c0
CF
589 p.err = gdb_stderr;
590 p.out = gdb_stdout;
450005e7 591 gdb_flush (gdb_stderr);
7c5c87c0 592 gdb_flush (gdb_stdout);
d3ff4a77 593 gdb_stderr = ui_file_new ();
7c5c87c0 594 gdb_stdout = ui_file_new ();
8a892701
CF
595 p.name = name;
596 p.from_tty = from_tty;
597 p.addrs = addrs;
598 p.mainline = mainline;
599 p.flags = flags;
600 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
601
602 do_cleanups (cleanup);
603 return p.ret;
604}
605
de1b3c3d 606static struct so_list *
dc05df57 607windows_make_so (const char *name, LPVOID load_addr)
8e860359 608{
3ee6f623 609 struct so_list *so;
d0d0ab16
CV
610 char *p;
611#ifndef __CYGWIN__
b3c613f2
CF
612 char buf[__PMAX];
613 char cwd[__PMAX];
3f8ad85b
CF
614 WIN32_FIND_DATA w32_fd;
615 HANDLE h = FindFirstFile(name, &w32_fd);
3f8ad85b 616
6badb179
CF
617 if (h == INVALID_HANDLE_VALUE)
618 strcpy (buf, name);
619 else
3f8ad85b 620 {
c914e0cc
CF
621 FindClose (h);
622 strcpy (buf, name);
623 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
624 {
625 p = strrchr (buf, '\\');
626 if (p)
627 p[1] = '\0';
628 SetCurrentDirectory (buf);
629 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
630 SetCurrentDirectory (cwd);
631 }
3f8ad85b 632 }
3ee6f623
CF
633 if (strcasecmp (buf, "ntdll.dll") == 0)
634 {
635 GetSystemDirectory (buf, sizeof (buf));
636 strcat (buf, "\\ntdll.dll");
637 }
d0d0ab16 638#else
b3c613f2 639 cygwin_buf_t buf[__PMAX];
d0d0ab16 640
b3c613f2 641 buf[0] = 0;
d0d0ab16
CV
642 if (access (name, F_OK) != 0)
643 {
644 if (strcasecmp (name, "ntdll.dll") == 0)
b3c613f2 645#ifdef __USEWIDE
d0d0ab16
CV
646 {
647 GetSystemDirectoryW (buf, sizeof (buf) / sizeof (wchar_t));
648 wcscat (buf, L"\\ntdll.dll");
649 }
b3c613f2
CF
650#else
651 {
652 GetSystemDirectoryA (buf, sizeof (buf) / sizeof (wchar_t));
653 strcat (buf, "\\ntdll.dll");
654 }
655#endif
d0d0ab16
CV
656 }
657#endif
41bf6aca 658 so = XCNEW (struct so_list);
3ee6f623
CF
659 so->lm_info = (struct lm_info *) xmalloc (sizeof (struct lm_info));
660 so->lm_info->load_addr = load_addr;
de1b3c3d 661 strcpy (so->so_original_name, name);
10325bc5
PA
662#ifndef __CYGWIN__
663 strcpy (so->so_name, buf);
664#else
d0d0ab16
CV
665 if (buf[0])
666 cygwin_conv_path (CCP_WIN_W_TO_POSIX, buf, so->so_name,
667 SO_NAME_MAX_PATH_SIZE);
668 else
669 {
60c5c021 670 char *rname = realpath (name, NULL);
d0d0ab16
CV
671 if (rname && strlen (rname) < SO_NAME_MAX_PATH_SIZE)
672 {
673 strcpy (so->so_name, rname);
674 free (rname);
675 }
676 else
677 error (_("dll path too long"));
678 }
de1b3c3d
PA
679 /* Record cygwin1.dll .text start/end. */
680 p = strchr (so->so_name, '\0') - (sizeof ("/cygwin1.dll") - 1);
681 if (p >= so->so_name && strcasecmp (p, "/cygwin1.dll") == 0)
682 {
683 bfd *abfd;
684 asection *text = NULL;
685 CORE_ADDR text_vma;
8e860359 686
1c00ec6b 687 abfd = gdb_bfd_open (so->so_name, "pei-i386", -1);
a244bdca 688
de1b3c3d
PA
689 if (!abfd)
690 return so;
691
692 if (bfd_check_format (abfd, bfd_object))
693 text = bfd_get_section_by_name (abfd, ".text");
694
695 if (!text)
696 {
cbb099e8 697 gdb_bfd_unref (abfd);
de1b3c3d
PA
698 return so;
699 }
700
7a9dd1b2 701 /* The symbols in a dll are offset by 0x1000, which is the
de1b3c3d 702 offset from 0 of the first byte in an image - because of the
581e13c1
MS
703 file header and the section alignment. */
704 cygwin_load_start = (CORE_ADDR) (uintptr_t) ((char *)
705 load_addr + 0x1000);
dc05df57 706 cygwin_load_end = cygwin_load_start + bfd_section_size (abfd, text);
de1b3c3d 707
cbb099e8 708 gdb_bfd_unref (abfd);
de1b3c3d 709 }
10325bc5 710#endif
de1b3c3d
PA
711
712 return so;
8e860359
CF
713}
714
3ee6f623 715static char *
dfe7f3ac
CF
716get_image_name (HANDLE h, void *address, int unicode)
717{
d0d0ab16 718#ifdef __CYGWIN__
b3c613f2 719 static char buf[__PMAX];
d0d0ab16 720#else
b3c613f2 721 static char buf[(2 * __PMAX) + 1];
d0d0ab16 722#endif
dfe7f3ac
CF
723 DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
724 char *address_ptr;
725 int len = 0;
726 char b[2];
5732a500 727 SIZE_T done;
dfe7f3ac
CF
728
729 /* Attempt to read the name of the dll that was detected.
730 This is documented to work only when actively debugging
581e13c1 731 a program. It will not work for attached processes. */
dfe7f3ac
CF
732 if (address == NULL)
733 return NULL;
734
dfe7f3ac 735 /* See if we could read the address of a string, and that the
581e13c1
MS
736 address isn't null. */
737 if (!ReadProcessMemory (h, address, &address_ptr,
738 sizeof (address_ptr), &done)
6f17862b 739 || done != sizeof (address_ptr) || !address_ptr)
dfe7f3ac
CF
740 return NULL;
741
581e13c1 742 /* Find the length of the string. */
6f17862b
CF
743 while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
744 && (b[0] != 0 || b[size - 1] != 0) && done == size)
745 continue;
dfe7f3ac
CF
746
747 if (!unicode)
748 ReadProcessMemory (h, address_ptr, buf, len, &done);
749 else
750 {
751 WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
752 ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
753 &done);
d0d0ab16 754#ifdef __CYGWIN__
b3c613f2 755 wcstombs (buf, unicode_address, __PMAX);
d0d0ab16
CV
756#else
757 WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
758 0, 0);
759#endif
dfe7f3ac
CF
760 }
761
762 return buf;
763}
764
1cd9feab
JB
765/* Handle a DLL load event, and return 1.
766
767 This function assumes that this event did not occur during inferior
768 initialization, where their event info may be incomplete (see
769 do_initial_windows_stuff and windows_add_all_dlls for more info
770 on how we handle DLL loading during that phase). */
771
1750a5ef 772static int
0a65a603 773handle_load_dll (void *dummy)
24e60978 774{
3a4b77d8 775 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
1cd9feab 776 char *dll_name;
24e60978 777
94481b8c
JB
778 /* Try getting the DLL name via the lpImageName field of the event.
779 Note that Microsoft documents this fields as strictly optional,
780 in the sense that it might be NULL. And the first DLL event in
781 particular is explicitly documented as "likely not pass[ed]"
782 (source: MSDN LOAD_DLL_DEBUG_INFO structure). */
1cd9feab
JB
783 dll_name = get_image_name (current_process_handle,
784 event->lpImageName, event->fUnicode);
3cee93ac
CF
785 if (!dll_name)
786 return 1;
787
dc05df57 788 solib_end->next = windows_make_so (dll_name, event->lpBaseOfDll);
de1b3c3d 789 solib_end = solib_end->next;
450005e7 790
a74ce742
PM
791 DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %s.\n", solib_end->so_name,
792 host_address_to_string (solib_end->lm_info->load_addr)));
7488902c 793
450005e7
CF
794 return 1;
795}
796
3ee6f623 797static void
dc05df57 798windows_free_so (struct so_list *so)
3ee6f623 799{
3ee6f623
CF
800 if (so->lm_info)
801 xfree (so->lm_info);
de1b3c3d 802 xfree (so);
3cb8e7f6
CF
803}
804
d3ff4a77 805static int
0a65a603 806handle_unload_dll (void *dummy)
d3ff4a77 807{
d3653bf6 808 LPVOID lpBaseOfDll = current_event.u.UnloadDll.lpBaseOfDll;
3ee6f623 809 struct so_list *so;
d3ff4a77
CF
810
811 for (so = &solib_start; so->next != NULL; so = so->next)
3ee6f623 812 if (so->next->lm_info->load_addr == lpBaseOfDll)
d3ff4a77 813 {
3ee6f623 814 struct so_list *sodel = so->next;
a25cd31f 815
d3ff4a77
CF
816 so->next = sodel->next;
817 if (!so->next)
818 solib_end = so;
7488902c
PM
819 DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name));
820
dc05df57 821 windows_free_so (sodel);
d3ff4a77
CF
822 return 1;
823 }
3929abe9 824
ecc13e53
JB
825 /* We did not find any DLL that was previously loaded at this address,
826 so register a complaint. We do not report an error, because we have
827 observed that this may be happening under some circumstances. For
828 instance, running 32bit applications on x64 Windows causes us to receive
829 4 mysterious UNLOAD_DLL_DEBUG_EVENTs during the startup phase (these
830 events are apparently caused by the WOW layer, the interface between
831 32bit and 64bit worlds). */
832 complaint (&symfile_complaints, _("dll starting at %s not found."),
833 host_address_to_string (lpBaseOfDll));
d3ff4a77
CF
834
835 return 0;
836}
837
581e13c1 838/* Clear list of loaded DLLs. */
3ee6f623 839static void
dc05df57 840windows_clear_solib (void)
450005e7 841{
450005e7
CF
842 solib_start.next = NULL;
843 solib_end = &solib_start;
450005e7 844}
295732ea 845
581e13c1 846/* Load DLL symbol info. */
d603d4b3 847static void
7470a420 848dll_symbol_command (char *args, int from_tty)
450005e7 849{
8e860359 850 int n;
450005e7 851 dont_repeat ();
8e860359 852
450005e7 853 if (args == NULL)
8a3fe4f8 854 error (_("dll-symbols requires a file name"));
450005e7 855
8e860359
CF
856 n = strlen (args);
857 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
858 {
859 char *newargs = (char *) alloca (n + 4 + 1);
860 strcpy (newargs, args);
861 strcat (newargs, ".dll");
862 args = newargs;
863 }
864
7470a420 865 safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
8e860359 866}
450005e7 867
3cee93ac
CF
868/* Handle DEBUG_STRING output from child process.
869 Cygwin prepends its messages with a "cygwin:". Interpret this as
581e13c1 870 a Cygwin signal. Otherwise just print the string as a warning. */
3cee93ac
CF
871static int
872handle_output_debug_string (struct target_waitstatus *ourstatus)
873{
a244bdca
CF
874 char *s = NULL;
875 int retval = 0;
3cee93ac
CF
876
877 if (!target_read_string
2c647436
PM
878 ((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
879 &s, 1024, 0)
3cee93ac 880 || !s || !*s)
a244bdca 881 /* nothing to do */;
581e13c1
MS
882 else if (strncmp (s, _CYGWIN_SIGNAL_STRING,
883 sizeof (_CYGWIN_SIGNAL_STRING) - 1) != 0)
3cee93ac 884 {
10325bc5 885#ifdef __CYGWIN__
d3a09475 886 if (strncmp (s, "cYg", 3) != 0)
10325bc5 887#endif
8a3fe4f8 888 warning (("%s"), s);
3cee93ac 889 }
cb832706 890#ifdef __COPY_CONTEXT_SIZE
d3a09475 891 else
3cee93ac 892 {
581e13c1
MS
893 /* Got a cygwin signal marker. A cygwin signal is followed by
894 the signal number itself and then optionally followed by the
895 thread id and address to saved context within the DLL. If
896 these are supplied, then the given thread is assumed to have
897 issued the signal and the context from the thread is assumed
898 to be stored at the given address in the inferior. Tell gdb
899 to treat this like a real signal. */
3cee93ac 900 char *p;
3929abe9 901 int sig = strtol (s + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
2ea28649 902 int gotasig = gdb_signal_from_host (sig);
c62fa0e2 903
0714f9bf
SS
904 ourstatus->value.sig = gotasig;
905 if (gotasig)
a244bdca
CF
906 {
907 LPCVOID x;
2c15ef43 908 SIZE_T n;
c62fa0e2 909
a244bdca
CF
910 ourstatus->kind = TARGET_WAITKIND_STOPPED;
911 retval = strtoul (p, &p, 0);
912 if (!retval)
913 retval = main_thread_id;
40653b35 914 else if ((x = (LPCVOID) (uintptr_t) strtoull (p, NULL, 0))
a244bdca 915 && ReadProcessMemory (current_process_handle, x,
581e13c1
MS
916 &saved_context,
917 __COPY_CONTEXT_SIZE, &n)
a244bdca
CF
918 && n == __COPY_CONTEXT_SIZE)
919 have_saved_context = 1;
920 current_event.dwThreadId = retval;
921 }
3cee93ac 922 }
cb832706 923#endif
3cee93ac 924
a244bdca
CF
925 if (s)
926 xfree (s);
927 return retval;
3cee93ac 928}
24e60978 929
c1748f97
PM
930static int
931display_selector (HANDLE thread, DWORD sel)
932{
933 LDT_ENTRY info;
934 if (GetThreadSelectorEntry (thread, sel, &info))
935 {
936 int base, limit;
d50a0ce2 937 printf_filtered ("0x%03x: ", (unsigned) sel);
c1748f97 938 if (!info.HighWord.Bits.Pres)
baa93fa6
CF
939 {
940 puts_filtered ("Segment not present\n");
941 return 0;
942 }
c1748f97
PM
943 base = (info.HighWord.Bits.BaseHi << 24) +
944 (info.HighWord.Bits.BaseMid << 16)
945 + info.BaseLow;
946 limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
947 if (info.HighWord.Bits.Granularity)
caad7706 948 limit = (limit << 12) | 0xfff;
c1748f97
PM
949 printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
950 if (info.HighWord.Bits.Default_Big)
baa93fa6 951 puts_filtered(" 32-bit ");
c1748f97 952 else
baa93fa6 953 puts_filtered(" 16-bit ");
c1748f97
PM
954 switch ((info.HighWord.Bits.Type & 0xf) >> 1)
955 {
956 case 0:
baa93fa6
CF
957 puts_filtered ("Data (Read-Only, Exp-up");
958 break;
c1748f97 959 case 1:
baa93fa6
CF
960 puts_filtered ("Data (Read/Write, Exp-up");
961 break;
c1748f97 962 case 2:
baa93fa6
CF
963 puts_filtered ("Unused segment (");
964 break;
c1748f97 965 case 3:
baa93fa6
CF
966 puts_filtered ("Data (Read/Write, Exp-down");
967 break;
c1748f97 968 case 4:
baa93fa6
CF
969 puts_filtered ("Code (Exec-Only, N.Conf");
970 break;
c1748f97 971 case 5:
baa93fa6 972 puts_filtered ("Code (Exec/Read, N.Conf");
c1748f97
PM
973 break;
974 case 6:
baa93fa6 975 puts_filtered ("Code (Exec-Only, Conf");
c1748f97
PM
976 break;
977 case 7:
baa93fa6 978 puts_filtered ("Code (Exec/Read, Conf");
c1748f97
PM
979 break;
980 default:
981 printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
982 }
983 if ((info.HighWord.Bits.Type & 0x1) == 0)
baa93fa6 984 puts_filtered(", N.Acc");
c1748f97
PM
985 puts_filtered (")\n");
986 if ((info.HighWord.Bits.Type & 0x10) == 0)
987 puts_filtered("System selector ");
988 printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
989 if (info.HighWord.Bits.Granularity)
baa93fa6 990 puts_filtered ("Page granular.\n");
c1748f97
PM
991 else
992 puts_filtered ("Byte granular.\n");
993 return 1;
994 }
995 else
996 {
5572ce1f
PM
997 DWORD err = GetLastError ();
998 if (err == ERROR_NOT_SUPPORTED)
999 printf_filtered ("Function not supported\n");
1000 else
d50a0ce2 1001 printf_filtered ("Invalid selector 0x%x.\n", (unsigned) sel);
c1748f97
PM
1002 return 0;
1003 }
1004}
1005
1006static void
1007display_selectors (char * args, int from_tty)
1008{
1009 if (!current_thread)
1010 {
1011 puts_filtered ("Impossible to display selectors now.\n");
1012 return;
1013 }
1014 if (!args)
1015 {
1016
1017 puts_filtered ("Selector $cs\n");
1018 display_selector (current_thread->h,
baa93fa6 1019 current_thread->context.SegCs);
c1748f97
PM
1020 puts_filtered ("Selector $ds\n");
1021 display_selector (current_thread->h,
baa93fa6 1022 current_thread->context.SegDs);
c1748f97
PM
1023 puts_filtered ("Selector $es\n");
1024 display_selector (current_thread->h,
baa93fa6 1025 current_thread->context.SegEs);
c1748f97
PM
1026 puts_filtered ("Selector $ss\n");
1027 display_selector (current_thread->h,
baa93fa6 1028 current_thread->context.SegSs);
c1748f97
PM
1029 puts_filtered ("Selector $fs\n");
1030 display_selector (current_thread->h,
1031 current_thread->context.SegFs);
1032 puts_filtered ("Selector $gs\n");
1033 display_selector (current_thread->h,
baa93fa6 1034 current_thread->context.SegGs);
c1748f97
PM
1035 }
1036 else
1037 {
1038 int sel;
1039 sel = parse_and_eval_long (args);
1040 printf_filtered ("Selector \"%s\"\n",args);
1041 display_selector (current_thread->h, sel);
1042 }
1043}
1044
7393af7c 1045#define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
a74ce742
PM
1046 printf_unfiltered ("gdb: Target exception %s at %s\n", x, \
1047 host_address_to_string (\
1048 current_event.u.Exception.ExceptionRecord.ExceptionAddress))
7393af7c 1049
36339ecd 1050static int
450005e7 1051handle_exception (struct target_waitstatus *ourstatus)
24e60978 1052{
3cee93ac 1053 thread_info *th;
29fe111d 1054 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
3cee93ac 1055
29fe111d 1056 ourstatus->kind = TARGET_WAITKIND_STOPPED;
8a892701 1057
581e13c1 1058 /* Record the context of the current thread. */
3cee93ac 1059 th = thread_rec (current_event.dwThreadId, -1);
24e60978 1060
29fe111d 1061 switch (code)
24e60978 1062 {
1ef980b9 1063 case EXCEPTION_ACCESS_VIOLATION:
7393af7c 1064 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
a493e3e2 1065 ourstatus->value.sig = GDB_SIGNAL_SEGV;
10325bc5 1066#ifdef __CYGWIN__
8da8e0b3 1067 {
581e13c1
MS
1068 /* See if the access violation happened within the cygwin DLL
1069 itself. Cygwin uses a kind of exception handling to deal
1070 with passed-in invalid addresses. gdb should not treat
1071 these as real SEGVs since they will be silently handled by
1072 cygwin. A real SEGV will (theoretically) be caught by
1073 cygwin later in the process and will be sent as a
1074 cygwin-specific-signal. So, ignore SEGVs if they show up
1075 within the text segment of the DLL itself. */
2c02bd72 1076 const char *fn;
581e13c1
MS
1077 CORE_ADDR addr = (CORE_ADDR) (uintptr_t)
1078 current_event.u.Exception.ExceptionRecord.ExceptionAddress;
1079
1080 if ((!cygwin_exceptions && (addr >= cygwin_load_start
1081 && addr < cygwin_load_end))
a244bdca 1082 || (find_pc_partial_function (addr, &fn, NULL, NULL)
581e13c1
MS
1083 && strncmp (fn, "KERNEL32!IsBad",
1084 strlen ("KERNEL32!IsBad")) == 0))
8da8e0b3
CF
1085 return 0;
1086 }
10325bc5 1087#endif
7393af7c
PM
1088 break;
1089 case STATUS_STACK_OVERFLOW:
1090 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
a493e3e2 1091 ourstatus->value.sig = GDB_SIGNAL_SEGV;
7393af7c
PM
1092 break;
1093 case STATUS_FLOAT_DENORMAL_OPERAND:
1094 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
a493e3e2 1095 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1096 break;
1097 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1098 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
a493e3e2 1099 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1100 break;
1101 case STATUS_FLOAT_INEXACT_RESULT:
1102 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
a493e3e2 1103 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1104 break;
1105 case STATUS_FLOAT_INVALID_OPERATION:
1106 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
a493e3e2 1107 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1108 break;
1109 case STATUS_FLOAT_OVERFLOW:
1110 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
a493e3e2 1111 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1112 break;
1113 case STATUS_FLOAT_STACK_CHECK:
1114 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
a493e3e2 1115 ourstatus->value.sig = GDB_SIGNAL_FPE;
1ef980b9 1116 break;
3b7c8b74 1117 case STATUS_FLOAT_UNDERFLOW:
7393af7c 1118 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
a493e3e2 1119 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c 1120 break;
3b7c8b74 1121 case STATUS_FLOAT_DIVIDE_BY_ZERO:
7393af7c 1122 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
a493e3e2 1123 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c 1124 break;
3b7c8b74 1125 case STATUS_INTEGER_DIVIDE_BY_ZERO:
7393af7c 1126 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
a493e3e2 1127 ourstatus->value.sig = GDB_SIGNAL_FPE;
3b7c8b74 1128 break;
7393af7c
PM
1129 case STATUS_INTEGER_OVERFLOW:
1130 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
a493e3e2 1131 ourstatus->value.sig = GDB_SIGNAL_FPE;
1ef980b9
SC
1132 break;
1133 case EXCEPTION_BREAKPOINT:
7393af7c 1134 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
a493e3e2 1135 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1ef980b9
SC
1136 break;
1137 case DBG_CONTROL_C:
7393af7c 1138 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
a493e3e2 1139 ourstatus->value.sig = GDB_SIGNAL_INT;
5b421780
PM
1140 break;
1141 case DBG_CONTROL_BREAK:
7393af7c 1142 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
a493e3e2 1143 ourstatus->value.sig = GDB_SIGNAL_INT;
1ef980b9
SC
1144 break;
1145 case EXCEPTION_SINGLE_STEP:
7393af7c 1146 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
a493e3e2 1147 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1ef980b9 1148 break;
8227c82d 1149 case EXCEPTION_ILLEGAL_INSTRUCTION:
7393af7c 1150 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
a493e3e2 1151 ourstatus->value.sig = GDB_SIGNAL_ILL;
7393af7c
PM
1152 break;
1153 case EXCEPTION_PRIV_INSTRUCTION:
1154 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
a493e3e2 1155 ourstatus->value.sig = GDB_SIGNAL_ILL;
7393af7c
PM
1156 break;
1157 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1158 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
a493e3e2 1159 ourstatus->value.sig = GDB_SIGNAL_ILL;
8227c82d 1160 break;
1ef980b9 1161 default:
581e13c1 1162 /* Treat unhandled first chance exceptions specially. */
02e423b9 1163 if (current_event.u.Exception.dwFirstChance)
a244bdca 1164 return -1;
d50a0ce2
CV
1165 printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
1166 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
a74ce742
PM
1167 host_address_to_string (
1168 current_event.u.Exception.ExceptionRecord.ExceptionAddress));
a493e3e2 1169 ourstatus->value.sig = GDB_SIGNAL_UNKNOWN;
1ef980b9 1170 break;
24e60978 1171 }
24e60978 1172 exception_count++;
7393af7c 1173 last_sig = ourstatus->value.sig;
36339ecd 1174 return 1;
24e60978
SC
1175}
1176
3cee93ac 1177/* Resume all artificially suspended threads if we are continuing
581e13c1 1178 execution. */
3cee93ac 1179static BOOL
dc05df57 1180windows_continue (DWORD continue_status, int id)
3cee93ac
CF
1181{
1182 int i;
1183 thread_info *th;
1184 BOOL res;
1185
0c3d84be 1186 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n",
d50a0ce2
CV
1187 (unsigned) current_event.dwProcessId,
1188 (unsigned) current_event.dwThreadId,
dfe7f3ac 1189 continue_status == DBG_CONTINUE ?
7393af7c 1190 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
6537bb24
PA
1191
1192 for (th = &thread_head; (th = th->next) != NULL;)
1193 if ((id == -1 || id == (int) th->id)
1194 && th->suspended)
1195 {
1196 if (debug_registers_changed)
1197 {
1198 th->context.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
1199 th->context.Dr0 = dr[0];
1200 th->context.Dr1 = dr[1];
1201 th->context.Dr2 = dr[2];
1202 th->context.Dr3 = dr[3];
1203 th->context.Dr6 = DR6_CLEAR_VALUE;
1204 th->context.Dr7 = dr[7];
1205 }
1206 if (th->context.ContextFlags)
1207 {
1208 CHECK (SetThreadContext (th->h, &th->context));
1209 th->context.ContextFlags = 0;
1210 }
1211 if (th->suspended > 0)
1212 (void) ResumeThread (th->h);
1213 th->suspended = 0;
1214 }
1215
0714f9bf
SS
1216 res = ContinueDebugEvent (current_event.dwProcessId,
1217 current_event.dwThreadId,
1218 continue_status);
3cee93ac 1219
fa4ba8da 1220 debug_registers_changed = 0;
3cee93ac
CF
1221 return res;
1222}
1223
d6dc8049
CF
1224/* Called in pathological case where Windows fails to send a
1225 CREATE_PROCESS_DEBUG_EVENT after an attach. */
3ee6f623 1226static DWORD
5439edaa 1227fake_create_process (void)
3ade5333
CF
1228{
1229 current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1230 current_event.dwProcessId);
bf25528d
CF
1231 if (current_process_handle != NULL)
1232 open_process_used = 1;
1233 else
1234 {
d50a0ce2
CV
1235 error (_("OpenProcess call failed, GetLastError = %u"),
1236 (unsigned) GetLastError ());
bf25528d
CF
1237 /* We can not debug anything in that case. */
1238 }
3ade5333 1239 main_thread_id = current_event.dwThreadId;
711e434b
PM
1240 current_thread = windows_add_thread (
1241 ptid_build (current_event.dwProcessId, 0,
1242 current_event.dwThreadId),
1243 current_event.u.CreateThread.hThread,
1244 current_event.u.CreateThread.lpThreadLocalBase);
3ade5333
CF
1245 return main_thread_id;
1246}
1247
a244bdca 1248static void
28439f5e 1249windows_resume (struct target_ops *ops,
2ea28649 1250 ptid_t ptid, int step, enum gdb_signal sig)
a244bdca
CF
1251{
1252 thread_info *th;
1253 DWORD continue_status = DBG_CONTINUE;
1254
2dc38344
PA
1255 /* A specific PTID means `step only this thread id'. */
1256 int resume_all = ptid_equal (ptid, minus_one_ptid);
1257
1258 /* If we're continuing all threads, it's the current inferior that
1259 should be handled specially. */
1260 if (resume_all)
1261 ptid = inferior_ptid;
a244bdca 1262
a493e3e2 1263 if (sig != GDB_SIGNAL_0)
a244bdca
CF
1264 {
1265 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1266 {
1267 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1268 }
1269 else if (sig == last_sig)
1270 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1271 else
1272#if 0
1273/* This code does not seem to work, because
1274 the kernel does probably not consider changes in the ExceptionRecord
1275 structure when passing the exception to the inferior.
1276 Note that this seems possible in the exception handler itself. */
1277 {
1278 int i;
1279 for (i = 0; xlate[i].them != -1; i++)
1280 if (xlate[i].us == sig)
1281 {
581e13c1
MS
1282 current_event.u.Exception.ExceptionRecord.ExceptionCode
1283 = xlate[i].them;
a244bdca
CF
1284 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1285 break;
1286 }
1287 if (continue_status == DBG_CONTINUE)
1288 {
1289 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1290 }
1291 }
1292#endif
1293 DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1294 last_sig));
1295 }
1296
a493e3e2 1297 last_sig = GDB_SIGNAL_0;
a244bdca 1298
dc05df57 1299 DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=%ld, step=%d, sig=%d);\n",
2dc38344 1300 ptid_get_pid (ptid), ptid_get_tid (ptid), step, sig));
a244bdca 1301
581e13c1 1302 /* Get context for currently selected thread. */
2dc38344 1303 th = thread_rec (ptid_get_tid (inferior_ptid), FALSE);
a244bdca
CF
1304 if (th)
1305 {
1306 if (step)
1307 {
581e13c1 1308 /* Single step by setting t bit. */
a97b0ac8
UW
1309 struct regcache *regcache = get_current_regcache ();
1310 struct gdbarch *gdbarch = get_regcache_arch (regcache);
1311 windows_fetch_inferior_registers (ops, regcache,
1312 gdbarch_ps_regnum (gdbarch));
a244bdca
CF
1313 th->context.EFlags |= FLAG_TRACE_BIT;
1314 }
1315
1316 if (th->context.ContextFlags)
1317 {
1318 if (debug_registers_changed)
1319 {
1320 th->context.Dr0 = dr[0];
1321 th->context.Dr1 = dr[1];
1322 th->context.Dr2 = dr[2];
1323 th->context.Dr3 = dr[3];
6537bb24 1324 th->context.Dr6 = DR6_CLEAR_VALUE;
a244bdca
CF
1325 th->context.Dr7 = dr[7];
1326 }
1327 CHECK (SetThreadContext (th->h, &th->context));
1328 th->context.ContextFlags = 0;
1329 }
1330 }
1331
1332 /* Allow continuing with the same signal that interrupted us.
581e13c1 1333 Otherwise complain. */
a244bdca 1334
2dc38344 1335 if (resume_all)
dc05df57 1336 windows_continue (continue_status, -1);
2dc38344 1337 else
dc05df57 1338 windows_continue (continue_status, ptid_get_tid (ptid));
a244bdca
CF
1339}
1340
695de547
CF
1341/* Ctrl-C handler used when the inferior is not run in the same console. The
1342 handler is in charge of interrupting the inferior using DebugBreakProcess.
1343 Note that this function is not available prior to Windows XP. In this case
1344 we emit a warning. */
d603d4b3 1345static BOOL WINAPI
695de547
CF
1346ctrl_c_handler (DWORD event_type)
1347{
1348 const int attach_flag = current_inferior ()->attach_flag;
1349
bb0613a5
PM
1350 /* Only handle Ctrl-C and Ctrl-Break events. Ignore others. */
1351 if (event_type != CTRL_C_EVENT && event_type != CTRL_BREAK_EVENT)
695de547
CF
1352 return FALSE;
1353
1354 /* If the inferior and the debugger share the same console, do nothing as
1355 the inferior has also received the Ctrl-C event. */
1356 if (!new_console && !attach_flag)
1357 return TRUE;
1358
1359 if (!DebugBreakProcess (current_process_handle))
581e13c1
MS
1360 warning (_("Could not interrupt program. "
1361 "Press Ctrl-c in the program console."));
695de547
CF
1362
1363 /* Return true to tell that Ctrl-C has been handled. */
1364 return TRUE;
1365}
1366
8a892701 1367/* Get the next event from the child. Return 1 if the event requires
695de547 1368 handling by WFI (or whatever). */
1e37c281 1369static int
28439f5e
PA
1370get_windows_debug_event (struct target_ops *ops,
1371 int pid, struct target_waitstatus *ourstatus)
1e37c281
JM
1372{
1373 BOOL debug_event;
8a892701 1374 DWORD continue_status, event_code;
87a45c96 1375 thread_info *th;
8a892701 1376 static thread_info dummy_thread_info;
450005e7 1377 int retval = 0;
1e37c281 1378
a493e3e2 1379 last_sig = GDB_SIGNAL_0;
9d3789f7 1380
8a892701 1381 if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
29fe111d 1382 goto out;
1e37c281
JM
1383
1384 event_count++;
1385 continue_status = DBG_CONTINUE;
1e37c281 1386
8a892701 1387 event_code = current_event.dwDebugEventCode;
450005e7 1388 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
87a45c96 1389 th = NULL;
a244bdca 1390 have_saved_context = 0;
8a892701
CF
1391
1392 switch (event_code)
1e37c281
JM
1393 {
1394 case CREATE_THREAD_DEBUG_EVENT:
0c3d84be 1395 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1396 (unsigned) current_event.dwProcessId,
1397 (unsigned) current_event.dwThreadId,
1398 "CREATE_THREAD_DEBUG_EVENT"));
dfe7f3ac 1399 if (saw_create != 1)
3ade5333 1400 {
181e7f93
PA
1401 struct inferior *inf;
1402 inf = find_inferior_pid (current_event.dwProcessId);
1403 if (!saw_create && inf->attach_flag)
3ade5333 1404 {
d6dc8049
CF
1405 /* Kludge around a Windows bug where first event is a create
1406 thread event. Caused when attached process does not have
581e13c1 1407 a main thread. */
3a3e9ee3 1408 retval = fake_create_process ();
181e7f93
PA
1409 if (retval)
1410 saw_create++;
3ade5333
CF
1411 }
1412 break;
1413 }
581e13c1 1414 /* Record the existence of this thread. */
450005e7 1415 retval = current_event.dwThreadId;
dc05df57 1416 th = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
2dc38344 1417 current_event.dwThreadId),
711e434b
PM
1418 current_event.u.CreateThread.hThread,
1419 current_event.u.CreateThread.lpThreadLocalBase);
1420
1e37c281
JM
1421 break;
1422
1423 case EXIT_THREAD_DEBUG_EVENT:
0c3d84be 1424 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1425 (unsigned) current_event.dwProcessId,
1426 (unsigned) current_event.dwThreadId,
1427 "EXIT_THREAD_DEBUG_EVENT"));
b3c613f2 1428
87a45c96
CF
1429 if (current_event.dwThreadId != main_thread_id)
1430 {
dc05df57 1431 windows_delete_thread (ptid_build (current_event.dwProcessId, 0,
e0ea48a0
EZ
1432 current_event.dwThreadId),
1433 current_event.u.ExitThread.dwExitCode);
87a45c96
CF
1434 th = &dummy_thread_info;
1435 }
1e37c281
JM
1436 break;
1437
1438 case CREATE_PROCESS_DEBUG_EVENT:
0c3d84be 1439 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1440 (unsigned) current_event.dwProcessId,
1441 (unsigned) current_event.dwThreadId,
1442 "CREATE_PROCESS_DEBUG_EVENT"));
700b351b 1443 CloseHandle (current_event.u.CreateProcessInfo.hFile);
dfe7f3ac 1444 if (++saw_create != 1)
bf25528d 1445 break;
1e37c281 1446
dfe7f3ac 1447 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
87a45c96 1448 if (main_thread_id)
695de547 1449 windows_delete_thread (ptid_build (current_event.dwProcessId, 0,
e0ea48a0
EZ
1450 main_thread_id),
1451 0);
9d3789f7 1452 main_thread_id = current_event.dwThreadId;
581e13c1 1453 /* Add the main thread. */
dc05df57 1454 th = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
695de547 1455 current_event.dwThreadId),
711e434b
PM
1456 current_event.u.CreateProcessInfo.hThread,
1457 current_event.u.CreateProcessInfo.lpThreadLocalBase);
3a3e9ee3 1458 retval = current_event.dwThreadId;
1e37c281
JM
1459 break;
1460
1461 case EXIT_PROCESS_DEBUG_EVENT:
0c3d84be 1462 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1463 (unsigned) current_event.dwProcessId,
1464 (unsigned) current_event.dwThreadId,
1465 "EXIT_PROCESS_DEBUG_EVENT"));
16d905e2
CF
1466 if (!windows_initialization_done)
1467 {
1468 target_terminal_ours ();
1469 target_mourn_inferior ();
1470 error (_("During startup program exited with code 0x%x."),
1471 (unsigned int) current_event.u.ExitProcess.dwExitCode);
1472 }
1473 else if (saw_create == 1)
1474 {
1475 ourstatus->kind = TARGET_WAITKIND_EXITED;
1476 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1477 retval = main_thread_id;
1478 }
8a892701 1479 break;
1e37c281
JM
1480
1481 case LOAD_DLL_DEBUG_EVENT:
0c3d84be 1482 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1483 (unsigned) current_event.dwProcessId,
1484 (unsigned) current_event.dwThreadId,
1485 "LOAD_DLL_DEBUG_EVENT"));
700b351b 1486 CloseHandle (current_event.u.LoadDll.hFile);
ea39ad35 1487 if (saw_create != 1 || ! windows_initialization_done)
dfe7f3ac 1488 break;
8a892701 1489 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
450005e7
CF
1490 ourstatus->kind = TARGET_WAITKIND_LOADED;
1491 ourstatus->value.integer = 0;
9d3789f7 1492 retval = main_thread_id;
1e37c281
JM
1493 break;
1494
1495 case UNLOAD_DLL_DEBUG_EVENT:
0c3d84be 1496 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1497 (unsigned) current_event.dwProcessId,
1498 (unsigned) current_event.dwThreadId,
1499 "UNLOAD_DLL_DEBUG_EVENT"));
ea39ad35 1500 if (saw_create != 1 || ! windows_initialization_done)
dfe7f3ac 1501 break;
d3ff4a77 1502 catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
de1b3c3d
PA
1503 ourstatus->kind = TARGET_WAITKIND_LOADED;
1504 ourstatus->value.integer = 0;
1505 retval = main_thread_id;
d3ff4a77 1506 break;
1e37c281
JM
1507
1508 case EXCEPTION_DEBUG_EVENT:
0c3d84be 1509 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1510 (unsigned) current_event.dwProcessId,
1511 (unsigned) current_event.dwThreadId,
1512 "EXCEPTION_DEBUG_EVENT"));
dfe7f3ac
CF
1513 if (saw_create != 1)
1514 break;
a244bdca
CF
1515 switch (handle_exception (ourstatus))
1516 {
1517 case 0:
1518 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1519 break;
1520 case 1:
1521 retval = current_event.dwThreadId;
1522 break;
1523 case -1:
1524 last_sig = 1;
1525 continue_status = -1;
1526 break;
1527 }
1e37c281
JM
1528 break;
1529
581e13c1 1530 case OUTPUT_DEBUG_STRING_EVENT: /* Message from the kernel. */
0c3d84be 1531 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1532 (unsigned) current_event.dwProcessId,
1533 (unsigned) current_event.dwThreadId,
1534 "OUTPUT_DEBUG_STRING_EVENT"));
dfe7f3ac
CF
1535 if (saw_create != 1)
1536 break;
a244bdca 1537 retval = handle_output_debug_string (ourstatus);
1e37c281 1538 break;
9d3789f7 1539
1e37c281 1540 default:
dfe7f3ac
CF
1541 if (saw_create != 1)
1542 break;
0c3d84be 1543 printf_unfiltered ("gdb: kernel event for pid=%u tid=0x%x\n",
d50a0ce2
CV
1544 (unsigned) current_event.dwProcessId,
1545 (unsigned) current_event.dwThreadId);
1546 printf_unfiltered (" unknown event code %u\n",
1547 (unsigned) current_event.dwDebugEventCode);
1e37c281
JM
1548 break;
1549 }
1550
dfe7f3ac 1551 if (!retval || saw_create != 1)
a244bdca
CF
1552 {
1553 if (continue_status == -1)
02529b48 1554 windows_resume (ops, minus_one_ptid, 0, 1);
a244bdca 1555 else
dc05df57 1556 CHECK (windows_continue (continue_status, -1));
a244bdca 1557 }
450005e7 1558 else
9d3789f7 1559 {
2dc38344
PA
1560 inferior_ptid = ptid_build (current_event.dwProcessId, 0,
1561 retval);
3ade5333 1562 current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
9d3789f7 1563 }
1e37c281
JM
1564
1565out:
450005e7 1566 return retval;
1e37c281
JM
1567}
1568
2dc38344 1569/* Wait for interesting events to occur in the target process. */
39f77062 1570static ptid_t
117de6a9 1571windows_wait (struct target_ops *ops,
47608cb1 1572 ptid_t ptid, struct target_waitstatus *ourstatus, int options)
24e60978 1573{
2dc38344 1574 int pid = -1;
39f77062 1575
c44537cf
CV
1576 target_terminal_ours ();
1577
24e60978
SC
1578 /* We loop when we get a non-standard exception rather than return
1579 with a SPURIOUS because resume can try and step or modify things,
3cee93ac 1580 which needs a current_thread->h. But some of these exceptions mark
24e60978 1581 the birth or death of threads, which mean that the current thread
581e13c1 1582 isn't necessarily what you think it is. */
24e60978
SC
1583
1584 while (1)
450005e7 1585 {
c57918b2 1586 int retval;
2b008701 1587
695de547
CF
1588 /* If the user presses Ctrl-c while the debugger is waiting
1589 for an event, he expects the debugger to interrupt his program
1590 and to get the prompt back. There are two possible situations:
1591
1592 - The debugger and the program do not share the console, in
1593 which case the Ctrl-c event only reached the debugger.
1594 In that case, the ctrl_c handler will take care of interrupting
581e13c1
MS
1595 the inferior. Note that this case is working starting with
1596 Windows XP. For Windows 2000, Ctrl-C should be pressed in the
695de547
CF
1597 inferior console.
1598
1599 - The debugger and the program share the same console, in which
1600 case both debugger and inferior will receive the Ctrl-c event.
1601 In that case the ctrl_c handler will ignore the event, as the
1602 Ctrl-c event generated inside the inferior will trigger the
1603 expected debug event.
1604
1605 FIXME: brobecker/2008-05-20: If the inferior receives the
1606 signal first and the delay until GDB receives that signal
1607 is sufficiently long, GDB can sometimes receive the SIGINT
1608 after we have unblocked the CTRL+C handler. This would
1609 lead to the debugger stopping prematurely while handling
1610 the new-thread event that comes with the handling of the SIGINT
1611 inside the inferior, and then stop again immediately when
1612 the user tries to resume the execution in the inferior.
1613 This is a classic race that we should try to fix one day. */
1614 SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
28439f5e 1615 retval = get_windows_debug_event (ops, pid, ourstatus);
695de547 1616 SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
c57918b2 1617
450005e7 1618 if (retval)
2dc38344 1619 return ptid_build (current_event.dwProcessId, 0, retval);
450005e7
CF
1620 else
1621 {
1622 int detach = 0;
3cee93ac 1623
98bbd631
AC
1624 if (deprecated_ui_loop_hook != NULL)
1625 detach = deprecated_ui_loop_hook (0);
0714f9bf 1626
450005e7 1627 if (detach)
7d85a9c0 1628 windows_kill_inferior (ops);
450005e7
CF
1629 }
1630 }
24e60978
SC
1631}
1632
ea39ad35
JB
1633/* Iterate over all DLLs currently mapped by our inferior, and
1634 add them to our list of solibs. */
94481b8c
JB
1635
1636static void
ea39ad35 1637windows_add_all_dlls (void)
94481b8c
JB
1638{
1639 struct so_list *so;
1640 HMODULE dummy_hmodule;
1641 DWORD cb_needed;
1642 HMODULE *hmodules;
1643 int i;
1644
94481b8c
JB
1645 if (EnumProcessModules (current_process_handle, &dummy_hmodule,
1646 sizeof (HMODULE), &cb_needed) == 0)
1647 return;
1648
1649 if (cb_needed < 1)
1650 return;
1651
1652 hmodules = (HMODULE *) alloca (cb_needed);
1653 if (EnumProcessModules (current_process_handle, hmodules,
1654 cb_needed, &cb_needed) == 0)
1655 return;
1656
ea39ad35 1657 for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++)
94481b8c
JB
1658 {
1659 MODULEINFO mi;
774f74c2
PM
1660#ifdef __USEWIDE
1661 wchar_t dll_name[__PMAX];
1662 char name[__PMAX];
1663#else
94481b8c 1664 char dll_name[__PMAX];
774f74c2
PM
1665 char *name;
1666#endif
94481b8c
JB
1667 if (GetModuleInformation (current_process_handle, hmodules[i],
1668 &mi, sizeof (mi)) == 0)
1669 continue;
1670 if (GetModuleFileNameEx (current_process_handle, hmodules[i],
1671 dll_name, sizeof (dll_name)) == 0)
1672 continue;
774f74c2
PM
1673#ifdef __USEWIDE
1674 wcstombs (name, dll_name, __PMAX);
1675#else
1676 name = dll_name;
1677#endif
ea39ad35
JB
1678
1679 solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
1680 solib_end = solib_end->next;
94481b8c
JB
1681 }
1682}
1683
9d3789f7 1684static void
dc05df57 1685do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
9d3789f7
CF
1686{
1687 extern int stop_after_trap;
fa4ba8da 1688 int i;
d6b48e9c 1689 struct inferior *inf;
2020b7ab 1690 struct thread_info *tp;
9d3789f7 1691
a493e3e2 1692 last_sig = GDB_SIGNAL_0;
9d3789f7
CF
1693 event_count = 0;
1694 exception_count = 0;
bf25528d 1695 open_process_used = 0;
fa4ba8da 1696 debug_registers_changed = 0;
dfe7f3ac 1697 debug_registers_used = 0;
fa4ba8da
PM
1698 for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1699 dr[i] = 0;
10325bc5 1700#ifdef __CYGWIN__
de1b3c3d 1701 cygwin_load_start = cygwin_load_end = 0;
10325bc5 1702#endif
9d3789f7
CF
1703 current_event.dwProcessId = pid;
1704 memset (&current_event, 0, sizeof (current_event));
0795be10 1705 push_target (ops);
cb851954 1706 disable_breakpoints_in_shlibs ();
dc05df57 1707 windows_clear_solib ();
9d3789f7
CF
1708 clear_proceed_status ();
1709 init_wait_for_inferior ();
1710
6c95b8df
PA
1711 inf = current_inferior ();
1712 inferior_appeared (inf, pid);
181e7f93 1713 inf->attach_flag = attaching;
7f9f62ba 1714
9f9d052e
PM
1715 /* Make the new process the current inferior, so terminal handling
1716 can rely on it. When attaching, we don't know about any thread
1717 id here, but that's OK --- nothing should be referencing the
dc05df57 1718 current thread until we report an event out of windows_wait. */
9f9d052e
PM
1719 inferior_ptid = pid_to_ptid (pid);
1720
c44537cf 1721 terminal_init_inferior_with_pgrp (pid);
9d3789f7
CF
1722 target_terminal_inferior ();
1723
16d905e2 1724 windows_initialization_done = 0;
16c381f0 1725 inf->control.stop_soon = STOP_QUIETLY;
9d3789f7
CF
1726 while (1)
1727 {
1728 stop_after_trap = 1;
e4c8541f 1729 wait_for_inferior ();
2020b7ab 1730 tp = inferior_thread ();
a493e3e2 1731 if (tp->suspend.stop_signal != GDB_SIGNAL_TRAP)
16c381f0 1732 resume (0, tp->suspend.stop_signal);
9d3789f7
CF
1733 else
1734 break;
1735 }
eff8332b 1736
ea39ad35
JB
1737 /* Now that the inferior has been started and all DLLs have been mapped,
1738 we can iterate over all DLLs and load them in. */
1739 windows_add_all_dlls ();
94481b8c 1740
16d905e2 1741 windows_initialization_done = 1;
16c381f0 1742 inf->control.stop_soon = NO_STOP_QUIETLY;
9d3789f7
CF
1743 stop_after_trap = 0;
1744 return;
1745}
1746
616a9dc4
CV
1747/* Try to set or remove a user privilege to the current process. Return -1
1748 if that fails, the previous setting of that privilege otherwise.
1749
1750 This code is copied from the Cygwin source code and rearranged to allow
1751 dynamically loading of the needed symbols from advapi32 which is only
581e13c1 1752 available on NT/2K/XP. */
616a9dc4
CV
1753static int
1754set_process_privilege (const char *privilege, BOOL enable)
1755{
616a9dc4
CV
1756 HANDLE token_hdl = NULL;
1757 LUID restore_priv;
1758 TOKEN_PRIVILEGES new_priv, orig_priv;
1759 int ret = -1;
1760 DWORD size;
1761
616a9dc4
CV
1762 if (!OpenProcessToken (GetCurrentProcess (),
1763 TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1764 &token_hdl))
1765 goto out;
1766
418c6cb3 1767 if (!LookupPrivilegeValueA (NULL, privilege, &restore_priv))
616a9dc4
CV
1768 goto out;
1769
1770 new_priv.PrivilegeCount = 1;
1771 new_priv.Privileges[0].Luid = restore_priv;
1772 new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1773
1774 if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
295732ea 1775 sizeof orig_priv, &orig_priv, &size))
616a9dc4
CV
1776 goto out;
1777#if 0
1778 /* Disabled, otherwise every `attach' in an unprivileged user session
1779 would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
581e13c1 1780 windows_attach(). */
616a9dc4 1781 /* AdjustTokenPrivileges returns TRUE even if the privilege could not
581e13c1 1782 be enabled. GetLastError () returns an correct error code, though. */
616a9dc4
CV
1783 if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1784 goto out;
1785#endif
1786
1787 ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1788
1789out:
1790 if (token_hdl)
1791 CloseHandle (token_hdl);
1792
1793 return ret;
1794}
1795
02cc9f49 1796/* Attach to process PID, then initialize for debugging it. */
24e60978 1797static void
dc05df57 1798windows_attach (struct target_ops *ops, char *args, int from_tty)
24e60978
SC
1799{
1800 BOOL ok;
559e75c0 1801 DWORD pid;
24e60978 1802
74164c56 1803 pid = parse_pid_to_attach (args);
24e60978 1804
616a9dc4
CV
1805 if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1806 {
1807 printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
581e13c1
MS
1808 printf_unfiltered ("This can cause attach to "
1809 "fail on Windows NT/2K/XP\n");
616a9dc4
CV
1810 }
1811
dc05df57 1812 windows_init_thread_list ();
9d3789f7 1813 ok = DebugActiveProcess (pid);
91a175b3 1814 saw_create = 0;
24e60978 1815
10325bc5 1816#ifdef __CYGWIN__
24e60978 1817 if (!ok)
baa93fa6 1818 {
581e13c1 1819 /* Try fall back to Cygwin pid. */
baa93fa6
CF
1820 pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1821
1822 if (pid > 0)
1823 ok = DebugActiveProcess (pid);
10325bc5
PA
1824 }
1825#endif
baa93fa6 1826
10325bc5
PA
1827 if (!ok)
1828 error (_("Can't attach to process."));
24e60978 1829
2b008701 1830 DebugSetProcessKillOnExit (FALSE);
3ade5333 1831
24e60978
SC
1832 if (from_tty)
1833 {
1834 char *exec_file = (char *) get_exec_file (0);
1835
1836 if (exec_file)
1837 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
39f77062 1838 target_pid_to_str (pid_to_ptid (pid)));
24e60978
SC
1839 else
1840 printf_unfiltered ("Attaching to %s\n",
39f77062 1841 target_pid_to_str (pid_to_ptid (pid)));
24e60978
SC
1842
1843 gdb_flush (gdb_stdout);
1844 }
1845
dc05df57 1846 do_initial_windows_stuff (ops, pid, 1);
9d3789f7 1847 target_terminal_ours ();
24e60978
SC
1848}
1849
24e60978 1850static void
52554a0e 1851windows_detach (struct target_ops *ops, const char *args, int from_tty)
24e60978 1852{
02cc9f49
CV
1853 int detached = 1;
1854
2b008701 1855 ptid_t ptid = {-1};
a493e3e2 1856 windows_resume (ops, ptid, 0, GDB_SIGNAL_0);
96998ce7 1857
2b008701
CF
1858 if (!DebugActiveProcessStop (current_event.dwProcessId))
1859 {
d50a0ce2
CV
1860 error (_("Can't detach process %u (error %u)"),
1861 (unsigned) current_event.dwProcessId, (unsigned) GetLastError ());
2b008701 1862 detached = 0;
02cc9f49 1863 }
2b008701
CF
1864 DebugSetProcessKillOnExit (FALSE);
1865
02cc9f49 1866 if (detached && from_tty)
24e60978
SC
1867 {
1868 char *exec_file = get_exec_file (0);
1869 if (exec_file == 0)
1870 exec_file = "";
d50a0ce2
CV
1871 printf_unfiltered ("Detaching from program: %s, Pid %u\n", exec_file,
1872 (unsigned) current_event.dwProcessId);
24e60978
SC
1873 gdb_flush (gdb_stdout);
1874 }
7f9f62ba 1875
26cb8b7c 1876 i386_cleanup_dregs ();
39f77062 1877 inferior_ptid = null_ptid;
7f9f62ba
PA
1878 detach_inferior (current_event.dwProcessId);
1879
0795be10 1880 unpush_target (ops);
24e60978
SC
1881}
1882
47f7ffdb
JB
1883/* Try to determine the executable filename.
1884
1885 EXE_NAME_RET is a pointer to a buffer whose size is EXE_NAME_MAX_LEN.
1886
1887 Upon success, the filename is stored inside EXE_NAME_RET, and
1888 this function returns nonzero.
1889
1890 Otherwise, this function returns zero and the contents of
1891 EXE_NAME_RET is undefined. */
1892
1893static int
1894windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len)
1895{
1896 DWORD len;
1897 HMODULE dh_buf;
1898 DWORD cbNeeded;
1899
1900 cbNeeded = 0;
1901 if (!EnumProcessModules (current_process_handle, &dh_buf,
1902 sizeof (HMODULE), &cbNeeded) || !cbNeeded)
1903 return 0;
1904
1905 /* We know the executable is always first in the list of modules,
1906 which we just fetched. So no need to fetch more. */
1907
1908#ifdef __CYGWIN__
1909 {
1910 /* Cygwin prefers that the path be in /x/y/z format, so extract
1911 the filename into a temporary buffer first, and then convert it
1912 to POSIX format into the destination buffer. */
1913 cygwin_buf_t *pathbuf = alloca (exe_name_max_len * sizeof (cygwin_buf_t));
1914
1915 len = GetModuleFileNameEx (current_process_handle,
1916 dh_buf, pathbuf, exe_name_max_len);
1917 if (len == 0)
1918 error (_("Error getting executable filename: %u."),
1919 (unsigned) GetLastError ());
1920 if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, exe_name_ret,
1921 exe_name_max_len) < 0)
1922 error (_("Error converting executable filename to POSIX: %d."), errno);
1923 }
1924#else
1925 len = GetModuleFileNameEx (current_process_handle,
1926 dh_buf, exe_name_ret, exe_name_max_len);
1927 if (len == 0)
1928 error (_("Error getting executable filename: %u."),
1929 (unsigned) GetLastError ());
1930#endif
1931
1932 return 1; /* success */
1933}
1934
1935/* The pid_to_exec_file target_ops method for this platform. */
1936
3ee6f623 1937static char *
8dd27370 1938windows_pid_to_exec_file (struct target_ops *self, int pid)
47216e51 1939{
b3c613f2 1940 static char path[__PMAX];
10325bc5 1941#ifdef __CYGWIN__
581e13c1 1942 /* Try to find exe name as symlink target of /proc/<pid>/exe. */
33605d39
CF
1943 int nchars;
1944 char procexe[sizeof ("/proc/4294967295/exe")];
08850b56
PM
1945
1946 xsnprintf (procexe, sizeof (procexe), "/proc/%u/exe", pid);
33605d39
CF
1947 nchars = readlink (procexe, path, sizeof(path));
1948 if (nchars > 0 && nchars < sizeof (path))
47216e51 1949 {
33605d39
CF
1950 path[nchars] = '\0'; /* Got it */
1951 return path;
47216e51 1952 }
10325bc5
PA
1953#endif
1954
33605d39 1955 /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
581e13c1 1956 of gdb, or we're trying to debug a non-Cygwin windows executable. */
47f7ffdb 1957 if (!windows_get_exec_module_filename (path, sizeof (path)))
33605d39
CF
1958 path[0] = '\0';
1959
1960 return path;
47216e51
CV
1961}
1962
24e60978
SC
1963/* Print status information about what we're accessing. */
1964
1965static void
dc05df57 1966windows_files_info (struct target_ops *ignore)
24e60978 1967{
181e7f93
PA
1968 struct inferior *inf = current_inferior ();
1969
24e60978 1970 printf_unfiltered ("\tUsing the running image of %s %s.\n",
181e7f93
PA
1971 inf->attach_flag ? "attached" : "child",
1972 target_pid_to_str (inferior_ptid));
24e60978
SC
1973}
1974
24e60978 1975static void
dc05df57 1976windows_open (char *arg, int from_tty)
24e60978 1977{
8a3fe4f8 1978 error (_("Use the \"run\" command to start a Unix child process."));
24e60978
SC
1979}
1980
cd44747c
PM
1981/* Modify CreateProcess parameters for use of a new separate console.
1982 Parameters are:
1983 *FLAGS: DWORD parameter for general process creation flags.
1984 *SI: STARTUPINFO structure, for which the console window size and
1985 console buffer size is filled in if GDB is running in a console.
1986 to create the new console.
1987 The size of the used font is not available on all versions of
1988 Windows OS. Furthermore, the current font might not be the default
1989 font, but this is still better than before.
1990 If the windows and buffer sizes are computed,
1991 SI->DWFLAGS is changed so that this information is used
1992 by CreateProcess function. */
1993
1994static void
1995windows_set_console_info (STARTUPINFO *si, DWORD *flags)
1996{
1997 HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
1998 FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
1999
2000 if (hconsole != INVALID_HANDLE_VALUE)
2001 {
2002 CONSOLE_SCREEN_BUFFER_INFO sbinfo;
2003 COORD font_size;
2004 CONSOLE_FONT_INFO cfi;
2005
2006 GetCurrentConsoleFont (hconsole, FALSE, &cfi);
2007 font_size = GetConsoleFontSize (hconsole, cfi.nFont);
2008 GetConsoleScreenBufferInfo(hconsole, &sbinfo);
2009 si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1;
2010 si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1;
2011 if (font_size.X)
2012 si->dwXSize *= font_size.X;
2013 else
2014 si->dwXSize *= 8;
2015 if (font_size.Y)
2016 si->dwYSize *= font_size.Y;
2017 else
2018 si->dwYSize *= 12;
2019 si->dwXCountChars = sbinfo.dwSize.X;
2020 si->dwYCountChars = sbinfo.dwSize.Y;
2021 si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS;
2022 }
2023 *flags |= CREATE_NEW_CONSOLE;
2024}
2025
c93dbcba
EZ
2026#ifndef __CYGWIN__
2027/* Function called by qsort to sort environment strings. */
2028
2029static int
2030envvar_cmp (const void *a, const void *b)
2031{
2032 const char **p = (const char **) a;
2033 const char **q = (const char **) b;
2034 return strcasecmp (*p, *q);
2035}
2036#endif
2037
b7ff339d
CV
2038#ifdef __CYGWIN__
2039static void
2040clear_win32_environment (char **env)
2041{
2042 int i;
2043 size_t len;
2044 wchar_t *copy = NULL, *equalpos;
2045
2046 for (i = 0; env[i] && *env[i]; i++)
2047 {
2048 len = mbstowcs (NULL, env[i], 0) + 1;
2049 copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t));
2050 mbstowcs (copy, env[i], len);
2051 equalpos = wcschr (copy, L'=');
2052 if (equalpos)
2053 *equalpos = L'\0';
2054 SetEnvironmentVariableW (copy, NULL);
2055 }
2056 xfree (copy);
2057}
2058#endif
2059
dc05df57 2060/* Start an inferior windows child process and sets inferior_ptid to its pid.
24e60978
SC
2061 EXEC_FILE is the file to run.
2062 ALLARGS is a string containing the arguments to the program.
2063 ENV is the environment vector to pass. Errors reported with error(). */
2064
24e60978 2065static void
dc05df57 2066windows_create_inferior (struct target_ops *ops, char *exec_file,
136d6dae 2067 char *allargs, char **in_env, int from_tty)
24e60978 2068{
b3c613f2 2069 STARTUPINFO si;
41b4aadc 2070#ifdef __CYGWIN__
b3c613f2
CF
2071 cygwin_buf_t real_path[__PMAX];
2072 cygwin_buf_t shell[__PMAX]; /* Path to shell */
d0d0ab16 2073 const char *sh;
b3c613f2
CF
2074 cygwin_buf_t *toexec;
2075 cygwin_buf_t *cygallargs;
2076 cygwin_buf_t *args;
b7ff339d
CV
2077 char **old_env = NULL;
2078 PWCHAR w32_env;
d0d0ab16 2079 size_t len;
2becadee
CF
2080 int tty;
2081 int ostdin, ostdout, ostderr;
41b4aadc 2082#else
b3c613f2
CF
2083 char real_path[__PMAX];
2084 char shell[__PMAX]; /* Path to shell */
d0d0ab16
CV
2085 char *toexec;
2086 char *args;
8f205f9c 2087 size_t args_len;
41b4aadc 2088 HANDLE tty;
c93dbcba
EZ
2089 char *w32env;
2090 char *temp;
2091 size_t envlen;
2092 int i;
2093 size_t envsize;
2094 char **env;
41b4aadc 2095#endif
d0d0ab16
CV
2096 PROCESS_INFORMATION pi;
2097 BOOL ret;
2098 DWORD flags = 0;
3cb3b8df 2099 const char *inferior_io_terminal = get_inferior_io_terminal ();
24e60978
SC
2100
2101 if (!exec_file)
8a3fe4f8 2102 error (_("No executable specified, use `target exec'."));
24e60978
SC
2103
2104 memset (&si, 0, sizeof (si));
2105 si.cb = sizeof (si);
2106
d0d0ab16
CV
2107 if (new_group)
2108 flags |= CREATE_NEW_PROCESS_GROUP;
2109
2110 if (new_console)
cd44747c 2111 windows_set_console_info (&si, &flags);
d0d0ab16 2112
10325bc5 2113#ifdef __CYGWIN__
349b409f 2114 if (!useshell)
dfe7f3ac 2115 {
d0d0ab16
CV
2116 flags |= DEBUG_ONLY_THIS_PROCESS;
2117 if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, exec_file, real_path,
b3c613f2 2118 __PMAX * sizeof (cygwin_buf_t)) < 0)
d0d0ab16 2119 error (_("Error starting executable: %d"), errno);
dfe7f3ac 2120 toexec = real_path;
b3c613f2 2121#ifdef __USEWIDE
d0d0ab16
CV
2122 len = mbstowcs (NULL, allargs, 0) + 1;
2123 if (len == (size_t) -1)
2124 error (_("Error starting executable: %d"), errno);
2125 cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2126 mbstowcs (cygallargs, allargs, len);
60c5c021
CF
2127#else
2128 cygallargs = allargs;
b3c613f2 2129#endif
dfe7f3ac
CF
2130 }
2131 else
2132 {
349b409f
CF
2133 sh = getenv ("SHELL");
2134 if (!sh)
2135 sh = "/bin/sh";
b3c613f2 2136 if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
d0d0ab16 2137 error (_("Error starting executable via shell: %d"), errno);
b3c613f2 2138#ifdef __USEWIDE
d0d0ab16
CV
2139 len = sizeof (L" -c 'exec '") + mbstowcs (NULL, exec_file, 0)
2140 + mbstowcs (NULL, allargs, 0) + 2;
2141 cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2142 swprintf (cygallargs, len, L" -c 'exec %s %s'", exec_file, allargs);
b3c613f2 2143#else
08850b56
PM
2144 len = (sizeof (" -c 'exec '") + strlen (exec_file)
2145 + strlen (allargs) + 2);
2146 cygallargs = (char *) alloca (len);
2147 xsnprintf (cygallargs, len, " -c 'exec %s %s'", exec_file, allargs);
b3c613f2 2148#endif
dfe7f3ac 2149 toexec = shell;
d0d0ab16 2150 flags |= DEBUG_PROCESS;
dfe7f3ac 2151 }
b3c613f2
CF
2152
2153#ifdef __USEWIDE
2154 args = (cygwin_buf_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
2155 * sizeof (wchar_t));
d0d0ab16
CV
2156 wcscpy (args, toexec);
2157 wcscat (args, L" ");
2158 wcscat (args, cygallargs);
b3c613f2
CF
2159#else
2160 args = (cygwin_buf_t *) alloca (strlen (toexec) + strlen (cygallargs) + 2);
2161 strcpy (args, toexec);
2162 strcat (args, " ");
2163 strcat (args, cygallargs);
2164#endif
2165
b7ff339d
CV
2166#ifdef CW_CVT_ENV_TO_WINENV
2167 /* First try to create a direct Win32 copy of the POSIX environment. */
2168 w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env);
2169 if (w32_env != (PWCHAR) -1)
2170 flags |= CREATE_UNICODE_ENVIRONMENT;
2171 else
2172 /* If that fails, fall back to old method tweaking GDB's environment. */
2173#endif
2174 {
2175 /* Reset all Win32 environment variables to avoid leftover on next run. */
2176 clear_win32_environment (environ);
2177 /* Prepare the environment vars for CreateProcess. */
2178 old_env = environ;
2179 environ = in_env;
2180 cygwin_internal (CW_SYNC_WINENV);
2181 w32_env = NULL;
2182 }
1750a5ef 2183
2becadee
CF
2184 if (!inferior_io_terminal)
2185 tty = ostdin = ostdout = ostderr = -1;
2186 else
2187 {
2188 tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
2189 if (tty < 0)
2190 {
2191 print_sys_errmsg (inferior_io_terminal, errno);
2192 ostdin = ostdout = ostderr = -1;
2193 }
2194 else
2195 {
2196 ostdin = dup (0);
2197 ostdout = dup (1);
2198 ostderr = dup (2);
2199 dup2 (tty, 0);
2200 dup2 (tty, 1);
2201 dup2 (tty, 2);
2202 }
2203 }
d0d0ab16
CV
2204
2205 windows_init_thread_list ();
b3c613f2
CF
2206 ret = CreateProcess (0,
2207 args, /* command line */
2208 NULL, /* Security */
2209 NULL, /* thread */
2210 TRUE, /* inherit handles */
2211 flags, /* start flags */
b7ff339d 2212 w32_env, /* environment */
b3c613f2
CF
2213 NULL, /* current directory */
2214 &si,
2215 &pi);
b7ff339d
CV
2216 if (w32_env)
2217 /* Just free the Win32 environment, if it could be created. */
2218 free (w32_env);
2219 else
2220 {
2221 /* Reset all environment variables to avoid leftover on next run. */
2222 clear_win32_environment (in_env);
2223 /* Restore normal GDB environment variables. */
2224 environ = old_env;
2225 cygwin_internal (CW_SYNC_WINENV);
2226 }
2227
d0d0ab16
CV
2228 if (tty >= 0)
2229 {
2230 close (tty);
2231 dup2 (ostdin, 0);
2232 dup2 (ostdout, 1);
2233 dup2 (ostderr, 2);
2234 close (ostdin);
2235 close (ostdout);
2236 close (ostderr);
2237 }
41b4aadc 2238#else
b3c613f2 2239 toexec = exec_file;
8f205f9c
JB
2240 /* Build the command line, a space-separated list of tokens where
2241 the first token is the name of the module to be executed.
2242 To avoid ambiguities introduced by spaces in the module name,
2243 we quote it. */
2244 args_len = strlen (toexec) + 2 /* quotes */ + strlen (allargs) + 2;
2245 args = alloca (args_len);
2246 xsnprintf (args, args_len, "\"%s\" %s", toexec, allargs);
d0d0ab16 2247
d0d0ab16
CV
2248 flags |= DEBUG_ONLY_THIS_PROCESS;
2249
41b4aadc
CF
2250 if (!inferior_io_terminal)
2251 tty = INVALID_HANDLE_VALUE;
2252 else
2253 {
2254 SECURITY_ATTRIBUTES sa;
2255 sa.nLength = sizeof(sa);
2256 sa.lpSecurityDescriptor = 0;
2257 sa.bInheritHandle = TRUE;
2258 tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
2259 0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
2260 if (tty == INVALID_HANDLE_VALUE)
2261 warning (_("Warning: Failed to open TTY %s, error %#x."),
2262 inferior_io_terminal, (unsigned) GetLastError ());
2263 else
2264 {
2265 si.hStdInput = tty;
2266 si.hStdOutput = tty;
2267 si.hStdError = tty;
2268 si.dwFlags |= STARTF_USESTDHANDLES;
2269 }
2270 }
2becadee 2271
c93dbcba
EZ
2272 /* CreateProcess takes the environment list as a null terminated set of
2273 strings (i.e. two nulls terminate the list). */
2274
2275 /* Get total size for env strings. */
2276 for (envlen = 0, i = 0; in_env[i] && *in_env[i]; i++)
2277 envlen += strlen (in_env[i]) + 1;
2278
2279 envsize = sizeof (in_env[0]) * (i + 1);
2280 env = (char **) alloca (envsize);
2281 memcpy (env, in_env, envsize);
2282 /* Windows programs expect the environment block to be sorted. */
2283 qsort (env, i, sizeof (char *), envvar_cmp);
2284
2285 w32env = alloca (envlen + 1);
2286
2287 /* Copy env strings into new buffer. */
2288 for (temp = w32env, i = 0; env[i] && *env[i]; i++)
2289 {
2290 strcpy (temp, env[i]);
2291 temp += strlen (temp) + 1;
2292 }
2293
2294 /* Final nil string to terminate new env. */
2295 *temp = 0;
2296
dc05df57 2297 windows_init_thread_list ();
d0d0ab16
CV
2298 ret = CreateProcessA (0,
2299 args, /* command line */
2300 NULL, /* Security */
2301 NULL, /* thread */
2302 TRUE, /* inherit handles */
2303 flags, /* start flags */
c93dbcba 2304 w32env, /* environment */
d0d0ab16
CV
2305 NULL, /* current directory */
2306 &si,
2307 &pi);
41b4aadc
CF
2308 if (tty != INVALID_HANDLE_VALUE)
2309 CloseHandle (tty);
10325bc5 2310#endif
2becadee 2311
24e60978 2312 if (!ret)
d50a0ce2 2313 error (_("Error creating process %s, (error %u)."),
8a3fe4f8 2314 exec_file, (unsigned) GetLastError ());
24e60978 2315
c1766e7d
PM
2316 CloseHandle (pi.hThread);
2317 CloseHandle (pi.hProcess);
2318
dfe7f3ac
CF
2319 if (useshell && shell[0] != '\0')
2320 saw_create = -1;
2321 else
2322 saw_create = 0;
2323
dc05df57 2324 do_initial_windows_stuff (ops, pi.dwProcessId, 0);
d3a09475 2325
dc05df57 2326 /* windows_continue (DBG_CONTINUE, -1); */
24e60978
SC
2327}
2328
2329static void
dc05df57 2330windows_mourn_inferior (struct target_ops *ops)
24e60978 2331{
dc05df57 2332 (void) windows_continue (DBG_CONTINUE, -1);
fa4ba8da 2333 i386_cleanup_dregs();
bf25528d
CF
2334 if (open_process_used)
2335 {
2336 CHECK (CloseHandle (current_process_handle));
2337 open_process_used = 0;
2338 }
0795be10 2339 unpush_target (ops);
24e60978
SC
2340 generic_mourn_inferior ();
2341}
2342
24e60978 2343/* Send a SIGINT to the process group. This acts just like the user typed a
581e13c1 2344 ^C on the controlling terminal. */
24e60978 2345
b607efe7 2346static void
1eab8a48 2347windows_stop (struct target_ops *self, ptid_t ptid)
24e60978 2348{
1ef980b9 2349 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1e37c281 2350 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
3a4b77d8 2351 registers_changed (); /* refresh register state */
24e60978
SC
2352}
2353
44f38867
PA
2354/* Helper for windows_xfer_partial that handles memory transfers.
2355 Arguments are like target_xfer_partial. */
2356
9b409511 2357static enum target_xfer_status
44f38867 2358windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
9b409511 2359 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
24e60978 2360{
5732a500 2361 SIZE_T done = 0;
44f38867 2362 BOOL success;
9e52adf9 2363 DWORD lasterror = 0;
44f38867
PA
2364
2365 if (writebuf != NULL)
24e60978 2366 {
a2388568 2367 DEBUG_MEM (("gdb: write target memory, %s bytes at %s\n",
b55e14c7 2368 pulongest (len), core_addr_to_string (memaddr)));
44f38867
PA
2369 success = WriteProcessMemory (current_process_handle,
2370 (LPVOID) (uintptr_t) memaddr, writebuf,
2371 len, &done);
9e52adf9 2372 if (!success)
7126d5c8 2373 lasterror = GetLastError ();
2b008701 2374 FlushInstructionCache (current_process_handle,
2c647436 2375 (LPCVOID) (uintptr_t) memaddr, len);
24e60978
SC
2376 }
2377 else
2378 {
a2388568 2379 DEBUG_MEM (("gdb: read target memory, %s bytes at %s\n",
b55e14c7 2380 pulongest (len), core_addr_to_string (memaddr)));
44f38867
PA
2381 success = ReadProcessMemory (current_process_handle,
2382 (LPCVOID) (uintptr_t) memaddr, readbuf,
2383 len, &done);
9e52adf9 2384 if (!success)
7126d5c8 2385 lasterror = GetLastError ();
24e60978 2386 }
9b409511 2387 *xfered_len = (ULONGEST) done;
9e52adf9 2388 if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
9b409511 2389 return TARGET_XFER_OK;
9e52adf9 2390 else
9b409511 2391 return success ? TARGET_XFER_OK : TARGET_XFER_E_IO;
24e60978
SC
2392}
2393
3ee6f623 2394static void
7d85a9c0 2395windows_kill_inferior (struct target_ops *ops)
24e60978 2396{
3cee93ac
CF
2397 CHECK (TerminateProcess (current_process_handle, 0));
2398
b5edcb45
ILT
2399 for (;;)
2400 {
dc05df57 2401 if (!windows_continue (DBG_CONTINUE, -1))
b5edcb45 2402 break;
3cee93ac 2403 if (!WaitForDebugEvent (&current_event, INFINITE))
b5edcb45 2404 break;
3cee93ac 2405 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
b5edcb45
ILT
2406 break;
2407 }
2408
581e13c1 2409 target_mourn_inferior (); /* Or just windows_mourn_inferior? */
24e60978
SC
2410}
2411
24e60978 2412static void
f32dbf8c 2413windows_prepare_to_store (struct target_ops *self, struct regcache *regcache)
24e60978 2414{
581e13c1 2415 /* Do nothing, since we can store individual regs. */
24e60978
SC
2416}
2417
2418static int
da82bd6b 2419windows_can_run (struct target_ops *self)
24e60978
SC
2420{
2421 return 1;
2422}
2423
2424static void
de90e03d 2425windows_close (struct target_ops *self)
24e60978 2426{
dc05df57 2427 DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
dfd4cc63 2428 ptid_get_pid (inferior_ptid)));
24e60978 2429}
1ef980b9 2430
581e13c1 2431/* Convert pid to printable format. */
3ee6f623 2432static char *
117de6a9 2433windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
24e60978 2434{
3ee6f623 2435 static char buf[80];
3ee6f623 2436
2dc38344
PA
2437 if (ptid_get_tid (ptid) != 0)
2438 {
2439 snprintf (buf, sizeof (buf), "Thread %d.0x%lx",
2440 ptid_get_pid (ptid), ptid_get_tid (ptid));
2441 return buf;
2442 }
2443
2444 return normal_pid_to_str (ptid);
3ee6f623
CF
2445}
2446
9b409511 2447static enum target_xfer_status
dc05df57 2448windows_xfer_shared_libraries (struct target_ops *ops,
9b409511
YQ
2449 enum target_object object, const char *annex,
2450 gdb_byte *readbuf, const gdb_byte *writebuf,
2451 ULONGEST offset, ULONGEST len,
2452 ULONGEST *xfered_len)
3cb8e7f6 2453{
de1b3c3d
PA
2454 struct obstack obstack;
2455 const char *buf;
2456 LONGEST len_avail;
3cb8e7f6 2457 struct so_list *so;
3cb8e7f6 2458
de1b3c3d 2459 if (writebuf)
2ed4b548 2460 return TARGET_XFER_E_IO;
3cb8e7f6 2461
de1b3c3d
PA
2462 obstack_init (&obstack);
2463 obstack_grow_str (&obstack, "<library-list>\n");
2464 for (so = solib_start.next; so; so = so->next)
581e13c1
MS
2465 windows_xfer_shared_library (so->so_name, (CORE_ADDR)
2466 (uintptr_t) so->lm_info->load_addr,
f5656ead 2467 target_gdbarch (), &obstack);
de1b3c3d 2468 obstack_grow_str0 (&obstack, "</library-list>\n");
3cb8e7f6 2469
de1b3c3d
PA
2470 buf = obstack_finish (&obstack);
2471 len_avail = strlen (buf);
2472 if (offset >= len_avail)
49dc7f4b
PM
2473 len= 0;
2474 else
2475 {
2476 if (len > len_avail - offset)
2477 len = len_avail - offset;
2478 memcpy (readbuf, buf + offset, len);
2479 }
3cb8e7f6 2480
de1b3c3d 2481 obstack_free (&obstack, NULL);
9b409511
YQ
2482 *xfered_len = (ULONGEST) len;
2483 return TARGET_XFER_OK;
3cb8e7f6
CF
2484}
2485
9b409511 2486static enum target_xfer_status
dc05df57 2487windows_xfer_partial (struct target_ops *ops, enum target_object object,
9b409511
YQ
2488 const char *annex, gdb_byte *readbuf,
2489 const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
2490 ULONGEST *xfered_len)
3cb8e7f6 2491{
de1b3c3d 2492 switch (object)
3cb8e7f6 2493 {
de1b3c3d 2494 case TARGET_OBJECT_MEMORY:
9b409511 2495 return windows_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
de1b3c3d
PA
2496
2497 case TARGET_OBJECT_LIBRARIES:
dc05df57 2498 return windows_xfer_shared_libraries (ops, object, annex, readbuf,
9b409511 2499 writebuf, offset, len, xfered_len);
3929abe9 2500
de1b3c3d
PA
2501 default:
2502 if (ops->beneath != NULL)
2503 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
9b409511
YQ
2504 readbuf, writebuf, offset, len,
2505 xfered_len);
2ed4b548 2506 return TARGET_XFER_E_IO;
3929abe9 2507 }
02c5aecd
CF
2508}
2509
711e434b
PM
2510/* Provide thread local base, i.e. Thread Information Block address.
2511 Returns 1 if ptid is found and sets *ADDR to thread_local_base. */
2512
2513static int
bd7ae0f5
TT
2514windows_get_tib_address (struct target_ops *self,
2515 ptid_t ptid, CORE_ADDR *addr)
711e434b
PM
2516{
2517 thread_info *th;
2518
2519 th = thread_rec (ptid_get_tid (ptid), 0);
2520 if (th == NULL)
2521 return 0;
2522
2523 if (addr != NULL)
2524 *addr = th->thread_local_base;
2525
2526 return 1;
2527}
2528
1e2f1c5c 2529static ptid_t
1e6b91a4 2530windows_get_ada_task_ptid (struct target_ops *self, long lwp, long thread)
1e2f1c5c
JB
2531{
2532 return ptid_build (ptid_get_pid (inferior_ptid), 0, lwp);
2533}
2534
3ee6f623 2535static void
dc05df57 2536init_windows_ops (void)
3ee6f623 2537{
dc05df57
CF
2538 windows_ops.to_shortname = "child";
2539 windows_ops.to_longname = "Win32 child process";
2540 windows_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2541 windows_ops.to_open = windows_open;
2542 windows_ops.to_close = windows_close;
2543 windows_ops.to_attach = windows_attach;
2544 windows_ops.to_attach_no_wait = 1;
2545 windows_ops.to_detach = windows_detach;
2546 windows_ops.to_resume = windows_resume;
2547 windows_ops.to_wait = windows_wait;
2548 windows_ops.to_fetch_registers = windows_fetch_inferior_registers;
2549 windows_ops.to_store_registers = windows_store_inferior_registers;
2550 windows_ops.to_prepare_to_store = windows_prepare_to_store;
dc05df57
CF
2551 windows_ops.to_xfer_partial = windows_xfer_partial;
2552 windows_ops.to_files_info = windows_files_info;
2553 windows_ops.to_insert_breakpoint = memory_insert_breakpoint;
2554 windows_ops.to_remove_breakpoint = memory_remove_breakpoint;
2555 windows_ops.to_terminal_init = terminal_init_inferior;
2556 windows_ops.to_terminal_inferior = terminal_inferior;
2557 windows_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2558 windows_ops.to_terminal_ours = terminal_ours;
2559 windows_ops.to_terminal_save_ours = terminal_save_ours;
2560 windows_ops.to_terminal_info = child_terminal_info;
2561 windows_ops.to_kill = windows_kill_inferior;
2562 windows_ops.to_create_inferior = windows_create_inferior;
2563 windows_ops.to_mourn_inferior = windows_mourn_inferior;
2564 windows_ops.to_can_run = windows_can_run;
2565 windows_ops.to_thread_alive = windows_thread_alive;
2566 windows_ops.to_pid_to_str = windows_pid_to_str;
2567 windows_ops.to_stop = windows_stop;
2568 windows_ops.to_stratum = process_stratum;
c35b1492
PA
2569 windows_ops.to_has_all_memory = default_child_has_all_memory;
2570 windows_ops.to_has_memory = default_child_has_memory;
2571 windows_ops.to_has_stack = default_child_has_stack;
2572 windows_ops.to_has_registers = default_child_has_registers;
2573 windows_ops.to_has_execution = default_child_has_execution;
dc05df57 2574 windows_ops.to_pid_to_exec_file = windows_pid_to_exec_file;
1e2f1c5c 2575 windows_ops.to_get_ada_task_ptid = windows_get_ada_task_ptid;
711e434b 2576 windows_ops.to_get_tib_address = windows_get_tib_address;
9bb9e8ad 2577
5aca5a82
PM
2578 i386_use_watchpoints (&windows_ops);
2579
9bb9e8ad
PM
2580 i386_dr_low.set_control = cygwin_set_dr7;
2581 i386_dr_low.set_addr = cygwin_set_dr;
7b50312a 2582 i386_dr_low.get_addr = cygwin_get_dr;
9bb9e8ad 2583 i386_dr_low.get_status = cygwin_get_dr6;
7b50312a 2584 i386_dr_low.get_control = cygwin_get_dr7;
9bb9e8ad
PM
2585
2586 /* i386_dr_low.debug_register_length field is set by
2587 calling i386_set_debug_register_length function
2588 in processor windows specific native file. */
2589
dc05df57 2590 windows_ops.to_magic = OPS_MAGIC;
c719b714 2591}
24e60978 2592
3929abe9 2593static void
dc05df57 2594set_windows_aliases (char *argv0)
3929abe9
CF
2595{
2596 add_info_alias ("dll", "sharedlibrary", 1);
2597}
2598
d603d4b3
JK
2599/* -Wmissing-prototypes */
2600extern initialize_file_ftype _initialize_windows_nat;
2601
24e60978 2602void
dc05df57 2603_initialize_windows_nat (void)
24e60978 2604{
fa58ee11
EZ
2605 struct cmd_list_element *c;
2606
dc05df57 2607 init_windows_ops ();
1ef980b9 2608
d0d0ab16
CV
2609#ifdef __CYGWIN__
2610 cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);
2611#endif
2612
fa58ee11 2613 c = add_com ("dll-symbols", class_files, dll_symbol_command,
1bedd215 2614 _("Load dll library symbols from FILE."));
5ba2abeb 2615 set_cmd_completer (c, filename_completer);
95060284 2616 deprecate_cmd (c, "sharedlibrary");
450005e7 2617
95060284
JB
2618 c = add_com ("add-shared-symbol-files", class_files, dll_symbol_command,
2619 _("Load dll library symbols from FILE."));
2620 set_cmd_completer (c, filename_completer);
2621 deprecate_cmd (c, "sharedlibrary");
70992597 2622
95060284
JB
2623 c = add_com ("assf", class_files, dll_symbol_command,
2624 _("Load dll library symbols from FILE."));
2625 set_cmd_completer (c, filename_completer);
2626 deprecate_cmd (c, "sharedlibrary");
70992597 2627
10325bc5 2628#ifdef __CYGWIN__
5bf193a2
AC
2629 add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2630Set use of shell to start subprocess."), _("\
2631Show use of shell to start subprocess."), NULL,
2632 NULL,
2633 NULL, /* FIXME: i18n: */
2634 &setlist, &showlist);
2635
581e13c1
MS
2636 add_setshow_boolean_cmd ("cygwin-exceptions", class_support,
2637 &cygwin_exceptions, _("\
09280ddf
CF
2638Break when an exception is detected in the Cygwin DLL itself."), _("\
2639Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2640 NULL,
2641 NULL, /* FIXME: i18n: */
2642 &setlist, &showlist);
10325bc5 2643#endif
09280ddf 2644
5bf193a2
AC
2645 add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2646Set creation of new console when creating child process."), _("\
2647Show creation of new console when creating child process."), NULL,
2648 NULL,
2649 NULL, /* FIXME: i18n: */
2650 &setlist, &showlist);
2651
2652 add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2653Set creation of new group when creating child process."), _("\
2654Show creation of new group when creating child process."), NULL,
2655 NULL,
2656 NULL, /* FIXME: i18n: */
2657 &setlist, &showlist);
2658
2659 add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2660Set whether to display execution in child process."), _("\
2661Show whether to display execution in child process."), NULL,
2662 NULL,
2663 NULL, /* FIXME: i18n: */
2664 &setlist, &showlist);
2665
2666 add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2667Set whether to display kernel events in child process."), _("\
2668Show whether to display kernel events in child process."), NULL,
2669 NULL,
2670 NULL, /* FIXME: i18n: */
2671 &setlist, &showlist);
2672
2673 add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2674Set whether to display memory accesses in child process."), _("\
2675Show whether to display memory accesses in child process."), NULL,
2676 NULL,
2677 NULL, /* FIXME: i18n: */
2678 &setlist, &showlist);
2679
2680 add_setshow_boolean_cmd ("debugexceptions", class_support,
2681 &debug_exceptions, _("\
2682Set whether to display kernel exceptions in child process."), _("\
2683Show whether to display kernel exceptions in child process."), NULL,
2684 NULL,
2685 NULL, /* FIXME: i18n: */
2686 &setlist, &showlist);
1ef980b9 2687
711e434b 2688 init_w32_command_list ();
c1748f97
PM
2689
2690 add_cmd ("selector", class_info, display_selectors,
1a966eab 2691 _("Display selectors infos."),
c1748f97 2692 &info_w32_cmdlist);
dc05df57
CF
2693 add_target (&windows_ops);
2694 deprecated_init_ui_hook = set_windows_aliases;
24e60978 2695}
3cee93ac 2696
fa4ba8da
PM
2697/* Hardware watchpoint support, adapted from go32-nat.c code. */
2698
2699/* Pass the address ADDR to the inferior in the I'th debug register.
2700 Here we just store the address in dr array, the registers will be
dc05df57 2701 actually set up when windows_continue is called. */
9bb9e8ad 2702static void
fa4ba8da
PM
2703cygwin_set_dr (int i, CORE_ADDR addr)
2704{
2705 if (i < 0 || i > 3)
2706 internal_error (__FILE__, __LINE__,
e2e0b3e5 2707 _("Invalid register %d in cygwin_set_dr.\n"), i);
41b4aadc 2708 dr[i] = addr;
fa4ba8da
PM
2709 debug_registers_changed = 1;
2710 debug_registers_used = 1;
2711}
2712
2713/* Pass the value VAL to the inferior in the DR7 debug control
2714 register. Here we just store the address in D_REGS, the watchpoint
dc05df57 2715 will be actually set up in windows_wait. */
9bb9e8ad
PM
2716static void
2717cygwin_set_dr7 (unsigned long val)
fa4ba8da 2718{
9bb9e8ad 2719 dr[7] = (CORE_ADDR) val;
fa4ba8da
PM
2720 debug_registers_changed = 1;
2721 debug_registers_used = 1;
2722}
2723
7b50312a
PA
2724/* Get the value of debug register I from the inferior. */
2725
2726static CORE_ADDR
2727cygwin_get_dr (int i)
2728{
2729 return dr[i];
2730}
2731
fa4ba8da
PM
2732/* Get the value of the DR6 debug status register from the inferior.
2733 Here we just return the value stored in dr[6]
2734 by the last call to thread_rec for current_event.dwThreadId id. */
9bb9e8ad 2735static unsigned long
fa4ba8da
PM
2736cygwin_get_dr6 (void)
2737{
9bb9e8ad 2738 return (unsigned long) dr[6];
fa4ba8da
PM
2739}
2740
7b50312a
PA
2741/* Get the value of the DR7 debug status register from the inferior.
2742 Here we just return the value stored in dr[7] by the last call to
2743 thread_rec for current_event.dwThreadId id. */
2744
2745static unsigned long
2746cygwin_get_dr7 (void)
2747{
2748 return (unsigned long) dr[7];
2749}
2750
2dc38344 2751/* Determine if the thread referenced by "ptid" is alive
3cee93ac 2752 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
581e13c1 2753 it means that the thread has died. Otherwise it is assumed to be alive. */
3cee93ac 2754static int
28439f5e 2755windows_thread_alive (struct target_ops *ops, ptid_t ptid)
3cee93ac 2756{
2dc38344
PA
2757 int tid;
2758
2759 gdb_assert (ptid_get_tid (ptid) != 0);
2760 tid = ptid_get_tid (ptid);
39f77062 2761
581e13c1
MS
2762 return WaitForSingleObject (thread_rec (tid, FALSE)->h, 0) == WAIT_OBJECT_0
2763 ? FALSE : TRUE;
3cee93ac
CF
2764}
2765
d603d4b3
JK
2766/* -Wmissing-prototypes */
2767extern initialize_file_ftype _initialize_check_for_gdb_ini;
2768
2a3d5645
CF
2769void
2770_initialize_check_for_gdb_ini (void)
2771{
2772 char *homedir;
2773 if (inhibit_gdbinit)
2774 return;
2775
2776 homedir = getenv ("HOME");
2777 if (homedir)
2778 {
2779 char *p;
2780 char *oldini = (char *) alloca (strlen (homedir) +
2781 sizeof ("/gdb.ini"));
2782 strcpy (oldini, homedir);
2783 p = strchr (oldini, '\0');
0ba1096a 2784 if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
2a3d5645
CF
2785 *p++ = '/';
2786 strcpy (p, "gdb.ini");
2787 if (access (oldini, 0) == 0)
2788 {
2789 int len = strlen (oldini);
2790 char *newini = alloca (len + 1);
08850b56
PM
2791
2792 xsnprintf (newini, len + 1, "%.*s.gdbinit",
2793 (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
8a3fe4f8 2794 warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2a3d5645
CF
2795 }
2796 }
2797}
33605d39 2798
2b008701 2799/* Define dummy functions which always return error for the rare cases where
581e13c1 2800 these functions could not be found. */
2b008701
CF
2801static BOOL WINAPI
2802bad_DebugActiveProcessStop (DWORD w)
2803{
2804 return FALSE;
2805}
2806static BOOL WINAPI
2807bad_DebugBreakProcess (HANDLE w)
2808{
2809 return FALSE;
2810}
2811static BOOL WINAPI
2812bad_DebugSetProcessKillOnExit (BOOL w)
2813{
2814 return FALSE;
2815}
2816static BOOL WINAPI
2817bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
2818{
2819 return FALSE;
2820}
b3c613f2
CF
2821
2822#ifdef __USEWIDE
2b008701 2823static DWORD WINAPI
b3c613f2 2824bad_GetModuleFileNameExW (HANDLE w, HMODULE x, LPWSTR y, DWORD z)
2b008701
CF
2825{
2826 return 0;
2827}
d0d0ab16
CV
2828#else
2829static DWORD WINAPI
b3c613f2 2830bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
d0d0ab16
CV
2831{
2832 return 0;
2833}
2834#endif
b3c613f2 2835
2b008701
CF
2836static BOOL WINAPI
2837bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
2838{
2839 return FALSE;
2840}
2841
418c6cb3
CF
2842static BOOL WINAPI
2843bad_OpenProcessToken (HANDLE w, DWORD x, PHANDLE y)
2844{
2845 return FALSE;
2846}
2847
cd44747c
PM
2848static BOOL WINAPI
2849bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f)
2850{
2851 f->nFont = 0;
2852 return 1;
2853}
2854static COORD WINAPI
2855bad_GetConsoleFontSize (HANDLE w, DWORD nFont)
2856{
2857 COORD size;
2858 size.X = 8;
2859 size.Y = 12;
2860 return size;
2861}
2862
d603d4b3
JK
2863/* -Wmissing-prototypes */
2864extern initialize_file_ftype _initialize_loadable;
2865
2b008701 2866/* Load any functions which may not be available in ancient versions
581e13c1 2867 of Windows. */
d603d4b3 2868
33605d39 2869void
2b008701 2870_initialize_loadable (void)
33605d39 2871{
2b008701
CF
2872 HMODULE hm = NULL;
2873
2874 hm = LoadLibrary ("kernel32.dll");
2875 if (hm)
33605d39 2876 {
b3c613f2 2877 DebugActiveProcessStop = (void *)
2b008701 2878 GetProcAddress (hm, "DebugActiveProcessStop");
b3c613f2 2879 DebugBreakProcess = (void *)
2b008701 2880 GetProcAddress (hm, "DebugBreakProcess");
b3c613f2 2881 DebugSetProcessKillOnExit = (void *)
2b008701 2882 GetProcAddress (hm, "DebugSetProcessKillOnExit");
cd44747c
PM
2883 GetConsoleFontSize = (void *)
2884 GetProcAddress (hm, "GetConsoleFontSize");
2885 GetCurrentConsoleFont = (void *)
2886 GetProcAddress (hm, "GetCurrentConsoleFont");
2b008701 2887 }
33605d39 2888
2b008701 2889 /* Set variables to dummy versions of these processes if the function
581e13c1 2890 wasn't found in kernel32.dll. */
b3c613f2
CF
2891 if (!DebugBreakProcess)
2892 DebugBreakProcess = bad_DebugBreakProcess;
2893 if (!DebugActiveProcessStop || !DebugSetProcessKillOnExit)
2b008701 2894 {
b3c613f2
CF
2895 DebugActiveProcessStop = bad_DebugActiveProcessStop;
2896 DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
2b008701 2897 }
cd44747c
PM
2898 if (!GetConsoleFontSize)
2899 GetConsoleFontSize = bad_GetConsoleFontSize;
2900 if (!GetCurrentConsoleFont)
2901 GetCurrentConsoleFont = bad_GetCurrentConsoleFont;
33605d39 2902
2b008701 2903 /* Load optional functions used for retrieving filename information
581e13c1 2904 associated with the currently debugged process or its dlls. */
2b008701
CF
2905 hm = LoadLibrary ("psapi.dll");
2906 if (hm)
2907 {
b3c613f2 2908 EnumProcessModules = (void *)
2b008701 2909 GetProcAddress (hm, "EnumProcessModules");
b3c613f2 2910 GetModuleInformation = (void *)
2b008701 2911 GetProcAddress (hm, "GetModuleInformation");
b3c613f2
CF
2912 GetModuleFileNameEx = (void *)
2913 GetProcAddress (hm, GetModuleFileNameEx_name);
33605d39
CF
2914 }
2915
b3c613f2 2916 if (!EnumProcessModules || !GetModuleInformation || !GetModuleFileNameEx)
2b008701
CF
2917 {
2918 /* Set variables to dummy versions of these processes if the function
581e13c1 2919 wasn't found in psapi.dll. */
b3c613f2
CF
2920 EnumProcessModules = bad_EnumProcessModules;
2921 GetModuleInformation = bad_GetModuleInformation;
2922 GetModuleFileNameEx = bad_GetModuleFileNameEx;
581e13c1
MS
2923 /* This will probably fail on Windows 9x/Me. Let the user know
2924 that we're missing some functionality. */
2925 warning(_("\
2926cannot automatically find executable file or library to read symbols.\n\
2927Use \"file\" or \"dll\" command to load executable/libraries directly."));
418c6cb3
CF
2928 }
2929
2930 hm = LoadLibrary ("advapi32.dll");
2931 if (hm)
2932 {
b3c613f2
CF
2933 OpenProcessToken = (void *) GetProcAddress (hm, "OpenProcessToken");
2934 LookupPrivilegeValueA = (void *)
418c6cb3 2935 GetProcAddress (hm, "LookupPrivilegeValueA");
b3c613f2 2936 AdjustTokenPrivileges = (void *)
418c6cb3
CF
2937 GetProcAddress (hm, "AdjustTokenPrivileges");
2938 /* Only need to set one of these since if OpenProcessToken fails nothing
581e13c1
MS
2939 else is needed. */
2940 if (!OpenProcessToken || !LookupPrivilegeValueA
2941 || !AdjustTokenPrivileges)
b3c613f2 2942 OpenProcessToken = bad_OpenProcessToken;
2b008701 2943 }
33605d39 2944}
This page took 1.835357 seconds and 4 git commands to generate.