aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-02-04 16:09:47 -0800
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-02-04 16:09:47 -0800
commit75d9ab427d9d9a6039140d899d363cbf170df488 (patch)
tree603f6e4dbbd89dcda58416c9c00f3c7e8543598f
parentc983d273b25d1ab54396eff8dcf6f5dda38ad052 (diff)
downloadspike-75d9ab427d9d9a6039140d899d363cbf170df488.zip
spike-75d9ab427d9d9a6039140d899d363cbf170df488.tar.gz
spike-75d9ab427d9d9a6039140d899d363cbf170df488.tar.bz2
[sim,pk] added interrupt-pending field to cause reg
-rw-r--r--riscv/decode.h5
-rw-r--r--riscv/insns/mtpcr.h2
-rw-r--r--riscv/processor.cc16
-rw-r--r--riscv/processor.h1
-rw-r--r--riscv/trap.h2
5 files changed, 13 insertions, 13 deletions
diff --git a/riscv/decode.h b/riscv/decode.h
index 4c30e62..40b8b5e 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -44,6 +44,11 @@ const int JUMP_ALIGN_BITS = 1;
#define SR_IM_SHIFT 8
#define TIMER_IRQ 7
+#define CAUSE_EXCCODE 0x000000FF
+#define CAUSE_IP 0x0000FF00
+#define CAUSE_EXCCODE_SHIFT 0
+#define CAUSE_IP_SHIFT 8
+
#define FP_RD_NE 0
#define FP_RD_0 1
#define FP_RD_DN 2
diff --git a/riscv/insns/mtpcr.h b/riscv/insns/mtpcr.h
index 1a31a32..449f63d 100644
--- a/riscv/insns/mtpcr.h
+++ b/riscv/insns/mtpcr.h
@@ -15,7 +15,7 @@ switch(insn.rtype.rs2)
count = RS1;
break;
case 5:
- interrupts_pending &= ~(1 << TIMER_IRQ);
+ cause &= ~(1 << (TIMER_IRQ+CAUSE_IP_SHIFT));
compare = RS1;
break;
diff --git a/riscv/processor.cc b/riscv/processor.cc
index 6f36653..f5b6de1 100644
--- a/riscv/processor.cc
+++ b/riscv/processor.cc
@@ -25,7 +25,6 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
fromhost = 0;
count = 0;
compare = 0;
- interrupts_pending = 0;
set_sr(SR_S | SR_SX); // SX ignored if 64b mode not supported
set_fsr(0);
@@ -70,13 +69,10 @@ void processor_t::step(size_t n, bool noisy)
{
for( ; i < n; i++)
{
- uint32_t interrupts = interrupts_pending & ((sr & SR_IM) >> SR_IM_SHIFT);
- if((sr & SR_ET) && interrupts)
- {
- for(int i = 0; interrupts; i++, interrupts >>= 1)
- if(interrupts & 1)
- throw trap_t(16+i);
- }
+ uint32_t interrupts = (cause & CAUSE_IP) >> CAUSE_IP_SHIFT;
+ interrupts &= (sr & SR_IM) >> SR_IM_SHIFT;
+ if(interrupts && (sr & SR_ET))
+ take_trap(trap_interrupt,noisy);
insn_t insn = mmu.load_insn(pc);
@@ -91,7 +87,7 @@ void processor_t::step(size_t n, bool noisy)
XPR[0] = 0;
if(count++ == compare)
- interrupts_pending |= 1 << TIMER_IRQ;
+ cause |= 1 << (TIMER_IRQ+CAUSE_IP_SHIFT);
}
return;
}
@@ -112,7 +108,7 @@ 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;
+ cause = (cause & ~CAUSE_EXCCODE) | (t << CAUSE_EXCCODE_SHIFT);
epc = pc;
pc = evec;
badvaddr = mmu.get_badvaddr();
diff --git a/riscv/processor.h b/riscv/processor.h
index b548038..c1c65ce 100644
--- a/riscv/processor.h
+++ b/riscv/processor.h
@@ -36,7 +36,6 @@ private:
uint32_t sr;
uint32_t count;
uint32_t compare;
- uint32_t interrupts_pending;
// unprivileged control registers
uint32_t fsr;
diff --git a/riscv/trap.h b/riscv/trap.h
index 5ba1183..3af8840 100644
--- a/riscv/trap.h
+++ b/riscv/trap.h
@@ -8,7 +8,7 @@
DECLARE_TRAP(privileged_instruction), \
DECLARE_TRAP(fp_disabled), \
DECLARE_TRAP(syscall), \
- DECLARE_TRAP(breakpoint), \
+ DECLARE_TRAP(interrupt), \
DECLARE_TRAP(data_address_misaligned), \
DECLARE_TRAP(load_access_fault), \
DECLARE_TRAP(store_access_fault), \