* expression.h (OP_LABELED): New operator, for Chill
[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
cf51c601
RS
45#if !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) && !defined (HAVE_SGTTY)
46#define HAVE_SGTTY
47#endif
48
49#ifdef HAVE_TERMIOS
50#include <termio.h>
51#include <termios.h>
51d6a954
RS
52# define TERMINAL struct termios
53#else
cf51c601 54#include <fcntl.h>
51d6a954
RS
55# define TERMINAL struct sgttyb
56#endif
cf51c601
RS
57#include "terminal.h"
58#ifndef CSTOPB
59#define CSTOPB 0x00000040
60#endif
61
62#define SWAP_TARGET_AND_HOST(buffer,len) \
63 do \
64 { \
65 if (TARGET_BYTE_ORDER != HOST_BYTE_ORDER) \
66 { \
67 char tmp; \
68 char *p = (char *)(buffer); \
69 char *q = ((char *)(buffer)) + len - 1; \
70 for (; p < q; p++, q--) \
71 { \
72 tmp = *q; \
73 *q = *p; \
74 *p = tmp; \
75 } \
76 } \
77 } \
78 while (0)
79
51d6a954 80
06b8f5e4
RS
81extern void make_xmodem_packet();
82extern void print_xmodem_packet();
83
51d6a954
RS
84struct monitor_ops *current_monitor;
85extern struct cmd_list_element *setlist;
86extern struct cmd_list_element *unsetlist;
87struct cmd_list_element *showlist;
21ed3dcd
RS
88extern char *version;
89extern char *host_name;
90extern char *target_name;
51d6a954
RS
91
92static int hashmark; /* flag set by "set hash" */
93
51d6a954
RS
94#define LOG_FILE "monitor.log"
95#if defined (LOG_FILE)
96FILE *log_file;
97#endif
98
99static int timeout = 24;
100
06b8f5e4
RS
101/*
102 * Descriptor for I/O to remote machine. Initialize it to NULL so that
103 * monitor_open knows that we don't have a file open when the program starts.
104 */
cf51c601 105serial_t monitor_desc = NULL;
51d6a954
RS
106
107/* sets the download protocol, choices are srec, generic, boot */
108char *loadtype;
109static char *loadtype_str;
b3b8d9bf 110static char *loadproto_str;
51d6a954 111static void set_loadtype_command();
b3b8d9bf 112static void set_loadproto_command();
21ed3dcd
RS
113static void monitor_load_srec();
114static int monitor_write_srec();
51d6a954 115
06b8f5e4
RS
116/*
117 * these definitions are for xmodem protocol
118 */
119#define SOH 0x01
120#define ACK 0x06
121#define NAK 0x15
122#define EOT 0x04
123#define CANCEL 0x18
124#define GETACK getacknak(ACK)
125#define GETNAK getacknak(NAK)
126#define XMODEM_DATASIZE 128 /* the data size is ALWAYS 128 */
127#define XMODEM_PACKETSIZE 131 /* the packet size is ALWAYS 132 (zero based) */
128#define XMODEM 1
129
51d6a954
RS
130/*
131 * set_loadtype_command -- set the type for downloading. Check to make
132 * sure you have a support protocol for this target.
133 */
134static void
135set_loadtype_command (ignore, from_tty, c)
136 char *ignore;
137 int from_tty;
138 struct cmd_list_element *c;
139{
21ed3dcd 140 char *tmp;
51d6a954 141 char *type;
3f9ef4ff
RS
142
143 if (current_monitor == 0x0)
144 return;
145
146 if (STREQ (LOADTYPES, "")) {
51d6a954
RS
147 error ("No loadtype set");
148 return;
149 }
150
21ed3dcd
RS
151 tmp = savestring (LOADTYPES, strlen(LOADTYPES));
152 type = strtok(tmp, ",");
51d6a954
RS
153 if (STREQ (type, (*(char **) c->var))) {
154 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
155 return;
156 }
157
21ed3dcd 158 while ((type = strtok (NULL, ",")) != (char *)NULL) {
51d6a954
RS
159 if (STREQ (type, (*(char **) c->var)))
160 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
21ed3dcd
RS
161 return;
162 }
163 free (tmp);
164 error ("Loadtype \"%s\" does not exist.", (*(char **) c->var));
51d6a954 165}
b3b8d9bf
RS
166/*
167 * set_loadproto_command -- set the protocol for downloading. Check to make
168 * sure you have a supported protocol for this target.
169 */
170static void
171set_loadproto_command (ignore, from_tty, c)
172 char *ignore;
173 int from_tty;
174 struct cmd_list_element *c;
175{
176 char *tmp;
177 char *type;
3f9ef4ff
RS
178
179 if (current_monitor == 0x0)
180 return;
181
b3b8d9bf
RS
182 if (STREQ (LOADPROTOS, "")) {
183 error ("No load protocols set");
184 return;
185 }
186
187 tmp = savestring (LOADPROTOS, strlen(LOADPROTOS));
188 type = strtok(tmp, ",");
189 if (STREQ (type, (*(char **) c->var))) {
190 loadproto_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
191 return;
192 }
193
194 while ((type = strtok (NULL, ",")) != (char *)NULL) {
195 if (STREQ (type, (*(char **) c->var)))
196 loadproto_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
197 return;
198 }
199 free (tmp);
200 error ("Load protocol \"%s\" does not exist.", (*(char **) c->var));
201}
51d6a954
RS
202
203/*
204 * printf_monitor -- send data to monitor. Works just like printf.
205 */
206static void
207printf_monitor(va_alist)
208 va_dcl
209{
210 va_list args;
211 char *pattern;
212 char buf[200];
213 int i;
214
215 va_start(args);
216
217 pattern = va_arg(args, char *);
218
219 vsprintf(buf, pattern, args);
220
e6fa5bd6 221 debuglogs (1, "printf_monitor(), Sending: \"%s\".", buf);
51d6a954
RS
222
223 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
224 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
225}
06b8f5e4
RS
226/*
227 * write_monitor -- send raw data to monitor.
228 */
229static void
230write_monitor(data, len)
231 char data[];
232 int len;
233{
234 if (SERIAL_WRITE(monitor_desc, data, len))
235 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
236
237 *(data + len+1) = '\0';
238 debuglogs (1, "write_monitor(), Sending: \"%s\".", data);
239
240}
51d6a954 241
e6fa5bd6
RS
242/*
243 * debuglogs -- deal with debugging info to multiple sources. This takes
244 * two real args, the first one is the level to be compared against
245 * the sr_get_debug() value, the second arg is a printf buffer and args
246 * to be formatted and printed. A CR is added after each string is printed.
247 */
cf51c601 248void
e6fa5bd6
RS
249debuglogs(va_alist)
250 va_dcl
251{
252 va_list args;
253 char *pattern, *p;
254 char buf[200];
255 char newbuf[300];
256 int level, i;
257
258 va_start(args);
259
260 level = va_arg(args, int); /* get the debug level */
261 if ((level <0) || (level > 100)) {
06b8f5e4 262 error ("Bad argument passed to debuglogs(), needs debug level");
e6fa5bd6
RS
263 return;
264 }
265
266 pattern = va_arg(args, char *); /* get the printf style pattern */
267
268 vsprintf(buf, pattern, args); /* format the string */
269
270 /* convert some characters so it'll look right in the log */
271 p = newbuf;
272 for (i=0 ; buf[i] != '\0'; i++) {
273 switch (buf[i]) {
274 case '\n': /* newlines */
275 *p++ = '\\';
276 *p++ = 'n';
277 continue;
278 case '\r': /* carriage returns */
279 *p++ = '\\';
280 *p++ = 'r';
281 continue;
282 case '\033': /* escape */
283 *p++ = '\\';
284 *p++ = 'e';
285 continue;
286 case '\t': /* tab */
287 *p++ = '\\';
288 *p++ = 't';
289 continue;
290 case '\b': /* backspace */
291 *p++ = '\\';
292 *p++ = 'b';
293 continue;
294 default: /* no change */
295 *p++ = buf[i];
296 }
297
298 if (buf[i] < 26) { /* modify control characters */
299 *p++ = '^';
300 *p++ = buf[i] + 'A';
301 continue;
302 }
303 }
304 *p = '\0'; /* terminate the string */
305
306 if (sr_get_debug() > level)
307 puts (newbuf);
308
309#ifdef LOG_FILE /* write to the monitor log */
310 if (log_file != 0x0) {
311 fputs (newbuf, log_file);
312 fputc ('\n', log_file);
313 fflush (log_file);
314 }
315#endif
316}
317
7804e5bc
RS
318/* readchar -- read a character from the remote system, doing all the fancy
319 * timeout stuff.
320 */
51d6a954
RS
321static int
322readchar(timeout)
323 int timeout;
324{
325 int c;
326
327 c = SERIAL_READCHAR(monitor_desc, timeout);
328
06b8f5e4 329 if (sr_get_debug() > 5)
51d6a954
RS
330 putchar(c & 0x7f);
331
332#ifdef LOG_FILE
333 if (isascii (c))
334 putc(c & 0x7f, log_file);
335#endif
336
337 if (c >= 0)
338 return c & 0x7f;
339
7804e5bc
RS
340 if (c == SERIAL_TIMEOUT) {
341 if (timeout == 0)
342 return c; /* Polls shouldn't generate timeout errors */
343 error("Timeout reading from remote system.");
7a1330f7 344#ifdef LOG_FILE
06b8f5e4 345 fputs ("ERROR: Timeout reading from remote system", log_file);
7a1330f7 346#endif
7804e5bc 347 }
51d6a954
RS
348 perror_with_name("remote-monitor");
349}
350
7804e5bc
RS
351/*
352 * expect -- scan input from the remote system, until STRING is found.
353 * If DISCARD is non-zero, then discard non-matching input, else print
354 * it out. Let the user break out immediately.
355 */
51d6a954
RS
356static void
357expect (string, discard)
358 char *string;
359 int discard;
360{
361 char *p = string;
362 int c;
363
364
e6fa5bd6 365 debuglogs (1, "Expecting \"%s\".", string);
51d6a954
RS
366
367 immediate_quit = 1;
368 while (1) {
369 c = readchar(timeout);
370 if (!isascii (c))
371 continue;
372 if (c == *p++) {
373 if (*p == '\0') {
374 immediate_quit = 0;
7a1330f7 375 debuglogs (4, "Matched");
51d6a954
RS
376 return;
377 }
378 } else {
379 if (!discard) {
380 fwrite(string, 1, (p - 1) - string, stdout);
381 putchar((char)c);
382 fflush(stdout);
383 }
384 p = string;
385 }
386 }
387}
388
389/* Keep discarding input until we see the MONITOR prompt.
390
391 The convention for dealing with the prompt is that you
392 o give your command
393 o *then* wait for the prompt.
394
395 Thus the last thing that a procedure does with the serial line
396 will be an expect_prompt(). Exception: monitor_resume does not
397 wait for the prompt, because the terminal is being handed over
398 to the inferior. However, the next thing which happens after that
399 is a monitor_wait which does wait for the prompt.
400 Note that this includes abnormal exit, e.g. error(). This is
401 necessary to prevent getting into states from which we can't
402 recover. */
403static void
404expect_prompt(discard)
405 int discard;
406{
51d6a954
RS
407 expect (PROMPT, discard);
408}
409
410/*
411 * junk -- ignore junk characters. Returns a 1 if junk, 0 otherwise
412 */
413static int
414junk(ch)
415 char ch;
416{
417 switch (ch) {
06b8f5e4 418 case '\0':
51d6a954
RS
419 case ' ':
420 case '-':
421 case '\t':
422 case '\r':
423 case '\n':
424 if (sr_get_debug() > 5)
e6fa5bd6 425 debuglogs (5, "Ignoring \'%c\'.", ch);
51d6a954
RS
426 return 1;
427 default:
428 if (sr_get_debug() > 5)
e6fa5bd6 429 debuglogs (5, "Accepting \'%c\'.", ch);
51d6a954
RS
430 return 0;
431 }
432}
433
434/*
435 * get_hex_digit -- Get a hex digit from the remote system & return its value.
436 * If ignore is nonzero, ignore spaces, newline & tabs.
437 */
438static int
439get_hex_digit(ignore)
440 int ignore;
441{
442 static int ch;
443 while (1) {
444 ch = readchar(timeout);
445 if (junk(ch))
446 continue;
cf51c601 447 if (sr_get_debug() > 4) {
e6fa5bd6 448 debuglogs (4, "get_hex_digit() got a 0x%x(%c)", ch, ch);
cf51c601
RS
449 } else {
450#ifdef LOG_FILE /* write to the monitor log */
451 if (log_file != 0x0) {
452 fputs ("get_hex_digit() got a 0x", log_file);
453 fputc (ch, log_file);
454 fputc ('\n', log_file);
455 fflush (log_file);
456 }
457#endif
458 }
51d6a954
RS
459
460 if (ch >= '0' && ch <= '9')
461 return ch - '0';
462 else if (ch >= 'A' && ch <= 'F')
463 return ch - 'A' + 10;
464 else if (ch >= 'a' && ch <= 'f')
465 return ch - 'a' + 10;
466 else if (ch == ' ' && ignore)
467 ;
468 else {
469 expect_prompt(1);
cf51c601 470 debuglogs (4, "Invalid hex digit from remote system. (0x%x)", ch);
06b8f5e4 471 error("Invalid hex digit from remote system. (0x%x)", ch);
51d6a954
RS
472 }
473 }
474}
475
476/* get_hex_byte -- Get a byte from monitor and put it in *BYT.
477 * Accept any number leading spaces.
478 */
479static void
480get_hex_byte (byt)
481 char *byt;
482{
483 int val;
484
485 val = get_hex_digit (1) << 4;
cf51c601 486 debuglogs (4, "get_hex_byte() -- Read first nibble 0x%x", val);
51d6a954
RS
487
488 val |= get_hex_digit (0);
cf51c601 489 debuglogs (4, "get_hex_byte() -- Read second nibble 0x%x", val);
51d6a954
RS
490 *byt = val;
491
cf51c601 492 debuglogs (4, "get_hex_byte() -- Read a 0x%x", val);
51d6a954
RS
493}
494
495/*
496 * get_hex_word -- Get N 32-bit words from remote, each preceded by a space,
497 * and put them in registers starting at REGNO.
498 */
499static int
500get_hex_word ()
501{
cf51c601 502 long val, newval;
51d6a954
RS
503 int i;
504
505 val = 0;
cf51c601
RS
506
507#if 0
508 if (HOST_BYTE_ORDER == BIG_ENDIAN) {
509#endif
510 for (i = 0; i < 8; i++)
511 val = (val << 4) + get_hex_digit (i == 0);
512#if 0
513 } else {
514 for (i = 7; i >= 0; i--)
515 val = (val << 4) + get_hex_digit (i == 0);
516 }
517#endif
518
519 debuglogs (4, "get_hex_word() got a 0x%x for a %s host.", val, (HOST_BYTE_ORDER == BIG_ENDIAN) ? "big endian" : "little endian");
51d6a954
RS
520
521 return val;
522}
523
524/* This is called not only when we first attach, but also when the
525 user types "run" after having attached. */
526void
527monitor_create_inferior (execfile, args, env)
528 char *execfile;
529 char *args;
530 char **env;
531{
532 int entry_pt;
533
534 if (args && *args)
535 error("Can't pass arguments to remote MONITOR process");
536
537 if (execfile == 0 || exec_bfd == 0)
538 error("No exec file specified");
539
540 entry_pt = (int) bfd_get_start_address (exec_bfd);
541
cf51c601 542 debuglogs (3, "create_inferior(exexfile=%s, args=%s, env=%s)", execfile, args, env);
51d6a954
RS
543
544/* The "process" (board) is already stopped awaiting our commands, and
545 the program is already downloaded. We just set its PC and go. */
546
547 clear_proceed_status ();
548
549 /* Tell wait_for_inferior that we've started a new process. */
550 init_wait_for_inferior ();
551
552 /* Set up the "saved terminal modes" of the inferior
553 based on what modes we are starting it with. */
554 target_terminal_init ();
555
556 /* Install inferior's terminal modes. */
557 target_terminal_inferior ();
558
559 /* insert_step_breakpoint (); FIXME, do we need this? */
560
561 /* Let 'er rip... */
562 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
563}
564
7804e5bc
RS
565/*
566 * monitor_open -- open a connection to a remote debugger.
567 * NAME is the filename used for communication.
568 */
51d6a954
RS
569static int baudrate = 9600;
570static char dev_name[100];
571
572void
573monitor_open(args, name, from_tty)
574 char *args;
575 char *name;
576 int from_tty;
577{
cf51c601 578 TERMINAL *temptempio;
51d6a954
RS
579
580 if (args == NULL)
581 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
582`target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
583
584/* if (is_open) */
585 monitor_close(0);
586
587 strcpy(dev_name, args);
588 monitor_desc = SERIAL_OPEN(dev_name);
589
590 if (monitor_desc == NULL)
591 perror_with_name(dev_name);
592
7a1330f7
RS
593 if (baud_rate != -1) {
594 if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate)) {
595 SERIAL_CLOSE (monitor_desc);
596 perror_with_name (name);
51d6a954 597 }
7a1330f7
RS
598 }
599
51d6a954
RS
600 SERIAL_RAW(monitor_desc);
601
cf51c601
RS
602#ifndef __GO32__
603 /* some systems only work with 2 stop bits */
604 if (STOPBITS == 2) {
605 temptempio = (TERMINAL *)SERIAL_GET_TTY_STATE(monitor_desc);
606#ifdef HAVE_SGTTY
607 temptempio->sg_cflag |= baud_rate | CSTOPB;
608#else
609 temptempio->c_cflag |= baud_rate | CSTOPB;
610#endif
611 SERIAL_SET_TTY_STATE(monitor_desc, temptempio);
612 debuglogs (4, "Set serial port to 2 stop bits");
613 }
614#endif /* __GO32__ */
615
51d6a954
RS
616#if defined (LOG_FILE)
617 log_file = fopen (LOG_FILE, "w");
618 if (log_file == NULL)
619 perror_with_name (LOG_FILE);
21ed3dcd
RS
620 fprintf_filtered (log_file, "GDB %s (%s", version, host_name);
621 fprintf_filtered (log_file, " --target %s)\n", target_name);
622 fprintf_filtered (log_file, "Remote target %s connected to %s\n\n", TARGET_NAME, dev_name);
51d6a954
RS
623#endif
624
625 /* wake up the monitor and see if it's alive */
626 printf_monitor(INIT_CMD);
627 expect_prompt(1); /* See if we get a prompt */
628
629 /* try again to be sure */
630 printf_monitor(INIT_CMD);
631 expect_prompt(1); /* See if we get a prompt */
632
633 if (from_tty)
634 printf("Remote target %s connected to %s\n", TARGET_NAME, dev_name);
51d6a954
RS
635}
636
637/*
7804e5bc
RS
638 * monitor_close -- Close out all files and local state before this
639 * target loses control.
51d6a954
RS
640 */
641
642void
643monitor_close (quitting)
644 int quitting;
645{
646 SERIAL_CLOSE(monitor_desc);
647 monitor_desc = NULL;
648
e6fa5bd6 649 debuglogs (1, "monitor_close (quitting=%d)", quitting);
7804e5bc 650
51d6a954
RS
651#if defined (LOG_FILE)
652 if (log_file) {
653 if (ferror(log_file))
654 fprintf(stderr, "Error writing log file.\n");
655 if (fclose(log_file) != 0)
656 fprintf(stderr, "Error closing log file.\n");
657 }
658#endif
659}
660
7804e5bc
RS
661/*
662 * monitor_detach -- terminate the open connection to the remote
663 * debugger. Use this when you want to detach and do something
664 * else with your gdb.
665 */
51d6a954
RS
666void
667monitor_detach (from_tty)
668 int from_tty;
669{
e6fa5bd6 670
7a1330f7 671 debuglogs (1, "monitor_detach ()");
7804e5bc 672
51d6a954
RS
673 pop_target(); /* calls monitor_close to do the real work */
674 if (from_tty)
675 printf ("Ending remote %s debugging\n", target_shortname);
676}
7804e5bc
RS
677
678/*
679 * monitor_attach -- attach GDB to the target.
680 */
681void
682monitor_attach (args, from_tty)
683 char *args;
684 int from_tty;
685{
686 if (from_tty)
687 printf ("Starting remote %s debugging\n", target_shortname);
51d6a954 688
7a1330f7 689 debuglogs (1, "monitor_attach (args=%s)", args);
7804e5bc 690
7804e5bc
RS
691 printf_monitor (GO_CMD);
692 /* swallow the echo. */
693 expect (GO_CMD, 1);
694}
695
51d6a954 696/*
7804e5bc 697 * monitor_resume -- Tell the remote machine to resume.
51d6a954
RS
698 */
699void
700monitor_resume (pid, step, sig)
701 int pid, step;
702 enum target_signal sig;
703{
7a1330f7 704 debuglogs (1, "monitor_resume (step=%d, sig=%d)", step, sig);
7804e5bc
RS
705
706 if (step) {
707 printf_monitor (STEP_CMD);
7804e5bc
RS
708 } else {
709 printf_monitor (CONT_CMD);
7804e5bc 710 }
51d6a954
RS
711}
712
713/*
7a1330f7 714 * monitor_wait -- Wait until the remote machine stops, then return,
51d6a954
RS
715 * storing status in status just as `wait' would.
716 */
51d6a954
RS
717int
718monitor_wait (pid, status)
719 int pid;
720 struct target_waitstatus *status;
721{
722 int old_timeout = timeout;
51d6a954 723
7a1330f7 724 debuglogs(1, "monitor_wait (), printing extraneous text.");
e6fa5bd6 725
51d6a954
RS
726 status->kind = TARGET_WAITKIND_EXITED;
727 status->value.integer = 0;
728
729 timeout = 0; /* Don't time out -- user program is running. */
730
731 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
7a1330f7 732 debuglogs (4, "monitor_wait(), got the prompt.");
51d6a954
RS
733
734 status->kind = TARGET_WAITKIND_STOPPED;
735 status->value.sig = TARGET_SIGNAL_TRAP;
736
cf51c601
RS
737
738
51d6a954
RS
739 timeout = old_timeout;
740
741 return 0;
742}
743
744/* Return the name of register number regno in the form input and output by
745 monitor. Currently, register_names just happens to contain exactly what
746 monitor wants. Lets take advantage of that just as long as possible! */
747
748static char *
749get_reg_name (regno)
750 int regno;
751{
752 static char buf[50];
753 const char *p;
754 char *b;
b3b8d9bf 755
51d6a954
RS
756 b = buf;
757
758 if (regno < 0)
759 return ("");
760
761 for (p = REGNAMES(regno); *p; p++)
762 *b++ = tolower(*p);
763
764 *b = '\000';
765
e6fa5bd6 766 debuglogs (5, "Got name \"%s\" from regno #%d.", buf, regno);
f1ca4cbc 767
51d6a954
RS
768 return buf;
769}
770
e6fa5bd6
RS
771/*
772 * monitor_fetch_registers -- read the remote registers into the
773 * block regs.
774 */
51d6a954
RS
775void
776monitor_fetch_registers ()
777{
778 int regno;
779
780 /* yeah yeah, i know this is horribly inefficient. but it isn't done
781 very often... i'll clean it up later. */
782
783 for (regno = 0; regno <= PC_REGNUM; regno++)
784 monitor_fetch_register(regno);
785}
786
787/*
f1ca4cbc
RS
788 * monitor_fetch_register -- fetch register REGNO, or all registers if REGNO
789 * is -1. Returns errno value.
51d6a954
RS
790 */
791void
792monitor_fetch_register (regno)
793 int regno;
794{
cf51c601 795 int newval, val, j;
51d6a954 796
7a1330f7 797 debuglogs (1, "monitor_fetch_register (reg=%s)", get_reg_name (regno));
51d6a954
RS
798
799 if (regno < 0) {
800 monitor_fetch_registers ();
801 } else {
802 char *name = get_reg_name (regno);
803 if (STREQ(name, ""))
804 return;
805 printf_monitor (ROMCMD(GET_REG), name); /* send the command */
806 expect (name, 1); /* then strip the leading garbage */
807 if (*ROMDELIM(GET_REG) != 0) { /* if there's a delimiter */
808 expect (ROMDELIM(GET_REG), 1);
809 }
810
811 val = get_hex_word(); /* get the value, ignore junk */
cf51c601
RS
812
813
814 /* supply register stores in target byte order, so swap here */
815 SWAP_TARGET_AND_HOST (&val, 4);
51d6a954
RS
816 supply_register (regno, (char *) &val);
817
818 if (*ROMDELIM(GET_REG) != 0) {
f1ca4cbc 819/*** expect (ROMRES(GET_REG)); ***/
51d6a954
RS
820 printf_monitor (CMD_END);
821 }
822 expect_prompt (1);
823 }
824 return;
825}
826
827/* Store the remote registers from the contents of the block REGS. */
828
829void
830monitor_store_registers ()
831{
832 int regno;
833
e6fa5bd6
RS
834 debuglogs (1, "monitor_store_registers()");
835
51d6a954
RS
836 for (regno = 0; regno <= PC_REGNUM; regno++)
837 monitor_store_register(regno);
838
839 registers_changed ();
840}
841
f1ca4cbc
RS
842/*
843 * monitor_store_register -- store register REGNO, or all if REGNO == 0.
844 * return errno value.
845 */
51d6a954
RS
846void
847monitor_store_register (regno)
848 int regno;
849{
850 char *name;
f1ca4cbc
RS
851 int i;
852
853 i = read_register(regno);
51d6a954 854
e6fa5bd6 855 debuglogs (1, "monitor_store_register (regno=%d)", regno);
51d6a954
RS
856
857 if (regno < 0)
858 monitor_store_registers ();
859 else {
e6fa5bd6 860 debuglogs (3, "Setting register %s to 0x%x", get_reg_name (regno), read_register (regno));
51d6a954
RS
861
862 name = get_reg_name (regno);
863 if (STREQ(name, ""))
864 return;
f1ca4cbc
RS
865 printf_monitor (ROMCMD(SET_REG), name, read_register(regno));
866 expect (name, 1); /* strip the leading garbage */
51d6a954
RS
867 if (*ROMDELIM(SET_REG) != 0) { /* if there's a delimiter */
868 expect (ROMDELIM(SET_REG), 1);
f1ca4cbc
RS
869 get_hex_word(1);
870 printf_monitor ("%d%s\n", i, CMD_END);
51d6a954
RS
871 }
872 expect_prompt (1);
873 }
874 return;
875
876#if 0
877 printf_monitor (SET_REG, get_reg_name (regno),
878 read_register (regno));
879 expect_prompt (1);
880 }
881#endif
882}
883
884/* Get ready to modify the registers array. On machines which store
885 individual registers, this doesn't need to do anything. On machines
886 which store all the registers in one fell swoop, this makes sure
887 that registers contains all the registers from the program being
888 debugged. */
889
890void
891monitor_prepare_to_store ()
892{
893 /* Do nothing, since we can store individual regs */
894}
895
896void
897monitor_files_info ()
898{
899 printf ("\tAttached to %s at %d baud.\n",
900 dev_name, baudrate);
901}
902
f1ca4cbc
RS
903/*
904 * monitor_write_inferior_memory -- Copy LEN bytes of data from debugger
905 * memory at MYADDR to inferior's memory at MEMADDR. Returns length moved.
906 */
51d6a954
RS
907int
908monitor_write_inferior_memory (memaddr, myaddr, len)
909 CORE_ADDR memaddr;
910 unsigned char *myaddr;
911 int len;
912{
913 int i;
914 char buf[10];
915
e6fa5bd6 916 debuglogs (1, "monitor_write_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
f1ca4cbc
RS
917
918 for (i = 0; i < len; i++) {
919 printf_monitor (ROMCMD(SET_MEM), memaddr + i, myaddr[i] );
920 if (*ROMDELIM(SET_MEM) != 0) { /* if there's a delimiter */
921 expect (ROMDELIM(SET_MEM), 1);
51d6a954
RS
922 expect (CMD_DELIM);
923 printf_monitor ("%x", myaddr[i]);
51d6a954 924 }
f1ca4cbc
RS
925/*** printf_monitor ("%x", myaddr[i]); ***/
926 if (sr_get_debug() > 1)
927 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
928 if (*ROMDELIM(SET_MEM) != 0) {
929 expect (CMD_DELIM);
930 printf_monitor (CMD_END);
931 }
932 expect_prompt (1);
933 }
51d6a954
RS
934 return len;
935}
936
937/*
938 * monitor_read_inferior_memory -- read LEN bytes from inferior memory
939 * at MEMADDR. Put the result at debugger address MYADDR. Returns
940 * length moved.
941 */
942int
943monitor_read_inferior_memory(memaddr, myaddr, len)
944 CORE_ADDR memaddr;
945 char *myaddr;
946 int len;
947{
948 int i, j;
949 char buf[20];
950
951 /* Number of bytes read so far. */
952 int count;
953
954 /* Starting address of this pass. */
955 unsigned long startaddr;
956
cf51c601
RS
957 /* Starting address of this pass. */
958 unsigned long endaddr;
959
51d6a954
RS
960 /* Number of bytes to read in this pass. */
961 int len_this_pass;
962
e6fa5bd6 963 debuglogs (1, "monitor_read_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
51d6a954
RS
964
965 /* Note that this code works correctly if startaddr is just less
966 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
967 thing). That is, something like
968 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
969 works--it never adds len To memaddr and gets 0. */
970 /* However, something like
971 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
972 doesn't need to work. Detect it and give up if there's an attempt
973 to do that. */
974 if (((memaddr - 1) + len) < memaddr) {
975 errno = EIO;
976 return 0;
977 }
978
979 startaddr = memaddr;
980 count = 0;
981 while (count < len) {
982 len_this_pass = 16;
983 if ((startaddr % 16) != 0)
984 len_this_pass -= startaddr % 16;
985 if (len_this_pass > (len - count))
986 len_this_pass = (len - count);
cf51c601
RS
987
988 debuglogs (3, "Display %d bytes at %x for Big Endian host", len_this_pass, startaddr);
51d6a954
RS
989
990 for (i = 0; i < len_this_pass; i++) {
991 printf_monitor (ROMCMD(GET_MEM), startaddr, startaddr);
992 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
51d6a954
RS
993 if (*ROMDELIM(GET_MEM) != 0) { /* if there's a delimiter */
994 expect (ROMDELIM(GET_MEM), 1);
995 } else {
996 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
997 expect (buf,1); /* get the command echo */
998 get_hex_word(1); /* strip away the address */
999 }
1000 get_hex_byte (&myaddr[count++]); /* get the value at this address */
cf51c601 1001
51d6a954
RS
1002 if (*ROMDELIM(GET_MEM) != 0) {
1003 printf_monitor (CMD_END);
1004 }
1005 expect_prompt (1);
1006 startaddr += 1;
1007 }
cf51c601 1008 }
51d6a954
RS
1009 return len;
1010}
1011
1012/* FIXME-someday! merge these two. */
1013int
1014monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
1015 CORE_ADDR memaddr;
1016 char *myaddr;
1017 int len;
1018 int write;
1019 struct target_ops *target; /* ignored */
1020{
1021 if (write)
1022 return monitor_write_inferior_memory (memaddr, myaddr, len);
1023 else
1024 return monitor_read_inferior_memory (memaddr, myaddr, len);
1025}
1026
1027void
1028monitor_kill (args, from_tty)
1029 char *args;
1030 int from_tty;
1031{
1032 return; /* ignore attempts to kill target system */
1033}
1034
1035/* Clean up when a program exits.
1036 The program actually lives on in the remote processor's RAM, and may be
1037 run again without a download. Don't leave it full of breakpoint
1038 instructions. */
1039
1040void
1041monitor_mourn_inferior ()
1042{
1043 remove_breakpoints ();
1044 generic_mourn_inferior (); /* Do all the proper things now */
1045}
1046
1047#define MAX_MONITOR_BREAKPOINTS 16
1048
1049extern int memory_breakpoint_size;
1050static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
1051
1052/*
1053 * monitor_insert_breakpoint -- add a breakpoint
1054 */
1055int
1056monitor_insert_breakpoint (addr, shadow)
1057 CORE_ADDR addr;
1058 char *shadow;
1059{
1060 int i;
1061
e6fa5bd6 1062 debuglogs (1, "monitor_insert_breakpoint() addr = 0x%x", addr);
f1ca4cbc
RS
1063
1064 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
1065 if (breakaddr[i] == 0) {
1066 breakaddr[i] = addr;
1067 if (sr_get_debug() > 4)
1068 printf ("Breakpoint at %x\n", addr);
1069 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
1070 printf_monitor(SET_BREAK_CMD, addr);
1071 expect_prompt(1);
1072 return 0;
1073 }
1074 }
1075
51d6a954
RS
1076 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
1077 return 1;
1078}
1079
1080/*
1081 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
1082 */
1083int
1084monitor_remove_breakpoint (addr, shadow)
1085 CORE_ADDR addr;
1086 char *shadow;
1087{
1088 int i;
1089
e6fa5bd6 1090 debuglogs (1, "monitor_remove_breakpoint() addr = 0x%x", addr);
7804e5bc
RS
1091
1092 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
1093 if (breakaddr[i] == addr) {
1094 breakaddr[i] = 0;
1095 /* some monitors remove breakpoints based on the address */
1096 if (CLR_BREAK_ADDR)
1097 printf_monitor(CLR_BREAK_CMD, addr);
1098 else
1099 printf_monitor(CLR_BREAK_CMD, i);
1100 expect_prompt(1);
1101 return 0;
1102 }
1103 }
51d6a954
RS
1104 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
1105 return 1;
1106}
1107
21ed3dcd
RS
1108/* monitor_load -- load a file. This file determines which of the
1109 * supported formats to use. The current types are:
1110 * FIXME: not all types supported yet.
06b8f5e4
RS
1111 * default - reads any file using bfd and writes it to memory. This
1112 * is really slow.
21ed3dcd
RS
1113 * srec - reads binary file using bfd and writes it as an
1114 * ascii srecord.
1115 * xmodem-bin - reads a binary file using bfd, and downloads it
1116 * using xmodem protocol.
1117 * xmodem-srec - reads a binary file using bfd, and after converting
1118 * it downloads it as an srecord using xmodem protocol.
1119 * ascii-srec - reads a ascii srecord file and downloads it
1120 * without a change.
1121 * ascii-xmodem - reads a ascii file and downloads using xmodem
1122 * protocol.
1123 */
1124void
1125monitor_load (file, fromtty)
1126 char *file;
1127 int fromtty;
1128{
1129 FILE *download;
1130 int i, bytes_read;
1131
1132 debuglogs (1, "Loading %s to monitor", file);
51d6a954 1133
21ed3dcd
RS
1134 if (STREQ (loadtype_str, "default")) { /* default, load a binary */
1135 gr_load_image (file, fromtty); /* by writing it into memory */
62b32254
RS
1136 return;
1137 }
1138
1139 /* load an srecord by converting */
1140 if ((STREQ (loadtype_str, "srec")) && STREQ (loadproto_str, "xmodem")) {
1141 monitor_load_srec(file, XMODEM);
1142 return;
21ed3dcd
RS
1143 }
1144
1145 if (STREQ (loadtype_str, "srec")) { /* load an srecord by converting */
06b8f5e4 1146 monitor_load_srec(file, 0); /* if from a binary */
62b32254 1147 return;
21ed3dcd
RS
1148 }
1149
3f9ef4ff
RS
1150 if (STREQ (loadtype_str, "none")) { /* load an srecord by converting */
1151 error ("Unimplemented");
62b32254 1152 return;
3f9ef4ff
RS
1153 }
1154
1155 if (STREQ (loadproto_str, "none")) { /* load an srecord file */
21ed3dcd 1156 monitor_load_ascii_srec(file, fromtty); /* if from a binary */
62b32254 1157 return;
21ed3dcd
RS
1158 }
1159
3f9ef4ff 1160 if (STREQ (loadproto_str, "xmodem")) { /* load an srecord using the */
06b8f5e4 1161 monitor_load_srec(file, XMODEM);
62b32254 1162 return;
21ed3dcd
RS
1163 }
1164}
1165
1166/*
1167 * monitor_load_ascii_srec -- download an ASCII srecord file.
1168 */
51d6a954 1169#define DOWNLOAD_LINE_SIZE 100
21ed3dcd
RS
1170int
1171monitor_load_ascii_srec (file, fromtty)
1172 char *file;
1173 int fromtty;
51d6a954
RS
1174{
1175 FILE *download;
1176 char buf[DOWNLOAD_LINE_SIZE];
1177 int i, bytes_read;
1178
21ed3dcd 1179 debuglogs (1, "Loading an ASCII srecord file, %s.", file);
51d6a954 1180
21ed3dcd
RS
1181 download = fopen (file, "r");
1182 if (download == NULL) {
1183 error ("%s Does not exist", file);
51d6a954
RS
1184 return;
1185 }
1186
1187 printf_monitor (LOAD_CMD);
06b8f5e4 1188 sleep(1);
21ed3dcd
RS
1189 while (!feof (download)) {
1190 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
1191 if (hashmark) {
1192 putchar ('.');
1193 fflush (stdout);
51d6a954 1194 }
21ed3dcd
RS
1195 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
1196 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
1197 break;
1198 }
1199 i = 0;
1200 while (i++ <=200) {} ; /* Ugly HACK, probably needs flow control */
1201 if (bytes_read < DOWNLOAD_LINE_SIZE) {
1202 if (!feof (download))
1203 error ("Only read %d bytes\n", bytes_read);
1204 break;
51d6a954 1205 }
21ed3dcd
RS
1206 }
1207
1208 if (hashmark) {
1209 putchar ('\n');
1210 }
51d6a954
RS
1211 if (!feof (download))
1212 error ("Never got EOF while downloading");
21ed3dcd 1213 expect_prompt(1);
51d6a954
RS
1214 fclose (download);
1215}
1216
7804e5bc
RS
1217/*
1218 * monitor_command -- put a command string, in args, out to MONITOR.
1219 * Output from MONITOR is placed on the users terminal until the
1220 * prompt is seen. FIXME: We read the charcters ourseleves here
1221 * cause of a nasty echo.
1222 */
51d6a954
RS
1223void
1224monitor_command (args, fromtty)
1225 char *args;
1226 int fromtty;
1227{
7804e5bc
RS
1228
1229 char *p;
1230 char c, cp;
1231 p = PROMPT;
1232
e6fa5bd6
RS
1233 debuglogs (1, "monitor_command (args=%s)", args);
1234
51d6a954
RS
1235 if (monitor_desc == NULL)
1236 error("monitor target not open.");
7804e5bc 1237
51d6a954
RS
1238 if (!args)
1239 error("Missing command.");
1240
7804e5bc
RS
1241 printf_monitor ("%s\n", args);
1242
51d6a954
RS
1243 expect_prompt(0);
1244}
1245
21ed3dcd 1246/*
06b8f5e4
RS
1247 * monitor_load_srec -- download a binary file by converting it to srecords. This
1248 * will also use xmodem to download the resulting file.
1249 *
1250 * A download goes like this when using xmodem:
1251 * Receiver: Sender
1252 * NAK ---------->
1253 * <-------- (packet) [SOH|1|1|data|SUM]
1254 * ACK ---------->
1255 * <-------- (packet) [SOH|2|2|data|SUM]
1256 * ACK ---------->
1257 * <-------- EOT
1258 * ACK ---------->
1259 *
1260 * ACK = 0x06
1261 * NAK = 0x15
1262 * EOT = 0x04
1263 *
21ed3dcd
RS
1264 */
1265static void
06b8f5e4 1266monitor_load_srec (args, protocol)
21ed3dcd 1267 char *args;
06b8f5e4 1268 int protocol;
21ed3dcd
RS
1269{
1270 bfd *abfd;
1271 asection *s;
1272 char buffer[1024];
06b8f5e4
RS
1273 char srec[1024];
1274 char packet[XMODEM_PACKETSIZE];
1275 int i;
1276 int retries;
1277 int type = 0; /* default to a type 0, header record */
1278 int srec_frame = 57; /* FIXME: this must be 57 There is 12 bytes
1279 of header, and 2 bytes of checksum at the end.
1280 The problem is an xmodem packet holds exactly
1281 128 bytes. */
21ed3dcd
RS
1282
1283 abfd = bfd_openr (args, 0);
1284 if (!abfd) {
1285 printf_filtered ("Unable to open file %s\n", args);
1286 return;
1287 }
1288
1289 if (bfd_check_format (abfd, bfd_object) == 0) {
1290 printf_filtered ("File is not an object file\n");
1291 return;
1292 }
1293
06b8f5e4
RS
1294 printf_monitor (LOAD_CMD); /* tell the monitor to load */
1295 if (protocol == XMODEM) { /* get the NAK from the target */
1296 if (GETNAK) {
1297 debuglogs (3, "Got the NAK to start loading");
1298 } else {
1299 printf_monitor ("%c", EOT);
1300 debuglogs (3, "Never got the NAK to start loading");
1301 error ("Never got the NAK to start loading");
1302 }
1303 }
1304
21ed3dcd
RS
1305 s = abfd->sections;
1306 while (s != (asection *) NULL) {
21ed3dcd 1307 if (s->flags & SEC_LOAD) {
21ed3dcd 1308 char *buffer = xmalloc (srec_frame);
06b8f5e4 1309 printf_filtered ("%s\t: 0x%4x .. 0x%4x ", s->name, s->vma, s->vma + s->_raw_size);
21ed3dcd
RS
1310 fflush (stdout);
1311 for (i = 0; i < s->_raw_size; i += srec_frame) {
1312 if (srec_frame > s->_raw_size - i)
1313 srec_frame = s->_raw_size - i;
1314
1315 bfd_get_section_contents (abfd, s, buffer, i, srec_frame);
06b8f5e4
RS
1316 monitor_make_srec (srec, type, s->vma + i, buffer, srec_frame);
1317 if (protocol == XMODEM) { /* send a packet using xmodem */
1318 make_xmodem_packet (packet, srec, XMODEM_DATASIZE);
1319 write_monitor (packet, XMODEM_PACKETSIZE+1);
1320 retries = 0;
1321 while (retries++ <= 3) {
1322 if (GETNAK) { /* Resend packet */
1323 debuglogs (3, "Got a NAK, resending packet");
1324 sleep(1);
1325 write_monitor (packet, XMODEM_PACKETSIZE+1); /* send it again */
1326 if (GETACK) /* ACKnowledged, get next data chunk */
1327 break;
62b32254
RS
1328 } else { /* assume we got an ACK */
1329 if (hashmark)
1330 printf_filtered ("#");
1331 debuglogs (3, "Got an ACK, sending next packet");
1332 break;
06b8f5e4
RS
1333 }
1334 }
62b32254 1335 if (retries >= 4) { /* too many tries, must be hosed */
06b8f5e4
RS
1336 printf_monitor ("%c", EOT);
1337 error ("Never got a ACK after sending an xmodem packet");
1338 }
1339 } else { /* no protocols at all */
1340 printf_monitor ("%s\n", srec);
1341 }
1342 if (hashmark)
1343 printf_filtered ("#");
1344 type = 3; /* switch to a 4 byte address record */
21ed3dcd
RS
1345 fflush (stdout);
1346 }
21ed3dcd 1347 free (buffer);
06b8f5e4
RS
1348 } else {
1349 debuglogs (3, "%s doesn't need to be loaded", s->name);
21ed3dcd
RS
1350 }
1351 s = s->next;
1352 }
cf51c601 1353 printf_filtered ("\n");
06b8f5e4
RS
1354
1355 /*
1356 write a type 7 terminator record. no data for a type 7,
1357 and there is no data, so len is 0.
1358 */
62b32254
RS
1359 if (protocol == XMODEM) { /* send a packet using xmodem */
1360 monitor_make_srec (srec, 7, abfd->start_address, "", 0);
1361 make_xmodem_packet (packet, srec, XMODEM_DATASIZE);
1362 write_monitor (packet, XMODEM_PACKETSIZE+1);
1363 } else {
1364 monitor_make_srec (srec, 7, abfd->start_address, "", 0);
1365 printf_monitor ("%s\n", srec);
1366 }
06b8f5e4
RS
1367 if (protocol == XMODEM) {
1368 printf_monitor ("%c", EOT);
1369 if (!GETACK)
1370 error ("Never got ACK after sending EOT");
1371 }
1372
1373 if (hashmark)
1374 putchar ('\n');
1375
21ed3dcd
RS
1376 expect_prompt ();
1377}
1378
06b8f5e4
RS
1379/*
1380 * getacknak -- get an ACK or a NAK from the target.
1381 * returns 1 (true) or 0 (false) This is
1382 * for xmodem. ANy string starting with "***"
1383 * is an error message from the target.
1384 * Here's a few from the WinBond w89k "Cougar" PA board.
1385 * *** Too many errors found.
1386 * *** Bad command
1387 * *** Command syntax error
1388 */
1389int
1390getacknak (byte)
1391 int byte;
1392{
1393 char character;
1394 int i;
1395
1396 i = 0;
1397 while (i++ < 60) {
1398 character = (char)readchar (0);
b3b8d9bf 1399 if ((character == 0xfffffffe) || (character == 0x7f)) { /* empty uart */
06b8f5e4
RS
1400 if (sr_get_debug() > 3)
1401 putchar ('.');
1402 fflush (stdout);
1403 sleep (1);
1404 continue;
1405 }
1406 if (character == CANCEL) { /* target aborted load */
1407 expect_prompt (0);
1408 error ("Got a CANCEL from the target.");
1409 }
1410 if (character == '*') { /* look for missed error message */
1411 expect_prompt (0);
1412 error ("Got an error message from the target");
1413 }
1414 debuglogs (3, "Got a %s (0x%x or \'%c\'), expecting a %s.\n",
1415 (character == ACK) ? "ACK" : (character == NAK) ? "NAK" : "BOGUS",
1416 character, character, (byte == ACK) ? "ACK" : "NAK");
1417 if (character == byte) /* got what we wanted */
1418 return 1;
1419 if (character == ((byte == ACK) ? NAK : ACK)) { /* got the opposite */
1420 debuglogs (3, "Got the opposite, wanted 0x%x, got a 0x%x", byte, character);
1421 return 0;
1422 }
1423 sleep (1);
1424 }
1425 return 0;
1426}
21ed3dcd 1427
06b8f5e4
RS
1428/*
1429 * monitor_make_srec -- make an srecord. This writes each line, one at a
1430 * time, each with it's own header and trailer line.
1431 * An srecord looks like this:
1432 *
1433 * byte count-+ address
1434 * start ---+ | | data +- checksum
1435 * | | | |
1436 * S01000006F6B692D746573742E73726563E4
1437 * S315000448600000000000000000FC00005900000000E9
1438 * S31A0004000023C1400037DE00F023604000377B009020825000348D
1439 * S30B0004485A0000000000004E
1440 * S70500040000F6
1441 *
1442 * S<type><length><address><data><checksum>
1443 *
1444 * Where
1445 * - length
1446 * is the number of bytes following upto the checksum. Note that
1447 * this is not the number of chars following, since it takes two
1448 * chars to represent a byte.
1449 * - type
1450 * is one of:
1451 * 0) header record
1452 * 1) two byte address data record
1453 * 2) three byte address data record
1454 * 3) four byte address data record
1455 * 7) four byte address termination record
1456 * 8) three byte address termination record
1457 * 9) two byte address termination record
1458 *
1459 * - address
1460 * is the start address of the data following, or in the case of
1461 * a termination record, the start address of the image
1462 * - data
1463 * is the data.
1464 * - checksum
1465 * is the sum of all the raw byte data in the record, from the length
1466 * upwards, modulo 256 and subtracted from 255.
1467 */
1468int
1469monitor_make_srec (buffer, type, memaddr, myaddr, len)
1470 char *buffer;
1471 int type;
21ed3dcd
RS
1472 CORE_ADDR memaddr;
1473 unsigned char *myaddr;
1474 int len;
1475{
21ed3dcd 1476 int checksum;
06b8f5e4
RS
1477 int i;
1478 char *buf;
21ed3dcd 1479
06b8f5e4
RS
1480 buf = buffer;
1481 debuglogs (4, "monitor_make_srec (buffer=0x%x, type=%d, memaddr=0x%x, len=%d",
1482 buffer, type, memaddr, len);
1483 checksum = 0;
1484
1485 /*
1486 create the header for the srec. 4 is the number of bytes in the address,
1487 and 1 is the number of bytes in the count.
1488 */
1489 if (type == 0) /* FIXME: type 0 is optional */
1490 type = 3; /* so use data as it works */
1491 sprintf (buf, "S%d%02X%08X", type, len + 4 + 1, memaddr);
1492 buf += 12;
1493
1494 checksum += (len + 4 + 1 /* calculate the checksum */
1495 + (memaddr & 0xff)
1496 + ((memaddr >> 8) & 0xff)
1497 + ((memaddr >> 16) & 0xff)
1498 + ((memaddr >> 24) & 0xff));
1499
1500 for (i = 0; i < len; i++) { /* build the srecord */
1501 sprintf (buf, "%02X", myaddr[i]);
1502 checksum += myaddr[i];
1503 buf += 2;
1504 }
21ed3dcd 1505
06b8f5e4
RS
1506 sprintf(buf, "%02X", ~checksum & 0xff); /* add the checksum */
1507 debuglogs (3, "srec is \"%s\"", buffer);
1508
1509 return(0);
1510}
21ed3dcd 1511
06b8f5e4
RS
1512/*
1513 * make_xmodem_packet -- this takes a 128 bytes of data and makes a packet
1514 * out of it.
1515 *
1516 * Each packet looks like this:
1517 * +-----+-------+-------+------+-----+
1518 * | SOH | Seq1. | Seq2. | data | SUM |
1519 * +-----+-------+-------+------+-----+
1520 * SOH = 0x01
1521 * Seq1 = The sequence number.
1522 * Seq2 = The complement of the sequence number.
1523 * Data = A 128 bytes of data.
1524 * SUM = Add the contents of the 128 bytes and use the low-order
1525 * 8 bits of the result.
1526 */
1527void
1528make_xmodem_packet (packet, data, len)
1529 unsigned char packet[];
1530 unsigned char *data;
1531 int len;
1532{
1533 static int sequence = 1;
1534 int i, sum;
1535 unsigned char *buf;
1536
1537 buf = data;
1538 /* build the packet header */
1539 packet[0] = SOH;
1540 packet[1] = sequence;
1541 packet[2] = 255 - sequence;
1542 sequence++;
21ed3dcd 1543#if 0
06b8f5e4 1544 packet[2] = ~sequence++; /* the complement is the sequence checksum */
21ed3dcd 1545#endif
06b8f5e4
RS
1546
1547 sum = 0; /* calculate the data checksum */
1548 for (i = 3; i <= len + 2; i++) {
1549 packet[i] = *buf;
1550 sum += *buf;
1551 buf++;
1552 }
1553
1554 for (i = len+1 ; i <= XMODEM_DATASIZE ; i++) { /* add padding for the rest of the packet */
1555 packet[i] = '0';
1556 }
1557
1558 packet[XMODEM_PACKETSIZE] = sum & 0xff; /* add the checksum */
1559
62b32254 1560 if (sr_get_debug() > 4) {
06b8f5e4
RS
1561 debuglogs (4, "The xmodem checksum is %d (0x%x)\n", sum & 0xff, sum & 0xff);
1562 print_xmodem_packet (packet);
62b32254 1563 }
06b8f5e4
RS
1564}
1565
1566/*
1567 * print_xmodem_packet -- print the packet as a debug check
1568 */
1569void
1570print_xmodem_packet(packet)
1571 char packet[];
1572{
1573 int i;
1574 static int lastseq;
1575 int sum;
1576
1577 /* take apart the packet header the packet header */
1578 if (packet[0] == SOH) {
1579 ("SOH");
1580 } else {
1581 error ("xmodem: SOH is wrong");
1582 }
1583
1584 /* check the sequence */
1585 if (packet[1] != 0) {
1586 lastseq = packet[1];
1587 if (packet[2] != ~lastseq)
1588 error ("xmodem: Sequence checksum is wrong");
1589 else
1590 printf_filtered (" %d %d", lastseq, ~lastseq);
1591 }
1592
1593 /* check the data checksum */
1594 sum = 0;
1595 for (i = 3; i <= XMODEM_DATASIZE; i++) {
1596 sum += packet[i];
1597 }
1598
1599 /* ignore the data */
21ed3dcd 1600#if 0
06b8f5e4 1601 printf (" [128 bytes of data] %d\n", sum & 0xff);
21ed3dcd 1602#endif
06b8f5e4 1603 printf_filtered (" [%s] %d\n", packet, sum & 0xff);
21ed3dcd 1604
06b8f5e4
RS
1605 if ((packet[XMODEM_PACKETSIZE] & 0xff) != (sum & 0xff)) {
1606 debuglogs (4, "xmodem: data checksum wrong, got a %d", packet[XMODEM_PACKETSIZE] & 0xff);
21ed3dcd 1607 }
06b8f5e4 1608 putchar ('\n');
21ed3dcd
RS
1609}
1610
51d6a954
RS
1611/*
1612 * _initialize_remote_monitors -- setup a few addtitional commands that
1613 * are usually only used by monitors.
1614 */
1615void
1616_initialize_remote_monitors ()
1617{
1618 struct cmd_list_element *c;
1619
1620 /* this sets the type of download protocol */
b3b8d9bf
RS
1621 c = add_set_cmd ("remoteloadprotocol", no_class, var_string, (char *)&loadproto_str,
1622 "Set the type of the remote load protocol.\n", &setlist);
1623 c->function.sfunc = set_loadproto_command;
1624 add_show_from_set (c, &showlist);
1625 loadproto_str = savestring ("none", 5);
1626
1627 /* this sets the conversion type when loading */
1628 c = add_set_cmd ("remoteloadtype", no_class, var_string, (char *)&loadtype_str,
51d6a954
RS
1629 "Set the type of the remote load protocol.\n", &setlist);
1630 c->function.sfunc = set_loadtype_command;
1631 add_show_from_set (c, &showlist);
b3b8d9bf 1632 loadtype_str = savestring ("srec", 5);
51d6a954
RS
1633
1634 add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1635 (char *)&hashmark,
1636 "Set display of activity while downloading a file.\n\
1637When enabled, a period \'.\' is displayed.",
1638 &setlist),
1639 &showlist);
1640
1641 /* generic monitor command */
1642 add_com ("monitor", class_obscure, monitor_command,
1643 "Send a command to the debug monitor.");
1644}
This page took 0.103149 seconds and 4 git commands to generate.