X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fcommon%2Fsim-load.c;h=bfe3f15c4bde25624457029ebd4626b514b26a2a;hb=1029b7fa6a31d4cbb42e8d14c67ff4fdbbd4bd8c;hp=23258c5fcc209c5d281db499e02bacc18cc4c5ce;hpb=0f399b0c6b04b819c910665ad02f90f1e8848145;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/sim-load.c b/sim/common/sim-load.c index 23258c5fcc..bfe3f15c4b 100644 --- a/sim/common/sim-load.c +++ b/sim/common/sim-load.c @@ -21,6 +21,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" #include "ansidecl.h" +#include /* for NULL */ #ifdef ANSI_PROTOTYPES #include #else @@ -30,7 +31,11 @@ along with this program; if not, write to the Free Software Foundation, Inc., #include #endif #include + +#include "sim-basics.h" #include "bfd.h" +#include "sim-utils.h" + #include "callback.h" #include "remote-sim.h" @@ -40,28 +45,37 @@ static void report_transfer_performance PARAMS ((host_callback *, unsigned long, time_t, time_t)); static void xprintf_bfd_vma PARAMS ((host_callback *, bfd_vma)); -/* Load program PROG into the simulator. +/* Load program PROG into the simulator using the function DO_LOAD. If PROG_BFD is non-NULL, the file has already been opened. If VERBOSE_P is non-zero statistics are printed of each loaded section and the transfer rate (for consistency with gdb). + If LMA_P is non-zero the program sections are loaded at the LMA + rather than the VMA If this fails an error message is printed and NULL is returned. - If it succeeds the bfd is returned. */ + If it succeeds the bfd is returned. + NOTE: For historical reasons, older hardware simulators incorrectly + write the program sections at LMA interpreted as a virtual address. + This is still accommodated for backward compatibility reasons. */ -/* FIXME: Where can we put a prototype for this? */ bfd * -sim_load_file (sd, myname, callback, prog, prog_bfd, verbose_p) +sim_load_file (sd, myname, callback, prog, prog_bfd, verbose_p, lma_p, do_write) SIM_DESC sd; - char *myname; + const char *myname; host_callback *callback; char *prog; bfd *prog_bfd; + int verbose_p; + int lma_p; + sim_write_fn do_write; { asection *s; /* Record separately as we don't want to close PROG_BFD if it was passed. */ bfd *result_bfd; - time_t start_time, end_time; /* Start and end times of download */ + time_t start_time = 0; /* Start and end times of download */ + time_t end_time = 0; unsigned long data_count = 0; /* Number of bytes transferred to memory */ + int found_loadable_section; if (prog_bfd != NULL) result_bfd = prog_bfd; @@ -89,6 +103,7 @@ sim_load_file (sd, myname, callback, prog, prog_bfd, verbose_p) if (verbose_p) start_time = time (NULL); + found_loadable_section = 0; for (s = result_bfd->sections; s; s = s->next) { if (s->flags & SEC_LOAD) @@ -112,25 +127,36 @@ sim_load_file (sd, myname, callback, prog, prog_bfd, verbose_p) bfd_close (result_bfd); return NULL; } - /* Before you change this to bfd_section_lma, make sure - the arm-pe simulator still works. */ - lma = bfd_section_vma (result_bfd, s); + if (lma_p) + lma = bfd_section_lma (result_bfd, s); + else + lma = bfd_section_vma (result_bfd, s); if (verbose_p) { - xprintf (callback, "Loading section %s, size 0x%lx lma ", + xprintf (callback, "Loading section %s, size 0x%lx %s ", bfd_get_section_name (result_bfd, s), - (unsigned long) size); + (unsigned long) size, + (lma_p ? "lma" : "vma")); xprintf_bfd_vma (callback, lma); xprintf (callback, "\n"); } data_count += size; bfd_get_section_contents (result_bfd, s, buffer, 0, size); - sim_write (sd, lma, buffer, size); + do_write (sd, lma, buffer, size); + found_loadable_section = 1; free (buffer); } } } + if (!found_loadable_section) + { + eprintf (callback, + "%s: no loadable sections \"%s\"\n", + myname, prog); + return NULL; + } + if (verbose_p) { end_time = time (NULL); @@ -140,6 +166,8 @@ sim_load_file (sd, myname, callback, prog, prog_bfd, verbose_p) report_transfer_performance (callback, data_count, start_time, end_time); } + bfd_cache_close (result_bfd); + return result_bfd; }