1/* Remote target communications for serial-line targets using SDS' protocol.
2
3   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2004 Free Software
4   Foundation, Inc.
5
6   This file is part of GDB.
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 59 Temple Place - Suite 330,
21   Boston, MA 02111-1307, USA.  */
22
23/* This interface was written by studying the behavior of the SDS
24   monitor on an ADS 821/860 board, and by consulting the
25   documentation of the monitor that is available on Motorola's web
26   site.  -sts 8/13/97 */
27
28#include "defs.h"
29#include "gdb_string.h"
30#include <fcntl.h>
31#include "frame.h"
32#include "inferior.h"
33#include "bfd.h"
34#include "symfile.h"
35#include "target.h"
36#include "gdbcmd.h"
37#include "objfiles.h"
38#include "gdb-stabs.h"
39#include "gdbthread.h"
40#include "gdbcore.h"
41#include "regcache.h"
42
43#include <signal.h>
44#include "serial.h"
45
46extern void _initialize_remote_sds (void);
47
48/* Declarations of local functions. */
49
50static int sds_write_bytes (CORE_ADDR, char *, int);
51
52static int sds_read_bytes (CORE_ADDR, char *, int);
53
54static void sds_files_info (struct target_ops *ignore);
55
56static int sds_xfer_memory (CORE_ADDR, char *, int, int,
57			    struct mem_attrib *, struct target_ops *);
58
59static void sds_prepare_to_store (void);
60
61static void sds_fetch_registers (int);
62
63static void sds_resume (ptid_t, int, enum target_signal);
64
65static int sds_start_remote (void *);
66
67static void sds_open (char *, int);
68
69static void sds_close (int);
70
71static void sds_store_registers (int);
72
73static void sds_mourn (void);
74
75static void sds_load (char *, int);
76
77static int getmessage (unsigned char *, int);
78
79static int putmessage (unsigned char *, int);
80
81static int sds_send (unsigned char *, int);
82
83static int readchar (int);
84
85static ptid_t sds_wait (ptid_t, struct target_waitstatus *);
86
87static void sds_kill (void);
88
89static int fromhex (int);
90
91static void sds_detach (char *, int);
92
93static void sds_interrupt (int);
94
95static void sds_interrupt_twice (int);
96
97static void interrupt_query (void);
98
99static int read_frame (char *);
100
101static int sds_insert_breakpoint (CORE_ADDR, char *);
102
103static int sds_remove_breakpoint (CORE_ADDR, char *);
104
105static void init_sds_ops (void);
106
107static void sds_command (char *args, int from_tty);
108
109/* Define the target operations vector. */
110
111static struct target_ops sds_ops;
112
113/* This was 5 seconds, which is a long time to sit and wait.
114   Unless this is going though some terminal server or multiplexer or
115   other form of hairy serial connection, I would think 2 seconds would
116   be plenty.  */
117
118static int sds_timeout = 2;
119
120/* Descriptor for I/O to remote machine.  Initialize it to NULL so
121   that sds_open knows that we don't have a file open when the program
122   starts.  */
123
124static struct serial *sds_desc = NULL;
125
126/* This limit comes from the monitor.  */
127
128#define	PBUFSIZ	250
129
130/* Maximum number of bytes to read/write at once.  The value here
131   is chosen to fill up a packet (the headers account for the 32).  */
132#define MAXBUFBYTES ((PBUFSIZ-32)/2)
133
134static int next_msg_id;
135
136static int just_started;
137
138static int message_pending;
139
140
141/* Clean up connection to a remote debugger.  */
142
143static void
144sds_close (int quitting)
145{
146  if (sds_desc)
147    serial_close (sds_desc);
148  sds_desc = NULL;
149}
150
151/* Stub for catch_errors.  */
152
153static int
154sds_start_remote (void *dummy)
155{
156  int c;
157  unsigned char buf[200];
158
159  immediate_quit++;		/* Allow user to interrupt it */
160
161  /* Ack any packet which the remote side has already sent.  */
162  serial_write (sds_desc, "{#*\r\n", 5);
163  serial_write (sds_desc, "{#}\r\n", 5);
164
165  while ((c = readchar (1)) >= 0)
166    printf_unfiltered ("%c", c);
167  printf_unfiltered ("\n");
168
169  next_msg_id = 251;
170
171  buf[0] = 26;
172  sds_send (buf, 1);
173
174  buf[0] = 0;
175  sds_send (buf, 1);
176
177  immediate_quit--;
178
179  start_remote ();		/* Initialize gdb process mechanisms */
180  return 1;
181}
182
183/* Open a connection to a remote debugger.
184   NAME is the filename used for communication.  */
185
186static void
187sds_open (char *name, int from_tty)
188{
189  if (name == 0)
190    error ("To open a remote debug connection, you need to specify what serial\n\
191device is attached to the remote system (e.g. /dev/ttya).");
192
193  target_preopen (from_tty);
194
195  unpush_target (&sds_ops);
196
197  sds_desc = serial_open (name);
198  if (!sds_desc)
199    perror_with_name (name);
200
201  if (baud_rate != -1)
202    {
203      if (serial_setbaudrate (sds_desc, baud_rate))
204	{
205	  serial_close (sds_desc);
206	  perror_with_name (name);
207	}
208    }
209
210
211  serial_raw (sds_desc);
212
213  /* If there is something sitting in the buffer we might take it as a
214     response to a command, which would be bad.  */
215  serial_flush_input (sds_desc);
216
217  if (from_tty)
218    {
219      puts_filtered ("Remote debugging using ");
220      puts_filtered (name);
221      puts_filtered ("\n");
222    }
223  push_target (&sds_ops);	/* Switch to using remote target now */
224
225  just_started = 1;
226
227  /* Start the remote connection; if error (0), discard this target.
228     In particular, if the user quits, be sure to discard it (we'd be
229     in an inconsistent state otherwise).  */
230  if (!catch_errors (sds_start_remote, NULL,
231		     "Couldn't establish connection to remote target\n",
232		     RETURN_MASK_ALL))
233    pop_target ();
234}
235
236/* This takes a program previously attached to and detaches it.  After
237   this is done, GDB can be used to debug some other program.  We
238   better not have left any breakpoints in the target program or it'll
239   die when it hits one.  */
240
241static void
242sds_detach (char *args, int from_tty)
243{
244  char buf[PBUFSIZ];
245
246  if (args)
247    error ("Argument given to \"detach\" when remotely debugging.");
248
249#if 0
250  /* Tell the remote target to detach.  */
251  strcpy (buf, "D");
252  sds_send (buf, 1);
253#endif
254
255  pop_target ();
256  if (from_tty)
257    puts_filtered ("Ending remote debugging.\n");
258}
259
260/* Convert hex digit A to a number.  */
261
262static int
263fromhex (int a)
264{
265  if (a >= '0' && a <= '9')
266    return a - '0';
267  else if (a >= 'a' && a <= 'f')
268    return a - 'a' + 10;
269  else
270    error ("Reply contains invalid hex digit %d", a);
271}
272
273static int
274tob64 (unsigned char *inbuf, char *outbuf, int len)
275{
276  int i, sum;
277  char *p;
278
279  if (len % 3 != 0)
280    error ("bad length");
281
282  p = outbuf;
283  for (i = 0; i < len; i += 3)
284    {
285      /* Collect the next three bytes into a number.  */
286      sum = ((long) *inbuf++) << 16;
287      sum |= ((long) *inbuf++) << 8;
288      sum |= ((long) *inbuf++);
289
290      /* Spit out 4 6-bit encodings.  */
291      *p++ = ((sum >> 18) & 0x3f) + '0';
292      *p++ = ((sum >> 12) & 0x3f) + '0';
293      *p++ = ((sum >> 6) & 0x3f) + '0';
294      *p++ = (sum & 0x3f) + '0';
295    }
296  return (p - outbuf);
297}
298
299static int
300fromb64 (char *inbuf, char *outbuf, int len)
301{
302  int i, sum;
303
304  if (len % 4 != 0)
305    error ("bad length");
306
307  for (i = 0; i < len; i += 4)
308    {
309      /* Collect 4 6-bit digits.  */
310      sum = (*inbuf++ - '0') << 18;
311      sum |= (*inbuf++ - '0') << 12;
312      sum |= (*inbuf++ - '0') << 6;
313      sum |= (*inbuf++ - '0');
314
315      /* Now take the resulting 24-bit number and get three bytes out
316         of it.  */
317      *outbuf++ = (sum >> 16) & 0xff;
318      *outbuf++ = (sum >> 8) & 0xff;
319      *outbuf++ = sum & 0xff;
320    }
321
322  return (len / 4) * 3;
323}
324
325
326/* Tell the remote machine to resume.  */
327
328static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
329int last_sent_step;
330
331static void
332sds_resume (ptid_t ptid, int step, enum target_signal siggnal)
333{
334  unsigned char buf[PBUFSIZ];
335
336  last_sent_signal = siggnal;
337  last_sent_step = step;
338
339  buf[0] = (step ? 21 : 20);
340  buf[1] = 0;			/* (should be signal?) */
341
342  sds_send (buf, 2);
343}
344
345/* Send a message to target to halt it.  Target will respond, and send
346   us a message pending notice.  */
347
348static void
349sds_interrupt (int signo)
350{
351  unsigned char buf[PBUFSIZ];
352
353  /* If this doesn't work, try more severe steps.  */
354  signal (signo, sds_interrupt_twice);
355
356  if (remote_debug)
357    fprintf_unfiltered (gdb_stdlog, "sds_interrupt called\n");
358
359  buf[0] = 25;
360  sds_send (buf, 1);
361}
362
363static void (*ofunc) ();
364
365/* The user typed ^C twice.  */
366
367static void
368sds_interrupt_twice (int signo)
369{
370  signal (signo, ofunc);
371
372  interrupt_query ();
373
374  signal (signo, sds_interrupt);
375}
376
377/* Ask the user what to do when an interrupt is received.  */
378
379static void
380interrupt_query (void)
381{
382  target_terminal_ours ();
383
384  if (query ("Interrupted while waiting for the program.\n\
385Give up (and stop debugging it)? "))
386    {
387      target_mourn_inferior ();
388      throw_exception (RETURN_QUIT);
389    }
390
391  target_terminal_inferior ();
392}
393
394/* If nonzero, ignore the next kill.  */
395int kill_kludge;
396
397/* Wait until the remote machine stops, then return, storing status in
398   STATUS just as `wait' would.  Returns "pid" (though it's not clear
399   what, if anything, that means in the case of this target).  */
400
401static ptid_t
402sds_wait (ptid_t ptid, struct target_waitstatus *status)
403{
404  unsigned char buf[PBUFSIZ];
405  int retlen;
406
407  status->kind = TARGET_WAITKIND_EXITED;
408  status->value.integer = 0;
409
410  ofunc = (void (*)()) signal (SIGINT, sds_interrupt);
411
412  signal (SIGINT, ofunc);
413
414  if (just_started)
415    {
416      just_started = 0;
417      status->kind = TARGET_WAITKIND_STOPPED;
418      return inferior_ptid;
419    }
420
421  while (1)
422    {
423      getmessage (buf, 1);
424
425      if (message_pending)
426	{
427	  buf[0] = 26;
428	  retlen = sds_send (buf, 1);
429	  if (remote_debug)
430	    {
431	      fprintf_unfiltered (gdb_stdlog, "Signals: %02x%02x %02x %02x\n",
432				  buf[0], buf[1],
433				  buf[2], buf[3]);
434	    }
435	  message_pending = 0;
436	  status->kind = TARGET_WAITKIND_STOPPED;
437	  status->value.sig = TARGET_SIGNAL_TRAP;
438	  goto got_status;
439	}
440    }
441got_status:
442  return inferior_ptid;
443}
444
445static unsigned char sprs[16];
446
447/* Read the remote registers into the block REGS.  */
448/* Currently we just read all the registers, so we don't use regno.  */
449
450static void
451sds_fetch_registers (int regno)
452{
453  unsigned char buf[PBUFSIZ];
454  int i, retlen;
455  char *regs = alloca (deprecated_register_bytes ());
456
457  /* Unimplemented registers read as all bits zero.  */
458  memset (regs, 0, deprecated_register_bytes ());
459
460  buf[0] = 18;
461  buf[1] = 1;
462  buf[2] = 0;
463  retlen = sds_send (buf, 3);
464
465  for (i = 0; i < 4 * 6; ++i)
466    regs[i + 4 * 32 + 8 * 32] = buf[i];
467  for (i = 0; i < 4 * 4; ++i)
468    sprs[i] = buf[i + 4 * 7];
469
470  buf[0] = 18;
471  buf[1] = 2;
472  buf[2] = 0;
473  retlen = sds_send (buf, 3);
474
475  for (i = 0; i < retlen; i++)
476    regs[i] = buf[i];
477
478  /* (should warn about reply too short) */
479
480  for (i = 0; i < NUM_REGS; i++)
481    regcache_raw_supply (current_regcache, i,
482			 &regs[DEPRECATED_REGISTER_BYTE (i)]);
483}
484
485/* Prepare to store registers.  Since we may send them all, we have to
486   read out the ones we don't want to change first.  */
487
488static void
489sds_prepare_to_store (void)
490{
491  /* Make sure the entire registers array is valid.  */
492  deprecated_read_register_bytes (0, (char *) NULL, deprecated_register_bytes ());
493}
494
495/* Store register REGNO, or all registers if REGNO == -1, from the contents
496   of REGISTERS.  FIXME: ignores errors.  */
497
498static void
499sds_store_registers (int regno)
500{
501  unsigned char *p, buf[PBUFSIZ];
502  int i;
503
504  /* Store all the special-purpose registers.  */
505  p = buf;
506  *p++ = 19;
507  *p++ = 1;
508  *p++ = 0;
509  *p++ = 0;
510  for (i = 0; i < 4 * 6; i++)
511    *p++ = deprecated_registers[i + 4 * 32 + 8 * 32];
512  for (i = 0; i < 4 * 1; i++)
513    *p++ = 0;
514  for (i = 0; i < 4 * 4; i++)
515    *p++ = sprs[i];
516
517  sds_send (buf, p - buf);
518
519  /* Store all the general-purpose registers.  */
520  p = buf;
521  *p++ = 19;
522  *p++ = 2;
523  *p++ = 0;
524  *p++ = 0;
525  for (i = 0; i < 4 * 32; i++)
526    *p++ = deprecated_registers[i];
527
528  sds_send (buf, p - buf);
529
530}
531
532/* Write memory data directly to the remote machine.  This does not
533   inform the data cache; the data cache uses this.  MEMADDR is the
534   address in the remote memory space.  MYADDR is the address of the
535   buffer in our space.  LEN is the number of bytes.
536
537   Returns number of bytes transferred, or 0 for error.  */
538
539static int
540sds_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
541{
542  int max_buf_size;		/* Max size of packet output buffer */
543  int origlen;
544  unsigned char buf[PBUFSIZ];
545  int todo;
546  int i;
547
548  /* Chop the transfer down if necessary */
549
550  max_buf_size = 150;
551
552  origlen = len;
553  while (len > 0)
554    {
555      todo = min (len, max_buf_size);
556
557      buf[0] = 13;
558      buf[1] = 0;
559      buf[2] = (int) (memaddr >> 24) & 0xff;
560      buf[3] = (int) (memaddr >> 16) & 0xff;
561      buf[4] = (int) (memaddr >> 8) & 0xff;
562      buf[5] = (int) (memaddr) & 0xff;
563      buf[6] = 1;
564      buf[7] = 0;
565
566      for (i = 0; i < todo; i++)
567	buf[i + 8] = myaddr[i];
568
569      sds_send (buf, 8 + todo);
570
571      /* (should look at result) */
572
573      myaddr += todo;
574      memaddr += todo;
575      len -= todo;
576    }
577  return origlen;
578}
579
580/* Read memory data directly from the remote machine.  This does not
581   use the data cache; the data cache uses this.  MEMADDR is the
582   address in the remote memory space.  MYADDR is the address of the
583   buffer in our space.  LEN is the number of bytes.
584
585   Returns number of bytes transferred, or 0 for error.  */
586
587static int
588sds_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
589{
590  int max_buf_size;		/* Max size of packet output buffer */
591  int origlen, retlen;
592  unsigned char buf[PBUFSIZ];
593  int todo;
594  int i;
595
596  /* Chop the transfer down if necessary */
597
598  max_buf_size = 150;
599
600  origlen = len;
601  while (len > 0)
602    {
603      todo = min (len, max_buf_size);
604
605      buf[0] = 12;
606      buf[1] = 0;
607      buf[2] = (int) (memaddr >> 24) & 0xff;
608      buf[3] = (int) (memaddr >> 16) & 0xff;
609      buf[4] = (int) (memaddr >> 8) & 0xff;
610      buf[5] = (int) (memaddr) & 0xff;
611      buf[6] = (int) (todo >> 8) & 0xff;
612      buf[7] = (int) (todo) & 0xff;
613      buf[8] = 1;
614
615      retlen = sds_send (buf, 9);
616
617      if (retlen - 2 != todo)
618	{
619	  return 0;
620	}
621
622      /* Reply describes memory byte by byte. */
623
624      for (i = 0; i < todo; i++)
625	myaddr[i] = buf[i + 2];
626
627      myaddr += todo;
628      memaddr += todo;
629      len -= todo;
630    }
631
632  return origlen;
633}
634
635/* Read or write LEN bytes from inferior memory at MEMADDR,
636   transferring to or from debugger address MYADDR.  Write to inferior
637   if SHOULD_WRITE is nonzero.  Returns length of data written or
638   read; 0 for error.  TARGET is unused.  */
639
640static int
641sds_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int should_write,
642		 struct mem_attrib *attrib, struct target_ops *target)
643{
644  int res;
645
646  if (should_write)
647    res = sds_write_bytes (memaddr, myaddr, len);
648  else
649    res = sds_read_bytes (memaddr, myaddr, len);
650
651  return res;
652}
653
654
655static void
656sds_files_info (struct target_ops *ignore)
657{
658  puts_filtered ("Debugging over a serial connection, using SDS protocol.\n");
659}
660
661/* Stuff for dealing with the packets which are part of this protocol.
662   See comment at top of file for details.  */
663
664/* Read a single character from the remote end, masking it down to 7 bits. */
665
666static int
667readchar (int timeout)
668{
669  int ch;
670
671  ch = serial_readchar (sds_desc, timeout);
672
673  if (remote_debug > 1 && ch >= 0)
674    fprintf_unfiltered (gdb_stdlog, "%c(%x)", ch, ch);
675
676  switch (ch)
677    {
678    case SERIAL_EOF:
679      error ("Remote connection closed");
680    case SERIAL_ERROR:
681      perror_with_name ("Remote communication error");
682    case SERIAL_TIMEOUT:
683      return ch;
684    default:
685      return ch & 0x7f;
686    }
687}
688
689/* An SDS-style checksum is a sum of the bytes modulo 253.  (Presumably
690   because 253, 254, and 255 are special flags in the protocol.)  */
691
692static int
693compute_checksum (int csum, char *buf, int len)
694{
695  int i;
696
697  for (i = 0; i < len; ++i)
698    csum += (unsigned char) buf[i];
699
700  csum %= 253;
701  return csum;
702}
703
704/* Send the command in BUF to the remote machine, and read the reply
705   into BUF also.  */
706
707static int
708sds_send (unsigned char *buf, int len)
709{
710  putmessage (buf, len);
711
712  return getmessage (buf, 0);
713}
714
715/* Send a message to the remote machine.  */
716
717static int
718putmessage (unsigned char *buf, int len)
719{
720  int i, enclen;
721  unsigned char csum = 0;
722  char buf2[PBUFSIZ], buf3[PBUFSIZ];
723  unsigned char header[3];
724  char *p;
725
726  /* Copy the packet into buffer BUF2, encapsulating it
727     and giving it a checksum.  */
728
729  if (len > 170)		/* Prosanity check */
730    internal_error (__FILE__, __LINE__, "failed internal consistency check");
731
732  if (remote_debug)
733    {
734      fprintf_unfiltered (gdb_stdlog, "Message to send: \"");
735      for (i = 0; i < len; ++i)
736	fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]);
737      fprintf_unfiltered (gdb_stdlog, "\"\n");
738    }
739
740  p = buf2;
741  *p++ = '$';
742
743  if (len % 3 != 0)
744    {
745      buf[len] = '\0';
746      buf[len + 1] = '\0';
747    }
748
749  header[1] = next_msg_id;
750
751  header[2] = len;
752
753  csum = compute_checksum (csum, buf, len);
754  csum = compute_checksum (csum, header + 1, 2);
755
756  header[0] = csum;
757
758  tob64 (header, p, 3);
759  p += 4;
760  enclen = tob64 (buf, buf3, ((len + 2) / 3) * 3);
761
762  for (i = 0; i < enclen; ++i)
763    *p++ = buf3[i];
764  *p++ = '\r';
765  *p++ = '\n';
766
767  next_msg_id = (next_msg_id + 3) % 245;
768
769  /* Send it over and over until we get a positive ack.  */
770
771  while (1)
772    {
773      if (remote_debug)
774	{
775	  *p = '\0';
776	  fprintf_unfiltered (gdb_stdlog, "Sending encoded: \"%s\"", buf2);
777	  fprintf_unfiltered (gdb_stdlog,
778			      "  (Checksum %d, id %d, length %d)\n",
779			      header[0], header[1], header[2]);
780	  gdb_flush (gdb_stdlog);
781	}
782      if (serial_write (sds_desc, buf2, p - buf2))
783	perror_with_name ("putmessage: write failed");
784
785      return 1;
786    }
787}
788
789/* Come here after finding the start of the frame.  Collect the rest
790   into BUF.  Returns 0 on any error, 1 on success.  */
791
792static int
793read_frame (char *buf)
794{
795  char *bp;
796  int c;
797
798  bp = buf;
799
800  while (1)
801    {
802      c = readchar (sds_timeout);
803
804      switch (c)
805	{
806	case SERIAL_TIMEOUT:
807	  if (remote_debug)
808	    fputs_filtered ("Timeout in mid-message, retrying\n", gdb_stdlog);
809	  return 0;
810	case '$':
811	  if (remote_debug)
812	    fputs_filtered ("Saw new packet start in middle of old one\n",
813			    gdb_stdlog);
814	  return 0;		/* Start a new packet, count retries */
815	case '\r':
816	  break;
817
818	case '\n':
819	  {
820	    *bp = '\000';
821	    if (remote_debug)
822	      fprintf_unfiltered (gdb_stdlog, "Received encoded: \"%s\"\n",
823				  buf);
824	    return 1;
825	  }
826
827	default:
828	  if (bp < buf + PBUFSIZ - 1)
829	    {
830	      *bp++ = c;
831	      continue;
832	    }
833
834	  *bp = '\0';
835	  puts_filtered ("Message too long: ");
836	  puts_filtered (buf);
837	  puts_filtered ("\n");
838
839	  return 0;
840	}
841    }
842}
843
844/* Read a packet from the remote machine, with error checking,
845   and store it in BUF.  BUF is expected to be of size PBUFSIZ.
846   If FOREVER, wait forever rather than timing out; this is used
847   while the target is executing user code.  */
848
849static int
850getmessage (unsigned char *buf, int forever)
851{
852  int c, c2, c3;
853  int tries;
854  int timeout;
855  int val, i, len, csum;
856  unsigned char header[3];
857  unsigned char inbuf[500];
858
859  strcpy (buf, "timeout");
860
861  if (forever)
862    {
863      timeout = watchdog > 0 ? watchdog : -1;
864    }
865
866  else
867    timeout = sds_timeout;
868
869#define MAX_TRIES 3
870
871  for (tries = 1; tries <= MAX_TRIES; tries++)
872    {
873      /* This can loop forever if the remote side sends us characters
874         continuously, but if it pauses, we'll get a zero from readchar
875         because of timeout.  Then we'll count that as a retry.  */
876
877      /* Note that we will only wait forever prior to the start of a packet.
878         After that, we expect characters to arrive at a brisk pace.  They
879         should show up within sds_timeout intervals.  */
880
881      do
882	{
883	  c = readchar (timeout);
884
885	  if (c == SERIAL_TIMEOUT)
886	    {
887	      if (forever)	/* Watchdog went off.  Kill the target. */
888		{
889		  target_mourn_inferior ();
890		  error ("Watchdog has expired.  Target detached.\n");
891		}
892	      if (remote_debug)
893		fputs_filtered ("Timed out.\n", gdb_stdlog);
894	      goto retry;
895	    }
896	}
897      while (c != '$' && c != '{');
898
899      /* We might have seen a "trigraph", a sequence of three characters
900         that indicate various sorts of communication state.  */
901
902      if (c == '{')
903	{
904	  /* Read the other two chars of the trigraph. */
905	  c2 = readchar (timeout);
906	  c3 = readchar (timeout);
907	  if (remote_debug)
908	    fprintf_unfiltered (gdb_stdlog, "Trigraph %c%c%c received\n",
909				c, c2, c3);
910	  if (c3 == '+')
911	    {
912	      message_pending = 1;
913	      return 0;		/*???? */
914	    }
915	  continue;
916	}
917
918      val = read_frame (inbuf);
919
920      if (val == 1)
921	{
922	  fromb64 (inbuf, header, 4);
923	  /* (should check out other bits) */
924	  fromb64 (inbuf + 4, buf, strlen (inbuf) - 4);
925
926	  len = header[2];
927
928	  csum = 0;
929	  csum = compute_checksum (csum, buf, len);
930	  csum = compute_checksum (csum, header + 1, 2);
931
932	  if (csum != header[0])
933	    fprintf_unfiltered (gdb_stderr,
934			    "Checksum mismatch: computed %d, received %d\n",
935				csum, header[0]);
936
937	  if (header[2] == 0xff)
938	    fprintf_unfiltered (gdb_stderr, "Requesting resend...\n");
939
940	  if (remote_debug)
941	    {
942	      fprintf_unfiltered (gdb_stdlog,
943				"... (Got checksum %d, id %d, length %d)\n",
944				  header[0], header[1], header[2]);
945	      fprintf_unfiltered (gdb_stdlog, "Message received: \"");
946	      for (i = 0; i < len; ++i)
947		{
948		  fprintf_unfiltered (gdb_stdlog, "%02x", (unsigned char) buf[i]);
949		}
950	      fprintf_unfiltered (gdb_stdlog, "\"\n");
951	    }
952
953	  /* no ack required? */
954	  return len;
955	}
956
957      /* Try the whole thing again.  */
958    retry:
959      /* need to do something here */
960      ;
961    }
962
963  /* We have tried hard enough, and just can't receive the packet.  Give up. */
964
965  printf_unfiltered ("Ignoring packet error, continuing...\n");
966  return 0;
967}
968
969static void
970sds_kill (void)
971{
972  /* Don't try to do anything to the target.  */
973}
974
975static void
976sds_mourn (void)
977{
978  unpush_target (&sds_ops);
979  generic_mourn_inferior ();
980}
981
982static void
983sds_create_inferior (char *exec_file, char *args, char **env, int from_tty)
984{
985  inferior_ptid = pid_to_ptid (42000);
986
987  /* Clean up from the last time we were running.  */
988  clear_proceed_status ();
989
990  /* Let the remote process run.  */
991  proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
992}
993
994static void
995sds_load (char *filename, int from_tty)
996{
997  generic_load (filename, from_tty);
998
999  inferior_ptid = null_ptid;
1000}
1001
1002/* The SDS monitor has commands for breakpoint insertion, although it
1003   it doesn't actually manage the breakpoints, it just returns the
1004   replaced instruction back to the debugger.  */
1005
1006static int
1007sds_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
1008{
1009  int i, retlen;
1010  unsigned char *p, buf[PBUFSIZ];
1011
1012  p = buf;
1013  *p++ = 16;
1014  *p++ = 0;
1015  *p++ = (int) (addr >> 24) & 0xff;
1016  *p++ = (int) (addr >> 16) & 0xff;
1017  *p++ = (int) (addr >> 8) & 0xff;
1018  *p++ = (int) (addr) & 0xff;
1019
1020  retlen = sds_send (buf, p - buf);
1021
1022  for (i = 0; i < 4; ++i)
1023    contents_cache[i] = buf[i + 2];
1024
1025  return 0;
1026}
1027
1028static int
1029sds_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
1030{
1031  int i, retlen;
1032  unsigned char *p, buf[PBUFSIZ];
1033
1034  p = buf;
1035  *p++ = 17;
1036  *p++ = 0;
1037  *p++ = (int) (addr >> 24) & 0xff;
1038  *p++ = (int) (addr >> 16) & 0xff;
1039  *p++ = (int) (addr >> 8) & 0xff;
1040  *p++ = (int) (addr) & 0xff;
1041  for (i = 0; i < 4; ++i)
1042    *p++ = contents_cache[i];
1043
1044  retlen = sds_send (buf, p - buf);
1045
1046  return 0;
1047}
1048
1049static void
1050init_sds_ops (void)
1051{
1052  sds_ops.to_shortname = "sds";
1053  sds_ops.to_longname = "Remote serial target with SDS protocol";
1054  sds_ops.to_doc = "Use a remote computer via a serial line; using the SDS protocol.\n\
1055Specify the serial device it is connected to (e.g. /dev/ttya).";
1056  sds_ops.to_open = sds_open;
1057  sds_ops.to_close = sds_close;
1058  sds_ops.to_detach = sds_detach;
1059  sds_ops.to_resume = sds_resume;
1060  sds_ops.to_wait = sds_wait;
1061  sds_ops.to_fetch_registers = sds_fetch_registers;
1062  sds_ops.to_store_registers = sds_store_registers;
1063  sds_ops.to_prepare_to_store = sds_prepare_to_store;
1064  sds_ops.deprecated_xfer_memory = sds_xfer_memory;
1065  sds_ops.to_files_info = sds_files_info;
1066  sds_ops.to_insert_breakpoint = sds_insert_breakpoint;
1067  sds_ops.to_remove_breakpoint = sds_remove_breakpoint;
1068  sds_ops.to_kill = sds_kill;
1069  sds_ops.to_load = sds_load;
1070  sds_ops.to_create_inferior = sds_create_inferior;
1071  sds_ops.to_mourn_inferior = sds_mourn;
1072  sds_ops.to_stratum = process_stratum;
1073  sds_ops.to_has_all_memory = 1;
1074  sds_ops.to_has_memory = 1;
1075  sds_ops.to_has_stack = 1;
1076  sds_ops.to_has_registers = 1;
1077  sds_ops.to_has_execution = 1;
1078  sds_ops.to_magic = OPS_MAGIC;
1079}
1080
1081/* Put a command string, in args, out to the monitor and display the
1082   reply message.  */
1083
1084static void
1085sds_command (char *args, int from_tty)
1086{
1087  char *p;
1088  int i, len, retlen;
1089  unsigned char buf[1000];
1090
1091  /* Convert hexadecimal chars into a byte buffer.  */
1092  p = args;
1093  len = 0;
1094  while (*p != '\0')
1095    {
1096      buf[len++] = fromhex (p[0]) * 16 + fromhex (p[1]);
1097      if (p[1] == '\0')
1098	break;
1099      p += 2;
1100    }
1101
1102  retlen = sds_send (buf, len);
1103
1104  printf_filtered ("Reply is ");
1105  for (i = 0; i < retlen; ++i)
1106    {
1107      printf_filtered ("%02x", buf[i]);
1108    }
1109  printf_filtered ("\n");
1110}
1111
1112void
1113_initialize_remote_sds (void)
1114{
1115  init_sds_ops ();
1116  add_target (&sds_ops);
1117
1118  deprecated_add_show_from_set
1119    (add_set_cmd ("sdstimeout", no_class,
1120		  var_integer, (char *) &sds_timeout,
1121		  "Set timeout value for sds read.\n", &setlist),
1122     &showlist);
1123
1124  add_com ("sds", class_obscure, sds_command,
1125	   "Send a command to the SDS monitor.");
1126}
1127