fixes write mask of clic memory mapped registers
This commit is contained in:
parent
fa7eda0889
commit
ad7bb28b4c
|
@ -487,7 +487,7 @@ riscv_hart_mu_p<BASE, FEAT>::riscv_hart_mu_p(feature_config cfg)
|
||||||
csr_rd_cb[mclicbase] = &this_class::read_csr_reg;
|
csr_rd_cb[mclicbase] = &this_class::read_csr_reg;
|
||||||
csr_wr_cb[mclicbase] = &this_class::write_null;
|
csr_wr_cb[mclicbase] = &this_class::write_null;
|
||||||
|
|
||||||
clic_int_reg.resize(cfg.clic_num_irq);
|
clic_int_reg.resize(cfg.clic_num_irq, clic_int_reg_t{.raw=0});
|
||||||
clic_cfg_reg=0x20;
|
clic_cfg_reg=0x20;
|
||||||
clic_info_reg = (/*CLICINTCTLBITS*/ 4U<<21) + cfg.clic_num_irq;
|
clic_info_reg = (/*CLICINTCTLBITS*/ 4U<<21) + cfg.clic_num_irq;
|
||||||
mcause_max_irq=cfg.clic_num_irq+16;
|
mcause_max_irq=cfg.clic_num_irq+16;
|
||||||
|
@ -1261,6 +1261,7 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::write_clic(uint64_t addr, unsigned leng
|
||||||
} else if(addr>=(cfg.clic_base+0x1000) && (addr+length)<=(cfg.clic_base+0x1000+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);
|
||||||
|
clic_int_reg[offset].raw &= 0xf0c70101; // clicIntCtlBits->0xf0, clicintattr->0xc7, clicintie->0x1, clicintip->0x1
|
||||||
}
|
}
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue