X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=riscv%2Fprocessor.h;h=5557e5afad3bceede99d44735142e9bd6793df6b;hb=a9c5b05eca6a46a0c8722b26b741fc7f1de22405;hp=d117ff1acbcc1d8988b68e412b373739efdbf6c4;hpb=71d04ecd7ab631193a0943f8ddae222090d8e048;p=riscv-isa-sim.git diff --git a/riscv/processor.h b/riscv/processor.h index d117ff1..5557e5a 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -4,7 +4,8 @@ #include "decode.h" #include "config.h" -#include +#include "devices.h" +#include #include #include @@ -40,23 +41,25 @@ struct state_t regfile_t FPR; // control and status registers + reg_t prv; reg_t mstatus; reg_t mepc; reg_t mbadaddr; - reg_t mtimecmp; reg_t mscratch; reg_t mcause; reg_t minstret; reg_t mie; reg_t mip; + reg_t medeleg; + reg_t mideleg; + reg_t mucounteren; + reg_t mscounteren; reg_t sepc; reg_t sbadaddr; reg_t sscratch; reg_t stvec; reg_t sptbr; reg_t scause; - reg_t sutime_delta; - reg_t suinstret_delta; reg_t tohost; reg_t fromhost; uint32_t fflags; @@ -67,11 +70,12 @@ struct state_t #ifdef RISCV_ENABLE_COMMITLOG commit_log_reg_t log_reg_write; + reg_t last_inst_priv; #endif }; // this class represents one processor in a RISC-V machine. -class processor_t +class processor_t : public abstract_device_t { public: processor_t(const char* isa, sim_t* sim, uint32_t id); @@ -81,7 +85,6 @@ public: void set_histogram(bool value); void reset(bool value); void step(size_t n); // run for n cycles - void deliver_ipi(); // register an interprocessor interrupt bool running() { return run; } void set_csr(int which, reg_t val); void raise_interrupt(reg_t which); @@ -90,32 +93,37 @@ public: 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); + if (ext >= 'a' && ext <= 'z') ext += 'A' - 'a'; + return ext >= 'A' && ext <= 'Z' && ((isa >> (ext - 'A')) & 1); } - void push_privilege_stack(); - void pop_privilege_stack(); + void set_privilege(reg_t); void yield_load_reservation() { state.load_reservation = (reg_t)-1; } - void update_histogram(size_t pc); + void update_histogram(reg_t pc); void register_insn(insn_desc_t); void register_extension(extension_t*); + // MMIO slave interface + bool load(reg_t addr, size_t len, uint8_t* bytes); + bool store(reg_t addr, size_t len, const uint8_t* bytes); + private: sim_t* sim; mmu_t* mmu; // main memory is always accessed via the mmu extension_t* ext; disassembler_t* disassembler; state_t state; - reg_t cpuid; uint32_t id; - int max_xlen; - int xlen; + unsigned max_xlen; + unsigned xlen; + reg_t isa; + std::string isa_string; bool run; // !reset bool debug; bool histogram_enabled; std::vector instructions; - std::map pc_histogram; + std::map pc_histogram; static const size_t OPCODE_CACHE_SIZE = 8191; insn_desc_t opcode_cache[OPCODE_CACHE_SIZE]; @@ -127,6 +135,7 @@ private: friend class sim_t; friend class mmu_t; + friend class rtc_t; friend class extension_t; void parse_isa_string(const char* isa);