X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote-utils.c;h=482e2476b6403f565c595780e08d8b85258e6423;hb=c20c1bdf992a90db69c4abb73594b2ff58154ef6;hp=0b570fda78bfa13a192f20dbe882410477dfd4e8;hpb=c6f494e8be29c3acc11d8d7557fb29f3d700a69d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-utils.c b/gdb/remote-utils.c index 0b570fda78..482e2476b6 100644 --- a/gdb/remote-utils.c +++ b/gdb/remote-utils.c @@ -1,6 +1,6 @@ /* Generic support for remote debugging interfaces. - Copyright 1993 Free Software Foundation, Inc. + Copyright 1993, 1994 Free Software Foundation, Inc. This file is part of GDB. @@ -37,13 +37,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ * a pass through mode a la kermit or telnet. * autobaud. * ask remote to change his baud rate. - * put generic load here. - */ #include #include "defs.h" +#include #include "gdbcmd.h" #include "target.h" #include "serial.h" @@ -52,8 +51,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "remote-utils.h" struct _sr_settings sr_settings = { - 0, /* debug */ - 9600, /* baud */ 4, /* timeout: remote-hms.c had 2 remote-bug.c had "with a timeout of 2, we time out waiting for @@ -78,12 +75,10 @@ usage(proto, junk) char *junk; { if (junk != NULL) - fprintf(stderr, "Unrecognized arguments: `%s'.\n", junk); - - /* FIXME-now: service@host? */ + fprintf_unfiltered(gdb_stderr, "Unrecognized arguments: `%s'.\n", junk); - error("Usage: target %s >>\n\ -or target %s \n", proto, proto); + error ("Usage: target %s [DEVICE [SPEED [DEBUG]]]\n\ +where DEVICE is the name of a device or HOST:PORT", proto, proto); return; } @@ -128,7 +123,7 @@ sr_scan_args(proto, args) /* check for missing or empty baud rate. */ CHECKDONE(p, q); - sr_set_baud_rate(n); + baud_rate = n; /* look for debug value. */ n = strtol(p, &q, 10); @@ -171,18 +166,32 @@ gr_open(args, from_tty, gr) if (sr_get_desc() != NULL) gr_close (0); + /* If no args are specified, then we use the device specified by a + previous command or "set remotedevice". But if there is no + device, better stop now, not dump core. */ + + if (sr_get_device () == NULL) + usage (gr->ops->to_shortname, NULL); + sr_set_desc(SERIAL_OPEN (sr_get_device())); if (!sr_get_desc()) perror_with_name((char *) sr_get_device()); - if (SERIAL_SETBAUDRATE(sr_get_desc(), sr_get_baud_rate()) != 0) + if (baud_rate != -1) { - SERIAL_CLOSE(sr_get_desc()); - perror_with_name(sr_get_device()); + if (SERIAL_SETBAUDRATE(sr_get_desc(), baud_rate) != 0) + { + SERIAL_CLOSE(sr_get_desc()); + perror_with_name(sr_get_device()); + } } SERIAL_RAW (sr_get_desc()); + /* If there is something sitting in the buffer we might take it as a + response to a command, which would be bad. */ + SERIAL_FLUSH_INPUT (sr_get_desc ()); + /* default retries */ if (sr_get_retries() == 0) sr_set_retries(1); @@ -192,8 +201,13 @@ gr_open(args, from_tty, gr) gr_settings->clear_all_breakpoints = remove_breakpoints; if (from_tty) - printf_filtered ("Remote debugging using `%s' at baud rate of %d\n", - sr_get_device(), sr_get_baud_rate()); + { + printf_filtered ("Remote debugging using `%s'", sr_get_device ()); + if (baud_rate != -1) + printf_filtered (" at baud rate of %d", + baud_rate); + print_filtered ("\n"); + } push_target(gr->ops); gr_checkin(); @@ -215,7 +229,7 @@ sr_readchar () error ("Timeout reading from remote system."); if (sr_get_debug() > 0) - printf ("%c", buf); + printf_unfiltered ("%c", buf); return buf & 0x7f; } @@ -230,9 +244,9 @@ sr_pollchar() buf = 0; if (sr_get_debug() > 0) if (buf) - printf ("%c", buf); + printf_unfiltered ("%c", buf); else - printf (""); + printf_unfiltered (""); return buf & 0x7f; } @@ -274,7 +288,7 @@ sr_write (a, l) if (sr_get_debug() > 0) for (i = 0; i < l; i++) - printf ("%c", a[i]); + printf_unfiltered ("%c", a[i]); return; } @@ -430,22 +444,20 @@ void gr_files_info (ops) struct target_ops *ops; { - char *file = "nothing"; - - if (exec_bfd) - file = bfd_get_filename (exec_bfd); - - if (exec_bfd) - { #ifdef __GO32__ - printf_filtered ("\tAttached to DOS asynctsr\n"); + printf_filtered ("\tAttached to DOS asynctsr\n"); #else - printf_filtered ("\tAttached to %s at %d baud\n", - sr_get_device(), sr_get_baud_rate()); + printf_filtered ("\tAttached to %s", sr_get_device()); + if (baud_rate != -1) + printf_filtered ("at %d baud", baud_rate); + printf_filtered ("\n"); #endif - } - printf_filtered ("\tand running program %s\n", file); + if (exec_bfd) + { + printf_filtered ("\tand running program %s\n", + bfd_get_filename (exec_bfd)); + } printf_filtered ("\tusing the %s protocol.\n", ops->to_shortname); } @@ -535,7 +547,7 @@ gr_multi_scan (list, passthrough) swallowed_p = swallowed = alloca(max_length << 1); /* and a list of pointers to current scan points. */ - plist = alloca(string_count * sizeof(*plist)); + plist = (char **) alloca (string_count * sizeof(*plist)); /* and initialize */ for (i = 0; i < string_count; ++i) @@ -571,16 +583,18 @@ gr_multi_scan (list, passthrough) if (passthrough) { for (p = swallowed; p < swallowed_p; ++p) - putc (*p, stdout); + fputc_unfiltered (*p, gdb_stdout); - putc (ch, stdout); + fputc_unfiltered (ch, gdb_stdout); } swallowed_p = swallowed; } } - +#if 0 + /* Never reached. */ return(-1); +#endif } /* Get ready to modify the registers array. On machines which store @@ -616,24 +630,66 @@ gr_store_word (addr, word) dcache_poke (gr_get_dcache(), addr, word); } +/* general purpose load a file specified on the command line + into target memory. */ + void -_initialize_sr_support () +gr_load_image (args, fromtty) + char *args; + int fromtty; { - add_show_from_set (add_set_cmd ("remotedebug", no_class, - var_zinteger, (char *)&sr_settings.debug, - "Set debugging of remote serial I/O.\n\ -When non-zero, each packet sent or received with the remote target\n\ -is displayed. Higher numbers produce more debugging.", &setlist), - &showlist); + bfd *abfd; -/* FIXME-now: if target is open when baud changes... */ - add_show_from_set (add_set_cmd ("remotebaud", no_class, - var_zinteger, (char *)&sr_settings.baud_rate, - "Set baud rate for remote serial I/O.\n\ -This value is used to set the speed of the serial port when debugging\n\ -using remote targets.", &setlist), - &showlist); + asection *s; + struct cleanup *old_cleanups; + int delta = 4096; + char *buffer = xmalloc (delta); + + abfd = bfd_openr (args, (char *) 0); + + if (!abfd) + perror_with_name (args); + + old_cleanups = make_cleanup (bfd_close, abfd); + + QUIT; + + if (!bfd_check_format (abfd, bfd_object)) + error ("It doesn't seem to be an object file.\n"); + + for (s = abfd->sections; s && !quit_flag; s = s->next) + { + if (bfd_get_section_flags (abfd, s) & SEC_LOAD) + { + int i; + printf_filtered ("%s\t: 0x%4x .. 0x%4x ", + s->name, s->vma, s->vma + s->_raw_size); + fflush (stdout); + for (i = 0; i < s->_raw_size && !quit_flag; i += delta) + { + int sub_delta = delta; + if (sub_delta > s->_raw_size - i) + sub_delta = s->_raw_size - i; + QUIT; + bfd_get_section_contents (abfd, s, buffer, i, sub_delta); + target_write_memory (s->vma + i, buffer, sub_delta); + printf_filtered ("*"); + fflush (stdout); + } + printf_filtered ("\n"); + } + } + free (buffer); + write_pc (bfd_get_start_address (abfd)); + bfd_close (abfd); + discard_cleanups (old_cleanups); +} + + +void +_initialize_sr_support () +{ /* FIXME-now: if target is open... */ add_show_from_set (add_set_cmd ("remotedevice", no_class, var_filename, (char *)&sr_settings.device,