sim: microblaze: switch to common sim_resume/sim_stop_reason
authorMike Frysinger <vapier@gentoo.org>
Tue, 9 Jun 2015 08:10:49 +0000 (16:10 +0800)
committerMike Frysinger <vapier@gentoo.org>
Thu, 11 Jun 2015 11:13:22 +0000 (07:13 -0400)
This allows us to use the common code for all exception handling.

sim/microblaze/ChangeLog
sim/microblaze/Makefile.in
sim/microblaze/interp.c
sim/microblaze/sim-main.h

index cd4be04ad50583904acec997e6f170bc41262522..4bd0da42b0785f637732bd3066ba544bfe8eeb19 100644 (file)
@@ -1,3 +1,13 @@
+2015-06-11  Mike Frysinger  <vapier@gentoo.org>
+
+       * Makefile.in (SIM_OBJS): Add sim-resume.o.
+       * interp.c (sim_resume): rename to ...
+       (sim_engine_run): ... this.  Change CPU.exception setting to
+       sim_engine_halt calls.  Change do/while to while(1).  Call
+       sim_events_process when sim_events_tick is true.
+       (sim_stop_reason): Delete.
+       * sim-main.h (microblaze_regset): Delete exception member.
+
 2015-04-18  Mike Frysinger  <vapier@gentoo.org>
 
        * sim-main.h (SIM_CPU): Delete.
index 6c631291b18e220cb7b9b063f607c9fac7f14d97..ca4f70a4073fd52e0d1bfd9dae6c2d4fedb2c616 100644 (file)
@@ -22,6 +22,7 @@ SIM_OBJS = \
        $(SIM_NEW_COMMON_OBJS) \
        sim-hload.o \
        sim-reason.o \
+       sim-resume.o \
        sim-stop.o
 
 ## COMMON_POST_CONFIG_FRAG
index e05c107dc6c5448452d95acf115bfb1ba4e444fc..93e622dc5f8658ed3ded9f18e4e429f48aa68a0d 100644 (file)
@@ -110,7 +110,10 @@ set_initial_gprs (SIM_CPU *cpu)
 static int tracing = 0;
 
 void
-sim_resume (SIM_DESC sd, int step, int siggnal)
+sim_engine_run (SIM_DESC sd,
+               int next_cpu_nr, /* ignore  */
+               int nr_cpus, /* ignore  */
+               int siggnal) /* ignore  */
 {
   SIM_CPU *cpu = STATE_CPU (sd, 0);
   int needfetch;
@@ -132,13 +135,11 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
   short num_delay_slot; /* UNUSED except as reqd parameter */
   enum microblaze_instr_type insn_type;
 
-  CPU.exception = step ? SIGTRAP : 0;
-
   memops = 0;
   bonus_cycles = 0;
   insts = 0;
 
-  do
+  while (1)
     {
       /* Fetch the initial instructions that we'll decode. */
       inst = MEM_RD_WORD (PC & 0xFFFFFFFC);
@@ -161,12 +162,12 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
       delay_slot_enable = 0;
       branch_taken = 0;
       if (op == microblaze_brk)
-       CPU.exception = SIGTRAP;
+       sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_stopped, SIM_SIGTRAP);
       else if (inst == MICROBLAZE_HALT_INST)
        {
-         CPU.exception = SIGQUIT;
          insts += 1;
          bonus_cycles++;
+         sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_exited, RETREG);
        }
       else
        {
@@ -180,7 +181,8 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
 #undef INSTRUCTION
 
            default:
-             CPU.exception = SIGILL;
+             sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_signalled,
+                              SIM_SIGILL);
              fprintf (stderr, "ERROR: Unknown opcode\n");
            }
          /* Make R0 consistent */
@@ -238,7 +240,8 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
                      if (STATE_VERBOSE_P (sd))
                        fprintf (stderr, "Cannot have branch or return instructions "
                                 "in delay slot (at address 0x%x)\n", PC);
-                     CPU.exception = SIGILL;
+                     sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_signalled,
+                                      SIM_SIGILL);
                    }
                  else
                    {
@@ -252,7 +255,8 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
 #undef INSTRUCTION
 
                        default:
-                         CPU.exception = SIGILL;
+                         sim_engine_halt (sd, NULL, NULL, NULL_CIA,
+                                          sim_signalled, SIM_SIGILL);
                          fprintf (stderr, "ERROR: Unknown opcode at 0x%x\n", PC);
                        }
                      /* Update cycle counts */
@@ -287,8 +291,10 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
 
       if (tracing)
        fprintf (stderr, "\n");
+
+      if (sim_events_tick (sd))
+       sim_events_process (sd);
     }
-  while (!CPU.exception);
 
   /* Hide away the things we've cached while executing.  */
   /*  CPU.pc = pc; */
@@ -348,23 +354,6 @@ sim_fetch_register (SIM_DESC sd, int rn, unsigned char *memory, int length)
     return 0;
 }
 
-void
-sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
-{
-  SIM_CPU *cpu = STATE_CPU (sd, 0);
-
-  if (CPU.exception == SIGQUIT)
-    {
-      *reason = sim_exited;
-      *sigrc = RETREG;
-    }
-  else
-    {
-      *reason = sim_stopped;
-      *sigrc = CPU.exception;
-    }
-}
-
 void
 sim_info (SIM_DESC sd, int verbose)
 {
index ab4e6afd0d8ca0f09f4781d2a5fd123b2c7023b5..678137421bff29f10d8e6e281483cc8c6edac158 100644 (file)
@@ -39,7 +39,6 @@
   word           spregs[2];            /* pc + msr */
   int            cycles;
   int            insts;
-  int            exception;
   ubyte           imm_enable;
   half            imm_high;
 };