allow MAFDC bits in MISA to be modified
authorAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 10 Sep 2016 01:35:09 +0000 (18:35 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 10 Sep 2016 01:35:09 +0000 (18:35 -0700)
riscv/processor.cc
riscv/processor.h

index 6d0b98356d6b11fb410c3db8a141ce29ac435b4b..1a41f604e9681e2f03d09c93314adafa72f9d7bd 100644 (file)
@@ -109,6 +109,8 @@ void processor_t::parse_isa_string(const char* str)
   // advertise support for supervisor and user modes
   isa |= 1L << ('s' - 'a');
   isa |= 1L << ('u' - 'a');
+
+  max_isa = isa;
 }
 
 void state_t::reset()
@@ -392,6 +394,22 @@ void processor_t::set_csr(int which, reg_t val)
     case CSR_MSCRATCH: state.mscratch = val; break;
     case CSR_MCAUSE: state.mcause = val; break;
     case CSR_MBADADDR: state.mbadaddr = val; break;
+    case CSR_MISA: {
+      if (!(val & (1L << ('F' - 'A'))))
+        val &= ~(1L << ('D' - 'A'));
+
+      // allow MAFDC bits in MISA to be modified
+      reg_t mask = 0;
+      mask |= 1L << ('M' - 'A');
+      mask |= 1L << ('A' - 'A');
+      mask |= 1L << ('F' - 'A');
+      mask |= 1L << ('D' - 'A');
+      mask |= 1L << ('C' - 'A');
+      mask &= max_isa;
+
+      isa = (val & mask) | (isa & ~mask);
+      break;
+    }
     case CSR_TSELECT:
       if (val < state.num_triggers) {
         state.tselect = val;
index 4d8dd640b72a921b9de01d03b4528a096f749305..8a9ff47fdfdc6f02312f3328ae5710fc5dbcd7e3 100644 (file)
@@ -286,6 +286,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;