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