* symfile.c (reread_symbols): When re-reading symbols, do all the
[binutils-gdb.git] / gdb / remote-mon.c
1 /* Remote debugging interface for boot monitors, for GDB.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Rob Savoye for Cygnus.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 /* This file was derived from remote-eb.c, which did a similar job, but for
22 an AMD-29K running EBMON. That file was in turn derived from remote.c
23 as mentioned in the following comment (left in for comic relief):
24
25 "This is like remote.c but is for an esoteric situation--
26 having an a29k board in a PC hooked up to a unix machine with
27 a serial line, and running ctty com1 on the PC, through which
28 the unix machine can run ebmon. Not to mention that the PC
29 has PC/NFS, so it can access the same executables that gdb can,
30 over the net in real time."
31
32 In reality, this module talks to a debug monitor called 'MONITOR', which
33 We communicate with MONITOR via either a direct serial line, or a TCP
34 (or possibly TELNET) stream to a terminal multiplexor,
35 which in turn talks to the target board.
36
37 This is based on remote-st2000.c. I left in the above note here for histerical
38 reasons.
39 */
40
41 #include "defs.h"
42 #include "gdbcore.h"
43 #include "target.h"
44 #include "wait.h"
45 #include <varargs.h>
46 #include <signal.h>
47 #include <string.h>
48 #include <sys/types.h>
49 #include "command.h"
50 #include "serial.h"
51 #include "monitor.h"
52 #include "remote-utils.h"
53
54 #ifdef HAVE_TERMIO
55 # define TERMINAL struct termios
56 #else
57 # define TERMINAL struct sgttyb
58 #endif
59
60 struct monitor_ops *current_monitor;
61 extern struct target_ops rom68k_ops; /* Forward declaration */
62 extern struct target_ops mon68_ops; /* Forward declaration */
63 extern struct target_ops monitor_bug_ops; /* Forward declaration */
64 extern struct monitor_ops rom68k_cmds; /* Forward declaration */
65 extern struct monitor_ops mon68_cmds; /* Forward declaration */
66 extern struct monitor_ops bug_cmds; /* Forward declaration */
67 extern struct cmd_list_element *setlist;
68 extern struct cmd_list_element *unsetlist;
69 struct cmd_list_element *showlist;
70
71 static void monitor_close();
72 static void monitor_fetch_register();
73 static void monitor_store_register();
74 #if 0
75 static int sr_get_debug(); /* flag set by "set remotedebug" */
76 #endif
77 static int hashmark; /* flag set by "set hash" */
78
79 /* FIXME: Replace with sr_get_debug (). */
80 #define LOG_FILE "monitor.log"
81 #if defined (LOG_FILE)
82 FILE *log_file;
83 #endif
84
85 static int timeout = 24;
86
87 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
88 monitor_open knows that we don't have a file open when the program starts.
89 */
90 static serial_t monitor_desc = NULL;
91
92 /* Send data to monitor. Works just like printf. */
93
94 static void
95 printf_monitor(va_alist)
96 va_dcl
97 {
98 va_list args;
99 char *pattern;
100 char buf[200];
101 int i;
102
103 va_start(args);
104
105 pattern = va_arg(args, char *);
106
107 vsprintf(buf, pattern, args);
108
109 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
110 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
111 }
112
113 /* Read a character from the remote system, doing all the fancy
114 timeout stuff. */
115 static int
116 readchar(timeout)
117 int timeout;
118 {
119 int c;
120
121 c = SERIAL_READCHAR(monitor_desc, timeout);
122
123 if (sr_get_debug())
124 putchar(c & 0x7f);
125
126 #ifdef LOG_FILE
127 if (isascii (c))
128 putc(c & 0x7f, log_file);
129 #endif
130
131 if (c >= 0)
132 return c & 0x7f;
133
134 if (c == SERIAL_TIMEOUT)
135 {
136 if (timeout == 0)
137 return c; /* Polls shouldn't generate timeout errors */
138
139 error("Timeout reading from remote system.");
140 }
141
142 perror_with_name("remote-monitor");
143 }
144
145 /* Scan input from the remote system, until STRING is found. If DISCARD is
146 non-zero, then discard non-matching input, else print it out.
147 Let the user break out immediately. */
148 static void
149 expect(string, discard)
150 char *string;
151 int discard;
152 {
153 char *p = string;
154 int c;
155
156 if (sr_get_debug())
157 printf ("Expecting \"%s\"\n", string);
158
159 immediate_quit = 1;
160 while (1)
161 {
162 c = readchar(timeout);
163 if (!isascii (c))
164 continue;
165 if (c == *p++)
166 {
167 if (*p == '\0')
168 {
169 immediate_quit = 0;
170 if (sr_get_debug())
171 printf ("\nMatched\n");
172 return;
173 }
174 }
175 else
176 {
177 if (!discard)
178 {
179 fwrite(string, 1, (p - 1) - string, stdout);
180 putchar((char)c);
181 fflush(stdout);
182 }
183 p = string;
184 }
185 }
186 }
187
188 /* Keep discarding input until we see the MONITOR prompt.
189
190 The convention for dealing with the prompt is that you
191 o give your command
192 o *then* wait for the prompt.
193
194 Thus the last thing that a procedure does with the serial line
195 will be an expect_prompt(). Exception: monitor_resume does not
196 wait for the prompt, because the terminal is being handed over
197 to the inferior. However, the next thing which happens after that
198 is a monitor_wait which does wait for the prompt.
199 Note that this includes abnormal exit, e.g. error(). This is
200 necessary to prevent getting into states from which we can't
201 recover. */
202 static void
203 expect_prompt(discard)
204 int discard;
205 {
206 #if defined (LOG_FILE)
207 /* This is a convenient place to do this. The idea is to do it often
208 enough that we never lose much data if we terminate abnormally. */
209 fflush(log_file);
210 #endif
211 expect (PROMPT, discard);
212 }
213
214 /* Get a hex digit from the remote system & return its value.
215 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
216 static int
217 get_hex_digit(ignore_space)
218 int ignore_space;
219 {
220 int ch;
221 while (1)
222 {
223 ch = readchar(timeout);
224 if (ch >= '0' && ch <= '9')
225 return ch - '0';
226 else if (ch >= 'A' && ch <= 'F')
227 return ch - 'A' + 10;
228 else if (ch >= 'a' && ch <= 'f')
229 return ch - 'a' + 10;
230 else if (ch == ' ' && ignore_space)
231 ;
232 else
233 {
234 expect_prompt(1);
235 error("Invalid hex digit from remote system.");
236 }
237 }
238 }
239
240 /* Get a byte from monitor and put it in *BYT. Accept any number
241 leading spaces. */
242 static void
243 get_hex_byte (byt)
244 char *byt;
245 {
246 int val;
247
248 val = get_hex_digit (1) << 4;
249 val |= get_hex_digit (0);
250 *byt = val;
251 }
252
253 /* Get N 32-bit words from remote, each preceded by a space,
254 and put them in registers starting at REGNO. */
255 static void
256 get_hex_regs (n, regno)
257 int n;
258 int regno;
259 {
260 long val;
261 int i;
262
263 for (i = 0; i < n; i++)
264 {
265 int j;
266
267 val = 0;
268 for (j = 0; j < 8; j++)
269 val = (val << 4) + get_hex_digit (j == 0);
270 supply_register (regno++, (char *) &val);
271 }
272 }
273
274 /* This is called not only when we first attach, but also when the
275 user types "run" after having attached. */
276 static void
277 monitor_create_inferior (execfile, args, env)
278 char *execfile;
279 char *args;
280 char **env;
281 {
282 int entry_pt;
283
284 if (args && *args)
285 error("Can't pass arguments to remote MONITOR process");
286
287 if (execfile == 0 || exec_bfd == 0)
288 error("No exec file specified");
289
290 entry_pt = (int) bfd_get_start_address (exec_bfd);
291
292 #ifdef LOG_FILE
293 fputs ("\nIn Create_inferior()", log_file);
294 #endif
295
296 /* The "process" (board) is already stopped awaiting our commands, and
297 the program is already downloaded. We just set its PC and go. */
298
299 clear_proceed_status ();
300
301 /* Tell wait_for_inferior that we've started a new process. */
302 init_wait_for_inferior ();
303
304 /* Set up the "saved terminal modes" of the inferior
305 based on what modes we are starting it with. */
306 target_terminal_init ();
307
308 /* Install inferior's terminal modes. */
309 target_terminal_inferior ();
310
311 /* insert_step_breakpoint (); FIXME, do we need this? */
312 proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
313 }
314
315 /* Open a connection to a remote debugger.
316 NAME is the filename used for communication. */
317
318 static int baudrate = 9600;
319 static char dev_name[100];
320
321 static void
322 general_open(args, name, from_tty)
323 char *args;
324 char *name;
325 int from_tty;
326 {
327 if (args == NULL)
328 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
329 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
330
331 target_preopen(from_tty);
332
333 /* if (is_open) */
334 monitor_close(0);
335
336 strcpy(dev_name, args);
337 monitor_desc = SERIAL_OPEN(dev_name);
338
339 if (monitor_desc == NULL)
340 perror_with_name(dev_name);
341
342 /* The baud rate was specified when GDB was started. */
343 if (SERIAL_SETBAUDRATE (monitor_desc, sr_get_baud_rate()))
344 {
345 SERIAL_CLOSE (monitor_desc);
346 perror_with_name (name);
347 }
348
349 SERIAL_RAW(monitor_desc);
350
351 #if defined (LOG_FILE)
352 log_file = fopen (LOG_FILE, "w");
353 if (log_file == NULL)
354 perror_with_name (LOG_FILE);
355 #endif
356
357 /* Hello? Are you there? */
358 printf_monitor("\r"); /* CR wakes up monitor */
359
360 expect_prompt(1);
361
362 if (from_tty)
363 printf("Remote %s connected to %s\n", target_shortname,
364 dev_name);
365 }
366
367 static void
368 rom68k_open(args, from_tty)
369 char *args;
370 int from_tty;
371 {
372 push_target(&rom68k_ops);
373 push_monitor (&rom68k_cmds);
374
375 general_open (args, "rom68k", from_tty);
376 }
377
378 static void
379 mon68_open(args, from_tty)
380 char *args;
381 int from_tty;
382 {
383 push_target(&mon68_ops);
384 push_monitor (&mon68_cmds);
385
386 general_open (args, "mon68", from_tty);
387 }
388
389 static void
390 bug_open(args, from_tty)
391 char *args;
392 int from_tty;
393 {
394 push_target(&monitor_bug_ops);
395 push_monitor (&bug_cmds);
396
397 general_open (args, "bug", from_tty);
398 }
399
400 /*
401 * _close -- Close out all files and local state before this target loses control.
402 */
403
404 static void
405 monitor_close (quitting)
406 int quitting;
407 {
408 SERIAL_CLOSE(monitor_desc);
409 monitor_desc = NULL;
410
411 #if defined (LOG_FILE)
412 if (log_file) {
413 if (ferror(log_file))
414 fprintf(stderr, "Error writing log file.\n");
415 if (fclose(log_file) != 0)
416 fprintf(stderr, "Error closing log file.\n");
417 }
418 #endif
419 }
420
421 /* Terminate the open connection to the remote debugger.
422 Use this when you want to detach and do something else
423 with your gdb. */
424 static void
425 monitor_detach (from_tty)
426 int from_tty;
427 {
428 pop_target(); /* calls monitor_close to do the real work */
429 if (from_tty)
430 printf ("Ending remote %s debugging\n", target_shortname);
431 }
432
433 /*
434 * _resume -- Tell the remote machine to resume.
435 */
436 static void
437 monitor_resume (pid, step, sig)
438 int pid, step, sig;
439 {
440 #ifdef LOG_FILE
441 fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
442 #endif
443
444 if (step)
445 {
446 printf_monitor (STEP_CMD);
447 /* wait for the echo. */
448 expect (STEP_CMD, 1);
449 }
450 else
451 {
452 printf_monitor (GO_CMD);
453 /* swallow the echo. */
454 expect (GO_CMD, 1);
455 }
456 }
457
458 /*
459 * _wait -- Wait until the remote machine stops, then return,
460 * storing status in status just as `wait' would.
461 */
462
463 static int
464 monitor_wait (pid, status)
465 int pid;
466 WAITTYPE *status;
467 {
468 int old_timeout = timeout;
469 #ifdef LOG_FILE
470 fputs ("\nIn wait ()", log_file);
471 #endif
472
473 WSETEXIT ((*status), 0);
474
475 timeout = 0; /* Don't time out -- user program is running. */
476
477 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
478
479 WSETSTOP ((*status), SIGTRAP);
480
481 timeout = old_timeout;
482
483 return 0;
484 }
485
486 /* Return the name of register number regno in the form input and output by
487 monitor. Currently, register_names just happens to contain exactly what
488 monitor wants. Lets take advantage of that just as long as possible! */
489
490 static char *
491 get_reg_name (regno)
492 int regno;
493 {
494 static char buf[50];
495 const char *p;
496 char *b;
497
498 b = buf;
499
500 if (regno < 0)
501 return ("");
502 for (p = reg_names[regno]; *p; p++)
503 *b++ = toupper(*p);
504 *b = '\000';
505
506 return buf;
507 }
508
509 /* read the remote registers into the block regs. */
510
511 static void
512 monitor_fetch_registers ()
513 {
514 int regno;
515
516 /* yeah yeah, i know this is horribly inefficient. but it isn't done
517 very often... i'll clean it up later. */
518
519 for (regno = 0; regno <= PC_REGNUM; regno++)
520 monitor_fetch_register(regno);
521 }
522
523 /* Fetch register REGNO, or all registers if REGNO is -1.
524 Returns errno value. */
525 static void
526 monitor_fetch_register (regno)
527 int regno;
528 {
529 int val, j;
530
531 #ifdef LOG_FILE
532 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
533 fflush (log_file);
534 #endif
535
536 if (regno < 0)
537 {
538 monitor_fetch_registers ();
539 }
540 else
541 {
542 char *name = get_reg_name (regno);
543 printf_monitor (GET_REG, name);
544 expect (name, 1);
545 expect (REG_DELIM, 1);
546 if (strcasecmp (name, "SR") == 0)
547 {
548 val = 0;
549 for (j = 0; j < 4; j++)
550 val = (val << 4) + get_hex_digit (j == 0);
551 supply_register (regno, (char *) &val);
552 }
553 else
554 {
555 get_hex_regs (1, regno);
556 }
557 if (CMD_END)
558 {
559 expect (CMD_DELIM);
560 printf_monitor (CMD_END);
561 }
562 expect_prompt (1);
563 }
564 return;
565 }
566
567 /* Store the remote registers from the contents of the block REGS. */
568
569 static void
570 monitor_store_registers ()
571 {
572 int regno;
573
574 for (regno = 0; regno <= PC_REGNUM; regno++)
575 monitor_store_register(regno);
576
577 registers_changed ();
578 }
579
580 /* Store register REGNO, or all if REGNO == 0.
581 return errno value. */
582 static void
583 monitor_store_register (regno)
584 int regno;
585 {
586 #ifdef LOG_FILE
587 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
588 #endif
589 if (regno == -1)
590 monitor_store_registers ();
591 else
592 {
593 if (sr_get_debug())
594 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
595
596 printf_monitor (SET_REG, get_reg_name (regno),
597 read_register (regno));
598
599 expect_prompt (1);
600 }
601 }
602
603 /* Get ready to modify the registers array. On machines which store
604 individual registers, this doesn't need to do anything. On machines
605 which store all the registers in one fell swoop, this makes sure
606 that registers contains all the registers from the program being
607 debugged. */
608
609 static void
610 monitor_prepare_to_store ()
611 {
612 /* Do nothing, since we can store individual regs */
613 }
614
615 static void
616 monitor_files_info ()
617 {
618 printf ("\tAttached to %s at %d baud.\n",
619 dev_name, baudrate);
620 }
621
622 /* Copy LEN bytes of data from debugger memory at MYADDR
623 to inferior's memory at MEMADDR. Returns length moved. */
624 static int
625 monitor_write_inferior_memory (memaddr, myaddr, len)
626 CORE_ADDR memaddr;
627 unsigned char *myaddr;
628 int len;
629 {
630 int i;
631 char buf[10];
632
633 #ifdef LOG_FILE
634 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
635 #endif
636 for (i = 0; i < len; i++)
637 {
638 printf_monitor (MEM_SET_CMD, memaddr + i);
639 expect (sprintf (buf, MEM_PROMPT, memaddr + i), 1);
640 expect (CMD_DELIM);
641 printf_monitor ("%x", myaddr[i]);
642 if (sr_get_debug())
643 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
644 if (CMD_END)
645 {
646 /*** expect (sprintf (buf, MEM_PROMPT, memaddr + i +1), 1);
647 expect (CMD_DELIM); ***/
648 printf_monitor (CMD_END);
649 }
650 expect_prompt (1);
651 }
652 return len;
653 }
654
655 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
656 at debugger address MYADDR. Returns length moved. */
657 static int
658 monitor_read_inferior_memory(memaddr, myaddr, len)
659 CORE_ADDR memaddr;
660 char *myaddr;
661 int len;
662 {
663 int i, j;
664 char buf[20];
665
666 /* Number of bytes read so far. */
667 int count;
668
669 /* Starting address of this pass. */
670 unsigned long startaddr;
671
672 /* Number of bytes to read in this pass. */
673 int len_this_pass;
674
675 #ifdef LOG_FILE
676 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
677 #endif
678
679 /* Note that this code works correctly if startaddr is just less
680 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
681 thing). That is, something like
682 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
683 works--it never adds len To memaddr and gets 0. */
684 /* However, something like
685 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
686 doesn't need to work. Detect it and give up if there's an attempt
687 to do that. */
688 if (((memaddr - 1) + len) < memaddr) {
689 errno = EIO;
690 return 0;
691 }
692
693 startaddr = memaddr;
694 count = 0;
695 while (count < len)
696 {
697 len_this_pass = 16;
698 if ((startaddr % 16) != 0)
699 len_this_pass -= startaddr % 16;
700 if (len_this_pass > (len - count))
701 len_this_pass = (len - count);
702 if (sr_get_debug())
703 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
704
705 for (i = 0; i < len_this_pass; i++)
706 {
707 printf_monitor (MEM_DIS_CMD, startaddr);
708 expect (sprintf(buf, MEM_PROMPT, startaddr), 1);
709 get_hex_byte (&myaddr[count++]);
710 if (sr_get_debug())
711 printf ("\nRead a 0x%x from 0x%x\n", myaddr[count-1], startaddr);
712 if (CMD_END)
713 {
714 expect (CMD_DELIM);
715 printf_monitor (CMD_END);
716 }
717 expect_prompt (1);
718 startaddr += 1;
719 }
720 }
721 return len;
722 }
723
724 /* FIXME-someday! merge these two. */
725 static int
726 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
727 CORE_ADDR memaddr;
728 char *myaddr;
729 int len;
730 int write;
731 struct target_ops *target; /* ignored */
732 {
733 if (write)
734 return monitor_write_inferior_memory (memaddr, myaddr, len);
735 else
736 return monitor_read_inferior_memory (memaddr, myaddr, len);
737 }
738
739 static void
740 monitor_kill (args, from_tty)
741 char *args;
742 int from_tty;
743 {
744 return; /* ignore attempts to kill target system */
745 }
746
747 /* Clean up when a program exits.
748 The program actually lives on in the remote processor's RAM, and may be
749 run again without a download. Don't leave it full of breakpoint
750 instructions. */
751
752 static void
753 monitor_mourn_inferior ()
754 {
755 remove_breakpoints ();
756 generic_mourn_inferior (); /* Do all the proper things now */
757 }
758
759 #define MAX_MONITOR_BREAKPOINTS 16
760
761 extern int memory_breakpoint_size;
762 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
763
764 static int
765 monitor_insert_breakpoint (addr, shadow)
766 CORE_ADDR addr;
767 char *shadow;
768 {
769 int i;
770
771 #ifdef LOG_FILE
772 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
773 #endif
774 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
775 if (breakaddr[i] == 0)
776 {
777 breakaddr[i] = addr;
778 if (sr_get_debug())
779 printf ("Breakpoint at %x\n", addr);
780 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
781 printf_monitor(SET_BREAK_CMD, addr);
782 expect_prompt(1);
783 return 0;
784 }
785
786 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
787 return 1;
788 }
789
790 /*
791 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
792 */
793 static int
794 monitor_remove_breakpoint (addr, shadow)
795 CORE_ADDR addr;
796 char *shadow;
797 {
798 int i;
799
800 #ifdef LOG_FILE
801 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
802 #endif
803 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
804 if (breakaddr[i] == addr)
805 {
806 breakaddr[i] = 0;
807 /* some monitors remove breakpoints based on the address */
808 if (strcasecmp (target_shortname, "bug") == 0)
809 printf_monitor(CLR_BREAK_CMD, addr);
810 else
811 printf_monitor(CLR_BREAK_CMD, i);
812 expect_prompt(1);
813 return 0;
814 }
815
816 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
817 return 1;
818 }
819
820 /* Load a file. This is usually an srecord, which is ascii. No
821 protocol, just sent line by line. */
822
823 #define DOWNLOAD_LINE_SIZE 100
824 static void
825 monitor_load (arg)
826 char *arg;
827 {
828 FILE *download;
829 char buf[DOWNLOAD_LINE_SIZE];
830 int i, bytes_read;
831
832 if (sr_get_debug())
833 printf ("Loading %s to monitor\n", arg);
834
835 download = fopen (arg, "r");
836 if (download == NULL)
837 {
838 error (sprintf (buf, "%s Does not exist", arg));
839 return;
840 }
841
842 printf_monitor (LOAD_CMD);
843 /* expect ("Waiting for S-records from host... ", 1); */
844
845 while (!feof (download))
846 {
847 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
848 if (hashmark)
849 {
850 putchar ('.');
851 fflush (stdout);
852 }
853
854 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
855 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
856 break;
857 }
858 i = 0;
859 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
860 if (bytes_read < DOWNLOAD_LINE_SIZE)
861 {
862 if (!feof (download))
863 error ("Only read %d bytes\n", bytes_read);
864 break;
865 }
866 }
867
868 if (hashmark)
869 {
870 putchar ('\n');
871 }
872 if (!feof (download))
873 error ("Never got EOF while downloading");
874 fclose (download);
875 }
876
877 /* Put a command string, in args, out to MONITOR. Output from MONITOR is placed
878 on the users terminal until the prompt is seen. */
879
880 static void
881 monitor_command (args, fromtty)
882 char *args;
883 int fromtty;
884 {
885 #ifdef LOG_FILE
886 fprintf (log_file, "\nIn command (args=%s)\n", args);
887 #endif
888 if (monitor_desc == NULL)
889 error("monitor target not open.");
890
891 if (!args)
892 error("Missing command.");
893
894 printf_monitor("%s\r", args);
895 expect_prompt(0);
896 }
897
898 #if 0
899
900 /* Connect the user directly to MONITOR. This command acts just like the
901 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
902
903 static struct ttystate ttystate;
904
905 static void
906 cleanup_tty()
907 { printf("\r\n[Exiting connect mode]\r\n");
908 /*SERIAL_RESTORE(0, &ttystate);*/
909 }
910
911 static void
912 connect_command (args, fromtty)
913 char *args;
914 int fromtty;
915 {
916 fd_set readfds;
917 int numfds;
918 int c;
919 char cur_esc = 0;
920
921 dont_repeat();
922
923 if (monitor_desc == NULL)
924 error("monitor target not open.");
925
926 if (args)
927 fprintf("This command takes no args. They have been ignored.\n");
928
929 printf("[Entering connect mode. Use ~. or ~^D to escape]\n");
930
931 serial_raw(0, &ttystate);
932
933 make_cleanup(cleanup_tty, 0);
934
935 FD_ZERO(&readfds);
936
937 while (1)
938 {
939 do
940 {
941 FD_SET(0, &readfds);
942 FD_SET(monitor_desc, &readfds);
943 numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0);
944 }
945 while (numfds == 0);
946
947 if (numfds < 0)
948 perror_with_name("select");
949
950 if (FD_ISSET(0, &readfds))
951 { /* tty input, send to monitor */
952 c = getchar();
953 if (c < 0)
954 perror_with_name("connect");
955
956 printf_monitor("%c", c);
957 switch (cur_esc)
958 {
959 case 0:
960 if (c == '\r')
961 cur_esc = c;
962 break;
963 case '\r':
964 if (c == '~')
965 cur_esc = c;
966 else
967 cur_esc = 0;
968 break;
969 case '~':
970 if (c == '.' || c == '\004')
971 return;
972 else
973 cur_esc = 0;
974 }
975 }
976
977 if (FD_ISSET(monitor_desc, &readfds))
978 {
979 while (1)
980 {
981 c = readchar(0);
982 if (c < 0)
983 break;
984 putchar(c);
985 }
986 fflush(stdout);
987 }
988 }
989 }
990 #endif
991
992 /*
993 * Define the monitor command strings. Since these are passed directly
994 * through to a printf style function, we need can include formatting
995 * strings. We also need a CR or LF on the end.
996 */
997 struct monitor_ops rom68k_cmds = {
998 "go \r", /* execute or usually GO command */
999 "go \r", /* continue command */
1000 "st \r", /* single step */
1001 "db %x\r", /* set a breakpoint */
1002 "cb %x\r", /* clear a breakpoint */
1003 "pm %x\r", /* set memory to a value */
1004 "pm %x\r", /* display memory */
1005 "-%08X ", /* prompt memory commands use */
1006 "pr %s %x\r", /* set a register */
1007 ": ", /* delimiter between registers */
1008 "pr %s\r", /* read a register */
1009 "dc \r", /* download command */
1010 "ROM68K :->", /* monitor command prompt */
1011 "=", /* end-of-command delimitor */
1012 ".\r" /* optional command terminator */
1013 };
1014
1015 struct monitor_ops bug_cmds = {
1016 "go \r", /* execute or usually GO command */
1017 "go \r", /* continue command */
1018 "gn \r", /* single step */
1019 "br %x\r", /* set a breakpoint */
1020 "nobr %x\r", /* clear a breakpoint */
1021 "mm %x\r", /* set memory to a value */
1022 "mm %x\r", /* display memory */
1023 "%08X", /* prompt memory commands use */
1024 "rs %s %x\r", /* set a register */
1025 "=", /* delimiter between registers */
1026 "rm %s\r", /* read a register */
1027 "lo 0\r", /* download command */
1028 "Bug>", /* monitor command prompt */
1029 "? ", /* end-of-command delimitor */
1030 ".\r" /* optional command terminator */
1031 };
1032
1033 /* Define the target subroutine names */
1034 struct monitor_ops mon68_cmds = {
1035 "", /* execute or usually GO command */
1036 "", /* continue command */
1037 "", /* single step */
1038 "", /* set a breakpoint */
1039 "", /* clear a breakpoint */
1040 "", /* set memory to a value */
1041 "", /* display memory */
1042 "", /* set a register */
1043 "", /* delimiter between registers */
1044 "", /* read a register */
1045 "", /* download command */
1046 ">", /* monitor command prompt */
1047 "", /* end-of-command delimitor */
1048 "" /* optional command terminator */
1049 };
1050
1051 struct target_ops rom68k_ops = {
1052 "rom68k",
1053 "Integrated System's ROM68K remote debug monitor",
1054 "Use a remote computer running the ROM68K debug monitor.\n\
1055 Specify the serial device it is connected to (e.g. /dev/ttya).",
1056 rom68k_open,
1057 monitor_close,
1058 0,
1059 monitor_detach,
1060 monitor_resume,
1061 monitor_wait,
1062 monitor_fetch_register,
1063 monitor_store_register,
1064 monitor_prepare_to_store,
1065 monitor_xfer_inferior_memory,
1066 monitor_files_info,
1067 monitor_insert_breakpoint,
1068 monitor_remove_breakpoint, /* Breakpoints */
1069 0,
1070 0,
1071 0,
1072 0,
1073 0, /* Terminal handling */
1074 monitor_kill,
1075 monitor_load, /* load */
1076 0, /* lookup_symbol */
1077 monitor_create_inferior,
1078 monitor_mourn_inferior,
1079 0, /* can_run */
1080 0, /* notice_signals */
1081 process_stratum,
1082 0, /* next */
1083 1,
1084 1,
1085 1,
1086 1,
1087 1, /* all mem, mem, stack, regs, exec */
1088 0,
1089 0, /* Section pointers */
1090 OPS_MAGIC, /* Always the last thing */
1091 };
1092
1093 struct target_ops monitor_bug_ops = {
1094 "bug",
1095 "Motorola's BUG remote serial debug monitor",
1096 "Use a remote computer running Motorola's BUG debug monitor.\n\
1097 Specify the serial device it is connected to (e.g. /dev/ttya).",
1098 bug_open,
1099 monitor_close,
1100 0,
1101 monitor_detach,
1102 monitor_resume,
1103 monitor_wait,
1104 monitor_fetch_register,
1105 monitor_store_register,
1106 monitor_prepare_to_store,
1107 monitor_xfer_inferior_memory,
1108 monitor_files_info,
1109 monitor_insert_breakpoint,
1110 monitor_remove_breakpoint, /* Breakpoints */
1111 0,
1112 0,
1113 0,
1114 0,
1115 0, /* Terminal handling */
1116 monitor_kill,
1117 monitor_load, /* load */
1118 0, /* lookup_symbol */
1119 monitor_create_inferior,
1120 monitor_mourn_inferior,
1121 0, /* can_run */
1122 0, /* notice_signals */
1123 process_stratum,
1124 0, /* next */
1125 1,
1126 1,
1127 1,
1128 1,
1129 1, /* all mem, mem, stack, regs, exec */
1130 0,
1131 0, /* Section pointers */
1132 OPS_MAGIC, /* Always the last thing */
1133 };
1134
1135 struct target_ops mon68_ops = {
1136 "mon68",
1137 "Intermetric's MON68 remote serial debug monitor",
1138 "Use a remote computer running the MON68 debug monitor.\n\
1139 Specify the serial device it is connected to (e.g. /dev/ttya).",
1140 mon68_open,
1141 monitor_close,
1142 0,
1143 monitor_detach,
1144 monitor_resume,
1145 monitor_wait,
1146 monitor_fetch_register,
1147 monitor_store_register,
1148 monitor_prepare_to_store,
1149 monitor_xfer_inferior_memory,
1150 monitor_files_info,
1151 monitor_insert_breakpoint,
1152 monitor_remove_breakpoint, /* Breakpoints */
1153 0,
1154 0,
1155 0,
1156 0,
1157 0, /* Terminal handling */
1158 monitor_kill,
1159 monitor_load, /* load */
1160 0, /* lookup_symbol */
1161 monitor_create_inferior,
1162 monitor_mourn_inferior,
1163 0, /* can_run */
1164 0, /* notice_signals */
1165 process_stratum,
1166 0, /* next */
1167 1,
1168 1,
1169 1,
1170 1,
1171 1, /* all mem, mem, stack, regs, exec */
1172 0,
1173 0, /* Section pointers */
1174 OPS_MAGIC, /* Always the last thing */
1175 };
1176
1177 void
1178 _initialize_remote_monitors ()
1179 {
1180 add_show_from_set (
1181 add_set_cmd ("hash", no_class, var_boolean,
1182 (char *)&hashmark,
1183 "Set display of activity while downloading a file.\n\
1184 When enabled, a period \'.\' is displayed.",
1185 &setlist),
1186 &showlist);
1187
1188 /* generic monitor command */
1189 add_com ("monitor <command>", class_obscure, monitor_command,
1190 "Send a command to the debug monitor.");
1191 #if 0
1192 add_com ("connect", class_obscure, connect_command,
1193 "Connect the terminal directly up to a serial based command monitor.\n\
1194 Use <CR>~. or <CR>~^D to break out.");
1195 #endif
1196
1197 add_target (&rom68k_ops);
1198 /* add_target (&mon68_ops); */
1199 add_target (&monitor_bug_ops);
1200 }