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