mirror of https://github.com/xemu-project/xemu.git
hw/intc: sifive_plic: Cleanup the read function
Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Message-Id: <20220105213937.1113508-4-alistair.francis@opensource.wdc.com>
This commit is contained in:
parent
fb926d57cc
commit
b79e1c76c0
|
@ -199,70 +199,37 @@ static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
{
|
{
|
||||||
SiFivePLICState *plic = opaque;
|
SiFivePLICState *plic = opaque;
|
||||||
|
|
||||||
/* writes must be 4 byte words */
|
if (addr_between(addr, plic->priority_base, plic->num_sources << 2)) {
|
||||||
if ((addr & 0x3) != 0) {
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addr >= plic->priority_base && /* 4 bytes per source */
|
|
||||||
addr < plic->priority_base + (plic->num_sources << 2))
|
|
||||||
{
|
|
||||||
uint32_t irq = ((addr - plic->priority_base) >> 2) + 1;
|
uint32_t irq = ((addr - plic->priority_base) >> 2) + 1;
|
||||||
if (RISCV_DEBUG_PLIC) {
|
|
||||||
qemu_log("plic: read priority: irq=%d priority=%d\n",
|
|
||||||
irq, plic->source_priority[irq]);
|
|
||||||
}
|
|
||||||
return plic->source_priority[irq];
|
return plic->source_priority[irq];
|
||||||
} else if (addr >= plic->pending_base && /* 1 bit per source */
|
} else if (addr_between(addr, plic->pending_base, plic->num_sources >> 3)) {
|
||||||
addr < plic->pending_base + (plic->num_sources >> 3))
|
|
||||||
{
|
|
||||||
uint32_t word = (addr - plic->pending_base) >> 2;
|
uint32_t word = (addr - plic->pending_base) >> 2;
|
||||||
if (RISCV_DEBUG_PLIC) {
|
|
||||||
qemu_log("plic: read pending: word=%d value=%d\n",
|
|
||||||
word, plic->pending[word]);
|
|
||||||
}
|
|
||||||
return plic->pending[word];
|
return plic->pending[word];
|
||||||
} else if (addr >= plic->enable_base && /* 1 bit per source */
|
} else if (addr_between(addr, plic->enable_base,
|
||||||
addr < plic->enable_base + plic->num_addrs * plic->enable_stride)
|
plic->num_addrs * plic->enable_stride)) {
|
||||||
{
|
|
||||||
uint32_t addrid = (addr - plic->enable_base) / plic->enable_stride;
|
uint32_t addrid = (addr - plic->enable_base) / plic->enable_stride;
|
||||||
uint32_t wordid = (addr & (plic->enable_stride - 1)) >> 2;
|
uint32_t wordid = (addr & (plic->enable_stride - 1)) >> 2;
|
||||||
|
|
||||||
if (wordid < plic->bitfield_words) {
|
if (wordid < plic->bitfield_words) {
|
||||||
if (RISCV_DEBUG_PLIC) {
|
|
||||||
qemu_log("plic: read enable: hart%d-%c word=%d value=%x\n",
|
|
||||||
plic->addr_config[addrid].hartid,
|
|
||||||
mode_to_char(plic->addr_config[addrid].mode), wordid,
|
|
||||||
plic->enable[addrid * plic->bitfield_words + wordid]);
|
|
||||||
}
|
|
||||||
return plic->enable[addrid * plic->bitfield_words + wordid];
|
return plic->enable[addrid * plic->bitfield_words + wordid];
|
||||||
}
|
}
|
||||||
} else if (addr >= plic->context_base && /* 1 bit per source */
|
} else if (addr_between(addr, plic->context_base,
|
||||||
addr < plic->context_base + plic->num_addrs * plic->context_stride)
|
plic->num_addrs * plic->context_stride)) {
|
||||||
{
|
|
||||||
uint32_t addrid = (addr - plic->context_base) / plic->context_stride;
|
uint32_t addrid = (addr - plic->context_base) / plic->context_stride;
|
||||||
uint32_t contextid = (addr & (plic->context_stride - 1));
|
uint32_t contextid = (addr & (plic->context_stride - 1));
|
||||||
|
|
||||||
if (contextid == 0) {
|
if (contextid == 0) {
|
||||||
if (RISCV_DEBUG_PLIC) {
|
|
||||||
qemu_log("plic: read priority: hart%d-%c priority=%x\n",
|
|
||||||
plic->addr_config[addrid].hartid,
|
|
||||||
mode_to_char(plic->addr_config[addrid].mode),
|
|
||||||
plic->target_priority[addrid]);
|
|
||||||
}
|
|
||||||
return plic->target_priority[addrid];
|
return plic->target_priority[addrid];
|
||||||
} else if (contextid == 4) {
|
} else if (contextid == 4) {
|
||||||
uint32_t value = sifive_plic_claim(plic, addrid);
|
uint32_t value = sifive_plic_claim(plic, addrid);
|
||||||
if (RISCV_DEBUG_PLIC) {
|
|
||||||
qemu_log("plic: read claim: hart%d-%c irq=%x\n",
|
|
||||||
plic->addr_config[addrid].hartid,
|
|
||||||
mode_to_char(plic->addr_config[addrid].mode),
|
|
||||||
value);
|
|
||||||
}
|
|
||||||
sifive_plic_update(plic);
|
sifive_plic_update(plic);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err:
|
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
"%s: Invalid register read 0x%" HWADDR_PRIx "\n",
|
"%s: Invalid register read 0x%" HWADDR_PRIx "\n",
|
||||||
__func__, addr);
|
__func__, addr);
|
||||||
|
|
Loading…
Reference in New Issue