aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/mips/ChangeLog11
-rw-r--r--sim/mips/Makefile.in1
-rw-r--r--sim/mips/interp.c34
-rw-r--r--sim/mips/sim-main.h9
4 files changed, 44 insertions, 11 deletions
diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog
index cd655eb..a962f84 100644
--- a/sim/mips/ChangeLog
+++ b/sim/mips/ChangeLog
@@ -1,5 +1,16 @@
2015-04-13 Mike Frysinger <vapier@gentoo.org>
+ * Makefile.in (SIM_OBJS): Add sim-cpu.o.
+ * interp.c (mips_pc_get, mips_pc_set): New functions.
+ (sim_open): Declare new local var i. Call sim_cpu_alloc_all.
+ Call CPU_PC_FETCH & CPU_PC_STORE for all cpus.
+ (sim_pc_get): Delete.
+ * sim-main.h (SIM_CPU): Define.
+ (struct sim_state): Change cpu to an array of pointers.
+ (STATE_CPU): Drop &.
+
+2015-04-13 Mike Frysinger <vapier@gentoo.org>
+
* interp.c (mips_option_handler, open_trace, sim_close,
sim_write, sim_read, sim_store_register, sim_fetch_register,
sim_create_inferior, pr_addr, pr_uword64): Convert old style
diff --git a/sim/mips/Makefile.in b/sim/mips/Makefile.in
index 17eeab6..96131ae 100644
--- a/sim/mips/Makefile.in
+++ b/sim/mips/Makefile.in
@@ -46,6 +46,7 @@ SIM_OBJS = \
cp1.o \
mdmx.o \
dsp.o \
+ sim-cpu.o \
sim-main.o \
sim-hload.o \
sim-stop.o \
diff --git a/sim/mips/interp.c b/sim/mips/interp.c
index dabd9e0..d6136ab 100644
--- a/sim/mips/interp.c
+++ b/sim/mips/interp.c
@@ -336,14 +336,33 @@ static void device_init(SIM_DESC sd) {
/*-- GDB simulator interface ------------------------------------------------*/
/*---------------------------------------------------------------------------*/
+static sim_cia
+mips_pc_get (sim_cpu *cpu)
+{
+ return PC;
+}
+
+static void
+mips_pc_set (sim_cpu *cpu, sim_cia pc)
+{
+ PC = pc;
+}
+
SIM_DESC
sim_open (SIM_OPEN_KIND kind, host_callback *cb, struct bfd *abfd, char **argv)
{
+ int i;
SIM_DESC sd = sim_state_alloc (kind, cb);
- sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
+ sim_cpu *cpu;
SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
+ /* The cpu data is kept in a separately allocated chunk of memory. */
+ if (sim_cpu_alloc_all (sd, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK)
+ return 0;
+
+ cpu = STATE_CPU (sd, 0); /* FIXME */
+
/* FIXME: watchpoints code shouldn't need this */
STATE_WATCHPOINTS (sd)->pc = &(PC);
STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC);
@@ -790,7 +809,14 @@ sim_open (SIM_OPEN_KIND kind, host_callback *cb, struct bfd *abfd, char **argv)
}
}
+ /* CPU specific initialization. */
+ for (i = 0; i < MAX_NR_PROCESSORS; ++i)
+ {
+ SIM_CPU *cpu = STATE_CPU (sd, i);
+ CPU_PC_FETCH (cpu) = mips_pc_get;
+ CPU_PC_STORE (cpu) = mips_pc_set;
+ }
return sd;
}
@@ -1066,12 +1092,6 @@ sim_fetch_register (SIM_DESC sd, int rn, unsigned char *memory, int length)
return 0;
}
-sim_cia
-sim_pc_get (sim_cpu *cpu)
-{
- return PC;
-}
-
SIM_RC
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
{
diff --git a/sim/mips/sim-main.h b/sim/mips/sim-main.h
index 3c0e9bb..e27636c 100644
--- a/sim/mips/sim-main.h
+++ b/sim/mips/sim-main.h
@@ -36,6 +36,8 @@ mips_core_signal ((SD), (CPU), (CIA), (MAP), (NR_BYTES), (ADDR), (TRANSFER), (ER
typedef address_word sim_cia;
+typedef struct _sim_cpu SIM_CPU;
+
#include "sim-base.h"
#include "bfd.h"
@@ -486,14 +488,13 @@ struct sim_state {
struct swatch watch;
- sim_cpu cpu[MAX_NR_PROCESSORS];
+ sim_cpu *cpu[MAX_NR_PROCESSORS];
#if (WITH_SMP)
-#define STATE_CPU(sd,n) (&(sd)->cpu[n])
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
#else
-#define STATE_CPU(sd,n) (&(sd)->cpu[0])
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
#endif
-
sim_state_base base;
};