use remote-utils facilities for baud_rate
[deliverable/binutils-gdb.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 #include "value.h"
27
28 #include <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 "target.h"
37 #include "gdbcore.h"
38 #include "serial.h"
39 #include "gdbcmd.h"
40
41 #include "remote-utils.h"
42
43 extern int sleep();
44
45 /* External data declarations */
46 extern int stop_soon_quietly; /* for wait_for_inferior */
47
48 /* Forward data declarations */
49 extern struct target_ops bug_ops; /* Forward declaration */
50
51 /* Forward function declarations */
52 static int bug_clear_breakpoints PARAMS((void));
53
54 static int bug_read_memory PARAMS((CORE_ADDR memaddr,
55 unsigned char *myaddr,
56 int len));
57
58 static int bug_write_memory PARAMS((CORE_ADDR memaddr,
59 unsigned char *myaddr,
60 int len));
61
62 /* This variable is somewhat arbitrary. It's here so that it can be
63 set from within a running gdb. */
64
65 static 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
72 static int srec_frame = 160;
73
74 /* This variable determines how many bytes will be represented in each
75 S3 s-record. */
76
77 static 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
86 static 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
94 static 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
101 static 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
109 static int need_artificial_trap = 0;
110
111 /*
112 * Download a file specified in 'args', to the bug.
113 */
114
115 static void
116 bug_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
126 dcache_flush (gr_get_dcache());
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
148 char *buffer = xmalloc (srec_frame);
149
150 printf_filtered ("%s\t: 0x%4x .. 0x%4x ", s->name, s->vma, s->vma + s->_raw_size);
151 fflush (stdout);
152 for (i = 0; i < s->_raw_size; i += srec_frame)
153 {
154 if (srec_frame > s->_raw_size - i)
155 srec_frame = s->_raw_size - i;
156
157 bfd_get_section_contents (abfd, s, buffer, i, srec_frame);
158 bug_write_memory (s->vma + i, buffer, srec_frame);
159 printf_filtered ("*");
160 fflush (stdout);
161 }
162 printf_filtered ("\n");
163 free (buffer);
164 }
165 s = s->next;
166 }
167 sprintf (buffer, "rs ip %lx", (unsigned long) abfd->start_address);
168 sr_write_cr (buffer);
169 gr_expect_prompt ();
170 }
171
172 #if 0
173 static char *
174 get_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 }
201 #endif
202
203 static 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 };
212
213 static char *cpu_check_strings[] = {
214 "=",
215 "Invalid Register",
216 };
217
218 static void
219 bug_open (args, from_tty)
220 char *args;
221 int from_tty;
222 {
223 if (args == NULL)
224 args = "";
225
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");
230
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 }
242 }
243
244 /* Tell the remote machine to resume. */
245
246 void
247 bug_resume (pid, step, sig)
248 int pid, step, 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 (status)
280 WAITTYPE *status;
281 {
282 int old_timeout = sr_get_timeout();
283 int old_immediate_quit = immediate_quit;
284
285 WSETEXIT ((*status), 0);
286
287 /* read off leftovers from resume so that the rest can be passed
288 back out as stdout. */
289 if (need_artificial_trap == 0)
290 {
291 sr_expect("Effective address: ");
292 (void) sr_get_hex_word();
293 sr_expect ("\r\n");
294 }
295
296 sr_set_timeout(-1); /* Don't time out -- user program is running. */
297 immediate_quit = 1; /* Helps ability to QUIT */
298
299 switch (gr_multi_scan(wait_strings, need_artificial_trap == 0))
300 {
301 case 0: /* breakpoint case */
302 WSETSTOP ((*status), SIGTRAP);
303 /* user output from the target can be discarded here. (?) */
304 gr_expect_prompt();
305 break;
306
307 case 1: /* bus error */
308 WSETSTOP ((*status), SIGBUS);
309 /* user output from the target can be discarded here. (?) */
310 gr_expect_prompt();
311 break;
312
313 case 2: /* normal case */
314 case 3:
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 }
328
329 case -1: /* trouble */
330 default:
331 fprintf_filtered (stderr,
332 "Trouble reading target during wait\n");
333 break;
334 }
335
336 sr_set_timeout(old_timeout);
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. */
345 static char *
346 get_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 */
360 "ip", /* this is something of a cheat. */
361 /* 35 = sxip */
362 "cr05", /* 36 = snip */
363 "cr06", /* 37 = sfip */
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",
369 };
370
371 return rn[regno];
372 }
373
374 #if 0 /* not currently used */
375 /* Read from remote while the input matches STRING. Return zero on
376 success, -1 on failure. */
377
378 static int
379 bug_scan (s)
380 char *s;
381 {
382 int c;
383
384 while (*s)
385 {
386 c = sr_readchar();
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 }
397 #endif /* never */
398
399 static int
400 bug_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 {
408 if (sr_get_debug() > 0)
409 printf ("%c", *p);
410
411 do
412 SERIAL_WRITE(sr_get_desc(), p, 1);
413 while (sr_pollchar() != *p);
414 }
415 else
416 {
417 sr_write_cr (s);
418 /* return(bug_scan (s) || bug_scan ("\n")); */
419 }
420
421 return(0);
422 }
423
424 /* Store register REGNO, or all if REGNO == -1. */
425
426 static void
427 bug_fetch_register(regno)
428 int regno;
429 {
430 REGISTER_TYPE regval;
431
432 sr_check_open();
433
434 if (regno == -1)
435 {
436 int i;
437
438 for (i = 0; i < NUM_REGS; ++i)
439 bug_fetch_register(i);
440 }
441 else if (regno < XFP_REGNUM)
442 {
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();
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 }
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 }
500
501 return;
502 }
503
504 /* Store register REGNO, or all if REGNO == -1. */
505
506 static void
507 bug_store_register (regno)
508 int regno;
509 {
510 char buffer[1024];
511 sr_check_open();
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
524 regname = get_reg_name(regno);
525
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 }
550
551 sr_write_cr(buffer);
552 gr_expect_prompt();
553 }
554
555 return;
556 }
557
558 int
559 bug_xfer_memory (memaddr, myaddr, len, write, target)
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. */
589 buffer[0] = gr_fetch_word (addr);
590 }
591
592 if (count > 1) /* FIXME, avoid if even boundary */
593 {
594 buffer[count - 1]
595 = gr_fetch_word (addr + (count - 1) * sizeof (int));
596 }
597
598 /* Copy data to be written over corresponding part of buffer */
599
600 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
601
602 /* Write the entire buffer. */
603
604 for (i = 0; i < count; i++, addr += sizeof (int))
605 {
606 errno = 0;
607 gr_store_word (addr, buffer[i]);
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;
622 buffer[i] = gr_fetch_word (addr);
623 if (errno)
624 {
625 return 0;
626 }
627 QUIT;
628 }
629
630 /* Copy appropriate bytes out of the buffer. */
631 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
632 }
633
634 return len;
635 }
636
637 static void
638 start_load()
639 {
640 char *command;
641
642 command = (srec_echo_pace ? "lo 0 ;x" : "lo 0");
643
644 sr_write_cr (command);
645 sr_expect (command);
646 sr_expect ("\r\n");
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.
658
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
664 static char *srecord_strings[] = {
665 "S-RECORD",
666 "-Bug>",
667 NULL,
668 };
669
670 static int
671 bug_write_memory (memaddr, myaddr, len)
672 CORE_ADDR memaddr;
673 unsigned char *myaddr;
674 int len;
675 {
676 int done;
677 int checksum;
678 int x;
679 int retries;
680 char buffer[(srec_bytes + 8) << 1];
681
682 retries = 0;
683
684 do
685 {
686 done = 0;
687
688 if (retries > srec_max_retries)
689 return(-1);
690
691 if (retries > 0)
692 {
693 if (sr_get_debug() > 0)
694 printf("\n<retrying...>\n");
695
696 /* This gr_expect_prompt call is extremely important. Without
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
701 gr_expect_prompt();
702 }
703
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
754 /* This pollchar is probably redundant to the gr_multi_scan
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
760 if ((x = sr_pollchar()) != 0)
761 {
762 if (sr_get_debug() > 0)
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. */
769 gr_expect_prompt();
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. */
784 } while (gr_multi_scan(srecord_strings, 0) == 0);;
785
786 return(0);
787 }
788
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. */
796 static int
797 bug_read_memory (memaddr, myaddr, len)
798 CORE_ADDR memaddr;
799 unsigned char *myaddr;
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);
812 sr_write_cr(request);
813
814 p = buffer = alloca(len);
815
816 /* scan up through the header */
817 sr_expect("S0030000FC");
818
819 while (p < buffer + len)
820 {
821 /* scan off any white space. */
822 while (sr_readchar() != 'S') ;;
823
824 /* what kind of s-rec? */
825 type = sr_readchar();
826
827 /* scan record size */
828 sr_get_hex_byte(&size);
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':
841 sr_get_hex_byte(&c);
842 inaddr = (inaddr << 8) + c;
843 checksum += c;
844 --size;
845 /* intentional fall through */
846 case '2':
847 sr_get_hex_byte(&c);
848 inaddr = (inaddr << 8) + c;
849 checksum += c;
850 --size;
851 /* intentional fall through */
852 case '1':
853 sr_get_hex_byte(&c);
854 inaddr = (inaddr << 8) + c;
855 checksum += c;
856 --size;
857 sr_get_hex_byte(&c);
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 {
877 sr_get_hex_byte(p);
878 checksum += *p;
879 }
880
881 sr_get_hex_byte(&c);
882 if (c != (~checksum & 0xff))
883 error("bad s-rec checksum");
884 }
885
886 done:
887 gr_expect_prompt();
888 if (p != buffer + len)
889 return(1);
890
891 memcpy(myaddr, buffer, len);
892 return(0);
893 }
894
895 #define MAX_BREAKS 16
896 static int num_brkpts = 0;
897 static int
898 bug_insert_breakpoint (addr, save)
899 CORE_ADDR addr;
900 char *save; /* Throw away, let bug save instructions */
901 {
902 sr_check_open ();
903
904 if (num_brkpts < MAX_BREAKS)
905 {
906 char buffer[100];
907
908 num_brkpts++;
909 sprintf (buffer, "br %x", addr);
910 sr_write_cr (buffer);
911 gr_expect_prompt ();
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 }
922 static int
923 bug_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);
933 sr_write_cr (buffer);
934 gr_expect_prompt ();
935
936 }
937 return (0);
938 }
939
940 /* Clear the bugs notion of what the break points are */
941 static int
942 bug_clear_breakpoints ()
943 {
944
945 if (sr_is_open())
946 {
947 sr_write_cr ("nobr");
948 sr_expect("nobr");
949 gr_expect_prompt ();
950 }
951 num_brkpts = 0;
952 return(0);
953 }
954
955 struct target_ops bug_ops =
956 {
957 "bug", "Remote BUG monitor",
958 "Use the mvme187 board running the BUG monitor connected\n\
959 by a serial line.",
960
961 bug_open, gr_close,
962 0, gr_detach, bug_resume, bug_wait, /* attach */
963 bug_fetch_register, bug_store_register,
964 gr_prepare_to_store,
965 bug_xfer_memory,
966 gr_files_info,
967 bug_insert_breakpoint, bug_remove_breakpoint, /* Breakpoints */
968 0, 0, 0, 0, 0, /* Terminal handling */
969 gr_kill, /* FIXME, kill */
970 bug_load,
971 0, /* lookup_symbol */
972 gr_create_inferior, /* create_inferior */
973 gr_mourn, /* mourn_inferior FIXME */
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
982 void
983 _initialize_remote_bug ()
984 {
985 add_target (&bug_ops);
986
987 add_show_from_set
988 (add_set_cmd ("srec-bytes", class_support, var_uinteger,
989 (char *) &srec_bytes,
990 "\
991 Set the number of bytes represented in each S-record.\n\
992 This 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 "\
1000 Set the number of retries for shipping S-records.\n\
1001 This 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 "\
1009 Set the number of bytes in an S-record frame.\n\
1010 This 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 "\
1018 Set number of S-record to send before deliberately flubbing a checksum.\n\
1019 Zero means flub none at all. This affects the communication protocol\n\
1020 with 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 "\
1028 Set number of seconds to sleep after an S-record for a possible error message to arrive.\n\
1029 This 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 "\
1037 Set echo-verification.\n\
1038 When on, use verification by echo when downloading S-records. This is\n\
1039 much slower, but generally more reliable.",
1040 &setlist),
1041 &showlist);
1042 }
This page took 0.050181 seconds and 4 git commands to generate.