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 main (int argc
, char *argv
[])
81 char ch
, status
, *own_buf
, mem_buf
[2000];
90 if (setjmp (toplevel
))
92 fprintf (stderr
, "Exiting\n");
99 if (argc
>= 3 && strcmp (argv
[2], "--attach") == 0)
103 && (pid
= strtoul (argv
[3], &arg_end
, 10)) != 0
112 if (argc
< 3 || bad_attach
)
113 error ("Usage:\tgdbserver tty prog [args ...]\n"
114 "\tgdbserver tty --attach pid");
118 own_buf
= malloc (PBUFSIZ
);
122 /* Wait till we are at first instruction in program. */
123 signal
= start_inferior (&argv
[2], &status
);
125 /* We are now stopped at the first instruction of the target process */
129 switch (attach_inferior (pid
, &status
, &signal
))
132 error ("Attaching not supported on this target");
142 remote_open (argv
[1]);
146 while (getpkt (own_buf
) > 0)
154 handle_query (own_buf
);
157 remote_debug
= !remote_debug
;
162 extended_protocol
= 1;
163 prepare_resume_reply (own_buf
, status
, signal
);
167 /* We can not use the extended protocol if we are
168 attached, because we can not restart the running
169 program. So return unrecognized. */
174 prepare_resume_reply (own_buf
, status
, signal
);
180 general_thread
= strtol (&own_buf
[2], NULL
, 16);
182 fetch_inferior_registers (0);
185 cont_thread
= strtol (&own_buf
[2], NULL
, 16);
189 /* Silently ignore it so that gdb can extend the protocol
190 without compatibility headaches. */
196 registers_to_string (own_buf
);
199 registers_from_string (&own_buf
[1]);
200 store_inferior_registers (-1);
204 decode_m_packet (&own_buf
[1], &mem_addr
, &len
);
205 read_inferior_memory (mem_addr
, mem_buf
, len
);
206 convert_int_to_ascii (mem_buf
, own_buf
, len
);
209 decode_M_packet (&own_buf
[1], &mem_addr
, &len
, mem_buf
);
210 if (write_inferior_memory (mem_addr
, mem_buf
, len
) == 0)
216 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
217 if (target_signal_to_host_p (sig
))
218 signal
= target_signal_to_host (sig
);
221 myresume (0, signal
);
222 signal
= mywait (&status
);
223 prepare_resume_reply (own_buf
, status
, signal
);
226 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
227 if (target_signal_to_host_p (sig
))
228 signal
= target_signal_to_host (sig
);
231 myresume (1, signal
);
232 signal
= mywait (&status
);
233 prepare_resume_reply (own_buf
, status
, signal
);
237 signal
= mywait (&status
);
238 prepare_resume_reply (own_buf
, status
, signal
);
242 signal
= mywait (&status
);
243 prepare_resume_reply (own_buf
, status
, signal
);
246 fprintf (stderr
, "Killing inferior\n");
248 /* When using the extended protocol, we start up a new
249 debugging session. The traditional protocol will
251 if (extended_protocol
)
254 fprintf (stderr
, "GDBserver restarting\n");
256 /* Wait till we are at 1st instruction in prog. */
257 signal
= start_inferior (&argv
[2], &status
);
267 if (mythread_alive (strtol (&own_buf
[1], NULL
, 16)))
273 /* Restarting the inferior is only supported in the
274 extended protocol. */
275 if (extended_protocol
)
279 fprintf (stderr
, "GDBserver restarting\n");
281 /* Wait till we are at 1st instruction in prog. */
282 signal
= start_inferior (&argv
[2], &status
);
288 /* It is a request we don't understand. Respond with an
289 empty packet so that gdb knows that we don't support this
295 /* It is a request we don't understand. Respond with an
296 empty packet so that gdb knows that we don't support this
306 "\nChild exited with status %d\n", sig
);
308 fprintf (stderr
, "\nChild terminated with signal = 0x%x\n", sig
);
309 if (status
== 'W' || status
== 'X')
311 if (extended_protocol
)
313 fprintf (stderr
, "Killing inferior\n");
316 fprintf (stderr
, "GDBserver restarting\n");
318 /* Wait till we are at 1st instruction in prog. */
319 signal
= start_inferior (&argv
[2], &status
);
325 fprintf (stderr
, "GDBserver exiting\n");
331 /* We come here when getpkt fails.
333 For the extended remote protocol we exit (and this is the only
334 way we gracefully exit!).
336 For the traditional remote protocol close the connection,
337 and re-open it at the top of the loop. */
338 if (extended_protocol
)
345 fprintf (stderr
, "Remote side has terminated connection. "
346 "GDBserver will reopen the connection.\n");