1 /* Main code for remote server for GDB.
2 Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002
3 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
27 int old_thread_from_wait;
28 int extended_protocol;
32 start_inferior (char *argv[], char *statusptr)
34 /* FIXME Check error? Or turn to void. */
35 create_inferior (argv[0], argv);
36 /* FIXME Print pid properly. */
37 fprintf (stderr, "Process %s created; pid = %d\n", argv[0], signal_pid);
39 /* Wait till we are at 1st instruction in program, return signal number. */
40 return mywait (statusptr);
44 attach_inferior (int pid, char *statusptr, unsigned char *sigptr)
46 /* myattach should return -1 if attaching is unsupported,
47 0 if it succeeded, and call error() otherwise. */
48 if (myattach (pid) != 0)
51 *sigptr = mywait (statusptr);
56 extern int remote_debug;
58 /* Handle all of the extended 'q' packets. */
60 handle_query (char *own_buf)
62 if (strcmp ("qSymbol::", own_buf) == 0)
64 if (the_target->look_up_symbols != NULL)
65 (*the_target->look_up_symbols) ();
67 strcpy (own_buf, "OK");
71 /* Otherwise we didn't know what packet it was. Say we didn't
79 gdbserver_usage (void)
81 error ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
82 "\tgdbserver COMM --attach PID\n"
84 "COMM may either be a tty device (for serial debugging), or \n"
85 "HOST:PORT to listen for a TCP connection.\n");
89 main (int argc, char *argv[])
91 char ch, status, *own_buf, mem_buf[2000];
100 if (setjmp (toplevel))
102 fprintf (stderr, "Exiting\n");
109 if (argc >= 3 && strcmp (argv[2], "--attach") == 0)
113 && (pid = strtoul (argv[3], &arg_end, 10)) != 0
122 if (argc < 3 || bad_attach)
127 own_buf = malloc (PBUFSIZ);
131 /* Wait till we are at first instruction in program. */
132 signal = start_inferior (&argv[2], &status);
134 /* We are now stopped at the first instruction of the target process */
138 switch (attach_inferior (pid, &status, &signal))
141 error ("Attaching not supported on this target");
151 remote_open (argv[1]);
155 while (getpkt (own_buf) > 0)
163 handle_query (own_buf);
166 remote_debug = !remote_debug;
171 extended_protocol = 1;
172 prepare_resume_reply (own_buf, status, signal);
176 /* We can not use the extended protocol if we are
177 attached, because we can not restart the running
178 program. So return unrecognized. */
183 prepare_resume_reply (own_buf, status, signal);
189 general_thread = strtol (&own_buf[2], NULL, 16);
191 fetch_inferior_registers (0);
194 cont_thread = strtol (&own_buf[2], NULL, 16);
198 /* Silently ignore it so that gdb can extend the protocol
199 without compatibility headaches. */
205 registers_to_string (own_buf);
208 registers_from_string (&own_buf[1]);
209 store_inferior_registers (-1);
213 decode_m_packet (&own_buf[1], &mem_addr, &len);
214 read_inferior_memory (mem_addr, mem_buf, len);
215 convert_int_to_ascii (mem_buf, own_buf, len);
218 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
219 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
225 convert_ascii_to_int (own_buf + 1, &sig, 1);
226 if (target_signal_to_host_p (sig))
227 signal = target_signal_to_host (sig);
230 myresume (0, signal);
231 signal = mywait (&status);
232 prepare_resume_reply (own_buf, status, signal);
235 convert_ascii_to_int (own_buf + 1, &sig, 1);
236 if (target_signal_to_host_p (sig))
237 signal = target_signal_to_host (sig);
240 myresume (1, signal);
241 signal = mywait (&status);
242 prepare_resume_reply (own_buf, status, signal);
246 signal = mywait (&status);
247 prepare_resume_reply (own_buf, status, signal);
251 signal = mywait (&status);
252 prepare_resume_reply (own_buf, status, signal);
255 fprintf (stderr, "Killing inferior\n");
257 /* When using the extended protocol, we start up a new
258 debugging session. The traditional protocol will
260 if (extended_protocol)
263 fprintf (stderr, "GDBserver restarting\n");
265 /* Wait till we are at 1st instruction in prog. */
266 signal = start_inferior (&argv[2], &status);
276 if (mythread_alive (strtol (&own_buf[1], NULL, 16)))
282 /* Restarting the inferior is only supported in the
283 extended protocol. */
284 if (extended_protocol)
288 fprintf (stderr, "GDBserver restarting\n");
290 /* Wait till we are at 1st instruction in prog. */
291 signal = start_inferior (&argv[2], &status);
297 /* It is a request we don't understand. Respond with an
298 empty packet so that gdb knows that we don't support this
304 /* It is a request we don't understand. Respond with an
305 empty packet so that gdb knows that we don't support this
315 "\nChild exited with status %d\n", sig);
317 fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig);
318 if (status == 'W' || status == 'X')
320 if (extended_protocol)
322 fprintf (stderr, "Killing inferior\n");
325 fprintf (stderr, "GDBserver restarting\n");
327 /* Wait till we are at 1st instruction in prog. */
328 signal = start_inferior (&argv[2], &status);
334 fprintf (stderr, "GDBserver exiting\n");
340 /* We come here when getpkt fails.
342 For the extended remote protocol we exit (and this is the only
343 way we gracefully exit!).
345 For the traditional remote protocol close the connection,
346 and re-open it at the top of the loop. */
347 if (extended_protocol)
354 fprintf (stderr, "Remote side has terminated connection. "
355 "GDBserver will reopen the connection.\n");