From 581bf2caf18f6f55be94d6c5451da7c0c7fbbf1b Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Mon, 26 Apr 1999 18:30:24 +0000 Subject: import gdb-19990422 snapshot --- sim/common/ChangeLog | 53 +++++++++++++++++ sim/common/cgen-ops.h | 148 ++++++++++++++++++++++++++++++++++++++++-------- sim/common/cgen-run.c | 8 ++- sim/common/cgen-trace.c | 8 +-- sim/common/cgen-types.h | 8 +-- sim/common/cgen-utils.c | 18 ++---- sim/common/nrun.c | 6 -- sim/common/run.c | 6 +- sim/common/sim-core.c | 15 ++--- sim/common/sim-core.h | 9 +++ sim/common/sim-events.c | 21 ------- sim/common/sim-io.c | 16 +++++- sim/common/sim-memopt.c | 7 ++- sim/common/sim-model.h | 3 + sim/common/sim-n-core.h | 4 +- 15 files changed, 240 insertions(+), 90 deletions(-) (limited to 'sim/common') diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index bde07108db9..ed3c6016c6d 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,3 +1,56 @@ +Fri Apr 16 16:43:22 1999 Doug Evans + + * sim-core.c (device_error,device_io_read_buffer, + device_io_write_buffer): Delete decls. + * sim-core.h: Put them here. + + * sim-core.c (sim_core_read_buffer): Pass sd to device_io_read_buffer. + (sim_core_write_buffer): Pass sd to device_io_write_buffer. + * sim-n-core.h (sim_core_read_aligned_N): Ditto. + (sim_core_write_aligned_N): Ditto. + +1999-04-14 Stephane Carrez + + * sim-memopt.c (sim_memory_uninstall): Don't look into + free()d memory. + +1999-04-14 Doug Evans + + * cgen-utils.scm (virtual_insn_entries): Update attribute definition. + +1999-04-13 Doug Evans + + * sim-core.c (sim_core_read_buffer): Handle NULL cpu when WITH_DEVICES. + (sim_core_write_buffer): Ditto. + +1999-04-02 Keith Seitz + + * sim-io.c (sim_io_poll_quit): Only call the poll_quit callback + after the interval counter has expired. + (POLL_QUIT_INTERVAL): Define. Used to tweak the frequency of + poll_quit callbacks. May be overridden by Makefile. + (poll_quit_counter): New global. + * sim-events.c: Remove all mentions of ui_loop_hook. The + host callback "poll_quit" will serve the purpose. + * run.c: Add definition of ui_loop_hook when NEED_UI_LOOP_HOOK + is defined. + * nrun.c: Remove declaration of ui_loop_hook. + +Wed Mar 31 18:55:41 1999 Doug Evans + + * cgen-run.c (sim_resume): Don't tell main loop to run "forever" + if being used by gdb. + +1999-03-22 Doug Evans + + * cgen-types.h (XF,TF): Tweak. + * cgen-ops.h: Redo inline support. Delete DI_FN_SUPPORT, + in cgen-types.h. + (SUBWORD*,JOIN*): Define. + * cgen-trace.c (sim_cgen_disassemble_insn): Update, base_insn_bitsize + moved into cpu descriptor. + * sim-model.h (MACH): New member `num'. + 1999-02-09 Doug Evans * Make-common.in (CGEN_READ_SCM): Renamed from CGEN_MAIN_SCM. diff --git a/sim/common/cgen-ops.h b/sim/common/cgen-ops.h index 1ec0e6c2019..6b89859160a 100644 --- a/sim/common/cgen-ops.h +++ b/sim/common/cgen-ops.h @@ -1,5 +1,5 @@ /* Semantics ops support for CGEN-based simulators. - Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. Contributed by Cygnus Solutions. This file is part of the GNU Simulators. @@ -23,6 +23,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef CGEN_SEM_OPS_H #define CGEN_SEM_OPS_H +#if defined (__GNUC__) && ! defined (SEMOPS_DEFINE_INLINE) +#define SEMOPS_DEFINE_INLINE +#define SEMOPS_INLINE extern inline +#else +#define SEMOPS_INLINE +#endif + /* Semantic operations. At one point this file was machine generated. Maybe it will be again. */ @@ -357,6 +364,7 @@ extern DI EXTSIDI PARAMS ((SI)); #else #define EXTSIDI(x) ((DI) (SI) (x)) #endif + #if defined (SF_FN_SUPPORT) || defined (DF_FN_SUPPORT) extern DF EXTSFDF PARAMS ((SF)); #else @@ -387,6 +395,7 @@ extern TF EXTXFTF PARAMS ((XF)); #else #define EXTXFTF(x) ((TF) (XF) (x)) #endif + #define ZEXTBIQI(x) ((QI) (BI) (x)) #define ZEXTBIHI(x) ((HI) (BI) (x)) #define ZEXTBISI(x) ((SI) (BI) (x)) @@ -413,6 +422,7 @@ extern DI ZEXTSIDI PARAMS ((SI)); #else #define ZEXTSIDI(x) ((DI) (USI) (x)) #endif + #define TRUNCQIBI(x) ((BI) (QI) (x)) #define TRUNCHIBI(x) ((BI) (HI) (x)) #define TRUNCHIQI(x) ((QI) (HI) (x)) @@ -439,6 +449,7 @@ extern SI TRUNCDISI PARAMS ((DI)); #else #define TRUNCDISI(x) ((SI) (DI) (x)) #endif + #if defined (DF_FN_SUPPORT) || defined (SF_FN_SUPPORT) extern SF TRUNCDFSF PARAMS ((DF)); #else @@ -469,6 +480,7 @@ extern XF TRUNCTFXF PARAMS ((TF)); #else #define TRUNCTFXF(x) ((XF) (TF) (x)) #endif + #if defined (SF_FN_SUPPORT) extern SF FLOATQISF PARAMS ((QI)); #else @@ -549,6 +561,7 @@ extern TF FLOATDITF PARAMS ((DI)); #else #define FLOATDITF(x) ((TF) (DI) (x)) #endif + #if defined (SF_FN_SUPPORT) extern SF UFLOATQISF PARAMS ((QI)); #else @@ -629,6 +642,7 @@ extern TF UFLOATDITF PARAMS ((DI)); #else #define UFLOATDITF(x) ((TF) (UDI) (x)) #endif + #if defined (SF_FN_SUPPORT) extern BI FIXSFBI PARAMS ((SF)); #else @@ -729,6 +743,7 @@ extern DI FIXTFDI PARAMS ((TF)); #else #define FIXTFDI(x) ((DI) (TF) (x)) #endif + #if defined (SF_FN_SUPPORT) extern QI UFIXSFQI PARAMS ((SF)); #else @@ -810,15 +825,118 @@ extern DI UFIXTFDI PARAMS ((TF)); #define UFIXTFDI(x) ((UDI) (TF) (x)) #endif -/* Semantic support utilities. */ - -#ifdef __GNUC__ +/* Composing/decomposing the various types. */ #ifdef SEMOPS_DEFINE_INLINE -#define SEMOPS_INLINE + +SEMOPS_INLINE SF +SUBWORDSISF (SIM_CPU *cpu, SI in) +{ + union { SI in; SF out; } x; + x.in = in; + return x.out; +} + +SEMOPS_INLINE SI +SUBWORDSFSI (SIM_CPU *cpu, SF in) +{ + union { SF in; SI out; } x; + x.in = in; + return x.out; +} + +SEMOPS_INLINE SI +SUBWORDDISI (SIM_CPU *cpu, DI in, int word) +{ + /* ??? endianness issues undecided */ + if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) + { + if (word == 0) + return (UDI) in >> 32; + else + return in; + } + else + { + if (word == 1) + return (UDI) in >> 32; + else + return in; + } +} + +SEMOPS_INLINE SI +SUBWORDDFSI (SIM_CPU *cpu, DF in, int word) +{ + /* ??? endianness issues undecided */ + union { DF in; SI out[2]; } x; + x.in = in; + if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) + return x.out[word]; + else + return x.out[!word]; +} + +SEMOPS_INLINE SI +SUBWORDTFSI (SIM_CPU *cpu, TF in, int word) +{ + /* ??? endianness issues undecided */ + union { TF in; SI out[4]; } x; + x.in = in; + if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) + return x.out[word]; + else + return x.out[word ^ 3]; +} + +SEMOPS_INLINE DI +JOINSIDI (SIM_CPU *cpu, SI x0, SI x1) +{ + if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) + return MAKEDI (x0, x1); + else + return MAKEDI (x1, x0); +} + +SEMOPS_INLINE DF +JOINSIDF (SIM_CPU *cpu, SI x0, SI x1) +{ + union { SI in[2]; DF out; } x; + if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) + x.in[0] = x0, x.in[1] = x1; + else + x.in[1] = x0, x.in[0] = x1; + return x.out; +} + +SEMOPS_INLINE TF +JOINSITF (SIM_CPU *cpu, SI x0, SI x1, SI x2, SI x3) +{ + union { SI in[4]; TF out; } x; + if (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN) + x.in[0] = x0, x.in[1] = x1, x.in[2] = x2, x.in[3] = x3; + else + x.in[3] = x0, x.in[2] = x1, x.in[1] = x2, x.in[0] = x3; + return x.out; +} + #else -#define SEMOPS_INLINE extern inline -#endif + +SF SUBWORDSISF (SIM_CPU *, SI); +SI SUBWORDSFSI (SIM_CPU *, SF); +SI SUBWORDDISI (SIM_CPU *, DI, int); +SI SUBWORDDFSI (SIM_CPU *, DF, int); +SI SUBWORDTFSI (SIM_CPU *, TF, int); + +DI JOINSIDI (SIM_CPU *, SI, SI); +DF JOINSIDF (SIM_CPU *, SI, SI); +TF JOINSITF (SIM_CPU *, SI, SI, SI, SI); + +#endif /* SUBWORD,JOIN */ + +/* Semantic support utilities. */ + +#ifdef SEMOPS_DEFINE_INLINE SEMOPS_INLINE SI ADDCSI (SI a, SI b, BI c) @@ -877,21 +995,5 @@ UBI SUBCFSI (SI, SI, BI); UBI SUBOFSI (SI, SI, BI); #endif - -/* DI mode support if "long long" doesn't exist. - At one point CGEN supported K&R C compilers, and ANSI C compilers without - "long long". One can argue the various merits of keeping this in or - throwing it out. I went to the trouble of adding it so for the time being - I'm leaving it in. */ - -#ifdef DI_FN_SUPPORT - -DI make_struct_di (SI, SI); -/* FIXME: needed? */ -DI CONVHIDI (HI); -DI CONVSIDI (SI); -SI CONVDISI (DI); - -#endif /* DI_FN_SUPPORT */ #endif /* CGEN_SEM_OPS_H */ diff --git a/sim/common/cgen-run.c b/sim/common/cgen-run.c index 07ee19197d7..031bc1c69ea 100644 --- a/sim/common/cgen-run.c +++ b/sim/common/cgen-run.c @@ -93,9 +93,13 @@ sim_resume (SIM_DESC sd, int step, int siggnal) way to identify this case. */ int max_insns = (step ? 1 - : (nr_cpus == 1 /*&& wip:no-events*/) + : (nr_cpus == 1 + /*&& wip:no-events*/ + /* Don't do this if running under gdb, need to + poll ui for events. */ + && STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE) ? 0 - : 4); /*FIXME: magic number*/ + : 8); /*FIXME: magic number*/ int fast_p = STATE_RUN_FAST_P (sd); sim_events_preprocess (sd, last_cpu_nr >= nr_cpus, next_cpu_nr >= nr_cpus); diff --git a/sim/common/cgen-trace.c b/sim/common/cgen-trace.c index 9b7d1faf5d4..db852d5306c 100644 --- a/sim/common/cgen-trace.c +++ b/sim/common/cgen-trace.c @@ -380,12 +380,12 @@ sim_cgen_disassemble_insn (SIM_CPU *cpu, const CGEN_INSN *insn, length = sim_core_read_buffer (sd, cpu, read_map, &insn_buf, pc, insn_length); - switch (min (CGEN_BASE_INSN_SIZE, insn_length)) + switch (min (cd->base_insn_bitsize, insn_bit_length)) { case 0 : return; /* fake insn, typically "compile" (aka "invalid") */ - case 1 : insn_value = insn_buf.bytes[0]; break; - case 2 : insn_value = T2H_2 (insn_buf.shorts[0]); break; - case 4 : insn_value = T2H_4 (insn_buf.words[0]); break; + case 8 : insn_value = insn_buf.bytes[0]; break; + case 16 : insn_value = T2H_2 (insn_buf.shorts[0]); break; + case 32 : insn_value = T2H_4 (insn_buf.words[0]); break; default: abort (); } diff --git a/sim/common/cgen-types.h b/sim/common/cgen-types.h index e57e601ef55..28c7205ad60 100644 --- a/sim/common/cgen-types.h +++ b/sim/common/cgen-types.h @@ -100,10 +100,10 @@ extern DI make_struct_di (SI, SI); /* FIXME: Need to provide libraries if these aren't appropriate for target, or user's needs. */ -typedef float SF; -typedef double DF; -typedef double XF; /* FIXME: configure, provide library */ -typedef double TF; /* FIXME: configure, provide library */ +typedef float SF; /* FIXME: struct */ +typedef double DF; /* FIXME: struct */ +typedef struct { SI parts[3]; } XF; /* FIXME: configure, provide library */ +typedef struct { SI parts[4]; } TF; /* FIXME: configure, provide library */ /* These are used to record extracted raw data from an instruction, among other things. It must be a host data type, and not a target one. */ diff --git a/sim/common/cgen-utils.c b/sim/common/cgen-utils.c index 2faff5c2948..b1c9f02eb7e 100644 --- a/sim/common/cgen-utils.c +++ b/sim/common/cgen-utils.c @@ -59,28 +59,22 @@ const char *mode_names[] = { static const CGEN_IBASE virtual_insn_entries[] = { { - VIRTUAL_INSN_X_INVALID, "--invalid--", NULL, 0, - { CGEN_INSN_NBOOL_ATTRS, V, { 0 } } + VIRTUAL_INSN_X_INVALID, "--invalid--", NULL, 0, { V, { 0 } } }, { - VIRTUAL_INSN_X_BEFORE, "--before--", NULL, 0, - { CGEN_INSN_NBOOL_ATTRS, V, { 0 } } + VIRTUAL_INSN_X_BEFORE, "--before--", NULL, 0, { V, { 0 } } }, { - VIRTUAL_INSN_X_AFTER, "--after--", NULL, 0, - { CGEN_INSN_NBOOL_ATTRS, V, { 0 } } + VIRTUAL_INSN_X_AFTER, "--after--", NULL, 0, { V, { 0 } } }, { - VIRTUAL_INSN_X_BEGIN, "--begin--", NULL, 0, - { CGEN_INSN_NBOOL_ATTRS, V, { 0 } } + VIRTUAL_INSN_X_BEGIN, "--begin--", NULL, 0, { V, { 0 } } }, { - VIRTUAL_INSN_X_CHAIN, "--chain--", NULL, 0, - { CGEN_INSN_NBOOL_ATTRS, V, { 0 } } + VIRTUAL_INSN_X_CHAIN, "--chain--", NULL, 0, { V, { 0 } } }, { - VIRTUAL_INSN_X_CTI_CHAIN, "--cti-chain--", NULL, 0, - { CGEN_INSN_NBOOL_ATTRS, V, { 0 } } + VIRTUAL_INSN_X_CTI_CHAIN, "--cti-chain--", NULL, 0, { V, { 0 } } } }; diff --git a/sim/common/nrun.c b/sim/common/nrun.c index 42be33ef655..2f13b1f91bb 100644 --- a/sim/common/nrun.c +++ b/sim/common/nrun.c @@ -206,9 +206,3 @@ usage () fprintf (stderr, "Run `%s --help' for full list of options.\n", myname); exit (1); } - - -#ifdef __CYGWIN32__ -/* no-op GUI update hook for standalone sim */ -void (*ui_loop_hook) PARAMS ((int)) = NULL; -#endif diff --git a/sim/common/run.c b/sim/common/run.c index 2a701bc4900..72d7509d721 100644 --- a/sim/common/run.c +++ b/sim/common/run.c @@ -56,12 +56,16 @@ extern host_callback default_callback; static char *myname; - /* NOTE: sim_size() and sim_trace() are going away */ extern int sim_trace PARAMS ((SIM_DESC sd)); extern int getopt (); +#ifdef NEED_UI_LOOP_HOOK +/* Gdb foolery. This is only needed for gdb using a gui. */ +int (*ui_loop_hook) PARAMS ((int signo)); +#endif + static SIM_DESC sd; static RETSIGTYPE diff --git a/sim/common/sim-core.c b/sim/common/sim-core.c index 36627a20350..f7579c40a98 100644 --- a/sim/common/sim-core.c +++ b/sim/common/sim-core.c @@ -29,13 +29,6 @@ #include "sim-hw.h" #endif -#if (WITH_DEVICES) -/* TODO: create sim/common/device.h */ -void device_error (device *me, char* message, ...); -int device_io_read_buffer(device *me, void *dest, int space, address_word addr, unsigned nr_bytes, sim_cpu *processor, sim_cia cia); -int device_io_write_buffer(device *me, const void *source, int space, address_word addr, unsigned nr_bytes, sim_cpu *processor, sim_cia cia); -#endif - /* "core" module install handler. This is called via sim_module_install to install the "core" @@ -534,6 +527,7 @@ sim_core_read_buffer (SIM_DESC sd, if (mapping->device != NULL) { int nr_bytes = len - count; + sim_cia cia = cpu ? CIA_GET (cpu) : NULL_CIA; if (raddr + nr_bytes - 1> mapping->bound) nr_bytes = mapping->bound - raddr + 1; if (device_io_read_buffer (mapping->device, @@ -541,8 +535,9 @@ sim_core_read_buffer (SIM_DESC sd, mapping->space, raddr, nr_bytes, + sd, cpu, - CIA_GET (cpu)) != nr_bytes) + cia) != nr_bytes) break; count += nr_bytes; continue; @@ -599,6 +594,7 @@ sim_core_write_buffer (SIM_DESC sd, && mapping->device != NULL) { int nr_bytes = len - count; + sim_cia cia = cpu ? CIA_GET (cpu) : NULL_CIA; if (raddr + nr_bytes - 1 > mapping->bound) nr_bytes = mapping->bound - raddr + 1; if (device_io_write_buffer (mapping->device, @@ -606,8 +602,9 @@ sim_core_write_buffer (SIM_DESC sd, mapping->space, raddr, nr_bytes, + sd, cpu, - CIA_GET(cpu)) != nr_bytes) + cia) != nr_bytes) break; count += nr_bytes; continue; diff --git a/sim/common/sim-core.h b/sim/common/sim-core.h index 7bf15a3b48d..182569e5aea 100644 --- a/sim/common/sim-core.h +++ b/sim/common/sim-core.h @@ -340,4 +340,13 @@ DECLARE_SIM_CORE_READ_N(misaligned,7,8) #undef DECLARE_SIM_CORE_READ_N +#if (WITH_DEVICES) +/* TODO: create sim/common/device.h */ +/* These are defined with each particular cpu. */ +void device_error (device *me, char* message, ...); +int device_io_read_buffer(device *me, void *dest, int space, address_word addr, unsigned nr_bytes, SIM_DESC sd, sim_cpu *processor, sim_cia cia); +int device_io_write_buffer(device *me, const void *source, int space, address_word addr, unsigned nr_bytes, SIM_DESC sd, sim_cpu *processor, sim_cia cia); +#endif + + #endif diff --git a/sim/common/sim-events.c b/sim/common/sim-events.c index 4b7d9b4b6be..fc211644e85 100644 --- a/sim/common/sim-events.c +++ b/sim/common/sim-events.c @@ -39,15 +39,6 @@ #include /* For SIGPROCMASK et.al. */ -#if __CYGWIN32__ -/* The ui_loop_hook is called to keep the GUI alive while the simulator - is running. The counter is to make sure we do not wake it too often. -*/ - -extern void (*ui_loop_hook) PARAMS ((int)); -static unsigned int ui_loop_hook_counter = 0; -#endif - typedef enum { watch_invalid, @@ -1171,18 +1162,6 @@ sim_events_process (SIM_DESC sd) /* this round of processing complete */ events->nr_ticks_to_process = 0; - -#if __CYGWIN32__ - /* Now call the ui_loop_hook to give the gui a chance to - process events. */ - - if (ui_loop_hook != NULL) - { - /* attempt to limit calls to 1-10 per second */ - if (! (ui_loop_hook_counter++ & 0xf)) - (*ui_loop_hook) (-2); /* magic */ - } -#endif } #endif diff --git a/sim/common/sim-io.c b/sim/common/sim-io.c index f3d2f674a64..26f44451a30 100644 --- a/sim/common/sim-io.c +++ b/sim/common/sim-io.c @@ -33,6 +33,13 @@ #include #endif +/* Define the rate at which the simulator should poll the host + for a quit. */ +#ifndef POLL_QUIT_INTERVAL +#define POLL_QUIT_INTERVAL 0x10 +#endif + +static int poll_quit_count = POLL_QUIT_INTERVAL; /* See the file include/callbacks.h for a description */ @@ -304,9 +311,12 @@ sim_io_error(SIM_DESC sd, void sim_io_poll_quit(SIM_DESC sd) { - if (STATE_CALLBACK (sd)->poll_quit != NULL) - if (STATE_CALLBACK (sd)->poll_quit (STATE_CALLBACK (sd))) - sim_stop (sd); + if (STATE_CALLBACK (sd)->poll_quit != NULL && poll_quit_count-- < 0) + { + poll_quit_count = POLL_QUIT_INTERVAL; + if (STATE_CALLBACK (sd)->poll_quit (STATE_CALLBACK (sd))) + sim_stop (sd); + } } diff --git a/sim/common/sim-memopt.c b/sim/common/sim-memopt.c index be52a6648f2..6e12a455529 100644 --- a/sim/common/sim-memopt.c +++ b/sim/common/sim-memopt.c @@ -449,6 +449,10 @@ sim_memory_uninstall (SIM_DESC sd) /* delete it and its aliases */ alias = *entry; + + /* next victim */ + *entry = (*entry)->next; + while (alias != NULL) { sim_memopt *dead = alias; @@ -456,9 +460,6 @@ sim_memory_uninstall (SIM_DESC sd) sim_core_detach (sd, NULL, dead->level, dead->space, dead->addr); zfree (dead); } - - /* next victim */ - *entry = (*entry)->next; } } diff --git a/sim/common/sim-model.h b/sim/common/sim-model.h index 6f7769af787..52728152e14 100644 --- a/sim/common/sim-model.h +++ b/sim/common/sim-model.h @@ -79,6 +79,9 @@ typedef struct { /* This is the argument to bfd_scan_arch. */ const char *bfd_name; #define MACH_BFD_NAME(m) ((m)->bfd_name) + enum mach_attr num; +#define MACH_NUM(m) ((m)->num) + int word_bitsize; #define MACH_WORD_BITSIZE(m) ((m)->word_bitsize) int addr_bitsize; diff --git a/sim/common/sim-n-core.h b/sim/common/sim-n-core.h index 46eca0355fd..7a04a9fb4bc 100644 --- a/sim/common/sim-n-core.h +++ b/sim/common/sim-n-core.h @@ -167,7 +167,7 @@ sim_core_read_aligned_N(sim_cpu *cpu, if (WITH_CALLBACK_MEMORY && mapping->device != NULL) { unsigned_M data; - if (device_io_read_buffer (mapping->device, &data, mapping->space, addr, N, cpu, cia) != N) + if (device_io_read_buffer (mapping->device, &data, mapping->space, addr, N, CPU_STATE (cpu), cpu, cia) != N) device_error (mapping->device, "internal error - %s - io_read_buffer should not fail", XSTRING (sim_core_read_aligned_N)); val = T2H_M (data); @@ -298,7 +298,7 @@ sim_core_write_aligned_N(sim_cpu *cpu, if (WITH_CALLBACK_MEMORY && mapping->device != NULL) { unsigned_M data = H2T_M (val); - if (device_io_write_buffer (mapping->device, &data, mapping->space, addr, N, cpu, cia) != N) + if (device_io_write_buffer (mapping->device, &data, mapping->space, addr, N, CPU_STATE (cpu), cpu, cia) != N) device_error (mapping->device, "internal error - %s - io_write_buffer should not fail", XSTRING (sim_core_write_aligned_N)); break; -- cgit v1.2.1