* remote-utils.c, remote-utils.h (gr_load_image): New function to
authorSteve Chamberlain <sac@cygnus>
Mon, 15 Nov 1993 23:21:29 +0000 (23:21 +0000)
committerSteve Chamberlain <sac@cygnus>
Mon, 15 Nov 1993 23:21:29 +0000 (23:21 +0000)
download to target.

gdb/remote-utils.c

index 5189bbdafc276a4d881408bb4485af2d617c215d..95043202bc110cf051bb354299e024b29c00daf6 100644 (file)
@@ -37,8 +37,6 @@ 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 <ctype.h>
@@ -620,6 +618,63 @@ 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
+gr_load_image (args, fromtty)
+     char *args;
+     int fromtty;
+{
+  bfd *abfd;
+
+  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;
+  immediate_quit++;
+
+  if (!bfd_check_format (abfd, bfd_object))
+    error ("It doesn't seem to be an object file.\n");
+
+  for (s = abfd->sections; s; 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);
+         for (i = 0; i < s->_raw_size; i += delta)
+           {
+             int sub_delta = delta;
+             if (sub_delta > s->_raw_size - i)
+               sub_delta = s->_raw_size - i;
+
+             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");
+       }
+    }
+  immediate_quit--;
+  free (buffer);
+  write_pc (bfd_get_start_address (abfd));
+  bfd_close (abfd);
+  discard_cleanups (old_cleanups);
+}
+
+
 void
 _initialize_sr_support ()
 {