sim: riscv: invert sim_state storage
authorMike Frysinger <vapier@gentoo.org>
Thu, 13 May 2021 09:44:02 +0000 (05:44 -0400)
committerMike Frysinger <vapier@gentoo.org>
Mon, 17 May 2021 05:02:09 +0000 (01:02 -0400)
sim/riscv/ChangeLog
sim/riscv/interp.c
sim/riscv/sim-main.c
sim/riscv/sim-main.h

index 53081dc0bb93951333838714a3dbbde8a6265587..e7cd0a36f51cabb56b720595ec2d4e108d7e1f3d 100644 (file)
@@ -1,3 +1,12 @@
+2021-05-17  Mike Frysinger  <vapier@gentoo.org>
+
+       * interp.c (sim_open): Call sim_state_alloc_extra.
+       * sim-main.c (execute_a): Change sd to riscv_sim_state.
+       * sim-main.h (SIM_HAVE_COMMON_SIM_STATE): Define.
+       (struct sim_state): Delete.
+       (struct riscv_sim_state): New struct.
+       (RISCV_SIM_STATE): Define.
+
 2021-05-16  Mike Frysinger  <vapier@gentoo.org>
 
        * interp.c, machs.c, sim-main.c: Replace config.h include with defs.h.
index d430d77d701c95773ee2fe4402637ebd6f55f077..f3754da1ed8a9c4c94a5eb8251275a03a5a0dd55 100644 (file)
@@ -59,7 +59,8 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback,
 {
   char c;
   int i;
-  SIM_DESC sd = sim_state_alloc (kind, callback);
+  SIM_DESC sd = sim_state_alloc_extra (kind, callback,
+                                      sizeof (struct riscv_sim_state));
 
   /* The cpu data is kept in a separately allocated chunk of memory.  */
   if (sim_cpu_alloc_all (sd, 1) != SIM_RC_OK)
index 7f87f1beb5061b50a5f948b0a0bc06ed3bf48892..a09ae033cac256218d5e6783b3064bf5df03cf7b 100644 (file)
@@ -794,6 +794,7 @@ static sim_cia
 execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op)
 {
   SIM_DESC sd = CPU_STATE (cpu);
+  struct riscv_sim_state *state = RISCV_SIM_STATE (sd);
   int rd = (iw >> OP_SH_RD) & OP_MASK_RD;
   int rs1 = (iw >> OP_SH_RS1) & OP_MASK_RS1;
   int rs2 = (iw >> OP_SH_RS2) & OP_MASK_RS2;
@@ -813,7 +814,7 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op)
        sim_core_read_unaligned_4 (cpu, cpu->pc, read_map, cpu->regs[rs1]));
 
       /* Walk the reservation list to find an existing match.  */
-      amo_curr = sd->amo_reserved_list;
+      amo_curr = state->amo_reserved_list;
       while (amo_curr)
        {
          if (amo_curr->addr == cpu->regs[rs1])
@@ -824,15 +825,15 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op)
       /* No reservation exists, so add one.  */
       amo_curr = xmalloc (sizeof (*amo_curr));
       amo_curr->addr = cpu->regs[rs1];
-      amo_curr->next = sd->amo_reserved_list;
-      sd->amo_reserved_list = amo_curr;
+      amo_curr->next = state->amo_reserved_list;
+      state->amo_reserved_list = amo_curr;
       goto done;
     case MATCH_SC_W:
       TRACE_INSN (cpu, "%s %s, %s, (%s);", op->name, rd_name, rs2_name,
                  rs1_name);
 
       /* Walk the reservation list to find a match.  */
-      amo_curr = amo_prev = sd->amo_reserved_list;
+      amo_curr = amo_prev = state->amo_reserved_list;
       while (amo_curr)
        {
          if (amo_curr->addr == cpu->regs[rs1])
@@ -841,8 +842,8 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op)
              sim_core_write_unaligned_4 (cpu, cpu->pc, write_map,
                                          cpu->regs[rs1], cpu->regs[rs2]);
              store_rd (cpu, rd, 0);
-             if (amo_curr == sd->amo_reserved_list)
-               sd->amo_reserved_list = amo_curr->next;
+             if (amo_curr == state->amo_reserved_list)
+               state->amo_reserved_list = amo_curr->next;
              else
                amo_prev->next = amo_curr->next;
              free (amo_curr);
index 4a1b31ee2fec3ae408ba19476f853c54032d16a0..fd095397df0354e05aea724369db8a907cc5c6bc 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef SIM_MAIN_H
 #define SIM_MAIN_H
 
+#define SIM_HAVE_COMMON_SIM_STATE
+
 #include "sim-basics.h"
 #include "machs.h"
 #include "sim-base.h"
@@ -66,13 +68,10 @@ struct atomic_mem_reserved_list {
   address_word addr;
 };
 
-struct sim_state {
-  sim_cpu *cpu[MAX_NR_PROCESSORS];
+struct riscv_sim_state {
   struct atomic_mem_reserved_list *amo_reserved_list;
-
-  /* ... simulator specific members ... */
-  sim_state_base base;
 };
+#define RISCV_SIM_STATE(sd) ((struct riscv_sim_state *) STATE_ARCH_DATA (sd))
 
 extern void step_once (SIM_CPU *);
 extern void initialize_cpu (SIM_DESC, SIM_CPU *, int);