Fix multicore debug.
[riscv-isa-sim.git] / riscv / processor.h
index 41d778e589263a1cbfb43ad51fb0263c65e0343f..6e8d684ae573adb2220041c6ac4a835787475e83 100644 (file)
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 #include <map>
+#include "debug_rom/debug_rom_defines.h"
 
 class processor_t;
 class mmu_t;
@@ -65,8 +66,10 @@ typedef enum
 typedef struct
 {
   uint8_t type;
+  bool dmode;
   uint8_t maskmax;
   bool select;
+  bool timing;
   mcontrol_action_t action;
   bool chain;
   mcontrol_match_t match;
@@ -103,8 +106,8 @@ struct state_t
   reg_t mip;
   reg_t medeleg;
   reg_t mideleg;
-  reg_t mucounteren;
-  reg_t mscounteren;
+  uint32_t mcounteren;
+  uint32_t scounteren;
   reg_t sepc;
   reg_t sbadaddr;
   reg_t sscratch;
@@ -116,7 +119,7 @@ struct state_t
   dcsr_t dcsr;
   reg_t tselect;
   mcontrol_t mcontrol[num_triggers];
-  reg_t tdata1[num_triggers];
+  reg_t tdata2[num_triggers];
 
   uint32_t fflags;
   uint32_t frm;
@@ -165,7 +168,6 @@ public:
   void reset();
   void step(size_t n); // run for n cycles
   void set_csr(int which, reg_t val);
-  void raise_interrupt(reg_t which);
   reg_t get_csr(int which);
   mmu_t* get_mmu() { return mmu; }
   state_t* get_state() { return &state; }
@@ -190,6 +192,8 @@ public:
   bool debug;
   // When true, take the slow simulation path.
   bool slow_path();
+  bool halted() { return state.dcsr.cause ? true : false; }
+  bool halt_request;
 
   // Return the index of a trigger that matched, or -1.
   inline int trigger_match(trigger_operation_t operation, reg_t address, reg_t data)
@@ -230,42 +234,43 @@ public:
 
       switch (state.mcontrol[i].match) {
         case MATCH_EQUAL:
-          if (value != state.tdata1[i])
+          if (value != state.tdata2[i])
             continue;
           break;
         case MATCH_NAPOT:
           {
-            reg_t mask = ~((1 << cto(state.tdata1[i])) - 1);
-            if ((value & mask) != (state.tdata1[i] & mask))
+            reg_t mask = ~((1 << cto(state.tdata2[i])) - 1);
+            if ((value & mask) != (state.tdata2[i] & mask))
               continue;
           }
           break;
         case MATCH_GE:
-          if (value < state.tdata1[i])
+          if (value < state.tdata2[i])
             continue;
           break;
         case MATCH_LT:
-          if (value >= state.tdata1[i])
+          if (value >= state.tdata2[i])
             continue;
           break;
         case MATCH_MASK_LOW:
           {
-            reg_t mask = state.tdata1[i] >> (xlen/2);
-            if ((value & mask) != (state.tdata1[i] & mask))
+            reg_t mask = state.tdata2[i] >> (xlen/2);
+            if ((value & mask) != (state.tdata2[i] & mask))
               continue;
           }
           break;
         case MATCH_MASK_HIGH:
           {
-            reg_t mask = state.tdata1[i] >> (xlen/2);
-            if (((value >> (xlen/2)) & mask) != (state.tdata1[i] & mask))
+            reg_t mask = state.tdata2[i] >> (xlen/2);
+            if (((value >> (xlen/2)) & mask) != (state.tdata2[i] & mask))
               continue;
           }
           break;
       }
 
-      if (!state.mcontrol[i].chain)
+      if (!state.mcontrol[i].chain) {
         return i;
+      }
       chain_ok = true;
     }
     return -1;
@@ -283,6 +288,7 @@ private:
   unsigned max_xlen;
   unsigned xlen;
   reg_t isa;
+  reg_t max_isa;
   std::string isa_string;
   bool histogram_enabled;
   bool halt_on_reset;
@@ -293,8 +299,8 @@ private:
   static const size_t OPCODE_CACHE_SIZE = 8191;
   insn_desc_t opcode_cache[OPCODE_CACHE_SIZE];
 
-  void check_timer();
-  void take_interrupt(); // take a trap if any interrupts are pending
+  void take_pending_interrupt() { take_interrupt(state.mip & state.mie); }
+  void take_interrupt(reg_t mask); // take first enabled interrupt in mask
   void take_trap(trap_t& t, reg_t epc); // take an exception
   void disasm(insn_t insn); // disassemble and print an instruction
   int paddr_bits();
@@ -303,7 +309,7 @@ private:
 
   friend class sim_t;
   friend class mmu_t;
-  friend class rtc_t;
+  friend class clint_t;
   friend class extension_t;
 
   void parse_isa_string(const char* isa);