aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/m68hc11/ChangeLog6
-rw-r--r--sim/m68hc11/interp.c25
2 files changed, 30 insertions, 1 deletions
diff --git a/sim/m68hc11/ChangeLog b/sim/m68hc11/ChangeLog
index d6c3863..fc85e60 100644
--- a/sim/m68hc11/ChangeLog
+++ b/sim/m68hc11/ChangeLog
@@ -1,5 +1,11 @@
2002-08-13 Marko Kohtala <marko.kohtala@luukku.com>
+ * interp.c (sim_prepare_for_program): Look up the image for the
+ reset vector and set cpu_use_elf_start to 1 if not found.
+ (sim_open): Do not set cpu_use_elf_start.
+
+2002-08-13 Marko Kohtala <marko.kohtala@luukku.com>
+
* interp.c (sim_hw_configure): Return 1 for success.
(sim_prepare_for_program): Use the sim_hw_configure exit code to
return SIM_RC_FAIL.
diff --git a/sim/m68hc11/interp.c b/sim/m68hc11/interp.c
index 8889da6..74674ce 100644
--- a/sim/m68hc11/interp.c
+++ b/sim/m68hc11/interp.c
@@ -306,7 +306,31 @@ sim_prepare_for_program (SIM_DESC sd, struct _bfd* abfd)
if (abfd != NULL)
{
+ asection *s;
cpu->cpu_elf_start = bfd_get_start_address (abfd);
+ /* See if any section sets the reset address */
+ cpu->cpu_use_elf_start = 1;
+ for (s = abfd->sections; s && cpu->cpu_use_elf_start; s = s->next)
+ {
+ if (s->flags & SEC_LOAD)
+ {
+ bfd_size_type size;
+
+ size = bfd_get_section_size_before_reloc (s);
+ if (size > 0)
+ {
+ bfd_vma lma;
+
+ if (STATE_LOAD_AT_LMA_P (sd))
+ lma = bfd_section_lma (abfd, s);
+ else
+ lma = bfd_section_vma (abfd, s);
+
+ if (lma <= 0xFFFE && lma+size >= 0x10000)
+ cpu->cpu_use_elf_start = 0;
+ }
+ }
+ }
}
/* reset all state information */
@@ -333,7 +357,6 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback,
cpu_initialize (sd, cpu);
- cpu->cpu_use_elf_start = 1;
if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
{
free_state (sd);