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