bugfix in raising accelerator interrupts
authorYunsup Lee <yunsup@cs.berkeley.edu>
Mon, 16 Mar 2015 09:01:26 +0000 (02:01 -0700)
committerYunsup Lee <yunsup@cs.berkeley.edu>
Mon, 16 Mar 2015 09:01:26 +0000 (02:01 -0700)
hwacha/hwacha.cc
riscv/extension.cc

index 972e151b9c53592c414b0db308f1a745b660d0a6..820faaba7efa9a649991e60e53f2ee8e39b1ffe6 100644 (file)
@@ -103,5 +103,5 @@ void hwacha_t::take_exception(reg_t c, reg_t a)
   cause = c;
   aux = a;
   raise_interrupt();
-  throw std::logic_error("a hwacha exception was posted, but interrupts are disabled!");
+  throw std::logic_error("unreachable!");
 }
index c2bea2e648635f30ef513a57d2b97ddcc46172b3..097713929bf43c92da73396ebaf017a311a7b5ac 100644 (file)
@@ -12,7 +12,14 @@ void extension_t::illegal_instruction()
 
 void extension_t::raise_interrupt()
 {
-  p->raise_interrupt(IRQ_COP);
+  int priv = get_field(p->get_state()->mstatus, MSTATUS_PRV);
+  int ie = get_field(p->get_state()->mstatus, MSTATUS_IE);
+
+  if (priv < PRV_M || (priv == PRV_M && ie)) {
+    p->raise_interrupt(IRQ_COP);
+  }
+
+  throw std::logic_error("a COP exception was posted, but interrupts are disabled!");
 }
 
 void extension_t::clear_interrupt()