diff options
| author | Doug Evans <dje@google.com> | 1998-06-11 07:55:29 +0000 |
|---|---|---|
| committer | Doug Evans <dje@google.com> | 1998-06-11 07:55:29 +0000 |
| commit | 169c74762ae9e90d561087e2dee74b4707997740 (patch) | |
| tree | d38f025a7dd79166b0ed5f55f357b1b7a9d5e5be /sim/common/sim-core.c | |
| parent | a28ad776add8f5d13ee650bdfcb47bd35496b4f1 (diff) | |
| download | ppe42-binutils-169c74762ae9e90d561087e2dee74b4707997740.tar.gz ppe42-binutils-169c74762ae9e90d561087e2dee74b4707997740.zip | |
* sim-core.h (SIM_CORE_SIGNAL_FN): New typedef.
* sim-core.c (sim_core_signal): Make extern, always define.
Diffstat (limited to 'sim/common/sim-core.c')
| -rw-r--r-- | sim/common/sim-core.c | 285 |
1 files changed, 155 insertions, 130 deletions
diff --git a/sim/common/sim-core.c b/sim/common/sim-core.c index f583c8e5ab..5af37b90c1 100644 --- a/sim/common/sim-core.c +++ b/sim/common/sim-core.c @@ -19,12 +19,16 @@ */ -#ifndef _SIM_CORE_C_ -#define _SIM_CORE_C_ +#ifndef SIM_CORE_C +#define SIM_CORE_C #include "sim-main.h" #include "sim-assert.h" +#if (WITH_HW) +#include "sim-hw.h" +#endif + /* "core" module install handler. This is called via sim_module_install to install the "core" subsystem @@ -62,9 +66,9 @@ STATIC_SIM_CORE\ sim_core_uninstall (SIM_DESC sd) { sim_core *core = STATE_CORE(sd); - sim_core_maps map; + unsigned map; /* blow away any mappings */ - for (map = 0; map < nr_sim_core_maps; map++) { + for (map = 0; map < nr_maps; map++) { sim_core_mapping *curr = core->common.map[map].first; while (curr != NULL) { sim_core_mapping *tbd = curr; @@ -93,13 +97,14 @@ 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)) +#endif -STATIC_SIM_CORE\ +EXTERN_SIM_CORE\ (void) sim_core_signal (SIM_DESC sd, sim_cpu *cpu, sim_cia cia, - sim_core_maps map, + unsigned map, int nr_bytes, address_word addr, transfer_type transfer, @@ -124,21 +129,6 @@ sim_core_signal (SIM_DESC sd, "sim_core_signal - internal error - bad switch"); } } -#endif - - -EXTERN_SIM_CORE\ -(const char *) -sim_core_map_to_str (sim_core_maps map) -{ - switch (map) - { - case sim_core_read_map: return "read"; - case sim_core_write_map: return "write"; - case sim_core_execute_map: return "exec"; - default: return "(invalid-map)"; - } -} STATIC_SIM_CORE\ @@ -149,7 +139,11 @@ new_sim_core_mapping (SIM_DESC sd, address_word addr, address_word nr_bytes, unsigned modulo, +#if WITH_HW + struct hw *device, +#else device *device, +#endif void *buffer, void *free_buffer) { @@ -180,7 +174,11 @@ sim_core_map_attach (SIM_DESC sd, address_word addr, address_word nr_bytes, unsigned modulo, +#if WITH_HW + struct hw *client, /*callback/default*/ +#else device *client, /*callback/default*/ +#endif void *buffer, /*raw_memory*/ void *free_buffer) /*raw_memory*/ { @@ -197,9 +195,11 @@ sim_core_map_attach (SIM_DESC sd, { #if (WITH_DEVICES) device_error(client, "called on sim_core_map_attach with size zero"); -#else - sim_io_error (sd, "called on sim_core_map_attach with size zero"); #endif +#if (WITH_HW) + sim_hw_abort (sd, client, "called on sim_core_map_attach with size zero"); +#endif + sim_io_error (sd, "called on sim_core_map_attach with size zero"); } /* find the insertion point (between last/next) */ @@ -232,8 +232,9 @@ sim_core_map_attach (SIM_DESC sd, (long) next_mapping->base, (long) next_mapping->bound, (long) next_mapping->nr_bytes); -#else - sim_io_error (sd, "memory map %d:0x%lx..0x%lx (%ld bytes) overlaps %d:0x%lx..0x%lx (%ld bytes)", +#endif +#if WITH_HW + sim_hw_abort (sd, client, "memory map %d:0x%lx..0x%lx (%ld bytes) overlaps %d:0x%lx..0x%lx (%ld bytes)", space, (long) addr, (long) nr_bytes, @@ -243,6 +244,15 @@ sim_core_map_attach (SIM_DESC sd, (long) next_mapping->bound, (long) next_mapping->nr_bytes); #endif + sim_io_error (sd, "memory map %d:0x%lx..0x%lx (%ld bytes) overlaps %d:0x%lx..0x%lx (%ld bytes)", + space, + (long) addr, + (long) nr_bytes, + (long) (addr + (nr_bytes - 1)), + next_mapping->space, + (long) next_mapping->base, + (long) next_mapping->bound, + (long) next_mapping->nr_bytes); } /* create/insert the new mapping */ @@ -261,16 +271,20 @@ EXTERN_SIM_CORE\ sim_core_attach (SIM_DESC sd, sim_cpu *cpu, int level, - access_type access, + unsigned mapmask, int space, address_word addr, address_word nr_bytes, unsigned modulo, +#if WITH_HW + struct hw *client, +#else device *client, +#endif void *optional_buffer) { sim_core *memory = STATE_CORE(sd); - sim_core_maps map; + unsigned map; void *buffer; void *free_buffer; @@ -278,32 +292,26 @@ sim_core_attach (SIM_DESC sd, if (cpu != NULL) sim_io_error (sd, "sim_core_map_attach - processor specific memory map not yet supported"); - if ((access & access_read_write_exec) == 0 - || (access & ~access_read_write_exec) != 0) - { -#if (WITH_DEVICES) - device_error(client, "invalid access for core attach"); -#else - sim_io_error (sd, "invalid access for core attach"); -#endif - } - /* verify modulo memory */ if (!WITH_MODULO_MEMORY && modulo != 0) { #if (WITH_DEVICES) device_error (client, "sim_core_attach - internal error - modulo memory disabled"); -#else - sim_io_error (sd, "sim_core_attach - internal error - modulo memory disabled"); #endif +#if (WITH_HW) + sim_hw_abort (sd, client, "sim_core_attach - internal error - modulo memory disabled"); +#endif + sim_io_error (sd, "sim_core_attach - internal error - modulo memory disabled"); } if (client != NULL && modulo != 0) { #if (WITH_DEVICES) device_error (client, "sim_core_attach - internal error - modulo and callback memory conflict"); -#else - sim_io_error (sd, "sim_core_attach - internal error - modulo and callback memory conflict"); #endif +#if (WITH_HW) + sim_hw_abort (sd, client, "sim_core_attach - internal error - modulo and callback memory conflict"); +#endif + sim_io_error (sd, "sim_core_attach - internal error - modulo and callback memory conflict"); } if (modulo != 0) { @@ -320,9 +328,11 @@ sim_core_attach (SIM_DESC sd, { #if (WITH_DEVICES) device_error (client, "sim_core_attach - internal error - modulo %lx not power of two", (long) modulo); -#else - sim_io_error (sd, "sim_core_attach - internal error - modulo %lx not power of two", (long) modulo); #endif +#if (WITH_HW) + sim_hw_abort (sd, client, "sim_core_attach - internal error - modulo %lx not power of two", (long) modulo); +#endif + sim_io_error (sd, "sim_core_attach - internal error - modulo %lx not power of two", (long) modulo); } } @@ -331,9 +341,11 @@ sim_core_attach (SIM_DESC sd, { #if (WITH_DEVICES) device_error (client, "sim_core_attach - internal error - conflicting buffer and attach arguments"); -#else - sim_io_error (sd, "sim_core_attach - internal error - conflicting buffer and attach arguments"); #endif +#if (WITH_HW) + sim_hw_abort (sd, client, "sim_core_attach - internal error - conflicting buffer and attach arguments"); +#endif + sim_io_error (sd, "sim_core_attach - internal error - conflicting buffer and attach arguments"); } if (client == NULL) { @@ -359,35 +371,15 @@ sim_core_attach (SIM_DESC sd, /* attach the region to all applicable access maps */ for (map = 0; - map < nr_sim_core_maps; + map < nr_maps; map++) { - switch (map) + if (mapmask & (1 << map)) { - case sim_core_read_map: - if (access & access_read) - sim_core_map_attach (sd, &memory->common.map[map], - level, space, addr, nr_bytes, modulo, - client, buffer, free_buffer); + sim_core_map_attach (sd, &memory->common.map[map], + level, space, addr, nr_bytes, modulo, + client, buffer, free_buffer); free_buffer = NULL; - break; - case sim_core_write_map: - if (access & access_write) - sim_core_map_attach (sd, &memory->common.map[map], - level, space, addr, nr_bytes, modulo, - client, buffer, free_buffer); - free_buffer = NULL; - break; - case sim_core_execute_map: - if (access & access_exec) - sim_core_map_attach (sd, &memory->common.map[map], - level, space, addr, nr_bytes, modulo, - client, buffer, free_buffer); - free_buffer = NULL; - break; - default: - sim_io_error (sd, "sim_core_attach - internal error - bad switch"); - break; } } @@ -441,8 +433,8 @@ sim_core_detach (SIM_DESC sd, address_word addr) { sim_core *memory = STATE_CORE (sd); - sim_core_maps map; - for (map = 0; map < nr_sim_core_maps; map++) + unsigned map; + for (map = 0; map < nr_maps; map++) { sim_core_map_detach (sd, &memory->common.map[map], level, address_space, addr); @@ -463,7 +455,7 @@ sim_core_detach (SIM_DESC sd, STATIC_INLINE_SIM_CORE\ (sim_core_mapping *) sim_core_find_mapping(sim_core_common *core, - sim_core_maps map, + unsigned map, address_word addr, unsigned nr_bytes, transfer_type transfer, @@ -509,45 +501,61 @@ EXTERN_SIM_CORE\ (unsigned) sim_core_read_buffer (SIM_DESC sd, sim_cpu *cpu, - sim_core_maps map, + unsigned map, void *buffer, address_word addr, unsigned len) { sim_core_common *core = (cpu == NULL ? &STATE_CORE (sd)->common : &CPU_CORE (cpu)->common); unsigned count = 0; - while (count < len) { + while (count < len) + { unsigned_word raddr = addr + count; sim_core_mapping *mapping = - sim_core_find_mapping(core, map, + sim_core_find_mapping (core, map, raddr, /*nr-bytes*/1, read_transfer, 0 /*dont-abort*/, NULL, NULL_CIA); if (mapping == NULL) break; #if (WITH_DEVICES) - if (mapping->device != NULL) { - int nr_bytes = len - count; - if (raddr + nr_bytes - 1> mapping->bound) - nr_bytes = mapping->bound - raddr + 1; - if (device_io_read_buffer(mapping->device, - (unsigned_1*)buffer + count, - mapping->space, - raddr, - nr_bytes, - cpu, - CIA_GET(cpu)) != nr_bytes) - break; - count += nr_bytes; - } - else + if (mapping->device != NULL) + { + int nr_bytes = len - count; + if (raddr + nr_bytes - 1> mapping->bound) + nr_bytes = mapping->bound - raddr + 1; + if (device_io_read_buffer (mapping->device, + (unsigned_1*)buffer + count, + mapping->space, + raddr, + nr_bytes, + cpu, + CIA_GET (cpu)) != nr_bytes) + break; + count += nr_bytes; + continue; + } #endif +#if (WITH_HW) + if (mapping->device != NULL) { - ((unsigned_1*)buffer)[count] = - *(unsigned_1*)sim_core_translate(mapping, raddr); - count += 1; + int nr_bytes = len - count; + if (raddr + nr_bytes - 1> mapping->bound) + nr_bytes = mapping->bound - raddr + 1; + if (sim_hw_io_read_buffer (sd, mapping->device, + (unsigned_1*)buffer + count, + mapping->space, + raddr, + nr_bytes) != nr_bytes) + break; + count += nr_bytes; + continue; } - } +#endif + ((unsigned_1*)buffer)[count] = + *(unsigned_1*)sim_core_translate(mapping, raddr); + count += 1; + } return count; } @@ -556,46 +564,63 @@ EXTERN_SIM_CORE\ (unsigned) sim_core_write_buffer (SIM_DESC sd, sim_cpu *cpu, - sim_core_maps map, + unsigned map, const void *buffer, address_word addr, unsigned len) { sim_core_common *core = (cpu == NULL ? &STATE_CORE (sd)->common : &CPU_CORE (cpu)->common); unsigned count = 0; - while (count < len) { - unsigned_word raddr = addr + count; - sim_core_mapping *mapping = - sim_core_find_mapping(core, map, - raddr, /*nr-bytes*/1, - write_transfer, - 0 /*dont-abort*/, NULL, NULL_CIA); - if (mapping == NULL) - break; -#if (WITH_DEVICES) - if (WITH_CALLBACK_MEMORY - && mapping->device != NULL) { - int nr_bytes = len - count; - if (raddr + nr_bytes - 1 > mapping->bound) - nr_bytes = mapping->bound - raddr + 1; - if (device_io_write_buffer(mapping->device, - (unsigned_1*)buffer + count, - mapping->space, - raddr, - nr_bytes, - cpu, - CIA_GET(cpu)) != nr_bytes) + while (count < len) + { + unsigned_word raddr = addr + count; + sim_core_mapping *mapping = + sim_core_find_mapping (core, map, + raddr, /*nr-bytes*/1, + write_transfer, + 0 /*dont-abort*/, NULL, NULL_CIA); + if (mapping == NULL) break; - count += nr_bytes; - } - else +#if (WITH_DEVICES) + if (WITH_CALLBACK_MEMORY + && mapping->device != NULL) + { + int nr_bytes = len - count; + if (raddr + nr_bytes - 1 > mapping->bound) + nr_bytes = mapping->bound - raddr + 1; + if (device_io_write_buffer (mapping->device, + (unsigned_1*)buffer + count, + mapping->space, + raddr, + nr_bytes, + cpu, + CIA_GET(cpu)) != nr_bytes) + break; + count += nr_bytes; + continue; + } #endif - { - *(unsigned_1*)sim_core_translate(mapping, raddr) = - ((unsigned_1*)buffer)[count]; - count += 1; - } - } +#if (WITH_HW) + if (WITH_CALLBACK_MEMORY + && mapping->device != NULL) + { + int nr_bytes = len - count; + if (raddr + nr_bytes - 1 > mapping->bound) + nr_bytes = mapping->bound - raddr + 1; + if (sim_hw_io_write_buffer (sd, mapping->device, + (unsigned_1*)buffer + count, + mapping->space, + raddr, + nr_bytes) != nr_bytes) + break; + count += nr_bytes; + continue; + } +#endif + *(unsigned_1*)sim_core_translate(mapping, raddr) = + ((unsigned_1*)buffer)[count]; + count += 1; + } return count; } @@ -637,7 +662,7 @@ sim_core_set_xor (SIM_DESC sd, } else { if (is_xor) - sim_engine_abort (sd, cpu, NULL_CIA, + sim_engine_abort (sd, NULL, NULL_CIA, "Attempted to enable xor-endian mode when permenantly disabled."); } } @@ -660,7 +685,7 @@ EXTERN_SIM_CORE\ (unsigned) sim_core_xor_read_buffer (SIM_DESC sd, sim_cpu *cpu, - sim_core_maps map, + unsigned map, void *buffer, address_word addr, unsigned nr_bytes) @@ -711,7 +736,7 @@ EXTERN_SIM_CORE\ (unsigned) sim_core_xor_write_buffer (SIM_DESC sd, sim_cpu *cpu, - sim_core_maps map, + unsigned map, const void *buffer, address_word addr, unsigned nr_bytes) |

