// architectural state of a RISC-V hart
struct state_t
{
- void reset();
+ void reset(reg_t max_isa);
static const int num_triggers = 4;
// control and status registers
reg_t prv; // TODO: Can this be an enum instead?
+ reg_t misa;
reg_t mstatus;
reg_t mepc;
reg_t mtval;
STEP_STEPPED
} single_step;
- reg_t load_reservation;
-
#ifdef RISCV_ENABLE_COMMITLOG
commit_log_reg_t log_reg_write;
reg_t last_inst_priv;
extension_t* get_extension() { return ext; }
bool supports_extension(unsigned char ext) {
if (ext >= 'a' && ext <= 'z') ext += 'A' - 'a';
- return ext >= 'A' && ext <= 'Z' && ((isa >> (ext - 'A')) & 1);
+ return ext >= 'A' && ext <= 'Z' && ((state.misa >> (ext - 'A')) & 1);
+ }
+ reg_t pc_alignment_mask() {
+ return ~(reg_t)(supports_extension('C') ? 0 : 2);
}
void check_pc_alignment(reg_t pc) {
- if (unlikely(pc & 2) && !supports_extension('C'))
+ if (unlikely(pc & ~pc_alignment_mask()))
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);
const disassembler_t* get_disassembler() { return disassembler; }
uint32_t id;
unsigned max_xlen;
unsigned xlen;
- reg_t isa;
reg_t max_isa;
std::string isa_string;
bool histogram_enabled;