]> git.ipfire.org Git - people/ms/u-boot.git/blob - tools/gdb/remote.c
imx: hab: Check if CSF is valid before authenticating image
[people/ms/u-boot.git] / tools / gdb / remote.c
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 }