]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdbserver/remote-utils.c
import gdb-1999-07-07 post reformat
[thirdparty/binutils-gdb.git] / gdb / gdbserver / remote-utils.c
CommitLineData
c906108c
SS
1/* Remote utility routines for the remote server for GDB.
2 Copyright (C) 1986, 1989, 1993 Free Software Foundation, Inc.
3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
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.
c906108c 10
c5aa993b
JM
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.
c906108c 15
c5aa993b
JM
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. */
c906108c
SS
20
21#include "server.h"
22#include "terminal.h"
23#include <stdio.h>
24#include <string.h>
25#include <sys/ioctl.h>
26#include <sys/file.h>
27#include <netinet/in.h>
28#include <sys/socket.h>
29#include <netdb.h>
30#include <netinet/tcp.h>
31#include <sys/ioctl.h>
32#include <signal.h>
33#include <fcntl.h>
34
35int remote_debug = 0;
36
37static int remote_desc;
38
39/* Open a connection to a remote debugger.
40 NAME is the filename used for communication. */
41
42void
43remote_open (name)
44 char *name;
45{
46 int save_fcntl_flags;
47
48 if (!strchr (name, ':'))
49 {
50 remote_desc = open (name, O_RDWR);
51 if (remote_desc < 0)
52 perror_with_name ("Could not open remote device");
53
54#ifdef HAVE_TERMIOS
55 {
56 struct termios termios;
c5aa993b 57 tcgetattr (remote_desc, &termios);
c906108c
SS
58
59 termios.c_iflag = 0;
60 termios.c_oflag = 0;
61 termios.c_lflag = 0;
c5aa993b 62 termios.c_cflag &= ~(CSIZE | PARENB);
c906108c
SS
63 termios.c_cflag |= CLOCAL | CS8;
64 termios.c_cc[VMIN] = 0;
65 termios.c_cc[VTIME] = 0;
66
c5aa993b 67 tcsetattr (remote_desc, TCSANOW, &termios);
c906108c
SS
68 }
69#endif
70
71#ifdef HAVE_TERMIO
72 {
73 struct termio termio;
74 ioctl (remote_desc, TCGETA, &termio);
75
76 termio.c_iflag = 0;
77 termio.c_oflag = 0;
78 termio.c_lflag = 0;
c5aa993b 79 termio.c_cflag &= ~(CSIZE | PARENB);
c906108c
SS
80 termio.c_cflag |= CLOCAL | CS8;
81 termio.c_cc[VMIN] = 0;
82 termio.c_cc[VTIME] = 0;
83
84 ioctl (remote_desc, TCSETA, &termio);
85 }
86#endif
87
88#ifdef HAVE_SGTTY
89 {
90 struct sgttyb sg;
91
92 ioctl (remote_desc, TIOCGETP, &sg);
93 sg.sg_flags = RAW;
94 ioctl (remote_desc, TIOCSETP, &sg);
95 }
96#endif
97
98
99 }
100 else
101 {
102 char *port_str;
103 int port;
104 struct sockaddr_in sockaddr;
105 int tmp;
106 struct protoent *protoent;
107 int tmp_desc;
108
109 port_str = strchr (name, ':');
110
111 port = atoi (port_str + 1);
112
113 tmp_desc = socket (PF_INET, SOCK_STREAM, 0);
114 if (tmp_desc < 0)
115 perror_with_name ("Can't open socket");
116
117 /* Allow rapid reuse of this port. */
118 tmp = 1;
c5aa993b
JM
119 setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
120 sizeof (tmp));
c906108c
SS
121
122 sockaddr.sin_family = PF_INET;
c5aa993b 123 sockaddr.sin_port = htons (port);
c906108c
SS
124 sockaddr.sin_addr.s_addr = INADDR_ANY;
125
c5aa993b 126 if (bind (tmp_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
c906108c
SS
127 || listen (tmp_desc, 1))
128 perror_with_name ("Can't bind address");
129
130 tmp = sizeof (sockaddr);
c5aa993b 131 remote_desc = accept (tmp_desc, (struct sockaddr *) &sockaddr, &tmp);
c906108c
SS
132 if (remote_desc == -1)
133 perror_with_name ("Accept failed");
134
135 protoent = getprotobyname ("tcp");
136 if (!protoent)
137 perror_with_name ("getprotobyname");
138
139 /* Enable TCP keep alive process. */
140 tmp = 1;
c5aa993b 141 setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
c906108c
SS
142
143 /* Tell TCP not to delay small packets. This greatly speeds up
c5aa993b 144 interactive response. */
c906108c
SS
145 tmp = 1;
146 setsockopt (remote_desc, protoent->p_proto, TCP_NODELAY,
c5aa993b 147 (char *) &tmp, sizeof (tmp));
c906108c
SS
148
149 close (tmp_desc); /* No longer need this */
150
c5aa993b
JM
151 signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply
152 exits when the remote side dies. */
c906108c
SS
153 }
154
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);
158 disable_async_io ();
159#endif /* FASYNC */
160 fprintf (stderr, "Remote debugging using %s\n", name);
161}
162
163void
c5aa993b 164remote_close ()
c906108c
SS
165{
166 close (remote_desc);
167}
168
169/* Convert hex digit A to a number. */
170
171static int
172fromhex (a)
173 int a;
174{
175 if (a >= '0' && a <= '9')
176 return a - '0';
177 else if (a >= 'a' && a <= 'f')
178 return a - 'a' + 10;
179 else
180 error ("Reply contains invalid hex digit");
181}
182
183/* Convert number NIB to a hex digit. */
184
185static int
186tohex (nib)
187 int nib;
188{
189 if (nib < 10)
190 return '0' + nib;
191 else
192 return 'a' + nib - 10;
193}
194
195/* Send a packet to the remote machine, with error checking.
196 The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
197
198int
199putpkt (buf)
200 char *buf;
201{
202 int i;
203 unsigned char csum = 0;
204 char buf2[2000];
205 char buf3[1];
206 int cnt = strlen (buf);
207 char *p;
208
209 /* Copy the packet into buffer BUF2, encapsulating it
210 and giving it a checksum. */
211
212 p = buf2;
213 *p++ = '$';
214
215 for (i = 0; i < cnt; i++)
216 {
217 csum += buf[i];
218 *p++ = buf[i];
219 }
220 *p++ = '#';
221 *p++ = tohex ((csum >> 4) & 0xf);
222 *p++ = tohex (csum & 0xf);
223
224 *p = '\0';
225
226 /* Send it over and over until we get a positive ack. */
227
228 do
229 {
230 int cc;
231
232 if (write (remote_desc, buf2, p - buf2) != p - buf2)
233 {
234 perror ("putpkt(write)");
235 return -1;
236 }
237
238 if (remote_debug)
239 printf ("putpkt (\"%s\"); [looking for ack]\n", buf2);
240 cc = read (remote_desc, buf3, 1);
241 if (remote_debug)
242 printf ("[received '%c' (0x%x)]\n", buf3[0], buf3[0]);
243 if (cc <= 0)
244 {
245 if (cc == 0)
246 fprintf (stderr, "putpkt(read): Got EOF\n");
247 else
248 perror ("putpkt(read)");
249
250 return -1;
251 }
252 }
253 while (buf3[0] != '+');
254
255 return 1; /* Success! */
256}
257
258/* Come here when we get an input interrupt from the remote side. This
259 interrupt should only be active while we are waiting for the child to do
260 something. About the only thing that should come through is a ^C, which
261 will cause us to send a SIGINT to the child. */
262
263static void
c5aa993b 264input_interrupt ()
c906108c
SS
265{
266 int cc;
267 char c;
268
269 cc = read (remote_desc, &c, 1);
270
271 if (cc != 1 || c != '\003')
272 {
c5aa993b 273 fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
c906108c
SS
274 return;
275 }
276
277 kill (inferior_pid, SIGINT);
278}
279
280void
c5aa993b 281enable_async_io ()
c906108c
SS
282{
283 signal (SIGIO, input_interrupt);
284}
285
286void
c5aa993b 287disable_async_io ()
c906108c
SS
288{
289 signal (SIGIO, SIG_IGN);
290}
291
292/* Returns next char from remote GDB. -1 if error. */
293
294static int
295readchar ()
296{
297 static char buf[BUFSIZ];
298 static int bufcnt = 0;
299 static char *bufp;
300
301 if (bufcnt-- > 0)
302 return *bufp++ & 0x7f;
303
304 bufcnt = read (remote_desc, buf, sizeof (buf));
305
306 if (bufcnt <= 0)
307 {
308 if (bufcnt == 0)
309 fprintf (stderr, "readchar: Got EOF\n");
310 else
311 perror ("readchar");
312
313 return -1;
314 }
315
316 bufp = buf;
317 bufcnt--;
318 return *bufp++ & 0x7f;
319}
320
321/* Read a packet from the remote machine, with error checking,
322 and store it in BUF. Returns length of packet, or negative if error. */
323
324int
325getpkt (buf)
326 char *buf;
327{
328 char *bp;
329 unsigned char csum, c1, c2;
330 int c;
331
332 while (1)
333 {
334 csum = 0;
335
336 while (1)
337 {
338 c = readchar ();
339 if (c == '$')
340 break;
341 if (remote_debug)
342 printf ("[getpkt: discarding char '%c']\n", c);
343 if (c < 0)
344 return -1;
345 }
346
347 bp = buf;
348 while (1)
349 {
350 c = readchar ();
351 if (c < 0)
352 return -1;
353 if (c == '#')
354 break;
355 *bp++ = c;
356 csum += c;
357 }
358 *bp = 0;
359
360 c1 = fromhex (readchar ());
361 c2 = fromhex (readchar ());
c5aa993b 362
c906108c
SS
363 if (csum == (c1 << 4) + c2)
364 break;
365
366 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
367 (c1 << 4) + c2, csum, buf);
368 write (remote_desc, "-", 1);
369 }
370
371 if (remote_debug)
372 printf ("getpkt (\"%s\"); [sending ack] \n", buf);
373
374 write (remote_desc, "+", 1);
375
376 if (remote_debug)
377 printf ("[sent ack]\n");
378 return bp - buf;
379}
380
381void
382write_ok (buf)
383 char *buf;
384{
385 buf[0] = 'O';
386 buf[1] = 'K';
387 buf[2] = '\0';
388}
389
390void
391write_enn (buf)
392 char *buf;
393{
394 buf[0] = 'E';
395 buf[1] = 'N';
396 buf[2] = 'N';
397 buf[3] = '\0';
398}
399
400void
401convert_int_to_ascii (from, to, n)
402 char *from, *to;
403 int n;
404{
405 int nib;
406 char ch;
407 while (n--)
408 {
409 ch = *from++;
410 nib = ((ch & 0xf0) >> 4) & 0x0f;
411 *to++ = tohex (nib);
412 nib = ch & 0x0f;
413 *to++ = tohex (nib);
414 }
415 *to++ = 0;
416}
417
418
419void
420convert_ascii_to_int (from, to, n)
421 char *from, *to;
422 int n;
423{
424 int nib1, nib2;
425 while (n--)
426 {
427 nib1 = fromhex (*from++);
428 nib2 = fromhex (*from++);
429 *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
430 }
431}
432
433static char *
c5aa993b 434outreg (regno, buf)
c906108c
SS
435 int regno;
436 char *buf;
437{
438 extern char registers[];
439 int regsize = REGISTER_RAW_SIZE (regno);
440
441 *buf++ = tohex (regno >> 4);
442 *buf++ = tohex (regno & 0xf);
443 *buf++ = ':';
444 convert_int_to_ascii (&registers[REGISTER_BYTE (regno)], buf, regsize);
445 buf += 2 * regsize;
446 *buf++ = ';';
447
448 return buf;
449}
450
451void
452prepare_resume_reply (buf, status, signo)
453 char *buf;
454 char status;
455 unsigned char signo;
456{
457 int nib;
458
459 *buf++ = status;
460
461 /* FIXME! Should be converting this signal number (numbered
462 according to the signal numbering of the system we are running on)
463 to the signal numbers used by the gdb protocol (see enum target_signal
464 in gdb/target.h). */
465 nib = ((signo & 0xf0) >> 4);
466 *buf++ = tohex (nib);
467 nib = signo & 0x0f;
468 *buf++ = tohex (nib);
469
470 if (status == 'T')
471 {
472 buf = outreg (PC_REGNUM, buf);
473 buf = outreg (FP_REGNUM, buf);
474 buf = outreg (SP_REGNUM, buf);
475#ifdef NPC_REGNUM
476 buf = outreg (NPC_REGNUM, buf);
477#endif
478#ifdef O7_REGNUM
479 buf = outreg (O7_REGNUM, buf);
480#endif
481
482 /* If the debugger hasn't used any thread features, don't burden it with
c5aa993b 483 threads. If we didn't check this, GDB 4.13 and older would choke. */
c906108c
SS
484 if (cont_thread != 0)
485 {
486 if (old_thread_from_wait != thread_from_wait)
487 {
488 sprintf (buf, "thread:%x;", thread_from_wait);
489 buf += strlen (buf);
490 old_thread_from_wait = thread_from_wait;
491 }
492 }
493 }
494 /* For W and X, we're done. */
495 *buf++ = 0;
496}
497
498void
499decode_m_packet (from, mem_addr_ptr, len_ptr)
500 char *from;
501 CORE_ADDR *mem_addr_ptr;
502 unsigned int *len_ptr;
503{
504 int i = 0, j = 0;
505 char ch;
506 *mem_addr_ptr = *len_ptr = 0;
507
508 while ((ch = from[i++]) != ',')
509 {
510 *mem_addr_ptr = *mem_addr_ptr << 4;
511 *mem_addr_ptr |= fromhex (ch) & 0x0f;
512 }
513
514 for (j = 0; j < 4; j++)
515 {
516 if ((ch = from[i++]) == 0)
517 break;
518 *len_ptr = *len_ptr << 4;
519 *len_ptr |= fromhex (ch) & 0x0f;
520 }
521}
522
523void
524decode_M_packet (from, mem_addr_ptr, len_ptr, to)
525 char *from, *to;
526 CORE_ADDR *mem_addr_ptr;
527 unsigned int *len_ptr;
528{
529 int i = 0;
530 char ch;
531 *mem_addr_ptr = *len_ptr = 0;
532
533 while ((ch = from[i++]) != ',')
534 {
535 *mem_addr_ptr = *mem_addr_ptr << 4;
536 *mem_addr_ptr |= fromhex (ch) & 0x0f;
537 }
538
539 while ((ch = from[i++]) != ':')
540 {
541 *len_ptr = *len_ptr << 4;
542 *len_ptr |= fromhex (ch) & 0x0f;
543 }
544
545 convert_ascii_to_int (&from[i++], to, *len_ptr);
546}