]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/wince.c
2001-01-16 Michael Snyder <msnyder@cleaver.cygnus.com>
[thirdparty/binutils-gdb.git] / gdb / wince.c
1 /* Target-vector operations for controlling Windows CE child processes, for GDB.
2 Copyright 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions, A Red Hat Company.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21 */
22
23 /* by Christopher Faylor (cgf@cygnus.com) */
24
25 /* We assume we're being built with and will be used for cygwin. */
26
27 #ifdef SHx
28 #undef SH4
29 #define SH4 /* Just to get all of the CONTEXT defines. */
30 #endif
31
32 #include "defs.h"
33 #include "frame.h" /* required by inferior.h */
34 #include "inferior.h"
35 #include "target.h"
36 #include "gdbcore.h"
37 #include "command.h"
38 #include <signal.h>
39 #include <sys/types.h>
40 #include <fcntl.h>
41 #include <stdlib.h>
42
43 #include <windows.h>
44 #include <rapi.h>
45 #include <netdb.h>
46 #include <cygwin/in.h>
47 #include <cygwin/socket.h>
48
49 #include "buildsym.h"
50 #include "symfile.h"
51 #include "objfiles.h"
52 #include "gdb_string.h"
53 #include "gdbthread.h"
54 #include "gdbcmd.h"
55 #include <sys/param.h>
56 #include "wince-stub.h"
57 #include <time.h>
58
59 /* The ui's event loop. */
60 extern int (*ui_loop_hook) (int signo);
61
62 /* If we're not using the old Cygwin header file set, define the
63 following which never should have been in the generic Win32 API
64 headers in the first place since they were our own invention... */
65 #ifndef _GNU_H_WINDOWS_H
66 #define FLAG_TRACE_BIT 0x100
67 #ifdef CONTEXT_FLOATING_POINT
68 #define CONTEXT_DEBUGGER0 (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
69 #else
70 #define CONTEXT_DEBUGGER0 (CONTEXT_FULL)
71 #endif
72 #endif
73
74 #ifdef SH4
75 #define CONTEXT_DEBUGGER ((CONTEXT_DEBUGGER0 & ~(CONTEXT_SH4 | CONTEXT_FLOATING_POINT)) | CONTEXT_SH3)
76 #else
77 #define CONTEXT_DEBUGGER CONTEXT_DEBUGGER0
78 #endif
79 /* The string sent by cygwin when it processes a signal.
80 FIXME: This should be in a cygwin include file. */
81 #define CYGWIN_SIGNAL_STRING "cygwin: signal"
82
83 #define CHECK(x) check (x, __FILE__,__LINE__)
84 #define DEBUG_EXEC(x) if (debug_exec) printf x
85 #define DEBUG_EVENTS(x) if (debug_events) printf x
86 #define DEBUG_MEM(x) if (debug_memory) printf x
87 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf x
88
89 static int connection_initialized = 0; /* True if we've initialized a RAPI session. */
90
91 /* The directory where the stub and executable files are uploaded. */
92 static const char *remote_directory = "\\gdb";
93
94 /* The types automatic upload available. */
95 static enum
96 {
97 UPLOAD_ALWAYS = 0,
98 UPLOAD_NEWER = 1,
99 UPLOAD_NEVER = 2
100 }
101 upload_when = UPLOAD_NEWER;
102
103 /* Valid options for 'set remoteupload'. Note that options
104 must track upload_when enum. */
105 static struct opts
106 {
107 const char *name;
108 int abbrev;
109 }
110 upload_options[3] =
111 {
112 {
113 "always", 1
114 }
115 ,
116 {
117 "newer", 3
118 }
119 ,
120 {
121 "never", 3
122 }
123 };
124
125 static char *remote_upload = NULL; /* Set by set remoteupload */
126 static int remote_add_host = 0;
127
128 /* Forward declaration */
129 extern struct target_ops child_ops;
130
131 static int win32_child_thread_alive (int);
132 void child_kill_inferior (void);
133
134 static int last_sig = 0; /* Set if a signal was received from the
135 debugged process */
136
137 /* Thread information structure used to track information that is
138 not available in gdb's thread structure. */
139 typedef struct thread_info_struct
140 {
141 struct thread_info_struct *next;
142 DWORD id;
143 HANDLE h;
144 char *name;
145 int suspend_count;
146 int stepped; /* True if stepped. */
147 CORE_ADDR step_pc;
148 unsigned long step_prev;
149 CONTEXT context;
150 }
151 thread_info;
152
153 static thread_info thread_head =
154 {NULL};
155 static thread_info * thread_rec (DWORD id, int get_context);
156
157 /* The process and thread handles for the above context. */
158
159 static DEBUG_EVENT current_event; /* The current debug event from
160 WaitForDebugEvent */
161 static HANDLE current_process_handle; /* Currently executing process */
162 static thread_info *current_thread; /* Info on currently selected thread */
163 static thread_info *this_thread; /* Info on thread returned by wait_for_debug_event */
164 static DWORD main_thread_id; /* Thread ID of the main thread */
165
166 /* Counts of things. */
167 static int exception_count = 0;
168 static int event_count = 0;
169
170 /* User options. */
171 static int debug_exec = 0; /* show execution */
172 static int debug_events = 0; /* show events from kernel */
173 static int debug_memory = 0; /* show target memory accesses */
174 static int debug_exceptions = 0; /* show target exceptions */
175
176 /* An array of offset mappings into a Win32 Context structure.
177 This is a one-to-one mapping which is indexed by gdb's register
178 numbers. It retrieves an offset into the context structure where
179 the 4 byte register is located.
180 An offset value of -1 indicates that Win32 does not provide this
181 register in it's CONTEXT structure. regptr will return zero for this
182 register.
183
184 This is used by the regptr function. */
185 #define context_offset(x) ((int)&(((PCONTEXT)NULL)->x))
186 static const int mappings[NUM_REGS + 1] =
187 {
188 #ifdef __i386__
189 context_offset (Eax),
190 context_offset (Ecx),
191 context_offset (Edx),
192 context_offset (Ebx),
193 context_offset (Esp),
194 context_offset (Ebp),
195 context_offset (Esi),
196 context_offset (Edi),
197 context_offset (Eip),
198 context_offset (EFlags),
199 context_offset (SegCs),
200 context_offset (SegSs),
201 context_offset (SegDs),
202 context_offset (SegEs),
203 context_offset (SegFs),
204 context_offset (SegGs),
205 context_offset (FloatSave.RegisterArea[0 * 10]),
206 context_offset (FloatSave.RegisterArea[1 * 10]),
207 context_offset (FloatSave.RegisterArea[2 * 10]),
208 context_offset (FloatSave.RegisterArea[3 * 10]),
209 context_offset (FloatSave.RegisterArea[4 * 10]),
210 context_offset (FloatSave.RegisterArea[5 * 10]),
211 context_offset (FloatSave.RegisterArea[6 * 10]),
212 context_offset (FloatSave.RegisterArea[7 * 10]),
213 #elif defined(SHx)
214 context_offset (R0),
215 context_offset (R1),
216 context_offset (R2),
217 context_offset (R3),
218 context_offset (R4),
219 context_offset (R5),
220 context_offset (R6),
221 context_offset (R7),
222 context_offset (R8),
223 context_offset (R9),
224 context_offset (R10),
225 context_offset (R11),
226 context_offset (R12),
227 context_offset (R13),
228 context_offset (R14),
229 context_offset (R15),
230 context_offset (Fir),
231 context_offset (PR), /* Procedure Register */
232 context_offset (GBR), /* Global Base Register */
233 context_offset (MACH), /* Accumulate */
234 context_offset (MACL), /* Multiply */
235 context_offset (Psr),
236 context_offset (Fpul),
237 context_offset (Fpscr),
238 context_offset (FRegs[0]),
239 context_offset (FRegs[1]),
240 context_offset (FRegs[2]),
241 context_offset (FRegs[3]),
242 context_offset (FRegs[4]),
243 context_offset (FRegs[5]),
244 context_offset (FRegs[6]),
245 context_offset (FRegs[7]),
246 context_offset (FRegs[8]),
247 context_offset (FRegs[9]),
248 context_offset (FRegs[10]),
249 context_offset (FRegs[11]),
250 context_offset (FRegs[12]),
251 context_offset (FRegs[13]),
252 context_offset (FRegs[14]),
253 context_offset (FRegs[15]),
254 context_offset (xFRegs[0]),
255 context_offset (xFRegs[1]),
256 context_offset (xFRegs[2]),
257 context_offset (xFRegs[3]),
258 context_offset (xFRegs[4]),
259 context_offset (xFRegs[5]),
260 context_offset (xFRegs[6]),
261 context_offset (xFRegs[7]),
262 context_offset (xFRegs[8]),
263 context_offset (xFRegs[9]),
264 context_offset (xFRegs[10]),
265 context_offset (xFRegs[11]),
266 context_offset (xFRegs[12]),
267 context_offset (xFRegs[13]),
268 context_offset (xFRegs[14]),
269 context_offset (xFRegs[15]),
270 #elif defined(MIPS)
271 context_offset (IntZero),
272 context_offset (IntAt),
273 context_offset (IntV0),
274 context_offset (IntV1),
275 context_offset (IntA0),
276 context_offset (IntA1),
277 context_offset (IntA2),
278 context_offset (IntA3),
279 context_offset (IntT0),
280 context_offset (IntT1),
281 context_offset (IntT2),
282 context_offset (IntT3),
283 context_offset (IntT4),
284 context_offset (IntT5),
285 context_offset (IntT6),
286 context_offset (IntT7),
287 context_offset (IntS0),
288 context_offset (IntS1),
289 context_offset (IntS2),
290 context_offset (IntS3),
291 context_offset (IntS4),
292 context_offset (IntS5),
293 context_offset (IntS6),
294 context_offset (IntS7),
295 context_offset (IntT8),
296 context_offset (IntT9),
297 context_offset (IntK0),
298 context_offset (IntK1),
299 context_offset (IntGp),
300 context_offset (IntSp),
301 context_offset (IntS8),
302 context_offset (IntRa),
303 context_offset (Psr),
304 context_offset (IntLo),
305 context_offset (IntHi),
306 -1, /* bad */
307 -1, /* cause */
308 context_offset (Fir),
309 context_offset (FltF0),
310 context_offset (FltF1),
311 context_offset (FltF2),
312 context_offset (FltF3),
313 context_offset (FltF4),
314 context_offset (FltF5),
315 context_offset (FltF6),
316 context_offset (FltF7),
317 context_offset (FltF8),
318 context_offset (FltF9),
319 context_offset (FltF10),
320 context_offset (FltF11),
321 context_offset (FltF12),
322 context_offset (FltF13),
323 context_offset (FltF14),
324 context_offset (FltF15),
325 context_offset (FltF16),
326 context_offset (FltF17),
327 context_offset (FltF18),
328 context_offset (FltF19),
329 context_offset (FltF20),
330 context_offset (FltF21),
331 context_offset (FltF22),
332 context_offset (FltF23),
333 context_offset (FltF24),
334 context_offset (FltF25),
335 context_offset (FltF26),
336 context_offset (FltF27),
337 context_offset (FltF28),
338 context_offset (FltF29),
339 context_offset (FltF30),
340 context_offset (FltF31),
341 context_offset (Fsr),
342 context_offset (Fir),
343 -1, /* fp */
344 #elif defined(ARM)
345 context_offset (R0),
346 context_offset (R1),
347 context_offset (R2),
348 context_offset (R3),
349 context_offset (R4),
350 context_offset (R5),
351 context_offset (R6),
352 context_offset (R7),
353 context_offset (R8),
354 context_offset (R9),
355 context_offset (R10),
356 context_offset (R11),
357 context_offset (R12),
358 context_offset (Sp),
359 context_offset (Lr),
360 context_offset (Pc),
361 -1,
362 -1,
363 -1,
364 -1,
365 -1,
366 -1,
367 -1,
368 -1,
369 -1,
370 context_offset (Psr),
371 #endif
372 -1
373 };
374
375 /* Return a pointer into a CONTEXT field indexed by gdb register number.
376 Return a pointer to an address pointing to zero if there is no
377 corresponding CONTEXT field for the given register number.
378 */
379 static ULONG *
380 regptr (LPCONTEXT c, int r)
381 {
382 static ULONG zero = 0;
383 ULONG *p;
384 if (mappings[r] < 0)
385 p = &zero;
386 else
387 p = (ULONG *) (((char *) c) + mappings[r]);
388 return p;
389 }
390
391 /******************** Beginning of stub interface ********************/
392
393 /* Stub interface description:
394
395 The Windows CE stub implements a crude RPC. The hand-held device
396 connects to gdb using port 7000. gdb and the stub then communicate
397 using packets where:
398
399 byte 0: command id (e.g. Create Process)
400
401 byte 1-4: DWORD
402
403 byte 1-2: WORD
404
405 byte 1-2: length
406 byte 3-n: arbitrary memory.
407
408 The interface is deterministic, i.e., if the stub expects a DWORD then
409 the gdb server should send a DWORD.
410 */
411
412 /* Note: In the functions below, the `huh' parameter is a string passed from the
413 function containing a descriptive string concerning the current operation.
414 This is used for error reporting.
415
416 The 'what' parameter is a command id as found in wince-stub.h.
417
418 Hopefully, the rest of the parameters are self-explanatory.
419 */
420
421 static int s; /* communication socket */
422
423 /* v-style interface for handling varying argyment list error messages.
424 Displays the error message in a dialog box and exits when user clicks
425 on OK. */
426 static void
427 vstub_error (LPCSTR fmt, va_list * args)
428 {
429 char buf[4096];
430 vsprintf (buf, fmt, args);
431 s = -1;
432 error ("%s", buf);
433 }
434
435 /* The standard way to display an error message and exit. */
436 static void
437 stub_error (LPCSTR fmt,...)
438 {
439 va_list args;
440 va_start (args, fmt);
441 vstub_error (fmt, args);
442 }
443
444 /* Standard "oh well" can't communicate error. Someday this might attempt
445 synchronization. */
446 static void
447 attempt_resync (LPCSTR huh, int s)
448 {
449 stub_error ("lost synchronization with target attempting %s", huh);
450 }
451
452 /* Read arbitrary stuff from a socket. */
453 static int
454 sockread (LPCSTR huh, int s, void *str, size_t n)
455 {
456 for (;;)
457 {
458 if (recv (s, str, n, 0) == n)
459 return n;
460 attempt_resync (huh, s);
461 }
462 }
463
464 /* Write arbitrary stuff to a socket. */
465 static int
466 sockwrite (LPCSTR huh, const void *str, size_t n)
467 {
468 for (;;)
469 {
470 if (send (s, str, n, 0) == n)
471 return n;
472 attempt_resync (huh, s);
473 }
474 }
475
476 /* Output an id/dword to the host */
477 static void
478 putdword (LPCSTR huh, gdb_wince_id what, DWORD n)
479 {
480 if (sockwrite (huh, &what, sizeof (what)) != sizeof (what))
481 stub_error ("error writing record id to host for %s", huh);
482 if (sockwrite (huh, &n, sizeof (n)) != sizeof (n))
483 stub_error ("error writing %s to host.", huh);
484 }
485
486 /* Output an id/word to the host */
487 static void
488 putword (LPCSTR huh, gdb_wince_id what, WORD n)
489 {
490 if (sockwrite (huh, &what, sizeof (what)) != sizeof (what))
491 stub_error ("error writing record id to host for %s", huh);
492 if (sockwrite (huh, &n, sizeof (n)) != sizeof (n))
493 stub_error ("error writing %s host.", huh);
494 }
495
496 /* Convenience define for outputting a "gdb_wince_len" type. */
497 #define putlen(huh, what, n) putword((huh), (what), (gdb_wince_len) (n))
498
499 /* Put an arbitrary block of memory to the gdb host. This comes in
500 two chunks an id/dword representing the length and the stream of memory
501 itself. */
502 static void
503 putmemory (LPCSTR huh, gdb_wince_id what, const void *mem, gdb_wince_len len)
504 {
505 putlen (huh, what, len);
506 if (((short) len > 0) && sockwrite (huh, mem, len) != len)
507 stub_error ("error writing %s to host.", huh);
508 }
509
510 /* Output the result of an operation to the host. If res != 0, sends a block of
511 memory starting at mem of len bytes. If res == 0, sends -GetLastError () and
512 avoids sending the mem. */
513 static DWORD
514 getdword (LPCSTR huh, gdb_wince_id what_this)
515 {
516 DWORD n;
517 gdb_wince_id what;
518 do
519 if (sockread (huh, s, &what, sizeof (what)) != sizeof (what))
520 stub_error ("error getting record type from host - %s.", huh);
521 while (what_this != what);
522
523 if (sockread (huh, s, &n, sizeof (n)) != sizeof (n))
524 stub_error ("error getting %s from host.", huh);
525
526 return n;
527 }
528
529 /* Get a an ID (possibly) and a WORD from the host gdb.
530 Don't bother with the id if the main loop has already
531 read it. */
532 static WORD
533 getword (LPCSTR huh, gdb_wince_id what_this)
534 {
535 WORD n;
536 gdb_wince_id what;
537 do
538 if (sockread (huh, s, &what, sizeof (what)) != sizeof (what))
539 stub_error ("error getting record type from host - %s.", huh);
540 while (what_this != what);
541
542 if (sockread (huh, s, &n, sizeof (n)) != sizeof (n))
543 stub_error ("error getting %s from host.", huh);
544
545 return n;
546 }
547
548 /* Handy defines for getting/putting various types of values. */
549 #define gethandle(huh, what) (HANDLE) getdword ((huh), (what))
550 #define getpvoid(huh, what) (LPVOID) getdword ((huh), (what))
551 #define getlen(huh, what) (gdb_wince_len) getword ((huh), (what))
552 #define puthandle(huh, what, h) putdword ((huh), (what), (DWORD) (h))
553 #define putpvoid(huh, what, p) putdword ((huh), (what), (DWORD) (p))
554
555 /* Retrieve the result of an operation from the stub. If nbytes < 0) then nbytes
556 is actually an error and nothing else follows. Use SetLastError to remember this.
557 if nbytes > 0, retrieve a block of *nbytes into buf.
558 */
559 int
560 getresult (LPCSTR huh, gdb_wince_id what, LPVOID buf, gdb_wince_len * nbytes)
561 {
562 gdb_wince_len dummy;
563 if (nbytes == NULL)
564 nbytes = &dummy;
565
566 *nbytes = getlen (huh, what);
567
568 if ((short) *nbytes < 0)
569 {
570 SetLastError (-(short) *nbytes);
571 return 0;
572 }
573
574 if ((gdb_wince_len) sockread (huh, s, buf, *nbytes) != *nbytes)
575 stub_error ("couldn't read information from wince stub - %s", huh);
576
577 return 1;
578 }
579
580 /* Convert "narrow" string to "wide". Manipulates a buffer ring of 8
581 buffers which hold the translated string. This is an arbitrary limit
582 but it is approximately double the current needs of this module.
583 */
584 LPWSTR
585 towide (const char *s, gdb_wince_len * out_len)
586 {
587 static int n = -1;
588 static LPWSTR outs[8] =
589 {NULL /*, NULL, etc. */ };
590 gdb_wince_len dummy;
591
592 if (!out_len)
593 out_len = &dummy;
594
595 /* First determine the length required to hold the converted string. */
596 *out_len = sizeof (WCHAR) * MultiByteToWideChar (CP_ACP, 0, s, -1, NULL, 0);
597 if (!*out_len)
598 return NULL; /* The conversion failed */
599
600 if (++n >= (sizeof (outs) / sizeof (outs[0])))
601 n = 0; /* wrap */
602
603 /* Allocate space for the converted string, reusing any previously allocated
604 space, if applicable. Note that if outs[n] is NULL, realloc will act as
605 a malloc (under cygwin, at least).
606 */
607 outs[n] = (LPWSTR) realloc (outs[n], *out_len);
608 memset (outs[n], 0, *out_len);
609 (void) MultiByteToWideChar (CP_ACP, 0, s, -1, outs[n], *out_len);
610 return outs[n];
611 }
612
613 /******************** Emulation routines start here. ********************
614
615 The functions below are modelled after their Win32 counterparts. They are named
616 similarly to Win32 and take exactly the same arguments except where otherwise noted.
617 They communicate with the stub on the hand-held device by sending their arguments
618 over the socket and waiting for results from the socket.
619
620 There is one universal change. In cases where a length is expected to be returned
621 in a DWORD, we use a gdb_wince_len type instead. Currently this is an unsigned short
622 which is smaller than the standard Win32 DWORD. This is done to minimize unnecessary
623 traffic since the connection to Windows CE can be slow. To change this, modify the
624 typedef in wince-stub.h and change the putlen/getlen macros in this file and in
625 the stub.
626 */
627
628 static int
629 create_process (LPSTR exec_file, LPSTR args, DWORD flags, PROCESS_INFORMATION * pi)
630 {
631 gdb_wince_len len;
632 LPWSTR buf;
633
634 buf = towide (exec_file, &len);
635 putmemory ("CreateProcess exec_file", GDB_CREATEPROCESS, buf, len);
636 buf = towide (args, &len);
637 putmemory ("CreateProcess args", GDB_CREATEPROCESS, buf, len);
638 putdword ("CreateProcess flags", GDB_CREATEPROCESS, flags);
639 return getresult ("CreateProcess result", GDB_CREATEPROCESS, pi, NULL);
640 }
641
642 /* Emulate TerminateProcess. Don't bother with the second argument since CE
643 ignores it.
644 */
645 static int
646 terminate_process (HANDLE h)
647 {
648 gdb_wince_result res;
649 if (s < 0)
650 return 1;
651 puthandle ("TerminateProcess handle", GDB_TERMINATEPROCESS, h);
652 return getresult ("TerminateProcess result", GDB_TERMINATEPROCESS, &res, NULL);
653 }
654
655 static int
656 wait_for_debug_event (DEBUG_EVENT * ev, DWORD ms)
657 {
658 if (s < 0)
659 return 1;
660 putdword ("WaitForDebugEvent ms", GDB_WAITFORDEBUGEVENT, ms);
661 return getresult ("WaitForDebugEvent event", GDB_WAITFORDEBUGEVENT, ev, NULL);
662 }
663
664 static int
665 get_thread_context (HANDLE h, CONTEXT * c)
666 {
667 if (s < 0)
668 return 1;
669 puthandle ("GetThreadContext handle", GDB_GETTHREADCONTEXT, h);
670 putdword ("GetThreadContext flags", GDB_GETTHREADCONTEXT, c->ContextFlags);
671 return getresult ("GetThreadContext context", GDB_GETTHREADCONTEXT, c, NULL);
672 }
673
674 static int
675 set_thread_context (HANDLE h, CONTEXT * c)
676 {
677 gdb_wince_result res;
678 if (s < 0)
679 return 1;
680 puthandle ("SetThreadContext handle", GDB_SETTHREADCONTEXT, h);
681 putmemory ("SetThreadContext context", GDB_SETTHREADCONTEXT, c, sizeof (*c));
682 return getresult ("SetThreadContext context", GDB_SETTHREADCONTEXT, &res, NULL);
683 }
684
685 static int
686 read_process_memory (HANDLE h, LPCVOID where, LPVOID buf, gdb_wince_len len, gdb_wince_len * nbytes)
687 {
688 if (s < 0)
689 return 1;
690 puthandle ("ReadProcessMemory handle", GDB_READPROCESSMEMORY, h);
691 putpvoid ("ReadProcessMemory location", GDB_READPROCESSMEMORY, where);
692 putlen ("ReadProcessMemory size", GDB_READPROCESSMEMORY, len);
693
694 return getresult ("ReadProcessMemory buf", GDB_READPROCESSMEMORY, buf, nbytes);
695 }
696
697 static int
698 write_process_memory (HANDLE h, LPCVOID where, LPCVOID buf, gdb_wince_len len, gdb_wince_len * nbytes)
699 {
700 if (s < 0)
701 return 1;
702 puthandle ("WriteProcessMemory handle", GDB_WRITEPROCESSMEMORY, h);
703 putpvoid ("WriteProcessMemory location", GDB_WRITEPROCESSMEMORY, where);
704 putmemory ("WriteProcProcessMemory buf", GDB_WRITEPROCESSMEMORY, buf, len);
705
706 return getresult ("WriteProcessMemory result", GDB_WRITEPROCESSMEMORY, nbytes, NULL);
707 }
708
709 static int
710 remote_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
711 {
712 gdb_wince_len nbytes;
713 if (!read_process_memory (current_process_handle, (LPCVOID) memaddr,
714 (LPVOID) myaddr, len, &nbytes))
715 return -1;
716 return nbytes;
717 }
718
719 static int
720 remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
721 {
722 gdb_wince_len nbytes;
723 if (!write_process_memory (current_process_handle, (LPCVOID) memaddr,
724 (LPCVOID) myaddr, len, &nbytes))
725 return -1;
726 return nbytes;
727 }
728
729 /* This is not a standard Win32 function. It instructs the stub to return TRUE
730 if the thread referenced by HANDLE h is alive.
731 */
732 static int
733 thread_alive (HANDLE h)
734 {
735 gdb_wince_result res;
736 if (s < 0)
737 return 1;
738 puthandle ("ThreadAlive handle", GDB_THREADALIVE, h);
739 return getresult ("ThreadAlive result", GDB_THREADALIVE, &res, NULL);
740 }
741
742 static int
743 suspend_thread (HANDLE h)
744 {
745 if (s < 0)
746 return 1;
747 puthandle ("SuspendThread handle", GDB_SUSPENDTHREAD, h);
748 return (int) getdword ("SuspendThread result", GDB_SUSPENDTHREAD);
749 }
750
751 static int
752 resume_thread (HANDLE h)
753 {
754 if (s < 0)
755 return 1;
756 puthandle ("ResumeThread handle", GDB_RESUMETHREAD, h);
757 return (int) getdword ("SuspendThread result", GDB_RESUMETHREAD);
758 }
759
760 static int
761 continue_debug_event (DWORD pid, DWORD tid, DWORD status)
762 {
763 gdb_wince_result res;
764 if (s < 0)
765 return 0;
766 putdword ("ContinueDebugEvent pid", GDB_CONTINUEDEBUGEVENT, pid);
767 putdword ("ContinueDebugEvent tid", GDB_CONTINUEDEBUGEVENT, tid);
768 putdword ("ContinueDebugEvent status", GDB_CONTINUEDEBUGEVENT, status);
769 return getresult ("ContinueDebugEvent result", GDB_CONTINUEDEBUGEVENT, &res, NULL);
770 }
771
772 static int
773 close_handle (HANDLE h)
774 {
775 gdb_wince_result res;
776 if (s < 0)
777 return 1;
778 puthandle ("CloseHandle handle", GDB_CLOSEHANDLE, h);
779 return (int) getresult ("CloseHandle result", GDB_CLOSEHANDLE, &res, NULL);
780 }
781
782 /* This is not a standard Win32 interface. This function tells the stub
783 to terminate.
784 */
785 static void
786 stop_stub (void)
787 {
788 if (s < 0)
789 return;
790 (void) putdword ("Stopping gdb stub", GDB_STOPSTUB, 0);
791 s = -1;
792 }
793
794 /******************** End of emulation routines. ********************/
795 /******************** End of stub interface ********************/
796
797 #define check_for_step(a, x) (x)
798
799 #ifdef MIPS
800 static void
801 undoSStep (thread_info * th)
802 {
803 if (th->stepped)
804 {
805 memory_remove_breakpoint (th->step_pc, (void *) &th->step_prev);
806 th->stepped = 0;
807 }
808 }
809
810 void
811 wince_software_single_step (unsigned int ignore, int insert_breakpoints_p)
812 {
813 unsigned long pc;
814 thread_info *th = current_thread; /* Info on currently selected thread */
815 CORE_ADDR mips_next_pc (CORE_ADDR pc);
816
817 if (!insert_breakpoints_p)
818 {
819 undoSStep (th);
820 return;
821 }
822
823 th->stepped = 1;
824 pc = read_register (PC_REGNUM);
825 th->step_pc = mips_next_pc (pc);
826 th->step_prev = 0;
827 memory_insert_breakpoint (th->step_pc, (void *) &th->step_prev);
828 return;
829 }
830 #elif SHx
831 /* Hitachi SH architecture instruction encoding masks */
832
833 #define COND_BR_MASK 0xff00
834 #define UCOND_DBR_MASK 0xe000
835 #define UCOND_RBR_MASK 0xf0df
836 #define TRAPA_MASK 0xff00
837
838 #define COND_DISP 0x00ff
839 #define UCOND_DISP 0x0fff
840 #define UCOND_REG 0x0f00
841
842 /* Hitachi SH instruction opcodes */
843
844 #define BF_INSTR 0x8b00
845 #define BT_INSTR 0x8900
846 #define BRA_INSTR 0xa000
847 #define BSR_INSTR 0xb000
848 #define JMP_INSTR 0x402b
849 #define JSR_INSTR 0x400b
850 #define RTS_INSTR 0x000b
851 #define RTE_INSTR 0x002b
852 #define TRAPA_INSTR 0xc300
853 #define SSTEP_INSTR 0xc3ff
854
855
856 #define T_BIT_MASK 0x0001
857
858 static CORE_ADDR
859 sh_get_next_pc (CONTEXT *c)
860 {
861 short *instrMem;
862 int displacement;
863 int reg;
864 unsigned short opcode;
865
866 instrMem = (short *) c->Fir;
867
868 opcode = read_memory_integer ((CORE_ADDR) c->Fir, sizeof (opcode));
869
870 if ((opcode & COND_BR_MASK) == BT_INSTR)
871 {
872 if (c->Psr & T_BIT_MASK)
873 {
874 displacement = (opcode & COND_DISP) << 1;
875 if (displacement & 0x80)
876 displacement |= 0xffffff00;
877 /*
878 * Remember PC points to second instr.
879 * after PC of branch ... so add 4
880 */
881 instrMem = (short *) (c->Fir + displacement + 4);
882 }
883 else
884 instrMem += 1;
885 }
886 else if ((opcode & COND_BR_MASK) == BF_INSTR)
887 {
888 if (c->Psr & T_BIT_MASK)
889 instrMem += 1;
890 else
891 {
892 displacement = (opcode & COND_DISP) << 1;
893 if (displacement & 0x80)
894 displacement |= 0xffffff00;
895 /*
896 * Remember PC points to second instr.
897 * after PC of branch ... so add 4
898 */
899 instrMem = (short *) (c->Fir + displacement + 4);
900 }
901 }
902 else if ((opcode & UCOND_DBR_MASK) == BRA_INSTR)
903 {
904 displacement = (opcode & UCOND_DISP) << 1;
905 if (displacement & 0x0800)
906 displacement |= 0xfffff000;
907
908 /*
909 * Remember PC points to second instr.
910 * after PC of branch ... so add 4
911 */
912 instrMem = (short *) (c->Fir + displacement + 4);
913 }
914 else if ((opcode & UCOND_RBR_MASK) == JSR_INSTR)
915 {
916 reg = (char) ((opcode & UCOND_REG) >> 8);
917
918 instrMem = (short *) *regptr (c, reg);
919 }
920 else if (opcode == RTS_INSTR)
921 instrMem = (short *) c->PR;
922 else if (opcode == RTE_INSTR)
923 instrMem = (short *) *regptr (c, 15);
924 else if ((opcode & TRAPA_MASK) == TRAPA_INSTR)
925 instrMem = (short *) ((opcode & ~TRAPA_MASK) << 2);
926 else
927 instrMem += 1;
928
929 return (CORE_ADDR) instrMem;
930 }
931 /* Single step (in a painstaking fashion) by inspecting the current
932 instruction and setting a breakpoint on the "next" instruction
933 which would be executed. This code hails from sh-stub.c.
934 */
935 static void
936 undoSStep (thread_info * th)
937 {
938 if (th->stepped)
939 {
940 memory_remove_breakpoint (th->step_pc, (void *) &th->step_prev);
941 th->stepped = 0;
942 }
943 return;
944 }
945
946 /* Single step (in a painstaking fashion) by inspecting the current
947 instruction and setting a breakpoint on the "next" instruction
948 which would be executed. This code hails from sh-stub.c.
949 */
950 void
951 wince_software_single_step (unsigned int ignore, int insert_breakpoints_p)
952 {
953 thread_info *th = current_thread; /* Info on currently selected thread */
954
955 if (!insert_breakpoints_p)
956 {
957 undoSStep (th);
958 return;
959 }
960
961 th->stepped = 1;
962 th->step_pc = sh_get_next_pc (&th->context);
963 th->step_prev = 0;
964 memory_insert_breakpoint (th->step_pc, (void *) &th->step_prev);
965 return;
966 }
967 #elif defined (ARM)
968 #undef check_for_step
969
970 static enum target_signal
971 check_for_step (DEBUG_EVENT *ev, enum target_signal x)
972 {
973 thread_info *th = thread_rec (ev->dwThreadId, 1);
974
975 if (th->stepped &&
976 th->step_pc == (CORE_ADDR) ev->u.Exception.ExceptionRecord.ExceptionAddress)
977 return TARGET_SIGNAL_TRAP;
978 else
979 return x;
980 }
981
982 /* Single step (in a painstaking fashion) by inspecting the current
983 instruction and setting a breakpoint on the "next" instruction
984 which would be executed. This code hails from sh-stub.c.
985 */
986 static void
987 undoSStep (thread_info * th)
988 {
989 if (th->stepped)
990 {
991 memory_remove_breakpoint (th->step_pc, (void *) &th->step_prev);
992 th->stepped = 0;
993 }
994 }
995
996 void
997 wince_software_single_step (unsigned int ignore, int insert_breakpoints_p)
998 {
999 unsigned long pc;
1000 thread_info *th = current_thread; /* Info on currently selected thread */
1001 CORE_ADDR mips_next_pc (CORE_ADDR pc);
1002
1003 if (!insert_breakpoints_p)
1004 {
1005 undoSStep (th);
1006 return;
1007 }
1008
1009 th->stepped = 1;
1010 pc = read_register (PC_REGNUM);
1011 th->step_pc = arm_get_next_pc (pc);
1012 th->step_prev = 0;
1013 memory_insert_breakpoint (th->step_pc, (void *) &th->step_prev);
1014 return;
1015 }
1016 #endif
1017
1018 /* Find a thread record given a thread id.
1019 If get_context then also retrieve the context for this
1020 thread. */
1021 static thread_info *
1022 thread_rec (DWORD id, int get_context)
1023 {
1024 thread_info *th;
1025
1026 for (th = &thread_head; (th = th->next) != NULL;)
1027 if (th->id == id)
1028 {
1029 if (!th->suspend_count && get_context)
1030 {
1031 if (get_context > 0 && th != this_thread)
1032 th->suspend_count = suspend_thread (th->h) + 1;
1033 else if (get_context < 0)
1034 th->suspend_count = -1;
1035
1036 th->context.ContextFlags = CONTEXT_DEBUGGER;
1037 get_thread_context (th->h, &th->context);
1038 }
1039 return th;
1040 }
1041
1042 return NULL;
1043 }
1044
1045 /* Add a thread to the thread list */
1046 static thread_info *
1047 child_add_thread (DWORD id, HANDLE h)
1048 {
1049 thread_info *th;
1050
1051 if ((th = thread_rec (id, FALSE)))
1052 return th;
1053
1054 th = (thread_info *) xmalloc (sizeof (*th));
1055 memset (th, 0, sizeof (*th));
1056 th->id = id;
1057 th->h = h;
1058 th->next = thread_head.next;
1059 thread_head.next = th;
1060 add_thread (id);
1061 return th;
1062 }
1063
1064 /* Clear out any old thread list and reintialize it to a
1065 pristine state. */
1066 static void
1067 child_init_thread_list (void)
1068 {
1069 thread_info *th = &thread_head;
1070
1071 DEBUG_EVENTS (("gdb: child_init_thread_list\n"));
1072 init_thread_list ();
1073 while (th->next != NULL)
1074 {
1075 thread_info *here = th->next;
1076 th->next = here->next;
1077 (void) close_handle (here->h);
1078 xfree (here);
1079 }
1080 }
1081
1082 /* Delete a thread from the list of threads */
1083 static void
1084 child_delete_thread (DWORD id)
1085 {
1086 thread_info *th;
1087
1088 if (info_verbose)
1089 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (id));
1090 delete_thread (id);
1091
1092 for (th = &thread_head;
1093 th->next != NULL && th->next->id != id;
1094 th = th->next)
1095 continue;
1096
1097 if (th->next != NULL)
1098 {
1099 thread_info *here = th->next;
1100 th->next = here->next;
1101 close_handle (here->h);
1102 xfree (here);
1103 }
1104 }
1105
1106 static void
1107 check (BOOL ok, const char *file, int line)
1108 {
1109 if (!ok)
1110 printf_filtered ("error return %s:%d was %d\n", file, line, GetLastError ());
1111 }
1112
1113 static void
1114 do_child_fetch_inferior_registers (int r)
1115 {
1116 if (r >= 0)
1117 {
1118 supply_register (r, (char *) regptr (&current_thread->context, r));
1119 }
1120 else
1121 {
1122 for (r = 0; r < NUM_REGS; r++)
1123 do_child_fetch_inferior_registers (r);
1124 }
1125 }
1126
1127 static void
1128 child_fetch_inferior_registers (int r)
1129 {
1130 current_thread = thread_rec (inferior_pid, TRUE);
1131 do_child_fetch_inferior_registers (r);
1132 }
1133
1134 static void
1135 do_child_store_inferior_registers (int r)
1136 {
1137 if (r >= 0)
1138 read_register_gen (r, ((char *) &current_thread->context) + mappings[r]);
1139 else
1140 {
1141 for (r = 0; r < NUM_REGS; r++)
1142 do_child_store_inferior_registers (r);
1143 }
1144 }
1145
1146 /* Store a new register value into the current thread context */
1147 static void
1148 child_store_inferior_registers (int r)
1149 {
1150 current_thread = thread_rec (inferior_pid, TRUE);
1151 do_child_store_inferior_registers (r);
1152 }
1153
1154 /* Wait for child to do something. Return pid of child, or -1 in case
1155 of error; store status through argument pointer OURSTATUS. */
1156
1157 static int
1158 handle_load_dll (PTR dummy)
1159 {
1160 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
1161 char dll_buf[MAX_PATH + 1];
1162 char *p, *bufp, *imgp, *dll_name, *dll_basename;
1163 int len;
1164
1165 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
1166 if (!event->lpImageName)
1167 return 1;
1168
1169 len = 0;
1170 for (bufp = dll_buf, imgp = event->lpImageName;
1171 bufp < dll_buf + sizeof (dll_buf);
1172 bufp += 16, imgp += 16)
1173 {
1174 gdb_wince_len nbytes = 0;
1175 (void) read_process_memory (current_process_handle,
1176 imgp, bufp, 16, &nbytes);
1177
1178 if (!nbytes && bufp == dll_buf)
1179 return 1; /* couldn't read it */
1180 for (p = bufp; p < bufp + nbytes; p++)
1181 {
1182 len++;
1183 if (*p == '\0')
1184 goto out;
1185 if (event->fUnicode)
1186 p++;
1187 }
1188 if (!nbytes)
1189 break;
1190 }
1191
1192 out:
1193 if (!len)
1194 return 1;
1195 #if 0
1196 dll_buf[len] = '\0';
1197 #endif
1198 dll_name = alloca (len);
1199
1200 if (!dll_name)
1201 return 1;
1202
1203 if (!event->fUnicode)
1204 memcpy (dll_name, dll_buf, len);
1205 else
1206 WideCharToMultiByte (CP_ACP, 0, (LPCWSTR) dll_buf, len,
1207 dll_name, len, 0, 0);
1208
1209 while ((p = strchr (dll_name, '\\')))
1210 *p = '/';
1211
1212 /* FIXME!! It would be nice to define one symbol which pointed to the
1213 front of the dll if we can't find any symbols. */
1214
1215 if (!(dll_basename = strrchr (dll_name, '/')))
1216 dll_basename = dll_name;
1217 else
1218 dll_basename++;
1219
1220 /* The symbols in a dll are offset by 0x1000, which is the
1221 the offset from 0 of the first byte in an image - because
1222 of the file header and the section alignment.
1223
1224 FIXME: Is this the real reason that we need the 0x1000 ? */
1225
1226 printf_unfiltered ("%x:%s", event->lpBaseOfDll, dll_name);
1227 printf_unfiltered ("\n");
1228
1229 return 1;
1230 }
1231
1232 /* Handle DEBUG_STRING output from child process. */
1233 static void
1234 handle_output_debug_string (struct target_waitstatus *ourstatus)
1235 {
1236 char p[256];
1237 char s[255];
1238 char *q;
1239 gdb_wince_len nbytes_read;
1240 gdb_wince_len nbytes = current_event.u.DebugString.nDebugStringLength;
1241
1242 if (nbytes > 255)
1243 nbytes = 255;
1244
1245 memset (p, 0, sizeof (p));
1246 if (!read_process_memory (current_process_handle,
1247 current_event.u.DebugString.lpDebugStringData,
1248 &p, nbytes, &nbytes_read)
1249 || !*p)
1250 return;
1251
1252 memset (s, 0, sizeof (s));
1253 WideCharToMultiByte (CP_ACP, 0, (LPCWSTR) p, (int) nbytes_read, s,
1254 sizeof (s) - 1, NULL, NULL);
1255 q = strchr (s, '\n');
1256 if (q != NULL)
1257 {
1258 *q = '\0';
1259 if (*--q = '\r')
1260 *q = '\0';
1261 }
1262
1263 warning (s);
1264
1265 return;
1266 }
1267
1268 /* Handle target exceptions. */
1269 static int
1270 handle_exception (struct target_waitstatus *ourstatus)
1271 {
1272 #if 0
1273 if (current_event.u.Exception.dwFirstChance)
1274 return 0;
1275 #endif
1276
1277 ourstatus->kind = TARGET_WAITKIND_STOPPED;
1278
1279 switch (current_event.u.Exception.ExceptionRecord.ExceptionCode)
1280 {
1281 case EXCEPTION_ACCESS_VIOLATION:
1282 DEBUG_EXCEPT (("gdb: Target exception ACCESS_VIOLATION at 0x%08x\n",
1283 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1284 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1285 break;
1286 case STATUS_STACK_OVERFLOW:
1287 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08x\n",
1288 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1289 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1290 break;
1291 case EXCEPTION_BREAKPOINT:
1292 DEBUG_EXCEPT (("gdb: Target exception BREAKPOINT at 0x%08x\n",
1293 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1294 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1295 break;
1296 case DBG_CONTROL_C:
1297 DEBUG_EXCEPT (("gdb: Target exception CONTROL_C at 0x%08x\n",
1298 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1299 ourstatus->value.sig = TARGET_SIGNAL_INT;
1300 /* User typed CTRL-C. Continue with this status */
1301 last_sig = SIGINT; /* FIXME - should check pass state */
1302 break;
1303 case EXCEPTION_SINGLE_STEP:
1304 DEBUG_EXCEPT (("gdb: Target exception SINGLE_STEP at 0x%08x\n",
1305 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1306 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1307 break;
1308 case EXCEPTION_ILLEGAL_INSTRUCTION:
1309 DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08x\n",
1310 current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1311 ourstatus->value.sig = check_for_step (&current_event, TARGET_SIGNAL_ILL);
1312 break;
1313 default:
1314 /* This may be a structured exception handling exception. In
1315 that case, we want to let the program try to handle it, and
1316 only break if we see the exception a second time. */
1317
1318 printf_unfiltered ("gdb: unknown target exception 0x%08x at 0x%08x\n",
1319 current_event.u.Exception.ExceptionRecord.ExceptionCode,
1320 current_event.u.Exception.ExceptionRecord.ExceptionAddress);
1321 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1322 break;
1323 }
1324 exception_count++;
1325 return 1;
1326 }
1327
1328 /* Resume all artificially suspended threads if we are continuing
1329 execution */
1330 static BOOL
1331 child_continue (DWORD continue_status, int id)
1332 {
1333 int i;
1334 thread_info *th;
1335 BOOL res;
1336
1337 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=%d, DBG_CONTINUE);\n",
1338 (unsigned) current_event.dwProcessId, (unsigned) current_event.dwThreadId));
1339 res = continue_debug_event (current_event.dwProcessId,
1340 current_event.dwThreadId,
1341 continue_status);
1342 if (res)
1343 for (th = &thread_head; (th = th->next) != NULL;)
1344 if (((id == -1) || (id == th->id)) && th->suspend_count)
1345 {
1346 for (i = 0; i < th->suspend_count; i++)
1347 (void) resume_thread (th->h);
1348 th->suspend_count = 0;
1349 }
1350
1351 return res;
1352 }
1353
1354 /* Get the next event from the child. Return 1 if the event requires
1355 handling by WFI (or whatever).
1356 */
1357 static int
1358 get_child_debug_event (int pid, struct target_waitstatus *ourstatus,
1359 DWORD target_event_code, int *retval)
1360 {
1361 int breakout = 0;
1362 BOOL debug_event;
1363 DWORD continue_status, event_code;
1364 thread_info *th = NULL;
1365 static thread_info dummy_thread_info;
1366
1367 if (!(debug_event = wait_for_debug_event (&current_event, 1000)))
1368 {
1369 *retval = 0;
1370 goto out;
1371 }
1372
1373 event_count++;
1374 continue_status = DBG_CONTINUE;
1375 *retval = 0;
1376
1377 event_code = current_event.dwDebugEventCode;
1378 breakout = event_code == target_event_code;
1379
1380 switch (event_code)
1381 {
1382 case CREATE_THREAD_DEBUG_EVENT:
1383 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
1384 (unsigned) current_event.dwProcessId,
1385 (unsigned) current_event.dwThreadId,
1386 "CREATE_THREAD_DEBUG_EVENT"));
1387 /* Record the existence of this thread */
1388 th = child_add_thread (current_event.dwThreadId,
1389 current_event.u.CreateThread.hThread);
1390 if (info_verbose)
1391 printf_unfiltered ("[New %s]\n",
1392 target_pid_to_str (current_event.dwThreadId));
1393 break;
1394
1395 case EXIT_THREAD_DEBUG_EVENT:
1396 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1397 (unsigned) current_event.dwProcessId,
1398 (unsigned) current_event.dwThreadId,
1399 "EXIT_THREAD_DEBUG_EVENT"));
1400 child_delete_thread (current_event.dwThreadId);
1401 th = &dummy_thread_info;
1402 break;
1403
1404 case CREATE_PROCESS_DEBUG_EVENT:
1405 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1406 (unsigned) current_event.dwProcessId,
1407 (unsigned) current_event.dwThreadId,
1408 "CREATE_PROCESS_DEBUG_EVENT"));
1409 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1410
1411 main_thread_id = inferior_pid = current_event.dwThreadId;
1412 /* Add the main thread */
1413 th = child_add_thread (inferior_pid,
1414 current_event.u.CreateProcessInfo.hThread);
1415 break;
1416
1417 case EXIT_PROCESS_DEBUG_EVENT:
1418 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1419 (unsigned) current_event.dwProcessId,
1420 (unsigned) current_event.dwThreadId,
1421 "EXIT_PROCESS_DEBUG_EVENT"));
1422 ourstatus->kind = TARGET_WAITKIND_EXITED;
1423 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1424 close_handle (current_process_handle);
1425 *retval = current_event.dwProcessId;
1426 breakout = 1;
1427 break;
1428
1429 case LOAD_DLL_DEBUG_EVENT:
1430 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1431 (unsigned) current_event.dwProcessId,
1432 (unsigned) current_event.dwThreadId,
1433 "LOAD_DLL_DEBUG_EVENT"));
1434 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
1435 registers_changed (); /* mark all regs invalid */
1436 break;
1437
1438 case UNLOAD_DLL_DEBUG_EVENT:
1439 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1440 (unsigned) current_event.dwProcessId,
1441 (unsigned) current_event.dwThreadId,
1442 "UNLOAD_DLL_DEBUG_EVENT"));
1443 break; /* FIXME: don't know what to do here */
1444
1445 case EXCEPTION_DEBUG_EVENT:
1446 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1447 (unsigned) current_event.dwProcessId,
1448 (unsigned) current_event.dwThreadId,
1449 "EXCEPTION_DEBUG_EVENT"));
1450 if (handle_exception (ourstatus))
1451 *retval = current_event.dwThreadId;
1452 else
1453 {
1454 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1455 breakout = 0;
1456 }
1457 break;
1458
1459 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
1460 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1461 (unsigned) current_event.dwProcessId,
1462 (unsigned) current_event.dwThreadId,
1463 "OUTPUT_DEBUG_STRING_EVENT"));
1464 handle_output_debug_string ( ourstatus);
1465 break;
1466 default:
1467 printf_unfiltered ("gdb: kernel event for pid=%d tid=%d\n",
1468 current_event.dwProcessId,
1469 current_event.dwThreadId);
1470 printf_unfiltered (" unknown event code %d\n",
1471 current_event.dwDebugEventCode);
1472 break;
1473 }
1474
1475 if (breakout)
1476 this_thread = current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
1477 else
1478 CHECK (child_continue (continue_status, -1));
1479
1480 out:
1481 return breakout;
1482 }
1483
1484 /* Wait for interesting events to occur in the target process. */
1485 static int
1486 child_wait (int pid, struct target_waitstatus *ourstatus)
1487 {
1488 DWORD event_code;
1489 int retval;
1490
1491 /* We loop when we get a non-standard exception rather than return
1492 with a SPURIOUS because resume can try and step or modify things,
1493 which needs a current_thread->h. But some of these exceptions mark
1494 the birth or death of threads, which mean that the current thread
1495 isn't necessarily what you think it is. */
1496
1497 while (1)
1498 if (get_child_debug_event (pid, ourstatus, EXCEPTION_DEBUG_EVENT, &retval))
1499 return retval;
1500 else
1501 {
1502 int detach = 0;
1503
1504 if (ui_loop_hook != NULL)
1505 detach = ui_loop_hook (0);
1506
1507 if (detach)
1508 child_kill_inferior ();
1509 }
1510 }
1511
1512 /* Print status information about what we're accessing. */
1513
1514 static void
1515 child_files_info (struct target_ops *ignore)
1516 {
1517 printf_unfiltered ("\tUsing the running image of child %s.\n",
1518 target_pid_to_str (inferior_pid));
1519 }
1520
1521 /* ARGSUSED */
1522 static void
1523 child_open (char *arg, int from_tty)
1524 {
1525 error ("Use the \"run\" command to start a child process.");
1526 }
1527
1528 #define FACTOR (0x19db1ded53ea710LL)
1529 #define NSPERSEC 10000000
1530
1531 /* Convert a Win32 time to "UNIX" format. */
1532 long
1533 to_time_t (FILETIME * ptr)
1534 {
1535 /* A file time is the number of 100ns since jan 1 1601
1536 stuffed into two long words.
1537 A time_t is the number of seconds since jan 1 1970. */
1538
1539 long rem;
1540 long long x = ((long long) ptr->dwHighDateTime << 32) + ((unsigned) ptr->dwLowDateTime);
1541 x -= FACTOR; /* number of 100ns between 1601 and 1970 */
1542 rem = x % ((long long) NSPERSEC);
1543 rem += (NSPERSEC / 2);
1544 x /= (long long) NSPERSEC; /* number of 100ns in a second */
1545 x += (long long) (rem / NSPERSEC);
1546 return x;
1547 }
1548
1549 /* Upload a file to the remote device depending on the user's
1550 'set remoteupload' specification. */
1551 char *
1552 upload_to_device (const char *to, const char *from)
1553 {
1554 HANDLE h;
1555 const char *dir = remote_directory ?: "\\gdb";
1556 int len;
1557 static char *remotefile = NULL;
1558 LPWSTR wstr;
1559 char *p;
1560 DWORD err;
1561 const char *in_to = to;
1562 FILETIME crtime, actime, wrtime;
1563 time_t utime;
1564 struct stat st;
1565 int fd;
1566
1567 /* Look for a path separator and only use trailing part. */
1568 while ((p = strpbrk (to, "/\\")) != NULL)
1569 to = p + 1;
1570
1571 if (!*to)
1572 error ("no filename found to upload - %s.", in_to);
1573
1574 len = strlen (dir) + strlen (to) + 2;
1575 remotefile = (char *) realloc (remotefile, len);
1576 strcpy (remotefile, dir);
1577 strcat (remotefile, "\\");
1578 strcat (remotefile, to);
1579
1580 if (upload_when == UPLOAD_NEVER)
1581 return remotefile; /* Don't bother uploading. */
1582
1583 /* Open the source. */
1584 if ((fd = openp (getenv ("PATH"), TRUE, (char *) from, O_RDONLY, 0, NULL)) < 0)
1585 error ("couldn't open %s", from);
1586
1587 /* Get the time for later comparison. */
1588 if (fstat (fd, &st))
1589 st.st_mtime = (time_t) - 1;
1590
1591 /* Always attempt to create the directory on the remote system. */
1592 wstr = towide (dir, NULL);
1593 (void) CeCreateDirectory (wstr, NULL);
1594
1595 /* Attempt to open the remote file, creating it if it doesn't exist. */
1596 wstr = towide (remotefile, NULL);
1597 h = CeCreateFile (wstr, GENERIC_READ | GENERIC_WRITE, 0, NULL,
1598 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
1599
1600 /* Some kind of problem? */
1601 err = CeGetLastError ();
1602 if (h == NULL || h == INVALID_HANDLE_VALUE)
1603 error ("error opening file \"%s\". Windows error %d.",
1604 remotefile, err);
1605
1606 CeGetFileTime (h, &crtime, &actime, &wrtime);
1607 utime = to_time_t (&wrtime);
1608 #if 0
1609 if (utime < st.st_mtime)
1610 {
1611 char buf[80];
1612 strcpy (buf, ctime(&utime));
1613 printf ("%s < %s\n", buf, ctime(&st.st_mtime));
1614 }
1615 #endif
1616 /* See if we need to upload the file. */
1617 if (upload_when == UPLOAD_ALWAYS ||
1618 err != ERROR_ALREADY_EXISTS ||
1619 !CeGetFileTime (h, &crtime, &actime, &wrtime) ||
1620 to_time_t (&wrtime) < st.st_mtime)
1621 {
1622 DWORD nbytes;
1623 char buf[4096];
1624 int n;
1625
1626 /* Upload the file. */
1627 while ((n = read (fd, buf, sizeof (buf))) > 0)
1628 if (!CeWriteFile (h, buf, (DWORD) n, &nbytes, NULL))
1629 error ("error writing to remote device - %d.",
1630 CeGetLastError ());
1631 }
1632
1633 close (fd);
1634 if (!CeCloseHandle (h))
1635 error ("error closing remote file - %d.", CeGetLastError ());
1636
1637 return remotefile;
1638 }
1639
1640 /* Initialize the connection to the remote device. */
1641 static void
1642 wince_initialize (void)
1643 {
1644 int tmp;
1645 char args[256];
1646 char *hostname;
1647 struct sockaddr_in sin;
1648 char *stub_file_name;
1649 int s0;
1650 PROCESS_INFORMATION pi;
1651
1652 if (!connection_initialized)
1653 switch (CeRapiInit ())
1654 {
1655 case 0:
1656 connection_initialized = 1;
1657 break;
1658 default:
1659 CeRapiUninit ();
1660 error ("Can't initialize connection to remote device.\n");
1661 break;
1662 }
1663
1664 /* Upload the stub to the handheld device. */
1665 stub_file_name = upload_to_device ("wince-stub.exe", WINCE_STUB);
1666 strcpy (args, stub_file_name);
1667
1668 if (remote_add_host)
1669 {
1670 strcat (args, " ");
1671 hostname = strchr (args, '\0');
1672 if (gethostname (hostname, sizeof (args) - strlen (args)))
1673 error ("couldn't get hostname of this system.");
1674 }
1675
1676 /* Get a socket. */
1677 if ((s0 = socket (AF_INET, SOCK_STREAM, 0)) < 0)
1678 stub_error ("Couldn't connect to host system.");
1679
1680 /* Allow rapid reuse of the port. */
1681 tmp = 1;
1682 (void) setsockopt (s0, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
1683
1684
1685 /* Set up the information for connecting to the host gdb process. */
1686 memset (&sin, 0, sizeof (sin));
1687 sin.sin_family = AF_INET;
1688 sin.sin_port = htons (7000); /* FIXME: This should be configurable */
1689
1690 if (bind (s0, (struct sockaddr *) &sin, sizeof (sin)))
1691 error ("couldn't bind socket");
1692
1693 if (listen (s0, 1))
1694 error ("Couldn't open socket for listening.\n");
1695
1696 /* Start up the stub on the remote device. */
1697 if (!CeCreateProcess (towide (stub_file_name, NULL), towide (args, NULL),
1698 NULL, NULL, 0, 0, NULL, NULL, NULL, &pi))
1699 error ("Unable to start remote stub '%s'. Windows CE error %d.",
1700 stub_file_name, CeGetLastError ());
1701
1702 /* Wait for a connection */
1703
1704 if ((s = accept (s0, NULL, NULL)) < 0)
1705 error ("couldn't set up server for connection.");
1706
1707 close (s0);
1708 }
1709
1710 /* Start an inferior win32 child process and sets inferior_pid to its pid.
1711 EXEC_FILE is the file to run.
1712 ALLARGS is a string containing the arguments to the program.
1713 ENV is the environment vector to pass. Errors reported with error(). */
1714 static void
1715 child_create_inferior (char *exec_file, char *args, char **env)
1716 {
1717 PROCESS_INFORMATION pi;
1718 struct target_waitstatus dummy;
1719 int ret;
1720 DWORD flags, event_code;
1721 char *exec_and_args;
1722
1723 if (!exec_file)
1724 error ("No executable specified, use `target exec'.\n");
1725
1726 flags = DEBUG_PROCESS;
1727
1728 wince_initialize (); /* Make sure we've got a connection. */
1729
1730 exec_file = upload_to_device (exec_file, exec_file);
1731
1732 while (*args == ' ')
1733 args++;
1734
1735 /* Allocate space for "command<sp>args" */
1736 if (*args == '\0')
1737 {
1738 exec_and_args = alloca (strlen (exec_file) + 1);
1739 strcpy (exec_and_args, exec_file);
1740 }
1741 else
1742 {
1743 exec_and_args = alloca (strlen (exec_file + strlen (args) + 2));
1744 sprintf (exec_and_args, "%s %s", exec_file, args);
1745 }
1746
1747 memset (&pi, 0, sizeof (pi));
1748 /* Execute the process */
1749 if (!create_process (exec_file, exec_and_args, flags, &pi))
1750 error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
1751
1752 exception_count = 0;
1753 event_count = 0;
1754
1755 current_process_handle = pi.hProcess;
1756 current_event.dwProcessId = pi.dwProcessId;
1757 memset (&current_event, 0, sizeof (current_event));
1758 inferior_pid = current_event.dwThreadId = pi.dwThreadId;
1759 push_target (&child_ops);
1760 child_init_thread_list ();
1761 child_add_thread (pi.dwThreadId, pi.hThread);
1762 init_wait_for_inferior ();
1763 clear_proceed_status ();
1764 target_terminal_init ();
1765 target_terminal_inferior ();
1766
1767 /* Run until process and threads are loaded */
1768 while (!get_child_debug_event (inferior_pid, &dummy,
1769 CREATE_PROCESS_DEBUG_EVENT, &ret))
1770 continue;
1771
1772 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
1773 }
1774
1775 /* Chile has gone bye-bye. */
1776 static void
1777 child_mourn_inferior (void)
1778 {
1779 (void) child_continue (DBG_CONTINUE, -1);
1780 unpush_target (&child_ops);
1781 stop_stub ();
1782 CeRapiUninit ();
1783 connection_initialized = 0;
1784 generic_mourn_inferior ();
1785 }
1786
1787 /* Move memory from child to/from gdb. */
1788 int
1789 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
1790 int write, struct target_ops *target)
1791 {
1792 if (len <= 0)
1793 return 0;
1794
1795 if (write)
1796 res = remote_write_bytes (memaddr, our, len);
1797 else
1798 res = remote_read_bytes (memaddr, our, len);
1799
1800 return res;
1801 }
1802
1803 /* Terminate the process and wait for child to tell us it has completed. */
1804 void
1805 child_kill_inferior (void)
1806 {
1807 CHECK (terminate_process (current_process_handle));
1808
1809 for (;;)
1810 {
1811 if (!child_continue (DBG_CONTINUE, -1))
1812 break;
1813 if (!wait_for_debug_event (&current_event, INFINITE))
1814 break;
1815 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
1816 break;
1817 }
1818
1819 CHECK (close_handle (current_process_handle));
1820 close_handle (current_thread->h);
1821 target_mourn_inferior (); /* or just child_mourn_inferior? */
1822 }
1823
1824 /* Resume the child after an exception. */
1825 void
1826 child_resume (int pid, int step, enum target_signal sig)
1827 {
1828 thread_info *th;
1829 DWORD continue_status = last_sig > 0 && last_sig < NSIG ?
1830 DBG_EXCEPTION_NOT_HANDLED : DBG_CONTINUE;
1831
1832 DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
1833 pid, step, sig));
1834
1835 /* Get context for currently selected thread */
1836 th = thread_rec (current_event.dwThreadId, FALSE);
1837
1838 if (th->context.ContextFlags)
1839 {
1840 CHECK (set_thread_context (th->h, &th->context));
1841 th->context.ContextFlags = 0;
1842 }
1843
1844 /* Allow continuing with the same signal that interrupted us.
1845 Otherwise complain. */
1846 if (sig && sig != last_sig)
1847 fprintf_unfiltered (gdb_stderr, "Can't send signals to the child. signal %d\n", sig);
1848
1849 last_sig = 0;
1850 child_continue (continue_status, pid);
1851 }
1852
1853 static void
1854 child_prepare_to_store (void)
1855 {
1856 /* Do nothing, since we can store individual regs */
1857 }
1858
1859 static int
1860 child_can_run (void)
1861 {
1862 return 1;
1863 }
1864
1865 static void
1866 child_close (void)
1867 {
1868 DEBUG_EVENTS (("gdb: child_close, inferior_pid=%d\n", inferior_pid));
1869 }
1870
1871 /* Explicitly upload file to remotedir */
1872
1873 static void
1874 child_load (char *file, int from_tty)
1875 {
1876 upload_to_device (file, file);
1877 }
1878
1879 struct target_ops child_ops;
1880
1881 static void
1882 init_child_ops (void)
1883 {
1884 memset (&child_ops, 0, sizeof (child_ops));
1885 child_ops.to_shortname = (char *) "child";
1886 child_ops.to_longname = (char *) "Windows CE process";
1887 child_ops.to_doc = (char *) "Windows CE process (started by the \"run\" command).";
1888 child_ops.to_open = child_open;
1889 child_ops.to_close = child_close;
1890 child_ops.to_resume = child_resume;
1891 child_ops.to_wait = child_wait;
1892 child_ops.to_fetch_registers = child_fetch_inferior_registers;
1893 child_ops.to_store_registers = child_store_inferior_registers;
1894 child_ops.to_prepare_to_store = child_prepare_to_store;
1895 child_ops.to_xfer_memory = child_xfer_memory;
1896 child_ops.to_files_info = child_files_info;
1897 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
1898 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
1899 child_ops.to_terminal_init = terminal_init_inferior;
1900 child_ops.to_terminal_inferior = terminal_inferior;
1901 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
1902 child_ops.to_terminal_ours = terminal_ours;
1903 child_ops.to_terminal_info = child_terminal_info;
1904 child_ops.to_kill = child_kill_inferior;
1905 child_ops.to_load = child_load;
1906 child_ops.to_create_inferior = child_create_inferior;
1907 child_ops.to_mourn_inferior = child_mourn_inferior;
1908 child_ops.to_can_run = child_can_run;
1909 child_ops.to_thread_alive = win32_child_thread_alive;
1910 child_ops.to_stratum = process_stratum;
1911 child_ops.to_has_all_memory = 1;
1912 child_ops.to_has_memory = 1;
1913 child_ops.to_has_stack = 1;
1914 child_ops.to_has_registers = 1;
1915 child_ops.to_has_execution = 1;
1916 child_ops.to_sections = 0;
1917 child_ops.to_sections_end = 0;
1918 child_ops.to_magic = OPS_MAGIC;
1919 }
1920
1921
1922 /* Handle 'set remoteupload' parameter. */
1923
1924 #define replace_upload(what) \
1925 upload_when = what; \
1926 remote_upload = realloc (remote_upload, strlen (upload_options[upload_when].name) + 1); \
1927 strcpy (remote_upload, upload_options[upload_when].name);
1928
1929 static void
1930 set_upload_type (char *ignore, int from_tty)
1931 {
1932 int i, len;
1933 char *bad_option;
1934
1935 if (!remote_upload || !remote_upload[0])
1936 {
1937 replace_upload (UPLOAD_NEWER);
1938 if (from_tty)
1939 printf_unfiltered ("Upload upload_options are: always, newer, never.\n");
1940 return;
1941 }
1942
1943 len = strlen (remote_upload);
1944 for (i = 0; i < (sizeof (upload_options) / sizeof (upload_options[0])); i++)
1945 if (len >= upload_options[i].abbrev &&
1946 strncasecmp (remote_upload, upload_options[i].name, len) == 0)
1947 {
1948 replace_upload (i);
1949 return;
1950 }
1951
1952 bad_option = remote_upload;
1953 replace_upload (UPLOAD_NEWER);
1954 error ("Unknown upload type: %s.", bad_option);
1955 }
1956
1957 void
1958 _initialize_inftarg (void)
1959 {
1960 struct cmd_list_element *set;
1961 init_child_ops ();
1962
1963 add_show_from_set
1964 (add_set_cmd ((char *) "remotedirectory", no_class,
1965 var_string_noescape, (char *) &remote_directory,
1966 (char *) "Set directory for remote upload.\n",
1967 &setlist),
1968 &showlist);
1969 remote_directory = xstrdup (remote_directory);
1970
1971 set = add_set_cmd ((char *) "remoteupload", no_class,
1972 var_string_noescape, (char *) &remote_upload,
1973 (char *) "Set how to upload executables to remote device.\n",
1974 &setlist);
1975 add_show_from_set (set, &showlist);
1976 set->function.cfunc = set_upload_type;
1977 set_upload_type (NULL, 0);
1978 set_dcache_state (1);
1979
1980 add_show_from_set
1981 (add_set_cmd ((char *) "debugexec", class_support, var_boolean,
1982 (char *) &debug_exec,
1983 (char *) "Set whether to display execution in child process.",
1984 &setlist),
1985 &showlist);
1986
1987 add_show_from_set
1988 (add_set_cmd ((char *) "remoteaddhost", class_support, var_boolean,
1989 (char *) &remote_add_host,
1990 (char *) "Set whether to add this host to remote stub arguments for\n
1991 debugging over a network.", &setlist),
1992 &showlist);
1993
1994 add_show_from_set
1995 (add_set_cmd ((char *) "debugevents", class_support, var_boolean,
1996 (char *) &debug_events,
1997 (char *) "Set whether to display kernel events in child process.",
1998 &setlist),
1999 &showlist);
2000
2001 add_show_from_set
2002 (add_set_cmd ((char *) "debugmemory", class_support, var_boolean,
2003 (char *) &debug_memory,
2004 (char *) "Set whether to display memory accesses in child process.",
2005 &setlist),
2006 &showlist);
2007
2008 add_show_from_set
2009 (add_set_cmd ((char *) "debugexceptions", class_support, var_boolean,
2010 (char *) &debug_exceptions,
2011 (char *) "Set whether to display kernel exceptions in child process.",
2012 &setlist),
2013 &showlist);
2014
2015 add_target (&child_ops);
2016 }
2017
2018 /* Determine if the thread referenced by "pid" is alive
2019 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
2020 it means that the pid has died. Otherwise it is assumed to be alive. */
2021 static int
2022 win32_child_thread_alive (int pid)
2023 {
2024 return thread_alive (thread_rec (pid, FALSE)->h);
2025 }
2026
2027 /* Convert pid to printable format. */
2028 char *
2029 cygwin_pid_to_str (int pid)
2030 {
2031 static char buf[80];
2032 if (pid == current_event.dwProcessId)
2033 sprintf (buf, "process %d", pid);
2034 else
2035 sprintf (buf, "thread %d.0x%x", (unsigned) current_event.dwProcessId, pid);
2036 return buf;
2037 }