bcopy -> memcpy
[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
755892d6
RP
41#include "dcache.h"
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 */
be58e87e 52
755892d6
RP
53static int bug_clear_breakpoints PARAMS((void));
54static void bug_close PARAMS((int quitting));
55static void bug_write_cr PARAMS((char *string));
be58e87e 56
755892d6
RP
57static int bug_read_inferior_memory PARAMS((CORE_ADDR memaddr,
58 unsigned char *myaddr,
59 int len));
be58e87e 60
755892d6
RP
61static int bug_write_inferior_memory PARAMS((CORE_ADDR memaddr,
62 unsigned char *myaddr,
63 int len));
be58e87e 64
be58e87e
RP
65/* This is the serial descriptor to our target. */
66
67static serial_t desc = NULL;
68
755892d6
RP
69/* This is our data cache. */
70
71static DCACHE *bug_dcache;
72
be58e87e
RP
73/* This variable is somewhat arbitrary. It's here so that it can be
74 set from within a running gdb. */
75
76static int srec_max_retries = 3;
77
78/* Each S-record download to the target consists of an S0 header
79 record, some number of S3 data records, and one S7 termination
80 record. I call this download a "frame". Srec_frame says how many
81 bytes will be represented in each frame. */
82
83static int srec_frame = 160;
84
85/* This variable determines how many bytes will be represented in each
86 S3 s-record. */
87
88static int srec_bytes = 40;
89
90/* At one point it appeared to me as though the bug monitor could not
91 really be expected to receive two sequential characters at 9600
92 baud reliably. Echo-pacing is an attempt to force data across the
93 line even in this condition. Specifically, in echo-pace mode, each
94 character is sent one at a time and we look for the echo before
95 sending the next. This is excruciatingly slow. */
5905161c 96
be58e87e
RP
97static int srec_echo_pace = 0;
98
99/* How long to wait after an srec for a possible error message.
100 Similar to the above, I tried sleeping after sending each S3 record
101 in hopes that I might actually see error messages from the bug
102 monitor. This might actually work if we were to use sleep
103 intervals smaller than 1 second. */
104
105static int srec_sleep = 0;
106
107/* Every srec_noise records, flub the checksum. This is a debugging
108 feature. Set the variable to something other than 1 in order to
109 inject *deliberate* checksum errors. One might do this if one
110 wanted to test error handling and recovery. */
111
112static int srec_noise = 0;
5905161c 113
5905161c
RP
114/***********************************************************************
115 * I/O stuff stolen from remote-eb.c
116 ***********************************************************************/
117
be58e87e
RP
118/* with a timeout of 2, we time out waiting for the prompt after an
119 s-record dump. */
120static int timeout = 4;
5905161c
RP
121
122static const char *dev_name;
123
124/* Descriptor for I/O to remote machine. Initialize it to -1 so that
125 bug_open knows that we don't have a file open when the program
126 starts. */
127
be58e87e
RP
128static int is_open = 0;
129static int
5905161c
RP
130check_open ()
131{
132 if (!is_open)
133 {
134 error ("remote device not open");
135 }
be58e87e
RP
136
137 return(1);
5905161c
RP
138}
139
140#define ON 1
141#define OFF 0
142
143/* Read a character from the remote system, doing all the fancy
144 timeout stuff. */
145static int
146readchar ()
147{
148 int buf;
149
150 buf = SERIAL_READCHAR (desc, timeout);
151
152 if (buf == SERIAL_TIMEOUT)
153 error ("Timeout reading from remote system.");
154
b11d53ba 155 if (remote_debug)
5905161c
RP
156 printf ("%c", buf);
157
158 return buf & 0x7f;
159}
160
161static int
162readchar_nofail ()
163{
164 int buf;
165
166 buf = SERIAL_READCHAR (desc, timeout);
167 if (buf == SERIAL_TIMEOUT)
168 buf = 0;
b11d53ba 169 if (remote_debug)
be58e87e
RP
170 if (buf)
171 printf ("%c", buf);
172 else
173 printf ("<timeout>");
5905161c
RP
174
175 return buf & 0x7f;
176
177}
178
be58e87e
RP
179static int
180pollchar()
181{
182 int buf;
183
184 buf = SERIAL_READCHAR (desc, 0);
185 if (buf == SERIAL_TIMEOUT)
186 buf = 0;
b11d53ba 187 if (remote_debug)
be58e87e
RP
188 if (buf)
189 printf ("%c", buf);
190 else
191 printf ("<empty poll>");
192
193 return buf & 0x7f;
194}
195
5905161c
RP
196/* Keep discarding input from the remote system, until STRING is found.
197 Let the user break out immediately. */
198static void
199expect (string)
200 char *string;
201{
202 char *p = string;
203
204 immediate_quit = 1;
be58e87e 205 for (;;)
5905161c
RP
206 {
207 if (readchar () == *p)
208 {
209 p++;
210 if (*p == '\0')
211 {
212 immediate_quit = 0;
213 return;
214 }
215 }
216 else
217 p = string;
218 }
219}
220
221/* Keep discarding input until we see the bug prompt.
222
223 The convention for dealing with the prompt is that you
224 o give your command
225 o *then* wait for the prompt.
226
227 Thus the last thing that a procedure does with the serial line
228 will be an expect_prompt(). Exception: bug_resume does not
229 wait for the prompt, because the terminal is being handed over
230 to the inferior. However, the next thing which happens after that
231 is a bug_wait which does wait for the prompt.
232 Note that this includes abnormal exit, e.g. error(). This is
233 necessary to prevent getting into states from which we can't
234 recover. */
235static void
236expect_prompt ()
237{
238 expect ("Bug>");
239}
240
241/* Get a hex digit from the remote system & return its value.
242 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
243static int
244get_hex_digit (ignore_space)
245 int ignore_space;
246{
247 int ch;
248
be58e87e 249 for (;;)
5905161c
RP
250 {
251 ch = readchar ();
252 if (ch >= '0' && ch <= '9')
253 return ch - '0';
254 else if (ch >= 'A' && ch <= 'F')
255 return ch - 'A' + 10;
256 else if (ch >= 'a' && ch <= 'f')
257 return ch - 'a' + 10;
be58e87e 258 else if (ch != ' ' || !ignore_space)
5905161c
RP
259 {
260 expect_prompt ();
261 error ("Invalid hex digit from remote system.");
262 }
263 }
264}
265
266/* Get a byte from bug_desc and put it in *BYT. Accept any number
267 leading spaces. */
268static void
269get_hex_byte (byt)
270 char *byt;
271{
272 int val;
273
274 val = get_hex_digit (1) << 4;
275 val |= get_hex_digit (0);
276 *byt = val;
277}
278
279/* Read a 32-bit hex word from the bug, preceded by a space */
280static long
281get_hex_word ()
282{
283 long val;
284 int j;
285
286 val = 0;
287 for (j = 0; j < 8; j++)
288 val = (val << 4) + get_hex_digit (j == 0);
289 return val;
290}
291
292/* Called when SIGALRM signal sent due to alarm() timeout. */
293
294/* Number of SIGTRAPs we need to simulate. That is, the next
295 NEED_ARTIFICIAL_TRAP calls to bug_wait should just return
296 SIGTRAP without actually waiting for anything. */
297
298static int need_artificial_trap = 0;
299
300void
301bug_kill (arg, from_tty)
302 char *arg;
303 int from_tty;
304{
305
306}
307
308/*
309 * Download a file specified in 'args', to the bug.
310 */
be58e87e 311
5905161c
RP
312static void
313bug_load (args, fromtty)
314 char *args;
315 int fromtty;
316{
317 bfd *abfd;
318 asection *s;
5905161c
RP
319 char buffer[1024];
320
321 check_open ();
322
755892d6 323 dcache_flush (bug_dcache);
5905161c
RP
324 inferior_pid = 0;
325 abfd = bfd_openr (args, 0);
326 if (!abfd)
327 {
328 printf_filtered ("Unable to open file %s\n", args);
329 return;
330 }
331
332 if (bfd_check_format (abfd, bfd_object) == 0)
333 {
334 printf_filtered ("File is not an object file\n");
335 return;
336 }
337
338 s = abfd->sections;
339 while (s != (asection *) NULL)
340 {
341 if (s->flags & SEC_LOAD)
342 {
343 int i;
344
be58e87e 345 char *buffer = xmalloc (srec_frame);
5905161c
RP
346
347 printf_filtered ("%s\t: 0x%4x .. 0x%4x ", s->name, s->vma, s->vma + s->_raw_size);
be58e87e
RP
348 fflush (stdout);
349 for (i = 0; i < s->_raw_size; i += srec_frame)
5905161c 350 {
be58e87e
RP
351 if (srec_frame > s->_raw_size - i)
352 srec_frame = s->_raw_size - i;
5905161c 353
be58e87e
RP
354 bfd_get_section_contents (abfd, s, buffer, i, srec_frame);
355 bug_write_inferior_memory (s->vma + i, buffer, srec_frame);
5905161c
RP
356 printf_filtered ("*");
357 fflush (stdout);
358 }
359 printf_filtered ("\n");
360 free (buffer);
361 }
362 s = s->next;
363 }
be58e87e 364 sprintf (buffer, "rs ip %lx", (unsigned long) abfd->start_address);
5905161c
RP
365 bug_write_cr (buffer);
366 expect_prompt ();
367}
368
369/* This is called not only when we first attach, but also when the
370 user types "run" after having attached. */
371void
372bug_create_inferior (execfile, args, env)
373 char *execfile;
374 char *args;
375 char **env;
376{
377 int entry_pt;
5905161c
RP
378
379 if (args && *args)
380 error ("Can't pass arguments to remote bug process.");
381
382 if (execfile == 0 || exec_bfd == 0)
383 error ("No exec file specified");
384
385 entry_pt = (int) bfd_get_start_address (exec_bfd);
386 check_open ();
387
388 bug_kill (NULL, NULL);
389 bug_clear_breakpoints ();
390 init_wait_for_inferior ();
391 bug_write_cr ("");
392 expect_prompt ();
393
394 insert_breakpoints (); /* Needed to get correct instruction in cache */
395 proceed (entry_pt, -1, 0);
396}
397
5905161c
RP
398static char *
399get_word (p)
400 char **p;
401{
402 char *s = *p;
403 char *word;
404 char *copy;
405 size_t len;
406
407 while (isspace (*s))
408 s++;
409
410 word = s;
411
412 len = 0;
413
414 while (*s && !isspace (*s))
415 {
416 s++;
417 len++;
418
419 }
420 copy = xmalloc (len + 1);
421 memcpy (copy, word, len);
422 copy[len] = 0;
423 *p = s;
424 return copy;
425}
426
427static int baudrate = 9600;
428
5905161c
RP
429static void
430bug_open (name, from_tty)
431 char *name;
432 int from_tty;
433{
5905161c
RP
434 push_target (&bug_ops);
435
436 if (name == 0)
437 {
438 name = "";
439 }
440 if (is_open)
441 bug_close (0);
442 dev_name = strdup (name);
443
444 if (!(desc = SERIAL_OPEN (dev_name)))
445 perror_with_name ((char *) dev_name);
446
447 SERIAL_RAW (desc);
448 is_open = 1;
449
755892d6 450 bug_dcache = dcache_init (bug_read_inferior_memory, bug_write_inferior_memory);
5905161c
RP
451
452 /* Hello? Are you there? */
453 SERIAL_WRITE (desc, "\r", 1);
454 expect_prompt ();
455
456 /* Clear any break points */
457 bug_clear_breakpoints ();
458
459 printf_filtered ("Connected to remote 187bug system.\n");
460}
461
462/* Close out all files and local state before this target loses control. */
463
464static void
465bug_close (quitting)
466 int quitting;
467{
468 /* Clear any break points */
469 bug_clear_breakpoints ();
470
471 if (is_open)
472 SERIAL_CLOSE (desc);
473
474 is_open = 0;
475}
476
477/* Terminate the open connection to the remote debugger.
478 Use this when you want to detach and do something else
479 with your gdb. */
480void
481bug_detach (args, from_tty)
482 char *args;
483 int from_tty;
484{
485 if (is_open)
486 bug_clear_breakpoints ();
487
488 pop_target (); /* calls bug_close to do the real work */
489
490 if (from_tty)
491 printf_filtered ("Ending remote %s debugging\n", target_shortname);
492}
493
494/* Tell the remote machine to resume. */
495
496void
be58e87e
RP
497bug_resume (pid, step, sig)
498 int pid, step, sig;
5905161c 499{
755892d6 500 dcache_flush (bug_dcache);
5905161c
RP
501
502 if (step)
503 {
504 bug_write_cr("t");
505
506 /* Force the next bug_wait to return a trap. Not doing anything
507 about I/O from the target means that the user has to type
508 "continue" to see any. FIXME, this should be fixed. */
509 need_artificial_trap = 1;
510 }
511 else
512 bug_write_cr ("g");
513
514 return;
515}
516
16f6ab6b
RP
517/* Given a null terminated list of strings LIST, read the input until we find one of
518 them. Return the index of the string found or -1 on error. '?' means match
519 any single character. Note that with the algorithm we use, the initial
520 character of the string cannot recur in the string, or we will not find some
521 cases of the string in the input. If PASSTHROUGH is non-zero, then
522 pass non-matching data on. */
523
be58e87e 524static int
16f6ab6b
RP
525multi_scan (list, passthrough)
526 char *list[];
527 int passthrough;
5905161c 528{
16f6ab6b
RP
529 char *swallowed = NULL; /* holding area */
530 char *swallowed_p = swallowed; /* Current position in swallowed. */
531 int ch;
532 int ch_handled;
533 int i;
534 int string_count;
535 int max_length;
536 char **plist;
5905161c 537
16f6ab6b
RP
538 /* Look through the strings. Count them. Find the largest one so we can
539 allocate a holding area. */
5905161c 540
16f6ab6b
RP
541 for (max_length = string_count = i = 0;
542 list[i] != NULL;
543 ++i, ++string_count)
544 {
545 int length = strlen(list[i]);
5905161c 546
16f6ab6b
RP
547 if (length > max_length)
548 max_length = length;
549 }
5905161c 550
16f6ab6b
RP
551 /* if we have no strings, then something is wrong. */
552 if (string_count == 0)
553 return(-1);
5905161c 554
16f6ab6b
RP
555 /* otherwise, we will need a holding area big enough to hold almost two
556 copies of our largest string. */
557 swallowed_p = swallowed = alloca(max_length << 1);
558
559 /* and a list of pointers to current scan points. */
560 plist = alloca(string_count * sizeof(*plist));
561
562 /* and initialize */
563 for (i = 0; i < string_count; ++i)
564 plist[i] = list[i];
565
566 for (ch = readchar(); /* loop forever */ ; ch = readchar())
5905161c 567 {
be58e87e 568 QUIT; /* Let user quit and leave process running */
5905161c 569 ch_handled = 0;
be58e87e 570
16f6ab6b 571 for (i = 0; i < string_count; ++i)
5905161c 572 {
16f6ab6b
RP
573 if (ch == *plist[i] || *plist[i] == '?')
574 {
575 ++plist[i];
576 if (*plist[i] == '\0')
577 return(i);
578
579 if (!ch_handled)
580 *swallowed_p++ = ch;
5905161c 581
16f6ab6b
RP
582 ch_handled = 1;
583 }
584 else
585 plist[i] = list[i];
5905161c 586 }
5905161c
RP
587
588 if (!ch_handled)
589 {
590 char *p;
591
592 /* Print out any characters which have been swallowed. */
16f6ab6b 593 if (passthrough)
5905161c 594 {
16f6ab6b
RP
595 for (p = swallowed; p < swallowed_p; ++p)
596 putc (*p, stdout);
597
5905161c 598 putc (ch, stdout);
5905161c 599 }
5905161c 600
16f6ab6b 601 swallowed_p = swallowed;
5905161c 602 }
5905161c 603 }
be58e87e 604
16f6ab6b 605 return(-1);
be58e87e
RP
606}
607
608/* Wait until the remote machine stops, then return,
609 storing status in STATUS just as `wait' would. */
610
16f6ab6b
RP
611static char *wait_strings[] = {
612 "At Breakpoint",
613 "Exception: Data Access Fault (Local Bus Timeout)",
614 "\r8???-Bug>",
615 NULL,
616};
617
be58e87e
RP
618int
619bug_wait (status)
620 WAITTYPE *status;
621{
622 int old_timeout = timeout;
623 int old_immediate_quit = immediate_quit;
624
625 WSETEXIT ((*status), 0);
626
16f6ab6b
RP
627 /* read off leftovers from resume so that the rest can be passed
628 back out as stdout. */
629 if (need_artificial_trap == 0)
5905161c 630 {
16f6ab6b
RP
631 expect("Effective address: ");
632 (void) get_hex_word();
633 expect ("\r\n");
5905161c 634 }
be58e87e 635
be58e87e
RP
636 timeout = -1; /* Don't time out -- user program is running. */
637 immediate_quit = 1; /* Helps ability to QUIT */
638
16f6ab6b 639 switch (multi_scan(wait_strings, need_artificial_trap == 0))
5905161c 640 {
16f6ab6b 641 case 0: /* breakpoint case */
be58e87e 642 WSETSTOP ((*status), SIGTRAP);
16f6ab6b
RP
643 /* user output from the target can be discarded here. (?) */
644 expect_prompt();
645 break;
646
647 case 1: /* bus error */
648 WSETSTOP ((*status), SIGBUS);
649 /* user output from the target can be discarded here. (?) */
650 expect_prompt();
651 break;
652
653 case 2: /* normal case */
654 if (need_artificial_trap != 0)
655 {
656 /* stepping */
657 WSETSTOP ((*status), SIGTRAP);
658 need_artificial_trap--;
659 break;
660 }
661 else
662 {
663 /* exit case */
664 WSETEXIT ((*status), 0);
665 break;
666 }
be58e87e 667
16f6ab6b
RP
668 case -1: /* trouble */
669 default:
670 fprintf_filtered (stderr,
671 "Trouble reading target during wait\n");
672 break;
673 }
5905161c
RP
674
675 timeout = old_timeout;
676 immediate_quit = old_immediate_quit;
677 return 0;
678}
679
680/* Return the name of register number REGNO
681 in the form input and output by bug.
682
683 Returns a pointer to a static buffer containing the answer. */
684static char *
685get_reg_name (regno)
686 int regno;
687{
688 static char *rn[] = {
689 "r00", "r01", "r02", "r03", "r04", "r05", "r06", "r07",
690 "r08", "r09", "r10", "r11", "r12", "r13", "r14", "r15",
691 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
692 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
693
694 /* these get confusing because we omit a few and switch some ordering around. */
695
696 "cr01", /* 32 = psr */
697 "fcr62", /* 33 = fpsr*/
698 "fcr63", /* 34 = fpcr */
be58e87e
RP
699 "ip", /* this is something of a cheat. */
700 /* 35 = sxip */
5905161c
RP
701 "cr05", /* 36 = snip */
702 "cr06", /* 37 = sfip */
703 };
704
705 return rn[regno];
706}
707
708static int
5905161c
RP
709bug_write (a, l)
710 char *a;
be58e87e 711 int l;
5905161c
RP
712{
713 int i;
714
715 SERIAL_WRITE (desc, a, l);
716
b11d53ba 717 if (remote_debug)
5905161c
RP
718 for (i = 0; i < l; i++)
719 {
720 printf ("%c", a[i]);
721 }
be58e87e
RP
722
723 return(0);
5905161c
RP
724}
725
be58e87e 726static void
5905161c
RP
727bug_write_cr (s)
728 char *s;
729{
730 bug_write (s, strlen (s));
731 bug_write ("\r", 1);
be58e87e
RP
732 return;
733}
734
16f6ab6b 735#if 0 /* not currently used */
be58e87e
RP
736/* Read from remote while the input matches STRING. Return zero on
737 success, -1 on failure. */
738
739static int
740bug_scan (s)
741 char *s;
742{
743 int c;
744
745 while (*s)
746 {
747 c = readchar();
748 if (c != *s++)
749 {
750 fflush(stdout);
751 printf("\nNext character is '%c' - %d and s is \"%s\".\n", c, c, --s);
752 return(-1);
753 }
754 }
755
756 return(0);
757}
16f6ab6b 758#endif /* never */
be58e87e
RP
759
760static int
761bug_srec_write_cr (s)
762 char *s;
763{
764 char *p = s;
765
766 if (srec_echo_pace)
767 for (p = s; *p; ++p)
768 {
b11d53ba 769 if (remote_debug)
be58e87e
RP
770 printf ("%c", *p);
771
772 do
773 SERIAL_WRITE(desc, p, 1);
774 while (readchar_nofail() != *p);
775 }
776 else
777 {
778 bug_write_cr (s);
779/* return(bug_scan (s) || bug_scan ("\n")); */
780 }
781
782 return(0);
5905161c
RP
783}
784
785/* Store register REGNO, or all if REGNO == -1. */
786
787static void
788bug_fetch_register(regno)
789 int regno;
790{
791 REGISTER_TYPE regval;
792 check_open();
793
794 if (regno == -1)
795 {
796 int i;
797
798 for (i = 0; i < NUM_REGS; ++i)
799 bug_fetch_register(i);
800 }
801 else
802 {
803 bug_write("rs ", 3);
804 bug_write_cr(get_reg_name(regno));
805 expect("=");
806 regval = get_hex_word();
807 expect_prompt();
808
809 /* the following registers contain flag bits in the lower to bit slots.
810 Mask them off */
811 if (regno == PC_REGNUM /* aka sxip */
812 || regno == NPC_REGNUM /* aka snip */
813 || regno == SFIP_REGNUM) /* aka sfip */
814 regval &= ~0x3;
815
816 supply_register(regno, (char *) &regval);
817 }
818
819 return;
820}
821
822/* Store register REGNO, or all if REGNO == -1. */
823
824static void
825bug_store_register (regno)
826 int regno;
827{
5905161c
RP
828 char buffer[1024];
829 check_open();
830
831 if (regno == -1)
832 {
833 int i;
834
835 for (i = 0; i < NUM_REGS; ++i)
836 bug_store_register(i);
837 }
838 else
839 {
840 char *regname;
841
be58e87e 842 regname = (get_reg_name(regno));
5905161c
RP
843
844 sprintf(buffer, "rs %s %08x",
845 regname,
846 read_register(regno));
847
848 bug_write_cr(buffer);
849 expect_prompt();
850 }
851
852 return;
853}
854
855/* Get ready to modify the registers array. On machines which store
856 individual registers, this doesn't need to do anything. On machines
857 which store all the registers in one fell swoop, this makes sure
858 that registers contains all the registers from the program being
859 debugged. */
860
861void
862bug_prepare_to_store ()
863{
864 /* Do nothing, since we can store individual regs */
865}
866
5905161c
RP
867/* Read a word from remote address ADDR and return it.
868 * This goes through the data cache.
869 */
870int
871bug_fetch_word (addr)
872 CORE_ADDR addr;
873{
755892d6 874 return dcache_fetch (bug_dcache, addr);
5905161c
RP
875}
876
877/* Write a word WORD into remote address ADDR.
878 This goes through the data cache. */
879
880void
881bug_store_word (addr, word)
882 CORE_ADDR addr;
883 int word;
884{
755892d6 885 dcache_poke (bug_dcache, addr, word);
5905161c
RP
886}
887
888int
889bug_xfer_inferior_memory (memaddr, myaddr, len, write, target)
890 CORE_ADDR memaddr;
891 char *myaddr;
892 int len;
893 int write;
894 struct target_ops *target; /* ignored */
895{
896 register int i;
897
898 /* Round starting address down to longword boundary. */
899 register CORE_ADDR addr;
900
901 /* Round ending address up; get number of longwords that makes. */
902 register int count;
903
904 /* Allocate buffer of that many longwords. */
905 register int *buffer;
906
907 addr = memaddr & -sizeof (int);
908 count = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
909
910 buffer = (int *) alloca (count * sizeof (int));
911
912 if (write)
913 {
914 /* Fill start and end extra bytes of buffer with existing memory data. */
915
916 if (addr != memaddr || len < (int) sizeof (int))
917 {
918 /* Need part of initial word -- fetch it. */
919 buffer[0] = bug_fetch_word (addr);
920 }
921
922 if (count > 1) /* FIXME, avoid if even boundary */
923 {
924 buffer[count - 1]
925 = bug_fetch_word (addr + (count - 1) * sizeof (int));
926 }
927
928 /* Copy data to be written over corresponding part of buffer */
929
ade40d31 930 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
5905161c
RP
931
932 /* Write the entire buffer. */
933
934 for (i = 0; i < count; i++, addr += sizeof (int))
935 {
936 errno = 0;
937 bug_store_word (addr, buffer[i]);
938 if (errno)
939 {
940
941 return 0;
942 }
943
944 }
945 }
946 else
947 {
948 /* Read all the longwords */
949 for (i = 0; i < count; i++, addr += sizeof (int))
950 {
951 errno = 0;
952 buffer[i] = bug_fetch_word (addr);
953 if (errno)
954 {
955 return 0;
956 }
957 QUIT;
958 }
959
960 /* Copy appropriate bytes out of the buffer. */
ade40d31 961 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
5905161c
RP
962 }
963
964 return len;
965}
966
be58e87e
RP
967static void
968start_load()
969{
970 char *command;
971
972 command = (srec_echo_pace ? "lo 0 ;x" : "lo 0");
973
974 bug_write_cr (command);
975 expect (command);
976 expect ("\r\n");
977 bug_srec_write_cr ("S0030000FC");
978 return;
979}
980
981/* This is an extremely vulnerable and fragile function. I've made
982 considerable attempts to make this deterministic, but I've
983 certainly forgotten something. The trouble is that S-records are
984 only a partial file format, not a protocol. Worse, apparently the
985 m88k bug monitor does not run in real time while receiving
986 S-records. Hence, we must pay excruciating attention to when and
987 where error messages are returned, and what has actually been sent.
5905161c 988
be58e87e
RP
989 Each call represents a chunk of memory to be sent to the target.
990 We break that chunk into an S0 header record, some number of S3
991 data records each containing srec_bytes, and an S7 termination
992 record. */
993
16f6ab6b
RP
994static char *srecord_strings[] = {
995 "S-RECORD",
996 "8???-Bug>",
997 NULL,
998};
999
be58e87e 1000static int
5905161c
RP
1001bug_write_inferior_memory (memaddr, myaddr, len)
1002 CORE_ADDR memaddr;
1003 unsigned char *myaddr;
1004 int len;
1005{
1006 int done;
5905161c 1007 int checksum;
be58e87e
RP
1008 int x;
1009 int retries;
1010 char buffer[(srec_bytes + 8) << 1];
5905161c 1011
be58e87e 1012 retries = 0;
5905161c 1013
be58e87e 1014 do
5905161c 1015 {
be58e87e
RP
1016 done = 0;
1017
1018 if (retries > srec_max_retries)
1019 return(-1);
1020
1021 if (retries > 0)
5905161c 1022 {
b11d53ba 1023 if (remote_debug)
be58e87e
RP
1024 printf("\n<retrying...>\n");
1025
1026 /* This expect_prompt call is extremely important. Without
1027 it, we will tend to resend our packet so fast that it
1028 will arrive before the bug monitor is ready to receive
1029 it. This would lead to a very ugly resend loop. */
1030
1031 expect_prompt();
5905161c 1032 }
5905161c 1033
be58e87e
RP
1034 start_load();
1035
1036 while (done < len)
1037 {
1038 int thisgo;
1039 int idx;
1040 char *buf = buffer;
1041 CORE_ADDR address;
1042
1043 checksum = 0;
1044 thisgo = len - done;
1045 if (thisgo > srec_bytes)
1046 thisgo = srec_bytes;
1047
1048 address = memaddr + done;
1049 sprintf (buf, "S3%02X%08X", thisgo + 4 + 1, address);
1050 buf += 12;
1051
1052 checksum += (thisgo + 4 + 1
1053 + (address & 0xff)
1054 + ((address >> 8) & 0xff)
1055 + ((address >> 16) & 0xff)
1056 + ((address >> 24) & 0xff));
1057
1058 for (idx = 0; idx < thisgo; idx++)
1059 {
1060 sprintf (buf, "%02X", myaddr[idx + done]);
1061 checksum += myaddr[idx + done];
1062 buf += 2;
1063 }
1064
1065 if (srec_noise > 0)
1066 {
1067 /* FIXME-NOW: insert a deliberate error every now and then.
1068 This is intended for testing/debugging the error handling
1069 stuff. */
1070 static int counter = 0;
1071 if (++counter > srec_noise)
1072 {
1073 counter = 0;
1074 ++checksum;
1075 }
1076 }
1077
1078 sprintf(buf, "%02X", ~checksum & 0xff);
1079 bug_srec_write_cr (buffer);
1080
1081 if (srec_sleep != 0)
1082 sleep(srec_sleep);
1083
16f6ab6b 1084 /* This pollchar is probably redundant to the multi_scan
be58e87e
RP
1085 below. Trouble is, we can't be sure when or where an
1086 error message will appear. Apparently, when running at
1087 full speed from a typical sun4, error messages tend to
1088 appear to arrive only *after* the s7 record. */
1089
1090 if ((x = pollchar()) != 0)
1091 {
b11d53ba 1092 if (remote_debug)
be58e87e
RP
1093 printf("\n<retrying...>\n");
1094
1095 ++retries;
1096
1097 /* flush any remaining input and verify that we are back
1098 at the prompt level. */
1099 expect_prompt();
1100 /* start all over again. */
1101 start_load();
1102 done = 0;
1103 continue;
1104 }
1105
1106 done += thisgo;
1107 }
1108
1109 bug_srec_write_cr("S7060000000000F9");
1110 ++retries;
1111
1112 /* Having finished the load, we need to figure out whether we
1113 had any errors. */
16f6ab6b 1114 } while (multi_scan(srecord_strings, 0) == 0);;
be58e87e
RP
1115
1116 return(0);
5905161c
RP
1117}
1118
1119void
1120bug_files_info ()
1121{
1122 char *file = "nothing";
1123
1124 if (exec_bfd)
1125 file = bfd_get_filename (exec_bfd);
1126
1127 if (exec_bfd)
1128#ifdef __GO32__
1129 printf_filtered ("\tAttached to DOS asynctsr and running program %s\n", file);
1130#else
1131 printf_filtered ("\tAttached to %s at %d baud and running program %s\n", dev_name, baudrate, file);
1132#endif
1133 printf_filtered ("\ton an m88k processor.\n");
1134}
1135
1136/* Copy LEN bytes of data from debugger memory at MYADDR
1137 to inferior's memory at MEMADDR. Returns errno value.
1138 * sb/sh instructions don't work on unaligned addresses, when TU=1.
1139 */
1140
1141/* Read LEN bytes from inferior memory at MEMADDR. Put the result
1142 at debugger address MYADDR. Returns errno value. */
be58e87e 1143static int
5905161c
RP
1144bug_read_inferior_memory (memaddr, myaddr, len)
1145 CORE_ADDR memaddr;
755892d6 1146 unsigned char *myaddr;
5905161c
RP
1147 int len;
1148{
1149 char request[100];
1150 char *buffer;
1151 char *p;
1152 char type;
1153 char size;
1154 unsigned char c;
1155 unsigned int inaddr;
1156 unsigned int checksum;
1157
1158 sprintf(request, "du 0 %x:&%d", memaddr, len);
1159 bug_write_cr(request);
1160
1161 p = buffer = alloca(len);
1162
1163 /* scan up through the header */
1164 expect("S0030000FC");
1165
1166 while (p < buffer + len)
1167 {
1168 /* scan off any white space. */
1169 while (readchar() != 'S') ;;
1170
1171 /* what kind of s-rec? */
1172 type = readchar();
1173
1174 /* scan record size */
1175 get_hex_byte(&size);
1176 checksum = size;
1177 --size;
1178 inaddr = 0;
1179
1180 switch (type)
1181 {
1182 case '7':
1183 case '8':
1184 case '9':
1185 goto done;
1186
1187 case '3':
1188 get_hex_byte(&c);
1189 inaddr = (inaddr << 8) + c;
1190 checksum += c;
1191 --size;
1192 /* intentional fall through */
1193 case '2':
1194 get_hex_byte(&c);
1195 inaddr = (inaddr << 8) + c;
1196 checksum += c;
1197 --size;
1198 /* intentional fall through */
1199 case '1':
1200 get_hex_byte(&c);
1201 inaddr = (inaddr << 8) + c;
1202 checksum += c;
1203 --size;
1204 get_hex_byte(&c);
1205 inaddr = (inaddr << 8) + c;
1206 checksum += c;
1207 --size;
1208 break;
1209
1210 default:
1211 /* bonk */
1212 error("reading s-records.");
1213 }
1214
1215 if (inaddr < memaddr
1216 || (memaddr + len) < (inaddr + size))
1217 error("srec out of memory range.");
1218
1219 if (p != buffer + inaddr - memaddr)
1220 error("srec out of sequence.");
1221
1222 for (; size; --size, ++p)
1223 {
1224 get_hex_byte(p);
1225 checksum += *p;
1226 }
1227
1228 get_hex_byte(&c);
1229 if (c != (~checksum & 0xff))
1230 error("bad s-rec checksum");
1231 }
1232
1233 done:
1234 expect_prompt();
1235 if (p != buffer + len)
1236 return(1);
1237
1238 memcpy(myaddr, buffer, len);
1239 return(0);
1240}
1241
5905161c
RP
1242#define MAX_BREAKS 16
1243static int num_brkpts = 0;
1244static int
1245bug_insert_breakpoint (addr, save)
1246 CORE_ADDR addr;
1247 char *save; /* Throw away, let bug save instructions */
1248{
1249 check_open ();
1250
1251 if (num_brkpts < MAX_BREAKS)
1252 {
1253 char buffer[100];
1254
1255 num_brkpts++;
1256 sprintf (buffer, "br %x", addr);
1257 bug_write_cr (buffer);
1258 expect_prompt ();
1259 return(0);
1260 }
1261 else
1262 {
1263 fprintf_filtered (stderr,
1264 "Too many break points, break point not installed\n");
1265 return(1);
1266 }
1267
1268}
1269static int
1270bug_remove_breakpoint (addr, save)
1271 CORE_ADDR addr;
1272 char *save; /* Throw away, let bug save instructions */
1273{
1274 if (num_brkpts > 0)
1275 {
1276 char buffer[100];
1277
1278 num_brkpts--;
1279 sprintf (buffer, "nobr %x", addr);
1280 bug_write_cr (buffer);
1281 expect_prompt ();
1282
1283 }
1284 return (0);
1285}
1286
1287/* Clear the bugs notion of what the break points are */
1288static int
1289bug_clear_breakpoints ()
1290{
1291
1292 if (is_open)
1293 {
1294 bug_write_cr ("nobr");
be58e87e 1295 expect("nobr");
5905161c
RP
1296 expect_prompt ();
1297 }
1298 num_brkpts = 0;
be58e87e 1299 return(0);
5905161c 1300}
be58e87e 1301
5905161c
RP
1302static void
1303bug_mourn ()
1304{
1305 bug_clear_breakpoints ();
1306 generic_mourn_inferior ();
1307}
1308
1309/* Put a command string, in args, out to the bug. The bug is assumed to
1310 be in raw mode, all writing/reading done through desc.
1311 Ouput from the bug is placed on the users terminal until the
1312 prompt from the bug is seen.
1313 FIXME: Can't handle commands that take input. */
1314
1315void
1316bug_com (args, fromtty)
1317 char *args;
1318 int fromtty;
1319{
1320 check_open ();
1321
1322 if (!args)
1323 return;
1324
1325 /* Clear all input so only command relative output is displayed */
1326
1327 bug_write_cr (args);
1328 bug_write ("\030", 1);
1329 expect_prompt ();
1330}
1331
be58e87e
RP
1332static void
1333bug_device (args, fromtty)
1334 char *args;
1335 int fromtty;
5905161c 1336{
be58e87e
RP
1337 if (args)
1338 dev_name = get_word (&args);
1339
1340 return;
5905161c
RP
1341}
1342
1343#if 0
1344static
1345bug_speed (s)
1346 char *s;
1347{
1348 check_open ();
1349
1350 if (s)
1351 {
1352 char buffer[100];
1353 int newrate = atoi (s);
1354 int which = 0;
1355
1356 if (SERIAL_SETBAUDRATE (desc, newrate))
1357 error ("Can't use %d baud\n", newrate);
1358
1359 printf_filtered ("Checking target is in sync\n");
1360
1361 printf_filtered ("Sending commands to set target to %d\n",
1362 baudrate);
1363
1364 sprintf (buffer, "tm %d. N 8 1", baudrate);
1365 bug_write_cr (buffer);
1366 }
1367}
1368#endif /* 0 */
1369
ae87844d 1370struct target_ops bug_ops =
5905161c
RP
1371{
1372 "bug", "Remote BUG monitor",
1373 "Use the mvme187 board running the BUG monitor connected\n\
1374by a serial line.",
1375
1376 bug_open, bug_close,
1377 0, bug_detach, bug_resume, bug_wait, /* attach */
1378 bug_fetch_register, bug_store_register,
1379 bug_prepare_to_store,
1380 bug_xfer_inferior_memory,
1381 bug_files_info,
1382 bug_insert_breakpoint, bug_remove_breakpoint, /* Breakpoints */
1383 0, 0, 0, 0, 0, /* Terminal handling */
1384 bug_kill, /* FIXME, kill */
1385 bug_load,
1386 0, /* lookup_symbol */
1387 bug_create_inferior, /* create_inferior */
1388 bug_mourn, /* mourn_inferior FIXME */
1389 0, /* can_run */
1390 0, /* notice_signals */
1391 process_stratum, 0, /* next */
1392 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */
1393 0, 0, /* Section pointers */
1394 OPS_MAGIC, /* Always the last thing */
1395};
1396
1397void
1398_initialize_remote_bug ()
1399{
1400 add_target (&bug_ops);
1401
1402 add_com ("bug <command>", class_obscure, bug_com,
1403 "Send a command to the BUG monitor.");
5905161c
RP
1404
1405 add_com ("device", class_obscure, bug_device,
1406 "Set the terminal line for BUG communications");
1407
1408#if 0
1409 add_com ("speed", class_obscure, bug_speed,
1410 "Set the terminal line speed for BUG communications");
1411#endif /* 0 */
1412
be58e87e
RP
1413 add_show_from_set
1414 (add_set_cmd ("srec-bytes", class_support, var_uinteger,
1415 (char *) &srec_bytes,
1416 "\
1417Set the number of bytes represented in each S-record.\n\
1418This affects the communication protocol with the remote target.",
1419 &setlist),
1420 &showlist);
1421
1422 add_show_from_set
1423 (add_set_cmd ("srec-max-retries", class_support, var_uinteger,
1424 (char *) &srec_max_retries,
1425 "\
1426Set the number of retries for shipping S-records.\n\
1427This affects the communication protocol with the remote target.",
1428 &setlist),
1429 &showlist);
1430
1431 add_show_from_set
1432 (add_set_cmd ("srec-frame", class_support, var_uinteger,
1433 (char *) &srec_frame,
1434 "\
1435Set the number of bytes in an S-record frame.\n\
1436This affects the communication protocol with the remote target.",
1437 &setlist),
1438 &showlist);
1439
1440 add_show_from_set
1441 (add_set_cmd ("srec-noise", class_support, var_zinteger,
1442 (char *) &srec_noise,
1443 "\
1444Set number of S-record to send before deliberately flubbing a checksum.\n\
1445Zero means flub none at all. This affects the communication protocol\n\
1446with the remote target.",
1447 &setlist),
1448 &showlist);
1449
1450 add_show_from_set
1451 (add_set_cmd ("srec-sleep", class_support, var_zinteger,
1452 (char *) &srec_sleep,
1453 "\
1454Set number of seconds to sleep after an S-record for a possible error message to arrive.\n\
1455This affects the communication protocol with the remote target.",
1456 &setlist),
1457 &showlist);
1458
1459 add_show_from_set
1460 (add_set_cmd ("srec-echo-pace", class_support, var_boolean,
1461 (char *) &srec_echo_pace,
1462 "\
1463Set echo-verification.\n\
1464When on, use verification by echo when downloading S-records. This is\n\
1465much slower, but generally more reliable.",
1466 &setlist),
1467 &showlist);
1468
5905161c
RP
1469 dev_name = NULL;
1470}
This page took 0.086054 seconds and 4 git commands to generate.