xref: /openbsd/gnu/usr.bin/binutils/gdb/remote-sds.c (revision 3cab2bb3)
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 
46 extern void _initialize_remote_sds (void);
47 
48 /* Declarations of local functions. */
49 
50 static int sds_write_bytes (CORE_ADDR, char *, int);
51 
52 static int sds_read_bytes (CORE_ADDR, char *, int);
53 
54 static void sds_files_info (struct target_ops *ignore);
55 
56 static int sds_xfer_memory (CORE_ADDR, char *, int, int,
57 			    struct mem_attrib *, struct target_ops *);
58 
59 static void sds_prepare_to_store (void);
60 
61 static void sds_fetch_registers (int);
62 
63 static void sds_resume (ptid_t, int, enum target_signal);
64 
65 static int sds_start_remote (void *);
66 
67 static void sds_open (char *, int);
68 
69 static void sds_close (int);
70 
71 static void sds_store_registers (int);
72 
73 static void sds_mourn (void);
74 
75 static void sds_load (char *, int);
76 
77 static int getmessage (unsigned char *, int);
78 
79 static int putmessage (unsigned char *, int);
80 
81 static int sds_send (unsigned char *, int);
82 
83 static int readchar (int);
84 
85 static ptid_t sds_wait (ptid_t, struct target_waitstatus *);
86 
87 static void sds_kill (void);
88 
89 static int fromhex (int);
90 
91 static void sds_detach (char *, int);
92 
93 static void sds_interrupt (int);
94 
95 static void sds_interrupt_twice (int);
96 
97 static void interrupt_query (void);
98 
99 static int read_frame (char *);
100 
101 static int sds_insert_breakpoint (CORE_ADDR, char *);
102 
103 static int sds_remove_breakpoint (CORE_ADDR, char *);
104 
105 static void init_sds_ops (void);
106 
107 static void sds_command (char *args, int from_tty);
108 
109 /* Define the target operations vector. */
110 
111 static 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 
118 static 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 
124 static 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 
134 static int next_msg_id;
135 
136 static int just_started;
137 
138 static int message_pending;
139 
140 
141 /* Clean up connection to a remote debugger.  */
142 
143 static void
144 sds_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 
153 static int
154 sds_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 
186 static void
187 sds_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\
191 device 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 
241 static void
242 sds_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 
262 static int
263 fromhex (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 
273 static int
274 tob64 (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 
299 static int
300 fromb64 (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 
328 static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
329 int last_sent_step;
330 
331 static void
332 sds_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 
348 static void
349 sds_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 
363 static void (*ofunc) ();
364 
365 /* The user typed ^C twice.  */
366 
367 static void
368 sds_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 
379 static void
380 interrupt_query (void)
381 {
382   target_terminal_ours ();
383 
384   if (query ("Interrupted while waiting for the program.\n\
385 Give 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.  */
395 int 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 
401 static ptid_t
402 sds_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     }
441 got_status:
442   return inferior_ptid;
443 }
444 
445 static 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 
450 static void
451 sds_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 
488 static void
489 sds_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 
498 static void
499 sds_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 
539 static int
540 sds_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 
587 static int
588 sds_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 
640 static int
641 sds_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 
655 static void
656 sds_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 
666 static int
667 readchar (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 
692 static int
693 compute_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 
707 static int
708 sds_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 
717 static int
718 putmessage (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 
792 static int
793 read_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 
849 static int
850 getmessage (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 
969 static void
970 sds_kill (void)
971 {
972   /* Don't try to do anything to the target.  */
973 }
974 
975 static void
976 sds_mourn (void)
977 {
978   unpush_target (&sds_ops);
979   generic_mourn_inferior ();
980 }
981 
982 static void
983 sds_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 
994 static void
995 sds_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 
1006 static int
1007 sds_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 
1028 static int
1029 sds_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 
1049 static void
1050 init_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\
1055 Specify 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 
1084 static void
1085 sds_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 
1112 void
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