* remote-bug.c: At the start of each section, reset srec_frame
[platform/upstream/binutils.git] / gdb / remote-bug.c
1 /* Remote debugging interface for Motorola's MVME187BUG monitor, an embedded
2    monitor for the m88k.
3
4    Copyright 1992, 1993 Free Software Foundation, Inc.
5    Contributed by Cygnus Support.  Written by K. Richard Pixley.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
22
23 #include "defs.h"
24 #include "inferior.h"
25 #include "wait.h"
26
27 #include <string.h>
28 #include <ctype.h>
29 #include <fcntl.h>
30 #include <signal.h>
31 #include <setjmp.h>
32 #include <errno.h>
33
34 #include "terminal.h"
35 #include "gdbcore.h"
36 #include "gdbcmd.h"
37
38 #include "remote-utils.h"
39
40 extern int sleep();
41
42 /* External data declarations */
43 extern int stop_soon_quietly;   /* for wait_for_inferior */
44
45 /* Forward data declarations */
46 extern struct target_ops bug_ops;       /* Forward declaration */
47
48 /* Forward function declarations */
49 static int bug_clear_breakpoints PARAMS((void));
50
51 static int bug_read_memory PARAMS((CORE_ADDR memaddr,
52                                             unsigned char *myaddr,
53                                             int len));
54
55 static int bug_write_memory PARAMS((CORE_ADDR memaddr,
56                                              unsigned char *myaddr,
57                                              int len));
58
59 /* This variable is somewhat arbitrary.  It's here so that it can be
60    set from within a running gdb.  */
61
62 static int srec_max_retries = 3;
63
64 /* Each S-record download to the target consists of an S0 header
65    record, some number of S3 data records, and one S7 termination
66    record.  I call this download a "frame".  Srec_frame says how many
67    bytes will be represented in each frame.  */
68
69 #define SREC_SIZE 160
70 static int srec_frame = SREC_SIZE;
71
72 /* This variable determines how many bytes will be represented in each
73    S3 s-record.  */
74
75 static int srec_bytes = 40;
76
77 /* At one point it appeared to me as though the bug monitor could not
78    really be expected to receive two sequential characters at 9600
79    baud reliably.  Echo-pacing is an attempt to force data across the
80    line even in this condition.  Specifically, in echo-pace mode, each
81    character is sent one at a time and we look for the echo before
82    sending the next.  This is excruciatingly slow.  */
83
84 static int srec_echo_pace = 0;
85
86 /* How long to wait after an srec for a possible error message.
87    Similar to the above, I tried sleeping after sending each S3 record
88    in hopes that I might actually see error messages from the bug
89    monitor.  This might actually work if we were to use sleep
90    intervals smaller than 1 second.  */
91
92 static int srec_sleep = 0;
93
94 /* Every srec_noise records, flub the checksum.  This is a debugging
95    feature.  Set the variable to something other than 1 in order to
96    inject *deliberate* checksum errors.  One might do this if one
97    wanted to test error handling and recovery.  */
98
99 static int srec_noise = 0;
100
101 /* Called when SIGALRM signal sent due to alarm() timeout.  */
102
103 /* Number of SIGTRAPs we need to simulate.  That is, the next
104    NEED_ARTIFICIAL_TRAP calls to bug_wait should just return
105    SIGTRAP without actually waiting for anything.  */
106
107 static int need_artificial_trap = 0;
108
109 /*
110  * Download a file specified in 'args', to the bug.
111  */
112
113 static void
114 bug_load (args, fromtty)
115      char *args;
116      int fromtty;
117 {
118   bfd *abfd;
119   asection *s;
120   char buffer[1024];
121
122   sr_check_open ();
123
124   dcache_flush (gr_get_dcache());
125   inferior_pid = 0;
126   abfd = bfd_openr (args, 0);
127   if (!abfd)
128     {
129       printf_filtered ("Unable to open file %s\n", args);
130       return;
131     }
132
133   if (bfd_check_format (abfd, bfd_object) == 0)
134     {
135       printf_filtered ("File is not an object file\n");
136       return;
137     }
138
139   s = abfd->sections;
140   while (s != (asection *) NULL)
141     {
142       srec_frame = SREC_SIZE;
143       if (s->flags & SEC_LOAD)
144         {
145           int i;
146
147           char *buffer = xmalloc (srec_frame);
148
149           printf_filtered ("%s\t: 0x%4x .. 0x%4x  ", s->name, s->vma, s->vma + s->_raw_size);
150           fflush (stdout);
151           for (i = 0; i < s->_raw_size; i += srec_frame)
152             {
153               if (srec_frame > s->_raw_size - i)
154                 srec_frame = s->_raw_size - i;
155
156               bfd_get_section_contents (abfd, s, buffer, i, srec_frame);
157               bug_write_memory (s->vma + i, buffer, srec_frame);
158               printf_filtered ("*");
159               fflush (stdout);
160             }
161           printf_filtered ("\n");
162           free (buffer);
163         }
164       s = s->next;
165     }
166   sprintf (buffer, "rs ip %lx", (unsigned long) abfd->start_address);
167   sr_write_cr (buffer);
168   gr_expect_prompt ();
169 }
170
171 #if 0
172 static char *
173 get_word (p)
174      char **p;
175 {
176   char *s = *p;
177   char *word;
178   char *copy;
179   size_t len;
180
181   while (isspace (*s))
182     s++;
183
184   word = s;
185
186   len = 0;
187
188   while (*s && !isspace (*s))
189     {
190       s++;
191       len++;
192
193     }
194   copy = xmalloc (len + 1);
195   memcpy (copy, word, len);
196   copy[len] = 0;
197   *p = s;
198   return copy;
199 }
200 #endif
201
202 static struct gr_settings bug_settings = {
203   NULL, /* dcache */
204   "Bug>", /* prompt */
205   &bug_ops, /* ops */
206   bug_clear_breakpoints, /* clear_all_breakpoints */
207   bug_read_memory, /* readfunc */
208   bug_write_memory, /* writefunc */
209   gr_generic_checkin, /* checkin */
210 };
211
212 static char *cpu_check_strings[] = {
213   "=",
214   "Invalid Register",
215 };
216
217 static void
218 bug_open (args, from_tty)
219      char *args;
220      int from_tty;
221 {
222   if (args == NULL)
223       args = "";
224
225   gr_open(args, from_tty, &bug_settings);
226   /* decide *now* whether we are on an 88100 or an 88110 */
227   sr_write_cr("rs cr06");
228   sr_expect("rs cr06");
229
230   switch (gr_multi_scan(cpu_check_strings, 0))
231     {
232     case 0: /* this is an m88100 */
233       target_is_m88110 = 0;
234       break;
235     case 1: /* this is an m88110 */
236       target_is_m88110 = 1;
237       break;
238     default:
239       abort();
240     }
241 }
242
243 /* Tell the remote machine to resume.  */
244
245 void
246 bug_resume (pid, step, sig)
247      int pid, step;
248      enum target_signal sig;
249 {
250   dcache_flush (gr_get_dcache());
251
252   if (step)
253     {
254       sr_write_cr("t");
255
256       /* Force the next bug_wait to return a trap.  Not doing anything
257        about I/O from the target means that the user has to type
258        "continue" to see any.  FIXME, this should be fixed.  */
259       need_artificial_trap = 1;
260     }
261   else
262       sr_write_cr ("g");
263
264   return;
265 }
266
267 /* Wait until the remote machine stops, then return,
268    storing status in STATUS just as `wait' would.  */
269
270 static char *wait_strings[] = {
271   "At Breakpoint",
272   "Exception: Data Access Fault (Local Bus Timeout)",
273   "\r8???-Bug>",
274   "\r197-Bug>",
275   NULL,
276 };
277
278 int
279 bug_wait (pid, status)
280      int pid;
281      struct target_waitstatus *status;
282 {
283   int old_timeout = sr_get_timeout();
284   int old_immediate_quit = immediate_quit;
285
286   status->kind = TARGET_WAITKIND_EXITED;
287   status->value.integer = 0;
288
289   /* read off leftovers from resume so that the rest can be passed
290      back out as stdout.  */
291   if (need_artificial_trap == 0)
292     {
293       sr_expect("Effective address: ");
294       (void) sr_get_hex_word();
295       sr_expect ("\r\n");
296     }
297
298   sr_set_timeout(-1); /* Don't time out -- user program is running. */
299   immediate_quit = 1; /* Helps ability to QUIT */
300
301   switch (gr_multi_scan(wait_strings, need_artificial_trap == 0))
302     {
303     case 0: /* breakpoint case */
304       status->kind = TARGET_WAITKIND_STOPPED;
305       status->value.sig = TARGET_SIGNAL_TRAP;
306       /* user output from the target can be discarded here. (?) */
307       gr_expect_prompt();
308       break;
309
310     case 1: /* bus error */
311       status->kind = TARGET_WAITKIND_STOPPED;
312       status->value.sig = TARGET_SIGNAL_BUS;
313       /* user output from the target can be discarded here. (?) */
314       gr_expect_prompt();
315       break;
316
317     case 2: /* normal case */
318     case 3:
319       if (need_artificial_trap != 0)
320         {
321           /* stepping */
322           status->kind = TARGET_WAITKIND_STOPPED;
323           status->value.sig = TARGET_SIGNAL_TRAP;
324           need_artificial_trap--;
325           break;
326         }
327       else
328         {
329           /* exit case */
330           status->kind = TARGET_WAITKIND_EXITED;
331           status->value.integer = 0;
332           break;
333         }
334
335     case -1: /* trouble */
336     default:
337       fprintf_filtered (stderr,
338                         "Trouble reading target during wait\n");
339       break;
340     }
341
342   sr_set_timeout(old_timeout);
343   immediate_quit = old_immediate_quit;
344   return 0;
345 }
346
347 /* Return the name of register number REGNO
348    in the form input and output by bug.
349
350    Returns a pointer to a static buffer containing the answer.  */
351 static char *
352 get_reg_name (regno)
353      int regno;
354 {
355   static char *rn[] = {
356     "r00", "r01", "r02", "r03", "r04", "r05", "r06", "r07",
357     "r08", "r09", "r10", "r11", "r12", "r13", "r14", "r15",
358     "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
359     "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
360
361     /* these get confusing because we omit a few and switch some ordering around. */
362
363     "cr01",  /* 32 = psr */
364     "fcr62", /* 33 = fpsr*/
365     "fcr63", /* 34 = fpcr */
366     "ip",                       /* this is something of a cheat. */
367   /* 35 = sxip */
368     "cr05", /* 36 = snip */
369     "cr06", /* 37 = sfip */
370
371     "x00", "x01", "x02", "x03", "x04", "x05", "x06", "x07",
372     "x08", "x09", "x10", "x11", "x12", "x13", "x14", "x15",
373     "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
374     "x24", "x25", "x26", "x27", "x28", "x29", "x30", "x31",
375   };
376
377   return rn[regno];
378 }
379
380 #if 0 /* not currently used */
381 /* Read from remote while the input matches STRING.  Return zero on
382    success, -1 on failure.  */
383
384 static int
385 bug_scan (s)
386      char *s;
387 {
388   int c;
389
390   while (*s)
391     {
392       c = sr_readchar();
393       if (c != *s++)
394         {
395           fflush(stdout);
396           printf("\nNext character is '%c' - %d and s is \"%s\".\n", c, c, --s);
397           return(-1);
398         }
399     }
400
401   return(0);
402 }
403 #endif /* never */
404
405 static int
406 bug_srec_write_cr (s)
407      char *s;
408 {
409   char *p = s;
410
411   if (srec_echo_pace)
412     for (p = s; *p; ++p)
413       {
414         if (sr_get_debug() > 0)
415           printf ("%c", *p);
416
417         do
418           SERIAL_WRITE(sr_get_desc(), p, 1);
419         while (sr_pollchar() != *p);
420       }
421   else
422     {  
423       sr_write_cr (s);
424 /*       return(bug_scan (s) || bug_scan ("\n")); */
425     }
426
427   return(0);
428 }
429
430 /* Store register REGNO, or all if REGNO == -1. */
431
432 static void
433 bug_fetch_register(regno)
434      int regno;
435 {
436   sr_check_open();
437
438   if (regno == -1)
439     {
440       int i;
441
442       for (i = 0; i < NUM_REGS; ++i)
443         bug_fetch_register(i);
444     }
445   else if (target_is_m88110 && regno == SFIP_REGNUM)
446     {
447       /* m88110 has no sfip. */
448       long l = 0;
449       supply_register(regno, (char *) &l);
450     }
451   else if (regno < XFP_REGNUM)
452     {
453       char buffer[MAX_REGISTER_RAW_SIZE];
454
455       sr_write ("rs ", 3);
456       sr_write_cr (get_reg_name(regno));
457       sr_expect ("=");
458       store_unsigned_integer (buffer, REGISTER_RAW_SIZE (regno),
459                               sr_get_hex_word());
460       gr_expect_prompt ();
461       supply_register (regno, buffer);
462     }
463   else
464     {
465       /* Float register so we need to parse a strange data format. */
466       long p;
467       unsigned char value[10];
468
469       sr_write("rs ", 3);
470       sr_write(get_reg_name(regno), strlen(get_reg_name(regno)));
471       sr_write_cr(";d");
472       sr_expect("rs");
473       sr_expect(get_reg_name(regno));
474       sr_expect(";d");
475       sr_expect("=");
476
477       /* sign */
478       p = sr_get_hex_digit(1);
479       value[0] = p << 7;
480
481       /* exponent */
482       sr_expect("_");
483       p = sr_get_hex_digit(1);
484       value[0] += (p << 4);
485       value[0] += sr_get_hex_digit(1);
486
487       value[1] = sr_get_hex_digit(1) << 4;
488
489       /* fraction */
490       sr_expect("_");
491       value[1] += sr_get_hex_digit(1);
492
493       value[2] = (sr_get_hex_digit(1) << 4) + sr_get_hex_digit(1);
494       value[3] = (sr_get_hex_digit(1) << 4) + sr_get_hex_digit(1);
495       value[4] = (sr_get_hex_digit(1) << 4) + sr_get_hex_digit(1);
496       value[5] = (sr_get_hex_digit(1) << 4) + sr_get_hex_digit(1);
497       value[6] = (sr_get_hex_digit(1) << 4) + sr_get_hex_digit(1);
498       value[7] = (sr_get_hex_digit(1) << 4) + sr_get_hex_digit(1);
499       value[8] = 0;
500       value[9] = 0;
501
502       gr_expect_prompt();
503       supply_register(regno, value);
504     }
505
506   return;
507 }
508
509 /* Store register REGNO, or all if REGNO == -1. */
510
511 static void
512 bug_store_register (regno)
513      int regno;
514 {
515   char buffer[1024];
516   sr_check_open();
517
518   if (regno == -1)
519     {
520       int i;
521
522       for (i = 0; i < NUM_REGS; ++i)
523         bug_store_register(i);
524     }
525   else
526     {
527       char *regname;
528
529       regname = get_reg_name(regno);
530
531       if (target_is_m88110 && regno == SFIP_REGNUM)
532         return;
533       else if (regno < XFP_REGNUM)
534         sprintf(buffer, "rs %s %08x",
535                 regname,
536                 read_register(regno));
537       else
538         {
539           unsigned char *value = &registers[REGISTER_BYTE(regno)];
540           
541           sprintf(buffer, "rs %s %1x_%02x%1x_%1x%02x%02x%02x%02x%02x%02x;d",
542                   regname,
543                   /* sign */
544                   (value[0] >> 7) & 0xf,
545                   /* exponent */
546                   value[0] & 0x7f,
547                   (value[1] >> 8) & 0xf,
548                   /* fraction */
549                   value[1] & 0xf,
550                   value[2],
551                   value[3],
552                   value[4],
553                   value[5],
554                   value[6],
555                   value[7]);
556         }
557
558       sr_write_cr(buffer);
559       gr_expect_prompt();
560     }
561
562   return;
563 }
564
565 int
566 bug_xfer_memory (memaddr, myaddr, len, write, target)
567      CORE_ADDR memaddr;
568      char *myaddr;
569      int len;
570      int write;
571      struct target_ops *target; /* ignored */
572 {
573   register int i;
574
575   /* Round starting address down to longword boundary.  */
576   register CORE_ADDR addr;
577
578   /* Round ending address up; get number of longwords that makes.  */
579   register int count;
580
581   /* Allocate buffer of that many longwords.  */
582   register int *buffer;
583
584   addr = memaddr & -sizeof (int);
585   count = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
586
587   buffer = (int *) alloca (count * sizeof (int));
588
589   if (write)
590     {
591       /* Fill start and end extra bytes of buffer with existing memory data.  */
592
593       if (addr != memaddr || len < (int) sizeof (int))
594         {
595           /* Need part of initial word -- fetch it.  */
596           buffer[0] = gr_fetch_word (addr);
597         }
598
599       if (count > 1)            /* FIXME, avoid if even boundary */
600         {
601           buffer[count - 1]
602             = gr_fetch_word (addr + (count - 1) * sizeof (int));
603         }
604
605       /* Copy data to be written over corresponding part of buffer */
606
607       memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
608
609       /* Write the entire buffer.  */
610
611       for (i = 0; i < count; i++, addr += sizeof (int))
612         {
613           errno = 0;
614           gr_store_word (addr, buffer[i]);
615           if (errno)
616             {
617
618               return 0;
619             }
620
621         }
622     }
623   else
624     {
625       /* Read all the longwords */
626       for (i = 0; i < count; i++, addr += sizeof (int))
627         {
628           errno = 0;
629           buffer[i] = gr_fetch_word (addr);
630           if (errno)
631             {
632               return 0;
633             }
634           QUIT;
635         }
636
637       /* Copy appropriate bytes out of the buffer.  */
638       memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
639     }
640
641   return len;
642 }
643
644 static void
645 start_load()
646 {
647   char *command;
648
649   command = (srec_echo_pace ? "lo 0 ;x" : "lo 0");
650
651   sr_write_cr (command);
652   sr_expect (command);
653   sr_expect ("\r\n");
654   bug_srec_write_cr ("S0030000FC");
655   return;
656 }
657
658 /* This is an extremely vulnerable and fragile function.  I've made
659    considerable attempts to make this deterministic, but I've
660    certainly forgotten something.  The trouble is that S-records are
661    only a partial file format, not a protocol.  Worse, apparently the
662    m88k bug monitor does not run in real time while receiving
663    S-records.  Hence, we must pay excruciating attention to when and
664    where error messages are returned, and what has actually been sent.
665
666    Each call represents a chunk of memory to be sent to the target.
667    We break that chunk into an S0 header record, some number of S3
668    data records each containing srec_bytes, and an S7 termination
669    record.  */
670
671 static char *srecord_strings[] = {
672   "S-RECORD",
673   "-Bug>",
674   NULL,
675 };
676
677 static int
678 bug_write_memory (memaddr, myaddr, len)
679      CORE_ADDR memaddr;
680      unsigned char *myaddr;
681      int len;
682 {
683   int done;
684   int checksum;
685   int x;
686   int retries;
687   char buffer[(srec_bytes + 8) << 1];
688
689   retries = 0;
690
691   do
692     {
693       done = 0;
694
695       if (retries > srec_max_retries)
696         return(-1);
697
698       if (retries > 0)
699         {
700           if (sr_get_debug() > 0)
701             printf("\n<retrying...>\n");
702
703           /* This gr_expect_prompt call is extremely important.  Without
704              it, we will tend to resend our packet so fast that it
705              will arrive before the bug monitor is ready to receive
706              it.  This would lead to a very ugly resend loop.  */
707
708           gr_expect_prompt();
709         }
710
711       start_load();
712
713       while (done < len)
714         {
715           int thisgo;
716           int idx;
717           char *buf = buffer;
718           CORE_ADDR address;
719
720           checksum = 0;
721           thisgo = len - done;
722           if (thisgo > srec_bytes)
723             thisgo = srec_bytes;
724
725           address = memaddr + done;
726           sprintf (buf, "S3%02X%08X", thisgo + 4 + 1, address);
727           buf += 12;
728
729           checksum += (thisgo + 4 + 1
730                        + (address & 0xff)
731                        + ((address >>  8) & 0xff)
732                        + ((address >> 16) & 0xff)
733                        + ((address >> 24) & 0xff));
734
735           for (idx = 0; idx < thisgo; idx++)
736             {
737               sprintf (buf, "%02X", myaddr[idx + done]);
738               checksum += myaddr[idx + done];
739               buf += 2;
740             }
741
742           if (srec_noise > 0)
743             {
744               /* FIXME-NOW: insert a deliberate error every now and then.
745                  This is intended for testing/debugging the error handling
746                  stuff.  */
747               static int counter = 0;
748               if (++counter > srec_noise)
749                 {
750                   counter = 0;
751                   ++checksum;
752                 }
753             }
754
755           sprintf(buf, "%02X", ~checksum & 0xff);
756           bug_srec_write_cr (buffer);
757
758           if (srec_sleep != 0)
759             sleep(srec_sleep);
760
761           /* This pollchar is probably redundant to the gr_multi_scan
762              below.  Trouble is, we can't be sure when or where an
763              error message will appear.  Apparently, when running at
764              full speed from a typical sun4, error messages tend to
765              appear to arrive only *after* the s7 record.   */
766
767           if ((x = sr_pollchar()) != 0)
768             {
769               if (sr_get_debug() > 0)
770                 printf("\n<retrying...>\n");
771
772               ++retries;
773
774               /* flush any remaining input and verify that we are back
775                  at the prompt level. */
776               gr_expect_prompt();
777               /* start all over again. */
778               start_load();
779               done = 0;
780               continue;
781             }
782
783           done += thisgo;
784         }
785
786       bug_srec_write_cr("S7060000000000F9");
787       ++retries;
788
789       /* Having finished the load, we need to figure out whether we
790          had any errors.  */
791     } while (gr_multi_scan(srecord_strings, 0) == 0);;
792
793   return(0);
794 }
795
796 /* Copy LEN bytes of data from debugger memory at MYADDR
797    to inferior's memory at MEMADDR.  Returns errno value.
798  * sb/sh instructions don't work on unaligned addresses, when TU=1.
799  */
800
801 /* Read LEN bytes from inferior memory at MEMADDR.  Put the result
802    at debugger address MYADDR.  Returns errno value.  */
803 static int
804 bug_read_memory (memaddr, myaddr, len)
805      CORE_ADDR memaddr;
806      unsigned char *myaddr;
807      int len;
808 {
809   char request[100];
810   char *buffer;
811   char *p;
812   char type;
813   char size;
814   unsigned char c;
815   unsigned int inaddr;
816   unsigned int checksum;
817
818   sprintf(request, "du 0 %x:&%d", memaddr, len);
819   sr_write_cr(request);
820
821   p = buffer = alloca(len);
822
823   /* scan up through the header */
824   sr_expect("S0030000FC");
825
826   while (p < buffer + len)
827     {
828       /* scan off any white space. */
829       while (sr_readchar() != 'S') ;;
830
831       /* what kind of s-rec? */
832       type = sr_readchar();
833
834       /* scan record size */
835       sr_get_hex_byte(&size);
836       checksum = size;
837       --size;
838       inaddr = 0;
839
840       switch (type)
841         {
842         case '7':
843         case '8':
844         case '9':
845           goto done;
846
847         case '3':
848           sr_get_hex_byte(&c);
849           inaddr = (inaddr << 8) + c;
850           checksum += c;
851           --size;
852           /* intentional fall through */
853         case '2':
854           sr_get_hex_byte(&c);
855           inaddr = (inaddr << 8) + c;
856           checksum += c;
857           --size;
858           /* intentional fall through */
859         case '1':
860           sr_get_hex_byte(&c);
861           inaddr = (inaddr << 8) + c;
862           checksum += c;
863           --size;
864           sr_get_hex_byte(&c);
865           inaddr = (inaddr << 8) + c;
866           checksum += c;
867           --size;
868           break;
869
870         default:
871           /* bonk */
872           error("reading s-records.");
873         }
874
875       if (inaddr < memaddr
876           || (memaddr + len) < (inaddr + size))
877         error("srec out of memory range.");
878
879       if (p != buffer + inaddr - memaddr)
880         error("srec out of sequence.");
881
882       for (; size; --size, ++p)
883         {
884           sr_get_hex_byte(p);
885           checksum += *p;
886         }
887
888       sr_get_hex_byte(&c);
889       if (c != (~checksum & 0xff))
890         error("bad s-rec checksum");
891     }
892
893  done:
894   gr_expect_prompt();
895   if (p != buffer + len)
896     return(1);
897
898   memcpy(myaddr, buffer, len);
899   return(0);
900 }
901
902 #define MAX_BREAKS      16
903 static int num_brkpts = 0;
904 static int
905 bug_insert_breakpoint (addr, save)
906      CORE_ADDR addr;
907      char *save;                /* Throw away, let bug save instructions */
908 {
909   sr_check_open ();
910
911   if (num_brkpts < MAX_BREAKS)
912     {
913       char buffer[100];
914
915       num_brkpts++;
916       sprintf (buffer, "br %x", addr);
917       sr_write_cr (buffer);
918       gr_expect_prompt ();
919       return(0);
920     }
921   else
922     {
923       fprintf_filtered (stderr,
924                       "Too many break points, break point not installed\n");
925       return(1);
926     }
927
928 }
929 static int
930 bug_remove_breakpoint (addr, save)
931      CORE_ADDR addr;
932      char *save;                /* Throw away, let bug save instructions */
933 {
934   if (num_brkpts > 0)
935     {
936       char buffer[100];
937
938       num_brkpts--;
939       sprintf (buffer, "nobr %x", addr);
940       sr_write_cr (buffer);
941       gr_expect_prompt ();
942
943     }
944   return (0);
945 }
946
947 /* Clear the bugs notion of what the break points are */
948 static int
949 bug_clear_breakpoints ()
950 {
951
952   if (sr_is_open())
953     {
954       sr_write_cr ("nobr");
955       sr_expect("nobr");
956       gr_expect_prompt ();
957     }
958   num_brkpts = 0;
959   return(0);
960 }
961
962 struct target_ops bug_ops =
963 {
964   "bug", "Remote BUG monitor",
965   "Use the mvme187 board running the BUG monitor connected\n\
966 by a serial line.",
967
968   bug_open, gr_close,
969   0, gr_detach, bug_resume, bug_wait,   /* attach */
970   bug_fetch_register, bug_store_register,
971   gr_prepare_to_store,
972   bug_xfer_memory,
973   gr_files_info,
974   bug_insert_breakpoint, bug_remove_breakpoint, /* Breakpoints */
975   0, 0, 0, 0, 0,                /* Terminal handling */
976   gr_kill,                      /* FIXME, kill */
977   bug_load,
978   0,                            /* lookup_symbol */
979   gr_create_inferior,           /* create_inferior */
980   gr_mourn,                     /* mourn_inferior FIXME */
981   0,                            /* can_run */
982   0,                            /* notice_signals */
983   process_stratum, 0,           /* next */
984   1, 1, 1, 1, 1,                /* all mem, mem, stack, regs, exec */
985   0, 0,                         /* Section pointers */
986   OPS_MAGIC,                    /* Always the last thing */
987 };
988
989 void
990 _initialize_remote_bug ()
991 {
992   add_target (&bug_ops);
993
994   add_show_from_set
995     (add_set_cmd ("srec-bytes", class_support, var_uinteger,
996                   (char *) &srec_bytes,
997                   "\
998 Set the number of bytes represented in each S-record.\n\
999 This affects the communication protocol with the remote target.",
1000                   &setlist),
1001      &showlist);
1002
1003   add_show_from_set
1004     (add_set_cmd ("srec-max-retries", class_support, var_uinteger,
1005                   (char *) &srec_max_retries,
1006                   "\
1007 Set the number of retries for shipping S-records.\n\
1008 This affects the communication protocol with the remote target.",
1009                   &setlist),
1010      &showlist);
1011
1012 #if 0
1013   /* This needs to set SREC_SIZE, not srec_frame which gets changed at the
1014      end of a download.  But do we need the option at all?  */
1015   add_show_from_set
1016     (add_set_cmd ("srec-frame", class_support, var_uinteger,
1017                   (char *) &srec_frame,
1018                   "\
1019 Set the number of bytes in an S-record frame.\n\
1020 This affects the communication protocol with the remote target.",
1021                   &setlist),
1022      &showlist);
1023 #endif /* 0 */
1024
1025   add_show_from_set
1026     (add_set_cmd ("srec-noise", class_support, var_zinteger,
1027                   (char *) &srec_noise,
1028                   "\
1029 Set number of S-record to send before deliberately flubbing a checksum.\n\
1030 Zero means flub none at all.  This affects the communication protocol\n\
1031 with the remote target.",
1032                   &setlist),
1033      &showlist);
1034
1035   add_show_from_set
1036     (add_set_cmd ("srec-sleep", class_support, var_zinteger,
1037                   (char *) &srec_sleep,
1038                   "\
1039 Set number of seconds to sleep after an S-record for a possible error message to arrive.\n\
1040 This affects the communication protocol with the remote target.",
1041                   &setlist),
1042      &showlist);
1043
1044   add_show_from_set
1045     (add_set_cmd ("srec-echo-pace", class_support, var_boolean,
1046                   (char *) &srec_echo_pace,
1047                   "\
1048 Set echo-verification.\n\
1049 When on, use verification by echo when downloading S-records.  This is\n\
1050 much slower, but generally more reliable.", 
1051                   &setlist),
1052      &showlist);
1053 }