Compare commits
	
		
			1 Commits
		
	
	
		
			8e4e702cb9
			...
			00d2d06cbd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user