1 /* Main code for remote server for GDB.
2 Copyright 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., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, 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%lx", thread_ptr->id);
107 thread_ptr = thread_ptr->next;
111 if (strcmp ("qsThreadInfo", own_buf) == 0)
113 if (thread_ptr != NULL)
115 sprintf (own_buf, "m%lx", thread_ptr->id);
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 resume_info[i].thread = strtoul (p + 1, &q, 16);
225 if (p[0] != ';' && p[0] != 0)
232 resume_info[i] = default_action;
234 /* Still used in occasional places in the backend. */
235 if (n == 1 && resume_info[0].thread != -1)
236 cont_thread = resume_info[0].thread;
239 set_desired_inferior (0);
241 (*the_target->resume) (resume_info);
245 *signal = mywait (status, 1);
246 prepare_resume_reply (own_buf, *status, *signal);
250 /* No other way to report an error... */
251 strcpy (own_buf, "");
256 /* Handle all of the extended 'v' packets. */
258 handle_v_requests (char *own_buf, char *status, int *signal)
260 if (strncmp (own_buf, "vCont;", 6) == 0)
262 handle_v_cont (own_buf, status, signal);
266 if (strncmp (own_buf, "vCont?", 6) == 0)
268 strcpy (own_buf, "vCont;c;C;s;S");
272 /* Otherwise we didn't know what packet it was. Say we didn't
279 myresume (int step, int sig)
281 struct thread_resume resume_info[2];
284 if (step || sig || (cont_thread != 0 && cont_thread != -1))
286 resume_info[0].thread
287 = ((struct inferior_list_entry *) current_inferior)->id;
288 resume_info[0].step = step;
289 resume_info[0].sig = sig;
290 resume_info[0].leave_stopped = 0;
293 resume_info[n].thread = -1;
294 resume_info[n].step = 0;
295 resume_info[n].sig = 0;
296 resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
298 (*the_target->resume) (resume_info);
304 gdbserver_usage (void)
306 error ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
307 "\tgdbserver COMM --attach PID\n"
309 "COMM may either be a tty device (for serial debugging), or \n"
310 "HOST:PORT to listen for a TCP connection.\n");
314 main (int argc, char *argv[])
316 char ch, status, *own_buf;
317 unsigned char mem_buf[2000];
326 if (setjmp (toplevel))
328 fprintf (stderr, "Exiting\n");
335 if (argc >= 3 && strcmp (argv[2], "--attach") == 0)
339 && (pid = strtoul (argv[3], &arg_end, 10)) != 0
348 if (argc < 3 || bad_attach)
353 own_buf = malloc (PBUFSIZ);
357 /* Wait till we are at first instruction in program. */
358 signal = start_inferior (&argv[2], &status);
360 /* We are now stopped at the first instruction of the target process */
364 switch (attach_inferior (pid, &status, &signal))
367 error ("Attaching not supported on this target");
377 remote_open (argv[1]);
381 while (getpkt (own_buf) > 0)
389 handle_query (own_buf);
392 remote_debug = !remote_debug;
395 fprintf (stderr, "Detaching from inferior\n");
401 /* If we are attached, then we can exit. Otherwise, we need to
402 hang around doing nothing, until the child is gone. */
408 ret = waitpid (signal_pid, &status, 0);
409 if (WIFEXITED (status) || WIFSIGNALED (status))
411 } while (ret != -1 || errno != ECHILD);
419 extended_protocol = 1;
420 prepare_resume_reply (own_buf, status, signal);
424 /* We can not use the extended protocol if we are
425 attached, because we can not restart the running
426 program. So return unrecognized. */
431 prepare_resume_reply (own_buf, status, signal);
437 general_thread = strtoul (&own_buf[2], NULL, 16);
439 set_desired_inferior (1);
442 cont_thread = strtoul (&own_buf[2], NULL, 16);
446 step_thread = strtoul (&own_buf[2], NULL, 16);
450 /* Silently ignore it so that gdb can extend the protocol
451 without compatibility headaches. */
457 set_desired_inferior (1);
458 registers_to_string (own_buf);
461 set_desired_inferior (1);
462 registers_from_string (&own_buf[1]);
466 decode_m_packet (&own_buf[1], &mem_addr, &len);
467 if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
468 convert_int_to_ascii (mem_buf, own_buf, len);
473 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
474 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
480 convert_ascii_to_int (own_buf + 1, &sig, 1);
481 if (target_signal_to_host_p (sig))
482 signal = target_signal_to_host (sig);
485 set_desired_inferior (0);
486 myresume (0, signal);
487 signal = mywait (&status, 1);
488 prepare_resume_reply (own_buf, status, signal);
491 convert_ascii_to_int (own_buf + 1, &sig, 1);
492 if (target_signal_to_host_p (sig))
493 signal = target_signal_to_host (sig);
496 set_desired_inferior (0);
497 myresume (1, signal);
498 signal = mywait (&status, 1);
499 prepare_resume_reply (own_buf, status, signal);
502 set_desired_inferior (0);
504 signal = mywait (&status, 1);
505 prepare_resume_reply (own_buf, status, signal);
508 set_desired_inferior (0);
510 signal = mywait (&status, 1);
511 prepare_resume_reply (own_buf, status, signal);
517 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
518 int len = strtol (lenptr + 1, &dataptr, 16);
519 char type = own_buf[1];
521 if (the_target->insert_watchpoint == NULL
522 || (type < '2' || type > '4'))
524 /* No watchpoint support or not a watchpoint command;
525 unrecognized either way. */
532 res = (*the_target->insert_watchpoint) (type, addr, len);
547 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
548 int len = strtol (lenptr + 1, &dataptr, 16);
549 char type = own_buf[1];
551 if (the_target->remove_watchpoint == NULL
552 || (type < '2' || type > '4'))
554 /* No watchpoint support or not a watchpoint command;
555 unrecognized either way. */
562 res = (*the_target->remove_watchpoint) (type, addr, len);
574 fprintf (stderr, "Killing inferior\n");
576 /* When using the extended protocol, we start up a new
577 debugging session. The traditional protocol will
579 if (extended_protocol)
582 fprintf (stderr, "GDBserver restarting\n");
584 /* Wait till we are at 1st instruction in prog. */
585 signal = start_inferior (&argv[2], &status);
595 if (mythread_alive (strtoul (&own_buf[1], NULL, 16)))
601 /* Restarting the inferior is only supported in the
602 extended protocol. */
603 if (extended_protocol)
607 fprintf (stderr, "GDBserver restarting\n");
609 /* Wait till we are at 1st instruction in prog. */
610 signal = start_inferior (&argv[2], &status);
616 /* It is a request we don't understand. Respond with an
617 empty packet so that gdb knows that we don't support this
623 /* Extended (long) request. */
624 handle_v_requests (own_buf, &status, &signal);
627 /* It is a request we don't understand. Respond with an
628 empty packet so that gdb knows that we don't support this
638 "\nChild exited with status %d\n", signal);
640 fprintf (stderr, "\nChild terminated with signal = 0x%x\n",
642 if (status == 'W' || status == 'X')
644 if (extended_protocol)
646 fprintf (stderr, "Killing inferior\n");
649 fprintf (stderr, "GDBserver restarting\n");
651 /* Wait till we are at 1st instruction in prog. */
652 signal = start_inferior (&argv[2], &status);
658 fprintf (stderr, "GDBserver exiting\n");
664 /* We come here when getpkt fails.
666 For the extended remote protocol we exit (and this is the only
667 way we gracefully exit!).
669 For the traditional remote protocol close the connection,
670 and re-open it at the top of the loop. */
671 if (extended_protocol)
678 fprintf (stderr, "Remote side has terminated connection. "
679 "GDBserver will reopen the connection.\n");