aboutsummaryrefslogtreecommitdiff
path: root/sim/common/sim-core.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>1997-05-21 06:54:13 +0000
committerAndrew Cagney <cagney@redhat.com>1997-05-21 06:54:13 +0000
commit50a2a691824992f474b19bf40bbff016b2f67150 (patch)
tree00df34e93ad0cb95e742316790b57f1ced5d7bb8 /sim/common/sim-core.c
parent003c91bec4849e4a5b54d6e81383a4ff4376e996 (diff)
downloadbinutils-50a2a691824992f474b19bf40bbff016b2f67150.zip
binutils-50a2a691824992f474b19bf40bbff016b2f67150.tar.gz
binutils-50a2a691824992f474b19bf40bbff016b2f67150.tar.bz2
Watchpoint interface.
Diffstat (limited to 'sim/common/sim-core.c')
-rw-r--r--sim/common/sim-core.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/sim/common/sim-core.c b/sim/common/sim-core.c
index e9102cf..3b9786c 100644
--- a/sim/common/sim-core.c
+++ b/sim/common/sim-core.c
@@ -34,6 +34,7 @@ EXTERN_SIM_CORE\
(SIM_RC)
sim_core_install (SIM_DESC sd)
{
+ SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
sim_module_add_uninstall_fn (sd, sim_core_uninstall);
sim_module_add_init_fn (sd, sim_core_init);
return SIM_RC_OK;
@@ -77,6 +78,40 @@ sim_core_init (SIM_DESC sd)
+#ifndef SIM_CORE_SIGNAL
+#define SIM_CORE_SIGNAL(SD,CPU,CIA,MAP,NR_BYTES,ADDR,TRANSFER,ERROR) \
+sim_core_signal ((SD), (CPU), (CIA), (MAP), (NR_BYTES), (ADDR), (TRANSFER), (ERROR))
+
+static void
+sim_core_signal (SIM_DESC sd,
+ sim_cpu *cpu,
+ sim_cia cia,
+ sim_core_maps map,
+ int nr_bytes,
+ address_word addr,
+ transfer_type transfer,
+ sim_core_signals sig)
+{
+ const char *copy = (transfer == read_transfer ? "read" : "write");
+ switch (sig)
+ {
+ case sim_core_unmapped_signal:
+ sim_engine_abort (sd, cpu, cia, "sim-core: %d byte %s to unmaped address 0x%lx",
+ nr_bytes, copy, (unsigned long) addr);
+ break;
+ case sim_core_unaligned_signal:
+ sim_engine_abort (sd, cpu, cia, "sim-core: %d byte misaligned %s to address 0x%lx",
+ nr_bytes, copy, (unsigned long) addr);
+ break;
+ default:
+ sim_engine_abort (sd, cpu, cia, "sim_core_signal - internal error - bad switch");
+ }
+}
+
+
+
+#endif
+
STATIC_INLINE_SIM_CORE\
(const char *)
sim_core_map_to_str (sim_core_maps map)
@@ -94,13 +129,13 @@ sim_core_map_to_str (sim_core_maps map)
STATIC_INLINE_SIM_CORE\
(sim_core_mapping *)
new_sim_core_mapping(SIM_DESC sd,
- attach_type attach,
- int space,
- unsigned_word addr,
- unsigned nr_bytes,
- device *device,
- void *buffer,
- int free_buffer)
+ attach_type attach,
+ int space,
+ unsigned_word addr,
+ unsigned nr_bytes,
+ device *device,
+ void *buffer,
+ int free_buffer)
{
sim_core_mapping *new_mapping = ZALLOC(sim_core_mapping);
/* common */
@@ -292,6 +327,7 @@ sim_core_find_mapping(sim_core *core,
sim_core_maps map,
unsigned_word addr,
unsigned nr_bytes,
+ transfer_type transfer,
int abort, /*either 0 or 1 - hint to inline/-O */
sim_cpu *cpu, /* abort => cpu != NULL */
sim_cia cia)
@@ -309,12 +345,8 @@ sim_core_find_mapping(sim_core *core,
}
if (abort)
{
- if (cpu == NULL)
- sim_io_error (NULL, "sim_core_find_map - internal error - can not abort without a processor");
- else
- engine_error (CPU_STATE (cpu), cpu, cia,
- "access to unmaped address 0x%lx (%d bytes)\n",
- (unsigned long) addr, nr_bytes);
+ SIM_CORE_SIGNAL (CPU_STATE (cpu), cpu, cia, map, nr_bytes, addr, transfer,
+ sim_core_unmapped_signal);
}
return NULL;
}
@@ -342,7 +374,8 @@ sim_core_read_buffer(SIM_DESC sd,
unsigned_word raddr = addr + count;
sim_core_mapping *mapping =
sim_core_find_mapping(STATE_CORE (sd), map,
- raddr, 1,
+ raddr, /*nr-bytes*/1,
+ read_transfer,
0, NULL, NULL_CIA); /*dont-abort*/
if (mapping == NULL)
break;
@@ -383,7 +416,8 @@ sim_core_write_buffer(SIM_DESC sd,
while (count < len) {
unsigned_word raddr = addr + count;
sim_core_mapping *mapping = sim_core_find_mapping(STATE_CORE (sd), map,
- raddr, 1,
+ raddr, /*nr-bytes*/1,
+ write_transfer,
0, NULL, NULL_CIA); /*dont-abort*/
if (mapping == NULL)
break;