* Makefile.in (GDBvn.texi): Fix match expression to work with
[deliverable/binutils-gdb.git] / gdb / remote-hms.c
1 /* Remote debugging interface for Hitachi HMS Monitor Version 1.0
2 Copyright 1995 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Steve Chamberlain
4 (sac@cygnus.com).
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include "defs.h"
23 #include "gdbcore.h"
24 #include "target.h"
25 #include "monitor.h"
26 #include "serial.h"
27
28 static void hms_open PARAMS ((char *args, int from_tty));
29 static void
30 hms_supply_register (regname, regnamelen, val, vallen)
31 char *regname;
32 int regnamelen;
33 char *val;
34 int vallen;
35 {
36 int regno;
37
38 if (regnamelen != 2)
39 return;
40 if (regname[0] != 'P')
41 return;
42 /* We scan off all the registers in one go */
43
44 val = monitor_supply_register (PC_REGNUM, val);
45 /* Skip the ccr string */
46 while (*val != '=' && *val)
47 val++;
48
49 val = monitor_supply_register (CCR_REGNUM, val + 1);
50
51 /* Skip up to rest of regs */
52 while (*val != '=' && *val)
53 val++;
54
55 for (regno = 0; regno < 7; regno++)
56 {
57 val = monitor_supply_register (regno, val + 1);
58 }
59 }
60
61 /*
62 * This array of registers needs to match the indexes used by GDB. The
63 * whole reason this exists is because the various ROM monitors use
64 * different names than GDB does, and don't support all the
65 * registers either. So, typing "info reg sp" becomes a "r30".
66 */
67
68 static char *hms_regnames[NUM_REGS] =
69 {
70 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "CCR", "PC"
71 };
72
73 /*
74 * Define the monitor command strings. Since these are passed directly
75 * through to a printf style function, we need can include formatting
76 * strings. We also need a CR or LF on the end.
77 */
78
79 static struct target_ops hms_ops;
80
81 static char *hms_inits[] =
82 {"\003", /* Resets the prompt, and clears repeated cmds */
83 NULL};
84
85 static struct monitor_ops hms_cmds ;
86 static void init_hms_cmds(void)
87 {
88 hms_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_FILL_USES_ADDR | MO_GETMEM_NEEDS_RANGE;
89 hms_cmds.init = hms_inits; /* Init strings */
90 hms_cmds.cont = "g\r"; /* continue command */
91 hms_cmds.step = "s\r"; /* single step */
92 hms_cmds.stop = "\003"; /* ^C interrupts the program */
93 hms_cmds.set_break = "b %x\r"; /* set a breakpoint */
94 hms_cmds.clr_break = "b - %x\r"; /* clear a breakpoint */
95 hms_cmds.clr_all_break = "b -\r"; /* clear all breakpoints */
96 hms_cmds.fill = "f %x %x %x\r"; /* fill (start end val) */
97 hms_cmds.setmem.cmdb = "m.b %x=%x\r"; /* setmem.cmdb (addr, value) */
98 hms_cmds.setmem.cmdw = "m.w %x=%x\r"; /* setmem.cmdw (addr, value) */
99 hms_cmds.setmem.cmdl = NULL; /* setmem.cmdl (addr, value) */
100 hms_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
101 hms_cmds.setmem.resp_delim = NULL;/* setreg.resp_delim */
102 hms_cmds.setmem.term = NULL; /* setreg.term */
103 hms_cmds.setmem.term_cmd = NULL; /* setreg.term_cmd */
104 hms_cmds.getmem.cmdb = "m.b %x %x\r"; /* getmem.cmdb (addr, addr) */
105 hms_cmds.getmem.cmdw = "m.w %x %x\r"; /* getmem.cmdw (addr, addr) */
106 hms_cmds.getmem.cmdl = NULL; /* getmem.cmdl (addr, addr) */
107 hms_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, addr) */
108 hms_cmds.getmem.resp_delim = ": ";/* getmem.resp_delim */
109 hms_cmds.getmem.term = ">"; /* getmem.term */
110 hms_cmds.getmem.term_cmd = "\003";/* getmem.term_cmd */
111 hms_cmds.setreg.cmd = "r %s=%x\r";/* setreg.cmd (name, value) */
112 hms_cmds.setreg.resp_delim = NULL;/* setreg.resp_delim */
113 hms_cmds.setreg.term = NULL; /* setreg.term */
114 hms_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */
115 hms_cmds.getreg.cmd = "r %s\r"; /* getreg.cmd (name) */
116 hms_cmds.getreg.resp_delim = " (";/* getreg.resp_delim */
117 hms_cmds.getreg.term = ":"; /* getreg.term */
118 hms_cmds.getreg.term_cmd = "\003";/* getreg.term_cmd */
119 hms_cmds.dump_registers = "r\r"; /* dump_registers */
120 hms_cmds.register_pattern = "\\(\\w+\\)=\\([0-9a-fA-F]+\\)"; /* register_pattern */
121 hms_cmds.supply_register = hms_supply_register; /* supply_register */
122 hms_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */
123 hms_cmds.load = "tl\r"; /* download command */
124 hms_cmds.loadresp = NULL; /* load response */
125 hms_cmds.prompt = ">"; /* monitor command prompt */
126 hms_cmds.line_term = "\r"; /* end-of-command delimitor */
127 hms_cmds.cmd_end = NULL; /* optional command terminator */
128 hms_cmds.target = &hms_ops; /* target operations */
129 hms_cmds.stopbits = SERIAL_1_STOPBITS;/* number of stop bits */
130 hms_cmds.regnames = hms_regnames; /* registers names */
131 hms_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
132 } /* init_hms-cmds */
133
134 static void
135 hms_open (args, from_tty)
136 char *args;
137 int from_tty;
138 {
139 monitor_open (args, &hms_cmds, from_tty);
140 }
141
142 int write_dos_tick_delay;
143
144 void
145 _initialize_remote_hms ()
146 {
147 init_hms_cmds() ;
148 init_monitor_ops (&hms_ops);
149
150 hms_ops.to_shortname = "hms";
151 hms_ops.to_longname = "Hitachi Microsystems H8/300 debug monitor";
152 hms_ops.to_doc = "Debug via the HMS monitor.\n\
153 Specify the serial device it is connected to (e.g. /dev/ttya).";
154 hms_ops.to_open = hms_open;
155 /* By trial and error I've found that this delay doesn't break things */
156 write_dos_tick_delay = 1;
157 add_target (&hms_ops);
158 }
159
160 #if 0
161 /* This is kept here because we used to support the H8/500 in this module,
162 and I haven't done the H8/500 yet */
163 #include "defs.h"
164 #include "inferior.h"
165 #include "wait.h"
166 #include "value.h"
167 #include "gdb_string.h"
168 #include <ctype.h>
169 #include <fcntl.h>
170 #include <signal.h>
171 #include <setjmp.h>
172 #include <errno.h>
173 #include "terminal.h"
174 #include "target.h"
175 #include "gdbcore.h"
176 #include "serial.h"
177 #include "remote-utils.h"
178 /* External data declarations */
179 extern int stop_soon_quietly; /* for wait_for_inferior */
180
181 /* Forward data declarations */
182 extern struct target_ops hms_ops; /* Forward declaration */
183
184 /* Forward function declarations */
185 static void hms_fetch_registers ();
186 static int hms_store_registers ();
187 static void hms_close ();
188 static int hms_clear_breakpoints ();
189
190 extern struct target_ops hms_ops;
191 static void hms_drain ();
192 static void add_commands ();
193 static void remove_commands ();
194
195 static int quiet = 1; /* FIXME - can be removed after Dec '94 */
196
197
198
199 /***********************************************************************
200 * I/O stuff stolen from remote-eb.c
201 ***********************************************************************/
202
203 static int timeout = 2;
204
205 static const char *dev_name;
206
207 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
208 hms_open knows that we don't have a file open when the program
209 starts. */
210
211 static int before = 0xdead;
212 static int is_open = 0;
213 static int after = 0xdead;
214 int
215 check_open ()
216 {
217 if (before != 0xdead
218 || after != 0xdead)
219 printf ("OUTCH! \n");
220 if (!is_open)
221 {
222 error ("remote device not open");
223 }
224 }
225
226 #define ON 1
227 #define OFF 0
228
229 /* Read a character from the remote system, doing all the fancy
230 timeout stuff. */
231 static int
232 readchar ()
233 {
234 int buf;
235
236 buf = SERIAL_READCHAR (desc, timeout);
237
238 if (buf == SERIAL_TIMEOUT)
239 {
240 hms_write (".\r\n", 3);
241 error ("Timeout reading from remote system.");
242 }
243 if (buf == SERIAL_ERROR)
244 {
245 error ("Serial port error!");
246 }
247
248 if (!quiet || remote_debug)
249 printf_unfiltered ("%c", buf);
250
251 return buf & 0x7f;
252 }
253
254 static void
255 flush ()
256 {
257 while (1)
258 {
259 int b = SERIAL_READCHAR (desc, 0);
260 if (b == SERIAL_TIMEOUT)
261 return;
262 }
263 }
264
265 static int
266 readchar_nofail ()
267 {
268 int buf;
269
270 buf = SERIAL_READCHAR (desc, timeout);
271 if (buf == SERIAL_TIMEOUT)
272 buf = 0;
273 if (!quiet || remote_debug)
274 printf_unfiltered ("%c", buf);
275
276 return buf & 0x7f;
277
278 }
279
280 /* Keep discarding input from the remote system, until STRING is found.
281 Let the user break out immediately. */
282 static void
283 expect (string)
284 char *string;
285 {
286 char *p = string;
287 char c;
288 immediate_quit = 1;
289 while (1)
290 {
291 c = readchar ();
292 if (c == *p)
293 {
294 p++;
295 if (*p == '\0')
296 {
297 immediate_quit = 0;
298 return;
299 }
300 }
301 else
302 {
303 p = string;
304 if (c == *p)
305 p++;
306 }
307 }
308 }
309
310 /* Keep discarding input until we see the hms prompt.
311
312 The convention for dealing with the prompt is that you
313 o give your command
314 o *then* wait for the prompt.
315
316 Thus the last thing that a procedure does with the serial line
317 will be an expect_prompt(). Exception: hms_resume does not
318 wait for the prompt, because the terminal is being handed over
319 to the inferior. However, the next thing which happens after that
320 is a hms_wait which does wait for the prompt.
321 Note that this includes abnormal exit, e.g. error(). This is
322 necessary to prevent getting into states from which we can't
323 recover. */
324 static void
325 expect_prompt ()
326 {
327 expect ("HMS>");
328 }
329
330 /* Get a hex digit from the remote system & return its value.
331 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
332 static int
333 get_hex_digit (ignore_space)
334 int ignore_space;
335 {
336 int ch;
337
338 while (1)
339 {
340 ch = readchar ();
341 if (ch >= '0' && ch <= '9')
342 return ch - '0';
343 else if (ch >= 'A' && ch <= 'F')
344 return ch - 'A' + 10;
345 else if (ch >= 'a' && ch <= 'f')
346 return ch - 'a' + 10;
347 else if (ch == ' ' && ignore_space)
348 ;
349 else
350 {
351 expect_prompt ();
352 error ("Invalid hex digit from remote system.");
353 }
354 }
355 }
356
357 /* Get a byte from hms_desc and put it in *BYT. Accept any number
358 leading spaces. */
359 static void
360 get_hex_byte (byt)
361 char *byt;
362 {
363 int val;
364
365 val = get_hex_digit (1) << 4;
366 val |= get_hex_digit (0);
367 *byt = val;
368 }
369
370 /* Read a 32-bit hex word from the hms, preceded by a space */
371 static long
372 get_hex_word ()
373 {
374 long val;
375 int j;
376
377 val = 0;
378 for (j = 0; j < 8; j++)
379 val = (val << 4) + get_hex_digit (j == 0);
380 return val;
381 }
382
383 /* Called when SIGALRM signal sent due to alarm() timeout. */
384
385 /* Number of SIGTRAPs we need to simulate. That is, the next
386 NEED_ARTIFICIAL_TRAP calls to hms_wait should just return
387 SIGTRAP without actually waiting for anything. */
388
389 static int need_artificial_trap = 0;
390
391 void
392 hms_kill (arg, from_tty)
393 char *arg;
394 int from_tty;
395 {
396
397 }
398
399 /* This is called not only when we first attach, but also when the
400 user types "run" after having attached. */
401 void
402 hms_create_inferior (execfile, args, env)
403 char *execfile;
404 char *args;
405 char **env;
406 {
407 int entry_pt;
408 char buffer[100];
409
410 if (args && *args)
411 error ("Can't pass arguments to remote hms process.");
412
413 if (execfile == 0 || exec_bfd == 0)
414 error ("No executable file specified");
415
416 entry_pt = (int) bfd_get_start_address (exec_bfd);
417 check_open ();
418
419 hms_kill (NULL, NULL);
420 hms_clear_breakpoints ();
421 init_wait_for_inferior ();
422 hms_write_cr ("");
423 expect_prompt ();
424
425 insert_breakpoints (); /* Needed to get correct instruction in cache */
426 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
427 }
428
429 /* Open a connection to a remote debugger.
430 NAME is the filename used for communication, then a space,
431 then the baud rate.
432 */
433
434 static char *
435 find_end_of_word (s)
436 char *s;
437 {
438 while (*s && !isspace (*s))
439 s++;
440 return s;
441 }
442
443 static char *
444 get_word (p)
445 char **p;
446 {
447 char *s = *p;
448 char *word;
449 char *copy;
450 size_t len;
451
452 while (isspace (*s))
453 s++;
454
455 word = s;
456
457 len = 0;
458
459 while (*s && !isspace (*s))
460 {
461 s++;
462 len++;
463
464 }
465 copy = xmalloc (len + 1);
466 memcpy (copy, word, len);
467 copy[len] = 0;
468 *p = s;
469 return copy;
470 }
471
472 static int baudrate = 9600;
473
474 static int
475 is_baudrate_right ()
476 {
477 int ok;
478
479 /* Put this port into NORMAL mode, send the 'normal' character */
480
481 hms_write ("\001", 1); /* Control A */
482 hms_write ("\r\n", 2); /* Cr */
483
484 while (1)
485 {
486 ok = SERIAL_READCHAR (desc, timeout);
487 if (ok < 0)
488 break;
489 }
490
491 hms_write ("r", 1);
492
493 if (readchar_nofail () == 'r')
494 return 1;
495
496 /* Not the right baudrate, or the board's not on */
497 return 0;
498 }
499 static void
500 set_rate ()
501 {
502 if (!SERIAL_SETBAUDRATE (desc, baudrate))
503 error ("Can't set baudrate");
504 }
505
506
507
508 /* Close out all files and local state before this target loses control. */
509
510 static void
511 hms_close (quitting)
512 int quitting;
513 {
514 /* Clear any break points */
515 remove_commands ();
516 hms_clear_breakpoints ();
517 sleep (1); /* Let any output make it all the way back */
518 if (is_open)
519 {
520 SERIAL_WRITE (desc, "R\r\n", 3);
521 SERIAL_CLOSE (desc);
522 }
523 is_open = 0;
524 }
525
526 /* Terminate the open connection to the remote debugger. Use this
527 when you want to detach and do something else with your gdb. */ void
528 hms_detach (args, from_tty)
529 char *args;
530 int from_tty;
531 {
532 if (is_open)
533 {
534 hms_clear_breakpoints ();
535 }
536
537 pop_target (); /* calls hms_close to do the real work
538 */
539 if (from_tty)
540 printf_filtered ("Ending remote %s debugging\n",
541 target_shortname);
542 }
543
544 /* Tell the remote machine to resume. */
545
546 void
547 hms_resume (pid, step, sig)
548 int pid, step;
549 enum target_signal
550 sig;
551 {
552 if (step)
553 {
554 hms_write_cr ("s");
555 expect ("Step>");
556
557 /* Force the next hms_wait to return a trap. Not doing anything
558 about I/O from the target means that the user has to type "continue"
559 to see any. FIXME, this should be fixed. */
560 need_artificial_trap = 1;
561 }
562 else
563 {
564 hms_write_cr ("g");
565 expect ("g");
566 }
567 }
568
569 /* Wait until the remote machine stops, then return, storing status in
570 STATUS just as `wait' would. */
571
572 int
573 hms_wait (pid, status)
574 int pid;
575 struct target_waitstatus *status;
576 {
577 /* Strings to look for. '?' means match any single character. Note
578 that with the algorithm we use, the initial character of the string
579 cannot recur in the string, or we will not find some cases of the
580 string in the input. */
581
582 static char bpt[] = "At breakpoint:";
583
584 /* It would be tempting to look for "\n[__exit + 0x8]\n" but that
585 requires loading symbols with "yc i" and even if we did do that we
586 don't know that the file has symbols. */
587 static char exitmsg[] = "HMS>";
588 char *bp = bpt;
589 char *ep = exitmsg;
590
591 /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars.
592 */
593 char swallowed[50];
594
595 /* Current position in swallowed. */
596 char *swallowed_p = swallowed;
597
598 int ch;
599 int ch_handled;
600 int old_timeout = timeout;
601 int
602 old_immediate_quit = immediate_quit;
603 int swallowed_cr = 0;
604
605 status->kind = TARGET_WAITKIND_EXITED;
606 status->value.integer = 0;
607
608 if (need_artificial_trap != 0)
609 {
610 status->kind =
611 TARGET_WAITKIND_STOPPED;
612 status->value.sig = TARGET_SIGNAL_TRAP;
613 need_artificial_trap--;
614 return 0;
615 }
616
617 timeout = 5; /* Don't time out for a while - user program is running.
618 */
619 immediate_quit = 1; /* Helps ability to QUIT */
620 while (1)
621 {
622 QUIT; /* Let user quit and leave process running */
623 ch_handled = 0;
624 ch = readchar ();
625 if (ch == *bp)
626 {
627 bp++;
628 if (*bp == '\0')
629 break;
630 ch_handled = 1;
631
632 *swallowed_p++ = ch;
633 }
634 else
635 {
636 bp = bpt;
637 }
638 if
639 (ch == *ep || *ep == '?')
640 {
641 ep++;
642 if (*ep == '\0')
643 break;
644
645 if (!ch_handled)
646 *swallowed_p++ = ch;
647 ch_handled =
648 1;
649 }
650 else
651 {
652 ep = exitmsg;
653 }
654
655 if (!ch_handled)
656 {
657 char *p;
658
659 /* Print out any characters which have been swallowed. */
660 for (p = swallowed; p < swallowed_p; ++p)
661 putchar_unfiltered (*p);
662 swallowed_p = swallowed;
663
664 if ((ch != '\r' && ch != '\n') || swallowed_cr > 10)
665 {
666 putchar_unfiltered (ch);
667 swallowed_cr = 10;
668 }
669 swallowed_cr++;
670
671 }
672 }
673 if (*bp == '\0')
674 {
675 status->kind = TARGET_WAITKIND_STOPPED;
676 status->value.sig = TARGET_SIGNAL_TRAP;
677 expect_prompt ();
678 }
679 else
680 {
681 status->kind = TARGET_WAITKIND_EXITED;
682 status->value.integer =
683 TARGET_SIGNAL_STOP;
684 }
685
686 timeout = old_timeout;
687 immediate_quit = old_immediate_quit;
688 return
689 0;
690 }
691
692 /* Return the name of register number REGNO in the form input and
693 output by hms.
694
695 Returns a pointer to a static buffer containing the answer. */
696 static char *
697 get_reg_name (regno)
698 int regno;
699 {
700 static char *rn[] =
701 REGISTER_NAMES;
702
703 return rn[regno];
704 }
705
706 /* Read the remote registers. */
707
708 static int
709 gethex (length, start, ok)
710 unsigned int length;
711 char *start;
712 int *ok;
713 {
714 int result = 0;
715
716 while (length--)
717 {
718 result <<= 4;
719 if (*start >= 'a' && *start <= 'f')
720 {
721 result += *start - 'a' + 10;
722 }
723 else if (*start >= 'A' &&
724 *start <= 'F')
725 {
726 result += *start - 'A' + 10;
727 }
728 else if
729 (*start >= '0' && *start <= '9')
730 {
731 result += *start - '0';
732 }
733 else
734 *ok = 0;
735 start++;
736
737 }
738 return result;
739 }
740 static int
741 timed_read (buf, n, timeout)
742 char
743 *buf;
744
745 {
746 int i;
747 char c;
748
749 i = 0;
750 while (i < n)
751 {
752 c = readchar ();
753
754 if (c == 0)
755 return i;
756 buf[i] = c;
757 i++;
758
759 }
760 return i;
761 }
762
763 hms_write (a, l)
764 char *a;
765 {
766 int i;
767
768 SERIAL_WRITE (desc, a, l);
769
770 if (!quiet || remote_debug)
771 {
772 printf_unfiltered ("<");
773 for (i = 0; i < l; i++)
774 {
775 printf_unfiltered ("%c", a[i]);
776 }
777 printf_unfiltered (">");
778 }
779 }
780
781 hms_write_cr (s)
782 char *s;
783 {
784 hms_write (s, strlen (s));
785 hms_write ("\r\n", 2);
786 }
787
788 #ifdef GDB_TARGET_IS_H8500
789
790 /* H8/500 monitor reg dump looks like:
791
792 HMS>r
793 PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00
794 R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE
795 HMS>
796
797
798 */
799
800 supply_val (n, size, ptr, segptr)
801 int n;
802 int size;
803 char *ptr;
804 char *segptr;
805 {
806 int ok;
807 char raw[4];
808 switch (size)
809 {
810 case 2:
811 raw[0] = gethex (2, ptr, &ok);
812 raw[1] = gethex (2, ptr + 2, &ok);
813 supply_register (n, raw);
814 break;
815 case 1:
816 raw[0] = gethex (2, ptr, &ok);
817 supply_register (n, raw);
818 break;
819 case 4:
820 {
821 int v = gethex (4, ptr, &ok);
822 v |= gethex (2, segptr, &ok) << 16;
823 raw[0] = 0;
824 raw[1] = (v >> 16) & 0xff;
825 raw[2] = (v >> 8) & 0xff;
826 raw[3] = (v >> 0) & 0xff;
827 supply_register (n, raw);
828 }
829 }
830
831 }
832 static void
833 hms_fetch_register (dummy)
834 int dummy;
835 {
836 #define REGREPLY_SIZE 108
837 char linebuf[REGREPLY_SIZE + 1];
838 int i;
839 int s;
840 int gottok;
841
842 LONGEST reg[NUM_REGS];
843 check_open ();
844
845 do
846 {
847
848 hms_write_cr ("r");
849 expect ("r");
850 s = timed_read (linebuf + 1, REGREPLY_SIZE, 1);
851
852 linebuf[REGREPLY_SIZE] = 0;
853 gottok = 0;
854 if (linebuf[3] == 'P' &&
855 linebuf[4] == 'C' &&
856 linebuf[5] == ':' &&
857 linebuf[105] == 'H' &&
858 linebuf[106] == 'M' &&
859 linebuf[107] == 'S')
860 {
861
862 /*
863 012
864 r**
865 -------1---------2---------3---------4---------5-----
866 345678901234567890123456789012345678901234567890123456
867 PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00**
868 ---6---------7---------8---------9--------10----
869 789012345678901234567890123456789012345678901234
870 R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE**
871
872 56789
873 HMS>
874 */
875 gottok = 1;
876
877
878 supply_val (PC_REGNUM, 4, linebuf + 6, linebuf + 29);
879
880 supply_val (CCR_REGNUM, 2, linebuf + 14);
881 supply_val (SEG_C_REGNUM, 1, linebuf + 29);
882 supply_val (SEG_D_REGNUM, 1, linebuf + 35);
883 supply_val (SEG_E_REGNUM, 1, linebuf + 41);
884 supply_val (SEG_T_REGNUM, 1, linebuf + 47);
885 for (i = 0; i < 8; i++)
886 {
887 static int sr[8] =
888 {35, 35, 35, 35,
889 41, 41, 47, 47};
890
891 char raw[4];
892 char *src = linebuf + 64 + 5 * i;
893 char *segsrc = linebuf + sr[i];
894 supply_val (R0_REGNUM + i, 2, src);
895 supply_val (PR0_REGNUM + i, 4, src, segsrc);
896 }
897 }
898 if (!gottok)
899 {
900 hms_write_cr ("");
901 expect ("HMS>");
902 }
903 }
904 while (!gottok);
905 }
906 #endif
907
908 #ifdef GDB_TARGET_IS_H8300
909 static void
910 hms_fetch_register (dummy)
911 int dummy;
912 {
913 #define REGREPLY_SIZE 79
914 char linebuf[REGREPLY_SIZE + 1];
915 int i;
916 int s;
917 int gottok;
918
919 ULONGEST reg[NUM_REGS];
920
921 check_open ();
922
923 do
924 {
925 hms_write_cr ("r");
926
927 s = timed_read (linebuf, 1, 1);
928
929 while (linebuf[0] != 'r')
930 s = timed_read (linebuf, 1, 1);
931
932 s = timed_read (linebuf + 1, REGREPLY_SIZE - 1, 1);
933
934 linebuf[REGREPLY_SIZE] = 0;
935 gottok = 0;
936 if (linebuf[0] == 'r' &&
937 linebuf[3] == 'P' &&
938 linebuf[4] == 'C' &&
939 linebuf[5] == '=' &&
940 linebuf[75] == 'H' &&
941 linebuf[76] == 'M' &&
942 linebuf[77] == 'S')
943 {
944 /*
945 PC=XXXX CCR=XX:XXXXXXXX R0-R7= XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
946 5436789012345678901234567890123456789012345678901234567890123456789012
947 0 1 2 3 4 5 6
948 */
949 gottok = 1;
950
951 reg[PC_REGNUM] = gethex (4, linebuf + 6, &gottok);
952 reg[CCR_REGNUM] = gethex (2, linebuf + 15, &gottok);
953 for (i = 0; i < 8; i++)
954 {
955 reg[i] = gethex (4, linebuf + 34 + 5 * i, &gottok);
956 }
957 }
958 }
959 while (!gottok);
960 for (i = 0; i < NUM_REGS; i++)
961 {
962 char swapped[2];
963
964 swapped[1] = reg[i];
965 swapped[0] = (reg[i]) >> 8;
966
967 supply_register (i, swapped);
968 }
969 }
970 #endif
971 /* Store register REGNO, or all if REGNO == -1.
972 Return errno value. */
973 static void
974 hms_store_register (regno)
975 int regno;
976 {
977 if (regno == -1)
978 {
979 for (regno = 0; regno < NUM_REGS; regno++)
980 {
981 hms_store_register (regno);
982 }
983 }
984 else
985 {
986 char *name = get_reg_name (regno);
987 char buffer[100];
988 /* Some regs dont really exist */
989 if (!(name[0] == 'p' && name[1] == 'r')
990 && !(name[0] == 'c' && name[1] == 'y')
991 && !(name[0] == 't' && name[1] == 'i')
992 && !(name[0] == 'i' && name[1] == 'n'))
993 {
994 sprintf (buffer, "r %s=%x", name, read_register (regno));
995 hms_write_cr (buffer);
996 expect_prompt ();
997 }
998 }
999 }
1000
1001
1002 /* Get ready to modify the registers array. On machines which store
1003 individual registers, this doesn't need to do anything. On machines
1004 which store all the registers in one fell swoop, this makes sure
1005 that registers contains all the registers from the program being
1006 debugged. */
1007
1008 void
1009 hms_prepare_to_store ()
1010 {
1011 /* Do nothing, since we can store individual regs */
1012 }
1013
1014 static CORE_ADDR
1015 translate_addr (addr)
1016 CORE_ADDR addr;
1017 {
1018
1019 return (addr);
1020
1021 }
1022
1023
1024 int
1025 hms_xfer_inferior_memory (memaddr, myaddr, len, write, target)
1026 CORE_ADDR memaddr;
1027 char *myaddr;
1028 int len;
1029 int write;
1030 struct target_ops *target; /* ignored */
1031 {
1032
1033 return len;
1034 }
1035
1036 int
1037 hms_write_inferior_memory (memaddr, myaddr, len)
1038 CORE_ADDR memaddr;
1039 unsigned char *myaddr;
1040 int len;
1041 {
1042 bfd_vma addr;
1043 int done;
1044 int todo;
1045 char buffer[100];
1046 done = 0;
1047 hms_write_cr (".");
1048 expect_prompt ();
1049 while (done < len)
1050 {
1051 char *ptr = buffer;
1052 int thisgo;
1053 int idx;
1054
1055 thisgo = len - done;
1056 if (thisgo > 20)
1057 thisgo = 20;
1058
1059 sprintf (ptr, "M.B %4x =", memaddr + done);
1060 ptr += 10;
1061 for (idx = 0; idx < thisgo; idx++)
1062 {
1063 sprintf (ptr, "%2x ", myaddr[idx + done]);
1064 ptr += 3;
1065 }
1066 hms_write_cr (buffer);
1067 expect_prompt ();
1068 done += thisgo;
1069 }
1070 }
1071
1072 void
1073 hms_files_info ()
1074 {
1075 char *file = "nothing";
1076
1077 if (exec_bfd)
1078 file = bfd_get_filename (exec_bfd);
1079
1080 if (exec_bfd)
1081 #ifdef __GO32__
1082 printf_filtered ("\tAttached to DOS asynctsr and running program %s\n", file);
1083 #else
1084 printf_filtered ("\tAttached to %s at %d baud and running program %s\n", dev_name, baudrate, file);
1085 #endif
1086 printf_filtered ("\ton an H8/300 processor.\n");
1087 }
1088
1089 /* Copy LEN bytes of data from debugger memory at MYADDR
1090 to inferior's memory at MEMADDR. Returns errno value.
1091 * sb/sh instructions don't work on unaligned addresses, when TU=1.
1092 */
1093
1094 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
1095 at debugger address MYADDR. Returns errno value. */
1096 int
1097 hms_read_inferior_memory (memaddr, myaddr, len)
1098 CORE_ADDR memaddr;
1099 char *myaddr;
1100 int len;
1101 {
1102 /* Align to nearest low 16 bits */
1103 int i;
1104
1105 CORE_ADDR start = memaddr;
1106 CORE_ADDR end = memaddr + len - 1;
1107
1108 int ok = 1;
1109
1110 /*
1111 AAAA: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX '................'
1112 012345678901234567890123456789012345678901234567890123456789012345
1113 0 1 2 3 4 5 6
1114 */
1115 char buffer[66];
1116
1117 if (memaddr & 0xf)
1118 abort ();
1119 if (len != 16)
1120 abort ();
1121
1122 sprintf (buffer, "m %4x %4x", start & 0xffff, end & 0xffff);
1123
1124 flush ();
1125 hms_write_cr (buffer);
1126 /* drop the echo and newline */
1127 for (i = 0; i < 13; i++)
1128 readchar ();
1129
1130 /* Grab the lines as they come out and fill the area */
1131 /* Skip over cr */
1132 while (1)
1133 {
1134 int p;
1135 int i;
1136 int addr;
1137 size_t idx;
1138
1139 char byte[16];
1140
1141 buffer[0] = readchar ();
1142 while (buffer[0] == '\r'
1143 || buffer[0] == '\n')
1144 buffer[0] = readchar ();
1145
1146 if (buffer[0] == 'M')
1147 break;
1148
1149 for (i = 1; i < 50; i++)
1150 {
1151 buffer[i] = readchar ();
1152 }
1153 /* sometimes we loose characters in the ascii representation of the
1154 data. I don't know where. So just scan for the end of line */
1155 i = readchar ();
1156 while (i != '\n' && i != '\r')
1157 i = readchar ();
1158
1159 /* Now parse the line */
1160
1161 addr = gethex (4, buffer, &ok);
1162 idx = 6;
1163 for (p = 0; p < 16; p += 2)
1164 {
1165 byte[p] = gethex (2, buffer + idx, &ok);
1166 byte[p + 1] = gethex (2, buffer + idx + 2, &ok);
1167 idx += 5;
1168 }
1169
1170 for (p = 0; p < 16; p++)
1171 {
1172 if (addr + p >= memaddr &&
1173 addr + p < memaddr + len)
1174 {
1175 myaddr[(addr + p) - memaddr] = byte[p];
1176
1177 }
1178
1179 }
1180 }
1181 #ifdef GDB_TARGET_IS_H8500
1182 expect ("ore>");
1183 #endif
1184 #ifdef GDB_TARGET_IS_H8300
1185 expect ("emory>");
1186 #endif
1187 hms_write_cr (".");
1188
1189 expect_prompt ();
1190 return len;
1191 }
1192
1193
1194
1195 #define MAX_BREAKS 16
1196 static int num_brkpts = 0;
1197 static int
1198 hms_insert_breakpoint (addr, save)
1199 CORE_ADDR addr;
1200 char *save; /* Throw away, let hms save instructions */
1201 {
1202 check_open ();
1203
1204 if (num_brkpts < MAX_BREAKS)
1205 {
1206 char buffer[100];
1207
1208 num_brkpts++;
1209 sprintf (buffer, "b %x", addr & 0xffff);
1210 hms_write_cr (buffer);
1211 expect_prompt ();
1212 return (0);
1213 }
1214 else
1215 {
1216 fprintf_filtered (gdb_stderr,
1217 "Too many break points, break point not installed\n");
1218 return (1);
1219 }
1220
1221 }
1222 static int
1223 hms_remove_breakpoint (addr, save)
1224 CORE_ADDR addr;
1225 char *save; /* Throw away, let hms save instructions */
1226 {
1227 if (num_brkpts > 0)
1228 {
1229 char buffer[100];
1230
1231 num_brkpts--;
1232 sprintf (buffer, "b - %x", addr & 0xffff);
1233 hms_write_cr (buffer);
1234 expect_prompt ();
1235
1236 }
1237 return (0);
1238 }
1239
1240 /* Clear the hmss notion of what the break points are */
1241 static int
1242 hms_clear_breakpoints ()
1243 {
1244
1245 if (is_open)
1246 {
1247 hms_write_cr ("b -");
1248 expect_prompt ();
1249 }
1250 num_brkpts = 0;
1251 }
1252 static void
1253 hms_mourn ()
1254 {
1255 hms_clear_breakpoints ();
1256 unpush_target (&hms_ops);
1257 generic_mourn_inferior ();
1258 }
1259
1260 /* Put a command string, in args, out to the hms. The hms is assumed to
1261 be in raw mode, all writing/reading done through desc.
1262 Ouput from the hms is placed on the users terminal until the
1263 prompt from the hms is seen.
1264 FIXME: Can't handle commands that take input. */
1265
1266 void
1267 hms_com (args, fromtty)
1268 char *args;
1269 int fromtty;
1270 {
1271 check_open ();
1272
1273 if (!args)
1274 return;
1275
1276 /* Clear all input so only command relative output is displayed */
1277
1278 hms_write_cr (args);
1279 /* hms_write ("\030", 1); */
1280 expect_prompt ();
1281 }
1282
1283 static void
1284 hms_open (name, from_tty)
1285 char *name;
1286 int from_tty;
1287 {
1288 unsigned int prl;
1289 char *p;
1290
1291 if (name == 0)
1292 {
1293 name = "";
1294 }
1295 if (is_open)
1296 hms_close (0);
1297 dev_name = strdup (name);
1298
1299 if (!(desc = SERIAL_OPEN (dev_name)))
1300 perror_with_name ((char *) dev_name);
1301
1302 SERIAL_RAW (desc);
1303 is_open = 1;
1304 push_target (&hms_ops);
1305 dcache_ptr = dcache_init (hms_read_inferior_memory,
1306 hms_write_inferior_memory);
1307 remote_dcache = 1;
1308 /* Hello? Are you there? */
1309 SERIAL_WRITE (desc, "\r\n", 2);
1310 expect_prompt ();
1311
1312 /* Clear any break points */
1313 hms_clear_breakpoints ();
1314
1315 printf_filtered ("Connected to remote board running HMS monitor.\n");
1316 add_commands ();
1317 /* hms_drain (); */
1318 }
1319
1320 /* Define the target subroutine names */
1321
1322 struct target_ops hms_ops ;
1323 static void init_hms_ops(void)
1324 {
1325 hms_ops.to_shortname = "hms";
1326 hms_ops.to_longname = "Remote HMS monitor";
1327 hms_ops.to_doc = "Use the H8 evaluation board running the HMS monitor connected\n\
1328 by a serial line.";
1329 hms_ops.to_open = hms_open;
1330 hms_ops.to_close = hms_close;
1331 hms_ops.to_attach = 0;
1332 hms_ops.to_post_attach = NULL;
1333 hms_ops.to_require_attach = NULL;
1334 hms_ops.to_detach = hms_detach;
1335 hms_ops.to_require_detach = NULL;
1336 hms_ops.to_resume = hms_resume;
1337 hms_ops.to_wait = hms_wait;
1338 hms_ops.to_post_wait = NULL;
1339 hms_ops.to_fetch_registers = hms_fetch_register;
1340 hms_ops.to_store_registers = hms_store_register;
1341 hms_ops.to_prepare_to_store = hms_prepare_to_store;
1342 hms_ops.to_xfer_memory = hms_xfer_inferior_memory;
1343 hms_ops.to_files_info = hms_files_info;
1344 hms_ops.to_insert_breakpoint = hms_insert_breakpoint;
1345 hms_ops.to_remove_breakpoint = hms_remove_breakpoint;
1346 hms_ops.to_terminal_init = 0;
1347 hms_ops.to_terminal_inferior = 0;
1348 hms_ops.to_terminal_ours_for_output = 0;
1349 hms_ops.to_terminal_ours = 0;
1350 hms_ops.to_terminal_info = 0;
1351 hms_ops.to_kill = hms_kill;
1352 hms_ops.to_load = generic_load;
1353 hms_ops.to_lookup_symbol = 0;
1354 hms_ops.to_create_inferior = hms_create_inferior;
1355 hms_ops.to_post_startup_inferior = NULL;
1356 hms_ops.to_acknowledge_created_inferior = NULL;
1357 hms_ops.to_clone_and_follow_inferior = NULL;
1358 hms_ops.to_post_follow_inferior_by_clone = NULL;
1359 hms_ops.to_insert_fork_catchpoint = NULL;
1360 hms_ops.to_remove_fork_catchpoint = NULL;
1361 hms_ops.to_insert_vfork_catchpoint = NULL;
1362 hms_ops.to_remove_vfork_catchpoint = NULL;
1363 hms_ops.to_has_forked = NULL;
1364 hms_ops.to_has_vforked = NULL;
1365 hms_ops.to_can_follow_vfork_prior_to_exec = NULL;
1366 hms_ops.to_post_follow_vfork = NULL;
1367 hms_ops.to_insert_exec_catchpoint = NULL;
1368 hms_ops.to_remove_exec_catchpoint = NULL;
1369 hms_ops.to_has_execd = NULL;
1370 hms_ops.to_reported_exec_events_per_exec_call = NULL;
1371 hms_ops.to_has_exited = NULL;
1372 hms_ops.to_mourn_inferior = hms_mourn;
1373 hms_ops.to_can_run = 0;
1374 hms_ops.to_notice_signals = 0;
1375 hms_ops.to_thread_alive = 0;
1376 hms_ops.to_stop = 0;
1377 hms_ops.to_pid_to_exec_file = NULL;
1378 hms_ops.to_core_file_to_sym_file = NULL;
1379 hms_ops.to_stratum = process_stratum;
1380 hms_ops.DONT_USE = 0;
1381 hms_ops.to_has_all_memory = 1;
1382 hms_ops.to_has_memory = 1;
1383 hms_ops.to_has_stack = 1;
1384 hms_ops.to_has_registers = 1;
1385 hms_ops.to_has_execution = 1;
1386 hms_ops.to_sections = 0;
1387 hms_ops.to_sections_end = 0;
1388 hms_ops.to_magic = OPS_MAGIC;
1389 };
1390
1391 hms_quiet () /* FIXME - this routine can be removed after Dec '94 */
1392 {
1393 quiet = !quiet;
1394 if (quiet)
1395 printf_filtered ("Snoop disabled\n");
1396 else
1397 printf_filtered ("Snoop enabled\n");
1398
1399 printf_filtered ("`snoop' is obsolete, please use `set remotedebug'.\n");
1400 }
1401
1402 hms_device (s)
1403 char *s;
1404 {
1405 if (s)
1406 {
1407 dev_name = get_word (&s);
1408 }
1409 }
1410
1411 static
1412 hms_speed (s)
1413 char *s;
1414 {
1415 check_open ();
1416
1417 if (s)
1418 {
1419 char buffer[100];
1420 int newrate = atoi (s);
1421 int which = 0;
1422
1423 if (SERIAL_SETBAUDRATE (desc, newrate))
1424 error ("Can't use %d baud\n", newrate);
1425
1426 printf_filtered ("Checking target is in sync\n");
1427
1428 printf_filtered ("Sending commands to set target to %d\n",
1429 baudrate);
1430
1431 sprintf (buffer, "tm %d. N 8 1", baudrate);
1432 hms_write_cr (buffer);
1433 }
1434 }
1435
1436 /***********************************************************************/
1437
1438 static void
1439 hms_drain (args, fromtty)
1440 char *args;
1441 int fromtty;
1442 {
1443 int c;
1444 while (1)
1445 {
1446 c = SERIAL_READCHAR (desc, 1);
1447 if (c == SERIAL_TIMEOUT)
1448 break;
1449 if (c == SERIAL_ERROR)
1450 break;
1451 if (c > ' ' && c < 127)
1452 printf ("%c", c & 0xff);
1453 else
1454 printf ("<%x>", c & 0xff);
1455 }
1456 }
1457
1458 static void
1459 add_commands ()
1460 {
1461
1462 add_com ("hms_drain", class_obscure, hms_drain,
1463 "Drain pending hms text buffers.");
1464 }
1465
1466 static void
1467 remove_commands ()
1468 {
1469 extern struct cmd_list_element *cmdlist;
1470 delete_cmd ("hms-drain", &cmdlist);
1471 }
1472
1473
1474 void
1475 _initialize_remote_hms ()
1476 {
1477 init_hms_ops() ;
1478 add_target (&hms_ops);
1479
1480 add_com ("hms <command>", class_obscure, hms_com,
1481 "Send a command to the HMS monitor.");
1482
1483 /* FIXME - hms_quiet and `snoop' can be removed after Dec '94 */
1484 add_com ("snoop", class_obscure, hms_quiet,
1485 "Show what commands are going to the monitor (OBSOLETE - see 'set remotedebug')");
1486
1487 add_com ("device", class_obscure, hms_device,
1488 "Set the terminal line for HMS communications");
1489
1490 add_com ("speed", class_obscure, hms_speed,
1491 "Set the terminal line speed for HMS communications");
1492
1493 dev_name = NULL;
1494 }
1495 #endif
1496
This page took 0.060582 seconds and 4 git commands to generate.