* Makefile.in (OBS): Add version.o.
[deliverable/binutils-gdb.git] / gdb / gdbserver / server.c
1 /* Main code for remote server for GDB.
2 Copyright (C) 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
3 2005, 2006
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
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.
12
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.
17
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., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23 #include "server.h"
24
25 #include <unistd.h>
26 #include <signal.h>
27 #include <sys/wait.h>
28
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;
35 int server_waiting;
36
37 jmp_buf toplevel;
38
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. */
43
44 unsigned long signal_pid;
45
46 static int
47 start_inferior (char *argv[], char *statusptr)
48 {
49 signal (SIGTTOU, SIG_DFL);
50 signal (SIGTTIN, SIG_DFL);
51
52 signal_pid = create_inferior (argv[0], argv);
53
54 fprintf (stderr, "Process %s created; pid = %ld\n", argv[0],
55 signal_pid);
56
57 signal (SIGTTOU, SIG_IGN);
58 signal (SIGTTIN, SIG_IGN);
59 tcsetpgrp (fileno (stderr), signal_pid);
60
61 /* Wait till we are at 1st instruction in program, return signal number. */
62 return mywait (statusptr, 0);
63 }
64
65 static int
66 attach_inferior (int pid, char *statusptr, int *sigptr)
67 {
68 /* myattach should return -1 if attaching is unsupported,
69 0 if it succeeded, and call error() otherwise. */
70
71 if (myattach (pid) != 0)
72 return -1;
73
74 fprintf (stderr, "Attached; pid = %d\n", pid);
75
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. */
79 signal_pid = pid;
80
81 *sigptr = mywait (statusptr, 0);
82
83 return 0;
84 }
85
86 extern int remote_debug;
87
88 /* Handle all of the extended 'q' packets. */
89 void
90 handle_query (char *own_buf)
91 {
92 static struct inferior_list_entry *thread_ptr;
93
94 if (strcmp ("qSymbol::", own_buf) == 0)
95 {
96 if (the_target->look_up_symbols != NULL)
97 (*the_target->look_up_symbols) ();
98
99 strcpy (own_buf, "OK");
100 return;
101 }
102
103 if (strcmp ("qfThreadInfo", own_buf) == 0)
104 {
105 thread_ptr = all_threads.head;
106 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
107 thread_ptr = thread_ptr->next;
108 return;
109 }
110
111 if (strcmp ("qsThreadInfo", own_buf) == 0)
112 {
113 if (thread_ptr != NULL)
114 {
115 sprintf (own_buf, "m%x", thread_to_gdb_id ((struct thread_info *)thread_ptr));
116 thread_ptr = thread_ptr->next;
117 return;
118 }
119 else
120 {
121 sprintf (own_buf, "l");
122 return;
123 }
124 }
125
126 if (the_target->read_auxv != NULL
127 && strncmp ("qPart:auxv:read::", own_buf, 17) == 0)
128 {
129 unsigned char data[(PBUFSIZ - 1) / 2];
130 CORE_ADDR ofs;
131 unsigned int len;
132 int n;
133 decode_m_packet (&own_buf[17], &ofs, &len); /* "OFS,LEN" */
134 if (len > sizeof data)
135 len = sizeof data;
136 n = (*the_target->read_auxv) (ofs, data, len);
137 if (n == 0)
138 write_ok (own_buf);
139 else if (n < 0)
140 write_enn (own_buf);
141 else
142 convert_int_to_ascii (data, own_buf, n);
143 return;
144 }
145
146 /* Otherwise we didn't know what packet it was. Say we didn't
147 understand it. */
148 own_buf[0] = 0;
149 }
150
151 /* Parse vCont packets. */
152 void
153 handle_v_cont (char *own_buf, char *status, int *signal)
154 {
155 char *p, *q;
156 int n = 0, i = 0;
157 struct thread_resume *resume_info, default_action;
158
159 /* Count the number of semicolons in the packet. There should be one
160 for every action. */
161 p = &own_buf[5];
162 while (p)
163 {
164 n++;
165 p++;
166 p = strchr (p, ';');
167 }
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
170 slot. */
171 resume_info = malloc ((n + 1) * sizeof (resume_info[0]));
172
173 default_action.thread = -1;
174 default_action.leave_stopped = 1;
175 default_action.step = 0;
176 default_action.sig = 0;
177
178 p = &own_buf[5];
179 i = 0;
180 while (*p)
181 {
182 p++;
183
184 resume_info[i].leave_stopped = 0;
185
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;
190 else
191 goto err;
192
193 if (p[0] == 'S' || p[0] == 'C')
194 {
195 int sig;
196 sig = strtol (p + 1, &q, 16);
197 if (p == q)
198 goto err;
199 p = q;
200
201 if (!target_signal_to_host_p (sig))
202 goto err;
203 resume_info[i].sig = target_signal_to_host (sig);
204 }
205 else
206 {
207 resume_info[i].sig = 0;
208 p = p + 1;
209 }
210
211 if (p[0] == 0)
212 {
213 resume_info[i].thread = -1;
214 default_action = resume_info[i];
215
216 /* Note: we don't increment i here, we'll overwrite this entry
217 the next time through. */
218 }
219 else if (p[0] == ':')
220 {
221 unsigned int gdb_id = strtoul (p + 1, &q, 16);
222 unsigned long thread_id;
223
224 if (p == q)
225 goto err;
226 p = q;
227 if (p[0] != ';' && p[0] != 0)
228 goto err;
229
230 thread_id = gdb_id_to_thread_id (gdb_id);
231 if (thread_id)
232 resume_info[i].thread = thread_id;
233 else
234 goto err;
235
236 i++;
237 }
238 }
239
240 resume_info[i] = default_action;
241
242 /* Still used in occasional places in the backend. */
243 if (n == 1 && resume_info[0].thread != -1)
244 cont_thread = resume_info[0].thread;
245 else
246 cont_thread = -1;
247 set_desired_inferior (0);
248
249 (*the_target->resume) (resume_info);
250
251 free (resume_info);
252
253 *signal = mywait (status, 1);
254 prepare_resume_reply (own_buf, *status, *signal);
255 return;
256
257 err:
258 /* No other way to report an error... */
259 strcpy (own_buf, "");
260 free (resume_info);
261 return;
262 }
263
264 /* Handle all of the extended 'v' packets. */
265 void
266 handle_v_requests (char *own_buf, char *status, int *signal)
267 {
268 if (strncmp (own_buf, "vCont;", 6) == 0)
269 {
270 handle_v_cont (own_buf, status, signal);
271 return;
272 }
273
274 if (strncmp (own_buf, "vCont?", 6) == 0)
275 {
276 strcpy (own_buf, "vCont;c;C;s;S");
277 return;
278 }
279
280 /* Otherwise we didn't know what packet it was. Say we didn't
281 understand it. */
282 own_buf[0] = 0;
283 return;
284 }
285
286 void
287 myresume (int step, int sig)
288 {
289 struct thread_resume resume_info[2];
290 int n = 0;
291
292 if (step || sig || (cont_thread != 0 && cont_thread != -1))
293 {
294 resume_info[0].thread
295 = ((struct inferior_list_entry *) current_inferior)->id;
296 resume_info[0].step = step;
297 resume_info[0].sig = sig;
298 resume_info[0].leave_stopped = 0;
299 n++;
300 }
301 resume_info[n].thread = -1;
302 resume_info[n].step = 0;
303 resume_info[n].sig = 0;
304 resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
305
306 (*the_target->resume) (resume_info);
307 }
308
309 static int attached;
310
311 static void
312 gdbserver_version (void)
313 {
314 printf ("GNU gdbserver %s\n"
315 "Copyright (C) 2006 Free Software Foundation, Inc.\n"
316 "gdbserver is free software, covered by the GNU General Public License.\n"
317 "This gdbserver was configured as \"%s\"\n",
318 version, host_name);
319 }
320
321 static void
322 gdbserver_usage (void)
323 {
324 printf ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
325 "\tgdbserver COMM --attach PID\n"
326 "\n"
327 "COMM may either be a tty device (for serial debugging), or \n"
328 "HOST:PORT to listen for a TCP connection.\n");
329 }
330
331 int
332 main (int argc, char *argv[])
333 {
334 char ch, status, *own_buf;
335 unsigned char *mem_buf;
336 int i = 0;
337 int signal;
338 unsigned int len;
339 CORE_ADDR mem_addr;
340 int bad_attach;
341 int pid;
342 char *arg_end;
343
344 if (argc >= 2 && strcmp (argv[1], "--version") == 0)
345 {
346 gdbserver_version ();
347 exit (0);
348 }
349
350 if (argc >= 2 && strcmp (argv[1], "--help") == 0)
351 {
352 gdbserver_usage ();
353 exit (0);
354 }
355
356 if (setjmp (toplevel))
357 {
358 fprintf (stderr, "Exiting\n");
359 exit (1);
360 }
361
362 bad_attach = 0;
363 pid = 0;
364 attached = 0;
365 if (argc >= 3 && strcmp (argv[2], "--attach") == 0)
366 {
367 if (argc == 4
368 && argv[3] != '\0'
369 && (pid = strtoul (argv[3], &arg_end, 10)) != 0
370 && *arg_end == '\0')
371 {
372 ;
373 }
374 else
375 bad_attach = 1;
376 }
377
378 if (argc < 3 || bad_attach)
379 {
380 gdbserver_usage ();
381 exit (1);
382 }
383
384 initialize_low ();
385
386 own_buf = malloc (PBUFSIZ);
387 mem_buf = malloc (PBUFSIZ);
388
389 if (pid == 0)
390 {
391 /* Wait till we are at first instruction in program. */
392 signal = start_inferior (&argv[2], &status);
393
394 /* We are now stopped at the first instruction of the target process */
395 }
396 else
397 {
398 switch (attach_inferior (pid, &status, &signal))
399 {
400 case -1:
401 error ("Attaching not supported on this target");
402 break;
403 default:
404 attached = 1;
405 break;
406 }
407 }
408
409 while (1)
410 {
411 remote_open (argv[1]);
412
413 restart:
414 setjmp (toplevel);
415 while (getpkt (own_buf) > 0)
416 {
417 unsigned char sig;
418 i = 0;
419 ch = own_buf[i++];
420 switch (ch)
421 {
422 case 'q':
423 handle_query (own_buf);
424 break;
425 case 'd':
426 remote_debug = !remote_debug;
427 break;
428 case 'D':
429 fprintf (stderr, "Detaching from inferior\n");
430 detach_inferior ();
431 write_ok (own_buf);
432 putpkt (own_buf);
433 remote_close ();
434
435 /* If we are attached, then we can exit. Otherwise, we need to
436 hang around doing nothing, until the child is gone. */
437 if (!attached)
438 {
439 int status, ret;
440
441 do {
442 ret = waitpid (signal_pid, &status, 0);
443 if (WIFEXITED (status) || WIFSIGNALED (status))
444 break;
445 } while (ret != -1 || errno != ECHILD);
446 }
447
448 exit (0);
449
450 case '!':
451 if (attached == 0)
452 {
453 extended_protocol = 1;
454 prepare_resume_reply (own_buf, status, signal);
455 }
456 else
457 {
458 /* We can not use the extended protocol if we are
459 attached, because we can not restart the running
460 program. So return unrecognized. */
461 own_buf[0] = '\0';
462 }
463 break;
464 case '?':
465 prepare_resume_reply (own_buf, status, signal);
466 break;
467 case 'H':
468 if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's')
469 {
470 unsigned long gdb_id, thread_id;
471
472 gdb_id = strtoul (&own_buf[2], NULL, 16);
473 thread_id = gdb_id_to_thread_id (gdb_id);
474 if (thread_id == 0)
475 {
476 write_enn (own_buf);
477 break;
478 }
479
480 if (own_buf[1] == 'g')
481 {
482 general_thread = thread_id;
483 set_desired_inferior (1);
484 }
485 else if (own_buf[1] == 'c')
486 cont_thread = thread_id;
487 else if (own_buf[1] == 's')
488 step_thread = thread_id;
489
490 write_ok (own_buf);
491 }
492 else
493 {
494 /* Silently ignore it so that gdb can extend the protocol
495 without compatibility headaches. */
496 own_buf[0] = '\0';
497 }
498 break;
499 case 'g':
500 set_desired_inferior (1);
501 registers_to_string (own_buf);
502 break;
503 case 'G':
504 set_desired_inferior (1);
505 registers_from_string (&own_buf[1]);
506 write_ok (own_buf);
507 break;
508 case 'm':
509 decode_m_packet (&own_buf[1], &mem_addr, &len);
510 if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
511 convert_int_to_ascii (mem_buf, own_buf, len);
512 else
513 write_enn (own_buf);
514 break;
515 case 'M':
516 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
517 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
518 write_ok (own_buf);
519 else
520 write_enn (own_buf);
521 break;
522 case 'C':
523 convert_ascii_to_int (own_buf + 1, &sig, 1);
524 if (target_signal_to_host_p (sig))
525 signal = target_signal_to_host (sig);
526 else
527 signal = 0;
528 set_desired_inferior (0);
529 myresume (0, signal);
530 signal = mywait (&status, 1);
531 prepare_resume_reply (own_buf, status, signal);
532 break;
533 case 'S':
534 convert_ascii_to_int (own_buf + 1, &sig, 1);
535 if (target_signal_to_host_p (sig))
536 signal = target_signal_to_host (sig);
537 else
538 signal = 0;
539 set_desired_inferior (0);
540 myresume (1, signal);
541 signal = mywait (&status, 1);
542 prepare_resume_reply (own_buf, status, signal);
543 break;
544 case 'c':
545 set_desired_inferior (0);
546 myresume (0, 0);
547 signal = mywait (&status, 1);
548 prepare_resume_reply (own_buf, status, signal);
549 break;
550 case 's':
551 set_desired_inferior (0);
552 myresume (1, 0);
553 signal = mywait (&status, 1);
554 prepare_resume_reply (own_buf, status, signal);
555 break;
556 case 'Z':
557 {
558 char *lenptr;
559 char *dataptr;
560 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
561 int len = strtol (lenptr + 1, &dataptr, 16);
562 char type = own_buf[1];
563
564 if (the_target->insert_watchpoint == NULL
565 || (type < '2' || type > '4'))
566 {
567 /* No watchpoint support or not a watchpoint command;
568 unrecognized either way. */
569 own_buf[0] = '\0';
570 }
571 else
572 {
573 int res;
574
575 res = (*the_target->insert_watchpoint) (type, addr, len);
576 if (res == 0)
577 write_ok (own_buf);
578 else if (res == 1)
579 /* Unsupported. */
580 own_buf[0] = '\0';
581 else
582 write_enn (own_buf);
583 }
584 break;
585 }
586 case 'z':
587 {
588 char *lenptr;
589 char *dataptr;
590 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
591 int len = strtol (lenptr + 1, &dataptr, 16);
592 char type = own_buf[1];
593
594 if (the_target->remove_watchpoint == NULL
595 || (type < '2' || type > '4'))
596 {
597 /* No watchpoint support or not a watchpoint command;
598 unrecognized either way. */
599 own_buf[0] = '\0';
600 }
601 else
602 {
603 int res;
604
605 res = (*the_target->remove_watchpoint) (type, addr, len);
606 if (res == 0)
607 write_ok (own_buf);
608 else if (res == 1)
609 /* Unsupported. */
610 own_buf[0] = '\0';
611 else
612 write_enn (own_buf);
613 }
614 break;
615 }
616 case 'k':
617 fprintf (stderr, "Killing inferior\n");
618 kill_inferior ();
619 /* When using the extended protocol, we start up a new
620 debugging session. The traditional protocol will
621 exit instead. */
622 if (extended_protocol)
623 {
624 write_ok (own_buf);
625 fprintf (stderr, "GDBserver restarting\n");
626
627 /* Wait till we are at 1st instruction in prog. */
628 signal = start_inferior (&argv[2], &status);
629 goto restart;
630 break;
631 }
632 else
633 {
634 exit (0);
635 break;
636 }
637 case 'T':
638 {
639 unsigned long gdb_id, thread_id;
640
641 gdb_id = strtoul (&own_buf[1], NULL, 16);
642 thread_id = gdb_id_to_thread_id (gdb_id);
643 if (thread_id == 0)
644 {
645 write_enn (own_buf);
646 break;
647 }
648
649 if (mythread_alive (thread_id))
650 write_ok (own_buf);
651 else
652 write_enn (own_buf);
653 }
654 break;
655 case 'R':
656 /* Restarting the inferior is only supported in the
657 extended protocol. */
658 if (extended_protocol)
659 {
660 kill_inferior ();
661 write_ok (own_buf);
662 fprintf (stderr, "GDBserver restarting\n");
663
664 /* Wait till we are at 1st instruction in prog. */
665 signal = start_inferior (&argv[2], &status);
666 goto restart;
667 break;
668 }
669 else
670 {
671 /* It is a request we don't understand. Respond with an
672 empty packet so that gdb knows that we don't support this
673 request. */
674 own_buf[0] = '\0';
675 break;
676 }
677 case 'v':
678 /* Extended (long) request. */
679 handle_v_requests (own_buf, &status, &signal);
680 break;
681 default:
682 /* It is a request we don't understand. Respond with an
683 empty packet so that gdb knows that we don't support this
684 request. */
685 own_buf[0] = '\0';
686 break;
687 }
688
689 putpkt (own_buf);
690
691 if (status == 'W')
692 fprintf (stderr,
693 "\nChild exited with status %d\n", signal);
694 if (status == 'X')
695 fprintf (stderr, "\nChild terminated with signal = 0x%x\n",
696 signal);
697 if (status == 'W' || status == 'X')
698 {
699 if (extended_protocol)
700 {
701 fprintf (stderr, "Killing inferior\n");
702 kill_inferior ();
703 write_ok (own_buf);
704 fprintf (stderr, "GDBserver restarting\n");
705
706 /* Wait till we are at 1st instruction in prog. */
707 signal = start_inferior (&argv[2], &status);
708 goto restart;
709 break;
710 }
711 else
712 {
713 fprintf (stderr, "GDBserver exiting\n");
714 exit (0);
715 }
716 }
717 }
718
719 /* We come here when getpkt fails.
720
721 For the extended remote protocol we exit (and this is the only
722 way we gracefully exit!).
723
724 For the traditional remote protocol close the connection,
725 and re-open it at the top of the loop. */
726 if (extended_protocol)
727 {
728 remote_close ();
729 exit (0);
730 }
731 else
732 {
733 fprintf (stderr, "Remote side has terminated connection. "
734 "GDBserver will reopen the connection.\n");
735 remote_close ();
736 }
737 }
738 }
This page took 0.043862 seconds and 4 git commands to generate.