xref: /openbmc/u-boot/tools/gdb/remote.c (revision 72a8ff4b)
1 /*
2  * taken from gdb/remote.c
3  *
4  * I am only interested in the write to memory stuff - everything else
5  * has been ripped out
6  *
7  * all the copyright notices etc have been left in
8  */
9 
10 /* enough so that it will compile */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <errno.h>
15 
16 /*nicked from gcc..*/
17 
18 #ifndef alloca
19 #ifdef __GNUC__
20 #define alloca __builtin_alloca
21 #else /* not GNU C.  */
22 #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
23 #include <alloca.h>
24 #else /* not sparc */
25 #if defined (MSDOS) && !defined (__TURBOC__)
26 #include <malloc.h>
27 #else /* not MSDOS, or __TURBOC__ */
28 #if defined(_AIX)
29 #include <malloc.h>
30  #pragma alloca
31 #else /* not MSDOS, __TURBOC__, or _AIX */
32 #ifdef __hpux
33 #endif /* __hpux */
34 #endif /* not _AIX */
35 #endif /* not MSDOS, or __TURBOC__ */
36 #endif /* not sparc.  */
37 #endif /* not GNU C.  */
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41     void* alloca(size_t);
42 #ifdef __cplusplus
43 }
44 #endif
45 #endif /* alloca not defined.  */
46 
47 
48 #include "serial.h"
49 #include "error.h"
50 #include "remote.h"
51 #define REGISTER_BYTES 0
52 #define fprintf_unfiltered fprintf
53 #define fprintf_filtered fprintf
54 #define fputs_unfiltered fputs
55 #define fputs_filtered fputs
56 #define fputc_unfiltered fputc
57 #define fputc_filtered fputc
58 #define printf_unfiltered printf
59 #define printf_filtered printf
60 #define puts_unfiltered puts
61 #define puts_filtered puts
62 #define putchar_unfiltered putchar
63 #define putchar_filtered putchar
64 #define fputstr_unfiltered(a,b,c) fputs((a), (c))
65 #define gdb_stdlog stderr
66 #define SERIAL_READCHAR(fd,timo)	serialreadchar((fd), (timo))
67 #define SERIAL_WRITE(fd, addr, len)	serialwrite((fd), (addr), (len))
68 #define error Error
69 #define perror_with_name Perror
70 #define gdb_flush fflush
71 #define max(a,b) (((a)>(b))?(a):(b))
72 #define min(a,b) (((a)<(b))?(a):(b))
73 #define target_mourn_inferior() {}
74 #define ULONGEST unsigned long
75 #define CORE_ADDR unsigned long
76 
77 static int putpkt (char *);
78 static int putpkt_binary(char *, int);
79 static void getpkt (char *, int);
80 
81 static int remote_debug = 0, remote_register_buf_size = 0, watchdog = 0;
82 
83 int remote_desc = -1, remote_timeout = 10;
84 
85 static void
86 fputstrn_unfiltered(char *s, int n, int x, FILE *fp)
87 {
88     while (n-- > 0)
89 	fputc(*s++, fp);
90 }
91 
92 void
93 remote_reset(void)
94 {
95     SERIAL_WRITE(remote_desc, "+", 1);
96 }
97 
98 void
99 remote_continue(void)
100 {
101     putpkt("c");
102 }
103 
104 /* Remote target communications for serial-line targets in custom GDB protocol
105    Copyright 1988, 91, 92, 93, 94, 95, 96, 97, 98, 1999
106    Free Software Foundation, Inc.
107 
108    This file is part of GDB.
109 
110  * SPDX-License-Identifier:	GPL-2.0+
111  */
112 /* *INDENT-OFF* */
113 /* Remote communication protocol.
114 
115    A debug packet whose contents are <data>
116    is encapsulated for transmission in the form:
117 
118 	$ <data> # CSUM1 CSUM2
119 
120 	<data> must be ASCII alphanumeric and cannot include characters
121 	'$' or '#'.  If <data> starts with two characters followed by
122 	':', then the existing stubs interpret this as a sequence number.
123 
124 	CSUM1 and CSUM2 are ascii hex representation of an 8-bit
125 	checksum of <data>, the most significant nibble is sent first.
126 	the hex digits 0-9,a-f are used.
127 
128    Receiver responds with:
129 
130 	+	- if CSUM is correct and ready for next packet
131 	-	- if CSUM is incorrect
132 
133    <data> is as follows:
134    Most values are encoded in ascii hex digits.  Signal numbers are according
135    to the numbering in target.h.
136 
137 	Request		Packet
138 
139 	set thread	Hct...		Set thread for subsequent operations.
140 					c = 'c' for thread used in step and
141 					continue; t... can be -1 for all
142 					threads.
143 					c = 'g' for thread used in other
144 					operations.  If zero, pick a thread,
145 					any thread.
146 	reply		OK		for success
147 			ENN		for an error.
148 
149 	read registers  g
150 	reply		XX....X		Each byte of register data
151 					is described by two hex digits.
152 					Registers are in the internal order
153 					for GDB, and the bytes in a register
154 					are in the same order the machine uses.
155 			or ENN		for an error.
156 
157 	write regs	GXX..XX		Each byte of register data
158 					is described by two hex digits.
159 	reply		OK		for success
160 			ENN		for an error
161 
162 	write reg	Pn...=r...	Write register n... with value r...,
163 					which contains two hex digits for each
164 					byte in the register (target byte
165 					order).
166 	reply		OK		for success
167 			ENN		for an error
168 	(not supported by all stubs).
169 
170 	read mem	mAA..AA,LLLL	AA..AA is address, LLLL is length.
171 	reply		XX..XX		XX..XX is mem contents
172 					Can be fewer bytes than requested
173 					if able to read only part of the data.
174 			or ENN		NN is errno
175 
176 	write mem	MAA..AA,LLLL:XX..XX
177 					AA..AA is address,
178 					LLLL is number of bytes,
179 					XX..XX is data
180 	reply		OK		for success
181 			ENN		for an error (this includes the case
182 					where only part of the data was
183 					written).
184 
185 	write mem       XAA..AA,LLLL:XX..XX
186 	 (binary)                       AA..AA is address,
187 					LLLL is number of bytes,
188 					XX..XX is binary data
189 	reply           OK              for success
190 			ENN             for an error
191 
192 	continue	cAA..AA		AA..AA is address to resume
193 					If AA..AA is omitted,
194 					resume at same address.
195 
196 	step		sAA..AA		AA..AA is address to resume
197 					If AA..AA is omitted,
198 					resume at same address.
199 
200 	continue with	Csig;AA..AA	Continue with signal sig (hex signal
201 	signal				number).  If ;AA..AA is omitted,
202 					resume at same address.
203 
204 	step with	Ssig;AA..AA	Like 'C' but step not continue.
205 	signal
206 
207 	last signal     ?               Reply the current reason for stopping.
208 					This is the same reply as is generated
209 					for step or cont : SAA where AA is the
210 					signal number.
211 
212 	detach          D               Reply OK.
213 
214 	There is no immediate reply to step or cont.
215 	The reply comes when the machine stops.
216 	It is		SAA		AA is the signal number.
217 
218 	or...		TAAn...:r...;n...:r...;n...:r...;
219 					AA = signal number
220 					n... = register number (hex)
221 					  r... = register contents
222 					n... = `thread'
223 					  r... = thread process ID.  This is
224 						 a hex integer.
225 					n... = other string not starting
226 					    with valid hex digit.
227 					  gdb should ignore this n,r pair
228 					  and go on to the next.  This way
229 					  we can extend the protocol.
230 	or...		WAA		The process exited, and AA is
231 					the exit status.  This is only
232 					applicable for certains sorts of
233 					targets.
234 	or...		XAA		The process terminated with signal
235 					AA.
236 	or (obsolete)	NAA;tttttttt;dddddddd;bbbbbbbb
237 					AA = signal number
238 					tttttttt = address of symbol "_start"
239 					dddddddd = base of data section
240 					bbbbbbbb = base of bss  section.
241 					Note: only used by Cisco Systems
242 					targets.  The difference between this
243 					reply and the "qOffsets" query is that
244 					the 'N' packet may arrive spontaneously
245 					whereas the 'qOffsets' is a query
246 					initiated by the host debugger.
247 	or...           OXX..XX	XX..XX  is hex encoding of ASCII data. This
248 					can happen at any time while the
249 					program is running and the debugger
250 					should continue to wait for
251 					'W', 'T', etc.
252 
253 	thread alive	TXX		Find out if the thread XX is alive.
254 	reply		OK		thread is still alive
255 			ENN		thread is dead
256 
257 	remote restart	RXX		Restart the remote server
258 
259 	extended ops	!		Use the extended remote protocol.
260 					Sticky -- only needs to be set once.
261 
262 	kill request	k
263 
264 	toggle debug	d		toggle debug flag (see 386 & 68k stubs)
265 	reset		r		reset -- see sparc stub.
266 	reserved	<other>		On other requests, the stub should
267 					ignore the request and send an empty
268 					response ($#<checksum>).  This way
269 					we can extend the protocol and GDB
270 					can tell whether the stub it is
271 					talking to uses the old or the new.
272 	search		tAA:PP,MM	Search backwards starting at address
273 					AA for a match with pattern PP and
274 					mask MM.  PP and MM are 4 bytes.
275 					Not supported by all stubs.
276 
277 	general query	qXXXX		Request info about XXXX.
278 	general set	QXXXX=yyyy	Set value of XXXX to yyyy.
279 	query sect offs	qOffsets	Get section offsets.  Reply is
280 					Text=xxx;Data=yyy;Bss=zzz
281 
282 	Responses can be run-length encoded to save space.  A '*' means that
283 	the next character is an ASCII encoding giving a repeat count which
284 	stands for that many repititions of the character preceding the '*'.
285 	The encoding is n+29, yielding a printable character where n >=3
286 	(which is where rle starts to win).  Don't use an n > 126.
287 
288 	So
289 	"0* " means the same as "0000".  */
290 /* *INDENT-ON* */
291 
292 /* This variable (available to the user via "set remotebinarydownload")
293    dictates whether downloads are sent in binary (via the 'X' packet).
294    We assume that the stub can, and attempt to do it. This will be cleared if
295    the stub does not understand it. This switch is still needed, though
296    in cases when the packet is supported in the stub, but the connection
297    does not allow it (i.e., 7-bit serial connection only). */
298 static int remote_binary_download = 1;
299 
300 /* Have we already checked whether binary downloads work? */
301 static int remote_binary_checked;
302 
303 /* Maximum number of bytes to read/write at once.  The value here
304    is chosen to fill up a packet (the headers account for the 32).  */
305 #define MAXBUFBYTES(N) (((N)-32)/2)
306 
307 /* Having this larger than 400 causes us to be incompatible with m68k-stub.c
308    and i386-stub.c.  Normally, no one would notice because it only matters
309    for writing large chunks of memory (e.g. in downloads).  Also, this needs
310    to be more than 400 if required to hold the registers (see below, where
311    we round it up based on REGISTER_BYTES).  */
312 /* Round up PBUFSIZ to hold all the registers, at least.  */
313 #define	PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (400)) \
314 		 ? (REGISTER_BYTES * 2 + 32) \
315 		 : 400)
316 
317 
318 /* This variable sets the number of bytes to be written to the target
319    in a single packet.  Normally PBUFSIZ is satisfactory, but some
320    targets need smaller values (perhaps because the receiving end
321    is slow).  */
322 
323 static int remote_write_size = 0x7fffffff;
324 
325 /* This variable sets the number of bits in an address that are to be
326    sent in a memory ("M" or "m") packet.  Normally, after stripping
327    leading zeros, the entire address would be sent. This variable
328    restricts the address to REMOTE_ADDRESS_SIZE bits.  HISTORY: The
329    initial implementation of remote.c restricted the address sent in
330    memory packets to ``host::sizeof long'' bytes - (typically 32
331    bits).  Consequently, for 64 bit targets, the upper 32 bits of an
332    address was never sent.  Since fixing this bug may cause a break in
333    some remote targets this variable is principly provided to
334    facilitate backward compatibility. */
335 
336 static int remote_address_size;
337 
338 /* Convert hex digit A to a number.  */
339 
340 static int
341 fromhex (int a)
342 {
343   if (a >= '0' && a <= '9')
344     return a - '0';
345   else if (a >= 'a' && a <= 'f')
346     return a - 'a' + 10;
347   else if (a >= 'A' && a <= 'F')
348     return a - 'A' + 10;
349   else {
350     error ("Reply contains invalid hex digit %d", a);
351     return -1;
352   }
353 }
354 
355 /* Convert number NIB to a hex digit.  */
356 
357 static int
358 tohex (int nib)
359 {
360   if (nib < 10)
361     return '0' + nib;
362   else
363     return 'a' + nib - 10;
364 }
365 
366 /* Return the number of hex digits in num.  */
367 
368 static int
369 hexnumlen (ULONGEST num)
370 {
371   int i;
372 
373   for (i = 0; num != 0; i++)
374     num >>= 4;
375 
376   return max (i, 1);
377 }
378 
379 /* Set BUF to the hex digits representing NUM.  */
380 
381 static int
382 hexnumstr (char *buf, ULONGEST num)
383 {
384   int i;
385   int len = hexnumlen (num);
386 
387   buf[len] = '\0';
388 
389   for (i = len - 1; i >= 0; i--)
390     {
391       buf[i] = "0123456789abcdef"[(num & 0xf)];
392       num >>= 4;
393     }
394 
395   return len;
396 }
397 
398 /* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
399 
400 static CORE_ADDR
401 remote_address_masked (CORE_ADDR addr)
402 {
403   if (remote_address_size > 0
404       && remote_address_size < (sizeof (ULONGEST) * 8))
405     {
406       /* Only create a mask when that mask can safely be constructed
407 	 in a ULONGEST variable. */
408       ULONGEST mask = 1;
409       mask = (mask << remote_address_size) - 1;
410       addr &= mask;
411     }
412   return addr;
413 }
414 
415 /* Determine whether the remote target supports binary downloading.
416    This is accomplished by sending a no-op memory write of zero length
417    to the target at the specified address. It does not suffice to send
418    the whole packet, since many stubs strip the eighth bit and subsequently
419    compute a wrong checksum, which causes real havoc with remote_write_bytes.
420 
421    NOTE: This can still lose if the serial line is not eight-bit clean. In
422    cases like this, the user should clear "remotebinarydownload". */
423 static void
424 check_binary_download (CORE_ADDR addr)
425 {
426   if (remote_binary_download && !remote_binary_checked)
427     {
428       char *buf = alloca (PBUFSIZ);
429       char *p;
430       remote_binary_checked = 1;
431 
432       p = buf;
433       *p++ = 'X';
434       p += hexnumstr (p, (ULONGEST) addr);
435       *p++ = ',';
436       p += hexnumstr (p, (ULONGEST) 0);
437       *p++ = ':';
438       *p = '\0';
439 
440       putpkt_binary (buf, (int) (p - buf));
441       getpkt (buf, 0);
442 
443       if (buf[0] == '\0')
444 	remote_binary_download = 0;
445     }
446 
447   if (remote_debug)
448     {
449       if (remote_binary_download)
450 	fprintf_unfiltered (gdb_stdlog,
451 			    "binary downloading suppported by target\n");
452       else
453 	fprintf_unfiltered (gdb_stdlog,
454 			    "binary downloading NOT suppported by target\n");
455     }
456 }
457 
458 /* Write memory data directly to the remote machine.
459    This does not inform the data cache; the data cache uses this.
460    MEMADDR is the address in the remote memory space.
461    MYADDR is the address of the buffer in our space.
462    LEN is the number of bytes.
463 
464    Returns number of bytes transferred, or 0 for error.  */
465 
466 int
467 remote_write_bytes (memaddr, myaddr, len)
468      CORE_ADDR memaddr;
469      char *myaddr;
470      int len;
471 {
472   unsigned char *buf = alloca (PBUFSIZ);
473   int max_buf_size;		/* Max size of packet output buffer */
474   int origlen;
475   extern int verbose;
476 
477   /* Verify that the target can support a binary download */
478   check_binary_download (memaddr);
479 
480   /* Chop the transfer down if necessary */
481 
482   max_buf_size = min (remote_write_size, PBUFSIZ);
483   if (remote_register_buf_size != 0)
484     max_buf_size = min (max_buf_size, remote_register_buf_size);
485 
486   /* Subtract header overhead from max payload size -  $M<memaddr>,<len>:#nn */
487   max_buf_size -= 2 + hexnumlen (memaddr + len - 1) + 1 + hexnumlen (len) + 4;
488 
489   origlen = len;
490   while (len > 0)
491     {
492       unsigned char *p, *plen;
493       int todo;
494       int i;
495 
496       /* construct "M"<memaddr>","<len>":" */
497       /* sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, todo); */
498       memaddr = remote_address_masked (memaddr);
499       p = buf;
500       if (remote_binary_download)
501 	{
502 	  *p++ = 'X';
503 	  todo = min (len, max_buf_size);
504 	}
505       else
506 	{
507 	  *p++ = 'M';
508 	  todo = min (len, max_buf_size / 2);	/* num bytes that will fit */
509 	}
510 
511       p += hexnumstr ((char *)p, (ULONGEST) memaddr);
512       *p++ = ',';
513 
514       plen = p;			/* remember where len field goes */
515       p += hexnumstr ((char *)p, (ULONGEST) todo);
516       *p++ = ':';
517       *p = '\0';
518 
519       /* We send target system values byte by byte, in increasing byte
520 	 addresses, each byte encoded as two hex characters (or one
521 	 binary character).  */
522       if (remote_binary_download)
523 	{
524 	  int escaped = 0;
525 	  for (i = 0;
526 	       (i < todo) && (i + escaped) < (max_buf_size - 2);
527 	       i++)
528 	    {
529 	      switch (myaddr[i] & 0xff)
530 		{
531 		case '$':
532 		case '#':
533 		case 0x7d:
534 		  /* These must be escaped */
535 		  escaped++;
536 		  *p++ = 0x7d;
537 		  *p++ = (myaddr[i] & 0xff) ^ 0x20;
538 		  break;
539 		default:
540 		  *p++ = myaddr[i] & 0xff;
541 		  break;
542 		}
543 	    }
544 
545 	  if (i < todo)
546 	    {
547 	      /* Escape chars have filled up the buffer prematurely,
548 		 and we have actually sent fewer bytes than planned.
549 		 Fix-up the length field of the packet.  */
550 
551 	      /* FIXME: will fail if new len is a shorter string than
552 		 old len.  */
553 
554 	      plen += hexnumstr ((char *)plen, (ULONGEST) i);
555 	      *plen++ = ':';
556 	    }
557 	}
558       else
559 	{
560 	  for (i = 0; i < todo; i++)
561 	    {
562 	      *p++ = tohex ((myaddr[i] >> 4) & 0xf);
563 	      *p++ = tohex (myaddr[i] & 0xf);
564 	    }
565 	  *p = '\0';
566 	}
567 
568       putpkt_binary ((char *)buf, (int) (p - buf));
569       getpkt ((char *)buf, 0);
570 
571       if (buf[0] == 'E')
572 	{
573 	  /* There is no correspondance between what the remote protocol uses
574 	     for errors and errno codes.  We would like a cleaner way of
575 	     representing errors (big enough to include errno codes, bfd_error
576 	     codes, and others).  But for now just return EIO.  */
577 	  errno = EIO;
578 	  return 0;
579 	}
580 
581       /* Increment by i, not by todo, in case escape chars
582 	 caused us to send fewer bytes than we'd planned.  */
583       myaddr += i;
584       memaddr += i;
585       len -= i;
586 
587       if (verbose)
588 	putc('.', stderr);
589     }
590   return origlen;
591 }
592 
593 /* Stuff for dealing with the packets which are part of this protocol.
594    See comment at top of file for details.  */
595 
596 /* Read a single character from the remote end, masking it down to 7 bits. */
597 
598 static int
599 readchar (int timeout)
600 {
601   int ch;
602 
603   ch = SERIAL_READCHAR (remote_desc, timeout);
604 
605   switch (ch)
606     {
607     case SERIAL_EOF:
608       error ("Remote connection closed");
609     case SERIAL_ERROR:
610       perror_with_name ("Remote communication error");
611     case SERIAL_TIMEOUT:
612       return ch;
613     default:
614       return ch & 0x7f;
615     }
616 }
617 
618 static int
619 putpkt (buf)
620      char *buf;
621 {
622   return putpkt_binary (buf, strlen (buf));
623 }
624 
625 /* Send a packet to the remote machine, with error checking.  The data
626    of the packet is in BUF.  The string in BUF can be at most  PBUFSIZ - 5
627    to account for the $, # and checksum, and for a possible /0 if we are
628    debugging (remote_debug) and want to print the sent packet as a string */
629 
630 static int
631 putpkt_binary (buf, cnt)
632      char *buf;
633      int cnt;
634 {
635   int i;
636   unsigned char csum = 0;
637   char *buf2 = alloca (PBUFSIZ);
638   char *junkbuf = alloca (PBUFSIZ);
639 
640   int ch;
641   int tcount = 0;
642   char *p;
643 
644   /* Copy the packet into buffer BUF2, encapsulating it
645      and giving it a checksum.  */
646 
647   if (cnt > BUFSIZ - 5)		/* Prosanity check */
648     abort ();
649 
650   p = buf2;
651   *p++ = '$';
652 
653   for (i = 0; i < cnt; i++)
654     {
655       csum += buf[i];
656       *p++ = buf[i];
657     }
658   *p++ = '#';
659   *p++ = tohex ((csum >> 4) & 0xf);
660   *p++ = tohex (csum & 0xf);
661 
662   /* Send it over and over until we get a positive ack.  */
663 
664   while (1)
665     {
666       int started_error_output = 0;
667 
668       if (remote_debug)
669 	{
670 	  *p = '\0';
671 	  fprintf_unfiltered (gdb_stdlog, "Sending packet: ");
672 	  fputstrn_unfiltered (buf2, p - buf2, 0, gdb_stdlog);
673 	  fprintf_unfiltered (gdb_stdlog, "...");
674 	  gdb_flush (gdb_stdlog);
675 	}
676       if (SERIAL_WRITE (remote_desc, buf2, p - buf2))
677 	perror_with_name ("putpkt: write failed");
678 
679       /* read until either a timeout occurs (-2) or '+' is read */
680       while (1)
681 	{
682 	  ch = readchar (remote_timeout);
683 
684 	  if (remote_debug)
685 	    {
686 	      switch (ch)
687 		{
688 		case '+':
689 		case SERIAL_TIMEOUT:
690 		case '$':
691 		  if (started_error_output)
692 		    {
693 		      putchar_unfiltered ('\n');
694 		      started_error_output = 0;
695 		    }
696 		}
697 	    }
698 
699 	  switch (ch)
700 	    {
701 	    case '+':
702 	      if (remote_debug)
703 		fprintf_unfiltered (gdb_stdlog, "Ack\n");
704 	      return 1;
705 	    case SERIAL_TIMEOUT:
706 	      tcount++;
707 	      if (tcount > 3)
708 		return 0;
709 	      break;		/* Retransmit buffer */
710 	    case '$':
711 	      {
712 		/* It's probably an old response, and we're out of sync.
713 		   Just gobble up the packet and ignore it.  */
714 		getpkt (junkbuf, 0);
715 		continue;	/* Now, go look for + */
716 	      }
717 	    default:
718 	      if (remote_debug)
719 		{
720 		  if (!started_error_output)
721 		    {
722 		      started_error_output = 1;
723 		      fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
724 		    }
725 		  fputc_unfiltered (ch & 0177, gdb_stdlog);
726 		}
727 	      continue;
728 	    }
729 	  break;		/* Here to retransmit */
730 	}
731 
732 #if 0
733       /* This is wrong.  If doing a long backtrace, the user should be
734 	 able to get out next time we call QUIT, without anything as
735 	 violent as interrupt_query.  If we want to provide a way out of
736 	 here without getting to the next QUIT, it should be based on
737 	 hitting ^C twice as in remote_wait.  */
738       if (quit_flag)
739 	{
740 	  quit_flag = 0;
741 	  interrupt_query ();
742 	}
743 #endif
744     }
745 }
746 
747 /* Come here after finding the start of the frame.  Collect the rest
748    into BUF, verifying the checksum, length, and handling run-length
749    compression.  Returns 0 on any error, 1 on success.  */
750 
751 static int
752 read_frame (char *buf)
753 {
754   unsigned char csum;
755   char *bp;
756   int c;
757 
758   csum = 0;
759   bp = buf;
760 
761   while (1)
762     {
763       c = readchar (remote_timeout);
764 
765       switch (c)
766 	{
767 	case SERIAL_TIMEOUT:
768 	  if (remote_debug)
769 	    fputs_filtered ("Timeout in mid-packet, retrying\n", gdb_stdlog);
770 	  return 0;
771 	case '$':
772 	  if (remote_debug)
773 	    fputs_filtered ("Saw new packet start in middle of old one\n",
774 			    gdb_stdlog);
775 	  return 0;		/* Start a new packet, count retries */
776 	case '#':
777 	  {
778 	    unsigned char pktcsum;
779 
780 	    *bp = '\000';
781 
782 	    pktcsum = fromhex (readchar (remote_timeout)) << 4;
783 	    pktcsum |= fromhex (readchar (remote_timeout));
784 
785 	    if (csum == pktcsum)
786 	      {
787 		return 1;
788 	      }
789 
790 	    if (remote_debug)
791 	      {
792 		fprintf_filtered (gdb_stdlog,
793 			      "Bad checksum, sentsum=0x%x, csum=0x%x, buf=",
794 				  pktcsum, csum);
795 		fputs_filtered (buf, gdb_stdlog);
796 		fputs_filtered ("\n", gdb_stdlog);
797 	      }
798 	    return 0;
799 	  }
800 	case '*':		/* Run length encoding */
801 	  csum += c;
802 	  c = readchar (remote_timeout);
803 	  csum += c;
804 	  c = c - ' ' + 3;	/* Compute repeat count */
805 
806 	  if (c > 0 && c < 255 && bp + c - 1 < buf + PBUFSIZ - 1)
807 	    {
808 	      memset (bp, *(bp - 1), c);
809 	      bp += c;
810 	      continue;
811 	    }
812 
813 	  *bp = '\0';
814 	  printf_filtered ("Repeat count %d too large for buffer: ", c);
815 	  puts_filtered (buf);
816 	  puts_filtered ("\n");
817 	  return 0;
818 	default:
819 	  if (bp < buf + PBUFSIZ - 1)
820 	    {
821 	      *bp++ = c;
822 	      csum += c;
823 	      continue;
824 	    }
825 
826 	  *bp = '\0';
827 	  puts_filtered ("Remote packet too long: ");
828 	  puts_filtered (buf);
829 	  puts_filtered ("\n");
830 
831 	  return 0;
832 	}
833     }
834 }
835 
836 /* Read a packet from the remote machine, with error checking, and
837    store it in BUF.  BUF is expected to be of size PBUFSIZ.  If
838    FOREVER, wait forever rather than timing out; this is used while
839    the target is executing user code.  */
840 
841 static void
842 getpkt (buf, forever)
843      char *buf;
844      int forever;
845 {
846   int c;
847   int tries;
848   int timeout;
849   int val;
850 
851   strcpy (buf, "timeout");
852 
853   if (forever)
854     {
855       timeout = watchdog > 0 ? watchdog : -1;
856     }
857 
858   else
859     timeout = remote_timeout;
860 
861 #define MAX_TRIES 3
862 
863   for (tries = 1; tries <= MAX_TRIES; tries++)
864     {
865       /* This can loop forever if the remote side sends us characters
866 	 continuously, but if it pauses, we'll get a zero from readchar
867 	 because of timeout.  Then we'll count that as a retry.  */
868 
869       /* Note that we will only wait forever prior to the start of a packet.
870 	 After that, we expect characters to arrive at a brisk pace.  They
871 	 should show up within remote_timeout intervals.  */
872 
873       do
874 	{
875 	  c = readchar (timeout);
876 
877 	  if (c == SERIAL_TIMEOUT)
878 	    {
879 	      if (forever)	/* Watchdog went off.  Kill the target. */
880 		{
881 		  target_mourn_inferior ();
882 		  error ("Watchdog has expired.  Target detached.\n");
883 		}
884 	      if (remote_debug)
885 		fputs_filtered ("Timed out.\n", gdb_stdlog);
886 	      goto retry;
887 	    }
888 	}
889       while (c != '$');
890 
891       /* We've found the start of a packet, now collect the data.  */
892 
893       val = read_frame (buf);
894 
895       if (val == 1)
896 	{
897 	  if (remote_debug)
898 	    {
899 	      fprintf_unfiltered (gdb_stdlog, "Packet received: ");
900 	      fputstr_unfiltered (buf, 0, gdb_stdlog);
901 	      fprintf_unfiltered (gdb_stdlog, "\n");
902 	    }
903 	  SERIAL_WRITE (remote_desc, "+", 1);
904 	  return;
905 	}
906 
907       /* Try the whole thing again.  */
908     retry:
909       SERIAL_WRITE (remote_desc, "-", 1);
910     }
911 
912   /* We have tried hard enough, and just can't receive the packet.  Give up. */
913 
914   printf_unfiltered ("Ignoring packet error, continuing...\n");
915   SERIAL_WRITE (remote_desc, "+", 1);
916 }
917