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