aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2016-08-12 23:43:27 +0800
committerMike Frysinger <vapier@gentoo.org>2022-12-20 23:57:38 -0500
commitffeb72b44c8c5060465005178dd3a4a304117a58 (patch)
treeb44abd51ce73b4207664c3570fb0a834668aff65
parentd026e67ed41a249ec758847008d8a19257bf45fc (diff)
downloadgdb-ffeb72b44c8c5060465005178dd3a4a304117a58.zip
gdb-ffeb72b44c8c5060465005178dd3a4a304117a58.tar.gz
gdb-ffeb72b44c8c5060465005178dd3a4a304117a58.tar.bz2
sim: sim_cpu: invert sim_cpu storage
Currently all ports have to declare sim_cpu themselves in their sim-main.h and then embed the common sim_cpu_base in it. This dynamic makes it impossible to share common object code among multiple ports because the core data structure is always different. Let's invert this relationship: common code declares sim_cpu, and the port uses the new arch_data field for its per-cpu state. This is the first in a series of changes: it adds a define to select between the old & new layouts, then converts all the ports that don't need custom state over to the new layout. This includes mn10300 that, while it defines custom fields in its cpu struct, never uses them.
-rw-r--r--sim/arm/sim-main.h7
-rw-r--r--sim/common/sim-cpu.c25
-rw-r--r--sim/common/sim-cpu.h18
-rw-r--r--sim/cr16/sim-main.h7
-rw-r--r--sim/d10v/sim-main.h7
-rw-r--r--sim/mn10300/sim-main.h13
-rw-r--r--sim/sh/sim-main.h7
7 files changed, 45 insertions, 39 deletions
diff --git a/sim/arm/sim-main.h b/sim/arm/sim-main.h
index 17c3132..ba44314 100644
--- a/sim/arm/sim-main.h
+++ b/sim/arm/sim-main.h
@@ -19,6 +19,8 @@
#ifndef SIM_MAIN_H
#define SIM_MAIN_H
+#define SIM_HAVE_COMMON_SIM_CPU
+
#include "sim-basics.h"
#include "sim-base.h"
#include "bfd.h"
@@ -28,9 +30,4 @@
extern struct ARMul_State *state;
-struct _sim_cpu {
-
- sim_cpu_base base;
-};
-
#endif
diff --git a/sim/common/sim-cpu.c b/sim/common/sim-cpu.c
index f096481..951e937 100644
--- a/sim/common/sim-cpu.c
+++ b/sim/common/sim-cpu.c
@@ -31,12 +31,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* ??? wip. better solution must wait. */
SIM_RC
-sim_cpu_alloc_all (SIM_DESC sd, int ncpus)
+sim_cpu_alloc_all_extra (SIM_DESC sd, int ncpus, size_t extra_bytes)
{
int c;
for (c = 0; c < ncpus; ++c)
- STATE_CPU (sd, c) = sim_cpu_alloc (sd);
+ STATE_CPU (sd, c) = sim_cpu_alloc_extra (sd, extra_bytes);
return SIM_RC_OK;
}
@@ -44,15 +44,24 @@ sim_cpu_alloc_all (SIM_DESC sd, int ncpus)
EXTRA_BYTES is additional space to allocate for the sim_cpu struct. */
sim_cpu *
-sim_cpu_alloc (SIM_DESC sd)
+sim_cpu_alloc_extra (SIM_DESC sd, size_t extra_bytes)
{
- int extra_bytes = 0;
+ sim_cpu *cpu;
+
+#ifndef CGEN_ARCH
+# define cgen_cpu_max_extra_bytes(sd) 0
+#endif
+#ifdef SIM_HAVE_COMMON_SIM_CPU
+ cpu = zalloc (sizeof (*cpu));
-#ifdef CGEN_ARCH
extra_bytes += cgen_cpu_max_extra_bytes (sd);
+ if (extra_bytes)
+ CPU_ARCH_DATA (cpu) = zalloc (extra_bytes);
+#else
+ cpu = zalloc (sizeof (*cpu) + cgen_cpu_max_extra_bytes (sd));
#endif
- return zalloc (sizeof (sim_cpu) + extra_bytes);
+ return cpu;
}
/* Free all resources held by all cpus. */
@@ -72,6 +81,10 @@ sim_cpu_free_all (SIM_DESC sd)
void
sim_cpu_free (sim_cpu *cpu)
{
+#ifdef SIM_HAVE_COMMON_SIM_CPU
+ free (CPU_ARCH_DATA (cpu));
+#endif
+
free (cpu);
}
diff --git a/sim/common/sim-cpu.h b/sim/common/sim-cpu.h
index 4f5972b..ab41508 100644
--- a/sim/common/sim-cpu.h
+++ b/sim/common/sim-cpu.h
@@ -122,10 +122,24 @@ typedef struct {
} sim_cpu_base;
+#ifdef SIM_HAVE_COMMON_SIM_CPU
+struct _sim_cpu {
+ /* All the common state. */
+ sim_cpu_base base;
+
+ /* Pointer for sim target to store arbitrary cpu data. Normally the
+ target should define a struct and use it here. */
+ void *arch_data;
+#define CPU_ARCH_DATA(cpu) ((cpu)->arch_data)
+};
+#endif
+
/* Create all cpus. */
-extern SIM_RC sim_cpu_alloc_all (SIM_DESC, int);
+extern SIM_RC sim_cpu_alloc_all_extra (SIM_DESC, int, size_t);
+#define sim_cpu_alloc_all(state, ncpus) sim_cpu_alloc_all_extra (state, ncpus, 0)
/* Create a cpu. */
-extern sim_cpu *sim_cpu_alloc (SIM_DESC);
+extern sim_cpu *sim_cpu_alloc_extra (SIM_DESC, size_t);
+#define sim_cpu_alloc(sd) sim_cpu_alloc_extra (sd, 0)
/* Release resources held by all cpus. */
extern void sim_cpu_free_all (SIM_DESC);
/* Release resources held by a cpu. */
diff --git a/sim/cr16/sim-main.h b/sim/cr16/sim-main.h
index adf242a..7ac6bd2 100644
--- a/sim/cr16/sim-main.h
+++ b/sim/cr16/sim-main.h
@@ -19,6 +19,8 @@
#ifndef SIM_MAIN_H
#define SIM_MAIN_H
+#define SIM_HAVE_COMMON_SIM_CPU
+
#include "sim-basics.h"
typedef long int word;
@@ -29,9 +31,4 @@ typedef unsigned long int uword;
#include "cr16_sim.h"
-struct _sim_cpu {
-
- sim_cpu_base base;
-};
-
#endif
diff --git a/sim/d10v/sim-main.h b/sim/d10v/sim-main.h
index 8a4e944..5327e7e 100644
--- a/sim/d10v/sim-main.h
+++ b/sim/d10v/sim-main.h
@@ -19,6 +19,8 @@
#ifndef SIM_MAIN_H
#define SIM_MAIN_H
+#define SIM_HAVE_COMMON_SIM_CPU
+
#include "sim-basics.h"
typedef long int word;
@@ -29,9 +31,4 @@ typedef unsigned long int uword;
#include "d10v_sim.h"
-struct _sim_cpu {
-
- sim_cpu_base base;
-};
-
#endif
diff --git a/sim/mn10300/sim-main.h b/sim/mn10300/sim-main.h
index dd4f966..37e5ce0 100644
--- a/sim/mn10300/sim-main.h
+++ b/sim/mn10300/sim-main.h
@@ -22,6 +22,8 @@
#ifndef SIM_MAIN_H
#define SIM_MAIN_H
+#define SIM_HAVE_COMMON_SIM_CPU
+
#define SIM_ENGINE_HALT_HOOK(SD,LAST_CPU,CIA) /* disable this hook */
#include "sim-basics.h"
@@ -53,17 +55,6 @@ mn10300_core_signal ((SD), (CPU), (CIA), (MAP), (NR_BYTES), (ADDR), (TRANSFER),
#define IMEM8_IMMED(EA, N) \
(sim_core_read_aligned_1(STATE_CPU(sd, 0), EA, exec_map, (EA) + (N)))
-
-/* FIXME: For moment, save/restore PC value found in struct State.
- Struct State will one day go away, being placed in the sim_cpu
- state. */
-
-struct _sim_cpu {
- sim_event *pending_nmi;
- sim_cia cia;
- sim_cpu_base base;
-};
-
/* For compatibility, until all functions converted to passing
SIM_DESC as an argument */
extern SIM_DESC simulator;
diff --git a/sim/sh/sim-main.h b/sim/sh/sim-main.h
index 5f04623..5504ad2 100644
--- a/sim/sh/sim-main.h
+++ b/sim/sh/sim-main.h
@@ -19,6 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef SIM_MAIN_H
#define SIM_MAIN_H
+#define SIM_HAVE_COMMON_SIM_CPU
+
#include "sim-basics.h"
#include "sim-base.h"
@@ -118,9 +120,4 @@ typedef union
/* TODO: Move into sim_cpu. */
extern saved_state_type saved_state;
-struct _sim_cpu {
-
- sim_cpu_base base;
-};
-
#endif