1 /* Main code for remote server for GDB.
2 Copyright (C) 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
4 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
29 unsigned long cont_thread;
30 unsigned long general_thread;
31 unsigned long step_thread;
32 unsigned long thread_from_wait;
33 unsigned long old_thread_from_wait;
34 int extended_protocol;
39 /* The PID of the originally created or attached inferior. Used to
40 send signals to the process when GDB sends us an asynchronous interrupt
41 (user hitting Control-C in the client), and to wait for the child to exit
42 when no longer debugging it. */
44 unsigned long signal_pid;
47 start_inferior (char *argv[], char *statusptr)
49 signal (SIGTTOU, SIG_DFL);
50 signal (SIGTTIN, SIG_DFL);
52 signal_pid = create_inferior (argv[0], argv);
54 fprintf (stderr, "Process %s created; pid = %ld\n", argv[0],
57 signal (SIGTTOU, SIG_IGN);
58 signal (SIGTTIN, SIG_IGN);
59 tcsetpgrp (fileno (stderr), signal_pid);
61 /* Wait till we are at 1st instruction in program, return signal number. */
62 return mywait (statusptr, 0);
66 attach_inferior (int pid, char *statusptr, int *sigptr)
68 /* myattach should return -1 if attaching is unsupported,
69 0 if it succeeded, and call error() otherwise. */
71 if (myattach (pid) != 0)
74 fprintf (stderr, "Attached; pid = %d\n", pid);
76 /* FIXME - It may be that we should get the SIGNAL_PID from the
77 attach function, so that it can be the main thread instead of
78 whichever we were told to attach to. */
81 *sigptr = mywait (statusptr, 0);
86 extern int remote_debug;
88 /* Handle all of the extended 'q' packets. */
90 handle_query (char *own_buf)
92 static struct inferior_list_entry *thread_ptr;
94 if (strcmp ("qSymbol::", own_buf) == 0)
96 if (the_target->look_up_symbols != NULL)
97 (*the_target->look_up_symbols) ();
99 strcpy (own_buf, "OK");
103 if (strcmp ("qfThreadInfo", own_buf) == 0)
105 thread_ptr = all_threads.head;
106 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
107 thread_ptr = thread_ptr->next;
111 if (strcmp ("qsThreadInfo", own_buf) == 0)
113 if (thread_ptr != NULL)
115 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
116 thread_ptr = thread_ptr->next;
121 sprintf (own_buf, "l");
126 if (the_target->read_auxv != NULL
127 && strncmp ("qPart:auxv:read::", own_buf, 17) == 0)
129 unsigned char data[(PBUFSIZ - 1) / 2];
133 decode_m_packet (&own_buf[17], &ofs, &len); /* "OFS,LEN" */
134 if (len > sizeof data)
136 n = (*the_target->read_auxv) (ofs, data, len);
142 convert_int_to_ascii (data, own_buf, n);
146 /* Otherwise we didn't know what packet it was. Say we didn't
151 /* Parse vCont packets. */
153 handle_v_cont (char *own_buf, char *status, int *signal)
157 struct thread_resume *resume_info, default_action;
159 /* Count the number of semicolons in the packet. There should be one
168 /* Allocate room for one extra action, for the default remain-stopped
169 behavior; if no default action is in the list, we'll need the extra
171 resume_info = malloc ((n + 1) * sizeof (resume_info[0]));
173 default_action.thread = -1;
174 default_action.leave_stopped = 1;
175 default_action.step = 0;
176 default_action.sig = 0;
184 resume_info[i].leave_stopped = 0;
186 if (p[0] == 's' || p[0] == 'S')
187 resume_info[i].step = 1;
188 else if (p[0] == 'c' || p[0] == 'C')
189 resume_info[i].step = 0;
193 if (p[0] == 'S' || p[0] == 'C')
196 sig = strtol (p + 1, &q, 16);
201 if (!target_signal_to_host_p (sig))
203 resume_info[i].sig = target_signal_to_host (sig);
207 resume_info[i].sig = 0;
213 resume_info[i].thread = -1;
214 default_action = resume_info[i];
216 /* Note: we don't increment i here, we'll overwrite this entry
217 the next time through. */
219 else if (p[0] == ':')
221 unsigned int gdb_id = strtoul (p + 1, &q, 16);
222 unsigned long thread_id;
227 if (p[0] != ';' && p[0] != 0)
230 thread_id = gdb_id_to_thread_id (gdb_id);
232 resume_info[i].thread = thread_id;
240 resume_info[i] = default_action;
242 /* Still used in occasional places in the backend. */
243 if (n == 1 && resume_info[0].thread != -1)
244 cont_thread = resume_info[0].thread;
247 set_desired_inferior (0);
249 (*the_target->resume) (resume_info);
253 *signal = mywait (status, 1);
254 prepare_resume_reply (own_buf, *status, *signal);
258 /* No other way to report an error... */
259 strcpy (own_buf, "");
264 /* Handle all of the extended 'v' packets. */
266 handle_v_requests (char *own_buf, char *status, int *signal)
268 if (strncmp (own_buf, "vCont;", 6) == 0)
270 handle_v_cont (own_buf, status, signal);
274 if (strncmp (own_buf, "vCont?", 6) == 0)
276 strcpy (own_buf, "vCont;c;C;s;S");
280 /* Otherwise we didn't know what packet it was. Say we didn't
287 myresume (int step, int sig)
289 struct thread_resume resume_info[2];
292 if (step || sig || (cont_thread != 0 && cont_thread != -1))
294 resume_info[0].thread
295 = ((struct inferior_list_entry *) current_inferior)->id;
296 resume_info[0].step = step;
297 resume_info[0].sig = sig;
298 resume_info[0].leave_stopped = 0;
301 resume_info[n].thread = -1;
302 resume_info[n].step = 0;
303 resume_info[n].sig = 0;
304 resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
306 (*the_target->resume) (resume_info);
312 gdbserver_version (void)
314 printf ("GNU gdbserver %s\n"
315 "Copyright (C) 2006 Free Software Foundation, Inc.\n"
316 "gdbserver is free software, covered by the GNU General Public License.\n"
317 "This gdbserver was configured as \"%s\"\n",
322 gdbserver_usage (void)
324 printf ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
325 "\tgdbserver COMM --attach PID\n"
327 "COMM may either be a tty device (for serial debugging), or \n"
328 "HOST:PORT to listen for a TCP connection.\n");
332 main (int argc, char *argv[])
334 char ch, status, *own_buf;
335 unsigned char *mem_buf;
344 if (argc >= 2 && strcmp (argv[1], "--version") == 0)
346 gdbserver_version ();
350 if (argc >= 2 && strcmp (argv[1], "--help") == 0)
356 if (setjmp (toplevel))
358 fprintf (stderr, "Exiting\n");
365 if (argc >= 3 && strcmp (argv[2], "--attach") == 0)
369 && (pid = strtoul (argv[3], &arg_end, 10)) != 0
378 if (argc < 3 || bad_attach)
386 own_buf = malloc (PBUFSIZ);
387 mem_buf = malloc (PBUFSIZ);
391 /* Wait till we are at first instruction in program. */
392 signal = start_inferior (&argv[2], &status);
394 /* We are now stopped at the first instruction of the target process */
398 switch (attach_inferior (pid, &status, &signal))
401 error ("Attaching not supported on this target");
411 remote_open (argv[1]);
415 while (getpkt (own_buf) > 0)
423 handle_query (own_buf);
426 remote_debug = !remote_debug;
429 fprintf (stderr, "Detaching from inferior\n");
435 /* If we are attached, then we can exit. Otherwise, we need to
436 hang around doing nothing, until the child is gone. */
442 ret = waitpid (signal_pid, &status, 0);
443 if (WIFEXITED (status) || WIFSIGNALED (status))
445 } while (ret != -1 || errno != ECHILD);
453 extended_protocol = 1;
454 prepare_resume_reply (own_buf, status, signal);
458 /* We can not use the extended protocol if we are
459 attached, because we can not restart the running
460 program. So return unrecognized. */
465 prepare_resume_reply (own_buf, status, signal);
468 if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's')
470 unsigned long gdb_id, thread_id;
472 gdb_id = strtoul (&own_buf[2], NULL, 16);
473 thread_id = gdb_id_to_thread_id (gdb_id);
480 if (own_buf[1] == 'g')
482 general_thread = thread_id;
483 set_desired_inferior (1);
485 else if (own_buf[1] == 'c')
486 cont_thread = thread_id;
487 else if (own_buf[1] == 's')
488 step_thread = thread_id;
494 /* Silently ignore it so that gdb can extend the protocol
495 without compatibility headaches. */
500 set_desired_inferior (1);
501 registers_to_string (own_buf);
504 set_desired_inferior (1);
505 registers_from_string (&own_buf[1]);
509 decode_m_packet (&own_buf[1], &mem_addr, &len);
510 if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
511 convert_int_to_ascii (mem_buf, own_buf, len);
516 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
517 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
523 convert_ascii_to_int (own_buf + 1, &sig, 1);
524 if (target_signal_to_host_p (sig))
525 signal = target_signal_to_host (sig);
528 set_desired_inferior (0);
529 myresume (0, signal);
530 signal = mywait (&status, 1);
531 prepare_resume_reply (own_buf, status, signal);
534 convert_ascii_to_int (own_buf + 1, &sig, 1);
535 if (target_signal_to_host_p (sig))
536 signal = target_signal_to_host (sig);
539 set_desired_inferior (0);
540 myresume (1, signal);
541 signal = mywait (&status, 1);
542 prepare_resume_reply (own_buf, status, signal);
545 set_desired_inferior (0);
547 signal = mywait (&status, 1);
548 prepare_resume_reply (own_buf, status, signal);
551 set_desired_inferior (0);
553 signal = mywait (&status, 1);
554 prepare_resume_reply (own_buf, status, signal);
560 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
561 int len = strtol (lenptr + 1, &dataptr, 16);
562 char type = own_buf[1];
564 if (the_target->insert_watchpoint == NULL
565 || (type < '2' || type > '4'))
567 /* No watchpoint support or not a watchpoint command;
568 unrecognized either way. */
575 res = (*the_target->insert_watchpoint) (type, addr, len);
590 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
591 int len = strtol (lenptr + 1, &dataptr, 16);
592 char type = own_buf[1];
594 if (the_target->remove_watchpoint == NULL
595 || (type < '2' || type > '4'))
597 /* No watchpoint support or not a watchpoint command;
598 unrecognized either way. */
605 res = (*the_target->remove_watchpoint) (type, addr, len);
617 fprintf (stderr, "Killing inferior\n");
619 /* When using the extended protocol, we start up a new
620 debugging session. The traditional protocol will
622 if (extended_protocol)
625 fprintf (stderr, "GDBserver restarting\n");
627 /* Wait till we are at 1st instruction in prog. */
628 signal = start_inferior (&argv[2], &status);
639 unsigned long gdb_id, thread_id;
641 gdb_id = strtoul (&own_buf[1], NULL, 16);
642 thread_id = gdb_id_to_thread_id (gdb_id);
649 if (mythread_alive (thread_id))
656 /* Restarting the inferior is only supported in the
657 extended protocol. */
658 if (extended_protocol)
662 fprintf (stderr, "GDBserver restarting\n");
664 /* Wait till we are at 1st instruction in prog. */
665 signal = start_inferior (&argv[2], &status);
671 /* It is a request we don't understand. Respond with an
672 empty packet so that gdb knows that we don't support this
678 /* Extended (long) request. */
679 handle_v_requests (own_buf, &status, &signal);
682 /* It is a request we don't understand. Respond with an
683 empty packet so that gdb knows that we don't support this
693 "\nChild exited with status %d\n", signal);
695 fprintf (stderr, "\nChild terminated with signal = 0x%x\n",
697 if (status == 'W' || status == 'X')
699 if (extended_protocol)
701 fprintf (stderr, "Killing inferior\n");
704 fprintf (stderr, "GDBserver restarting\n");
706 /* Wait till we are at 1st instruction in prog. */
707 signal = start_inferior (&argv[2], &status);
713 fprintf (stderr, "GDBserver exiting\n");
719 /* We come here when getpkt fails.
721 For the extended remote protocol we exit (and this is the only
722 way we gracefully exit!).
724 For the traditional remote protocol close the connection,
725 and re-open it at the top of the loop. */
726 if (extended_protocol)
733 fprintf (stderr, "Remote side has terminated connection. "
734 "GDBserver will reopen the connection.\n");