Fix paddr_bits computation prior to VM setup
authorAndrew Waterman <waterman@cs.berkeley.edu>
Thu, 23 Jun 2016 05:51:12 +0000 (22:51 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Thu, 23 Jun 2016 05:51:12 +0000 (22:51 -0700)
riscv/processor.cc
riscv/processor.h

index f030dfa1f4ac0842dfaa1e895771f41ab3404385..e2f44b5a43d0a2e3202bd5e71a01492b8924b3bf 100644 (file)
@@ -283,14 +283,10 @@ static bool validate_vm(int max_xlen, reg_t vm)
   return vm == VM_MBARE;
 }
 
-static int paddr_bits(reg_t vm)
+int processor_t::paddr_bits()
 {
-  switch (vm) {
-    case VM_SV32: return 34;
-    case VM_SV39: return 50;
-    case VM_SV48: return 50;
-    default: abort();
-  }
+  assert(xlen == max_xlen);
+  return max_xlen == 64 ? 50 : 34;
 }
 
 void processor_t::set_csr(int which, reg_t val)
@@ -379,8 +375,7 @@ void processor_t::set_csr(int which, reg_t val)
                      (state.mie & ~state.mideleg) | (val & state.mideleg));
     case CSR_SPTBR: {
       // upper bits of sptbr are the ASID; we only support ASID = 0
-      reg_t vm = get_field(state.mstatus, MSTATUS_VM);
-      state.sptbr = val & (((reg_t)1 << (paddr_bits(vm) - PGSHIFT)) - 1);
+      state.sptbr = val & (((reg_t)1 << (paddr_bits() - PGSHIFT)) - 1);
       break;
     }
     case CSR_SEPC: state.sepc = val; break;
index 730ae787c60c99a2805c314fc9e64ea2ddf8bb10..2906bda182010cd228898dc9bbc6498ea0a7527d 100644 (file)
@@ -158,6 +158,7 @@ private:
   void take_interrupt(); // take a trap if any interrupts are pending
   void take_trap(trap_t& t, reg_t epc); // take an exception
   void disasm(insn_t insn); // disassemble and print an instruction
+  int paddr_bits();
 
   void enter_debug_mode(uint8_t cause);