mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
target/riscv: Allow software access to MIP SEIP
The RISC-V specification states that: "Supervisor-level external interrupts are made pending based on the logical-OR of the software-writable SEIP bit and the signal from the external interrupt controller." We currently only allow either the interrupt controller or software to set the bit, which is incorrect. This patch removes the miclaim mask when writing MIP to allow M-mode software to inject interrupts, even with an interrupt controller. We then also need to keep track of which source is setting MIP_SEIP. The final value is a OR of both, so we add two bools and use that to keep track of the current state. This way either source can change without losing the correct value. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/904 Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220317061817.3856850-3-alistair.francis@opensource.wdc.com>
This commit is contained in:
parent
8b5c807bc0
commit
33fe584f70
3 changed files with 23 additions and 3 deletions
|
@ -708,7 +708,6 @@ static void riscv_cpu_set_irq(void *opaque, int irq, int level)
|
|||
case IRQ_VS_TIMER:
|
||||
case IRQ_M_TIMER:
|
||||
case IRQ_U_EXT:
|
||||
case IRQ_S_EXT:
|
||||
case IRQ_VS_EXT:
|
||||
case IRQ_M_EXT:
|
||||
if (kvm_enabled()) {
|
||||
|
@ -717,6 +716,15 @@ static void riscv_cpu_set_irq(void *opaque, int irq, int level)
|
|||
riscv_cpu_update_mip(cpu, 1 << irq, BOOL_TO_MASK(level));
|
||||
}
|
||||
break;
|
||||
case IRQ_S_EXT:
|
||||
if (kvm_enabled()) {
|
||||
kvm_riscv_set_irq(cpu, irq, level);
|
||||
} else {
|
||||
env->external_seip = level;
|
||||
riscv_cpu_update_mip(cpu, 1 << irq,
|
||||
BOOL_TO_MASK(level | env->software_seip));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue