mirror of https://github.com/xemu-project/xemu.git
hw/intc: ibex_plic: Honour source priorities
This patch follows what commit aa4d30f661
"riscv: plic: Honour source
priorities" does and ensures that the highest priority interrupt will be
serviced first.
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Cc: Jessica Clarke <jrtc27@jrtc27.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <a697ca8a31eff8eb18a88e09a28206063cf85d48.1595655188.git.alistair.francis@wdc.com>
This commit is contained in:
parent
224914069d
commit
01c41d15de
|
@ -57,6 +57,8 @@ static void ibex_plic_irqs_set_pending(IbexPlicState *s, int irq, bool level)
|
||||||
static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
|
static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
uint32_t max_irq = 0;
|
||||||
|
uint32_t max_prio = s->threshold;
|
||||||
|
|
||||||
for (i = 0; i < s->pending_num; i++) {
|
for (i = 0; i < s->pending_num; i++) {
|
||||||
uint32_t irq_num = ctz64(s->pending[i]) + (i * 32);
|
uint32_t irq_num = ctz64(s->pending[i]) + (i * 32);
|
||||||
|
@ -66,14 +68,17 @@ static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->priority[irq_num] > s->threshold) {
|
if (s->priority[irq_num] > max_prio) {
|
||||||
if (!s->claim) {
|
max_irq = irq_num;
|
||||||
s->claim = irq_num;
|
max_prio = s->priority[irq_num];
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (max_irq) {
|
||||||
|
s->claim = max_irq;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue