Browse Source

Handle CSR permissions correctly

mvp
Andrew Waterman 13 years ago
parent
commit
127fdd1d94
  1. 11
      riscv/decode.h
  2. 5
      riscv/processor.cc

11
riscv/decode.h

@ -169,11 +169,12 @@ private:
} while(0)
#define validate_csr(which, write) ({ \
int write_priv = ((which) >> 10) & 3; \
int read_priv = ((which) >> 8) & 3; \
if ((which) == CSR_FCSR || (which) == CSR_FFLAGS || (which) == CSR_FRM) \
require_fp; \
if (read_priv > 0 || (write_priv > 0 && (write))) require_supervisor; \
unsigned my_priv = (p->get_state()->sr & SR_S) ? 1 : 0; \
unsigned read_priv = ((which) >> 10) & 3; \
unsigned write_priv = (((which) >> 8) & 3); \
if (read_priv == 3) read_priv = write_priv, write_priv = -1; \
if (my_priv < ((write) ? write_priv : read_priv)) \
throw trap_privileged_instruction(); \
(which); })
#endif

5
riscv/processor.cc

@ -318,6 +318,9 @@ reg_t processor_t::get_pcr(int which)
return state.cause;
case CSR_PTBR:
return state.ptbr;
case CSR_SEND_IPI:
case CSR_CLEAR_IPI:
return 0;
case CSR_ASID:
return 0;
case CSR_FATC:
@ -338,7 +341,7 @@ reg_t processor_t::get_pcr(int which)
sim->get_htif()->tick(); // not necessary, but faster
return state.fromhost;
default:
return -1;
throw trap_illegal_instruction();
}
}

Loading…
Cancel
Save