da2ec7a2dc6d55945f3b5763b80ee47188641930
[deliverable/binutils-gdb.git] / gdb / gdbserver / server.c
1 /* Main code for remote server for GDB.
2 Copyright (C) 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
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 3 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, see <http://www.gnu.org/licenses/>. */
19
20 #include "server.h"
21
22 #if HAVE_UNISTD_H
23 #include <unistd.h>
24 #endif
25 #if HAVE_SIGNAL_H
26 #include <signal.h>
27 #endif
28 #if HAVE_SYS_WAIT_H
29 #include <sys/wait.h>
30 #endif
31
32 unsigned long cont_thread;
33 unsigned long general_thread;
34 unsigned long step_thread;
35 unsigned long thread_from_wait;
36 unsigned long old_thread_from_wait;
37 int server_waiting;
38
39 static int extended_protocol;
40 static int attached;
41 static int response_needed;
42 static int exit_requested;
43
44 static char **program_argv, **wrapper_argv;
45
46 /* Enable miscellaneous debugging output. The name is historical - it
47 was originally used to debug LinuxThreads support. */
48 int debug_threads;
49
50 int pass_signals[TARGET_SIGNAL_LAST];
51
52 jmp_buf toplevel;
53
54 const char *gdbserver_xmltarget;
55
56 /* The PID of the originally created or attached inferior. Used to
57 send signals to the process when GDB sends us an asynchronous interrupt
58 (user hitting Control-C in the client), and to wait for the child to exit
59 when no longer debugging it. */
60
61 unsigned long signal_pid;
62
63 #ifdef SIGTTOU
64 /* A file descriptor for the controlling terminal. */
65 int terminal_fd;
66
67 /* TERMINAL_FD's original foreground group. */
68 pid_t old_foreground_pgrp;
69
70 /* Set if you want to disable optional thread related packets support
71 in gdbserver, for the sake of testing GDB against stubs that don't
72 support them. */
73 int disable_packet_vCont;
74 int disable_packet_Tthread;
75 int disable_packet_qC;
76 int disable_packet_qfThreadInfo;
77
78 /* Hand back terminal ownership to the original foreground group. */
79
80 static void
81 restore_old_foreground_pgrp (void)
82 {
83 tcsetpgrp (terminal_fd, old_foreground_pgrp);
84 }
85 #endif
86
87 static int
88 target_running (void)
89 {
90 return all_threads.head != NULL;
91 }
92
93 static int
94 start_inferior (char **argv, char *statusptr)
95 {
96 char **new_argv = argv;
97 attached = 0;
98
99 if (wrapper_argv != NULL)
100 {
101 int i, count = 1;
102
103 for (i = 0; wrapper_argv[i] != NULL; i++)
104 count++;
105 for (i = 0; argv[i] != NULL; i++)
106 count++;
107 new_argv = alloca (sizeof (char *) * count);
108 count = 0;
109 for (i = 0; wrapper_argv[i] != NULL; i++)
110 new_argv[count++] = wrapper_argv[i];
111 for (i = 0; argv[i] != NULL; i++)
112 new_argv[count++] = argv[i];
113 new_argv[count] = NULL;
114 }
115
116 #ifdef SIGTTOU
117 signal (SIGTTOU, SIG_DFL);
118 signal (SIGTTIN, SIG_DFL);
119 #endif
120
121 signal_pid = create_inferior (new_argv[0], new_argv);
122
123 /* FIXME: we don't actually know at this point that the create
124 actually succeeded. We won't know that until we wait. */
125 fprintf (stderr, "Process %s created; pid = %ld\n", argv[0],
126 signal_pid);
127 fflush (stderr);
128
129 #ifdef SIGTTOU
130 signal (SIGTTOU, SIG_IGN);
131 signal (SIGTTIN, SIG_IGN);
132 terminal_fd = fileno (stderr);
133 old_foreground_pgrp = tcgetpgrp (terminal_fd);
134 tcsetpgrp (terminal_fd, signal_pid);
135 atexit (restore_old_foreground_pgrp);
136 #endif
137
138 if (wrapper_argv != NULL)
139 {
140 struct thread_resume resume_info;
141 int sig;
142
143 resume_info.thread = -1;
144 resume_info.step = 0;
145 resume_info.sig = 0;
146 resume_info.leave_stopped = 0;
147
148 sig = mywait (statusptr, 0);
149 if (*statusptr != 'T')
150 return sig;
151
152 do
153 {
154 (*the_target->resume) (&resume_info);
155
156 sig = mywait (statusptr, 0);
157 if (*statusptr != 'T')
158 return sig;
159 }
160 while (sig != TARGET_SIGNAL_TRAP);
161
162 return sig;
163 }
164
165 /* Wait till we are at 1st instruction in program, return signal
166 number (assuming success). */
167 return mywait (statusptr, 0);
168 }
169
170 static int
171 attach_inferior (int pid, char *statusptr, int *sigptr)
172 {
173 /* myattach should return -1 if attaching is unsupported,
174 0 if it succeeded, and call error() otherwise. */
175
176 if (myattach (pid) != 0)
177 return -1;
178
179 attached = 1;
180
181 fprintf (stderr, "Attached; pid = %d\n", pid);
182 fflush (stderr);
183
184 /* FIXME - It may be that we should get the SIGNAL_PID from the
185 attach function, so that it can be the main thread instead of
186 whichever we were told to attach to. */
187 signal_pid = pid;
188
189 *sigptr = mywait (statusptr, 0);
190
191 /* GDB knows to ignore the first SIGSTOP after attaching to a running
192 process using the "attach" command, but this is different; it's
193 just using "target remote". Pretend it's just starting up. */
194 if (*statusptr == 'T' && *sigptr == TARGET_SIGNAL_STOP)
195 *sigptr = TARGET_SIGNAL_TRAP;
196
197 return 0;
198 }
199
200 extern int remote_debug;
201
202 /* Decode a qXfer read request. Return 0 if everything looks OK,
203 or -1 otherwise. */
204
205 static int
206 decode_xfer_read (char *buf, char **annex, CORE_ADDR *ofs, unsigned int *len)
207 {
208 /* Extract and NUL-terminate the annex. */
209 *annex = buf;
210 while (*buf && *buf != ':')
211 buf++;
212 if (*buf == '\0')
213 return -1;
214 *buf++ = 0;
215
216 /* After the read marker and annex, qXfer looks like a
217 traditional 'm' packet. */
218 decode_m_packet (buf, ofs, len);
219
220 return 0;
221 }
222
223 /* Write the response to a successful qXfer read. Returns the
224 length of the (binary) data stored in BUF, corresponding
225 to as much of DATA/LEN as we could fit. IS_MORE controls
226 the first character of the response. */
227 static int
228 write_qxfer_response (char *buf, const void *data, int len, int is_more)
229 {
230 int out_len;
231
232 if (is_more)
233 buf[0] = 'm';
234 else
235 buf[0] = 'l';
236
237 return remote_escape_output (data, len, (unsigned char *) buf + 1, &out_len,
238 PBUFSIZ - 2) + 1;
239 }
240
241 /* Handle all of the extended 'Q' packets. */
242 void
243 handle_general_set (char *own_buf)
244 {
245 if (strncmp ("QPassSignals:", own_buf, strlen ("QPassSignals:")) == 0)
246 {
247 int numsigs = (int) TARGET_SIGNAL_LAST, i;
248 const char *p = own_buf + strlen ("QPassSignals:");
249 CORE_ADDR cursig;
250
251 p = decode_address_to_semicolon (&cursig, p);
252 for (i = 0; i < numsigs; i++)
253 {
254 if (i == cursig)
255 {
256 pass_signals[i] = 1;
257 if (*p == '\0')
258 /* Keep looping, to clear the remaining signals. */
259 cursig = -1;
260 else
261 p = decode_address_to_semicolon (&cursig, p);
262 }
263 else
264 pass_signals[i] = 0;
265 }
266 strcpy (own_buf, "OK");
267 return;
268 }
269
270 /* Otherwise we didn't know what packet it was. Say we didn't
271 understand it. */
272 own_buf[0] = 0;
273 }
274
275 static const char *
276 get_features_xml (const char *annex)
277 {
278 /* gdbserver_xmltarget defines what to return when looking
279 for the "target.xml" file. Its contents can either be
280 verbatim XML code (prefixed with a '@') or else the name
281 of the actual XML file to be used in place of "target.xml".
282
283 This variable is set up from the auto-generated
284 init_registers_... routine for the current target. */
285
286 if (gdbserver_xmltarget
287 && strcmp (annex, "target.xml") == 0)
288 {
289 if (*gdbserver_xmltarget == '@')
290 return gdbserver_xmltarget + 1;
291 else
292 annex = gdbserver_xmltarget;
293 }
294
295 #ifdef USE_XML
296 {
297 extern const char *const xml_builtin[][2];
298 int i;
299
300 /* Look for the annex. */
301 for (i = 0; xml_builtin[i][0] != NULL; i++)
302 if (strcmp (annex, xml_builtin[i][0]) == 0)
303 break;
304
305 if (xml_builtin[i][0] != NULL)
306 return xml_builtin[i][1];
307 }
308 #endif
309
310 return NULL;
311 }
312
313 void
314 monitor_show_help (void)
315 {
316 monitor_output ("The following monitor commands are supported:\n");
317 monitor_output (" set debug <0|1>\n");
318 monitor_output (" Enable general debugging messages\n");
319 monitor_output (" set remote-debug <0|1>\n");
320 monitor_output (" Enable remote protocol debugging messages\n");
321 monitor_output (" exit\n");
322 monitor_output (" Quit GDBserver\n");
323 }
324
325 /* Subroutine of handle_search_memory to simplify it. */
326
327 static int
328 handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len,
329 gdb_byte *pattern, unsigned pattern_len,
330 gdb_byte *search_buf,
331 unsigned chunk_size, unsigned search_buf_size,
332 CORE_ADDR *found_addrp)
333 {
334 /* Prime the search buffer. */
335
336 if (read_inferior_memory (start_addr, search_buf, search_buf_size) != 0)
337 {
338 warning ("Unable to access target memory at 0x%lx, halting search.",
339 (long) start_addr);
340 return -1;
341 }
342
343 /* Perform the search.
344
345 The loop is kept simple by allocating [N + pattern-length - 1] bytes.
346 When we've scanned N bytes we copy the trailing bytes to the start and
347 read in another N bytes. */
348
349 while (search_space_len >= pattern_len)
350 {
351 gdb_byte *found_ptr;
352 unsigned nr_search_bytes = (search_space_len < search_buf_size
353 ? search_space_len
354 : search_buf_size);
355
356 found_ptr = memmem (search_buf, nr_search_bytes, pattern, pattern_len);
357
358 if (found_ptr != NULL)
359 {
360 CORE_ADDR found_addr = start_addr + (found_ptr - search_buf);
361 *found_addrp = found_addr;
362 return 1;
363 }
364
365 /* Not found in this chunk, skip to next chunk. */
366
367 /* Don't let search_space_len wrap here, it's unsigned. */
368 if (search_space_len >= chunk_size)
369 search_space_len -= chunk_size;
370 else
371 search_space_len = 0;
372
373 if (search_space_len >= pattern_len)
374 {
375 unsigned keep_len = search_buf_size - chunk_size;
376 CORE_ADDR read_addr = start_addr + keep_len;
377 int nr_to_read;
378
379 /* Copy the trailing part of the previous iteration to the front
380 of the buffer for the next iteration. */
381 memcpy (search_buf, search_buf + chunk_size, keep_len);
382
383 nr_to_read = (search_space_len - keep_len < chunk_size
384 ? search_space_len - keep_len
385 : chunk_size);
386
387 if (read_inferior_memory (read_addr, search_buf + keep_len,
388 nr_to_read) != 0)
389 {
390 warning ("Unable to access target memory at 0x%lx, halting search.",
391 (long) read_addr);
392 return -1;
393 }
394
395 start_addr += chunk_size;
396 }
397 }
398
399 /* Not found. */
400
401 return 0;
402 }
403
404 /* Handle qSearch:memory packets. */
405
406 static void
407 handle_search_memory (char *own_buf, int packet_len)
408 {
409 CORE_ADDR start_addr;
410 CORE_ADDR search_space_len;
411 gdb_byte *pattern;
412 unsigned int pattern_len;
413 /* NOTE: also defined in find.c testcase. */
414 #define SEARCH_CHUNK_SIZE 16000
415 const unsigned chunk_size = SEARCH_CHUNK_SIZE;
416 /* Buffer to hold memory contents for searching. */
417 gdb_byte *search_buf;
418 unsigned search_buf_size;
419 int found;
420 CORE_ADDR found_addr;
421 int cmd_name_len = sizeof ("qSearch:memory:") - 1;
422
423 pattern = malloc (packet_len);
424 if (pattern == NULL)
425 {
426 error ("Unable to allocate memory to perform the search");
427 strcpy (own_buf, "E00");
428 return;
429 }
430 if (decode_search_memory_packet (own_buf + cmd_name_len,
431 packet_len - cmd_name_len,
432 &start_addr, &search_space_len,
433 pattern, &pattern_len) < 0)
434 {
435 free (pattern);
436 error ("Error in parsing qSearch:memory packet");
437 strcpy (own_buf, "E00");
438 return;
439 }
440
441 search_buf_size = chunk_size + pattern_len - 1;
442
443 /* No point in trying to allocate a buffer larger than the search space. */
444 if (search_space_len < search_buf_size)
445 search_buf_size = search_space_len;
446
447 search_buf = malloc (search_buf_size);
448 if (search_buf == NULL)
449 {
450 free (pattern);
451 error ("Unable to allocate memory to perform the search");
452 strcpy (own_buf, "E00");
453 return;
454 }
455
456 found = handle_search_memory_1 (start_addr, search_space_len,
457 pattern, pattern_len,
458 search_buf, chunk_size, search_buf_size,
459 &found_addr);
460
461 if (found > 0)
462 sprintf (own_buf, "1,%lx", (long) found_addr);
463 else if (found == 0)
464 strcpy (own_buf, "0");
465 else
466 strcpy (own_buf, "E00");
467
468 free (search_buf);
469 free (pattern);
470 }
471
472 #define require_running(BUF) \
473 if (!target_running ()) \
474 { \
475 write_enn (BUF); \
476 return; \
477 }
478
479 /* Handle all of the extended 'q' packets. */
480 void
481 handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
482 {
483 static struct inferior_list_entry *thread_ptr;
484
485 /* Reply the current thread id. */
486 if (strcmp ("qC", own_buf) == 0 && !disable_packet_qC)
487 {
488 require_running (own_buf);
489 thread_ptr = all_threads.head;
490 sprintf (own_buf, "QC%x",
491 thread_to_gdb_id ((struct thread_info *)thread_ptr));
492 return;
493 }
494
495 if (strcmp ("qSymbol::", own_buf) == 0)
496 {
497 if (target_running () && the_target->look_up_symbols != NULL)
498 (*the_target->look_up_symbols) ();
499
500 strcpy (own_buf, "OK");
501 return;
502 }
503
504 if (!disable_packet_qfThreadInfo)
505 {
506 if (strcmp ("qfThreadInfo", own_buf) == 0)
507 {
508 require_running (own_buf);
509 thread_ptr = all_threads.head;
510 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
511 thread_ptr = thread_ptr->next;
512 return;
513 }
514
515 if (strcmp ("qsThreadInfo", own_buf) == 0)
516 {
517 require_running (own_buf);
518 if (thread_ptr != NULL)
519 {
520 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
521 thread_ptr = thread_ptr->next;
522 return;
523 }
524 else
525 {
526 sprintf (own_buf, "l");
527 return;
528 }
529 }
530 }
531
532 if (the_target->read_offsets != NULL
533 && strcmp ("qOffsets", own_buf) == 0)
534 {
535 CORE_ADDR text, data;
536
537 require_running (own_buf);
538 if (the_target->read_offsets (&text, &data))
539 sprintf (own_buf, "Text=%lX;Data=%lX;Bss=%lX",
540 (long)text, (long)data, (long)data);
541 else
542 write_enn (own_buf);
543
544 return;
545 }
546
547 if (the_target->qxfer_spu != NULL
548 && strncmp ("qXfer:spu:read:", own_buf, 15) == 0)
549 {
550 char *annex;
551 int n;
552 unsigned int len;
553 CORE_ADDR ofs;
554 unsigned char *spu_buf;
555
556 require_running (own_buf);
557 strcpy (own_buf, "E00");
558 if (decode_xfer_read (own_buf + 15, &annex, &ofs, &len) < 0)
559 return;
560 if (len > PBUFSIZ - 2)
561 len = PBUFSIZ - 2;
562 spu_buf = malloc (len + 1);
563 if (!spu_buf)
564 return;
565
566 n = (*the_target->qxfer_spu) (annex, spu_buf, NULL, ofs, len + 1);
567 if (n < 0)
568 write_enn (own_buf);
569 else if (n > len)
570 *new_packet_len_p = write_qxfer_response
571 (own_buf, spu_buf, len, 1);
572 else
573 *new_packet_len_p = write_qxfer_response
574 (own_buf, spu_buf, n, 0);
575
576 free (spu_buf);
577 return;
578 }
579
580 if (the_target->qxfer_spu != NULL
581 && strncmp ("qXfer:spu:write:", own_buf, 16) == 0)
582 {
583 char *annex;
584 int n;
585 unsigned int len;
586 CORE_ADDR ofs;
587 unsigned char *spu_buf;
588
589 require_running (own_buf);
590 strcpy (own_buf, "E00");
591 spu_buf = malloc (packet_len - 15);
592 if (!spu_buf)
593 return;
594 if (decode_xfer_write (own_buf + 16, packet_len - 16, &annex,
595 &ofs, &len, spu_buf) < 0)
596 {
597 free (spu_buf);
598 return;
599 }
600
601 n = (*the_target->qxfer_spu)
602 (annex, NULL, (unsigned const char *)spu_buf, ofs, len);
603 if (n < 0)
604 write_enn (own_buf);
605 else
606 sprintf (own_buf, "%x", n);
607
608 free (spu_buf);
609 return;
610 }
611
612 if (the_target->read_auxv != NULL
613 && strncmp ("qXfer:auxv:read:", own_buf, 16) == 0)
614 {
615 unsigned char *data;
616 int n;
617 CORE_ADDR ofs;
618 unsigned int len;
619 char *annex;
620
621 require_running (own_buf);
622
623 /* Reject any annex; grab the offset and length. */
624 if (decode_xfer_read (own_buf + 16, &annex, &ofs, &len) < 0
625 || annex[0] != '\0')
626 {
627 strcpy (own_buf, "E00");
628 return;
629 }
630
631 /* Read one extra byte, as an indicator of whether there is
632 more. */
633 if (len > PBUFSIZ - 2)
634 len = PBUFSIZ - 2;
635 data = malloc (len + 1);
636 n = (*the_target->read_auxv) (ofs, data, len + 1);
637 if (n < 0)
638 write_enn (own_buf);
639 else if (n > len)
640 *new_packet_len_p = write_qxfer_response (own_buf, data, len, 1);
641 else
642 *new_packet_len_p = write_qxfer_response (own_buf, data, n, 0);
643
644 free (data);
645
646 return;
647 }
648
649 if (strncmp ("qXfer:features:read:", own_buf, 20) == 0)
650 {
651 CORE_ADDR ofs;
652 unsigned int len, total_len;
653 const char *document;
654 char *annex;
655
656 require_running (own_buf);
657
658 /* Grab the annex, offset, and length. */
659 if (decode_xfer_read (own_buf + 20, &annex, &ofs, &len) < 0)
660 {
661 strcpy (own_buf, "E00");
662 return;
663 }
664
665 /* Now grab the correct annex. */
666 document = get_features_xml (annex);
667 if (document == NULL)
668 {
669 strcpy (own_buf, "E00");
670 return;
671 }
672
673 total_len = strlen (document);
674 if (len > PBUFSIZ - 2)
675 len = PBUFSIZ - 2;
676
677 if (ofs > total_len)
678 write_enn (own_buf);
679 else if (len < total_len - ofs)
680 *new_packet_len_p = write_qxfer_response (own_buf, document + ofs,
681 len, 1);
682 else
683 *new_packet_len_p = write_qxfer_response (own_buf, document + ofs,
684 total_len - ofs, 0);
685
686 return;
687 }
688
689 if (strncmp ("qXfer:libraries:read:", own_buf, 21) == 0)
690 {
691 CORE_ADDR ofs;
692 unsigned int len, total_len;
693 char *document, *p;
694 struct inferior_list_entry *dll_ptr;
695 char *annex;
696
697 require_running (own_buf);
698
699 /* Reject any annex; grab the offset and length. */
700 if (decode_xfer_read (own_buf + 21, &annex, &ofs, &len) < 0
701 || annex[0] != '\0')
702 {
703 strcpy (own_buf, "E00");
704 return;
705 }
706
707 /* Over-estimate the necessary memory. Assume that every character
708 in the library name must be escaped. */
709 total_len = 64;
710 for (dll_ptr = all_dlls.head; dll_ptr != NULL; dll_ptr = dll_ptr->next)
711 total_len += 128 + 6 * strlen (((struct dll_info *) dll_ptr)->name);
712
713 document = malloc (total_len);
714 strcpy (document, "<library-list>\n");
715 p = document + strlen (document);
716
717 for (dll_ptr = all_dlls.head; dll_ptr != NULL; dll_ptr = dll_ptr->next)
718 {
719 struct dll_info *dll = (struct dll_info *) dll_ptr;
720 char *name;
721
722 strcpy (p, " <library name=\"");
723 p = p + strlen (p);
724 name = xml_escape_text (dll->name);
725 strcpy (p, name);
726 free (name);
727 p = p + strlen (p);
728 strcpy (p, "\"><segment address=\"");
729 p = p + strlen (p);
730 sprintf (p, "0x%lx", (long) dll->base_addr);
731 p = p + strlen (p);
732 strcpy (p, "\"/></library>\n");
733 p = p + strlen (p);
734 }
735
736 strcpy (p, "</library-list>\n");
737
738 total_len = strlen (document);
739 if (len > PBUFSIZ - 2)
740 len = PBUFSIZ - 2;
741
742 if (ofs > total_len)
743 write_enn (own_buf);
744 else if (len < total_len - ofs)
745 *new_packet_len_p = write_qxfer_response (own_buf, document + ofs,
746 len, 1);
747 else
748 *new_packet_len_p = write_qxfer_response (own_buf, document + ofs,
749 total_len - ofs, 0);
750
751 free (document);
752 return;
753 }
754
755 /* Protocol features query. */
756 if (strncmp ("qSupported", own_buf, 10) == 0
757 && (own_buf[10] == ':' || own_buf[10] == '\0'))
758 {
759 sprintf (own_buf, "PacketSize=%x;QPassSignals+", PBUFSIZ - 1);
760
761 /* We do not have any hook to indicate whether the target backend
762 supports qXfer:libraries:read, so always report it. */
763 strcat (own_buf, ";qXfer:libraries:read+");
764
765 if (the_target->read_auxv != NULL)
766 strcat (own_buf, ";qXfer:auxv:read+");
767
768 if (the_target->qxfer_spu != NULL)
769 strcat (own_buf, ";qXfer:spu:read+;qXfer:spu:write+");
770
771 /* We always report qXfer:features:read, as targets may
772 install XML files on a subsequent call to arch_setup.
773 If we reported to GDB on startup that we don't support
774 qXfer:feature:read at all, we will never be re-queried. */
775 strcat (own_buf, ";qXfer:features:read+");
776
777 return;
778 }
779
780 /* Thread-local storage support. */
781 if (the_target->get_tls_address != NULL
782 && strncmp ("qGetTLSAddr:", own_buf, 12) == 0)
783 {
784 char *p = own_buf + 12;
785 CORE_ADDR parts[3], address = 0;
786 int i, err;
787
788 require_running (own_buf);
789
790 for (i = 0; i < 3; i++)
791 {
792 char *p2;
793 int len;
794
795 if (p == NULL)
796 break;
797
798 p2 = strchr (p, ',');
799 if (p2)
800 {
801 len = p2 - p;
802 p2++;
803 }
804 else
805 {
806 len = strlen (p);
807 p2 = NULL;
808 }
809
810 decode_address (&parts[i], p, len);
811 p = p2;
812 }
813
814 if (p != NULL || i < 3)
815 err = 1;
816 else
817 {
818 struct thread_info *thread = gdb_id_to_thread (parts[0]);
819
820 if (thread == NULL)
821 err = 2;
822 else
823 err = the_target->get_tls_address (thread, parts[1], parts[2],
824 &address);
825 }
826
827 if (err == 0)
828 {
829 sprintf (own_buf, "%llx", address);
830 return;
831 }
832 else if (err > 0)
833 {
834 write_enn (own_buf);
835 return;
836 }
837
838 /* Otherwise, pretend we do not understand this packet. */
839 }
840
841 /* Handle "monitor" commands. */
842 if (strncmp ("qRcmd,", own_buf, 6) == 0)
843 {
844 char *mon = malloc (PBUFSIZ);
845 int len = strlen (own_buf + 6);
846
847 if ((len % 2) != 0 || unhexify (mon, own_buf + 6, len / 2) != len / 2)
848 {
849 write_enn (own_buf);
850 free (mon);
851 return;
852 }
853 mon[len / 2] = '\0';
854
855 write_ok (own_buf);
856
857 if (strcmp (mon, "set debug 1") == 0)
858 {
859 debug_threads = 1;
860 monitor_output ("Debug output enabled.\n");
861 }
862 else if (strcmp (mon, "set debug 0") == 0)
863 {
864 debug_threads = 0;
865 monitor_output ("Debug output disabled.\n");
866 }
867 else if (strcmp (mon, "set remote-debug 1") == 0)
868 {
869 remote_debug = 1;
870 monitor_output ("Protocol debug output enabled.\n");
871 }
872 else if (strcmp (mon, "set remote-debug 0") == 0)
873 {
874 remote_debug = 0;
875 monitor_output ("Protocol debug output disabled.\n");
876 }
877 else if (strcmp (mon, "help") == 0)
878 monitor_show_help ();
879 else if (strcmp (mon, "exit") == 0)
880 exit_requested = 1;
881 else
882 {
883 monitor_output ("Unknown monitor command.\n\n");
884 monitor_show_help ();
885 write_enn (own_buf);
886 }
887
888 free (mon);
889 return;
890 }
891
892 if (strncmp ("qSearch:memory:", own_buf, sizeof ("qSearch:memory:") - 1) == 0)
893 {
894 require_running (own_buf);
895 handle_search_memory (own_buf, packet_len);
896 return;
897 }
898
899 /* Otherwise we didn't know what packet it was. Say we didn't
900 understand it. */
901 own_buf[0] = 0;
902 }
903
904 /* Parse vCont packets. */
905 void
906 handle_v_cont (char *own_buf, char *status, int *signal)
907 {
908 char *p, *q;
909 int n = 0, i = 0;
910 struct thread_resume *resume_info, default_action;
911
912 /* Count the number of semicolons in the packet. There should be one
913 for every action. */
914 p = &own_buf[5];
915 while (p)
916 {
917 n++;
918 p++;
919 p = strchr (p, ';');
920 }
921 /* Allocate room for one extra action, for the default remain-stopped
922 behavior; if no default action is in the list, we'll need the extra
923 slot. */
924 resume_info = malloc ((n + 1) * sizeof (resume_info[0]));
925
926 default_action.thread = -1;
927 default_action.leave_stopped = 1;
928 default_action.step = 0;
929 default_action.sig = 0;
930
931 p = &own_buf[5];
932 i = 0;
933 while (*p)
934 {
935 p++;
936
937 resume_info[i].leave_stopped = 0;
938
939 if (p[0] == 's' || p[0] == 'S')
940 resume_info[i].step = 1;
941 else if (p[0] == 'c' || p[0] == 'C')
942 resume_info[i].step = 0;
943 else
944 goto err;
945
946 if (p[0] == 'S' || p[0] == 'C')
947 {
948 int sig;
949 sig = strtol (p + 1, &q, 16);
950 if (p == q)
951 goto err;
952 p = q;
953
954 if (!target_signal_to_host_p (sig))
955 goto err;
956 resume_info[i].sig = target_signal_to_host (sig);
957 }
958 else
959 {
960 resume_info[i].sig = 0;
961 p = p + 1;
962 }
963
964 if (p[0] == 0)
965 {
966 resume_info[i].thread = -1;
967 default_action = resume_info[i];
968
969 /* Note: we don't increment i here, we'll overwrite this entry
970 the next time through. */
971 }
972 else if (p[0] == ':')
973 {
974 unsigned int gdb_id = strtoul (p + 1, &q, 16);
975 unsigned long thread_id;
976
977 if (p == q)
978 goto err;
979 p = q;
980 if (p[0] != ';' && p[0] != 0)
981 goto err;
982
983 thread_id = gdb_id_to_thread_id (gdb_id);
984 if (thread_id)
985 resume_info[i].thread = thread_id;
986 else
987 goto err;
988
989 i++;
990 }
991 }
992
993 resume_info[i] = default_action;
994
995 /* Still used in occasional places in the backend. */
996 if (n == 1 && resume_info[0].thread != -1)
997 cont_thread = resume_info[0].thread;
998 else
999 cont_thread = -1;
1000 set_desired_inferior (0);
1001
1002 enable_async_io ();
1003 (*the_target->resume) (resume_info);
1004
1005 free (resume_info);
1006
1007 *signal = mywait (status, 1);
1008 prepare_resume_reply (own_buf, *status, *signal);
1009 disable_async_io ();
1010 return;
1011
1012 err:
1013 write_enn (own_buf);
1014 free (resume_info);
1015 return;
1016 }
1017
1018 /* Attach to a new program. Return 1 if successful, 0 if failure. */
1019 int
1020 handle_v_attach (char *own_buf, char *status, int *signal)
1021 {
1022 int pid;
1023
1024 pid = strtol (own_buf + 8, NULL, 16);
1025 if (pid != 0 && attach_inferior (pid, status, signal) == 0)
1026 {
1027 prepare_resume_reply (own_buf, *status, *signal);
1028 return 1;
1029 }
1030 else
1031 {
1032 write_enn (own_buf);
1033 return 0;
1034 }
1035 }
1036
1037 /* Run a new program. Return 1 if successful, 0 if failure. */
1038 static int
1039 handle_v_run (char *own_buf, char *status, int *signal)
1040 {
1041 char *p, **pp, *next_p, **new_argv;
1042 int i, new_argc;
1043
1044 new_argc = 0;
1045 for (p = own_buf + strlen ("vRun;"); p && *p; p = strchr (p, ';'))
1046 {
1047 p++;
1048 new_argc++;
1049 }
1050
1051 new_argv = malloc ((new_argc + 2) * sizeof (char *));
1052 i = 0;
1053 for (p = own_buf + strlen ("vRun;"); *p; p = next_p)
1054 {
1055 next_p = strchr (p, ';');
1056 if (next_p == NULL)
1057 next_p = p + strlen (p);
1058
1059 if (i == 0 && p == next_p)
1060 new_argv[i] = NULL;
1061 else
1062 {
1063 new_argv[i] = malloc (1 + (next_p - p) / 2);
1064 unhexify (new_argv[i], p, (next_p - p) / 2);
1065 new_argv[i][(next_p - p) / 2] = '\0';
1066 }
1067
1068 if (*next_p)
1069 next_p++;
1070 i++;
1071 }
1072 new_argv[i] = NULL;
1073
1074 if (new_argv[0] == NULL)
1075 {
1076 if (program_argv == NULL)
1077 {
1078 write_enn (own_buf);
1079 return 0;
1080 }
1081
1082 new_argv[0] = strdup (program_argv[0]);
1083 }
1084
1085 /* Free the old argv. */
1086 if (program_argv)
1087 {
1088 for (pp = program_argv; *pp != NULL; pp++)
1089 free (*pp);
1090 free (program_argv);
1091 }
1092 program_argv = new_argv;
1093
1094 *signal = start_inferior (program_argv, status);
1095 if (*status == 'T')
1096 {
1097 prepare_resume_reply (own_buf, *status, *signal);
1098 return 1;
1099 }
1100 else
1101 {
1102 write_enn (own_buf);
1103 return 0;
1104 }
1105 }
1106
1107 /* Handle all of the extended 'v' packets. */
1108 void
1109 handle_v_requests (char *own_buf, char *status, int *signal,
1110 int packet_len, int *new_packet_len)
1111 {
1112 if (!disable_packet_vCont)
1113 {
1114 if (strncmp (own_buf, "vCont;", 6) == 0)
1115 {
1116 require_running (own_buf);
1117 handle_v_cont (own_buf, status, signal);
1118 return;
1119 }
1120
1121 if (strncmp (own_buf, "vCont?", 6) == 0)
1122 {
1123 strcpy (own_buf, "vCont;c;C;s;S");
1124 return;
1125 }
1126 }
1127
1128 if (strncmp (own_buf, "vFile:", 6) == 0
1129 && handle_vFile (own_buf, packet_len, new_packet_len))
1130 return;
1131
1132 if (strncmp (own_buf, "vAttach;", 8) == 0)
1133 {
1134 if (target_running ())
1135 {
1136 fprintf (stderr, "Already debugging a process\n");
1137 write_enn (own_buf);
1138 return;
1139 }
1140 handle_v_attach (own_buf, status, signal);
1141 return;
1142 }
1143
1144 if (strncmp (own_buf, "vRun;", 5) == 0)
1145 {
1146 if (target_running ())
1147 {
1148 fprintf (stderr, "Already debugging a process\n");
1149 write_enn (own_buf);
1150 return;
1151 }
1152 handle_v_run (own_buf, status, signal);
1153 return;
1154 }
1155
1156 /* Otherwise we didn't know what packet it was. Say we didn't
1157 understand it. */
1158 own_buf[0] = 0;
1159 return;
1160 }
1161
1162 void
1163 myresume (char *own_buf, int step, int *signalp, char *statusp)
1164 {
1165 struct thread_resume resume_info[2];
1166 int n = 0;
1167 int sig = *signalp;
1168
1169 set_desired_inferior (0);
1170
1171 if (step || sig || (cont_thread != 0 && cont_thread != -1))
1172 {
1173 resume_info[0].thread
1174 = ((struct inferior_list_entry *) current_inferior)->id;
1175 resume_info[0].step = step;
1176 resume_info[0].sig = sig;
1177 resume_info[0].leave_stopped = 0;
1178 n++;
1179 }
1180 resume_info[n].thread = -1;
1181 resume_info[n].step = 0;
1182 resume_info[n].sig = 0;
1183 resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
1184
1185 enable_async_io ();
1186 (*the_target->resume) (resume_info);
1187 *signalp = mywait (statusp, 1);
1188 prepare_resume_reply (own_buf, *statusp, *signalp);
1189 disable_async_io ();
1190 }
1191
1192 static void
1193 gdbserver_version (void)
1194 {
1195 printf ("GNU gdbserver %s%s\n"
1196 "Copyright (C) 2007 Free Software Foundation, Inc.\n"
1197 "gdbserver is free software, covered by the GNU General Public License.\n"
1198 "This gdbserver was configured as \"%s\"\n",
1199 PKGVERSION, version, host_name);
1200 }
1201
1202 static void
1203 gdbserver_usage (FILE *stream)
1204 {
1205 fprintf (stream, "Usage:\tgdbserver [OPTIONS] COMM PROG [ARGS ...]\n"
1206 "\tgdbserver [OPTIONS] --attach COMM PID\n"
1207 "\tgdbserver [OPTIONS] --multi COMM\n"
1208 "\n"
1209 "COMM may either be a tty device (for serial debugging), or \n"
1210 "HOST:PORT to listen for a TCP connection.\n"
1211 "\n"
1212 "Options:\n"
1213 " --debug\t\tEnable debugging output.\n"
1214 " --version\t\tDisplay version information and exit.\n"
1215 " --wrapper WRAPPER --\tRun WRAPPER to start new programs.\n");
1216 if (REPORT_BUGS_TO[0] && stream == stdout)
1217 fprintf (stream, "Report bugs to \"%s\".\n", REPORT_BUGS_TO);
1218 }
1219
1220 static void
1221 gdbserver_show_disableable (FILE *stream)
1222 {
1223 fprintf (stream, "Disableable packets:\n"
1224 " vCont \tAll vCont packets\n"
1225 " qC \tQuerying the current thread\n"
1226 " qfThreadInfo\tThread listing\n"
1227 " Tthread \tPassing the thread specifier in the T stop reply packet\n"
1228 " threads \tAll of the above\n");
1229 }
1230
1231
1232 #undef require_running
1233 #define require_running(BUF) \
1234 if (!target_running ()) \
1235 { \
1236 write_enn (BUF); \
1237 break; \
1238 }
1239
1240 int
1241 main (int argc, char *argv[])
1242 {
1243 char ch, status, *own_buf;
1244 unsigned char *mem_buf;
1245 int i = 0;
1246 int signal;
1247 unsigned int len;
1248 CORE_ADDR mem_addr;
1249 int bad_attach;
1250 int pid;
1251 char *arg_end, *port;
1252 char **next_arg = &argv[1];
1253 int multi_mode = 0;
1254 int attach = 0;
1255 int was_running;
1256
1257 while (*next_arg != NULL && **next_arg == '-')
1258 {
1259 if (strcmp (*next_arg, "--version") == 0)
1260 {
1261 gdbserver_version ();
1262 exit (0);
1263 }
1264 else if (strcmp (*next_arg, "--help") == 0)
1265 {
1266 gdbserver_usage (stdout);
1267 exit (0);
1268 }
1269 else if (strcmp (*next_arg, "--attach") == 0)
1270 attach = 1;
1271 else if (strcmp (*next_arg, "--multi") == 0)
1272 multi_mode = 1;
1273 else if (strcmp (*next_arg, "--wrapper") == 0)
1274 {
1275 next_arg++;
1276
1277 wrapper_argv = next_arg;
1278 while (*next_arg != NULL && strcmp (*next_arg, "--") != 0)
1279 next_arg++;
1280
1281 if (next_arg == wrapper_argv || *next_arg == NULL)
1282 {
1283 gdbserver_usage (stderr);
1284 exit (1);
1285 }
1286
1287 /* Consume the "--". */
1288 *next_arg = NULL;
1289 }
1290 else if (strcmp (*next_arg, "--debug") == 0)
1291 debug_threads = 1;
1292 else if (strcmp (*next_arg, "--disable-packet") == 0)
1293 {
1294 gdbserver_show_disableable (stdout);
1295 exit (0);
1296 }
1297 else if (strncmp (*next_arg,
1298 "--disable-packet=",
1299 sizeof ("--disable-packet=") - 1) == 0)
1300 {
1301 char *packets, *tok;
1302
1303 packets = *next_arg += sizeof ("--disable-packet=") - 1;
1304 for (tok = strtok (packets, ",");
1305 tok != NULL;
1306 tok = strtok (NULL, ","))
1307 {
1308 if (strcmp ("vCont", tok) == 0)
1309 disable_packet_vCont = 1;
1310 else if (strcmp ("Tthread", tok) == 0)
1311 disable_packet_Tthread = 1;
1312 else if (strcmp ("qC", tok) == 0)
1313 disable_packet_qC = 1;
1314 else if (strcmp ("qfThreadInfo", tok) == 0)
1315 disable_packet_qfThreadInfo = 1;
1316 else if (strcmp ("threads", tok) == 0)
1317 {
1318 disable_packet_vCont = 1;
1319 disable_packet_Tthread = 1;
1320 disable_packet_qC = 1;
1321 disable_packet_qfThreadInfo = 1;
1322 }
1323 else
1324 {
1325 fprintf (stderr, "Don't know how to disable \"%s\".\n\n",
1326 tok);
1327 gdbserver_show_disableable (stderr);
1328 exit (1);
1329 }
1330 }
1331 }
1332 else
1333 {
1334 fprintf (stderr, "Unknown argument: %s\n", *next_arg);
1335 exit (1);
1336 }
1337
1338 next_arg++;
1339 continue;
1340 }
1341
1342 if (setjmp (toplevel))
1343 {
1344 fprintf (stderr, "Exiting\n");
1345 exit (1);
1346 }
1347
1348 port = *next_arg;
1349 next_arg++;
1350 if (port == NULL || (!attach && !multi_mode && *next_arg == NULL))
1351 {
1352 gdbserver_usage (stderr);
1353 exit (1);
1354 }
1355
1356 bad_attach = 0;
1357 pid = 0;
1358
1359 /* --attach used to come after PORT, so allow it there for
1360 compatibility. */
1361 if (*next_arg != NULL && strcmp (*next_arg, "--attach") == 0)
1362 {
1363 attach = 1;
1364 next_arg++;
1365 }
1366
1367 if (attach
1368 && (*next_arg == NULL
1369 || (*next_arg)[0] == '\0'
1370 || (pid = strtoul (*next_arg, &arg_end, 0)) == 0
1371 || *arg_end != '\0'
1372 || next_arg[1] != NULL))
1373 bad_attach = 1;
1374
1375 if (bad_attach)
1376 {
1377 gdbserver_usage (stderr);
1378 exit (1);
1379 }
1380
1381 initialize_async_io ();
1382 initialize_low ();
1383
1384 own_buf = malloc (PBUFSIZ + 1);
1385 mem_buf = malloc (PBUFSIZ);
1386
1387 if (pid == 0 && *next_arg != NULL)
1388 {
1389 int i, n;
1390
1391 n = argc - (next_arg - argv);
1392 program_argv = malloc (sizeof (char *) * (n + 1));
1393 for (i = 0; i < n; i++)
1394 program_argv[i] = strdup (next_arg[i]);
1395 program_argv[i] = NULL;
1396
1397 /* Wait till we are at first instruction in program. */
1398 signal = start_inferior (program_argv, &status);
1399
1400 /* We are now (hopefully) stopped at the first instruction of
1401 the target process. This assumes that the target process was
1402 successfully created. */
1403 }
1404 else if (pid != 0)
1405 {
1406 if (attach_inferior (pid, &status, &signal) == -1)
1407 error ("Attaching not supported on this target");
1408
1409 /* Otherwise succeeded. */
1410 }
1411 else
1412 {
1413 status = 'W';
1414 signal = 0;
1415 }
1416
1417 /* Don't report shared library events on the initial connection,
1418 even if some libraries are preloaded. Avoids the "stopped by
1419 shared library event" notice on gdb side. */
1420 dlls_changed = 0;
1421
1422 if (setjmp (toplevel))
1423 {
1424 fprintf (stderr, "Killing inferior\n");
1425 kill_inferior ();
1426 exit (1);
1427 }
1428
1429 if (status == 'W' || status == 'X')
1430 was_running = 0;
1431 else
1432 was_running = 1;
1433
1434 if (!was_running && !multi_mode)
1435 {
1436 fprintf (stderr, "No program to debug. GDBserver exiting.\n");
1437 exit (1);
1438 }
1439
1440 while (1)
1441 {
1442 remote_open (port);
1443
1444 restart:
1445 if (setjmp (toplevel) != 0)
1446 {
1447 /* An error occurred. */
1448 if (response_needed)
1449 {
1450 write_enn (own_buf);
1451 putpkt (own_buf);
1452 }
1453 }
1454
1455 disable_async_io ();
1456 while (!exit_requested)
1457 {
1458 unsigned char sig;
1459 int packet_len;
1460 int new_packet_len = -1;
1461
1462 response_needed = 0;
1463 packet_len = getpkt (own_buf);
1464 if (packet_len <= 0)
1465 break;
1466 response_needed = 1;
1467
1468 i = 0;
1469 ch = own_buf[i++];
1470 switch (ch)
1471 {
1472 case 'q':
1473 handle_query (own_buf, packet_len, &new_packet_len);
1474 break;
1475 case 'Q':
1476 handle_general_set (own_buf);
1477 break;
1478 case 'D':
1479 require_running (own_buf);
1480 fprintf (stderr, "Detaching from inferior\n");
1481 if (detach_inferior () != 0)
1482 write_enn (own_buf);
1483 else
1484 {
1485 write_ok (own_buf);
1486
1487 if (extended_protocol)
1488 {
1489 /* Treat this like a normal program exit. */
1490 signal = 0;
1491 status = 'W';
1492 }
1493 else
1494 {
1495 putpkt (own_buf);
1496 remote_close ();
1497
1498 /* If we are attached, then we can exit. Otherwise, we
1499 need to hang around doing nothing, until the child
1500 is gone. */
1501 if (!attached)
1502 join_inferior ();
1503
1504 exit (0);
1505 }
1506 }
1507 break;
1508 case '!':
1509 extended_protocol = 1;
1510 write_ok (own_buf);
1511 break;
1512 case '?':
1513 prepare_resume_reply (own_buf, status, signal);
1514 break;
1515 case 'H':
1516 if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's')
1517 {
1518 unsigned long gdb_id, thread_id;
1519
1520 require_running (own_buf);
1521 gdb_id = strtoul (&own_buf[2], NULL, 16);
1522 if (gdb_id == 0 || gdb_id == -1)
1523 thread_id = gdb_id;
1524 else
1525 {
1526 thread_id = gdb_id_to_thread_id (gdb_id);
1527 if (thread_id == 0)
1528 {
1529 write_enn (own_buf);
1530 break;
1531 }
1532 }
1533
1534 if (own_buf[1] == 'g')
1535 {
1536 general_thread = thread_id;
1537 set_desired_inferior (1);
1538 }
1539 else if (own_buf[1] == 'c')
1540 cont_thread = thread_id;
1541 else if (own_buf[1] == 's')
1542 step_thread = thread_id;
1543
1544 write_ok (own_buf);
1545 }
1546 else
1547 {
1548 /* Silently ignore it so that gdb can extend the protocol
1549 without compatibility headaches. */
1550 own_buf[0] = '\0';
1551 }
1552 break;
1553 case 'g':
1554 require_running (own_buf);
1555 set_desired_inferior (1);
1556 registers_to_string (own_buf);
1557 break;
1558 case 'G':
1559 require_running (own_buf);
1560 set_desired_inferior (1);
1561 registers_from_string (&own_buf[1]);
1562 write_ok (own_buf);
1563 break;
1564 case 'm':
1565 require_running (own_buf);
1566 decode_m_packet (&own_buf[1], &mem_addr, &len);
1567 if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
1568 convert_int_to_ascii (mem_buf, own_buf, len);
1569 else
1570 write_enn (own_buf);
1571 break;
1572 case 'M':
1573 require_running (own_buf);
1574 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
1575 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
1576 write_ok (own_buf);
1577 else
1578 write_enn (own_buf);
1579 break;
1580 case 'X':
1581 require_running (own_buf);
1582 if (decode_X_packet (&own_buf[1], packet_len - 1,
1583 &mem_addr, &len, mem_buf) < 0
1584 || write_inferior_memory (mem_addr, mem_buf, len) != 0)
1585 write_enn (own_buf);
1586 else
1587 write_ok (own_buf);
1588 break;
1589 case 'C':
1590 require_running (own_buf);
1591 convert_ascii_to_int (own_buf + 1, &sig, 1);
1592 if (target_signal_to_host_p (sig))
1593 signal = target_signal_to_host (sig);
1594 else
1595 signal = 0;
1596 myresume (own_buf, 0, &signal, &status);
1597 break;
1598 case 'S':
1599 require_running (own_buf);
1600 convert_ascii_to_int (own_buf + 1, &sig, 1);
1601 if (target_signal_to_host_p (sig))
1602 signal = target_signal_to_host (sig);
1603 else
1604 signal = 0;
1605 myresume (own_buf, 1, &signal, &status);
1606 break;
1607 case 'c':
1608 require_running (own_buf);
1609 signal = 0;
1610 myresume (own_buf, 0, &signal, &status);
1611 break;
1612 case 's':
1613 require_running (own_buf);
1614 signal = 0;
1615 myresume (own_buf, 1, &signal, &status);
1616 break;
1617 case 'Z':
1618 {
1619 char *lenptr;
1620 char *dataptr;
1621 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
1622 int len = strtol (lenptr + 1, &dataptr, 16);
1623 char type = own_buf[1];
1624
1625 if (the_target->insert_watchpoint == NULL
1626 || (type < '2' || type > '4'))
1627 {
1628 /* No watchpoint support or not a watchpoint command;
1629 unrecognized either way. */
1630 own_buf[0] = '\0';
1631 }
1632 else
1633 {
1634 int res;
1635
1636 require_running (own_buf);
1637 res = (*the_target->insert_watchpoint) (type, addr, len);
1638 if (res == 0)
1639 write_ok (own_buf);
1640 else if (res == 1)
1641 /* Unsupported. */
1642 own_buf[0] = '\0';
1643 else
1644 write_enn (own_buf);
1645 }
1646 break;
1647 }
1648 case 'z':
1649 {
1650 char *lenptr;
1651 char *dataptr;
1652 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
1653 int len = strtol (lenptr + 1, &dataptr, 16);
1654 char type = own_buf[1];
1655
1656 if (the_target->remove_watchpoint == NULL
1657 || (type < '2' || type > '4'))
1658 {
1659 /* No watchpoint support or not a watchpoint command;
1660 unrecognized either way. */
1661 own_buf[0] = '\0';
1662 }
1663 else
1664 {
1665 int res;
1666
1667 require_running (own_buf);
1668 res = (*the_target->remove_watchpoint) (type, addr, len);
1669 if (res == 0)
1670 write_ok (own_buf);
1671 else if (res == 1)
1672 /* Unsupported. */
1673 own_buf[0] = '\0';
1674 else
1675 write_enn (own_buf);
1676 }
1677 break;
1678 }
1679 case 'k':
1680 response_needed = 0;
1681 if (!target_running ())
1682 /* The packet we received doesn't make sense - but we
1683 can't reply to it, either. */
1684 goto restart;
1685
1686 fprintf (stderr, "Killing inferior\n");
1687 kill_inferior ();
1688
1689 /* When using the extended protocol, we wait with no
1690 program running. The traditional protocol will exit
1691 instead. */
1692 if (extended_protocol)
1693 {
1694 status = 'X';
1695 signal = TARGET_SIGNAL_KILL;
1696 was_running = 0;
1697 goto restart;
1698 }
1699 else
1700 {
1701 exit (0);
1702 break;
1703 }
1704 case 'T':
1705 {
1706 unsigned long gdb_id, thread_id;
1707
1708 require_running (own_buf);
1709 gdb_id = strtoul (&own_buf[1], NULL, 16);
1710 thread_id = gdb_id_to_thread_id (gdb_id);
1711 if (thread_id == 0)
1712 {
1713 write_enn (own_buf);
1714 break;
1715 }
1716
1717 if (mythread_alive (thread_id))
1718 write_ok (own_buf);
1719 else
1720 write_enn (own_buf);
1721 }
1722 break;
1723 case 'R':
1724 response_needed = 0;
1725
1726 /* Restarting the inferior is only supported in the
1727 extended protocol. */
1728 if (extended_protocol)
1729 {
1730 if (target_running ())
1731 kill_inferior ();
1732 fprintf (stderr, "GDBserver restarting\n");
1733
1734 /* Wait till we are at 1st instruction in prog. */
1735 if (program_argv != NULL)
1736 signal = start_inferior (program_argv, &status);
1737 else
1738 {
1739 status = 'X';
1740 signal = TARGET_SIGNAL_KILL;
1741 }
1742 goto restart;
1743 }
1744 else
1745 {
1746 /* It is a request we don't understand. Respond with an
1747 empty packet so that gdb knows that we don't support this
1748 request. */
1749 own_buf[0] = '\0';
1750 break;
1751 }
1752 case 'v':
1753 /* Extended (long) request. */
1754 handle_v_requests (own_buf, &status, &signal,
1755 packet_len, &new_packet_len);
1756 break;
1757
1758 default:
1759 /* It is a request we don't understand. Respond with an
1760 empty packet so that gdb knows that we don't support this
1761 request. */
1762 own_buf[0] = '\0';
1763 break;
1764 }
1765
1766 if (new_packet_len != -1)
1767 putpkt_binary (own_buf, new_packet_len);
1768 else
1769 putpkt (own_buf);
1770
1771 response_needed = 0;
1772
1773 if (was_running && (status == 'W' || status == 'X'))
1774 {
1775 was_running = 0;
1776
1777 if (status == 'W')
1778 fprintf (stderr,
1779 "\nChild exited with status %d\n", signal);
1780 if (status == 'X')
1781 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
1782 target_signal_to_host (signal),
1783 target_signal_to_name (signal));
1784
1785 if (extended_protocol)
1786 goto restart;
1787 else
1788 {
1789 fprintf (stderr, "GDBserver exiting\n");
1790 exit (0);
1791 }
1792 }
1793
1794 if (status != 'W' && status != 'X')
1795 was_running = 1;
1796 }
1797
1798 /* If an exit was requested (using the "monitor exit" command),
1799 terminate now. The only other way to get here is for
1800 getpkt to fail; close the connection and reopen it at the
1801 top of the loop. */
1802
1803 if (exit_requested)
1804 {
1805 remote_close ();
1806 if (attached && target_running ())
1807 detach_inferior ();
1808 else if (target_running ())
1809 kill_inferior ();
1810 exit (0);
1811 }
1812 else
1813 {
1814 fprintf (stderr, "Remote side has terminated connection. "
1815 "GDBserver will reopen the connection.\n");
1816 remote_close ();
1817 }
1818 }
1819 }
This page took 0.068401 seconds and 4 git commands to generate.