* i386nbsd-nat.c (i386nbsd_supply_pcb): Cast to 'gdb_byte *' in
[deliverable/binutils-gdb.git] / gdb / gdbserver / server.c
1 /* Main code for remote server for GDB.
2 Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
3 2005
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., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, 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%lx", thread_ptr->id);
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%lx", thread_ptr->id);
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 resume_info[i].thread = strtoul (p + 1, &q, 16);
222 if (p == q)
223 goto err;
224 p = q;
225 if (p[0] != ';' && p[0] != 0)
226 goto err;
227
228 i++;
229 }
230 }
231
232 resume_info[i] = default_action;
233
234 /* Still used in occasional places in the backend. */
235 if (n == 1 && resume_info[0].thread != -1)
236 cont_thread = resume_info[0].thread;
237 else
238 cont_thread = -1;
239 set_desired_inferior (0);
240
241 (*the_target->resume) (resume_info);
242
243 free (resume_info);
244
245 *signal = mywait (status, 1);
246 prepare_resume_reply (own_buf, *status, *signal);
247 return;
248
249 err:
250 /* No other way to report an error... */
251 strcpy (own_buf, "");
252 free (resume_info);
253 return;
254 }
255
256 /* Handle all of the extended 'v' packets. */
257 void
258 handle_v_requests (char *own_buf, char *status, int *signal)
259 {
260 if (strncmp (own_buf, "vCont;", 6) == 0)
261 {
262 handle_v_cont (own_buf, status, signal);
263 return;
264 }
265
266 if (strncmp (own_buf, "vCont?", 6) == 0)
267 {
268 strcpy (own_buf, "vCont;c;C;s;S");
269 return;
270 }
271
272 /* Otherwise we didn't know what packet it was. Say we didn't
273 understand it. */
274 own_buf[0] = 0;
275 return;
276 }
277
278 void
279 myresume (int step, int sig)
280 {
281 struct thread_resume resume_info[2];
282 int n = 0;
283
284 if (step || sig || (cont_thread != 0 && cont_thread != -1))
285 {
286 resume_info[0].thread
287 = ((struct inferior_list_entry *) current_inferior)->id;
288 resume_info[0].step = step;
289 resume_info[0].sig = sig;
290 resume_info[0].leave_stopped = 0;
291 n++;
292 }
293 resume_info[n].thread = -1;
294 resume_info[n].step = 0;
295 resume_info[n].sig = 0;
296 resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
297
298 (*the_target->resume) (resume_info);
299 }
300
301 static int attached;
302
303 static void
304 gdbserver_usage (void)
305 {
306 error ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
307 "\tgdbserver COMM --attach PID\n"
308 "\n"
309 "COMM may either be a tty device (for serial debugging), or \n"
310 "HOST:PORT to listen for a TCP connection.\n");
311 }
312
313 int
314 main (int argc, char *argv[])
315 {
316 char ch, status, *own_buf;
317 unsigned char mem_buf[2000];
318 int i = 0;
319 int signal;
320 unsigned int len;
321 CORE_ADDR mem_addr;
322 int bad_attach;
323 int pid;
324 char *arg_end;
325
326 if (setjmp (toplevel))
327 {
328 fprintf (stderr, "Exiting\n");
329 exit (1);
330 }
331
332 bad_attach = 0;
333 pid = 0;
334 attached = 0;
335 if (argc >= 3 && strcmp (argv[2], "--attach") == 0)
336 {
337 if (argc == 4
338 && argv[3] != '\0'
339 && (pid = strtoul (argv[3], &arg_end, 10)) != 0
340 && *arg_end == '\0')
341 {
342 ;
343 }
344 else
345 bad_attach = 1;
346 }
347
348 if (argc < 3 || bad_attach)
349 gdbserver_usage();
350
351 initialize_low ();
352
353 own_buf = malloc (PBUFSIZ);
354
355 if (pid == 0)
356 {
357 /* Wait till we are at first instruction in program. */
358 signal = start_inferior (&argv[2], &status);
359
360 /* We are now stopped at the first instruction of the target process */
361 }
362 else
363 {
364 switch (attach_inferior (pid, &status, &signal))
365 {
366 case -1:
367 error ("Attaching not supported on this target");
368 break;
369 default:
370 attached = 1;
371 break;
372 }
373 }
374
375 while (1)
376 {
377 remote_open (argv[1]);
378
379 restart:
380 setjmp (toplevel);
381 while (getpkt (own_buf) > 0)
382 {
383 unsigned char sig;
384 i = 0;
385 ch = own_buf[i++];
386 switch (ch)
387 {
388 case 'q':
389 handle_query (own_buf);
390 break;
391 case 'd':
392 remote_debug = !remote_debug;
393 break;
394 case 'D':
395 fprintf (stderr, "Detaching from inferior\n");
396 detach_inferior ();
397 write_ok (own_buf);
398 putpkt (own_buf);
399 remote_close ();
400
401 /* If we are attached, then we can exit. Otherwise, we need to
402 hang around doing nothing, until the child is gone. */
403 if (!attached)
404 {
405 int status, ret;
406
407 do {
408 ret = waitpid (signal_pid, &status, 0);
409 if (WIFEXITED (status) || WIFSIGNALED (status))
410 break;
411 } while (ret != -1 || errno != ECHILD);
412 }
413
414 exit (0);
415
416 case '!':
417 if (attached == 0)
418 {
419 extended_protocol = 1;
420 prepare_resume_reply (own_buf, status, signal);
421 }
422 else
423 {
424 /* We can not use the extended protocol if we are
425 attached, because we can not restart the running
426 program. So return unrecognized. */
427 own_buf[0] = '\0';
428 }
429 break;
430 case '?':
431 prepare_resume_reply (own_buf, status, signal);
432 break;
433 case 'H':
434 switch (own_buf[1])
435 {
436 case 'g':
437 general_thread = strtoul (&own_buf[2], NULL, 16);
438 write_ok (own_buf);
439 set_desired_inferior (1);
440 break;
441 case 'c':
442 cont_thread = strtoul (&own_buf[2], NULL, 16);
443 write_ok (own_buf);
444 break;
445 case 's':
446 step_thread = strtoul (&own_buf[2], NULL, 16);
447 write_ok (own_buf);
448 break;
449 default:
450 /* Silently ignore it so that gdb can extend the protocol
451 without compatibility headaches. */
452 own_buf[0] = '\0';
453 break;
454 }
455 break;
456 case 'g':
457 set_desired_inferior (1);
458 registers_to_string (own_buf);
459 break;
460 case 'G':
461 set_desired_inferior (1);
462 registers_from_string (&own_buf[1]);
463 write_ok (own_buf);
464 break;
465 case 'm':
466 decode_m_packet (&own_buf[1], &mem_addr, &len);
467 if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
468 convert_int_to_ascii (mem_buf, own_buf, len);
469 else
470 write_enn (own_buf);
471 break;
472 case 'M':
473 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
474 if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
475 write_ok (own_buf);
476 else
477 write_enn (own_buf);
478 break;
479 case 'C':
480 convert_ascii_to_int (own_buf + 1, &sig, 1);
481 if (target_signal_to_host_p (sig))
482 signal = target_signal_to_host (sig);
483 else
484 signal = 0;
485 set_desired_inferior (0);
486 myresume (0, signal);
487 signal = mywait (&status, 1);
488 prepare_resume_reply (own_buf, status, signal);
489 break;
490 case 'S':
491 convert_ascii_to_int (own_buf + 1, &sig, 1);
492 if (target_signal_to_host_p (sig))
493 signal = target_signal_to_host (sig);
494 else
495 signal = 0;
496 set_desired_inferior (0);
497 myresume (1, signal);
498 signal = mywait (&status, 1);
499 prepare_resume_reply (own_buf, status, signal);
500 break;
501 case 'c':
502 set_desired_inferior (0);
503 myresume (0, 0);
504 signal = mywait (&status, 1);
505 prepare_resume_reply (own_buf, status, signal);
506 break;
507 case 's':
508 set_desired_inferior (0);
509 myresume (1, 0);
510 signal = mywait (&status, 1);
511 prepare_resume_reply (own_buf, status, signal);
512 break;
513 case 'Z':
514 {
515 char *lenptr;
516 char *dataptr;
517 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
518 int len = strtol (lenptr + 1, &dataptr, 16);
519 char type = own_buf[1];
520
521 if (the_target->insert_watchpoint == NULL
522 || (type < '2' || type > '4'))
523 {
524 /* No watchpoint support or not a watchpoint command;
525 unrecognized either way. */
526 own_buf[0] = '\0';
527 }
528 else
529 {
530 int res;
531
532 res = (*the_target->insert_watchpoint) (type, addr, len);
533 if (res == 0)
534 write_ok (own_buf);
535 else if (res == 1)
536 /* Unsupported. */
537 own_buf[0] = '\0';
538 else
539 write_enn (own_buf);
540 }
541 break;
542 }
543 case 'z':
544 {
545 char *lenptr;
546 char *dataptr;
547 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
548 int len = strtol (lenptr + 1, &dataptr, 16);
549 char type = own_buf[1];
550
551 if (the_target->remove_watchpoint == NULL
552 || (type < '2' || type > '4'))
553 {
554 /* No watchpoint support or not a watchpoint command;
555 unrecognized either way. */
556 own_buf[0] = '\0';
557 }
558 else
559 {
560 int res;
561
562 res = (*the_target->remove_watchpoint) (type, addr, len);
563 if (res == 0)
564 write_ok (own_buf);
565 else if (res == 1)
566 /* Unsupported. */
567 own_buf[0] = '\0';
568 else
569 write_enn (own_buf);
570 }
571 break;
572 }
573 case 'k':
574 fprintf (stderr, "Killing inferior\n");
575 kill_inferior ();
576 /* When using the extended protocol, we start up a new
577 debugging session. The traditional protocol will
578 exit instead. */
579 if (extended_protocol)
580 {
581 write_ok (own_buf);
582 fprintf (stderr, "GDBserver restarting\n");
583
584 /* Wait till we are at 1st instruction in prog. */
585 signal = start_inferior (&argv[2], &status);
586 goto restart;
587 break;
588 }
589 else
590 {
591 exit (0);
592 break;
593 }
594 case 'T':
595 if (mythread_alive (strtoul (&own_buf[1], NULL, 16)))
596 write_ok (own_buf);
597 else
598 write_enn (own_buf);
599 break;
600 case 'R':
601 /* Restarting the inferior is only supported in the
602 extended protocol. */
603 if (extended_protocol)
604 {
605 kill_inferior ();
606 write_ok (own_buf);
607 fprintf (stderr, "GDBserver restarting\n");
608
609 /* Wait till we are at 1st instruction in prog. */
610 signal = start_inferior (&argv[2], &status);
611 goto restart;
612 break;
613 }
614 else
615 {
616 /* It is a request we don't understand. Respond with an
617 empty packet so that gdb knows that we don't support this
618 request. */
619 own_buf[0] = '\0';
620 break;
621 }
622 case 'v':
623 /* Extended (long) request. */
624 handle_v_requests (own_buf, &status, &signal);
625 break;
626 default:
627 /* It is a request we don't understand. Respond with an
628 empty packet so that gdb knows that we don't support this
629 request. */
630 own_buf[0] = '\0';
631 break;
632 }
633
634 putpkt (own_buf);
635
636 if (status == 'W')
637 fprintf (stderr,
638 "\nChild exited with status %d\n", signal);
639 if (status == 'X')
640 fprintf (stderr, "\nChild terminated with signal = 0x%x\n",
641 signal);
642 if (status == 'W' || status == 'X')
643 {
644 if (extended_protocol)
645 {
646 fprintf (stderr, "Killing inferior\n");
647 kill_inferior ();
648 write_ok (own_buf);
649 fprintf (stderr, "GDBserver restarting\n");
650
651 /* Wait till we are at 1st instruction in prog. */
652 signal = start_inferior (&argv[2], &status);
653 goto restart;
654 break;
655 }
656 else
657 {
658 fprintf (stderr, "GDBserver exiting\n");
659 exit (0);
660 }
661 }
662 }
663
664 /* We come here when getpkt fails.
665
666 For the extended remote protocol we exit (and this is the only
667 way we gracefully exit!).
668
669 For the traditional remote protocol close the connection,
670 and re-open it at the top of the loop. */
671 if (extended_protocol)
672 {
673 remote_close ();
674 exit (0);
675 }
676 else
677 {
678 fprintf (stderr, "Remote side has terminated connection. "
679 "GDBserver will reopen the connection.\n");
680 remote_close ();
681 }
682 }
683 }
This page took 0.04629 seconds and 4 git commands to generate.