X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=riscv%2Fprocessor.h;h=070fccf8af1d7515c1c46add649a2912b839da29;hb=4299874ad4b07ef457776513a64e5b2397a6a75e;hp=d80da4ffc2fccbef7d12b7a9bdffb189ff53f585;hpb=3b1e9ab7522b3b20cde6bd8d9f2b28222463cf1b;p=riscv-isa-sim.git diff --git a/riscv/processor.h b/riscv/processor.h index d80da4f..070fccf 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -5,6 +5,7 @@ #include "decode.h" #include "config.h" #include "devices.h" +#include "trap.h" #include #include #include @@ -97,7 +98,7 @@ struct state_t reg_t prv; // TODO: Can this be an enum instead? reg_t mstatus; reg_t mepc; - reg_t mbadaddr; + reg_t mtval; reg_t mscratch; reg_t mtvec; reg_t mcause; @@ -109,10 +110,10 @@ struct state_t uint32_t mcounteren; uint32_t scounteren; reg_t sepc; - reg_t sbadaddr; + reg_t stval; reg_t sscratch; reg_t stvec; - reg_t sptbr; + reg_t satp; reg_t scause; reg_t dpc; reg_t dscratch; @@ -184,6 +185,11 @@ public: if (ext >= 'a' && ext <= 'z') ext += 'A' - 'a'; return ext >= 'A' && ext <= 'Z' && ((isa >> (ext - 'A')) & 1); } + void check_pc_alignment(reg_t pc) { + if (unlikely(pc & 2) && !supports_extension('C')) + throw trap_instruction_address_misaligned(pc); + } + reg_t legalize_privilege(reg_t); void set_privilege(reg_t); void yield_load_reservation() { state.load_reservation = (reg_t)-1; } void update_histogram(reg_t pc); @@ -221,7 +227,6 @@ public: (operation == OPERATION_STORE && !state.mcontrol[i].store) || (operation == OPERATION_LOAD && !state.mcontrol[i].load) || (state.prv == PRV_M && !state.mcontrol[i].m) || - (state.prv == PRV_H && !state.mcontrol[i].h) || (state.prv == PRV_S && !state.mcontrol[i].s) || (state.prv == PRV_U && !state.mcontrol[i].u)) { continue;