[xcc,sim] eliminated vectored traps
authorAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>
Tue, 5 Oct 2010 22:08:18 +0000 (15:08 -0700)
committerAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>
Tue, 5 Oct 2010 22:08:18 +0000 (15:08 -0700)
now, the evec register holds the address that all traps vector to,
and the cause register is set with the trap number.

riscv/insns/mfpcr.h
riscv/insns/mtpcr.h
riscv/mmu.h
riscv/processor.cc
riscv/processor.h

index 00609576689ae4b230210f5b411cb846ec172284..704e37bbcf5de9d1ac46888c098096f73a3260f5 100644 (file)
@@ -14,7 +14,7 @@ switch(insn.rtype.rs2)
     val = badvaddr;
     break;
   case 3:
-    val = ebase;
+    val = evec;
     break;
   case 4:
     val = count;
@@ -22,6 +22,9 @@ switch(insn.rtype.rs2)
   case 5:
     val = compare;
     break;
+  case 6:
+    val = cause;
+    break;
 
   case 8:
     val = MEMSIZE >> 12;
index bcc613a52f27264f4ce7323252789ad71edd27d0..1a31a32151b08c789b29f29ee567b4836f680295 100644 (file)
@@ -9,7 +9,7 @@ switch(insn.rtype.rs2)
     epc = RS1;
     break;
   case 3:
-    ebase = RS1 & ~0xFFF;
+    evec = RS1;
     break;
   case 4:
     count = RS1;
index 9bfbeac31757ddeecb9591712deec7c50b11f7e5..1b8a422e20a45e5f787839b517062e99c0bb843c 100644 (file)
@@ -50,9 +50,9 @@ private:
   {
     if(addr & (size-1))
     {
+      badvaddr = addr;
       if(fetch)
         throw trap_instruction_address_misaligned;
-      badvaddr = addr;
       throw trap_data_address_misaligned;
     }
   }
@@ -61,9 +61,9 @@ private:
   {
     if(addr >= memsz || addr + size > memsz)
     {
+      badvaddr = addr;
       if(fetch)
         throw trap_instruction_access_fault;
-      badvaddr = addr;
       throw store ? trap_store_access_fault : trap_load_access_fault;
     }
   }
index 271afbf0115652af627073b693c1d1858a4f3a5c..b018347afa23b6eb5bb027d135ccb76700ec388c 100644 (file)
@@ -15,9 +15,10 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
   memset(R,0,sizeof(R));
   memset(FR,0,sizeof(FR));
   pc = 0;
-  ebase = 0;
+  evec = 0;
   epc = 0;
   badvaddr = 0;
+  cause = 0;
   tid = 0;
   pcr_k0 = 0;
   pcr_k1 = 0;
@@ -109,8 +110,9 @@ void processor_t::take_trap(trap_t t, bool noisy)
            id, trap_name(t), (unsigned long long)pc);
 
   set_sr((((sr & ~SR_ET) | SR_S) & ~SR_PS) | ((sr & SR_S) ? SR_PS : 0));
+  cause = t;
   epc = pc;
-  pc = ebase + t*128;
+  pc = evec;
   badvaddr = mmu.get_badvaddr();
 }
 
index fab6c9ceb996897833045e087d7115b14a8f8bc1..c1e4740094e071989da8cb94f6acf22385abc005 100644 (file)
@@ -26,7 +26,8 @@ private:
   reg_t pc;
   reg_t epc;
   reg_t badvaddr;
-  reg_t ebase;
+  reg_t cause;
+  reg_t evec;
   reg_t tohost;
   reg_t fromhost;
   reg_t pcr_k0;