xref: /openbmc/u-boot/tools/gdb/remote.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
24a5b6a35Swdenk /*
34a5b6a35Swdenk  * taken from gdb/remote.c
44a5b6a35Swdenk  *
54a5b6a35Swdenk  * I am only interested in the write to memory stuff - everything else
64a5b6a35Swdenk  * has been ripped out
74a5b6a35Swdenk  *
84a5b6a35Swdenk  * all the copyright notices etc have been left in
94a5b6a35Swdenk  */
104a5b6a35Swdenk 
114a5b6a35Swdenk /* enough so that it will compile */
124a5b6a35Swdenk #include <stdio.h>
134a5b6a35Swdenk #include <stdlib.h>
144a5b6a35Swdenk #include <string.h>
154a5b6a35Swdenk #include <errno.h>
164a5b6a35Swdenk 
174a5b6a35Swdenk /*nicked from gcc..*/
184a5b6a35Swdenk 
194a5b6a35Swdenk #ifndef alloca
204a5b6a35Swdenk #ifdef __GNUC__
214a5b6a35Swdenk #define alloca __builtin_alloca
224a5b6a35Swdenk #else /* not GNU C.  */
234a5b6a35Swdenk #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
244a5b6a35Swdenk #include <alloca.h>
254a5b6a35Swdenk #else /* not sparc */
264a5b6a35Swdenk #if defined (MSDOS) && !defined (__TURBOC__)
274a5b6a35Swdenk #include <malloc.h>
284a5b6a35Swdenk #else /* not MSDOS, or __TURBOC__ */
294a5b6a35Swdenk #if defined(_AIX)
304a5b6a35Swdenk #include <malloc.h>
314a5b6a35Swdenk  #pragma alloca
324a5b6a35Swdenk #else /* not MSDOS, __TURBOC__, or _AIX */
334a5b6a35Swdenk #ifdef __hpux
344a5b6a35Swdenk #endif /* __hpux */
354a5b6a35Swdenk #endif /* not _AIX */
364a5b6a35Swdenk #endif /* not MSDOS, or __TURBOC__ */
374a5b6a35Swdenk #endif /* not sparc.  */
384a5b6a35Swdenk #endif /* not GNU C.  */
394a5b6a35Swdenk #ifdef __cplusplus
404a5b6a35Swdenk extern "C" {
414a5b6a35Swdenk #endif
424a5b6a35Swdenk     void* alloca(size_t);
434a5b6a35Swdenk #ifdef __cplusplus
444a5b6a35Swdenk }
454a5b6a35Swdenk #endif
464a5b6a35Swdenk #endif /* alloca not defined.  */
474a5b6a35Swdenk 
484a5b6a35Swdenk 
494a5b6a35Swdenk #include "serial.h"
504a5b6a35Swdenk #include "error.h"
514a5b6a35Swdenk #include "remote.h"
524a5b6a35Swdenk #define REGISTER_BYTES 0
534a5b6a35Swdenk #define fprintf_unfiltered fprintf
544a5b6a35Swdenk #define fprintf_filtered fprintf
554a5b6a35Swdenk #define fputs_unfiltered fputs
564a5b6a35Swdenk #define fputs_filtered fputs
574a5b6a35Swdenk #define fputc_unfiltered fputc
584a5b6a35Swdenk #define fputc_filtered fputc
594a5b6a35Swdenk #define printf_unfiltered printf
604a5b6a35Swdenk #define printf_filtered printf
614a5b6a35Swdenk #define puts_unfiltered puts
624a5b6a35Swdenk #define puts_filtered puts
634a5b6a35Swdenk #define putchar_unfiltered putchar
644a5b6a35Swdenk #define putchar_filtered putchar
654a5b6a35Swdenk #define fputstr_unfiltered(a,b,c) fputs((a), (c))
664a5b6a35Swdenk #define gdb_stdlog stderr
674a5b6a35Swdenk #define SERIAL_READCHAR(fd,timo)	serialreadchar((fd), (timo))
684a5b6a35Swdenk #define SERIAL_WRITE(fd, addr, len)	serialwrite((fd), (addr), (len))
694a5b6a35Swdenk #define error Error
704a5b6a35Swdenk #define perror_with_name Perror
714a5b6a35Swdenk #define gdb_flush fflush
724a5b6a35Swdenk #define max(a,b) (((a)>(b))?(a):(b))
734a5b6a35Swdenk #define min(a,b) (((a)<(b))?(a):(b))
744a5b6a35Swdenk #define target_mourn_inferior() {}
754a5b6a35Swdenk #define ULONGEST unsigned long
764a5b6a35Swdenk #define CORE_ADDR unsigned long
774a5b6a35Swdenk 
784a5b6a35Swdenk static int putpkt (char *);
794a5b6a35Swdenk static int putpkt_binary(char *, int);
804a5b6a35Swdenk static void getpkt (char *, int);
814a5b6a35Swdenk 
824a5b6a35Swdenk static int remote_debug = 0, remote_register_buf_size = 0, watchdog = 0;
834a5b6a35Swdenk 
844a5b6a35Swdenk int remote_desc = -1, remote_timeout = 10;
854a5b6a35Swdenk 
864a5b6a35Swdenk static void
fputstrn_unfiltered(char * s,int n,int x,FILE * fp)874a5b6a35Swdenk fputstrn_unfiltered(char *s, int n, int x, FILE *fp)
884a5b6a35Swdenk {
894a5b6a35Swdenk     while (n-- > 0)
904a5b6a35Swdenk 	fputc(*s++, fp);
914a5b6a35Swdenk }
924a5b6a35Swdenk 
934a5b6a35Swdenk void
remote_reset(void)944a5b6a35Swdenk remote_reset(void)
954a5b6a35Swdenk {
964a5b6a35Swdenk     SERIAL_WRITE(remote_desc, "+", 1);
974a5b6a35Swdenk }
984a5b6a35Swdenk 
994a5b6a35Swdenk void
remote_continue(void)1004a5b6a35Swdenk remote_continue(void)
1014a5b6a35Swdenk {
1024a5b6a35Swdenk     putpkt("c");
1034a5b6a35Swdenk }
1044a5b6a35Swdenk 
1054a5b6a35Swdenk /* Remote target communications for serial-line targets in custom GDB protocol
1064a5b6a35Swdenk    Copyright 1988, 91, 92, 93, 94, 95, 96, 97, 98, 1999
1074a5b6a35Swdenk    Free Software Foundation, Inc.
1084a5b6a35Swdenk 
1094a5b6a35Swdenk    This file is part of GDB.
1101a459660SWolfgang Denk  */
1114a5b6a35Swdenk /* *INDENT-OFF* */
1124a5b6a35Swdenk /* Remote communication protocol.
1134a5b6a35Swdenk 
1144a5b6a35Swdenk    A debug packet whose contents are <data>
1154a5b6a35Swdenk    is encapsulated for transmission in the form:
1164a5b6a35Swdenk 
1174a5b6a35Swdenk 	$ <data> # CSUM1 CSUM2
1184a5b6a35Swdenk 
1194a5b6a35Swdenk 	<data> must be ASCII alphanumeric and cannot include characters
1204a5b6a35Swdenk 	'$' or '#'.  If <data> starts with two characters followed by
1214a5b6a35Swdenk 	':', then the existing stubs interpret this as a sequence number.
1224a5b6a35Swdenk 
1234a5b6a35Swdenk 	CSUM1 and CSUM2 are ascii hex representation of an 8-bit
1244a5b6a35Swdenk 	checksum of <data>, the most significant nibble is sent first.
1254a5b6a35Swdenk 	the hex digits 0-9,a-f are used.
1264a5b6a35Swdenk 
1274a5b6a35Swdenk    Receiver responds with:
1284a5b6a35Swdenk 
1294a5b6a35Swdenk 	+	- if CSUM is correct and ready for next packet
1304a5b6a35Swdenk 	-	- if CSUM is incorrect
1314a5b6a35Swdenk 
1324a5b6a35Swdenk    <data> is as follows:
1334a5b6a35Swdenk    Most values are encoded in ascii hex digits.  Signal numbers are according
1344a5b6a35Swdenk    to the numbering in target.h.
1354a5b6a35Swdenk 
1364a5b6a35Swdenk 	Request		Packet
1374a5b6a35Swdenk 
1384a5b6a35Swdenk 	set thread	Hct...		Set thread for subsequent operations.
1394a5b6a35Swdenk 					c = 'c' for thread used in step and
1404a5b6a35Swdenk 					continue; t... can be -1 for all
1414a5b6a35Swdenk 					threads.
1424a5b6a35Swdenk 					c = 'g' for thread used in other
1434a5b6a35Swdenk 					operations.  If zero, pick a thread,
1444a5b6a35Swdenk 					any thread.
1454a5b6a35Swdenk 	reply		OK		for success
1464a5b6a35Swdenk 			ENN		for an error.
1474a5b6a35Swdenk 
1484a5b6a35Swdenk 	read registers  g
1494a5b6a35Swdenk 	reply		XX....X		Each byte of register data
1504a5b6a35Swdenk 					is described by two hex digits.
1514a5b6a35Swdenk 					Registers are in the internal order
1524a5b6a35Swdenk 					for GDB, and the bytes in a register
1534a5b6a35Swdenk 					are in the same order the machine uses.
1544a5b6a35Swdenk 			or ENN		for an error.
1554a5b6a35Swdenk 
1564a5b6a35Swdenk 	write regs	GXX..XX		Each byte of register data
1574a5b6a35Swdenk 					is described by two hex digits.
1584a5b6a35Swdenk 	reply		OK		for success
1594a5b6a35Swdenk 			ENN		for an error
1604a5b6a35Swdenk 
1614a5b6a35Swdenk 	write reg	Pn...=r...	Write register n... with value r...,
1624a5b6a35Swdenk 					which contains two hex digits for each
1634a5b6a35Swdenk 					byte in the register (target byte
1644a5b6a35Swdenk 					order).
1654a5b6a35Swdenk 	reply		OK		for success
1664a5b6a35Swdenk 			ENN		for an error
1674a5b6a35Swdenk 	(not supported by all stubs).
1684a5b6a35Swdenk 
1694a5b6a35Swdenk 	read mem	mAA..AA,LLLL	AA..AA is address, LLLL is length.
1704a5b6a35Swdenk 	reply		XX..XX		XX..XX is mem contents
1714a5b6a35Swdenk 					Can be fewer bytes than requested
1724a5b6a35Swdenk 					if able to read only part of the data.
1734a5b6a35Swdenk 			or ENN		NN is errno
1744a5b6a35Swdenk 
1754a5b6a35Swdenk 	write mem	MAA..AA,LLLL:XX..XX
1764a5b6a35Swdenk 					AA..AA is address,
1774a5b6a35Swdenk 					LLLL is number of bytes,
1784a5b6a35Swdenk 					XX..XX is data
1794a5b6a35Swdenk 	reply		OK		for success
1804a5b6a35Swdenk 			ENN		for an error (this includes the case
1814a5b6a35Swdenk 					where only part of the data was
1824a5b6a35Swdenk 					written).
1834a5b6a35Swdenk 
1844a5b6a35Swdenk 	write mem       XAA..AA,LLLL:XX..XX
1854a5b6a35Swdenk 	 (binary)                       AA..AA is address,
1864a5b6a35Swdenk 					LLLL is number of bytes,
1874a5b6a35Swdenk 					XX..XX is binary data
1884a5b6a35Swdenk 	reply           OK              for success
1894a5b6a35Swdenk 			ENN             for an error
1904a5b6a35Swdenk 
1914a5b6a35Swdenk 	continue	cAA..AA		AA..AA is address to resume
1924a5b6a35Swdenk 					If AA..AA is omitted,
1934a5b6a35Swdenk 					resume at same address.
1944a5b6a35Swdenk 
1954a5b6a35Swdenk 	step		sAA..AA		AA..AA is address to resume
1964a5b6a35Swdenk 					If AA..AA is omitted,
1974a5b6a35Swdenk 					resume at same address.
1984a5b6a35Swdenk 
1994a5b6a35Swdenk 	continue with	Csig;AA..AA	Continue with signal sig (hex signal
2004a5b6a35Swdenk 	signal				number).  If ;AA..AA is omitted,
2014a5b6a35Swdenk 					resume at same address.
2024a5b6a35Swdenk 
2034a5b6a35Swdenk 	step with	Ssig;AA..AA	Like 'C' but step not continue.
2044a5b6a35Swdenk 	signal
2054a5b6a35Swdenk 
2064a5b6a35Swdenk 	last signal     ?               Reply the current reason for stopping.
2074a5b6a35Swdenk 					This is the same reply as is generated
2084a5b6a35Swdenk 					for step or cont : SAA where AA is the
2094a5b6a35Swdenk 					signal number.
2104a5b6a35Swdenk 
2114a5b6a35Swdenk 	detach          D               Reply OK.
2124a5b6a35Swdenk 
2134a5b6a35Swdenk 	There is no immediate reply to step or cont.
2144a5b6a35Swdenk 	The reply comes when the machine stops.
2154a5b6a35Swdenk 	It is		SAA		AA is the signal number.
2164a5b6a35Swdenk 
2174a5b6a35Swdenk 	or...		TAAn...:r...;n...:r...;n...:r...;
2184a5b6a35Swdenk 					AA = signal number
2194a5b6a35Swdenk 					n... = register number (hex)
2204a5b6a35Swdenk 					  r... = register contents
2214a5b6a35Swdenk 					n... = `thread'
2224a5b6a35Swdenk 					  r... = thread process ID.  This is
2234a5b6a35Swdenk 						 a hex integer.
2244a5b6a35Swdenk 					n... = other string not starting
2254a5b6a35Swdenk 					    with valid hex digit.
2264a5b6a35Swdenk 					  gdb should ignore this n,r pair
2274a5b6a35Swdenk 					  and go on to the next.  This way
2284a5b6a35Swdenk 					  we can extend the protocol.
2294a5b6a35Swdenk 	or...		WAA		The process exited, and AA is
2304a5b6a35Swdenk 					the exit status.  This is only
2314a5b6a35Swdenk 					applicable for certains sorts of
2324a5b6a35Swdenk 					targets.
2334a5b6a35Swdenk 	or...		XAA		The process terminated with signal
2344a5b6a35Swdenk 					AA.
2354a5b6a35Swdenk 	or (obsolete)	NAA;tttttttt;dddddddd;bbbbbbbb
2364a5b6a35Swdenk 					AA = signal number
2374a5b6a35Swdenk 					tttttttt = address of symbol "_start"
2384a5b6a35Swdenk 					dddddddd = base of data section
2394a5b6a35Swdenk 					bbbbbbbb = base of bss  section.
2404a5b6a35Swdenk 					Note: only used by Cisco Systems
2414a5b6a35Swdenk 					targets.  The difference between this
2424a5b6a35Swdenk 					reply and the "qOffsets" query is that
2434a5b6a35Swdenk 					the 'N' packet may arrive spontaneously
2444a5b6a35Swdenk 					whereas the 'qOffsets' is a query
2454a5b6a35Swdenk 					initiated by the host debugger.
2464a5b6a35Swdenk 	or...           OXX..XX	XX..XX  is hex encoding of ASCII data. This
2474a5b6a35Swdenk 					can happen at any time while the
2484a5b6a35Swdenk 					program is running and the debugger
2494a5b6a35Swdenk 					should continue to wait for
2504a5b6a35Swdenk 					'W', 'T', etc.
2514a5b6a35Swdenk 
2524a5b6a35Swdenk 	thread alive	TXX		Find out if the thread XX is alive.
2534a5b6a35Swdenk 	reply		OK		thread is still alive
2544a5b6a35Swdenk 			ENN		thread is dead
2554a5b6a35Swdenk 
2564a5b6a35Swdenk 	remote restart	RXX		Restart the remote server
2574a5b6a35Swdenk 
2584a5b6a35Swdenk 	extended ops	!		Use the extended remote protocol.
2594a5b6a35Swdenk 					Sticky -- only needs to be set once.
2604a5b6a35Swdenk 
2614a5b6a35Swdenk 	kill request	k
2624a5b6a35Swdenk 
2634a5b6a35Swdenk 	toggle debug	d		toggle debug flag (see 386 & 68k stubs)
2644a5b6a35Swdenk 	reset		r		reset -- see sparc stub.
2654a5b6a35Swdenk 	reserved	<other>		On other requests, the stub should
2664a5b6a35Swdenk 					ignore the request and send an empty
2674a5b6a35Swdenk 					response ($#<checksum>).  This way
2684a5b6a35Swdenk 					we can extend the protocol and GDB
2694a5b6a35Swdenk 					can tell whether the stub it is
2704a5b6a35Swdenk 					talking to uses the old or the new.
2714a5b6a35Swdenk 	search		tAA:PP,MM	Search backwards starting at address
2724a5b6a35Swdenk 					AA for a match with pattern PP and
2734a5b6a35Swdenk 					mask MM.  PP and MM are 4 bytes.
2744a5b6a35Swdenk 					Not supported by all stubs.
2754a5b6a35Swdenk 
2764a5b6a35Swdenk 	general query	qXXXX		Request info about XXXX.
2774a5b6a35Swdenk 	general set	QXXXX=yyyy	Set value of XXXX to yyyy.
2784a5b6a35Swdenk 	query sect offs	qOffsets	Get section offsets.  Reply is
2794a5b6a35Swdenk 					Text=xxx;Data=yyy;Bss=zzz
2804a5b6a35Swdenk 
2814a5b6a35Swdenk 	Responses can be run-length encoded to save space.  A '*' means that
2824a5b6a35Swdenk 	the next character is an ASCII encoding giving a repeat count which
2834a5b6a35Swdenk 	stands for that many repititions of the character preceding the '*'.
2844a5b6a35Swdenk 	The encoding is n+29, yielding a printable character where n >=3
2854a5b6a35Swdenk 	(which is where rle starts to win).  Don't use an n > 126.
2864a5b6a35Swdenk 
2874a5b6a35Swdenk 	So
2884a5b6a35Swdenk 	"0* " means the same as "0000".  */
2894a5b6a35Swdenk /* *INDENT-ON* */
2904a5b6a35Swdenk 
2914a5b6a35Swdenk /* This variable (available to the user via "set remotebinarydownload")
2924a5b6a35Swdenk    dictates whether downloads are sent in binary (via the 'X' packet).
2934a5b6a35Swdenk    We assume that the stub can, and attempt to do it. This will be cleared if
2944a5b6a35Swdenk    the stub does not understand it. This switch is still needed, though
2954a5b6a35Swdenk    in cases when the packet is supported in the stub, but the connection
2964a5b6a35Swdenk    does not allow it (i.e., 7-bit serial connection only). */
2974a5b6a35Swdenk static int remote_binary_download = 1;
2984a5b6a35Swdenk 
2994a5b6a35Swdenk /* Have we already checked whether binary downloads work? */
3004a5b6a35Swdenk static int remote_binary_checked;
3014a5b6a35Swdenk 
3024a5b6a35Swdenk /* Maximum number of bytes to read/write at once.  The value here
3034a5b6a35Swdenk    is chosen to fill up a packet (the headers account for the 32).  */
3044a5b6a35Swdenk #define MAXBUFBYTES(N) (((N)-32)/2)
3054a5b6a35Swdenk 
3064a5b6a35Swdenk /* Having this larger than 400 causes us to be incompatible with m68k-stub.c
3074a5b6a35Swdenk    and i386-stub.c.  Normally, no one would notice because it only matters
3084a5b6a35Swdenk    for writing large chunks of memory (e.g. in downloads).  Also, this needs
3094a5b6a35Swdenk    to be more than 400 if required to hold the registers (see below, where
3104a5b6a35Swdenk    we round it up based on REGISTER_BYTES).  */
3114a5b6a35Swdenk /* Round up PBUFSIZ to hold all the registers, at least.  */
3124a5b6a35Swdenk #define	PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (400)) \
3134a5b6a35Swdenk 		 ? (REGISTER_BYTES * 2 + 32) \
3144a5b6a35Swdenk 		 : 400)
3154a5b6a35Swdenk 
3164a5b6a35Swdenk 
3174a5b6a35Swdenk /* This variable sets the number of bytes to be written to the target
3184a5b6a35Swdenk    in a single packet.  Normally PBUFSIZ is satisfactory, but some
3194a5b6a35Swdenk    targets need smaller values (perhaps because the receiving end
3204a5b6a35Swdenk    is slow).  */
3214a5b6a35Swdenk 
3224a5b6a35Swdenk static int remote_write_size = 0x7fffffff;
3234a5b6a35Swdenk 
3244a5b6a35Swdenk /* This variable sets the number of bits in an address that are to be
3254a5b6a35Swdenk    sent in a memory ("M" or "m") packet.  Normally, after stripping
3264a5b6a35Swdenk    leading zeros, the entire address would be sent. This variable
3274a5b6a35Swdenk    restricts the address to REMOTE_ADDRESS_SIZE bits.  HISTORY: The
3284a5b6a35Swdenk    initial implementation of remote.c restricted the address sent in
3294a5b6a35Swdenk    memory packets to ``host::sizeof long'' bytes - (typically 32
3304a5b6a35Swdenk    bits).  Consequently, for 64 bit targets, the upper 32 bits of an
3314a5b6a35Swdenk    address was never sent.  Since fixing this bug may cause a break in
3324a5b6a35Swdenk    some remote targets this variable is principly provided to
3334a5b6a35Swdenk    facilitate backward compatibility. */
3344a5b6a35Swdenk 
3354a5b6a35Swdenk static int remote_address_size;
3364a5b6a35Swdenk 
3374a5b6a35Swdenk /* Convert hex digit A to a number.  */
3384a5b6a35Swdenk 
3394a5b6a35Swdenk static int
fromhex(int a)3404a5b6a35Swdenk fromhex (int a)
3414a5b6a35Swdenk {
3424a5b6a35Swdenk   if (a >= '0' && a <= '9')
3434a5b6a35Swdenk     return a - '0';
3444a5b6a35Swdenk   else if (a >= 'a' && a <= 'f')
3454a5b6a35Swdenk     return a - 'a' + 10;
3464a5b6a35Swdenk   else if (a >= 'A' && a <= 'F')
3474a5b6a35Swdenk     return a - 'A' + 10;
3484a5b6a35Swdenk   else {
3494a5b6a35Swdenk     error ("Reply contains invalid hex digit %d", a);
3504a5b6a35Swdenk     return -1;
3514a5b6a35Swdenk   }
3524a5b6a35Swdenk }
3534a5b6a35Swdenk 
3544a5b6a35Swdenk /* Convert number NIB to a hex digit.  */
3554a5b6a35Swdenk 
3564a5b6a35Swdenk static int
tohex(int nib)3574a5b6a35Swdenk tohex (int nib)
3584a5b6a35Swdenk {
3594a5b6a35Swdenk   if (nib < 10)
3604a5b6a35Swdenk     return '0' + nib;
3614a5b6a35Swdenk   else
3624a5b6a35Swdenk     return 'a' + nib - 10;
3634a5b6a35Swdenk }
3644a5b6a35Swdenk 
3654a5b6a35Swdenk /* Return the number of hex digits in num.  */
3664a5b6a35Swdenk 
3674a5b6a35Swdenk static int
hexnumlen(ULONGEST num)3684a5b6a35Swdenk hexnumlen (ULONGEST num)
3694a5b6a35Swdenk {
3704a5b6a35Swdenk   int i;
3714a5b6a35Swdenk 
3724a5b6a35Swdenk   for (i = 0; num != 0; i++)
3734a5b6a35Swdenk     num >>= 4;
3744a5b6a35Swdenk 
3754a5b6a35Swdenk   return max (i, 1);
3764a5b6a35Swdenk }
3774a5b6a35Swdenk 
3784a5b6a35Swdenk /* Set BUF to the hex digits representing NUM.  */
3794a5b6a35Swdenk 
3804a5b6a35Swdenk static int
hexnumstr(char * buf,ULONGEST num)3814a5b6a35Swdenk hexnumstr (char *buf, ULONGEST num)
3824a5b6a35Swdenk {
3834a5b6a35Swdenk   int i;
3844a5b6a35Swdenk   int len = hexnumlen (num);
3854a5b6a35Swdenk 
3864a5b6a35Swdenk   buf[len] = '\0';
3874a5b6a35Swdenk 
3884a5b6a35Swdenk   for (i = len - 1; i >= 0; i--)
3894a5b6a35Swdenk     {
3904a5b6a35Swdenk       buf[i] = "0123456789abcdef"[(num & 0xf)];
3914a5b6a35Swdenk       num >>= 4;
3924a5b6a35Swdenk     }
3934a5b6a35Swdenk 
3944a5b6a35Swdenk   return len;
3954a5b6a35Swdenk }
3964a5b6a35Swdenk 
3974a5b6a35Swdenk /* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
3984a5b6a35Swdenk 
3994a5b6a35Swdenk static CORE_ADDR
remote_address_masked(CORE_ADDR addr)4004a5b6a35Swdenk remote_address_masked (CORE_ADDR addr)
4014a5b6a35Swdenk {
4024a5b6a35Swdenk   if (remote_address_size > 0
4034a5b6a35Swdenk       && remote_address_size < (sizeof (ULONGEST) * 8))
4044a5b6a35Swdenk     {
4054a5b6a35Swdenk       /* Only create a mask when that mask can safely be constructed
4064a5b6a35Swdenk 	 in a ULONGEST variable. */
4074a5b6a35Swdenk       ULONGEST mask = 1;
4084a5b6a35Swdenk       mask = (mask << remote_address_size) - 1;
4094a5b6a35Swdenk       addr &= mask;
4104a5b6a35Swdenk     }
4114a5b6a35Swdenk   return addr;
4124a5b6a35Swdenk }
4134a5b6a35Swdenk 
4144a5b6a35Swdenk /* Determine whether the remote target supports binary downloading.
4154a5b6a35Swdenk    This is accomplished by sending a no-op memory write of zero length
4164a5b6a35Swdenk    to the target at the specified address. It does not suffice to send
4174a5b6a35Swdenk    the whole packet, since many stubs strip the eighth bit and subsequently
4184a5b6a35Swdenk    compute a wrong checksum, which causes real havoc with remote_write_bytes.
4194a5b6a35Swdenk 
4204a5b6a35Swdenk    NOTE: This can still lose if the serial line is not eight-bit clean. In
4214a5b6a35Swdenk    cases like this, the user should clear "remotebinarydownload". */
4224a5b6a35Swdenk static void
check_binary_download(CORE_ADDR addr)4234a5b6a35Swdenk check_binary_download (CORE_ADDR addr)
4244a5b6a35Swdenk {
4254a5b6a35Swdenk   if (remote_binary_download && !remote_binary_checked)
4264a5b6a35Swdenk     {
4274a5b6a35Swdenk       char *buf = alloca (PBUFSIZ);
4284a5b6a35Swdenk       char *p;
4294a5b6a35Swdenk       remote_binary_checked = 1;
4304a5b6a35Swdenk 
4314a5b6a35Swdenk       p = buf;
4324a5b6a35Swdenk       *p++ = 'X';
4334a5b6a35Swdenk       p += hexnumstr (p, (ULONGEST) addr);
4344a5b6a35Swdenk       *p++ = ',';
4354a5b6a35Swdenk       p += hexnumstr (p, (ULONGEST) 0);
4364a5b6a35Swdenk       *p++ = ':';
4374a5b6a35Swdenk       *p = '\0';
4384a5b6a35Swdenk 
4394a5b6a35Swdenk       putpkt_binary (buf, (int) (p - buf));
4404a5b6a35Swdenk       getpkt (buf, 0);
4414a5b6a35Swdenk 
4424a5b6a35Swdenk       if (buf[0] == '\0')
4434a5b6a35Swdenk 	remote_binary_download = 0;
4444a5b6a35Swdenk     }
4454a5b6a35Swdenk 
4464a5b6a35Swdenk   if (remote_debug)
4474a5b6a35Swdenk     {
4484a5b6a35Swdenk       if (remote_binary_download)
4494a5b6a35Swdenk 	fprintf_unfiltered (gdb_stdlog,
4504a5b6a35Swdenk 			    "binary downloading suppported by target\n");
4514a5b6a35Swdenk       else
4524a5b6a35Swdenk 	fprintf_unfiltered (gdb_stdlog,
4534a5b6a35Swdenk 			    "binary downloading NOT suppported by target\n");
4544a5b6a35Swdenk     }
4554a5b6a35Swdenk }
4564a5b6a35Swdenk 
4574a5b6a35Swdenk /* Write memory data directly to the remote machine.
4584a5b6a35Swdenk    This does not inform the data cache; the data cache uses this.
4594a5b6a35Swdenk    MEMADDR is the address in the remote memory space.
4604a5b6a35Swdenk    MYADDR is the address of the buffer in our space.
4614a5b6a35Swdenk    LEN is the number of bytes.
4624a5b6a35Swdenk 
4634a5b6a35Swdenk    Returns number of bytes transferred, or 0 for error.  */
4644a5b6a35Swdenk 
4654a5b6a35Swdenk int
remote_write_bytes(memaddr,myaddr,len)4664a5b6a35Swdenk remote_write_bytes (memaddr, myaddr, len)
4674a5b6a35Swdenk      CORE_ADDR memaddr;
4684a5b6a35Swdenk      char *myaddr;
4694a5b6a35Swdenk      int len;
4704a5b6a35Swdenk {
4714a5b6a35Swdenk   unsigned char *buf = alloca (PBUFSIZ);
4724a5b6a35Swdenk   int max_buf_size;		/* Max size of packet output buffer */
4734a5b6a35Swdenk   int origlen;
4744a5b6a35Swdenk   extern int verbose;
4754a5b6a35Swdenk 
4764a5b6a35Swdenk   /* Verify that the target can support a binary download */
4774a5b6a35Swdenk   check_binary_download (memaddr);
4784a5b6a35Swdenk 
4794a5b6a35Swdenk   /* Chop the transfer down if necessary */
4804a5b6a35Swdenk 
4814a5b6a35Swdenk   max_buf_size = min (remote_write_size, PBUFSIZ);
4824a5b6a35Swdenk   if (remote_register_buf_size != 0)
4834a5b6a35Swdenk     max_buf_size = min (max_buf_size, remote_register_buf_size);
4844a5b6a35Swdenk 
4854a5b6a35Swdenk   /* Subtract header overhead from max payload size -  $M<memaddr>,<len>:#nn */
4864a5b6a35Swdenk   max_buf_size -= 2 + hexnumlen (memaddr + len - 1) + 1 + hexnumlen (len) + 4;
4874a5b6a35Swdenk 
4884a5b6a35Swdenk   origlen = len;
4894a5b6a35Swdenk   while (len > 0)
4904a5b6a35Swdenk     {
4914a5b6a35Swdenk       unsigned char *p, *plen;
4924a5b6a35Swdenk       int todo;
4934a5b6a35Swdenk       int i;
4944a5b6a35Swdenk 
4954a5b6a35Swdenk       /* construct "M"<memaddr>","<len>":" */
4964a5b6a35Swdenk       /* sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, todo); */
4974a5b6a35Swdenk       memaddr = remote_address_masked (memaddr);
4984a5b6a35Swdenk       p = buf;
4994a5b6a35Swdenk       if (remote_binary_download)
5004a5b6a35Swdenk 	{
5014a5b6a35Swdenk 	  *p++ = 'X';
5024a5b6a35Swdenk 	  todo = min (len, max_buf_size);
5034a5b6a35Swdenk 	}
5044a5b6a35Swdenk       else
5054a5b6a35Swdenk 	{
5064a5b6a35Swdenk 	  *p++ = 'M';
5074a5b6a35Swdenk 	  todo = min (len, max_buf_size / 2);	/* num bytes that will fit */
5084a5b6a35Swdenk 	}
5094a5b6a35Swdenk 
5104a5b6a35Swdenk       p += hexnumstr ((char *)p, (ULONGEST) memaddr);
5114a5b6a35Swdenk       *p++ = ',';
5124a5b6a35Swdenk 
5134a5b6a35Swdenk       plen = p;			/* remember where len field goes */
5144a5b6a35Swdenk       p += hexnumstr ((char *)p, (ULONGEST) todo);
5154a5b6a35Swdenk       *p++ = ':';
5164a5b6a35Swdenk       *p = '\0';
5174a5b6a35Swdenk 
5184a5b6a35Swdenk       /* We send target system values byte by byte, in increasing byte
5194a5b6a35Swdenk 	 addresses, each byte encoded as two hex characters (or one
5204a5b6a35Swdenk 	 binary character).  */
5214a5b6a35Swdenk       if (remote_binary_download)
5224a5b6a35Swdenk 	{
5234a5b6a35Swdenk 	  int escaped = 0;
5244a5b6a35Swdenk 	  for (i = 0;
5254a5b6a35Swdenk 	       (i < todo) && (i + escaped) < (max_buf_size - 2);
5264a5b6a35Swdenk 	       i++)
5274a5b6a35Swdenk 	    {
5284a5b6a35Swdenk 	      switch (myaddr[i] & 0xff)
5294a5b6a35Swdenk 		{
5304a5b6a35Swdenk 		case '$':
5314a5b6a35Swdenk 		case '#':
5324a5b6a35Swdenk 		case 0x7d:
5334a5b6a35Swdenk 		  /* These must be escaped */
5344a5b6a35Swdenk 		  escaped++;
5354a5b6a35Swdenk 		  *p++ = 0x7d;
5364a5b6a35Swdenk 		  *p++ = (myaddr[i] & 0xff) ^ 0x20;
5374a5b6a35Swdenk 		  break;
5384a5b6a35Swdenk 		default:
5394a5b6a35Swdenk 		  *p++ = myaddr[i] & 0xff;
5404a5b6a35Swdenk 		  break;
5414a5b6a35Swdenk 		}
5424a5b6a35Swdenk 	    }
5434a5b6a35Swdenk 
5444a5b6a35Swdenk 	  if (i < todo)
5454a5b6a35Swdenk 	    {
5464a5b6a35Swdenk 	      /* Escape chars have filled up the buffer prematurely,
5474a5b6a35Swdenk 		 and we have actually sent fewer bytes than planned.
5484a5b6a35Swdenk 		 Fix-up the length field of the packet.  */
5494a5b6a35Swdenk 
5504a5b6a35Swdenk 	      /* FIXME: will fail if new len is a shorter string than
5514a5b6a35Swdenk 		 old len.  */
5524a5b6a35Swdenk 
5534a5b6a35Swdenk 	      plen += hexnumstr ((char *)plen, (ULONGEST) i);
5544a5b6a35Swdenk 	      *plen++ = ':';
5554a5b6a35Swdenk 	    }
5564a5b6a35Swdenk 	}
5574a5b6a35Swdenk       else
5584a5b6a35Swdenk 	{
5594a5b6a35Swdenk 	  for (i = 0; i < todo; i++)
5604a5b6a35Swdenk 	    {
5614a5b6a35Swdenk 	      *p++ = tohex ((myaddr[i] >> 4) & 0xf);
5624a5b6a35Swdenk 	      *p++ = tohex (myaddr[i] & 0xf);
5634a5b6a35Swdenk 	    }
5644a5b6a35Swdenk 	  *p = '\0';
5654a5b6a35Swdenk 	}
5664a5b6a35Swdenk 
5674a5b6a35Swdenk       putpkt_binary ((char *)buf, (int) (p - buf));
5684a5b6a35Swdenk       getpkt ((char *)buf, 0);
5694a5b6a35Swdenk 
5704a5b6a35Swdenk       if (buf[0] == 'E')
5714a5b6a35Swdenk 	{
5724a5b6a35Swdenk 	  /* There is no correspondance between what the remote protocol uses
5734a5b6a35Swdenk 	     for errors and errno codes.  We would like a cleaner way of
5744a5b6a35Swdenk 	     representing errors (big enough to include errno codes, bfd_error
5754a5b6a35Swdenk 	     codes, and others).  But for now just return EIO.  */
5764a5b6a35Swdenk 	  errno = EIO;
5774a5b6a35Swdenk 	  return 0;
5784a5b6a35Swdenk 	}
5794a5b6a35Swdenk 
5804a5b6a35Swdenk       /* Increment by i, not by todo, in case escape chars
5814a5b6a35Swdenk 	 caused us to send fewer bytes than we'd planned.  */
5824a5b6a35Swdenk       myaddr += i;
5834a5b6a35Swdenk       memaddr += i;
5844a5b6a35Swdenk       len -= i;
5854a5b6a35Swdenk 
5864a5b6a35Swdenk       if (verbose)
5874a5b6a35Swdenk 	putc('.', stderr);
5884a5b6a35Swdenk     }
5894a5b6a35Swdenk   return origlen;
5904a5b6a35Swdenk }
5914a5b6a35Swdenk 
5924a5b6a35Swdenk /* Stuff for dealing with the packets which are part of this protocol.
5934a5b6a35Swdenk    See comment at top of file for details.  */
5944a5b6a35Swdenk 
5954a5b6a35Swdenk /* Read a single character from the remote end, masking it down to 7 bits. */
5964a5b6a35Swdenk 
5974a5b6a35Swdenk static int
readchar(int timeout)5984a5b6a35Swdenk readchar (int timeout)
5994a5b6a35Swdenk {
6004a5b6a35Swdenk   int ch;
6014a5b6a35Swdenk 
6024a5b6a35Swdenk   ch = SERIAL_READCHAR (remote_desc, timeout);
6034a5b6a35Swdenk 
6044a5b6a35Swdenk   switch (ch)
6054a5b6a35Swdenk     {
6064a5b6a35Swdenk     case SERIAL_EOF:
6074a5b6a35Swdenk       error ("Remote connection closed");
6084a5b6a35Swdenk     case SERIAL_ERROR:
6094a5b6a35Swdenk       perror_with_name ("Remote communication error");
6104a5b6a35Swdenk     case SERIAL_TIMEOUT:
6114a5b6a35Swdenk       return ch;
6124a5b6a35Swdenk     default:
6134a5b6a35Swdenk       return ch & 0x7f;
6144a5b6a35Swdenk     }
6154a5b6a35Swdenk }
6164a5b6a35Swdenk 
6174a5b6a35Swdenk static int
putpkt(buf)6184a5b6a35Swdenk putpkt (buf)
6194a5b6a35Swdenk      char *buf;
6204a5b6a35Swdenk {
6214a5b6a35Swdenk   return putpkt_binary (buf, strlen (buf));
6224a5b6a35Swdenk }
6234a5b6a35Swdenk 
6244a5b6a35Swdenk /* Send a packet to the remote machine, with error checking.  The data
6254a5b6a35Swdenk    of the packet is in BUF.  The string in BUF can be at most  PBUFSIZ - 5
6264a5b6a35Swdenk    to account for the $, # and checksum, and for a possible /0 if we are
6274a5b6a35Swdenk    debugging (remote_debug) and want to print the sent packet as a string */
6284a5b6a35Swdenk 
6294a5b6a35Swdenk static int
putpkt_binary(buf,cnt)6304a5b6a35Swdenk putpkt_binary (buf, cnt)
6314a5b6a35Swdenk      char *buf;
6324a5b6a35Swdenk      int cnt;
6334a5b6a35Swdenk {
6344a5b6a35Swdenk   int i;
6354a5b6a35Swdenk   unsigned char csum = 0;
6364a5b6a35Swdenk   char *buf2 = alloca (PBUFSIZ);
6374a5b6a35Swdenk   char *junkbuf = alloca (PBUFSIZ);
6384a5b6a35Swdenk 
6394a5b6a35Swdenk   int ch;
6404a5b6a35Swdenk   int tcount = 0;
6414a5b6a35Swdenk   char *p;
6424a5b6a35Swdenk 
6434a5b6a35Swdenk   /* Copy the packet into buffer BUF2, encapsulating it
6444a5b6a35Swdenk      and giving it a checksum.  */
6454a5b6a35Swdenk 
6464a5b6a35Swdenk   if (cnt > BUFSIZ - 5)		/* Prosanity check */
6474a5b6a35Swdenk     abort ();
6484a5b6a35Swdenk 
6494a5b6a35Swdenk   p = buf2;
6504a5b6a35Swdenk   *p++ = '$';
6514a5b6a35Swdenk 
6524a5b6a35Swdenk   for (i = 0; i < cnt; i++)
6534a5b6a35Swdenk     {
6544a5b6a35Swdenk       csum += buf[i];
6554a5b6a35Swdenk       *p++ = buf[i];
6564a5b6a35Swdenk     }
6574a5b6a35Swdenk   *p++ = '#';
6584a5b6a35Swdenk   *p++ = tohex ((csum >> 4) & 0xf);
6594a5b6a35Swdenk   *p++ = tohex (csum & 0xf);
6604a5b6a35Swdenk 
6614a5b6a35Swdenk   /* Send it over and over until we get a positive ack.  */
6624a5b6a35Swdenk 
6634a5b6a35Swdenk   while (1)
6644a5b6a35Swdenk     {
6654a5b6a35Swdenk       int started_error_output = 0;
6664a5b6a35Swdenk 
6674a5b6a35Swdenk       if (remote_debug)
6684a5b6a35Swdenk 	{
6694a5b6a35Swdenk 	  *p = '\0';
6704a5b6a35Swdenk 	  fprintf_unfiltered (gdb_stdlog, "Sending packet: ");
6714a5b6a35Swdenk 	  fputstrn_unfiltered (buf2, p - buf2, 0, gdb_stdlog);
6724a5b6a35Swdenk 	  fprintf_unfiltered (gdb_stdlog, "...");
6734a5b6a35Swdenk 	  gdb_flush (gdb_stdlog);
6744a5b6a35Swdenk 	}
6754a5b6a35Swdenk       if (SERIAL_WRITE (remote_desc, buf2, p - buf2))
6764a5b6a35Swdenk 	perror_with_name ("putpkt: write failed");
6774a5b6a35Swdenk 
6784a5b6a35Swdenk       /* read until either a timeout occurs (-2) or '+' is read */
6794a5b6a35Swdenk       while (1)
6804a5b6a35Swdenk 	{
6814a5b6a35Swdenk 	  ch = readchar (remote_timeout);
6824a5b6a35Swdenk 
6834a5b6a35Swdenk 	  if (remote_debug)
6844a5b6a35Swdenk 	    {
6854a5b6a35Swdenk 	      switch (ch)
6864a5b6a35Swdenk 		{
6874a5b6a35Swdenk 		case '+':
6884a5b6a35Swdenk 		case SERIAL_TIMEOUT:
6894a5b6a35Swdenk 		case '$':
6904a5b6a35Swdenk 		  if (started_error_output)
6914a5b6a35Swdenk 		    {
6924a5b6a35Swdenk 		      putchar_unfiltered ('\n');
6934a5b6a35Swdenk 		      started_error_output = 0;
6944a5b6a35Swdenk 		    }
6954a5b6a35Swdenk 		}
6964a5b6a35Swdenk 	    }
6974a5b6a35Swdenk 
6984a5b6a35Swdenk 	  switch (ch)
6994a5b6a35Swdenk 	    {
7004a5b6a35Swdenk 	    case '+':
7014a5b6a35Swdenk 	      if (remote_debug)
7024a5b6a35Swdenk 		fprintf_unfiltered (gdb_stdlog, "Ack\n");
7034a5b6a35Swdenk 	      return 1;
7044a5b6a35Swdenk 	    case SERIAL_TIMEOUT:
7054a5b6a35Swdenk 	      tcount++;
7064a5b6a35Swdenk 	      if (tcount > 3)
7074a5b6a35Swdenk 		return 0;
7084a5b6a35Swdenk 	      break;		/* Retransmit buffer */
7094a5b6a35Swdenk 	    case '$':
7104a5b6a35Swdenk 	      {
7114a5b6a35Swdenk 		/* It's probably an old response, and we're out of sync.
7124a5b6a35Swdenk 		   Just gobble up the packet and ignore it.  */
7134a5b6a35Swdenk 		getpkt (junkbuf, 0);
7144a5b6a35Swdenk 		continue;	/* Now, go look for + */
7154a5b6a35Swdenk 	      }
7164a5b6a35Swdenk 	    default:
7174a5b6a35Swdenk 	      if (remote_debug)
7184a5b6a35Swdenk 		{
7194a5b6a35Swdenk 		  if (!started_error_output)
7204a5b6a35Swdenk 		    {
7214a5b6a35Swdenk 		      started_error_output = 1;
7224a5b6a35Swdenk 		      fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
7234a5b6a35Swdenk 		    }
7244a5b6a35Swdenk 		  fputc_unfiltered (ch & 0177, gdb_stdlog);
7254a5b6a35Swdenk 		}
7264a5b6a35Swdenk 	      continue;
7274a5b6a35Swdenk 	    }
7284a5b6a35Swdenk 	  break;		/* Here to retransmit */
7294a5b6a35Swdenk 	}
7304a5b6a35Swdenk 
7314a5b6a35Swdenk #if 0
7324a5b6a35Swdenk       /* This is wrong.  If doing a long backtrace, the user should be
7334a5b6a35Swdenk 	 able to get out next time we call QUIT, without anything as
7344a5b6a35Swdenk 	 violent as interrupt_query.  If we want to provide a way out of
7354a5b6a35Swdenk 	 here without getting to the next QUIT, it should be based on
7364a5b6a35Swdenk 	 hitting ^C twice as in remote_wait.  */
7374a5b6a35Swdenk       if (quit_flag)
7384a5b6a35Swdenk 	{
7394a5b6a35Swdenk 	  quit_flag = 0;
7404a5b6a35Swdenk 	  interrupt_query ();
7414a5b6a35Swdenk 	}
7424a5b6a35Swdenk #endif
7434a5b6a35Swdenk     }
7444a5b6a35Swdenk }
7454a5b6a35Swdenk 
7464a5b6a35Swdenk /* Come here after finding the start of the frame.  Collect the rest
7474a5b6a35Swdenk    into BUF, verifying the checksum, length, and handling run-length
7484a5b6a35Swdenk    compression.  Returns 0 on any error, 1 on success.  */
7494a5b6a35Swdenk 
7504a5b6a35Swdenk static int
read_frame(char * buf)7514a5b6a35Swdenk read_frame (char *buf)
7524a5b6a35Swdenk {
7534a5b6a35Swdenk   unsigned char csum;
7544a5b6a35Swdenk   char *bp;
7554a5b6a35Swdenk   int c;
7564a5b6a35Swdenk 
7574a5b6a35Swdenk   csum = 0;
7584a5b6a35Swdenk   bp = buf;
7594a5b6a35Swdenk 
7604a5b6a35Swdenk   while (1)
7614a5b6a35Swdenk     {
7624a5b6a35Swdenk       c = readchar (remote_timeout);
7634a5b6a35Swdenk 
7644a5b6a35Swdenk       switch (c)
7654a5b6a35Swdenk 	{
7664a5b6a35Swdenk 	case SERIAL_TIMEOUT:
7674a5b6a35Swdenk 	  if (remote_debug)
7684a5b6a35Swdenk 	    fputs_filtered ("Timeout in mid-packet, retrying\n", gdb_stdlog);
7694a5b6a35Swdenk 	  return 0;
7704a5b6a35Swdenk 	case '$':
7714a5b6a35Swdenk 	  if (remote_debug)
7724a5b6a35Swdenk 	    fputs_filtered ("Saw new packet start in middle of old one\n",
7734a5b6a35Swdenk 			    gdb_stdlog);
7744a5b6a35Swdenk 	  return 0;		/* Start a new packet, count retries */
7754a5b6a35Swdenk 	case '#':
7764a5b6a35Swdenk 	  {
7774a5b6a35Swdenk 	    unsigned char pktcsum;
7784a5b6a35Swdenk 
7794a5b6a35Swdenk 	    *bp = '\000';
7804a5b6a35Swdenk 
7814a5b6a35Swdenk 	    pktcsum = fromhex (readchar (remote_timeout)) << 4;
7824a5b6a35Swdenk 	    pktcsum |= fromhex (readchar (remote_timeout));
7834a5b6a35Swdenk 
7844a5b6a35Swdenk 	    if (csum == pktcsum)
7854a5b6a35Swdenk 	      {
7864a5b6a35Swdenk 		return 1;
7874a5b6a35Swdenk 	      }
7884a5b6a35Swdenk 
7894a5b6a35Swdenk 	    if (remote_debug)
7904a5b6a35Swdenk 	      {
7914a5b6a35Swdenk 		fprintf_filtered (gdb_stdlog,
7924a5b6a35Swdenk 			      "Bad checksum, sentsum=0x%x, csum=0x%x, buf=",
7934a5b6a35Swdenk 				  pktcsum, csum);
7944a5b6a35Swdenk 		fputs_filtered (buf, gdb_stdlog);
7954a5b6a35Swdenk 		fputs_filtered ("\n", gdb_stdlog);
7964a5b6a35Swdenk 	      }
7974a5b6a35Swdenk 	    return 0;
7984a5b6a35Swdenk 	  }
7994a5b6a35Swdenk 	case '*':		/* Run length encoding */
8004a5b6a35Swdenk 	  csum += c;
8014a5b6a35Swdenk 	  c = readchar (remote_timeout);
8024a5b6a35Swdenk 	  csum += c;
8034a5b6a35Swdenk 	  c = c - ' ' + 3;	/* Compute repeat count */
8044a5b6a35Swdenk 
8054a5b6a35Swdenk 	  if (c > 0 && c < 255 && bp + c - 1 < buf + PBUFSIZ - 1)
8064a5b6a35Swdenk 	    {
8074a5b6a35Swdenk 	      memset (bp, *(bp - 1), c);
8084a5b6a35Swdenk 	      bp += c;
8094a5b6a35Swdenk 	      continue;
8104a5b6a35Swdenk 	    }
8114a5b6a35Swdenk 
8124a5b6a35Swdenk 	  *bp = '\0';
8134a5b6a35Swdenk 	  printf_filtered ("Repeat count %d too large for buffer: ", c);
8144a5b6a35Swdenk 	  puts_filtered (buf);
8154a5b6a35Swdenk 	  puts_filtered ("\n");
8164a5b6a35Swdenk 	  return 0;
8174a5b6a35Swdenk 	default:
8184a5b6a35Swdenk 	  if (bp < buf + PBUFSIZ - 1)
8194a5b6a35Swdenk 	    {
8204a5b6a35Swdenk 	      *bp++ = c;
8214a5b6a35Swdenk 	      csum += c;
8224a5b6a35Swdenk 	      continue;
8234a5b6a35Swdenk 	    }
8244a5b6a35Swdenk 
8254a5b6a35Swdenk 	  *bp = '\0';
8264a5b6a35Swdenk 	  puts_filtered ("Remote packet too long: ");
8274a5b6a35Swdenk 	  puts_filtered (buf);
8284a5b6a35Swdenk 	  puts_filtered ("\n");
8294a5b6a35Swdenk 
8304a5b6a35Swdenk 	  return 0;
8314a5b6a35Swdenk 	}
8324a5b6a35Swdenk     }
8334a5b6a35Swdenk }
8344a5b6a35Swdenk 
8354a5b6a35Swdenk /* Read a packet from the remote machine, with error checking, and
8364a5b6a35Swdenk    store it in BUF.  BUF is expected to be of size PBUFSIZ.  If
8374a5b6a35Swdenk    FOREVER, wait forever rather than timing out; this is used while
8384a5b6a35Swdenk    the target is executing user code.  */
8394a5b6a35Swdenk 
8404a5b6a35Swdenk static void
getpkt(buf,forever)8414a5b6a35Swdenk getpkt (buf, forever)
8424a5b6a35Swdenk      char *buf;
8434a5b6a35Swdenk      int forever;
8444a5b6a35Swdenk {
8454a5b6a35Swdenk   int c;
8464a5b6a35Swdenk   int tries;
8474a5b6a35Swdenk   int timeout;
8484a5b6a35Swdenk   int val;
8494a5b6a35Swdenk 
8504a5b6a35Swdenk   strcpy (buf, "timeout");
8514a5b6a35Swdenk 
8524a5b6a35Swdenk   if (forever)
8534a5b6a35Swdenk     {
8544a5b6a35Swdenk       timeout = watchdog > 0 ? watchdog : -1;
8554a5b6a35Swdenk     }
8564a5b6a35Swdenk 
8574a5b6a35Swdenk   else
8584a5b6a35Swdenk     timeout = remote_timeout;
8594a5b6a35Swdenk 
8604a5b6a35Swdenk #define MAX_TRIES 3
8614a5b6a35Swdenk 
8624a5b6a35Swdenk   for (tries = 1; tries <= MAX_TRIES; tries++)
8634a5b6a35Swdenk     {
8644a5b6a35Swdenk       /* This can loop forever if the remote side sends us characters
8654a5b6a35Swdenk 	 continuously, but if it pauses, we'll get a zero from readchar
8664a5b6a35Swdenk 	 because of timeout.  Then we'll count that as a retry.  */
8674a5b6a35Swdenk 
8684a5b6a35Swdenk       /* Note that we will only wait forever prior to the start of a packet.
8694a5b6a35Swdenk 	 After that, we expect characters to arrive at a brisk pace.  They
8704a5b6a35Swdenk 	 should show up within remote_timeout intervals.  */
8714a5b6a35Swdenk 
8724a5b6a35Swdenk       do
8734a5b6a35Swdenk 	{
8744a5b6a35Swdenk 	  c = readchar (timeout);
8754a5b6a35Swdenk 
8764a5b6a35Swdenk 	  if (c == SERIAL_TIMEOUT)
8774a5b6a35Swdenk 	    {
8784a5b6a35Swdenk 	      if (forever)	/* Watchdog went off.  Kill the target. */
8794a5b6a35Swdenk 		{
8804a5b6a35Swdenk 		  target_mourn_inferior ();
8814a5b6a35Swdenk 		  error ("Watchdog has expired.  Target detached.\n");
8824a5b6a35Swdenk 		}
8834a5b6a35Swdenk 	      if (remote_debug)
8844a5b6a35Swdenk 		fputs_filtered ("Timed out.\n", gdb_stdlog);
8854a5b6a35Swdenk 	      goto retry;
8864a5b6a35Swdenk 	    }
8874a5b6a35Swdenk 	}
8884a5b6a35Swdenk       while (c != '$');
8894a5b6a35Swdenk 
8904a5b6a35Swdenk       /* We've found the start of a packet, now collect the data.  */
8914a5b6a35Swdenk 
8924a5b6a35Swdenk       val = read_frame (buf);
8934a5b6a35Swdenk 
8944a5b6a35Swdenk       if (val == 1)
8954a5b6a35Swdenk 	{
8964a5b6a35Swdenk 	  if (remote_debug)
8974a5b6a35Swdenk 	    {
8984a5b6a35Swdenk 	      fprintf_unfiltered (gdb_stdlog, "Packet received: ");
8994a5b6a35Swdenk 	      fputstr_unfiltered (buf, 0, gdb_stdlog);
9004a5b6a35Swdenk 	      fprintf_unfiltered (gdb_stdlog, "\n");
9014a5b6a35Swdenk 	    }
9024a5b6a35Swdenk 	  SERIAL_WRITE (remote_desc, "+", 1);
9034a5b6a35Swdenk 	  return;
9044a5b6a35Swdenk 	}
9054a5b6a35Swdenk 
9064a5b6a35Swdenk       /* Try the whole thing again.  */
9074a5b6a35Swdenk     retry:
9084a5b6a35Swdenk       SERIAL_WRITE (remote_desc, "-", 1);
9094a5b6a35Swdenk     }
9104a5b6a35Swdenk 
9114a5b6a35Swdenk   /* We have tried hard enough, and just can't receive the packet.  Give up. */
9124a5b6a35Swdenk 
9134a5b6a35Swdenk   printf_unfiltered ("Ignoring packet error, continuing...\n");
9144a5b6a35Swdenk   SERIAL_WRITE (remote_desc, "+", 1);
9154a5b6a35Swdenk }
916