94c27d3e4cd52ff45276906b1b15d844464425bb
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)
53 *sigptr
= mywait (statusptr
);
58 extern int remote_debug
;
60 /* Handle all of the extended 'q' packets. */
62 handle_query (char *own_buf
)
64 if (strcmp ("qSymbol::", own_buf
) == 0)
67 strcpy (own_buf
, "qSymbol:");
68 hexify (own_buf
+ strlen ("qSymbol:"), "main", 4);
71 fprintf (stderr
, "Got %s", own_buf
);
73 strcpy (own_buf
, "OK");
77 /* Otherwise we didn't know what packet it was. Say we didn't
85 main (int argc
, char *argv
[])
87 char ch
, status
, *own_buf
, mem_buf
[2000];
96 if (setjmp (toplevel
))
98 fprintf (stderr
, "Exiting\n");
105 if (argc
>= 3 && strcmp (argv
[2], "--attach") == 0)
109 && (pid
= strtoul (argv
[3], &arg_end
, 10)) != 0
118 if (argc
< 3 || bad_attach
)
119 error ("Usage:\tgdbserver tty prog [args ...]\n"
120 "\tgdbserver tty --attach pid");
124 own_buf
= malloc (PBUFSIZ
);
128 /* Wait till we are at first instruction in program. */
129 signal
= start_inferior (&argv
[2], &status
);
131 /* We are now stopped at the first instruction of the target process */
135 switch (attach_inferior (pid
, &status
, &signal
))
138 error ("Attaching not supported on this target");
148 remote_open (argv
[1]);
152 while (getpkt (own_buf
) > 0)
160 handle_query (own_buf
);
163 remote_debug
= !remote_debug
;
168 extended_protocol
= 1;
169 prepare_resume_reply (own_buf
, status
, signal
);
173 /* We can not use the extended protocol if we are
174 attached, because we can not restart the running
175 program. So return unrecognized. */
180 prepare_resume_reply (own_buf
, status
, signal
);
186 general_thread
= strtol (&own_buf
[2], NULL
, 16);
188 fetch_inferior_registers (0);
191 cont_thread
= strtol (&own_buf
[2], NULL
, 16);
195 /* Silently ignore it so that gdb can extend the protocol
196 without compatibility headaches. */
202 registers_to_string (own_buf
);
205 registers_from_string (&own_buf
[1]);
206 store_inferior_registers (-1);
210 decode_m_packet (&own_buf
[1], &mem_addr
, &len
);
211 read_inferior_memory (mem_addr
, mem_buf
, len
);
212 convert_int_to_ascii (mem_buf
, own_buf
, len
);
215 decode_M_packet (&own_buf
[1], &mem_addr
, &len
, mem_buf
);
216 if (write_inferior_memory (mem_addr
, mem_buf
, len
) == 0)
222 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
223 if (target_signal_to_host_p (sig
))
224 signal
= target_signal_to_host (sig
);
227 myresume (0, signal
);
228 signal
= mywait (&status
);
229 prepare_resume_reply (own_buf
, status
, signal
);
232 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
233 if (target_signal_to_host_p (sig
))
234 signal
= target_signal_to_host (sig
);
237 myresume (1, signal
);
238 signal
= mywait (&status
);
239 prepare_resume_reply (own_buf
, status
, signal
);
243 signal
= mywait (&status
);
244 prepare_resume_reply (own_buf
, status
, signal
);
248 signal
= mywait (&status
);
249 prepare_resume_reply (own_buf
, status
, signal
);
252 fprintf (stderr
, "Killing inferior\n");
254 /* When using the extended protocol, we start up a new
255 debugging session. The traditional protocol will
257 if (extended_protocol
)
260 fprintf (stderr
, "GDBserver restarting\n");
262 /* Wait till we are at 1st instruction in prog. */
263 signal
= start_inferior (&argv
[2], &status
);
273 if (mythread_alive (strtol (&own_buf
[1], NULL
, 16)))
279 /* Restarting the inferior is only supported in the
280 extended protocol. */
281 if (extended_protocol
)
285 fprintf (stderr
, "GDBserver restarting\n");
287 /* Wait till we are at 1st instruction in prog. */
288 signal
= start_inferior (&argv
[2], &status
);
294 /* It is a request we don't understand. Respond with an
295 empty packet so that gdb knows that we don't support this
301 /* It is a request we don't understand. Respond with an
302 empty packet so that gdb knows that we don't support this
312 "\nChild exited with status %d\n", sig
);
314 fprintf (stderr
, "\nChild terminated with signal = 0x%x\n", sig
);
315 if (status
== 'W' || status
== 'X')
317 if (extended_protocol
)
319 fprintf (stderr
, "Killing inferior\n");
322 fprintf (stderr
, "GDBserver restarting\n");
324 /* Wait till we are at 1st instruction in prog. */
325 signal
= start_inferior (&argv
[2], &status
);
331 fprintf (stderr
, "GDBserver exiting\n");
337 /* We come here when getpkt fails.
339 For the extended remote protocol we exit (and this is the only
340 way we gracefully exit!).
342 For the traditional remote protocol close the connection,
343 and re-open it at the top of the loop. */
344 if (extended_protocol
)
351 fprintf (stderr
, "Remote side has terminated connection. "
352 "GDBserver will reopen the connection.\n");
This page took 0.03738 seconds and 4 git commands to generate.