Update state.pc on every instruction
authorAndrew Waterman <waterman@cs.berkeley.edu>
Thu, 26 Mar 2015 06:01:54 +0000 (23:01 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Thu, 26 Mar 2015 06:03:16 +0000 (23:03 -0700)
This isn't a bug fix for Spike proper, but it makes it possible for
RoCC instructions to access the control thread's PC.

riscv/processor.cc

index c2d52751a188d46bee453026b8e29afc8cb3972c..0ff55789a449b2939a4ddea935420fcddfc44581 100644 (file)
@@ -193,7 +193,7 @@ void processor_t::step(size_t n)
       {
         insn_fetch_t fetch = mmu->load_insn(pc);
         disasm(fetch.insn);
-        pc = execute_insn(this, pc, fetch);
+        state.pc = pc = execute_insn(this, pc, fetch);
       }
     }
     else while (instret < n)
@@ -204,7 +204,7 @@ void processor_t::step(size_t n)
       #define ICACHE_ACCESS(idx) { \
         insn_fetch_t fetch = ic_entry->data; \
         ic_entry++; \
-        pc = execute_insn(this, pc, fetch); \
+        state.pc = pc = execute_insn(this, pc, fetch); \
         instret++; \
         if (idx == mmu_t::ICACHE_ENTRIES-1) break; \
         if (unlikely(ic_entry->tag != pc)) break; \
@@ -217,11 +217,10 @@ void processor_t::step(size_t n)
   }
   catch(trap_t& t)
   {
-    pc = take_trap(t, pc);
+    state.pc = take_trap(t, pc);
   }
   catch(serialize_t& s) {}
 
-  state.pc = pc;
   update_timer(&state, instret);
 }