reg_t mbadaddr;
reg_t mscratch;
reg_t mcause;
+ reg_t mtime;
+ reg_t mie;
+ reg_t mip;
reg_t sepc;
reg_t sbadaddr;
reg_t sscratch;
reg_t stvec;
reg_t sptbr;
reg_t scause;
+ reg_t sutime_delta;
reg_t tohost;
reg_t fromhost;
- reg_t scount;
- bool stip;
+ bool serialized; // whether timer CSRs are in a well-defined state
uint32_t stimecmp;
uint32_t fflags;
uint32_t frm;
class processor_t
{
public:
- processor_t(sim_t* _sim, mmu_t* _mmu, uint32_t _id);
+ processor_t(const char* isa, sim_t* sim, uint32_t id);
~processor_t();
void set_debug(bool value);
mmu_t* get_mmu() { return mmu; }
state_t* get_state() { return &state; }
extension_t* get_extension() { return ext; }
+ bool supports_extension(unsigned char ext) {
+ return ext >= 'A' && ext <= 'Z' && ((cpuid >> (ext - 'A')) & 1);
+ }
void push_privilege_stack();
void pop_privilege_stack();
void yield_load_reservation() { state.load_reservation = (reg_t)-1; }
extension_t* ext;
disassembler_t* disassembler;
state_t state;
+ reg_t cpuid;
uint32_t id;
+ int max_xlen;
int xlen;
bool run; // !reset
bool debug;
bool histogram_enabled;
- bool serialized;
std::vector<insn_desc_t> instructions;
std::vector<insn_desc_t*> opcode_map;
std::map<size_t,size_t> pc_histogram;
void take_interrupt(); // take a trap if any interrupts are pending
- void serialize(); // collapse into defined architectural state
- reg_t take_trap(trap_t& t, reg_t epc); // take an exception
+ void take_trap(trap_t& t, reg_t epc); // take an exception
void disasm(insn_t insn); // disassemble and print an instruction
friend class sim_t;
friend class mmu_t;
friend class extension_t;
+ void parse_isa_string(const char* isa);
void build_opcode_map();
insn_func_t decode_insn(insn_t insn);
};