2000-12-19 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / remote-e7000.c
CommitLineData
c906108c 1/* Remote debugging interface for Hitachi E7000 ICE, for GDB
cc17453a 2 Copyright 1993, 1994, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
c906108c
SS
3 Contributed by Cygnus Support.
4
5 Written by Steve Chamberlain for Cygnus Support.
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
c5aa993b
JM
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
c906108c
SS
23
24/* The E7000 is an in-circuit emulator for the Hitachi H8/300-H and
25 Hitachi-SH processor. It has serial port and a lan port.
26
27 The monitor command set makes it difficult to load large ammounts of
28 data over the lan without using ftp - so try not to issue load
29 commands when communicating over ethernet; use the ftpload command.
30
31 The monitor pauses for a second when dumping srecords to the serial
32 line too, so we use a slower per byte mechanism but without the
33 startup overhead. Even so, it's pretty slow... */
34
35#include "defs.h"
36#include "gdbcore.h"
37#include "gdbarch.h"
38#include "inferior.h"
39#include "target.h"
03f2053f 40#include "gdb_wait.h"
c906108c
SS
41#include "value.h"
42#include "command.h"
43#include <signal.h>
44#include "gdb_string.h"
45#include "gdbcmd.h"
46#include <sys/types.h>
47#include "serial.h"
48#include "remote-utils.h"
49#include "symfile.h"
50#include <time.h>
51#include <ctype.h>
52
53
54#if 1
55#define HARD_BREAKPOINTS /* Now handled by set option. */
56#define BC_BREAKPOINTS use_hard_breakpoints
57#endif
58
59#define CTRLC 0x03
60#define ENQ 0x05
61#define ACK 0x06
62#define CTRLZ 0x1a
63
cc17453a
EZ
64/* This file is used by 2 different targets, sh-elf and h8300. The
65 h8300 is not multiarched and doesn't use the registers defined in
66 tm-sh.h. To avoid using a macro GDB_TARGET_IS_SH, we do runtime check
67 of the target, which requires that these namse below are always
68 defined also in the h8300 case. */
69
70#if !defined (PR_REGNUM)
71#define PR_REGNUM -1
72#endif
73#if !defined (GBR_REGNUM)
74#define GBR_REGNUM -1
75#endif
76#if !defined (VBR_REGNUM)
77#define VBR_REGNUM -1
78#endif
79#if !defined (MACH_REGNUM)
80#define MACH_REGNUM -1
81#endif
82#if !defined (MACL_REGNUM)
83#define MACL_REGNUM -1
84#endif
85#if !defined (SR_REGNUM)
86#define SR_REGNUM -1
87#endif
88
a14ed312 89extern void notice_quit (void);
c906108c 90
a14ed312 91extern void report_transfer_performance (unsigned long, time_t, time_t);
c906108c
SS
92
93extern char *sh_processor_type;
94
95/* Local function declarations. */
96
a14ed312 97static void e7000_close (int);
c906108c 98
a14ed312 99static void e7000_fetch_register (int);
c906108c 100
a14ed312 101static void e7000_store_register (int);
c906108c 102
a14ed312 103static void e7000_command (char *, int);
c906108c 104
a14ed312 105static void e7000_login_command (char *, int);
c906108c 106
a14ed312 107static void e7000_ftp_command (char *, int);
c906108c 108
a14ed312 109static void e7000_drain_command (char *, int);
c906108c 110
a14ed312 111static void expect (char *);
c906108c 112
a14ed312 113static void expect_full_prompt (void);
c906108c 114
a14ed312 115static void expect_prompt (void);
c906108c 116
a14ed312 117static int e7000_parse_device (char *args, char *dev_name, int baudrate);
c906108c
SS
118/* Variables. */
119
120static serial_t e7000_desc;
121
122/* Allow user to chose between using hardware breakpoints or memory. */
c5aa993b 123static int use_hard_breakpoints = 0; /* use sw breakpoints by default */
c906108c
SS
124
125/* Nonzero if using the tcp serial driver. */
126
c5aa993b 127static int using_tcp; /* direct tcp connection to target */
c906108c
SS
128static int using_tcp_remote; /* indirect connection to target
129 via tcp to controller */
130
131/* Nonzero if using the pc isa card. */
132
133static int using_pc;
134
135extern struct target_ops e7000_ops; /* Forward declaration */
136
137char *ENQSTRING = "\005";
138
139/* Nonzero if some routine (as opposed to the user) wants echoing.
140 FIXME: Do this reentrantly with an extra parameter. */
141
142static int echo;
143
144static int ctrl_c;
145
146static int timeout = 20;
147
148/* Send data to e7000debug. */
149
150static void
fba45db2 151puts_e7000debug (char *buf)
c906108c
SS
152{
153 if (!e7000_desc)
154 error ("Use \"target e7000 ...\" first.");
155
156 if (remote_debug)
157 printf_unfiltered ("Sending %s\n", buf);
158
159 if (SERIAL_WRITE (e7000_desc, buf, strlen (buf)))
160 fprintf_unfiltered (gdb_stderr, "SERIAL_WRITE failed: %s\n", safe_strerror (errno));
161
162 /* And expect to see it echoed, unless using the pc interface */
163#if 0
164 if (!using_pc)
165#endif
166 expect (buf);
167}
168
169static void
fba45db2 170putchar_e7000 (int x)
c906108c
SS
171{
172 char b[1];
173
174 b[0] = x;
175 SERIAL_WRITE (e7000_desc, b, 1);
176}
177
178static void
fba45db2 179write_e7000 (char *s)
c906108c
SS
180{
181 SERIAL_WRITE (e7000_desc, s, strlen (s));
182}
183
184static int
fba45db2 185normal (int x)
c906108c
SS
186{
187 if (x == '\n')
188 return '\r';
189 return x;
190}
191
192/* Read a character from the remote system, doing all the fancy timeout
193 stuff. Handles serial errors and EOF. If TIMEOUT == 0, and no chars,
194 returns -1, else returns next char. Discards chars > 127. */
195
196static int
fba45db2 197readchar (int timeout)
c906108c
SS
198{
199 int c;
200
201 do
202 {
203 c = SERIAL_READCHAR (e7000_desc, timeout);
204 }
205 while (c > 127);
206
207 if (c == SERIAL_TIMEOUT)
208 {
209 if (timeout == 0)
210 return -1;
211 echo = 0;
212 error ("Timeout reading from remote system.");
213 }
214 else if (c < 0)
215 error ("Serial communication error");
216
c5aa993b 217 if (remote_debug)
c906108c
SS
218 {
219 putchar_unfiltered (c);
220 gdb_flush (gdb_stdout);
221 }
222
223 return normal (c);
224}
225
226#if 0
227char *
fba45db2 228tl (int x)
c906108c
SS
229{
230 static char b[8][10];
231 static int p;
232
233 p++;
234 p &= 7;
c5aa993b
JM
235 if (x >= ' ')
236 {
c906108c
SS
237 b[p][0] = x;
238 b[p][1] = 0;
239 }
240 else
241 {
c5aa993b 242 sprintf (b[p], "<%d>", x);
c906108c
SS
243 }
244
245 return b[p];
246}
247#endif
248
249/* Scan input from the remote system, until STRING is found. If
250 DISCARD is non-zero, then discard non-matching input, else print it
251 out. Let the user break out immediately. */
252
253static void
fba45db2 254expect (char *string)
c906108c
SS
255{
256 char *p = string;
257 int c;
258 int nl = 0;
259
260 while (1)
261 {
262 c = readchar (timeout);
263#if 0
264 notice_quit ();
c5aa993b 265 if (quit_flag == 1)
c906108c
SS
266 {
267 if (ctrl_c)
268 {
c5aa993b 269 putchar_e7000 (CTRLC);
c906108c
SS
270 --ctrl_c;
271 }
c5aa993b 272 else
c906108c
SS
273 {
274 quit ();
275 }
276 }
277#endif
c5aa993b 278
c906108c
SS
279 if (echo)
280 {
281 if (c == '\r' || c == '\n')
282 {
283 if (!nl)
284 putchar_unfiltered ('\n');
285 nl = 1;
286 }
287 else
288 {
289 nl = 0;
290 putchar_unfiltered (c);
291 }
292 gdb_flush (gdb_stdout);
293 }
294 if (normal (c) == normal (*p++))
295 {
296 if (*p == '\0')
297 return;
298 }
299 else
300 {
301 p = string;
302
303 if (normal (c) == normal (string[0]))
304 p++;
305 }
306 }
307}
308
309/* Keep discarding input until we see the e7000 prompt.
310
311 The convention for dealing with the prompt is that you
312 o give your command
313 o *then* wait for the prompt.
314
315 Thus the last thing that a procedure does with the serial line will
316 be an expect_prompt(). Exception: e7000_resume does not wait for
317 the prompt, because the terminal is being handed over to the
318 inferior. However, the next thing which happens after that is a
319 e7000_wait which does wait for the prompt. Note that this includes
320 abnormal exit, e.g. error(). This is necessary to prevent getting
321 into states from which we can't recover. */
322
323static void
fba45db2 324expect_prompt (void)
c906108c
SS
325{
326 expect (":");
327}
328
329static void
fba45db2 330expect_full_prompt (void)
c906108c
SS
331{
332 expect ("\r:");
333}
334
335static int
fba45db2 336convert_hex_digit (int ch)
c906108c
SS
337{
338 if (ch >= '0' && ch <= '9')
339 return ch - '0';
340 else if (ch >= 'A' && ch <= 'F')
341 return ch - 'A' + 10;
342 else if (ch >= 'a' && ch <= 'f')
343 return ch - 'a' + 10;
344 return -1;
345}
346
347static int
fba45db2 348get_hex (int *start)
c906108c
SS
349{
350 int value = convert_hex_digit (*start);
351 int try;
352
353 *start = readchar (timeout);
354 while ((try = convert_hex_digit (*start)) >= 0)
355 {
356 value <<= 4;
357 value += try;
358 *start = readchar (timeout);
359 }
360 return value;
361}
362
363#if 0
364/* Get N 32-bit words from remote, each preceded by a space, and put
365 them in registers starting at REGNO. */
366
367static void
fba45db2 368get_hex_regs (int n, int regno)
c906108c
SS
369{
370 long val;
371 int i;
372
373 for (i = 0; i < n; i++)
374 {
375 int j;
376
377 val = 0;
378 for (j = 0; j < 8; j++)
379 val = (val << 4) + get_hex_digit (j == 0);
380 supply_register (regno++, (char *) &val);
381 }
382}
383#endif
384
385/* This is called not only when we first attach, but also when the
386 user types "run" after having attached. */
387
388static void
fba45db2 389e7000_create_inferior (char *execfile, char *args, char **env)
c906108c
SS
390{
391 int entry_pt;
392
393 if (args && *args)
394 error ("Can't pass arguments to remote E7000DEBUG process");
395
396 if (execfile == 0 || exec_bfd == 0)
397 error ("No executable file specified");
398
399 entry_pt = (int) bfd_get_start_address (exec_bfd);
400
401#ifdef CREATE_INFERIOR_HOOK
402 CREATE_INFERIOR_HOOK (0); /* No process-ID */
403#endif
404
405 /* The "process" (board) is already stopped awaiting our commands, and
406 the program is already downloaded. We just set its PC and go. */
407
408 clear_proceed_status ();
409
410 /* Tell wait_for_inferior that we've started a new process. */
411 init_wait_for_inferior ();
412
413 /* Set up the "saved terminal modes" of the inferior
414 based on what modes we are starting it with. */
415 target_terminal_init ();
416
417 /* Install inferior's terminal modes. */
418 target_terminal_inferior ();
419
420 /* insert_step_breakpoint (); FIXME, do we need this? */
421 proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */
422}
423
424/* Open a connection to a remote debugger. NAME is the filename used
425 for communication. */
426
427static int baudrate = 9600;
428static char dev_name[100];
429
430static char *machine = "";
431static char *user = "";
432static char *passwd = "";
433static char *dir = "";
434
435/* Grab the next token and buy some space for it */
436
437static char *
fba45db2 438next (char **ptr)
c906108c
SS
439{
440 char *p = *ptr;
441 char *s;
442 char *r;
443 int l = 0;
444
445 while (*p && *p == ' ')
446 p++;
447 s = p;
448 while (*p && (*p != ' ' && *p != '\t'))
449 {
450 l++;
451 p++;
452 }
453 r = xmalloc (l + 1);
454 memcpy (r, s, l);
455 r[l] = 0;
456 *ptr = p;
457 return r;
458}
459
460static void
fba45db2 461e7000_login_command (char *args, int from_tty)
c906108c
SS
462{
463 if (args)
464 {
465 machine = next (&args);
466 user = next (&args);
467 passwd = next (&args);
468 dir = next (&args);
469 if (from_tty)
470 {
471 printf_unfiltered ("Set info to %s %s %s %s\n", machine, user, passwd, dir);
472 }
473 }
474 else
475 {
476 error ("Syntax is ftplogin <machine> <user> <passwd> <directory>");
477 }
478}
479
480/* Start an ftp transfer from the E7000 to a host */
481
482static void
fba45db2 483e7000_ftp_command (char *args, int from_tty)
c906108c
SS
484{
485 /* FIXME: arbitrary limit on machine names and such. */
486 char buf[200];
487
488 int oldtimeout = timeout;
489 timeout = remote_timeout;
490
491 sprintf (buf, "ftp %s\r", machine);
492 puts_e7000debug (buf);
493 expect (" Username : ");
494 sprintf (buf, "%s\r", user);
495 puts_e7000debug (buf);
496 expect (" Password : ");
497 write_e7000 (passwd);
498 write_e7000 ("\r");
499 expect ("success\r");
500 expect ("FTP>");
501 sprintf (buf, "cd %s\r", dir);
502 puts_e7000debug (buf);
503 expect ("FTP>");
504 sprintf (buf, "ll 0;s:%s\r", args);
505 puts_e7000debug (buf);
506 expect ("FTP>");
507 puts_e7000debug ("bye\r");
508 expect (":");
509 timeout = oldtimeout;
510}
511
c5aa993b 512static int
fba45db2 513e7000_parse_device (char *args, char *dev_name, int baudrate)
c906108c
SS
514{
515 char junk[128];
516 int n = 0;
517 if (args && strcasecmp (args, "pc") == 0)
518 {
519 strcpy (dev_name, args);
520 using_pc = 1;
521 }
c5aa993b 522 else
c906108c
SS
523 {
524 /* FIXME! temp hack to allow use with port master -
c5aa993b
JM
525 target tcp_remote <device> */
526 if (args && strncmp (args, "tcp", 10) == 0)
527 {
c906108c
SS
528 char com_type[128];
529 n = sscanf (args, " %s %s %d %s", com_type, dev_name, &baudrate, junk);
c5aa993b 530 using_tcp_remote = 1;
c906108c 531 n--;
c5aa993b
JM
532 }
533 else if (args)
c906108c
SS
534 {
535 n = sscanf (args, " %s %d %s", dev_name, &baudrate, junk);
536 }
537
538 if (n != 1 && n != 2)
539 {
540 error ("Bad arguments. Usage:\ttarget e7000 <device> <speed>\n\
541or \t\ttarget e7000 <host>[:<port>]\n\
542or \t\ttarget e7000 tcp_remote <host>[:<port>]\n\
543or \t\ttarget e7000 pc\n");
544 }
545
546#if !defined(__GO32__) && !defined(_WIN32)
547 /* FIXME! test for ':' is ambiguous */
548 if (n == 1 && strchr (dev_name, ':') == 0)
549 {
550 /* Default to normal telnet port */
551 /* serial_open will use this to determine tcp communication */
552 strcat (dev_name, ":23");
553 }
554#endif
555 if (!using_tcp_remote && strchr (dev_name, ':'))
c5aa993b 556 using_tcp = 1;
c906108c
SS
557 }
558
559 return n;
560}
561
562/* Stub for catch_errors. */
563
564static int
34e9d9bb 565e7000_start_remote (void *dummy)
c906108c
SS
566{
567 int loop;
568 int sync;
569 int try;
570 int quit_trying;
571
8edbea78 572 immediate_quit++; /* Allow user to interrupt it */
c906108c
SS
573
574 /* Hello? Are you there? */
575 sync = 0;
c5aa993b 576 loop = 0;
c906108c
SS
577 try = 0;
578 quit_trying = 20;
579 putchar_e7000 (CTRLC);
580 while (!sync && ++try <= quit_trying)
581 {
582 int c;
583
584 printf_unfiltered ("[waiting for e7000...]\n");
585
586 write_e7000 ("\r");
587 c = readchar (1);
588
589 /* FIXME! this didn't seem right-> while (c != SERIAL_TIMEOUT)
590 * we get stuck in this loop ...
591 * We may never timeout, and never sync up :-(
592 */
593 while (!sync && c != -1)
594 {
595 /* Dont echo cr's */
596 if (c != '\r')
597 {
598 putchar_unfiltered (c);
599 gdb_flush (gdb_stdout);
600 }
601 /* Shouldn't we either break here, or check for sync in inner loop? */
602 if (c == ':')
603 sync = 1;
604
c5aa993b 605 if (loop++ == 20)
c906108c
SS
606 {
607 putchar_e7000 (CTRLC);
608 loop = 0;
609 }
610
c5aa993b 611 QUIT;
c906108c
SS
612
613 if (quit_flag)
614 {
615 putchar_e7000 (CTRLC);
616 /* Was-> quit_flag = 0; */
617 c = -1;
c5aa993b 618 quit_trying = try + 1; /* we don't want to try anymore */
c906108c
SS
619 }
620 else
621 {
622 c = readchar (1);
623 }
624 }
625 }
626
627 if (!sync)
628 {
c5aa993b 629 fprintf_unfiltered (gdb_stderr, "Giving up after %d tries...\n", try);
8e1a459b 630 error ("Unable to synchronize with target.\n");
c906108c
SS
631 }
632
633 puts_e7000debug ("\r");
634 expect_prompt ();
635 puts_e7000debug ("b -\r"); /* Clear breakpoints */
636 expect_prompt ();
637
8edbea78 638 immediate_quit--;
c906108c
SS
639
640/* This is really the job of start_remote however, that makes an assumption
641 that the target is about to print out a status message of some sort. That
642 doesn't happen here. */
643
644 flush_cached_frames ();
645 registers_changed ();
646 stop_pc = read_pc ();
647 set_current_frame (create_new_frame (read_fp (), stop_pc));
648 select_frame (get_current_frame (), 0);
649 print_stack_frame (selected_frame, -1, 1);
650
651 return 1;
652}
653
654static void
fba45db2 655e7000_open (char *args, int from_tty)
c906108c
SS
656{
657 int n;
658
659 target_preopen (from_tty);
660
661 n = e7000_parse_device (args, dev_name, baudrate);
662
663 push_target (&e7000_ops);
664
665 e7000_desc = SERIAL_OPEN (dev_name);
666
667 if (!e7000_desc)
668 perror_with_name (dev_name);
669
670 SERIAL_SETBAUDRATE (e7000_desc, baudrate);
671 SERIAL_RAW (e7000_desc);
672
673#ifdef GDB_TARGET_IS_H8300
674 h8300hmode = 1;
675#endif
676
677 /* Start the remote connection; if error (0), discard this target.
678 In particular, if the user quits, be sure to discard it
679 (we'd be in an inconsistent state otherwise). */
c5aa993b
JM
680 if (!catch_errors (e7000_start_remote, (char *) 0,
681 "Couldn't establish connection to remote target\n", RETURN_MASK_ALL))
682 if (from_tty)
683 printf_filtered ("Remote target %s connected to %s\n", target_shortname,
684 dev_name);
c906108c
SS
685}
686
687/* Close out all files and local state before this target loses control. */
688
689static void
fba45db2 690e7000_close (int quitting)
c906108c
SS
691{
692 if (e7000_desc)
693 {
694 SERIAL_CLOSE (e7000_desc);
695 e7000_desc = 0;
696 }
697}
698
699/* Terminate the open connection to the remote debugger. Use this
700 when you want to detach and do something else with your gdb. */
701
702static void
55d80160 703e7000_detach (char *arg, int from_tty)
c906108c
SS
704{
705 pop_target (); /* calls e7000_close to do the real work */
706 if (from_tty)
707 printf_unfiltered ("Ending remote %s debugging\n", target_shortname);
708}
709
710/* Tell the remote machine to resume. */
711
712static void
55d80160 713e7000_resume (int pid, int step, enum target_signal sigal)
c906108c
SS
714{
715 if (step)
716 puts_e7000debug ("S\r");
717 else
718 puts_e7000debug ("G\r");
719}
720
721/* Read the remote registers into the block REGS.
722
723 For the H8/300 a register dump looks like:
724
725 PC=00021A CCR=80:I*******
726 ER0 - ER3 0000000A 0000002E 0000002E 00000000
727 ER4 - ER7 00000000 00000000 00000000 00FFEFF6
728 000218 MOV.B R1L,R2L
729 STEP NORMAL END or
730 BREAK POINT
c5aa993b 731 */
c906108c 732
c906108c
SS
733char *want_h8300h = "PC=%p CCR=%c\n\
734 ER0 - ER3 %0 %1 %2 %3\n\
735 ER4 - ER7 %4 %5 %6 %7\n";
736
737char *want_nopc_h8300h = "%p CCR=%c\n\
738 ER0 - ER3 %0 %1 %2 %3\n\
739 ER4 - ER7 %4 %5 %6 %7";
740
741char *want_h8300s = "PC=%p CCR=%c\n\
742 MACH=\n\
743 ER0 - ER3 %0 %1 %2 %3\n\
744 ER4 - ER7 %4 %5 %6 %7\n";
745
746char *want_nopc_h8300s = "%p CCR=%c EXR=%9\n\
747 ER0 - ER3 %0 %1 %2 %3\n\
748 ER4 - ER7 %4 %5 %6 %7";
749
cc17453a 750char *want_sh = "PC=%16 SR=%22\n\
c906108c
SS
751PR=%17 GBR=%18 VBR=%19\n\
752MACH=%20 MACL=%21\n\
753R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
754R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n";
755
cc17453a 756char *want_nopc_sh = "%16 SR=%22\n\
c906108c
SS
757 PR=%17 GBR=%18 VBR=%19\n\
758 MACH=%20 MACL=%21\n\
759 R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
760 R8-15 %8 %9 %10 %11 %12 %13 %14 %15";
761
762char *want_sh3 = "PC=%16 SR=%22\n\
763PR=%17 GBR=%18 VBR=%19\n\
764MACH=%20 MACL=%21 SSR=%23 SPC=%24\n\
765R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
766R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n\
767R0_BANK0-R3_BANK0 %25 %26 %27 %28\n\
768R4_BANK0-R7_BANK0 %29 %30 %31 %32\n\
769R0_BANK1-R3_BANK1 %33 %34 %35 %36\n\
770R4_BANK1-R7_BANK1 %37 %38 %39 %40";
771
cc17453a 772char *want_nopc_sh3 = "%16 SR=%22\n\
c906108c
SS
773 PR=%17 GBR=%18 VBR=%19\n\
774 MACH=%20 MACL=%21 SSR=%22 SPC=%23\n\
775 R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
776 R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n\
777 R0_BANK0-R3_BANK0 %25 %26 %27 %28\n\
778 R4_BANK0-R7_BANK0 %29 %30 %31 %32\n\
779 R0_BANK1-R3_BANK1 %33 %34 %35 %36\n\
780 R4_BANK1-R7_BANK1 %37 %38 %39 %40";
781
c906108c 782static int
fba45db2 783gch (void)
c906108c
SS
784{
785 return readchar (timeout);
786}
787
788static unsigned int
fba45db2 789gbyte (void)
c906108c
SS
790{
791 int high = convert_hex_digit (gch ());
792 int low = convert_hex_digit (gch ());
793
794 return (high << 4) + low;
795}
796
797void
69dc947a 798fetch_regs_from_dump (int (*nextchar) (), char *want)
c906108c
SS
799{
800 int regno;
801 char buf[MAX_REGISTER_RAW_SIZE];
802
803 int thischar = nextchar ();
804
805 while (*want)
806 {
807 switch (*want)
808 {
809 case '\n':
810 /* Skip to end of line and then eat all new line type stuff */
c5aa993b 811 while (thischar != '\n' && thischar != '\r')
c906108c 812 thischar = nextchar ();
c5aa993b 813 while (thischar == '\n' || thischar == '\r')
c906108c
SS
814 thischar = nextchar ();
815 want++;
816 break;
817
818 case ' ':
819 while (thischar == ' '
820 || thischar == '\t'
821 || thischar == '\r'
822 || thischar == '\n')
823 thischar = nextchar ();
824 want++;
825 break;
c5aa993b 826
c906108c
SS
827 default:
828 if (*want == thischar)
829 {
830 want++;
831 if (*want)
832 thischar = nextchar ();
c5aa993b 833
c906108c
SS
834 }
835 else if (thischar == ' ' || thischar == '\n' || thischar == '\r')
836 {
837 thischar = nextchar ();
838 }
c5aa993b
JM
839 else
840 {
841 error ("out of sync in fetch registers wanted <%s>, got <%c 0x%x>",
842 want, thischar, thischar);
843 }
844
c906108c
SS
845 break;
846 case '%':
847 /* Got a register command */
848 want++;
849 switch (*want)
850 {
851#ifdef PC_REGNUM
852 case 'p':
853 regno = PC_REGNUM;
854 want++;
855 break;
856#endif
857#ifdef CCR_REGNUM
858 case 'c':
859 regno = CCR_REGNUM;
860 want++;
861 break;
862#endif
863#ifdef SP_REGNUM
864 case 's':
865 regno = SP_REGNUM;
866 want++;
867 break;
868#endif
869#ifdef FP_REGNUM
870 case 'f':
871 regno = FP_REGNUM;
872 want++;
873 break;
874#endif
875
876 default:
c5aa993b 877 if (isdigit (want[0]))
c906108c
SS
878 {
879 if (isdigit (want[1]))
880 {
881 regno = (want[0] - '0') * 10 + want[1] - '0';
882 want += 2;
883 }
c5aa993b 884 else
c906108c
SS
885 {
886 regno = want[0] - '0';
887 want++;
888 }
889 }
c5aa993b 890
c906108c
SS
891 else
892 abort ();
893 }
894 store_signed_integer (buf,
c5aa993b 895 REGISTER_RAW_SIZE (regno),
34e9d9bb 896 (LONGEST) get_hex (&thischar));
c906108c
SS
897 supply_register (regno, buf);
898 break;
899 }
900 }
901}
902
903static void
fba45db2 904e7000_fetch_registers (void)
c906108c
SS
905{
906 int regno;
907 char *wanted;
908
909 puts_e7000debug ("R\r");
910
c906108c 911 if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
cc17453a
EZ
912 {
913 wanted = want_sh;
914 switch (TARGET_ARCHITECTURE->mach)
915 {
916 case bfd_mach_sh3:
917 case bfd_mach_sh3e:
918 case bfd_mach_sh4:
919 wanted = want_sh3;
920 }
921 }
922#ifdef GDB_TARGET_IS_H8300
923 if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
924 {
925 if (h8300smode)
926 wanted = want_h8300s;
927 else
928 wanted = want_h8300h;
929 }
c906108c 930#endif
cc17453a 931
c906108c
SS
932 fetch_regs_from_dump (gch, wanted);
933
934 /* And supply the extra ones the simulator uses */
935 for (regno = NUM_REALREGS; regno < NUM_REGS; regno++)
936 {
937 int buf = 0;
938
939 supply_register (regno, (char *) (&buf));
940 }
941}
942
943/* Fetch register REGNO, or all registers if REGNO is -1. Returns
944 errno value. */
945
946static void
fba45db2 947e7000_fetch_register (int regno)
c906108c
SS
948{
949 e7000_fetch_registers ();
950}
951
952/* Store the remote registers from the contents of the block REGS. */
953
954static void
fba45db2 955e7000_store_registers (void)
c906108c
SS
956{
957 int regno;
958
959 for (regno = 0; regno < NUM_REALREGS; regno++)
960 e7000_store_register (regno);
961
962 registers_changed ();
963}
964
965/* Store register REGNO, or all if REGNO == 0. Return errno value. */
966
967static void
fba45db2 968e7000_store_register (int regno)
c906108c
SS
969{
970 char buf[200];
971
972 if (regno == -1)
973 {
974 e7000_store_registers ();
975 return;
976 }
977
cc17453a 978 if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
c906108c 979 {
cc17453a
EZ
980 if (regno <= 7)
981 {
982 sprintf (buf, ".ER%d %lx\r", regno, read_register (regno));
983 puts_e7000debug (buf);
984 }
985 else if (regno == PC_REGNUM)
986 {
987 sprintf (buf, ".PC %lx\r", read_register (regno));
988 puts_e7000debug (buf);
989 }
990#ifdef CCR_REGNUM
991 else if (regno == CCR_REGNUM)
992 {
993 sprintf (buf, ".CCR %lx\r", read_register (regno));
994 puts_e7000debug (buf);
995 }
996#endif
c906108c 997 }
c906108c 998
cc17453a 999 else if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
c906108c 1000 {
cc17453a
EZ
1001 if (regno == PC_REGNUM)
1002 {
1003 sprintf (buf, ".PC %lx\r", read_register (regno));
1004 puts_e7000debug (buf);
1005 }
c906108c 1006
cc17453a
EZ
1007 else if (regno == SR_REGNUM)
1008 {
1009 sprintf (buf, ".SR %lx\r", read_register (regno));
1010 puts_e7000debug (buf);
1011 }
c906108c 1012
cc17453a
EZ
1013 else if (regno == PR_REGNUM)
1014 {
1015 sprintf (buf, ".PR %lx\r", read_register (regno));
1016 puts_e7000debug (buf);
1017 }
c906108c 1018
cc17453a
EZ
1019 else if (regno == GBR_REGNUM)
1020 {
1021 sprintf (buf, ".GBR %lx\r", read_register (regno));
1022 puts_e7000debug (buf);
1023 }
c906108c 1024
cc17453a
EZ
1025 else if (regno == VBR_REGNUM)
1026 {
1027 sprintf (buf, ".VBR %lx\r", read_register (regno));
1028 puts_e7000debug (buf);
1029 }
c906108c 1030
cc17453a
EZ
1031 else if (regno == MACH_REGNUM)
1032 {
1033 sprintf (buf, ".MACH %lx\r", read_register (regno));
1034 puts_e7000debug (buf);
1035 }
c906108c 1036
cc17453a
EZ
1037 else if (regno == MACL_REGNUM)
1038 {
1039 sprintf (buf, ".MACL %lx\r", read_register (regno));
1040 puts_e7000debug (buf);
1041 }
1042 else
1043 {
1044 sprintf (buf, ".R%d %lx\r", regno, read_register (regno));
1045 puts_e7000debug (buf);
1046 }
c906108c
SS
1047 }
1048
c906108c
SS
1049 expect_prompt ();
1050}
1051
1052/* Get ready to modify the registers array. On machines which store
1053 individual registers, this doesn't need to do anything. On machines
1054 which store all the registers in one fell swoop, this makes sure
1055 that registers contains all the registers from the program being
1056 debugged. */
1057
1058static void
fba45db2 1059e7000_prepare_to_store (void)
c906108c
SS
1060{
1061 /* Do nothing, since we can store individual regs */
1062}
1063
1064static void
55d80160 1065e7000_files_info (struct target_ops *ops)
c906108c
SS
1066{
1067 printf_unfiltered ("\tAttached to %s at %d baud.\n", dev_name, baudrate);
1068}
1069
1070static int
fba45db2 1071stickbyte (char *where, unsigned int what)
c906108c
SS
1072{
1073 static CONST char digs[] = "0123456789ABCDEF";
1074
1075 where[0] = digs[(what >> 4) & 0xf];
1076 where[1] = digs[(what & 0xf) & 0xf];
1077
1078 return what;
1079}
1080
1081/* Write a small ammount of memory. */
1082
1083static int
fba45db2 1084write_small (CORE_ADDR memaddr, unsigned char *myaddr, int len)
c906108c
SS
1085{
1086 int i;
1087 char buf[200];
1088
1089 for (i = 0; i < len; i++)
1090 {
1091 if (((memaddr + i) & 3) == 0 && (i + 3 < len))
1092 {
1093 /* Can be done with a long word */
cc17453a 1094 sprintf (buf, "m %lx %x%02x%02x%02x;l\r",
c906108c
SS
1095 memaddr + i,
1096 myaddr[i], myaddr[i + 1], myaddr[i + 2], myaddr[i + 3]);
1097 puts_e7000debug (buf);
1098 i += 3;
1099 }
1100 else
1101 {
cc17453a 1102 sprintf (buf, "m %lx %x\r", memaddr + i, myaddr[i]);
c906108c
SS
1103 puts_e7000debug (buf);
1104 }
1105 }
1106
1107 expect_prompt ();
1108
1109 return len;
1110}
1111
1112/* Write a large ammount of memory, this only works with the serial
1113 mode enabled. Command is sent as
1114
c5aa993b
JM
1115 il ;s:s\r ->
1116 <- il ;s:s\r
1117 <- ENQ
1118 ACK ->
1119 <- LO s\r
1120 Srecords...
1121 ^Z ->
1122 <- ENQ
1123 ACK ->
1124 <- :
1125 */
c906108c
SS
1126
1127static int
fba45db2 1128write_large (CORE_ADDR memaddr, unsigned char *myaddr, int len)
c906108c
SS
1129{
1130 int i;
1131#define maxstride 128
1132 int stride;
1133
1134 puts_e7000debug ("IL ;S:FK\r");
1135 expect (ENQSTRING);
1136 putchar_e7000 (ACK);
1137 expect ("LO FK\r");
1138
1139 for (i = 0; i < len; i += stride)
1140 {
1141 char compose[maxstride * 2 + 50];
1142 int address = i + memaddr;
1143 int j;
1144 int check_sum;
1145 int where = 0;
1146 int alen;
1147
1148 stride = len - i;
1149 if (stride > maxstride)
1150 stride = maxstride;
1151
1152 compose[where++] = 'S';
1153 check_sum = 0;
1154 if (address >= 0xffffff)
1155 alen = 4;
1156 else if (address >= 0xffff)
1157 alen = 3;
1158 else
1159 alen = 2;
1160 /* Insert type. */
1161 compose[where++] = alen - 1 + '0';
1162 /* Insert length. */
1163 check_sum += stickbyte (compose + where, alen + stride + 1);
1164 where += 2;
1165 while (alen > 0)
1166 {
1167 alen--;
1168 check_sum += stickbyte (compose + where, address >> (8 * (alen)));
1169 where += 2;
1170 }
1171
1172 for (j = 0; j < stride; j++)
1173 {
1174 check_sum += stickbyte (compose + where, myaddr[i + j]);
1175 where += 2;
1176 }
1177 stickbyte (compose + where, ~check_sum);
1178 where += 2;
1179 compose[where++] = '\r';
1180 compose[where++] = '\n';
1181 compose[where++] = 0;
1182
1183 SERIAL_WRITE (e7000_desc, compose, where);
1184 j = readchar (0);
1185 if (j == -1)
1186 {
1187 /* This is ok - nothing there */
1188 }
1189 else if (j == ENQ)
1190 {
1191 /* Hmm, it's trying to tell us something */
1192 expect (":");
1193 error ("Error writing memory");
1194 }
1195 else
1196 {
1197 printf_unfiltered ("@%d}@", j);
c5aa993b 1198 while ((j = readchar (0)) > 0)
c906108c 1199 {
c5aa993b 1200 printf_unfiltered ("@{%d}@", j);
c906108c
SS
1201 }
1202 }
1203 }
1204
1205 /* Send the trailer record */
1206 write_e7000 ("S70500000000FA\r");
1207 putchar_e7000 (CTRLZ);
1208 expect (ENQSTRING);
1209 putchar_e7000 (ACK);
1210 expect (":");
1211
1212 return len;
1213}
1214
1215/* Copy LEN bytes of data from debugger memory at MYADDR to inferior's
1216 memory at MEMADDR. Returns length moved.
1217
1218 Can't use the Srecord load over ethernet, so don't use fast method
1219 then. */
1220
1221static int
fba45db2 1222e7000_write_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
c906108c
SS
1223{
1224 if (len < 16 || using_tcp || using_pc)
1225 return write_small (memaddr, myaddr, len);
1226 else
1227 return write_large (memaddr, myaddr, len);
1228}
1229
1230/* Read LEN bytes from inferior memory at MEMADDR. Put the result
1231 at debugger address MYADDR. Returns length moved.
1232
c5aa993b
JM
1233 Small transactions we send
1234 m <addr>;l
1235 and receive
1236 00000000 12345678 ?
c906108c
SS
1237 */
1238
1239static int
fba45db2 1240e7000_read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
c906108c
SS
1241{
1242 int count;
1243 int c;
1244 int i;
1245 char buf[200];
1246 /* Starting address of this pass. */
1247
c5aa993b 1248/* printf("READ INF %x %x %d\n", memaddr, myaddr, len); */
c906108c
SS
1249 if (((memaddr - 1) + len) < memaddr)
1250 {
1251 errno = EIO;
1252 return 0;
1253 }
1254
cc17453a 1255 sprintf (buf, "m %lx;l\r", memaddr);
c906108c
SS
1256 puts_e7000debug (buf);
1257
c5aa993b 1258 for (count = 0; count < len; count += 4)
c906108c
SS
1259 {
1260 /* Suck away the address */
c5aa993b 1261 c = gch ();
c906108c 1262 while (c != ' ')
c5aa993b 1263 c = gch ();
c906108c 1264 c = gch ();
c5aa993b 1265 if (c == '*')
c906108c 1266 { /* Some kind of error */
c5aa993b
JM
1267 puts_e7000debug (".\r"); /* Some errors leave us in memory input mode */
1268 expect_full_prompt ();
c906108c
SS
1269 return -1;
1270 }
1271 while (c != ' ')
c5aa993b 1272 c = gch ();
c906108c
SS
1273
1274 /* Now read in the data */
c5aa993b 1275 for (i = 0; i < 4; i++)
c906108c 1276 {
c5aa993b
JM
1277 int b = gbyte ();
1278 if (count + i < len)
1279 {
1280 myaddr[count + i] = b;
1281 }
c906108c
SS
1282 }
1283
1284 /* Skip the trailing ? and send a . to end and a cr for more */
c5aa993b 1285 gch ();
c906108c
SS
1286 gch ();
1287 if (count + 4 >= len)
c5aa993b 1288 puts_e7000debug (".\r");
c906108c 1289 else
c5aa993b 1290 puts_e7000debug ("\r");
c906108c
SS
1291
1292 }
c5aa993b 1293 expect_prompt ();
c906108c
SS
1294 return len;
1295}
1296
1297
1298
1299/*
c5aa993b 1300 For large transfers we used to send
c906108c
SS
1301
1302
c5aa993b 1303 d <addr> <endaddr>\r
c906108c 1304
c5aa993b 1305 and receive
c906108c
SS
1306 <ADDRESS> < D A T A > < ASCII CODE >
1307 00000000 5F FD FD FF DF 7F DF FF 01 00 01 00 02 00 08 04 "_..............."
1308 00000010 FF D7 FF 7F D7 F1 7F FF 00 05 00 00 08 00 40 00 "..............@."
1309 00000020 7F FD FF F7 7F FF FF F7 00 00 00 00 00 00 00 00 "................"
1310
c5aa993b 1311 A cost in chars for each transaction of 80 + 5*n-bytes.
c906108c 1312
c5aa993b
JM
1313 Large transactions could be done with the srecord load code, but
1314 there is a pause for a second before dumping starts, which slows the
1315 average rate down!
1316 */
c906108c
SS
1317
1318static int
fba45db2
KB
1319e7000_read_inferior_memory_large (CORE_ADDR memaddr, unsigned char *myaddr,
1320 int len)
c906108c
SS
1321{
1322 int count;
1323 int c;
1324 char buf[200];
1325
1326 /* Starting address of this pass. */
1327
1328 if (((memaddr - 1) + len) < memaddr)
1329 {
1330 errno = EIO;
1331 return 0;
1332 }
1333
cc17453a 1334 sprintf (buf, "d %lx %lx\r", memaddr, memaddr + len - 1);
c906108c
SS
1335 puts_e7000debug (buf);
1336
1337 count = 0;
1338 c = gch ();
c5aa993b 1339
c906108c 1340 /* skip down to the first ">" */
c5aa993b 1341 while (c != '>')
c906108c
SS
1342 c = gch ();
1343 /* now skip to the end of that line */
c5aa993b 1344 while (c != '\r')
c906108c
SS
1345 c = gch ();
1346 c = gch ();
1347
1348 while (count < len)
1349 {
1350 /* get rid of any white space before the address */
1351 while (c <= ' ')
1352 c = gch ();
1353
1354 /* Skip the address */
1355 get_hex (&c);
1356
1357 /* read in the bytes on the line */
1358 while (c != '"' && count < len)
1359 {
1360 if (c == ' ')
1361 c = gch ();
1362 else
1363 {
1364 myaddr[count++] = get_hex (&c);
1365 }
1366 }
1367 /* throw out the rest of the line */
c5aa993b 1368 while (c != '\r')
c906108c
SS
1369 c = gch ();
1370 }
1371
1372 /* wait for the ":" prompt */
1373 while (c != ':')
1374 c = gch ();
1375
1376 return len;
1377}
1378
1379#if 0
1380
1381static int
fba45db2
KB
1382fast_but_for_the_pause_e7000_read_inferior_memory (CORE_ADDR memaddr,
1383 char *myaddr, int len)
c906108c
SS
1384{
1385 int loop;
1386 int c;
1387 char buf[200];
1388
1389 if (((memaddr - 1) + len) < memaddr)
1390 {
1391 errno = EIO;
1392 return 0;
1393 }
1394
1395 sprintf (buf, "is %x@%x:s\r", memaddr, len);
1396 puts_e7000debug (buf);
1397 gch ();
1398 c = gch ();
1399 if (c != ENQ)
1400 {
1401 /* Got an error */
1402 error ("Memory read error");
1403 }
1404 putchar_e7000 (ACK);
1405 expect ("SV s");
1406 loop = 1;
1407 while (loop)
1408 {
1409 int type;
1410 int length;
1411 int addr;
1412 int i;
1413
1414 c = gch ();
1415 switch (c)
1416 {
1417 case ENQ: /* ENQ, at the end */
1418 loop = 0;
1419 break;
1420 case 'S':
1421 /* Start of an Srecord */
1422 type = gch ();
1423 length = gbyte ();
1424 switch (type)
1425 {
1426 case '7': /* Termination record, ignore */
1427 case '0':
1428 case '8':
1429 case '9':
1430 /* Header record - ignore it */
1431 while (length--)
1432 {
1433 gbyte ();
1434 }
1435 break;
1436 case '1':
1437 case '2':
1438 case '3':
1439 {
1440 int alen;
1441
1442 alen = type - '0' + 1;
1443 addr = 0;
1444 while (alen--)
1445 {
1446 addr = (addr << 8) + gbyte ();
1447 length--;
1448 }
1449
1450 for (i = 0; i < length - 1; i++)
1451 myaddr[i + addr - memaddr] = gbyte ();
1452
1453 gbyte (); /* Ignore checksum */
1454 }
1455 }
1456 }
1457 }
1458
1459 putchar_e7000 (ACK);
1460 expect ("TOP ADDRESS =");
1461 expect ("END ADDRESS =");
1462 expect (":");
1463
1464 return len;
1465}
1466
1467#endif
1468
69dc947a
KB
1469/* Transfer LEN bytes between GDB address MYADDR and target address
1470 MEMADDR. If WRITE is non-zero, transfer them to the target,
1471 otherwise transfer them from the target. TARGET is unused.
1472
1473 Returns the number of bytes transferred. */
1474
c906108c 1475static int
55d80160 1476e7000_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr,
69dc947a 1477 int len, int write, struct target_ops *target)
c906108c
SS
1478{
1479 if (write)
c5aa993b
JM
1480 return e7000_write_inferior_memory (memaddr, myaddr, len);
1481 else if (len < 16)
1482 return e7000_read_inferior_memory (memaddr, myaddr, len);
1483 else
1484 return e7000_read_inferior_memory_large (memaddr, myaddr, len);
c906108c
SS
1485}
1486
1487static void
55d80160 1488e7000_kill (void)
c906108c
SS
1489{
1490}
1491
1492static void
fba45db2 1493e7000_load (char *args, int from_tty)
c906108c
SS
1494{
1495 struct cleanup *old_chain;
1496 asection *section;
1497 bfd *pbfd;
1498 bfd_vma entry;
1499#define WRITESIZE 0x1000
c5aa993b 1500 char buf[2 + 4 + 4 + WRITESIZE]; /* `DT' + <addr> + <len> + <data> */
c906108c
SS
1501 char *filename;
1502 int quiet;
1503 int nostart;
1504 time_t start_time, end_time; /* Start and end times of download */
1505 unsigned long data_count; /* Number of bytes transferred to memory */
c5aa993b 1506 int oldtimeout = timeout;
c906108c
SS
1507
1508 timeout = remote_timeout;
1509
1510
1511 /* FIXME! change test to test for type of download */
1512 if (!using_tcp)
1513 {
1514 generic_load (args, from_tty);
1515 return;
1516 }
1517
1518 /* for direct tcp connections, we can do a fast binary download */
1519 buf[0] = 'D';
1520 buf[1] = 'T';
1521 quiet = 0;
1522 nostart = 0;
1523 filename = NULL;
1524
1525 while (*args != '\000')
1526 {
1527 char *arg;
1528
c5aa993b
JM
1529 while (isspace (*args))
1530 args++;
c906108c
SS
1531
1532 arg = args;
1533
c5aa993b
JM
1534 while ((*args != '\000') && !isspace (*args))
1535 args++;
c906108c
SS
1536
1537 if (*args != '\000')
1538 *args++ = '\000';
1539
1540 if (*arg != '-')
1541 filename = arg;
1542 else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
1543 quiet = 1;
1544 else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
1545 nostart = 1;
1546 else
1547 error ("unknown option `%s'", arg);
1548 }
1549
1550 if (!filename)
1551 filename = get_exec_file (1);
1552
1553 pbfd = bfd_openr (filename, gnutarget);
1554 if (pbfd == NULL)
1555 {
1556 perror_with_name (filename);
1557 return;
1558 }
5c65bbb6 1559 old_chain = make_cleanup_bfd_close (pbfd);
c906108c 1560
c5aa993b 1561 if (!bfd_check_format (pbfd, bfd_object))
c906108c
SS
1562 error ("\"%s\" is not an object file: %s", filename,
1563 bfd_errmsg (bfd_get_error ()));
1564
1565 start_time = time (NULL);
1566 data_count = 0;
1567
1568 puts_e7000debug ("mw\r");
1569
1570 expect ("\nOK");
1571
c5aa993b 1572 for (section = pbfd->sections; section; section = section->next)
c906108c
SS
1573 {
1574 if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
1575 {
1576 bfd_vma section_address;
1577 bfd_size_type section_size;
1578 file_ptr fptr;
1579
1580 section_address = bfd_get_section_vma (pbfd, section);
1581 section_size = bfd_get_section_size_before_reloc (section);
1582
1583 if (!quiet)
cc17453a 1584 printf_filtered ("[Loading section %s at 0x%x (%ud bytes)]\n",
c906108c
SS
1585 bfd_get_section_name (pbfd, section),
1586 section_address,
1587 section_size);
1588
1589 fptr = 0;
c5aa993b 1590
c906108c
SS
1591 data_count += section_size;
1592
1593 while (section_size > 0)
1594 {
1595 int count;
1596 static char inds[] = "|/-\\";
1597 static int k = 0;
1598
1599 QUIT;
1600
1601 count = min (section_size, WRITESIZE);
1602
1603 buf[2] = section_address >> 24;
1604 buf[3] = section_address >> 16;
1605 buf[4] = section_address >> 8;
1606 buf[5] = section_address;
1607
1608 buf[6] = count >> 24;
1609 buf[7] = count >> 16;
1610 buf[8] = count >> 8;
1611 buf[9] = count;
1612
1613 bfd_get_section_contents (pbfd, section, buf + 10, fptr, count);
1614
1615 if (SERIAL_WRITE (e7000_desc, buf, count + 10))
1616 fprintf_unfiltered (gdb_stderr,
1617 "e7000_load: SERIAL_WRITE failed: %s\n",
c5aa993b 1618 safe_strerror (errno));
c906108c
SS
1619
1620 expect ("OK");
1621
1622 if (!quiet)
1623 {
1624 printf_unfiltered ("\r%c", inds[k++ % 4]);
1625 gdb_flush (gdb_stdout);
1626 }
1627
1628 section_address += count;
1629 fptr += count;
1630 section_size -= count;
1631 }
1632 }
1633 }
1634
1635 write_e7000 ("ED");
1636
1637 expect_prompt ();
1638
1639 end_time = time (NULL);
1640
1641/* Finally, make the PC point at the start address */
1642
1643 if (exec_bfd)
1644 write_pc (bfd_get_start_address (exec_bfd));
1645
1646 inferior_pid = 0; /* No process now */
1647
1648/* This is necessary because many things were based on the PC at the time that
1649 we attached to the monitor, which is no longer valid now that we have loaded
1650 new code (and just changed the PC). Another way to do this might be to call
1651 normal_stop, except that the stack may not be valid, and things would get
1652 horribly confused... */
1653
1654 clear_symtab_users ();
1655
1656 if (!nostart)
1657 {
1658 entry = bfd_get_start_address (pbfd);
1659
1660 if (!quiet)
1661 printf_unfiltered ("[Starting %s at 0x%x]\n", filename, entry);
1662
c5aa993b 1663/* start_routine (entry); */
c906108c
SS
1664 }
1665
1666 report_transfer_performance (data_count, start_time, end_time);
1667
1668 do_cleanups (old_chain);
1669 timeout = oldtimeout;
1670}
1671
1672/* Clean up when a program exits.
1673
1674 The program actually lives on in the remote processor's RAM, and may be
1675 run again without a download. Don't leave it full of breakpoint
1676 instructions. */
1677
1678static void
fba45db2 1679e7000_mourn_inferior (void)
c906108c
SS
1680{
1681 remove_breakpoints ();
1682 unpush_target (&e7000_ops);
1683 generic_mourn_inferior (); /* Do all the proper things now */
1684}
1685
1686#define MAX_BREAKPOINTS 200
1687#ifdef HARD_BREAKPOINTS
1688#define MAX_E7000DEBUG_BREAKPOINTS (BC_BREAKPOINTS ? 5 : MAX_BREAKPOINTS)
1689#else
1690#define MAX_E7000DEBUG_BREAKPOINTS MAX_BREAKPOINTS
1691#endif
1692
1693/* Since we can change to soft breakpoints dynamically, we must define
1694 more than enough. Was breakaddr[MAX_E7000DEBUG_BREAKPOINTS]. */
c5aa993b
JM
1695static CORE_ADDR breakaddr[MAX_BREAKPOINTS] =
1696{0};
c906108c
SS
1697
1698static int
55d80160 1699e7000_insert_breakpoint (CORE_ADDR addr, char *shadow)
c906108c
SS
1700{
1701 int i;
1702 char buf[200];
1703#if 0
1704 static char nop[2] = NOP;
1705#endif
1706
1707 for (i = 0; i <= MAX_E7000DEBUG_BREAKPOINTS; i++)
1708 if (breakaddr[i] == 0)
1709 {
1710 breakaddr[i] = addr;
1711 /* Save old contents, and insert a nop in the space */
1712#ifdef HARD_BREAKPOINTS
c5aa993b 1713 if (BC_BREAKPOINTS)
c906108c 1714 {
cc17453a 1715 sprintf (buf, "BC%d A=%lx\r", i + 1, addr);
c906108c
SS
1716 puts_e7000debug (buf);
1717 }
c5aa993b 1718 else
c906108c 1719 {
cc17453a 1720 sprintf (buf, "B %lx\r", addr);
c906108c
SS
1721 puts_e7000debug (buf);
1722 }
1723#else
1724#if 0
1725 e7000_read_inferior_memory (addr, shadow, 2);
1726 e7000_write_inferior_memory (addr, nop, 2);
1727#endif
1728
1729 sprintf (buf, "B %x\r", addr);
1730 puts_e7000debug (buf);
1731#endif
1732 expect_prompt ();
1733 return 0;
1734 }
1735
1736 error ("Too many breakpoints ( > %d) for the E7000\n",
1737 MAX_E7000DEBUG_BREAKPOINTS);
1738 return 1;
1739}
1740
1741static int
55d80160 1742e7000_remove_breakpoint (CORE_ADDR addr, char *shadow)
c906108c
SS
1743{
1744 int i;
1745 char buf[200];
1746
1747 for (i = 0; i < MAX_E7000DEBUG_BREAKPOINTS; i++)
1748 if (breakaddr[i] == addr)
1749 {
1750 breakaddr[i] = 0;
1751#ifdef HARD_BREAKPOINTS
c5aa993b 1752 if (BC_BREAKPOINTS)
c906108c 1753 {
c5aa993b 1754 sprintf (buf, "BC%d - \r", i + 1);
c906108c
SS
1755 puts_e7000debug (buf);
1756 }
c5aa993b 1757 else
c906108c 1758 {
cc17453a 1759 sprintf (buf, "B - %lx\r", addr);
c906108c
SS
1760 puts_e7000debug (buf);
1761 }
1762 expect_prompt ();
1763#else
cc17453a 1764 sprintf (buf, "B - %lx\r", addr);
c906108c
SS
1765 puts_e7000debug (buf);
1766 expect_prompt ();
1767
1768#if 0
1769 /* Replace the insn under the break */
1770 e7000_write_inferior_memory (addr, shadow, 2);
1771#endif
1772#endif
1773
1774 return 0;
1775 }
1776
cc17453a 1777 warning ("Can't find breakpoint associated with 0x%lx\n", addr);
c906108c
SS
1778 return 1;
1779}
1780
1781/* Put a command string, in args, out to STDBUG. Output from STDBUG
1782 is placed on the users terminal until the prompt is seen. */
1783
1784static void
fba45db2 1785e7000_command (char *args, int fromtty)
c906108c
SS
1786{
1787 /* FIXME: arbitrary limit on length of args. */
1788 char buf[200];
1789
1790 echo = 0;
1791
1792 if (!e7000_desc)
1793 error ("e7000 target not open.");
1794 if (!args)
1795 {
1796 puts_e7000debug ("\r");
1797 }
1798 else
1799 {
1800 sprintf (buf, "%s\r", args);
1801 puts_e7000debug (buf);
1802 }
1803
1804 echo++;
1805 ctrl_c = 2;
1806 expect_full_prompt ();
1807 echo--;
1808 ctrl_c = 0;
1809 printf_unfiltered ("\n");
1810
1811 /* Who knows what the command did... */
1812 registers_changed ();
1813}
1814
1815
1816static void
fba45db2 1817e7000_drain_command (char *args, int fromtty)
c906108c
SS
1818{
1819 int c;
1820
c5aa993b 1821 puts_e7000debug ("end\r");
c906108c
SS
1822 putchar_e7000 (CTRLC);
1823
1824 while ((c = readchar (1) != -1))
1825 {
1826 if (quit_flag)
1827 {
c5aa993b 1828 putchar_e7000 (CTRLC);
c906108c
SS
1829 quit_flag = 0;
1830 }
1831 if (c > ' ' && c < 127)
1832 printf_unfiltered ("%c", c & 0xff);
1833 else
1834 printf_unfiltered ("<%x>", c & 0xff);
1835 }
1836}
1837
1838#define NITEMS 7
1839
1840static int
fba45db2 1841why_stop (void)
c906108c 1842{
c5aa993b
JM
1843 static char *strings[NITEMS] =
1844 {
c906108c
SS
1845 "STEP NORMAL",
1846 "BREAK POINT",
1847 "BREAK KEY",
1848 "BREAK CONDI",
1849 "CYCLE ACCESS",
1850 "ILLEGAL INSTRUCTION",
1851 "WRITE PROTECT",
1852 };
1853 char *p[NITEMS];
1854 int c;
1855 int i;
1856
1857 for (i = 0; i < NITEMS; ++i)
1858 p[i] = strings[i];
c5aa993b 1859
c906108c
SS
1860 c = gch ();
1861 while (1)
1862 {
1863 for (i = 0; i < NITEMS; i++)
1864 {
c5aa993b 1865 if (c == *(p[i]))
c906108c
SS
1866 {
1867 p[i]++;
c5aa993b
JM
1868 if (*(p[i]) == 0)
1869 {
c906108c
SS
1870 /* found one of the choices */
1871 return i;
1872 }
1873 }
1874 else
1875 p[i] = strings[i];
1876 }
1877
1878 c = gch ();
1879 }
1880}
1881
1882/* Suck characters, if a string match, then return the strings index
1883 otherwise echo them. */
1884
1885int
fba45db2 1886expect_n (char **strings)
c906108c
SS
1887{
1888 char *(ptr[10]);
c5aa993b 1889 int n;
c906108c
SS
1890 int c;
1891 char saveaway[100];
1892 char *buffer = saveaway;
1893 /* Count number of expect strings */
1894
c5aa993b 1895 for (n = 0; strings[n]; n++)
c906108c
SS
1896 {
1897 ptr[n] = strings[n];
1898 }
1899
1900 while (1)
1901 {
1902 int i;
1903 int gotone = 0;
1904
1905 c = readchar (1);
1906 if (c == -1)
1907 {
1908 printf_unfiltered ("[waiting for e7000...]\n");
1909 }
1910#ifdef __GO32__
1911 if (kbhit ())
1912 {
c5aa993b 1913 int k = getkey ();
c906108c
SS
1914
1915 if (k == 1)
1916 quit_flag = 1;
1917 }
1918#endif
1919 if (quit_flag)
1920 {
1921 putchar_e7000 (CTRLC); /* interrupt the running program */
1922 quit_flag = 0;
1923 }
1924
1925 for (i = 0; i < n; i++)
1926 {
c5aa993b 1927 if (c == ptr[i][0])
c906108c
SS
1928 {
1929 ptr[i]++;
1930 if (ptr[i][0] == 0)
1931 {
1932 /* Gone all the way */
1933 return i;
1934 }
1935 gotone = 1;
1936 }
1937 else
1938 {
1939 ptr[i] = strings[i];
1940 }
1941 }
c5aa993b 1942
c906108c
SS
1943 if (gotone)
1944 {
1945 /* Save it up incase we find that there was no match */
c5aa993b 1946 *buffer++ = c;
c906108c
SS
1947 }
1948 else
1949 {
c5aa993b 1950 if (buffer != saveaway)
c906108c
SS
1951 {
1952 *buffer++ = 0;
1953 printf_unfiltered ("%s", buffer);
1954 buffer = saveaway;
1955 }
1956 if (c != -1)
1957 {
1958 putchar_unfiltered (c);
1959 gdb_flush (gdb_stdout);
1960 }
1961 }
1962 }
1963}
1964
1965/* We subtract two from the pc here rather than use
1966 DECR_PC_AFTER_BREAK since the e7000 doesn't always add two to the
1967 pc, and the simulators never do. */
1968
1969static void
fba45db2 1970sub2_from_pc (void)
c906108c
SS
1971{
1972 char buf[4];
1973 char buf2[200];
1974
1975 store_signed_integer (buf,
c5aa993b
JM
1976 REGISTER_RAW_SIZE (PC_REGNUM),
1977 read_register (PC_REGNUM) - 2);
c906108c 1978 supply_register (PC_REGNUM, buf);
cc17453a 1979 sprintf (buf2, ".PC %lx\r", read_register (PC_REGNUM));
c906108c
SS
1980 puts_e7000debug (buf2);
1981}
1982
1983#define WAS_SLEEP 0
1984#define WAS_INT 1
1985#define WAS_RUNNING 2
1986#define WAS_OTHER 3
1987
c5aa993b
JM
1988static char *estrings[] =
1989{
c906108c
SS
1990 "** SLEEP",
1991 "BREAK !",
1992 "** PC",
1993 "PC",
1994 NULL
1995};
1996
1997/* Wait until the remote machine stops, then return, storing status in
1998 STATUS just as `wait' would. */
1999
2000static int
fba45db2 2001e7000_wait (int pid, struct target_waitstatus *status)
c906108c
SS
2002{
2003 int stop_reason;
2004 int regno;
2005 int running_count = 0;
2006 int had_sleep = 0;
2007 int loop = 1;
2008 char *wanted_nopc;
2009
2010 /* Then echo chars until PC= string seen */
2011 gch (); /* Drop cr */
2012 gch (); /* and space */
2013
2014 while (loop)
2015 {
2016 switch (expect_n (estrings))
c5aa993b 2017 {
c906108c
SS
2018 case WAS_OTHER:
2019 /* how did this happen ? */
2020 loop = 0;
2021 break;
2022 case WAS_SLEEP:
2023 had_sleep = 1;
2024 putchar_e7000 (CTRLC);
2025 loop = 0;
2026 break;
2027 case WAS_INT:
2028 loop = 0;
2029 break;
2030 case WAS_RUNNING:
2031 running_count++;
2032 if (running_count == 20)
2033 {
2034 printf_unfiltered ("[running...]\n");
2035 running_count = 0;
2036 }
2037 break;
2038 default:
2039 /* error? */
2040 break;
2041 }
2042 }
2043
2044 /* Skip till the PC= */
2045 expect ("=");
2046
c906108c 2047 if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
cc17453a
EZ
2048 {
2049 wanted_nopc = want_nopc_sh;
2050 switch (TARGET_ARCHITECTURE->mach)
2051 {
2052 case bfd_mach_sh3:
2053 case bfd_mach_sh3e:
2054 case bfd_mach_sh4:
2055 wanted_nopc = want_nopc_sh3;
2056 }
2057 }
2058#ifdef GDB_TARGET_IS_H8300
2059 if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
2060 {
2061 if (h8300smode)
2062 wanted_nopc = want_nopc_h8300s;
2063 else
2064 wanted_nopc = want_nopc_h8300h;
2065 }
c906108c
SS
2066#endif
2067 fetch_regs_from_dump (gch, wanted_nopc);
2068
2069 /* And supply the extra ones the simulator uses */
2070 for (regno = NUM_REALREGS; regno < NUM_REGS; regno++)
2071 {
2072 int buf = 0;
2073 supply_register (regno, (char *) &buf);
2074 }
2075
2076 stop_reason = why_stop ();
2077 expect_full_prompt ();
2078
2079 status->kind = TARGET_WAITKIND_STOPPED;
2080 status->value.sig = TARGET_SIGNAL_TRAP;
2081
2082 switch (stop_reason)
2083 {
2084 case 1: /* Breakpoint */
c5aa993b
JM
2085 write_pc (read_pc ()); /* PC is always off by 2 for breakpoints */
2086 status->value.sig = TARGET_SIGNAL_TRAP;
c906108c
SS
2087 break;
2088 case 0: /* Single step */
c5aa993b 2089 status->value.sig = TARGET_SIGNAL_TRAP;
c906108c
SS
2090 break;
2091 case 2: /* Interrupt */
2092 if (had_sleep)
2093 {
c5aa993b 2094 status->value.sig = TARGET_SIGNAL_TRAP;
c906108c
SS
2095 sub2_from_pc ();
2096 }
2097 else
2098 {
c5aa993b 2099 status->value.sig = TARGET_SIGNAL_INT;
c906108c
SS
2100 }
2101 break;
2102 case 3:
2103 break;
2104 case 4:
2105 printf_unfiltered ("a cycle address error?\n");
c5aa993b 2106 status->value.sig = TARGET_SIGNAL_UNKNOWN;
c906108c
SS
2107 break;
2108 case 5:
c5aa993b 2109 status->value.sig = TARGET_SIGNAL_ILL;
c906108c
SS
2110 break;
2111 case 6:
c5aa993b 2112 status->value.sig = TARGET_SIGNAL_SEGV;
c906108c
SS
2113 break;
2114 case 7: /* Anything else (NITEMS + 1) */
2115 printf_unfiltered ("a write protect error?\n");
c5aa993b 2116 status->value.sig = TARGET_SIGNAL_UNKNOWN;
c906108c
SS
2117 break;
2118 default:
2119 /* Get the user's attention - this should never happen. */
2120 abort ();
2121 }
2122
2123 return 0;
2124}
2125
2126/* Stop the running program. */
2127
2128static void
fba45db2 2129e7000_stop (void)
c906108c
SS
2130{
2131 /* Sending a ^C is supposed to stop the running program. */
2132 putchar_e7000 (CTRLC);
2133}
2134
2135/* Define the target subroutine names. */
2136
c5aa993b 2137struct target_ops e7000_ops;
c906108c 2138
c5aa993b
JM
2139static void
2140init_e7000_ops (void)
c906108c 2141{
c5aa993b
JM
2142 e7000_ops.to_shortname = "e7000";
2143 e7000_ops.to_longname = "Remote Hitachi e7000 target";
2144 e7000_ops.to_doc = "Use a remote Hitachi e7000 ICE connected by a serial line;\n\
c906108c
SS
2145or a network connection.\n\
2146Arguments are the name of the device for the serial line,\n\
2147the speed to connect at in bits per second.\n\
2148eg\n\
2149target e7000 /dev/ttya 9600\n\
c5aa993b
JM
2150target e7000 foobar";
2151 e7000_ops.to_open = e7000_open;
2152 e7000_ops.to_close = e7000_close;
2153 e7000_ops.to_attach = 0;
c906108c 2154 e7000_ops.to_post_attach = NULL;
c5aa993b
JM
2155 e7000_ops.to_require_attach = NULL;
2156 e7000_ops.to_detach = e7000_detach;
2157 e7000_ops.to_require_detach = NULL;
2158 e7000_ops.to_resume = e7000_resume;
2159 e7000_ops.to_wait = e7000_wait;
2160 e7000_ops.to_post_wait = NULL;
2161 e7000_ops.to_fetch_registers = e7000_fetch_register;
2162 e7000_ops.to_store_registers = e7000_store_register;
2163 e7000_ops.to_prepare_to_store = e7000_prepare_to_store;
2164 e7000_ops.to_xfer_memory = e7000_xfer_inferior_memory;
2165 e7000_ops.to_files_info = e7000_files_info;
2166 e7000_ops.to_insert_breakpoint = e7000_insert_breakpoint;
2167 e7000_ops.to_remove_breakpoint = e7000_remove_breakpoint;
2168 e7000_ops.to_terminal_init = 0;
2169 e7000_ops.to_terminal_inferior = 0;
2170 e7000_ops.to_terminal_ours_for_output = 0;
2171 e7000_ops.to_terminal_ours = 0;
2172 e7000_ops.to_terminal_info = 0;
2173 e7000_ops.to_kill = e7000_kill;
2174 e7000_ops.to_load = e7000_load;
2175 e7000_ops.to_lookup_symbol = 0;
2176 e7000_ops.to_create_inferior = e7000_create_inferior;
c906108c
SS
2177 e7000_ops.to_post_startup_inferior = NULL;
2178 e7000_ops.to_acknowledge_created_inferior = NULL;
c5aa993b
JM
2179 e7000_ops.to_clone_and_follow_inferior = NULL;
2180 e7000_ops.to_post_follow_inferior_by_clone = NULL;
c906108c
SS
2181 e7000_ops.to_insert_fork_catchpoint = NULL;
2182 e7000_ops.to_remove_fork_catchpoint = NULL;
2183 e7000_ops.to_insert_vfork_catchpoint = NULL;
c5aa993b 2184 e7000_ops.to_remove_vfork_catchpoint = NULL;
c906108c
SS
2185 e7000_ops.to_has_forked = NULL;
2186 e7000_ops.to_has_vforked = NULL;
c5aa993b 2187 e7000_ops.to_can_follow_vfork_prior_to_exec = NULL;
c906108c
SS
2188 e7000_ops.to_post_follow_vfork = NULL;
2189 e7000_ops.to_insert_exec_catchpoint = NULL;
2190 e7000_ops.to_remove_exec_catchpoint = NULL;
2191 e7000_ops.to_has_execd = NULL;
2192 e7000_ops.to_reported_exec_events_per_exec_call = NULL;
2193 e7000_ops.to_has_exited = NULL;
c5aa993b
JM
2194 e7000_ops.to_mourn_inferior = e7000_mourn_inferior;
2195 e7000_ops.to_can_run = 0;
2196 e7000_ops.to_notice_signals = 0;
2197 e7000_ops.to_thread_alive = 0;
2198 e7000_ops.to_stop = e7000_stop;
2199 e7000_ops.to_pid_to_exec_file = NULL;
c906108c 2200 e7000_ops.to_core_file_to_sym_file = NULL;
c5aa993b
JM
2201 e7000_ops.to_stratum = process_stratum;
2202 e7000_ops.DONT_USE = 0;
2203 e7000_ops.to_has_all_memory = 1;
2204 e7000_ops.to_has_memory = 1;
2205 e7000_ops.to_has_stack = 1;
2206 e7000_ops.to_has_registers = 1;
2207 e7000_ops.to_has_execution = 1;
2208 e7000_ops.to_sections = 0;
2209 e7000_ops.to_sections_end = 0;
2210 e7000_ops.to_magic = OPS_MAGIC;
c906108c
SS
2211};
2212
2213void
fba45db2 2214_initialize_remote_e7000 (void)
c906108c 2215{
c5aa993b 2216 init_e7000_ops ();
c906108c
SS
2217 add_target (&e7000_ops);
2218
2219 add_com ("e7000", class_obscure, e7000_command,
2220 "Send a command to the e7000 monitor.");
2221
2222 add_com ("ftplogin", class_obscure, e7000_login_command,
2223 "Login to machine and change to directory.");
2224
2225 add_com ("ftpload", class_obscure, e7000_ftp_command,
2226 "Fetch and load a file from previously described place.");
2227
2228 add_com ("drain", class_obscure, e7000_drain_command,
2229 "Drain pending e7000 text buffers.");
2230
2231 add_show_from_set (add_set_cmd ("usehardbreakpoints", no_class,
c5aa993b
JM
2232 var_integer, (char *) &use_hard_breakpoints,
2233 "Set use of hardware breakpoints for all breakpoints.\n", &setlist),
c906108c
SS
2234 &showlist);
2235}
This page took 0.17375 seconds and 4 git commands to generate.