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