1 /* Remote utility routines for the remote server for GDB.
2 Copyright (C) 1986, 1989, 1993 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
25 #include <sys/ioctl.h>
27 #include <netinet/in.h>
28 #include <sys/socket.h>
30 #include <netinet/tcp.h>
31 #include <sys/ioctl.h>
36 struct ui_file
*gdb_stdlog
;
38 static int remote_desc
;
40 /* Open a connection to a remote debugger.
41 NAME is the filename used for communication. */
44 remote_open (char *name
)
48 if (!strchr (name
, ':'))
50 remote_desc
= open (name
, O_RDWR
);
52 perror_with_name ("Could not open remote device");
56 struct termios termios
;
57 tcgetattr (remote_desc
, &termios
);
62 termios
.c_cflag
&= ~(CSIZE
| PARENB
);
63 termios
.c_cflag
|= CLOCAL
| CS8
;
64 termios
.c_cc
[VMIN
] = 0;
65 termios
.c_cc
[VTIME
] = 0;
67 tcsetattr (remote_desc
, TCSANOW
, &termios
);
74 ioctl (remote_desc
, TCGETA
, &termio
);
79 termio
.c_cflag
&= ~(CSIZE
| PARENB
);
80 termio
.c_cflag
|= CLOCAL
| CS8
;
81 termio
.c_cc
[VMIN
] = 0;
82 termio
.c_cc
[VTIME
] = 0;
84 ioctl (remote_desc
, TCSETA
, &termio
);
92 ioctl (remote_desc
, TIOCGETP
, &sg
);
94 ioctl (remote_desc
, TIOCSETP
, &sg
);
104 struct sockaddr_in sockaddr
;
106 struct protoent
*protoent
;
109 port_str
= strchr (name
, ':');
111 port
= atoi (port_str
+ 1);
113 tmp_desc
= socket (PF_INET
, SOCK_STREAM
, 0);
115 perror_with_name ("Can't open socket");
117 /* Allow rapid reuse of this port. */
119 setsockopt (tmp_desc
, SOL_SOCKET
, SO_REUSEADDR
, (char *) &tmp
,
122 sockaddr
.sin_family
= PF_INET
;
123 sockaddr
.sin_port
= htons (port
);
124 sockaddr
.sin_addr
.s_addr
= INADDR_ANY
;
126 if (bind (tmp_desc
, (struct sockaddr
*) &sockaddr
, sizeof (sockaddr
))
127 || listen (tmp_desc
, 1))
128 perror_with_name ("Can't bind address");
130 tmp
= sizeof (sockaddr
);
131 remote_desc
= accept (tmp_desc
, (struct sockaddr
*) &sockaddr
, &tmp
);
132 if (remote_desc
== -1)
133 perror_with_name ("Accept failed");
135 protoent
= getprotobyname ("tcp");
137 perror_with_name ("getprotobyname");
139 /* Enable TCP keep alive process. */
141 setsockopt (tmp_desc
, SOL_SOCKET
, SO_KEEPALIVE
, (char *) &tmp
, sizeof (tmp
));
143 /* Tell TCP not to delay small packets. This greatly speeds up
144 interactive response. */
146 setsockopt (remote_desc
, protoent
->p_proto
, TCP_NODELAY
,
147 (char *) &tmp
, sizeof (tmp
));
149 close (tmp_desc
); /* No longer need this */
151 signal (SIGPIPE
, SIG_IGN
); /* If we don't do this, then gdbserver simply
152 exits when the remote side dies. */
155 #if defined(F_SETFL) && defined (FASYNC)
156 save_fcntl_flags
= fcntl (remote_desc
, F_GETFL
, 0);
157 fcntl (remote_desc
, F_SETFL
, save_fcntl_flags
| FASYNC
);
160 fprintf (stderr
, "Remote debugging using %s\n", name
);
169 /* Convert hex digit A to a number. */
174 if (a
>= '0' && a
<= '9')
176 else if (a
>= 'a' && a
<= 'f')
179 error ("Reply contains invalid hex digit");
182 /* Convert number NIB to a hex digit. */
190 return 'a' + nib
- 10;
193 /* Send a packet to the remote machine, with error checking.
194 The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
200 unsigned char csum
= 0;
203 int cnt
= strlen (buf
);
206 /* Copy the packet into buffer BUF2, encapsulating it
207 and giving it a checksum. */
212 for (i
= 0; i
< cnt
; i
++)
218 *p
++ = tohex ((csum
>> 4) & 0xf);
219 *p
++ = tohex (csum
& 0xf);
223 /* Send it over and over until we get a positive ack. */
229 if (write (remote_desc
, buf2
, p
- buf2
) != p
- buf2
)
231 perror ("putpkt(write)");
236 printf ("putpkt (\"%s\"); [looking for ack]\n", buf2
);
237 cc
= read (remote_desc
, buf3
, 1);
239 printf ("[received '%c' (0x%x)]\n", buf3
[0], buf3
[0]);
243 fprintf (stderr
, "putpkt(read): Got EOF\n");
245 perror ("putpkt(read)");
250 while (buf3
[0] != '+');
252 return 1; /* Success! */
255 /* Come here when we get an input interrupt from the remote side. This
256 interrupt should only be active while we are waiting for the child to do
257 something. About the only thing that should come through is a ^C, which
258 will cause us to send a SIGINT to the child. */
261 input_interrupt (void)
266 cc
= read (remote_desc
, &c
, 1);
268 if (cc
!= 1 || c
!= '\003')
270 fprintf (stderr
, "input_interrupt, cc = %d c = %d\n", cc
, c
);
274 kill (inferior_pid
, SIGINT
);
278 enable_async_io (void)
280 signal (SIGIO
, input_interrupt
);
284 disable_async_io (void)
286 signal (SIGIO
, SIG_IGN
);
289 /* Returns next char from remote GDB. -1 if error. */
294 static char buf
[BUFSIZ
];
295 static int bufcnt
= 0;
299 return *bufp
++ & 0x7f;
301 bufcnt
= read (remote_desc
, buf
, sizeof (buf
));
306 fprintf (stderr
, "readchar: Got EOF\n");
315 return *bufp
++ & 0x7f;
318 /* Read a packet from the remote machine, with error checking,
319 and store it in BUF. Returns length of packet, or negative if error. */
325 unsigned char csum
, c1
, c2
;
338 printf ("[getpkt: discarding char '%c']\n", c
);
356 c1
= fromhex (readchar ());
357 c2
= fromhex (readchar ());
359 if (csum
== (c1
<< 4) + c2
)
362 fprintf (stderr
, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
363 (c1
<< 4) + c2
, csum
, buf
);
364 write (remote_desc
, "-", 1);
368 printf ("getpkt (\"%s\"); [sending ack] \n", buf
);
370 write (remote_desc
, "+", 1);
373 printf ("[sent ack]\n");
386 write_enn (char *buf
)
395 convert_int_to_ascii (char *from
, char *to
, int n
)
402 nib
= ((ch
& 0xf0) >> 4) & 0x0f;
412 convert_ascii_to_int (char *from
, char *to
, int n
)
417 nib1
= fromhex (*from
++);
418 nib2
= fromhex (*from
++);
419 *to
++ = (((nib1
& 0x0f) << 4) & 0xf0) | (nib2
& 0x0f);
424 outreg (int regno
, char *buf
)
426 int regsize
= REGISTER_RAW_SIZE (regno
);
428 if ((regno
>> 12) != 0)
429 *buf
++ = tohex ((regno
>> 12) & 0xf);
430 if ((regno
>> 8) != 0)
431 *buf
++ = tohex ((regno
>> 8) & 0xf);
432 *buf
++ = tohex ((regno
>> 4) & 0xf);
433 *buf
++ = tohex (regno
& 0xf);
435 convert_int_to_ascii (®isters
[REGISTER_BYTE (regno
)], buf
, regsize
);
443 prepare_resume_reply (char *buf
, char status
, unsigned char signo
)
449 /* FIXME! Should be converting this signal number (numbered
450 according to the signal numbering of the system we are running on)
451 to the signal numbers used by the gdb protocol (see enum target_signal
453 nib
= ((signo
& 0xf0) >> 4);
454 *buf
++ = tohex (nib
);
456 *buf
++ = tohex (nib
);
460 #ifdef GDBSERVER_RESUME_REGS
461 static int gdbserver_resume_regs
[] = GDBSERVER_RESUME_REGS
;
464 i
< sizeof (gdbserver_resume_regs
)
465 / sizeof (gdbserver_resume_regs
[0]);
468 int regnum
= gdbserver_resume_regs
[i
];
469 buf
= outreg (regnum
, buf
);
471 #else /* !defined(GDBSERVER_RESUME_REGS) */
472 buf
= outreg (PC_REGNUM
, buf
);
473 buf
= outreg (FP_REGNUM
, buf
);
474 buf
= outreg (SP_REGNUM
, buf
);
476 buf
= outreg (NPC_REGNUM
, buf
);
478 buf
= outreg (O7_REGNUM
, buf
);
480 #endif /* GDBSERVER_RESUME_REGS */
482 /* If the debugger hasn't used any thread features, don't burden it with
483 threads. If we didn't check this, GDB 4.13 and older would choke. */
484 if (cont_thread
!= 0)
486 if (old_thread_from_wait
!= thread_from_wait
)
488 sprintf (buf
, "thread:%x;", thread_from_wait
);
490 old_thread_from_wait
= thread_from_wait
;
494 /* For W and X, we're done. */
499 decode_m_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
)
503 *mem_addr_ptr
= *len_ptr
= 0;
505 while ((ch
= from
[i
++]) != ',')
507 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
508 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
511 for (j
= 0; j
< 4; j
++)
513 if ((ch
= from
[i
++]) == 0)
515 *len_ptr
= *len_ptr
<< 4;
516 *len_ptr
|= fromhex (ch
) & 0x0f;
521 decode_M_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
,
526 *mem_addr_ptr
= *len_ptr
= 0;
528 while ((ch
= from
[i
++]) != ',')
530 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
531 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
534 while ((ch
= from
[i
++]) != ':')
536 *len_ptr
= *len_ptr
<< 4;
537 *len_ptr
|= fromhex (ch
) & 0x0f;
540 convert_ascii_to_int (&from
[i
++], to
, *len_ptr
);
This page took 0.065695 seconds and 4 git commands to generate.