* corelow.c, exec.c, inftarg.c, m3-nat.c, op50-rom.c, procfs.c,
[deliverable/binutils-gdb.git] / gdb / monitor.c
CommitLineData
51d6a954
RS
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
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21/* This file was derived from various remote-* modules. It is a collection
22 of generic support functions so GDB can talk directly to a ROM based
23 monitor. This saves use from having to hack an exception based handler
24 into existance, and makes for quick porting.
25
26 This module talks to a debug monitor called 'MONITOR', which
27 We communicate with MONITOR via either a direct serial line, or a TCP
28 (or possibly TELNET) stream to a terminal multiplexor,
29 which in turn talks to the target board.
30*/
31
32#include "defs.h"
33#include "gdbcore.h"
34#include "target.h"
35#include "wait.h"
36#include <varargs.h>
37#include <signal.h>
38#include <string.h>
39#include <sys/types.h>
40#include "command.h"
41#include "serial.h"
42#include "monitor.h"
43#include "remote-utils.h"
44
45#ifdef HAVE_TERMIO
46# define TERMINAL struct termios
47#else
48# define TERMINAL struct sgttyb
49#endif
50
51struct monitor_ops *current_monitor;
52extern struct cmd_list_element *setlist;
53extern struct cmd_list_element *unsetlist;
54struct cmd_list_element *showlist;
21ed3dcd
RS
55extern char *version;
56extern char *host_name;
57extern char *target_name;
51d6a954
RS
58
59static int hashmark; /* flag set by "set hash" */
60
61/* FIXME: Replace with sr_get_debug (). */
62#define LOG_FILE "monitor.log"
63#if defined (LOG_FILE)
64FILE *log_file;
65#endif
66
67static int timeout = 24;
68
69/* Descriptor for I/O to remote machine. Initialize it to NULL so that
70 monitor_open knows that we don't have a file open when the program starts.
71 */
72static serial_t monitor_desc = NULL;
73
74/* sets the download protocol, choices are srec, generic, boot */
75char *loadtype;
76static char *loadtype_str;
77static void set_loadtype_command();
21ed3dcd
RS
78static void monitor_load_srec();
79static int monitor_write_srec();
51d6a954
RS
80
81/*
82 * set_loadtype_command -- set the type for downloading. Check to make
83 * sure you have a support protocol for this target.
84 */
85static void
86set_loadtype_command (ignore, from_tty, c)
87 char *ignore;
88 int from_tty;
89 struct cmd_list_element *c;
90{
21ed3dcd 91 char *tmp;
51d6a954 92 char *type;
21ed3dcd 93 if (STREQ (LOADTYPES, "")) {
51d6a954
RS
94 error ("No loadtype set");
95 return;
96 }
97
21ed3dcd
RS
98 tmp = savestring (LOADTYPES, strlen(LOADTYPES));
99 type = strtok(tmp, ",");
51d6a954
RS
100 if (STREQ (type, (*(char **) c->var))) {
101 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
102 return;
103 }
104
21ed3dcd 105 while ((type = strtok (NULL, ",")) != (char *)NULL) {
51d6a954
RS
106 if (STREQ (type, (*(char **) c->var)))
107 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
21ed3dcd
RS
108 return;
109 }
110 free (tmp);
111 error ("Loadtype \"%s\" does not exist.", (*(char **) c->var));
51d6a954
RS
112}
113
114/*
115 * printf_monitor -- send data to monitor. Works just like printf.
116 */
117static void
118printf_monitor(va_alist)
119 va_dcl
120{
121 va_list args;
122 char *pattern;
123 char buf[200];
124 int i;
125
126 va_start(args);
127
128 pattern = va_arg(args, char *);
129
130 vsprintf(buf, pattern, args);
131
e6fa5bd6 132 debuglogs (1, "printf_monitor(), Sending: \"%s\".", buf);
51d6a954
RS
133
134 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
135 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
136}
137
e6fa5bd6
RS
138/*
139 * debuglogs -- deal with debugging info to multiple sources. This takes
140 * two real args, the first one is the level to be compared against
141 * the sr_get_debug() value, the second arg is a printf buffer and args
142 * to be formatted and printed. A CR is added after each string is printed.
143 */
144static void
145debuglogs(va_alist)
146 va_dcl
147{
148 va_list args;
149 char *pattern, *p;
150 char buf[200];
151 char newbuf[300];
152 int level, i;
153
154 va_start(args);
155
156 level = va_arg(args, int); /* get the debug level */
157 if ((level <0) || (level > 100)) {
158 error ("Bad argument passed to debuglogs()");
159 return;
160 }
161
162 pattern = va_arg(args, char *); /* get the printf style pattern */
163
164 vsprintf(buf, pattern, args); /* format the string */
165
166 /* convert some characters so it'll look right in the log */
167 p = newbuf;
168 for (i=0 ; buf[i] != '\0'; i++) {
169 switch (buf[i]) {
170 case '\n': /* newlines */
171 *p++ = '\\';
172 *p++ = 'n';
173 continue;
174 case '\r': /* carriage returns */
175 *p++ = '\\';
176 *p++ = 'r';
177 continue;
178 case '\033': /* escape */
179 *p++ = '\\';
180 *p++ = 'e';
181 continue;
182 case '\t': /* tab */
183 *p++ = '\\';
184 *p++ = 't';
185 continue;
186 case '\b': /* backspace */
187 *p++ = '\\';
188 *p++ = 'b';
189 continue;
190 default: /* no change */
191 *p++ = buf[i];
192 }
193
194 if (buf[i] < 26) { /* modify control characters */
195 *p++ = '^';
196 *p++ = buf[i] + 'A';
197 continue;
198 }
199 }
200 *p = '\0'; /* terminate the string */
201
202 if (sr_get_debug() > level)
203 puts (newbuf);
204
205#ifdef LOG_FILE /* write to the monitor log */
206 if (log_file != 0x0) {
207 fputs (newbuf, log_file);
208 fputc ('\n', log_file);
209 fflush (log_file);
210 }
211#endif
212}
213
7804e5bc
RS
214/* readchar -- read a character from the remote system, doing all the fancy
215 * timeout stuff.
216 */
51d6a954
RS
217static int
218readchar(timeout)
219 int timeout;
220{
221 int c;
222
223 c = SERIAL_READCHAR(monitor_desc, timeout);
224
e6fa5bd6 225 if (sr_get_debug() > 4)
51d6a954
RS
226 putchar(c & 0x7f);
227
228#ifdef LOG_FILE
229 if (isascii (c))
230 putc(c & 0x7f, log_file);
231#endif
232
233 if (c >= 0)
234 return c & 0x7f;
235
7804e5bc
RS
236 if (c == SERIAL_TIMEOUT) {
237 if (timeout == 0)
238 return c; /* Polls shouldn't generate timeout errors */
239 error("Timeout reading from remote system.");
7a1330f7
RS
240#ifdef LOG_FILE
241 fputc ("ERROR: Timeout reading from remote system", log_file);
242#endif
7804e5bc 243 }
51d6a954
RS
244 perror_with_name("remote-monitor");
245}
246
7804e5bc
RS
247/*
248 * expect -- scan input from the remote system, until STRING is found.
249 * If DISCARD is non-zero, then discard non-matching input, else print
250 * it out. Let the user break out immediately.
251 */
51d6a954
RS
252static void
253expect (string, discard)
254 char *string;
255 int discard;
256{
257 char *p = string;
258 int c;
259
260
e6fa5bd6 261 debuglogs (1, "Expecting \"%s\".", string);
51d6a954
RS
262
263 immediate_quit = 1;
264 while (1) {
265 c = readchar(timeout);
266 if (!isascii (c))
267 continue;
268 if (c == *p++) {
269 if (*p == '\0') {
270 immediate_quit = 0;
7a1330f7 271 debuglogs (4, "Matched");
51d6a954
RS
272 return;
273 }
274 } else {
275 if (!discard) {
276 fwrite(string, 1, (p - 1) - string, stdout);
277 putchar((char)c);
278 fflush(stdout);
279 }
280 p = string;
281 }
282 }
283}
284
285/* Keep discarding input until we see the MONITOR prompt.
286
287 The convention for dealing with the prompt is that you
288 o give your command
289 o *then* wait for the prompt.
290
291 Thus the last thing that a procedure does with the serial line
292 will be an expect_prompt(). Exception: monitor_resume does not
293 wait for the prompt, because the terminal is being handed over
294 to the inferior. However, the next thing which happens after that
295 is a monitor_wait which does wait for the prompt.
296 Note that this includes abnormal exit, e.g. error(). This is
297 necessary to prevent getting into states from which we can't
298 recover. */
299static void
300expect_prompt(discard)
301 int discard;
302{
303#if defined (LOG_FILE)
304 /* This is a convenient place to do this. The idea is to do it often
305 enough that we never lose much data if we terminate abnormally. */
306 fflush(log_file);
307#endif
308 expect (PROMPT, discard);
309}
310
311/*
312 * junk -- ignore junk characters. Returns a 1 if junk, 0 otherwise
313 */
314static int
315junk(ch)
316 char ch;
317{
318 switch (ch) {
319 case ' ':
320 case '-':
321 case '\t':
322 case '\r':
323 case '\n':
324 if (sr_get_debug() > 5)
e6fa5bd6 325 debuglogs (5, "Ignoring \'%c\'.", ch);
51d6a954
RS
326 return 1;
327 default:
328 if (sr_get_debug() > 5)
e6fa5bd6 329 debuglogs (5, "Accepting \'%c\'.", ch);
51d6a954
RS
330 return 0;
331 }
332}
333
334/*
335 * get_hex_digit -- Get a hex digit from the remote system & return its value.
336 * If ignore is nonzero, ignore spaces, newline & tabs.
337 */
338static int
339get_hex_digit(ignore)
340 int ignore;
341{
342 static int ch;
343 while (1) {
344 ch = readchar(timeout);
345 if (junk(ch))
346 continue;
347 if (sr_get_debug() > 4)
e6fa5bd6 348 debuglogs (4, "get_hex_digit() got a 0x%x(%c)", ch, ch);
51d6a954
RS
349
350 if (ch >= '0' && ch <= '9')
351 return ch - '0';
352 else if (ch >= 'A' && ch <= 'F')
353 return ch - 'A' + 10;
354 else if (ch >= 'a' && ch <= 'f')
355 return ch - 'a' + 10;
356 else if (ch == ' ' && ignore)
357 ;
358 else {
359 expect_prompt(1);
360 error("Invalid hex digit from remote system.");
361 }
362 }
363}
364
365/* get_hex_byte -- Get a byte from monitor and put it in *BYT.
366 * Accept any number leading spaces.
367 */
368static void
369get_hex_byte (byt)
370 char *byt;
371{
372 int val;
373
374 val = get_hex_digit (1) << 4;
e6fa5bd6 375 debuglogs (4, "get_hex_digit() -- Read first nibble 0x%x", val);
51d6a954
RS
376
377 val |= get_hex_digit (0);
e6fa5bd6 378 debuglogs (4, "get_hex_digit() -- Read second nibble 0x%x", val);
51d6a954
RS
379 *byt = val;
380
e6fa5bd6 381 debuglogs (4, "get_hex_digit() -- Read a 0x%x", val);
51d6a954
RS
382}
383
384/*
385 * get_hex_word -- Get N 32-bit words from remote, each preceded by a space,
386 * and put them in registers starting at REGNO.
387 */
388static int
389get_hex_word ()
390{
391 long val;
392 int i;
393
394 val = 0;
395 for (i = 0; i < 8; i++)
396 val = (val << 4) + get_hex_digit (i == 0);
397
7a1330f7 398 debuglogs (4, "get_hex_word() got a 0x%x.", val);
51d6a954
RS
399
400 return val;
401}
402
403/* This is called not only when we first attach, but also when the
404 user types "run" after having attached. */
405void
406monitor_create_inferior (execfile, args, env)
407 char *execfile;
408 char *args;
409 char **env;
410{
411 int entry_pt;
412
413 if (args && *args)
414 error("Can't pass arguments to remote MONITOR process");
415
416 if (execfile == 0 || exec_bfd == 0)
417 error("No exec file specified");
418
419 entry_pt = (int) bfd_get_start_address (exec_bfd);
420
7a1330f7 421 debuglogs (1, "create_inferior(exexfile=%s, args=%s, env=%s)", execfile, args, env);
51d6a954
RS
422
423/* The "process" (board) is already stopped awaiting our commands, and
424 the program is already downloaded. We just set its PC and go. */
425
426 clear_proceed_status ();
427
428 /* Tell wait_for_inferior that we've started a new process. */
429 init_wait_for_inferior ();
430
431 /* Set up the "saved terminal modes" of the inferior
432 based on what modes we are starting it with. */
433 target_terminal_init ();
434
435 /* Install inferior's terminal modes. */
436 target_terminal_inferior ();
437
438 /* insert_step_breakpoint (); FIXME, do we need this? */
439
440 /* Let 'er rip... */
441 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
442}
443
7804e5bc
RS
444/*
445 * monitor_open -- open a connection to a remote debugger.
446 * NAME is the filename used for communication.
447 */
51d6a954
RS
448static int baudrate = 9600;
449static char dev_name[100];
450
451void
452monitor_open(args, name, from_tty)
453 char *args;
454 char *name;
455 int from_tty;
456{
457
458 if (args == NULL)
459 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
460`target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
461
462/* if (is_open) */
463 monitor_close(0);
464
465 strcpy(dev_name, args);
466 monitor_desc = SERIAL_OPEN(dev_name);
467
468 if (monitor_desc == NULL)
469 perror_with_name(dev_name);
470
7a1330f7
RS
471 if (baud_rate != -1) {
472 if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate)) {
473 SERIAL_CLOSE (monitor_desc);
474 perror_with_name (name);
51d6a954 475 }
7a1330f7
RS
476 }
477
51d6a954
RS
478 SERIAL_RAW(monitor_desc);
479
480#if defined (LOG_FILE)
481 log_file = fopen (LOG_FILE, "w");
482 if (log_file == NULL)
483 perror_with_name (LOG_FILE);
21ed3dcd
RS
484 fprintf_filtered (log_file, "GDB %s (%s", version, host_name);
485 fprintf_filtered (log_file, " --target %s)\n", target_name);
486 fprintf_filtered (log_file, "Remote target %s connected to %s\n\n", TARGET_NAME, dev_name);
51d6a954
RS
487#endif
488
489 /* wake up the monitor and see if it's alive */
490 printf_monitor(INIT_CMD);
491 expect_prompt(1); /* See if we get a prompt */
492
493 /* try again to be sure */
494 printf_monitor(INIT_CMD);
495 expect_prompt(1); /* See if we get a prompt */
496
497 if (from_tty)
498 printf("Remote target %s connected to %s\n", TARGET_NAME, dev_name);
51d6a954
RS
499}
500
501/*
7804e5bc
RS
502 * monitor_close -- Close out all files and local state before this
503 * target loses control.
51d6a954
RS
504 */
505
506void
507monitor_close (quitting)
508 int quitting;
509{
510 SERIAL_CLOSE(monitor_desc);
511 monitor_desc = NULL;
512
e6fa5bd6 513 debuglogs (1, "monitor_close (quitting=%d)", quitting);
7804e5bc 514
51d6a954
RS
515#if defined (LOG_FILE)
516 if (log_file) {
517 if (ferror(log_file))
518 fprintf(stderr, "Error writing log file.\n");
519 if (fclose(log_file) != 0)
520 fprintf(stderr, "Error closing log file.\n");
521 }
522#endif
523}
524
7804e5bc
RS
525/*
526 * monitor_detach -- terminate the open connection to the remote
527 * debugger. Use this when you want to detach and do something
528 * else with your gdb.
529 */
51d6a954
RS
530void
531monitor_detach (from_tty)
532 int from_tty;
533{
e6fa5bd6 534
7a1330f7 535 debuglogs (1, "monitor_detach ()");
7804e5bc 536
51d6a954
RS
537 pop_target(); /* calls monitor_close to do the real work */
538 if (from_tty)
539 printf ("Ending remote %s debugging\n", target_shortname);
540}
7804e5bc
RS
541
542/*
543 * monitor_attach -- attach GDB to the target.
544 */
545void
546monitor_attach (args, from_tty)
547 char *args;
548 int from_tty;
549{
550 if (from_tty)
551 printf ("Starting remote %s debugging\n", target_shortname);
51d6a954 552
7a1330f7 553 debuglogs (1, "monitor_attach (args=%s)", args);
7804e5bc 554
7804e5bc
RS
555 printf_monitor (GO_CMD);
556 /* swallow the echo. */
557 expect (GO_CMD, 1);
558}
559
51d6a954 560/*
7804e5bc 561 * monitor_resume -- Tell the remote machine to resume.
51d6a954
RS
562 */
563void
564monitor_resume (pid, step, sig)
565 int pid, step;
566 enum target_signal sig;
567{
7a1330f7 568 debuglogs (1, "monitor_resume (step=%d, sig=%d)", step, sig);
7804e5bc
RS
569
570 if (step) {
571 printf_monitor (STEP_CMD);
7804e5bc
RS
572 } else {
573 printf_monitor (CONT_CMD);
7804e5bc 574 }
51d6a954
RS
575}
576
577/*
7a1330f7 578 * monitor_wait -- Wait until the remote machine stops, then return,
51d6a954
RS
579 * storing status in status just as `wait' would.
580 */
51d6a954
RS
581int
582monitor_wait (pid, status)
583 int pid;
584 struct target_waitstatus *status;
585{
586 int old_timeout = timeout;
51d6a954 587
7a1330f7 588 debuglogs(1, "monitor_wait (), printing extraneous text.");
e6fa5bd6 589
51d6a954
RS
590 status->kind = TARGET_WAITKIND_EXITED;
591 status->value.integer = 0;
592
593 timeout = 0; /* Don't time out -- user program is running. */
594
595 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
7a1330f7 596 debuglogs (4, "monitor_wait(), got the prompt.");
51d6a954
RS
597
598 status->kind = TARGET_WAITKIND_STOPPED;
599 status->value.sig = TARGET_SIGNAL_TRAP;
600
601 timeout = old_timeout;
602
603 return 0;
604}
605
606/* Return the name of register number regno in the form input and output by
607 monitor. Currently, register_names just happens to contain exactly what
608 monitor wants. Lets take advantage of that just as long as possible! */
609
610static char *
611get_reg_name (regno)
612 int regno;
613{
614 static char buf[50];
615 const char *p;
616 char *b;
617
618 b = buf;
619
620 if (regno < 0)
621 return ("");
622
623 for (p = REGNAMES(regno); *p; p++)
624 *b++ = tolower(*p);
625
626 *b = '\000';
627
e6fa5bd6 628 debuglogs (5, "Got name \"%s\" from regno #%d.", buf, regno);
f1ca4cbc 629
51d6a954
RS
630 return buf;
631}
632
e6fa5bd6
RS
633/*
634 * monitor_fetch_registers -- read the remote registers into the
635 * block regs.
636 */
51d6a954
RS
637void
638monitor_fetch_registers ()
639{
640 int regno;
641
642 /* yeah yeah, i know this is horribly inefficient. but it isn't done
643 very often... i'll clean it up later. */
644
645 for (regno = 0; regno <= PC_REGNUM; regno++)
646 monitor_fetch_register(regno);
647}
648
649/*
f1ca4cbc
RS
650 * monitor_fetch_register -- fetch register REGNO, or all registers if REGNO
651 * is -1. Returns errno value.
51d6a954
RS
652 */
653void
654monitor_fetch_register (regno)
655 int regno;
656{
657 int val, j;
658
7a1330f7 659 debuglogs (1, "monitor_fetch_register (reg=%s)", get_reg_name (regno));
51d6a954
RS
660
661 if (regno < 0) {
662 monitor_fetch_registers ();
663 } else {
664 char *name = get_reg_name (regno);
665 if (STREQ(name, ""))
666 return;
667 printf_monitor (ROMCMD(GET_REG), name); /* send the command */
668 expect (name, 1); /* then strip the leading garbage */
669 if (*ROMDELIM(GET_REG) != 0) { /* if there's a delimiter */
670 expect (ROMDELIM(GET_REG), 1);
671 }
672
673 val = get_hex_word(); /* get the value, ignore junk */
674 supply_register (regno, (char *) &val);
675
676 if (*ROMDELIM(GET_REG) != 0) {
f1ca4cbc 677/*** expect (ROMRES(GET_REG)); ***/
51d6a954
RS
678 printf_monitor (CMD_END);
679 }
680 expect_prompt (1);
681 }
682 return;
683}
684
685/* Store the remote registers from the contents of the block REGS. */
686
687void
688monitor_store_registers ()
689{
690 int regno;
691
e6fa5bd6
RS
692 debuglogs (1, "monitor_store_registers()");
693
51d6a954
RS
694 for (regno = 0; regno <= PC_REGNUM; regno++)
695 monitor_store_register(regno);
696
697 registers_changed ();
698}
699
f1ca4cbc
RS
700/*
701 * monitor_store_register -- store register REGNO, or all if REGNO == 0.
702 * return errno value.
703 */
51d6a954
RS
704void
705monitor_store_register (regno)
706 int regno;
707{
708 char *name;
f1ca4cbc
RS
709 int i;
710
711 i = read_register(regno);
51d6a954 712
e6fa5bd6 713 debuglogs (1, "monitor_store_register (regno=%d)", regno);
51d6a954
RS
714
715 if (regno < 0)
716 monitor_store_registers ();
717 else {
e6fa5bd6 718 debuglogs (3, "Setting register %s to 0x%x", get_reg_name (regno), read_register (regno));
51d6a954
RS
719
720 name = get_reg_name (regno);
721 if (STREQ(name, ""))
722 return;
f1ca4cbc
RS
723 printf_monitor (ROMCMD(SET_REG), name, read_register(regno));
724 expect (name, 1); /* strip the leading garbage */
51d6a954
RS
725 if (*ROMDELIM(SET_REG) != 0) { /* if there's a delimiter */
726 expect (ROMDELIM(SET_REG), 1);
f1ca4cbc
RS
727 get_hex_word(1);
728 printf_monitor ("%d%s\n", i, CMD_END);
51d6a954
RS
729 }
730 expect_prompt (1);
731 }
732 return;
733
734#if 0
735 printf_monitor (SET_REG, get_reg_name (regno),
736 read_register (regno));
737 expect_prompt (1);
738 }
739#endif
740}
741
742/* Get ready to modify the registers array. On machines which store
743 individual registers, this doesn't need to do anything. On machines
744 which store all the registers in one fell swoop, this makes sure
745 that registers contains all the registers from the program being
746 debugged. */
747
748void
749monitor_prepare_to_store ()
750{
751 /* Do nothing, since we can store individual regs */
752}
753
754void
755monitor_files_info ()
756{
757 printf ("\tAttached to %s at %d baud.\n",
758 dev_name, baudrate);
759}
760
f1ca4cbc
RS
761/*
762 * monitor_write_inferior_memory -- Copy LEN bytes of data from debugger
763 * memory at MYADDR to inferior's memory at MEMADDR. Returns length moved.
764 */
51d6a954
RS
765int
766monitor_write_inferior_memory (memaddr, myaddr, len)
767 CORE_ADDR memaddr;
768 unsigned char *myaddr;
769 int len;
770{
771 int i;
772 char buf[10];
773
e6fa5bd6 774 debuglogs (1, "monitor_write_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
f1ca4cbc
RS
775
776 for (i = 0; i < len; i++) {
777 printf_monitor (ROMCMD(SET_MEM), memaddr + i, myaddr[i] );
778 if (*ROMDELIM(SET_MEM) != 0) { /* if there's a delimiter */
779 expect (ROMDELIM(SET_MEM), 1);
51d6a954
RS
780 expect (CMD_DELIM);
781 printf_monitor ("%x", myaddr[i]);
51d6a954 782 }
f1ca4cbc
RS
783/*** printf_monitor ("%x", myaddr[i]); ***/
784 if (sr_get_debug() > 1)
785 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
786 if (*ROMDELIM(SET_MEM) != 0) {
787 expect (CMD_DELIM);
788 printf_monitor (CMD_END);
789 }
790 expect_prompt (1);
791 }
51d6a954
RS
792 return len;
793}
794
795/*
796 * monitor_read_inferior_memory -- read LEN bytes from inferior memory
797 * at MEMADDR. Put the result at debugger address MYADDR. Returns
798 * length moved.
799 */
800int
801monitor_read_inferior_memory(memaddr, myaddr, len)
802 CORE_ADDR memaddr;
803 char *myaddr;
804 int len;
805{
806 int i, j;
807 char buf[20];
808
809 /* Number of bytes read so far. */
810 int count;
811
812 /* Starting address of this pass. */
813 unsigned long startaddr;
814
815 /* Number of bytes to read in this pass. */
816 int len_this_pass;
817
e6fa5bd6 818 debuglogs (1, "monitor_read_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
51d6a954
RS
819
820 /* Note that this code works correctly if startaddr is just less
821 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
822 thing). That is, something like
823 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
824 works--it never adds len To memaddr and gets 0. */
825 /* However, something like
826 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
827 doesn't need to work. Detect it and give up if there's an attempt
828 to do that. */
829 if (((memaddr - 1) + len) < memaddr) {
830 errno = EIO;
831 return 0;
832 }
833
834 startaddr = memaddr;
835 count = 0;
836 while (count < len) {
837 len_this_pass = 16;
838 if ((startaddr % 16) != 0)
839 len_this_pass -= startaddr % 16;
840 if (len_this_pass > (len - count))
841 len_this_pass = (len - count);
e6fa5bd6
RS
842
843 debuglogs (3, "Display %d bytes at %x", len_this_pass, startaddr);
51d6a954
RS
844
845 for (i = 0; i < len_this_pass; i++) {
846 printf_monitor (ROMCMD(GET_MEM), startaddr, startaddr);
847 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
51d6a954
RS
848 if (*ROMDELIM(GET_MEM) != 0) { /* if there's a delimiter */
849 expect (ROMDELIM(GET_MEM), 1);
850 } else {
851 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
852 expect (buf,1); /* get the command echo */
853 get_hex_word(1); /* strip away the address */
854 }
855 get_hex_byte (&myaddr[count++]); /* get the value at this address */
856
857 if (*ROMDELIM(GET_MEM) != 0) {
858 printf_monitor (CMD_END);
859 }
860 expect_prompt (1);
861 startaddr += 1;
862 }
863 }
864 return len;
865}
866
867/* FIXME-someday! merge these two. */
868int
869monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
870 CORE_ADDR memaddr;
871 char *myaddr;
872 int len;
873 int write;
874 struct target_ops *target; /* ignored */
875{
876 if (write)
877 return monitor_write_inferior_memory (memaddr, myaddr, len);
878 else
879 return monitor_read_inferior_memory (memaddr, myaddr, len);
880}
881
882void
883monitor_kill (args, from_tty)
884 char *args;
885 int from_tty;
886{
887 return; /* ignore attempts to kill target system */
888}
889
890/* Clean up when a program exits.
891 The program actually lives on in the remote processor's RAM, and may be
892 run again without a download. Don't leave it full of breakpoint
893 instructions. */
894
895void
896monitor_mourn_inferior ()
897{
898 remove_breakpoints ();
899 generic_mourn_inferior (); /* Do all the proper things now */
900}
901
902#define MAX_MONITOR_BREAKPOINTS 16
903
904extern int memory_breakpoint_size;
905static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
906
907/*
908 * monitor_insert_breakpoint -- add a breakpoint
909 */
910int
911monitor_insert_breakpoint (addr, shadow)
912 CORE_ADDR addr;
913 char *shadow;
914{
915 int i;
916
e6fa5bd6 917 debuglogs (1, "monitor_insert_breakpoint() addr = 0x%x", addr);
f1ca4cbc
RS
918
919 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
920 if (breakaddr[i] == 0) {
921 breakaddr[i] = addr;
922 if (sr_get_debug() > 4)
923 printf ("Breakpoint at %x\n", addr);
924 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
925 printf_monitor(SET_BREAK_CMD, addr);
926 expect_prompt(1);
927 return 0;
928 }
929 }
930
51d6a954
RS
931 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
932 return 1;
933}
934
935/*
936 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
937 */
938int
939monitor_remove_breakpoint (addr, shadow)
940 CORE_ADDR addr;
941 char *shadow;
942{
943 int i;
944
e6fa5bd6 945 debuglogs (1, "monitor_remove_breakpoint() addr = 0x%x", addr);
7804e5bc
RS
946
947 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
948 if (breakaddr[i] == addr) {
949 breakaddr[i] = 0;
950 /* some monitors remove breakpoints based on the address */
951 if (CLR_BREAK_ADDR)
952 printf_monitor(CLR_BREAK_CMD, addr);
953 else
954 printf_monitor(CLR_BREAK_CMD, i);
955 expect_prompt(1);
956 return 0;
957 }
958 }
51d6a954
RS
959 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
960 return 1;
961}
962
21ed3dcd
RS
963/* monitor_load -- load a file. This file determines which of the
964 * supported formats to use. The current types are:
965 * FIXME: not all types supported yet.
966 * default - reads any file using bfd and writes it to memory.
967 * srec - reads binary file using bfd and writes it as an
968 * ascii srecord.
969 * xmodem-bin - reads a binary file using bfd, and downloads it
970 * using xmodem protocol.
971 * xmodem-srec - reads a binary file using bfd, and after converting
972 * it downloads it as an srecord using xmodem protocol.
973 * ascii-srec - reads a ascii srecord file and downloads it
974 * without a change.
975 * ascii-xmodem - reads a ascii file and downloads using xmodem
976 * protocol.
977 */
978void
979monitor_load (file, fromtty)
980 char *file;
981 int fromtty;
982{
983 FILE *download;
984 int i, bytes_read;
985
986 debuglogs (1, "Loading %s to monitor", file);
51d6a954 987
21ed3dcd
RS
988 if (STREQ (loadtype_str, "default")) { /* default, load a binary */
989 gr_load_image (file, fromtty); /* by writing it into memory */
990 }
991
992 if (STREQ (loadtype_str, "srec")) { /* load an srecord by converting */
993 monitor_load_srec(file, fromtty); /* if from a binary */
994 }
995
996 if (STREQ (loadtype_str, "ascii-srec")) { /* load an srecord file */
997 monitor_load_ascii_srec(file, fromtty); /* if from a binary */
998 }
999
1000 if (STREQ (loadtype_str, "xmodem-srec")) { /* load an srecord using the */
1001 error ("This protocol is not implemented yet."); /* xmodem protocol */
1002 }
1003}
1004
1005/*
1006 * monitor_load_ascii_srec -- download an ASCII srecord file.
1007 */
51d6a954 1008#define DOWNLOAD_LINE_SIZE 100
21ed3dcd
RS
1009int
1010monitor_load_ascii_srec (file, fromtty)
1011 char *file;
1012 int fromtty;
51d6a954
RS
1013{
1014 FILE *download;
1015 char buf[DOWNLOAD_LINE_SIZE];
1016 int i, bytes_read;
1017
21ed3dcd 1018 debuglogs (1, "Loading an ASCII srecord file, %s.", file);
51d6a954 1019
21ed3dcd
RS
1020 download = fopen (file, "r");
1021 if (download == NULL) {
1022 error ("%s Does not exist", file);
51d6a954
RS
1023 return;
1024 }
1025
1026 printf_monitor (LOAD_CMD);
51d6a954 1027
21ed3dcd
RS
1028 while (!feof (download)) {
1029 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
1030 if (hashmark) {
1031 putchar ('.');
1032 fflush (stdout);
51d6a954 1033 }
21ed3dcd
RS
1034 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
1035 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
1036 break;
1037 }
1038 i = 0;
1039 while (i++ <=200) {} ; /* Ugly HACK, probably needs flow control */
1040 if (bytes_read < DOWNLOAD_LINE_SIZE) {
1041 if (!feof (download))
1042 error ("Only read %d bytes\n", bytes_read);
1043 break;
51d6a954 1044 }
21ed3dcd
RS
1045 }
1046
1047 if (hashmark) {
1048 putchar ('\n');
1049 }
51d6a954
RS
1050 if (!feof (download))
1051 error ("Never got EOF while downloading");
21ed3dcd 1052 expect_prompt(1);
51d6a954
RS
1053 fclose (download);
1054}
1055
7804e5bc
RS
1056/*
1057 * monitor_command -- put a command string, in args, out to MONITOR.
1058 * Output from MONITOR is placed on the users terminal until the
1059 * prompt is seen. FIXME: We read the charcters ourseleves here
1060 * cause of a nasty echo.
1061 */
51d6a954
RS
1062void
1063monitor_command (args, fromtty)
1064 char *args;
1065 int fromtty;
1066{
7804e5bc
RS
1067
1068 char *p;
1069 char c, cp;
1070 p = PROMPT;
1071
e6fa5bd6
RS
1072 debuglogs (1, "monitor_command (args=%s)", args);
1073
51d6a954
RS
1074 if (monitor_desc == NULL)
1075 error("monitor target not open.");
7804e5bc 1076
51d6a954
RS
1077 if (!args)
1078 error("Missing command.");
1079
7804e5bc
RS
1080 printf_monitor ("%s\n", args);
1081
51d6a954
RS
1082 expect_prompt(0);
1083}
1084
21ed3dcd
RS
1085/*
1086 * monitor_load_srec -- download a binary file by converting it to srecords.
1087 */
1088static void
1089monitor_load_srec (args, fromtty)
1090 char *args;
1091 int fromtty;
1092{
1093 bfd *abfd;
1094 asection *s;
1095 char buffer[1024];
1096 int srec_frame = SREC_SIZE;
1097
1098 abfd = bfd_openr (args, 0);
1099 if (!abfd) {
1100 printf_filtered ("Unable to open file %s\n", args);
1101 return;
1102 }
1103
1104 if (bfd_check_format (abfd, bfd_object) == 0) {
1105 printf_filtered ("File is not an object file\n");
1106 return;
1107 }
1108
1109 s = abfd->sections;
1110 while (s != (asection *) NULL) {
1111 srec_frame = SREC_SIZE;
1112 if (s->flags & SEC_LOAD) {
1113 int i;
1114 char *buffer = xmalloc (srec_frame);
1115 printf_filtered ("%s\t: 0x%4x .. 0x%4x ", s->name, s->vma, s->vma + s
1116 ->_raw_size);
1117 fflush (stdout);
1118 for (i = 0; i < s->_raw_size; i += srec_frame) {
1119 if (srec_frame > s->_raw_size - i)
1120 srec_frame = s->_raw_size - i;
1121
1122 bfd_get_section_contents (abfd, s, buffer, i, srec_frame);
1123 monitor_write_srec (s->vma + i, buffer, srec_frame);
1124 printf_filtered ("*");
1125 fflush (stdout);
1126 }
1127 printf_filtered ("\n");
1128 free (buffer);
1129 }
1130 s = s->next;
1131 }
1132 sprintf (buffer, "rs ip %lx", (unsigned long) abfd->start_address);
1133 printf_monitor (buffer);
1134 expect_prompt ();
1135}
1136
1137
1138static int
1139monitor_write_srec (memaddr, myaddr, len)
1140 CORE_ADDR memaddr;
1141 unsigned char *myaddr;
1142 int len;
1143{
1144 int done;
1145 int checksum;
1146 int x;
1147 int retries;
1148 int srec_bytes = 40;
1149 int srec_max_retries = 3;
1150 int srec_echo_pace = 0;
1151 int srec_sleep = 0;
1152 int srec_noise = 0;
1153 char *buffer = alloca ((srec_bytes + 8) << 1);
1154
1155 retries = 0;
1156
1157 while (1) { /* FIXME !!! */
1158 done = 0;
1159
1160 if (retries > srec_max_retries)
1161 return(-1);
1162
1163 if (retries > 0) {
1164 if (sr_get_debug() > 0)
1165 printf("\n<retrying...>\n");
1166
1167 /* This gr_expect_prompt call is extremely important. Without
1168 it, we will tend to resend our packet so fast that it
1169 will arrive before the bug monitor is ready to receive
1170 it. This would lead to a very ugly resend loop. */
1171
1172 gr_expect_prompt();
1173 }
1174
1175 /* FIXME: this is just start_load pasted in... */
1176 { char *command;
1177 command = (srec_echo_pace ? "lo 0 ;x" : "lo 0");
1178 sr_write_cr (command);
1179 sr_expect (command);
1180 sr_expect ("\r\n");
1181#if 0
1182 bug_srec_write_cr ("S0030000FC");
1183#endif
1184 }
1185 /* end of hack */
1186
1187 while (done < len) {
1188 int thisgo;
1189 int idx;
1190 char *buf = buffer;
1191 CORE_ADDR address;
1192
1193 checksum = 0;
1194 thisgo = len - done;
1195 if (thisgo > srec_bytes)
1196 thisgo = srec_bytes;
1197
1198 address = memaddr + done;
1199 sprintf (buf, "S3%02X%08X", thisgo + 4 + 1, address);
1200 buf += 12;
1201
1202 checksum += (thisgo + 4 + 1
1203 + (address & 0xff)
1204 + ((address >> 8) & 0xff)
1205 + ((address >> 16) & 0xff)
1206 + ((address >> 24) & 0xff));
1207
1208 for (idx = 0; idx < thisgo; idx++) {
1209 sprintf (buf, "%02X", myaddr[idx + done]);
1210 checksum += myaddr[idx + done];
1211 buf += 2;
1212 }
1213
1214 if (srec_noise > 0) {
1215 /* FIXME-NOW: insert a deliberate error every now and then.
1216 This is intended for testing/debugging the error handling
1217 stuff. */
1218 static int counter = 0;
1219 if (++counter > srec_noise) {
1220 counter = 0;
1221 ++checksum;
1222 }
1223 }
1224
1225 sprintf(buf, "%02X", ~checksum & 0xff);
1226#if 0
1227 bug_srec_write_cr (buffer);
1228#endif
1229
1230 if (srec_sleep != 0)
1231 sleep(srec_sleep);
1232
1233 /* This pollchar is probably redundant to the gr_multi_scan
1234 below. Trouble is, we can't be sure when or where an
1235 error message will appear. Apparently, when running at
1236 full speed from a typical sun4, error messages tend to
1237 appear to arrive only *after* the s7 record. */
1238
1239 if ((x = sr_pollchar()) != 0) {
1240 if (sr_get_debug() > 0)
1241 printf("\n<retrying...>\n");
1242
1243 ++retries;
1244
1245 /* flush any remaining input and verify that we are back
1246 at the prompt level. */
1247 gr_expect_prompt();
1248 /* start all over again. */
1249 /* FIXME: this is just start_load pasted in... */
1250 { char *command;
1251 command = (srec_echo_pace ? "lo 0 ;x" : "lo 0");
1252 sr_write_cr (command);
1253 sr_expect (command);
1254 sr_expect ("\r\n");
1255#if 0
1256 bug_srec_write_cr ("S0030000FC");
1257#endif
1258 }
1259 /* end of hack */
1260
1261 done = 0;
1262 continue;
1263 }
1264
1265 done += thisgo;
1266 }
1267#if 0
1268 bug_srec_write_cr("S7060000000000F9");
1269#endif
1270 ++retries;
1271
1272 /* Having finished the load, we need to figure out whether we
1273 had any errors. */
1274 }
1275
1276 return(0);
1277}
1278
51d6a954
RS
1279/*
1280 * _initialize_remote_monitors -- setup a few addtitional commands that
1281 * are usually only used by monitors.
1282 */
1283void
1284_initialize_remote_monitors ()
1285{
1286 struct cmd_list_element *c;
1287
1288 /* this sets the type of download protocol */
1289 c = add_set_cmd ("loadtype", no_class, var_string, (char *)&loadtype_str,
1290 "Set the type of the remote load protocol.\n", &setlist);
1291 c->function.sfunc = set_loadtype_command;
1292 add_show_from_set (c, &showlist);
21ed3dcd 1293 loadtype_str = savestring ("default", 8);
51d6a954
RS
1294
1295 add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1296 (char *)&hashmark,
1297 "Set display of activity while downloading a file.\n\
1298When enabled, a period \'.\' is displayed.",
1299 &setlist),
1300 &showlist);
1301
1302 /* generic monitor command */
1303 add_com ("monitor", class_obscure, monitor_command,
1304 "Send a command to the debug monitor.");
1305}
This page took 0.075671 seconds and 4 git commands to generate.