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