1 /* Main code for remote server for GDB.
2 Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004
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. */
32 int old_thread_from_wait
;
33 int extended_protocol
;
38 /* The PID of the originally created or attached inferior. Used to
39 send signals to the process when GDB sends us an asynchronous interrupt
40 (user hitting Control-C in the client), and to wait for the child to exit
41 when no longer debugging it. */
46 start_inferior (char *argv
[], char *statusptr
)
48 signal (SIGTTOU
, SIG_DFL
);
49 signal (SIGTTIN
, SIG_DFL
);
51 signal_pid
= create_inferior (argv
[0], argv
);
53 fprintf (stderr
, "Process %s created; pid = %d\n", argv
[0],
56 signal (SIGTTOU
, SIG_IGN
);
57 signal (SIGTTIN
, SIG_IGN
);
58 tcsetpgrp (fileno (stderr
), signal_pid
);
60 /* Wait till we are at 1st instruction in program, return signal number. */
61 return mywait (statusptr
, 0);
65 attach_inferior (int pid
, char *statusptr
, unsigned char *sigptr
)
67 /* myattach should return -1 if attaching is unsupported,
68 0 if it succeeded, and call error() otherwise. */
70 if (myattach (pid
) != 0)
73 fprintf (stderr
, "Attached; pid = %d\n", pid
);
75 /* FIXME - It may be that we should get the SIGNAL_PID from the
76 attach function, so that it can be the main thread instead of
77 whichever we were told to attach to. */
80 *sigptr
= mywait (statusptr
, 0);
85 extern int remote_debug
;
87 /* Handle all of the extended 'q' packets. */
89 handle_query (char *own_buf
)
91 static struct inferior_list_entry
*thread_ptr
;
93 if (strcmp ("qSymbol::", own_buf
) == 0)
95 if (the_target
->look_up_symbols
!= NULL
)
96 (*the_target
->look_up_symbols
) ();
98 strcpy (own_buf
, "OK");
102 if (strcmp ("qfThreadInfo", own_buf
) == 0)
104 thread_ptr
= all_threads
.head
;
105 sprintf (own_buf
, "m%x", thread_ptr
->id
);
106 thread_ptr
= thread_ptr
->next
;
110 if (strcmp ("qsThreadInfo", own_buf
) == 0)
112 if (thread_ptr
!= NULL
)
114 sprintf (own_buf
, "m%x", thread_ptr
->id
);
115 thread_ptr
= thread_ptr
->next
;
120 sprintf (own_buf
, "l");
125 if (the_target
->read_auxv
!= NULL
126 && strncmp ("qPart:auxv:read::", own_buf
, 17) == 0)
128 char data
[(PBUFSIZ
- 1) / 2];
132 decode_m_packet (&own_buf
[17], &ofs
, &len
); /* "OFS,LEN" */
133 if (len
> sizeof data
)
135 n
= (*the_target
->read_auxv
) (ofs
, data
, len
);
141 convert_int_to_ascii (data
, own_buf
, n
);
145 /* Otherwise we didn't know what packet it was. Say we didn't
150 /* Parse vCont packets. */
152 handle_v_cont (char *own_buf
, char *status
, unsigned char *signal
)
156 struct thread_resume
*resume_info
, default_action
;
158 /* Count the number of semicolons in the packet. There should be one
167 /* Allocate room for one extra action, for the default remain-stopped
168 behavior; if no default action is in the list, we'll need the extra
170 resume_info
= malloc ((n
+ 1) * sizeof (resume_info
[0]));
172 default_action
.thread
= -1;
173 default_action
.leave_stopped
= 1;
174 default_action
.step
= 0;
175 default_action
.sig
= 0;
183 resume_info
[i
].leave_stopped
= 0;
185 if (p
[0] == 's' || p
[0] == 'S')
186 resume_info
[i
].step
= 1;
187 else if (p
[0] == 'c' || p
[0] == 'C')
188 resume_info
[i
].step
= 0;
192 if (p
[0] == 'S' || p
[0] == 'C')
195 sig
= strtol (p
+ 1, &q
, 16);
200 if (!target_signal_to_host_p (sig
))
202 resume_info
[i
].sig
= target_signal_to_host (sig
);
206 resume_info
[i
].sig
= 0;
212 resume_info
[i
].thread
= -1;
213 default_action
= resume_info
[i
];
215 /* Note: we don't increment i here, we'll overwrite this entry
216 the next time through. */
218 else if (p
[0] == ':')
220 resume_info
[i
].thread
= strtol (p
+ 1, &q
, 16);
224 if (p
[0] != ';' && p
[0] != 0)
231 resume_info
[i
] = default_action
;
233 /* Still used in occasional places in the backend. */
234 if (n
== 1 && resume_info
[0].thread
!= -1)
235 cont_thread
= resume_info
[0].thread
;
238 set_desired_inferior (0);
240 (*the_target
->resume
) (resume_info
);
244 *signal
= mywait (status
, 1);
245 prepare_resume_reply (own_buf
, *status
, *signal
);
249 /* No other way to report an error... */
250 strcpy (own_buf
, "");
255 /* Handle all of the extended 'v' packets. */
257 handle_v_requests (char *own_buf
, char *status
, unsigned char *signal
)
259 if (strncmp (own_buf
, "vCont;", 6) == 0)
261 handle_v_cont (own_buf
, status
, signal
);
265 if (strncmp (own_buf
, "vCont?", 6) == 0)
267 strcpy (own_buf
, "vCont;c;C;s;S");
271 /* Otherwise we didn't know what packet it was. Say we didn't
278 myresume (int step
, int sig
)
280 struct thread_resume resume_info
[2];
283 if (step
|| sig
|| cont_thread
> 0)
285 resume_info
[0].thread
286 = ((struct inferior_list_entry
*) current_inferior
)->id
;
287 resume_info
[0].step
= step
;
288 resume_info
[0].sig
= sig
;
289 resume_info
[0].leave_stopped
= 0;
292 resume_info
[n
].thread
= -1;
293 resume_info
[n
].step
= 0;
294 resume_info
[n
].sig
= 0;
295 resume_info
[n
].leave_stopped
= (cont_thread
> 0);
297 (*the_target
->resume
) (resume_info
);
303 gdbserver_usage (void)
305 error ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
306 "\tgdbserver COMM --attach PID\n"
308 "COMM may either be a tty device (for serial debugging), or \n"
309 "HOST:PORT to listen for a TCP connection.\n");
313 main (int argc
, char *argv
[])
315 char ch
, status
, *own_buf
, mem_buf
[2000];
317 unsigned char signal
;
324 if (setjmp (toplevel
))
326 fprintf (stderr
, "Exiting\n");
333 if (argc
>= 3 && strcmp (argv
[2], "--attach") == 0)
337 && (pid
= strtoul (argv
[3], &arg_end
, 10)) != 0
346 if (argc
< 3 || bad_attach
)
351 own_buf
= malloc (PBUFSIZ
);
355 /* Wait till we are at first instruction in program. */
356 signal
= start_inferior (&argv
[2], &status
);
358 /* We are now stopped at the first instruction of the target process */
362 switch (attach_inferior (pid
, &status
, &signal
))
365 error ("Attaching not supported on this target");
375 remote_open (argv
[1]);
379 while (getpkt (own_buf
) > 0)
387 handle_query (own_buf
);
390 remote_debug
= !remote_debug
;
393 fprintf (stderr
, "Detaching from inferior\n");
399 /* If we are attached, then we can exit. Otherwise, we need to
400 hang around doing nothing, until the child is gone. */
406 ret
= waitpid (signal_pid
, &status
, 0);
407 if (WIFEXITED (status
) || WIFSIGNALED (status
))
409 } while (ret
!= -1 || errno
!= ECHILD
);
417 extended_protocol
= 1;
418 prepare_resume_reply (own_buf
, status
, signal
);
422 /* We can not use the extended protocol if we are
423 attached, because we can not restart the running
424 program. So return unrecognized. */
429 prepare_resume_reply (own_buf
, status
, signal
);
435 general_thread
= strtol (&own_buf
[2], NULL
, 16);
437 set_desired_inferior (1);
440 cont_thread
= strtol (&own_buf
[2], NULL
, 16);
444 step_thread
= strtol (&own_buf
[2], NULL
, 16);
448 /* Silently ignore it so that gdb can extend the protocol
449 without compatibility headaches. */
455 set_desired_inferior (1);
456 registers_to_string (own_buf
);
459 set_desired_inferior (1);
460 registers_from_string (&own_buf
[1]);
464 decode_m_packet (&own_buf
[1], &mem_addr
, &len
);
465 if (read_inferior_memory (mem_addr
, mem_buf
, len
) == 0)
466 convert_int_to_ascii (mem_buf
, own_buf
, len
);
471 decode_M_packet (&own_buf
[1], &mem_addr
, &len
, mem_buf
);
472 if (write_inferior_memory (mem_addr
, mem_buf
, len
) == 0)
478 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
479 if (target_signal_to_host_p (sig
))
480 signal
= target_signal_to_host (sig
);
483 set_desired_inferior (0);
484 myresume (0, signal
);
485 signal
= mywait (&status
, 1);
486 prepare_resume_reply (own_buf
, status
, signal
);
489 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
490 if (target_signal_to_host_p (sig
))
491 signal
= target_signal_to_host (sig
);
494 set_desired_inferior (0);
495 myresume (1, signal
);
496 signal
= mywait (&status
, 1);
497 prepare_resume_reply (own_buf
, status
, signal
);
500 set_desired_inferior (0);
502 signal
= mywait (&status
, 1);
503 prepare_resume_reply (own_buf
, status
, signal
);
506 set_desired_inferior (0);
508 signal
= mywait (&status
, 1);
509 prepare_resume_reply (own_buf
, status
, signal
);
512 fprintf (stderr
, "Killing inferior\n");
514 /* When using the extended protocol, we start up a new
515 debugging session. The traditional protocol will
517 if (extended_protocol
)
520 fprintf (stderr
, "GDBserver restarting\n");
522 /* Wait till we are at 1st instruction in prog. */
523 signal
= start_inferior (&argv
[2], &status
);
533 if (mythread_alive (strtol (&own_buf
[1], NULL
, 16)))
539 /* Restarting the inferior is only supported in the
540 extended protocol. */
541 if (extended_protocol
)
545 fprintf (stderr
, "GDBserver restarting\n");
547 /* Wait till we are at 1st instruction in prog. */
548 signal
= start_inferior (&argv
[2], &status
);
554 /* It is a request we don't understand. Respond with an
555 empty packet so that gdb knows that we don't support this
561 /* Extended (long) request. */
562 handle_v_requests (own_buf
, &status
, &signal
);
565 /* It is a request we don't understand. Respond with an
566 empty packet so that gdb knows that we don't support this
576 "\nChild exited with status %d\n", signal
);
578 fprintf (stderr
, "\nChild terminated with signal = 0x%x\n",
580 if (status
== 'W' || status
== 'X')
582 if (extended_protocol
)
584 fprintf (stderr
, "Killing inferior\n");
587 fprintf (stderr
, "GDBserver restarting\n");
589 /* Wait till we are at 1st instruction in prog. */
590 signal
= start_inferior (&argv
[2], &status
);
596 fprintf (stderr
, "GDBserver exiting\n");
602 /* We come here when getpkt fails.
604 For the extended remote protocol we exit (and this is the only
605 way we gracefully exit!).
607 For the traditional remote protocol close the connection,
608 and re-open it at the top of the loop. */
609 if (extended_protocol
)
616 fprintf (stderr
, "Remote side has terminated connection. "
617 "GDBserver will reopen the connection.\n");