61a08a175d6eb7c9e0e1a3ba20b9b87f9dad540c
[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 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 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., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
21
22 #include "server.h"
23
24 #if HAVE_UNISTD_H
25 #include <unistd.h>
26 #endif
27 #if HAVE_SIGNAL_H
28 #include <signal.h>
29 #endif
30 #if HAVE_SYS_WAIT_H
31 #include <sys/wait.h>
32 #endif
33
34 unsigned long cont_thread;
35 unsigned long general_thread;
36 unsigned long step_thread;
37 unsigned long thread_from_wait;
38 unsigned long old_thread_from_wait;
39 int extended_protocol;
40 int server_waiting;
41
42 /* Enable miscellaneous debugging output. The name is historical - it
43 was originally used to debug LinuxThreads support. */
44 int debug_threads;
45
46 int pass_signals[TARGET_SIGNAL_LAST];
47
48 jmp_buf toplevel;
49
50 /* The PID of the originally created or attached inferior. Used to
51 send signals to the process when GDB sends us an asynchronous interrupt
52 (user hitting Control-C in the client), and to wait for the child to exit
53 when no longer debugging it. */
54
55 unsigned long signal_pid;
56
57 #ifdef SIGTTOU
58 /* A file descriptor for the controlling terminal. */
59 int terminal_fd;
60
61 /* TERMINAL_FD's original foreground group. */
62 pid_t old_foreground_pgrp;
63
64 /* Hand back terminal ownership to the original foreground group. */
65
66 static void
67 restore_old_foreground_pgrp (void)
68 {
69 tcsetpgrp (terminal_fd, old_foreground_pgrp);
70 }
71 #endif
72
73 static int
74 start_inferior (char *argv[], char *statusptr)
75 {
76 #ifdef SIGTTOU
77 signal (SIGTTOU, SIG_DFL);
78 signal (SIGTTIN, SIG_DFL);
79 #endif
80
81 signal_pid = create_inferior (argv[0], argv);
82
83 fprintf (stderr, "Process %s created; pid = %ld\n", argv[0],
84 signal_pid);
85 fflush (stderr);
86
87 #ifdef SIGTTOU
88 signal (SIGTTOU, SIG_IGN);
89 signal (SIGTTIN, SIG_IGN);
90 terminal_fd = fileno (stderr);
91 old_foreground_pgrp = tcgetpgrp (terminal_fd);
92 tcsetpgrp (terminal_fd, signal_pid);
93 atexit (restore_old_foreground_pgrp);
94 #endif
95
96 /* Wait till we are at 1st instruction in program, return signal number. */
97 return mywait (statusptr, 0);
98 }
99
100 static int
101 attach_inferior (int pid, char *statusptr, int *sigptr)
102 {
103 /* myattach should return -1 if attaching is unsupported,
104 0 if it succeeded, and call error() otherwise. */
105
106 if (myattach (pid) != 0)
107 return -1;
108
109 fprintf (stderr, "Attached; pid = %d\n", pid);
110 fflush (stderr);
111
112 /* FIXME - It may be that we should get the SIGNAL_PID from the
113 attach function, so that it can be the main thread instead of
114 whichever we were told to attach to. */
115 signal_pid = pid;
116
117 *sigptr = mywait (statusptr, 0);
118
119 /* GDB knows to ignore the first SIGSTOP after attaching to a running
120 process using the "attach" command, but this is different; it's
121 just using "target remote". Pretend it's just starting up. */
122 if (*statusptr == 'T' && *sigptr == TARGET_SIGNAL_STOP)
123 *sigptr = TARGET_SIGNAL_TRAP;
124
125 return 0;
126 }
127
128 extern int remote_debug;
129
130 /* Decode a qXfer read request. Return 0 if everything looks OK,
131 or -1 otherwise. */
132
133 static int
134 decode_xfer_read (char *buf, char **annex, CORE_ADDR *ofs, unsigned int *len)
135 {
136 /* Extract and NUL-terminate the annex. */
137 *annex = buf;
138 while (*buf && *buf != ':')
139 buf++;
140 if (*buf == '\0')
141 return -1;
142 *buf++ = 0;
143
144 /* After the read/write marker and annex, qXfer looks like a
145 traditional 'm' packet. */
146 decode_m_packet (buf, ofs, len);
147
148 return 0;
149 }
150
151 /* Write the response to a successful qXfer read. Returns the
152 length of the (binary) data stored in BUF, corresponding
153 to as much of DATA/LEN as we could fit. IS_MORE controls
154 the first character of the response. */
155 static int
156 write_qxfer_response (char *buf, const void *data, int len, int is_more)
157 {
158 int out_len;
159
160 if (is_more)
161 buf[0] = 'm';
162 else
163 buf[0] = 'l';
164
165 return remote_escape_output (data, len, (unsigned char *) buf + 1, &out_len,
166 PBUFSIZ - 2) + 1;
167 }
168
169 /* Handle all of the extended 'Q' packets. */
170 void
171 handle_general_set (char *own_buf)
172 {
173 if (strncmp ("QPassSignals:", own_buf, strlen ("QPassSignals:")) == 0)
174 {
175 int numsigs = (int) TARGET_SIGNAL_LAST, i;
176 const char *p = own_buf + strlen ("QPassSignals:");
177 CORE_ADDR cursig;
178
179 p = decode_address_to_semicolon (&cursig, p);
180 for (i = 0; i < numsigs; i++)
181 {
182 if (i == cursig)
183 {
184 pass_signals[i] = 1;
185 if (*p == '\0')
186 /* Keep looping, to clear the remaining signals. */
187 cursig = -1;
188 else
189 p = decode_address_to_semicolon (&cursig, p);
190 }
191 else
192 pass_signals[i] = 0;
193 }
194 strcpy (own_buf, "OK");
195 return;
196 }
197
198 /* Otherwise we didn't know what packet it was. Say we didn't
199 understand it. */
200 own_buf[0] = 0;
201 }
202
203 static const char *
204 get_features_xml (const char *annex)
205 {
206 static int features_supported = -1;
207 static char *document;
208
209 #ifdef USE_XML
210 extern const char *const xml_builtin[][2];
211 int i;
212
213 /* Look for the annex. */
214 for (i = 0; xml_builtin[i][0] != NULL; i++)
215 if (strcmp (annex, xml_builtin[i][0]) == 0)
216 break;
217
218 if (xml_builtin[i][0] != NULL)
219 return xml_builtin[i][1];
220 #endif
221
222 if (strcmp (annex, "target.xml") != 0)
223 return NULL;
224
225 if (features_supported == -1)
226 {
227 const char *arch = NULL;
228 if (the_target->arch_string != NULL)
229 arch = (*the_target->arch_string) ();
230
231 if (arch == NULL)
232 features_supported = 0;
233 else
234 {
235 features_supported = 1;
236 document = malloc (64 + strlen (arch));
237 snprintf (document, 64 + strlen (arch),
238 "<target><architecture>%s</architecture></target>",
239 arch);
240 }
241 }
242
243 return document;
244 }
245
246 void
247 monitor_show_help (void)
248 {
249 monitor_output ("The following monitor commands are supported:\n");
250 monitor_output (" set debug <0|1>\n");
251 monitor_output (" Enable general debugging messages\n");
252 monitor_output (" set remote-debug <0|1>\n");
253 monitor_output (" Enable remote protocol debugging messages\n");
254 }
255
256 /* Handle all of the extended 'q' packets. */
257 void
258 handle_query (char *own_buf, int *new_packet_len_p)
259 {
260 static struct inferior_list_entry *thread_ptr;
261
262 if (strcmp ("qSymbol::", own_buf) == 0)
263 {
264 if (the_target->look_up_symbols != NULL)
265 (*the_target->look_up_symbols) ();
266
267 strcpy (own_buf, "OK");
268 return;
269 }
270
271 if (strcmp ("qfThreadInfo", own_buf) == 0)
272 {
273 thread_ptr = all_threads.head;
274 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
275 thread_ptr = thread_ptr->next;
276 return;
277 }
278
279 if (strcmp ("qsThreadInfo", own_buf) == 0)
280 {
281 if (thread_ptr != NULL)
282 {
283 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
284 thread_ptr = thread_ptr->next;
285 return;
286 }
287 else
288 {
289 sprintf (own_buf, "l");
290 return;
291 }
292 }
293
294 if (the_target->read_offsets != NULL
295 && strcmp ("qOffsets", own_buf) == 0)
296 {
297 CORE_ADDR text, data;
298
299 if (the_target->read_offsets (&text, &data))
300 sprintf (own_buf, "Text=%lX;Data=%lX;Bss=%lX",
301 (long)text, (long)data, (long)data);
302 else
303 write_enn (own_buf);
304
305 return;
306 }
307
308 if (the_target->read_auxv != NULL
309 && strncmp ("qXfer:auxv:read:", own_buf, 16) == 0)
310 {
311 unsigned char *data;
312 int n;
313 CORE_ADDR ofs;
314 unsigned int len;
315 char *annex;
316
317 /* Reject any annex; grab the offset and length. */
318 if (decode_xfer_read (own_buf + 16, &annex, &ofs, &len) < 0
319 || annex[0] != '\0')
320 {
321 strcpy (own_buf, "E00");
322 return;
323 }
324
325 /* Read one extra byte, as an indicator of whether there is
326 more. */
327 if (len > PBUFSIZ - 2)
328 len = PBUFSIZ - 2;
329 data = malloc (len + 1);
330 n = (*the_target->read_auxv) (ofs, data, len + 1);
331 if (n < 0)
332 write_enn (own_buf);
333 else if (n > len)
334 *new_packet_len_p = write_qxfer_response (own_buf, data, len, 1);
335 else
336 *new_packet_len_p = write_qxfer_response (own_buf, data, n, 0);
337
338 free (data);
339
340 return;
341 }
342
343 if (strncmp ("qXfer:features:read:", own_buf, 20) == 0)
344 {
345 CORE_ADDR ofs;
346 unsigned int len, total_len;
347 const char *document;
348 char *annex;
349
350 /* Check for support. */
351 document = get_features_xml ("target.xml");
352 if (document == NULL)
353 {
354 own_buf[0] = '\0';
355 return;
356 }
357
358 /* Grab the annex, offset, and length. */
359 if (decode_xfer_read (own_buf + 20, &annex, &ofs, &len) < 0)
360 {
361 strcpy (own_buf, "E00");
362 return;
363 }
364
365 /* Now grab the correct annex. */
366 document = get_features_xml (annex);
367 if (document == NULL)
368 {
369 strcpy (own_buf, "E00");
370 return;
371 }
372
373 total_len = strlen (document);
374 if (len > PBUFSIZ - 2)
375 len = PBUFSIZ - 2;
376
377 if (ofs > total_len)
378 write_enn (own_buf);
379 else if (len < total_len - ofs)
380 *new_packet_len_p = write_qxfer_response (own_buf, document + ofs,
381 len, 1);
382 else
383 *new_packet_len_p = write_qxfer_response (own_buf, document + ofs,
384 total_len - ofs, 0);
385
386 return;
387 }
388
389 /* Protocol features query. */
390 if (strncmp ("qSupported", own_buf, 10) == 0
391 && (own_buf[10] == ':' || own_buf[10] == '\0'))
392 {
393 sprintf (own_buf, "PacketSize=%x;QPassSignals+", PBUFSIZ - 1);
394
395 if (the_target->read_auxv != NULL)
396 strcat (own_buf, ";qXfer:auxv:read+");
397
398 if (get_features_xml ("target.xml") != NULL)
399 strcat (own_buf, ";qXfer:features:read+");
400
401 return;
402 }
403
404 /* Thread-local storage support. */
405 if (the_target->get_tls_address != NULL
406 && strncmp ("qGetTLSAddr:", own_buf, 12) == 0)
407 {
408 char *p = own_buf + 12;
409 CORE_ADDR parts[3], address = 0;
410 int i, err;
411
412 for (i = 0; i < 3; i++)
413 {
414 char *p2;
415 int len;
416
417 if (p == NULL)
418 break;
419
420 p2 = strchr (p, ',');
421 if (p2)
422 {
423 len = p2 - p;
424 p2++;
425 }
426 else
427 {
428 len = strlen (p);
429 p2 = NULL;
430 }
431
432 decode_address (&parts[i], p, len);
433 p = p2;
434 }
435
436 if (p != NULL || i < 3)
437 err = 1;
438 else
439 {
440 struct thread_info *thread = gdb_id_to_thread (parts[0]);
441
442 if (thread == NULL)
443 err = 2;
444 else
445 err = the_target->get_tls_address (thread, parts[1], parts[2],
446 &address);
447 }
448
449 if (err == 0)
450 {
451 sprintf (own_buf, "%llx", address);
452 return;
453 }
454 else if (err > 0)
455 {
456 write_enn (own_buf);
457 return;
458 }
459
460 /* Otherwise, pretend we do not understand this packet. */
461 }
462
463 /* Handle "monitor" commands. */
464 if (strncmp ("qRcmd,", own_buf, 6) == 0)
465 {
466 char *mon = malloc (PBUFSIZ);
467 int len = strlen (own_buf + 6);
468
469 if ((len % 1) != 0 || unhexify (mon, own_buf + 6, len / 2) != len / 2)
470 {
471 write_enn (own_buf);
472 free (mon);
473 return;
474 }
475 mon[len / 2] = '\0';
476
477 write_ok (own_buf);
478
479 if (strcmp (mon, "set debug 1") == 0)
480 {
481 debug_threads = 1;
482 monitor_output ("Debug output enabled.\n");
483 }
484 else if (strcmp (mon, "set debug 0") == 0)
485 {
486 debug_threads = 0;
487 monitor_output ("Debug output disabled.\n");
488 }
489 else if (strcmp (mon, "set remote-debug 1") == 0)
490 {
491 remote_debug = 1;
492 monitor_output ("Protocol debug output enabled.\n");
493 }
494 else if (strcmp (mon, "set remote-debug 0") == 0)
495 {
496 remote_debug = 0;
497 monitor_output ("Protocol debug output disabled.\n");
498 }
499 else if (strcmp (mon, "help") == 0)
500 monitor_show_help ();
501 else
502 {
503 monitor_output ("Unknown monitor command.\n\n");
504 monitor_show_help ();
505 write_enn (own_buf);
506 }
507
508 free (mon);
509 return;
510 }
511
512 /* Otherwise we didn't know what packet it was. Say we didn't
513 understand it. */
514 own_buf[0] = 0;
515 }
516
517 /* Parse vCont packets. */
518 void
519 handle_v_cont (char *own_buf, char *status, int *signal)
520 {
521 char *p, *q;
522 int n = 0, i = 0;
523 struct thread_resume *resume_info, default_action;
524
525 /* Count the number of semicolons in the packet. There should be one
526 for every action. */
527 p = &own_buf[5];
528 while (p)
529 {
530 n++;
531 p++;
532 p = strchr (p, ';');
533 }
534 /* Allocate room for one extra action, for the default remain-stopped
535 behavior; if no default action is in the list, we'll need the extra
536 slot. */
537 resume_info = malloc ((n + 1) * sizeof (resume_info[0]));
538
539 default_action.thread = -1;
540 default_action.leave_stopped = 1;
541 default_action.step = 0;
542 default_action.sig = 0;
543
544 p = &own_buf[5];
545 i = 0;
546 while (*p)
547 {
548 p++;
549
550 resume_info[i].leave_stopped = 0;
551
552 if (p[0] == 's' || p[0] == 'S')
553 resume_info[i].step = 1;
554 else if (p[0] == 'c' || p[0] == 'C')
555 resume_info[i].step = 0;
556 else
557 goto err;
558
559 if (p[0] == 'S' || p[0] == 'C')
560 {
561 int sig;
562 sig = strtol (p + 1, &q, 16);
563 if (p == q)
564 goto err;
565 p = q;
566
567 if (!target_signal_to_host_p (sig))
568 goto err;
569 resume_info[i].sig = target_signal_to_host (sig);
570 }
571 else
572 {
573 resume_info[i].sig = 0;
574 p = p + 1;
575 }
576
577 if (p[0] == 0)
578 {
579 resume_info[i].thread = -1;
580 default_action = resume_info[i];
581
582 /* Note: we don't increment i here, we'll overwrite this entry
583 the next time through. */
584 }
585 else if (p[0] == ':')
586 {
587 unsigned int gdb_id = strtoul (p + 1, &q, 16);
588 unsigned long thread_id;
589
590 if (p == q)
591 goto err;
592 p = q;
593 if (p[0] != ';' && p[0] != 0)
594 goto err;
595
596 thread_id = gdb_id_to_thread_id (gdb_id);
597 if (thread_id)
598 resume_info[i].thread = thread_id;
599 else
600 goto err;
601
602 i++;
603 }
604 }
605
606 resume_info[i] = default_action;
607
608 /* Still used in occasional places in the backend. */
609 if (n == 1 && resume_info[0].thread != -1)
610 cont_thread = resume_info[0].thread;
611 else
612 cont_thread = -1;
613 set_desired_inferior (0);
614
615 (*the_target->resume) (resume_info);
616
617 free (resume_info);
618
619 *signal = mywait (status, 1);
620 prepare_resume_reply (own_buf, *status, *signal);
621 return;
622
623 err:
624 /* No other way to report an error... */
625 strcpy (own_buf, "");
626 free (resume_info);
627 return;
628 }
629
630 /* Handle all of the extended 'v' packets. */
631 void
632 handle_v_requests (char *own_buf, char *status, int *signal)
633 {
634 if (strncmp (own_buf, "vCont;", 6) == 0)
635 {
636 handle_v_cont (own_buf, status, signal);
637 return;
638 }
639
640 if (strncmp (own_buf, "vCont?", 6) == 0)
641 {
642 strcpy (own_buf, "vCont;c;C;s;S");
643 return;
644 }
645
646 /* Otherwise we didn't know what packet it was. Say we didn't
647 understand it. */
648 own_buf[0] = 0;
649 return;
650 }
651
652 void
653 myresume (int step, int sig)
654 {
655 struct thread_resume resume_info[2];
656 int n = 0;
657
658 if (step || sig || (cont_thread != 0 && cont_thread != -1))
659 {
660 resume_info[0].thread
661 = ((struct inferior_list_entry *) current_inferior)->id;
662 resume_info[0].step = step;
663 resume_info[0].sig = sig;
664 resume_info[0].leave_stopped = 0;
665 n++;
666 }
667 resume_info[n].thread = -1;
668 resume_info[n].step = 0;
669 resume_info[n].sig = 0;
670 resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
671
672 (*the_target->resume) (resume_info);
673 }
674
675 static int attached;
676
677 static void
678 gdbserver_version (void)
679 {
680 printf ("GNU gdbserver %s\n"
681 "Copyright (C) 2006 Free Software Foundation, Inc.\n"
682 "gdbserver is free software, covered by the GNU General Public License.\n"
683 "This gdbserver was configured as \"%s\"\n",
684 version, host_name);
685 }
686
687 static void
688 gdbserver_usage (void)
689 {
690 printf ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
691 "\tgdbserver COMM --attach PID\n"
692 "\n"
693 "COMM may either be a tty device (for serial debugging), or \n"
694 "HOST:PORT to listen for a TCP connection.\n");
695 }
696
697 int
698 main (int argc, char *argv[])
699 {
700 char ch, status, *own_buf;
701 unsigned char *mem_buf;
702 int i = 0;
703 int signal;
704 unsigned int len;
705 CORE_ADDR mem_addr;
706 int bad_attach;
707 int pid;
708 char *arg_end;
709
710 if (argc >= 2 && strcmp (argv[1], "--version") == 0)
711 {
712 gdbserver_version ();
713 exit (0);
714 }
715
716 if (argc >= 2 && strcmp (argv[1], "--help") == 0)
717 {
718 gdbserver_usage ();
719 exit (0);
720 }
721
722 if (setjmp (toplevel))
723 {
724 fprintf (stderr, "Exiting\n");
725 exit (1);
726 }
727
728 bad_attach = 0;
729 pid = 0;
730 attached = 0;
731 if (argc >= 3 && strcmp (argv[2], "--attach") == 0)
732 {
733 if (argc == 4
734 && argv[3][0] != '\0'
735 && (pid = strtoul (argv[3], &arg_end, 10)) != 0
736 && *arg_end == '\0')
737 {
738 ;
739 }
740 else
741 bad_attach = 1;
742 }
743
744 if (argc < 3 || bad_attach)
745 {
746 gdbserver_usage ();
747 exit (1);
748 }
749
750 initialize_low ();
751
752 own_buf = malloc (PBUFSIZ);
753 mem_buf = malloc (PBUFSIZ);
754
755 if (pid == 0)
756 {
757 /* Wait till we are at first instruction in program. */
758 signal = start_inferior (&argv[2], &status);
759
760 /* We are now stopped at the first instruction of the target process */
761 }
762 else
763 {
764 switch (attach_inferior (pid, &status, &signal))
765 {
766 case -1:
767 error ("Attaching not supported on this target");
768 break;
769 default:
770 attached = 1;
771 break;
772 }
773 }
774
775 if (setjmp (toplevel))
776 {
777 fprintf (stderr, "Killing inferior\n");
778 kill_inferior ();
779 exit (1);
780 }
781
782 while (1)
783 {
784 remote_open (argv[1]);
785
786 restart:
787 setjmp (toplevel);
788 while (1)
789 {
790 unsigned char sig;
791 int packet_len;
792 int new_packet_len = -1;
793
794 packet_len = getpkt (own_buf);
795 if (packet_len <= 0)
796 break;
797
798 i = 0;
799 ch = own_buf[i++];
800 switch (ch)
801 {
802 case 'q':
803 handle_query (own_buf, &new_packet_len);
804 break;
805 case 'Q':
806 handle_general_set (own_buf);
807 break;
808 #ifndef USE_WIN32API
809 /* Skip "detach" support on mingw32, since we don't have
810 waitpid. */
811 case 'D':
812 fprintf (stderr, "Detaching from inferior\n");
813 detach_inferior ();
814 write_ok (own_buf);
815 putpkt (own_buf);
816 remote_close ();
817
818 /* If we are attached, then we can exit. Otherwise, we need to
819 hang around doing nothing, until the child is gone. */
820 if (!attached)
821 {
822 int status, ret;
823
824 do {
825 ret = waitpid (signal_pid, &status, 0);
826 if (WIFEXITED (status) || WIFSIGNALED (status))
827 break;
828 } while (ret != -1 || errno != ECHILD);
829 }
830
831 exit (0);
832 #endif
833
834 case '!':
835 if (attached == 0)
836 {
837 extended_protocol = 1;
838 prepare_resume_reply (own_buf, status, signal);
839 }
840 else
841 {
842 /* We can not use the extended protocol if we are
843 attached, because we can not restart the running
844 program. So return unrecognized. */
845 own_buf[0] = '\0';
846 }
847 break;
848 case '?':
849 prepare_resume_reply (own_buf, status, signal);
850 break;
851 case 'H':
852 if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's')
853 {
854 unsigned long gdb_id, thread_id;
855
856 gdb_id = strtoul (&own_buf[2], NULL, 16);
857 thread_id = gdb_id_to_thread_id (gdb_id);
858 if (thread_id == 0)
859 {
860 write_enn (own_buf);
861 break;
862 }
863
864 if (own_buf[1] == 'g')
865 {
866 general_thread = thread_id;
867 set_desired_inferior (1);
868 }
869 else if (own_buf[1] == 'c')
870 cont_thread = thread_id;
871 else if (own_buf[1] == 's')
872 step_thread = thread_id;
873
874 write_ok (own_buf);
875 }
876 else
877 {
878 /* Silently ignore it so that gdb can extend the protocol
879 without compatibility headaches. */
880 own_buf[0] = '\0';
881 }
882 break;
883 case 'g':
884 set_desired_inferior (1);
885 registers_to_string (own_buf);
886 break;
887 case 'G':
888 set_desired_inferior (1);
889 registers_from_string (&own_buf[1]);
890 write_ok (own_buf);
891 break;
892 case 'm':
893 decode_m_packet (&own_buf[1], &mem_addr, &len);
894 if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
895 convert_int_to_ascii (mem_buf, own_buf, len);
896 else
897 write_enn (own_buf);
898 break;
899 case 'M':
900 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
901 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
902 write_ok (own_buf);
903 else
904 write_enn (own_buf);
905 break;
906 case 'X':
907 if (decode_X_packet (&own_buf[1], packet_len - 1,
908 &mem_addr, &len, mem_buf) < 0
909 || write_inferior_memory (mem_addr, mem_buf, len) != 0)
910 write_enn (own_buf);
911 else
912 write_ok (own_buf);
913 break;
914 case 'C':
915 convert_ascii_to_int (own_buf + 1, &sig, 1);
916 if (target_signal_to_host_p (sig))
917 signal = target_signal_to_host (sig);
918 else
919 signal = 0;
920 set_desired_inferior (0);
921 myresume (0, signal);
922 signal = mywait (&status, 1);
923 prepare_resume_reply (own_buf, status, signal);
924 break;
925 case 'S':
926 convert_ascii_to_int (own_buf + 1, &sig, 1);
927 if (target_signal_to_host_p (sig))
928 signal = target_signal_to_host (sig);
929 else
930 signal = 0;
931 set_desired_inferior (0);
932 myresume (1, signal);
933 signal = mywait (&status, 1);
934 prepare_resume_reply (own_buf, status, signal);
935 break;
936 case 'c':
937 set_desired_inferior (0);
938 myresume (0, 0);
939 signal = mywait (&status, 1);
940 prepare_resume_reply (own_buf, status, signal);
941 break;
942 case 's':
943 set_desired_inferior (0);
944 myresume (1, 0);
945 signal = mywait (&status, 1);
946 prepare_resume_reply (own_buf, status, signal);
947 break;
948 case 'Z':
949 {
950 char *lenptr;
951 char *dataptr;
952 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
953 int len = strtol (lenptr + 1, &dataptr, 16);
954 char type = own_buf[1];
955
956 if (the_target->insert_watchpoint == NULL
957 || (type < '2' || type > '4'))
958 {
959 /* No watchpoint support or not a watchpoint command;
960 unrecognized either way. */
961 own_buf[0] = '\0';
962 }
963 else
964 {
965 int res;
966
967 res = (*the_target->insert_watchpoint) (type, addr, len);
968 if (res == 0)
969 write_ok (own_buf);
970 else if (res == 1)
971 /* Unsupported. */
972 own_buf[0] = '\0';
973 else
974 write_enn (own_buf);
975 }
976 break;
977 }
978 case 'z':
979 {
980 char *lenptr;
981 char *dataptr;
982 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
983 int len = strtol (lenptr + 1, &dataptr, 16);
984 char type = own_buf[1];
985
986 if (the_target->remove_watchpoint == NULL
987 || (type < '2' || type > '4'))
988 {
989 /* No watchpoint support or not a watchpoint command;
990 unrecognized either way. */
991 own_buf[0] = '\0';
992 }
993 else
994 {
995 int res;
996
997 res = (*the_target->remove_watchpoint) (type, addr, len);
998 if (res == 0)
999 write_ok (own_buf);
1000 else if (res == 1)
1001 /* Unsupported. */
1002 own_buf[0] = '\0';
1003 else
1004 write_enn (own_buf);
1005 }
1006 break;
1007 }
1008 case 'k':
1009 fprintf (stderr, "Killing inferior\n");
1010 kill_inferior ();
1011 /* When using the extended protocol, we start up a new
1012 debugging session. The traditional protocol will
1013 exit instead. */
1014 if (extended_protocol)
1015 {
1016 write_ok (own_buf);
1017 fprintf (stderr, "GDBserver restarting\n");
1018
1019 /* Wait till we are at 1st instruction in prog. */
1020 signal = start_inferior (&argv[2], &status);
1021 goto restart;
1022 break;
1023 }
1024 else
1025 {
1026 exit (0);
1027 break;
1028 }
1029 case 'T':
1030 {
1031 unsigned long gdb_id, thread_id;
1032
1033 gdb_id = strtoul (&own_buf[1], NULL, 16);
1034 thread_id = gdb_id_to_thread_id (gdb_id);
1035 if (thread_id == 0)
1036 {
1037 write_enn (own_buf);
1038 break;
1039 }
1040
1041 if (mythread_alive (thread_id))
1042 write_ok (own_buf);
1043 else
1044 write_enn (own_buf);
1045 }
1046 break;
1047 case 'R':
1048 /* Restarting the inferior is only supported in the
1049 extended protocol. */
1050 if (extended_protocol)
1051 {
1052 kill_inferior ();
1053 write_ok (own_buf);
1054 fprintf (stderr, "GDBserver restarting\n");
1055
1056 /* Wait till we are at 1st instruction in prog. */
1057 signal = start_inferior (&argv[2], &status);
1058 goto restart;
1059 break;
1060 }
1061 else
1062 {
1063 /* It is a request we don't understand. Respond with an
1064 empty packet so that gdb knows that we don't support this
1065 request. */
1066 own_buf[0] = '\0';
1067 break;
1068 }
1069 case 'v':
1070 /* Extended (long) request. */
1071 handle_v_requests (own_buf, &status, &signal);
1072 break;
1073 default:
1074 /* It is a request we don't understand. Respond with an
1075 empty packet so that gdb knows that we don't support this
1076 request. */
1077 own_buf[0] = '\0';
1078 break;
1079 }
1080
1081 if (new_packet_len != -1)
1082 putpkt_binary (own_buf, new_packet_len);
1083 else
1084 putpkt (own_buf);
1085
1086 if (status == 'W')
1087 fprintf (stderr,
1088 "\nChild exited with status %d\n", signal);
1089 if (status == 'X')
1090 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
1091 target_signal_to_host (signal),
1092 target_signal_to_name (signal));
1093 if (status == 'W' || status == 'X')
1094 {
1095 if (extended_protocol)
1096 {
1097 fprintf (stderr, "Killing inferior\n");
1098 kill_inferior ();
1099 write_ok (own_buf);
1100 fprintf (stderr, "GDBserver restarting\n");
1101
1102 /* Wait till we are at 1st instruction in prog. */
1103 signal = start_inferior (&argv[2], &status);
1104 goto restart;
1105 break;
1106 }
1107 else
1108 {
1109 fprintf (stderr, "GDBserver exiting\n");
1110 exit (0);
1111 }
1112 }
1113 }
1114
1115 /* We come here when getpkt fails.
1116
1117 For the extended remote protocol we exit (and this is the only
1118 way we gracefully exit!).
1119
1120 For the traditional remote protocol close the connection,
1121 and re-open it at the top of the loop. */
1122 if (extended_protocol)
1123 {
1124 remote_close ();
1125 exit (0);
1126 }
1127 else
1128 {
1129 fprintf (stderr, "Remote side has terminated connection. "
1130 "GDBserver will reopen the connection.\n");
1131 remote_close ();
1132 }
1133 }
1134 }
This page took 0.054985 seconds and 4 git commands to generate.