adapt to privileged spec
This commit is contained in:
parent
8e4e702cb9
commit
00d2d06cbd
|
@ -314,7 +314,6 @@ protected:
|
||||||
iss::status read_ie(unsigned addr, reg_t &val);
|
iss::status read_ie(unsigned addr, reg_t &val);
|
||||||
iss::status write_ie(unsigned addr, reg_t val);
|
iss::status write_ie(unsigned addr, reg_t val);
|
||||||
iss::status read_ip(unsigned addr, reg_t &val);
|
iss::status read_ip(unsigned addr, reg_t &val);
|
||||||
iss::status write_ip(unsigned addr, reg_t val);
|
|
||||||
iss::status read_hartid(unsigned addr, reg_t &val);
|
iss::status read_hartid(unsigned addr, reg_t &val);
|
||||||
iss::status write_epc(unsigned addr, reg_t val);
|
iss::status write_epc(unsigned addr, reg_t val);
|
||||||
iss::status write_intstatus(unsigned addr, reg_t val);
|
iss::status write_intstatus(unsigned addr, reg_t val);
|
||||||
|
@ -411,7 +410,7 @@ riscv_hart_m_p<BASE, FEAT>::riscv_hart_m_p()
|
||||||
csr_rd_cb[mtvec] = &this_class::read_tvec;
|
csr_rd_cb[mtvec] = &this_class::read_tvec;
|
||||||
csr_wr_cb[mepc] = &this_class::write_epc;
|
csr_wr_cb[mepc] = &this_class::write_epc;
|
||||||
csr_rd_cb[mip] = &this_class::read_ip;
|
csr_rd_cb[mip] = &this_class::read_ip;
|
||||||
csr_wr_cb[mip] = &this_class::write_ip;
|
csr_wr_cb[mip] = &this_class::write_null;
|
||||||
csr_rd_cb[mie] = &this_class::read_ie;
|
csr_rd_cb[mie] = &this_class::read_ie;
|
||||||
csr_wr_cb[mie] = &this_class::write_ie;
|
csr_wr_cb[mie] = &this_class::write_ie;
|
||||||
csr_rd_cb[mhartid] = &this_class::read_hartid;
|
csr_rd_cb[mhartid] = &this_class::read_hartid;
|
||||||
|
@ -906,14 +905,6 @@ template <typename BASE, features_e FEAT> iss::status riscv_hart_m_p<BASE, FEAT>
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BASE, features_e FEAT> iss::status riscv_hart_m_p<BASE, FEAT>::write_ip(unsigned addr, reg_t val) {
|
|
||||||
auto mask = get_irq_mask();
|
|
||||||
mask &= 0xf; // only xSIP is writable
|
|
||||||
csr[mip] = (csr[mip] & ~mask) | (val & mask);
|
|
||||||
check_interrupt();
|
|
||||||
return iss::Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename BASE, features_e FEAT> iss::status riscv_hart_m_p<BASE, FEAT>::write_epc(unsigned addr, reg_t val) {
|
template <typename BASE, features_e FEAT> iss::status riscv_hart_m_p<BASE, FEAT>::write_epc(unsigned addr, reg_t val) {
|
||||||
csr[addr] = val & get_pc_mask();
|
csr[addr] = val & get_pc_mask();
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
|
|
|
@ -400,7 +400,6 @@ private:
|
||||||
iss::status read_ie(unsigned addr, reg_t &val);
|
iss::status read_ie(unsigned addr, reg_t &val);
|
||||||
iss::status write_ie(unsigned addr, reg_t val);
|
iss::status write_ie(unsigned addr, reg_t val);
|
||||||
iss::status read_ip(unsigned addr, reg_t &val);
|
iss::status read_ip(unsigned addr, reg_t &val);
|
||||||
iss::status write_ip(unsigned addr, reg_t val);
|
|
||||||
iss::status read_hartid(unsigned addr, reg_t &val);
|
iss::status read_hartid(unsigned addr, reg_t &val);
|
||||||
iss::status write_epc(unsigned addr, reg_t val);
|
iss::status write_epc(unsigned addr, reg_t val);
|
||||||
iss::status read_satp(unsigned addr, reg_t &val);
|
iss::status read_satp(unsigned addr, reg_t &val);
|
||||||
|
@ -499,11 +498,11 @@ riscv_hart_msu_vp<BASE>::riscv_hart_msu_vp()
|
||||||
csr_wr_cb[sepc] = &this_class::write_epc;
|
csr_wr_cb[sepc] = &this_class::write_epc;
|
||||||
csr_wr_cb[uepc] = &this_class::write_epc;
|
csr_wr_cb[uepc] = &this_class::write_epc;
|
||||||
csr_rd_cb[mip] = &this_class::read_ip;
|
csr_rd_cb[mip] = &this_class::read_ip;
|
||||||
csr_wr_cb[mip] = &this_class::write_ip;
|
csr_wr_cb[mip] = &this_class::write_null;
|
||||||
csr_rd_cb[sip] = &this_class::read_ip;
|
csr_rd_cb[sip] = &this_class::read_ip;
|
||||||
csr_wr_cb[sip] = &this_class::write_ip;
|
csr_wr_cb[sip] = &this_class::write_null;
|
||||||
csr_rd_cb[uip] = &this_class::read_ip;
|
csr_rd_cb[uip] = &this_class::read_ip;
|
||||||
csr_wr_cb[uip] = &this_class::write_ip;
|
csr_wr_cb[uip] = &this_class::write_null;
|
||||||
csr_rd_cb[mie] = &this_class::read_ie;
|
csr_rd_cb[mie] = &this_class::read_ie;
|
||||||
csr_wr_cb[mie] = &this_class::write_ie;
|
csr_wr_cb[mie] = &this_class::write_ie;
|
||||||
csr_rd_cb[sie] = &this_class::read_ie;
|
csr_rd_cb[sie] = &this_class::read_ie;
|
||||||
|
@ -959,15 +958,6 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ip(unsigned a
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ip(unsigned addr, reg_t val) {
|
|
||||||
auto req_priv_lvl = (addr >> 8) & 0x3;
|
|
||||||
auto mask = get_irq_mask(req_priv_lvl);
|
|
||||||
mask &= ~(1 << 7); // MTIP is read only
|
|
||||||
csr[mip] = (csr[mip] & ~mask) | (val & mask);
|
|
||||||
check_interrupt();
|
|
||||||
return iss::Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_epc(unsigned addr, reg_t val) {
|
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_epc(unsigned addr, reg_t val) {
|
||||||
csr[addr] = val & get_pc_mask();
|
csr[addr] = val & get_pc_mask();
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
|
|
|
@ -329,7 +329,6 @@ protected:
|
||||||
iss::status read_ie(unsigned addr, reg_t &val);
|
iss::status read_ie(unsigned addr, reg_t &val);
|
||||||
iss::status write_ie(unsigned addr, reg_t val);
|
iss::status write_ie(unsigned addr, reg_t val);
|
||||||
iss::status read_ip(unsigned addr, reg_t &val);
|
iss::status read_ip(unsigned addr, reg_t &val);
|
||||||
iss::status write_ip(unsigned addr, reg_t val);
|
|
||||||
iss::status write_ideleg(unsigned addr, reg_t val);
|
iss::status write_ideleg(unsigned addr, reg_t val);
|
||||||
iss::status write_edeleg(unsigned addr, reg_t val);
|
iss::status write_edeleg(unsigned addr, reg_t val);
|
||||||
iss::status read_hartid(unsigned addr, reg_t &val);
|
iss::status read_hartid(unsigned addr, reg_t &val);
|
||||||
|
@ -432,7 +431,7 @@ riscv_hart_mu_p<BASE, FEAT>::riscv_hart_mu_p(feature_config cfg)
|
||||||
csr_rd_cb[mtvec] = &this_class::read_tvec;
|
csr_rd_cb[mtvec] = &this_class::read_tvec;
|
||||||
csr_wr_cb[mepc] = &this_class::write_epc;
|
csr_wr_cb[mepc] = &this_class::write_epc;
|
||||||
csr_rd_cb[mip] = &this_class::read_ip;
|
csr_rd_cb[mip] = &this_class::read_ip;
|
||||||
csr_wr_cb[mip] = &this_class::write_ip;
|
csr_wr_cb[mip] = &this_class::write_null;
|
||||||
csr_rd_cb[mie] = &this_class::read_ie;
|
csr_rd_cb[mie] = &this_class::read_ie;
|
||||||
csr_wr_cb[mie] = &this_class::write_ie;
|
csr_wr_cb[mie] = &this_class::write_ie;
|
||||||
csr_rd_cb[mhartid] = &this_class::read_hartid;
|
csr_rd_cb[mhartid] = &this_class::read_hartid;
|
||||||
|
@ -461,7 +460,7 @@ riscv_hart_mu_p<BASE, FEAT>::riscv_hart_mu_p(feature_config cfg)
|
||||||
csr_rd_cb[uie] = &this_class::read_ie;
|
csr_rd_cb[uie] = &this_class::read_ie;
|
||||||
csr_wr_cb[uie] = &this_class::write_ie;
|
csr_wr_cb[uie] = &this_class::write_ie;
|
||||||
csr_rd_cb[uip] = &this_class::read_ip;
|
csr_rd_cb[uip] = &this_class::read_ip;
|
||||||
csr_wr_cb[uip] = &this_class::write_ip;
|
csr_wr_cb[uip] = &this_class::write_null;
|
||||||
csr_wr_cb[uepc] = &this_class::write_epc;
|
csr_wr_cb[uepc] = &this_class::write_epc;
|
||||||
csr_rd_cb[ustatus] = &this_class::read_status;
|
csr_rd_cb[ustatus] = &this_class::read_status;
|
||||||
csr_wr_cb[ustatus] = &this_class::write_status;
|
csr_wr_cb[ustatus] = &this_class::write_status;
|
||||||
|
@ -1062,14 +1061,6 @@ template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT>::write_ip(unsigned addr, reg_t val) {
|
|
||||||
auto mask = get_irq_mask((addr >> 8) & 0x3);
|
|
||||||
mask &= 0xf; // only xSIP is writable
|
|
||||||
csr[mip] = (csr[mip] & ~mask) | (val & mask);
|
|
||||||
check_interrupt();
|
|
||||||
return iss::Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT>::write_ideleg(unsigned addr, reg_t val) {
|
template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT>::write_ideleg(unsigned addr, reg_t val) {
|
||||||
auto mask = 0b000100010001; // only U mode supported
|
auto mask = 0b000100010001; // only U mode supported
|
||||||
csr[mideleg] = (csr[mideleg] & ~mask) | (val & mask);
|
csr[mideleg] = (csr[mideleg] & ~mask) | (val & mask);
|
||||||
|
@ -1244,7 +1235,7 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::read_clic(uint64_t addr, unsigned lengt
|
||||||
} else if(addr>=(cfg.clic_base+0x40) && (addr+length)<=(cfg.clic_base+0x40+cfg.clic_num_trigger*4)){ // clicinttrig
|
} else if(addr>=(cfg.clic_base+0x40) && (addr+length)<=(cfg.clic_base+0x40+cfg.clic_num_trigger*4)){ // clicinttrig
|
||||||
auto offset = ((addr&0x7fff)-0x40)/4;
|
auto offset = ((addr&0x7fff)-0x40)/4;
|
||||||
read_reg_uint32(addr, clic_inttrig_reg[offset], data, length);
|
read_reg_uint32(addr, clic_inttrig_reg[offset], data, length);
|
||||||
} else if(addr>=(cfg.clic_base+0x1000) && (addr+length)<=(cfg.clic_base+cfg.clic_num_irq*4)){ // clicintip/clicintie/clicintattr/clicintctl
|
} else if(addr>=(cfg.clic_base+0x1000) && (addr+length)<=(cfg.clic_base+0x1000+cfg.clic_num_irq*4)){ // clicintip/clicintie/clicintattr/clicintctl
|
||||||
auto offset = ((addr&0x7fff)-0x1000)/4;
|
auto offset = ((addr&0x7fff)-0x1000)/4;
|
||||||
read_reg_uint32(addr, clic_int_reg[offset].raw, data, length);
|
read_reg_uint32(addr, clic_int_reg[offset].raw, data, length);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1260,10 +1251,10 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::write_clic(uint64_t addr, unsigned leng
|
||||||
clic_cfg_reg&= 0x7e;
|
clic_cfg_reg&= 0x7e;
|
||||||
// } else if(addr>=(cfg.clic_base+4) && (addr+length)<=(cfg.clic_base+4)){ // clicinfo
|
// } else if(addr>=(cfg.clic_base+4) && (addr+length)<=(cfg.clic_base+4)){ // clicinfo
|
||||||
// write_uint32(addr, clic_info_reg, data, length);
|
// write_uint32(addr, clic_info_reg, data, length);
|
||||||
} else if(addr>=(cfg.clic_base+0x40) && (addr+length)<=(cfg.clic_base+0xC0)){ // clicinttrig
|
} else if(addr>=(cfg.clic_base+0x40) && (addr+length)<=(cfg.clic_base+0x40+cfg.clic_num_trigger*4)){ // clicinttrig
|
||||||
auto offset = ((addr&0x7fff)-0x40)/4;
|
auto offset = ((addr&0x7fff)-0x40)/4;
|
||||||
write_reg_uint32(addr, clic_inttrig_reg[offset], data, length);
|
write_reg_uint32(addr, clic_inttrig_reg[offset], data, length);
|
||||||
} else if(addr>=(cfg.clic_base+0x1000) && (addr+length)<=(cfg.clic_base+cfg.clic_num_irq*4)){ // clicintip/clicintie/clicintattr/clicintctl
|
} else if(addr>=(cfg.clic_base+0x1000) && (addr+length)<=(cfg.clic_base+0x1000+cfg.clic_num_irq*4)){ // clicintip/clicintie/clicintattr/clicintctl
|
||||||
auto offset = ((addr&0x7fff)-0x1000)/4;
|
auto offset = ((addr&0x7fff)-0x1000)/4;
|
||||||
write_reg_uint32(addr, clic_int_reg[offset].raw, data, length);
|
write_reg_uint32(addr, clic_int_reg[offset].raw, data, length);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue