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