diff --git a/sim/cris/ChangeLog b/sim/cris/ChangeLog
index b69e20f..b1ac591 100644
--- a/sim/cris/ChangeLog
+++ b/sim/cris/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/cris/sim-main.h b/sim/cris/sim-main.h
index 18c536f..5ae292e 100644
--- a/sim/cris/sim-main.h
+++ b/sim/cris/sim-main.h
@@ -225,8 +225,12 @@ struct _sim_cpu {
 /* The sim_state struct.  */
 
 struct sim_state {
-  sim_cpu *cpu;
-#define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 
   CGEN_STATE cgen_state;
 
diff --git a/sim/frv/ChangeLog b/sim/frv/ChangeLog
index 9580c56..8e7e995 100644
--- a/sim/frv/ChangeLog
+++ b/sim/frv/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/frv/sim-main.h b/sim/frv/sim-main.h
index 7528f6a..e7dc1a2 100644
--- a/sim/frv/sim-main.h
+++ b/sim/frv/sim-main.h
@@ -118,8 +118,12 @@ struct _sim_cpu {
 /* The sim_state struct.  */
 
 struct sim_state {
-  sim_cpu *cpu;
-#define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 
   CGEN_STATE cgen_state;
 
diff --git a/sim/h8300/ChangeLog b/sim/h8300/ChangeLog
index 215a182..1740b3d 100644
--- a/sim/h8300/ChangeLog
+++ b/sim/h8300/ChangeLog
@@ -1,3 +1,10 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* compile.c: Include sim-options.h.
+	(sim_open): Call sim_cpu_alloc_all instead of sim_cpu_alloc.
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c
index 2574168..e14c3ab 100644
--- a/sim/h8300/compile.c
+++ b/sim/h8300/compile.c
@@ -34,6 +34,7 @@
 #include "gdb/sim-h8300.h"
 #include "sys/stat.h"
 #include "sys/types.h"
+#include "sim-options.h"
 
 #ifndef SIGTRAP
 # define SIGTRAP 5
@@ -4886,7 +4887,14 @@ sim_open (SIM_OPEN_KIND kind,
   sim_cpu *cpu;
 
   sd = sim_state_alloc (kind, callback);
-  sd->cpu = sim_cpu_alloc (sd, 0);
+
+  /* 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)
+    {
+      free_state (sd);
+      return 0;
+    }
+
   cpu = STATE_CPU (sd, 0);
   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
   sim_state_initialize (sd, cpu);
diff --git a/sim/h8300/sim-main.h b/sim/h8300/sim-main.h
index 964388a..7126fa3 100644
--- a/sim/h8300/sim-main.h
+++ b/sim/h8300/sim-main.h
@@ -138,7 +138,7 @@ struct _sim_cpu {
 
 /* The sim_state struct.  */
 struct sim_state {
-  struct _sim_cpu *cpu;
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
   unsigned int sim_cache_size;
   decoded_inst *sim_cache;
   unsigned short *cache_idx;
@@ -155,7 +155,11 @@ struct sim_state {
 
 #define CIA_GET(CPU)		(cpu_get_pc (CPU))
 #define CIA_SET(CPU, VAL)	(cpu_set_pc ((CPU), (VAL)))
-#define STATE_CPU(SD, N)	((SD)->cpu)	/* Single Processor.  */
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 #define cpu_set_pc(CPU, VAL)	(((CPU)->pc)  = (VAL))
 #define cpu_get_pc(CPU)		(((CPU)->pc))
 
diff --git a/sim/iq2000/ChangeLog b/sim/iq2000/ChangeLog
index 9da17e5..b590cb0 100644
--- a/sim/iq2000/ChangeLog
+++ b/sim/iq2000/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/iq2000/sim-main.h b/sim/iq2000/sim-main.h
index d6cb782..623c0a6 100644
--- a/sim/iq2000/sim-main.h
+++ b/sim/iq2000/sim-main.h
@@ -57,8 +57,12 @@ struct _sim_cpu {
 /* The sim_state struct.  */
 
 struct sim_state {
-  sim_cpu *cpu;
-#define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 
   CGEN_STATE cgen_state;
 
diff --git a/sim/lm32/ChangeLog b/sim/lm32/ChangeLog
index fdb204b..94a1ccd 100644
--- a/sim/lm32/ChangeLog
+++ b/sim/lm32/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/lm32/sim-main.h b/sim/lm32/sim-main.h
index a4e4423..d985607 100644
--- a/sim/lm32/sim-main.h
+++ b/sim/lm32/sim-main.h
@@ -83,8 +83,12 @@ struct _sim_cpu
 
 struct sim_state
 {
-  sim_cpu *cpu;
-#define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 
   CGEN_STATE cgen_state;
 
diff --git a/sim/m32r/ChangeLog b/sim/m32r/ChangeLog
index 2dcd3a0..c8a285c 100644
--- a/sim/m32r/ChangeLog
+++ b/sim/m32r/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/m32r/sim-main.h b/sim/m32r/sim-main.h
index 2cbb40b..96c1ec1 100644
--- a/sim/m32r/sim-main.h
+++ b/sim/m32r/sim-main.h
@@ -68,8 +68,12 @@ struct _sim_cpu {
 /* The sim_state struct.  */
 
 struct sim_state {
-  sim_cpu *cpu;
-#define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 
   CGEN_STATE cgen_state;
 
diff --git a/sim/sh64/ChangeLog b/sim/sh64/ChangeLog
index 574fbb1..5bbc7a3 100644
--- a/sim/sh64/ChangeLog
+++ b/sim/sh64/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15  Mike Frysinger  <vapier@gentoo.org>
+
+	* sim-main.h (struct sim_state): Change cpu to an array of pointers.
+	(STATE_CPU): Handle WITH_SMP.
+
 2015-04-13  Mike Frysinger  <vapier@gentoo.org>
 
 	* configure: Regenerate.
diff --git a/sim/sh64/sim-main.h b/sim/sh64/sim-main.h
index e7cbe99..5ae4309 100644
--- a/sim/sh64/sim-main.h
+++ b/sim/sh64/sim-main.h
@@ -53,8 +53,12 @@ struct _sim_cpu {
 /* The sim_state struct.  */
 
 struct sim_state {
-  sim_cpu *cpu;
-#define STATE_CPU(sd, n) (/*&*/ (sd)->cpu)
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
+#if (WITH_SMP)
+#define STATE_CPU(sd,n) ((sd)->cpu[n])
+#else
+#define STATE_CPU(sd,n) ((sd)->cpu[0])
+#endif
 
   CGEN_STATE cgen_state;
 
