diff options
author | Alistair Francis <alistair.francis@wdc.com> | 2022-03-17 16:18:17 +1000 |
---|---|---|
committer | Alistair Francis <alistair.francis@wdc.com> | 2022-04-22 10:35:16 +1000 |
commit | 33fe584f7026bfaa13bb8a943f85c879e06bbdc6 (patch) | |
tree | 7faea1a6b23444c9a72a726da833cd251d4f994a /target/riscv/cpu.h | |
parent | 8b5c807bc07f8def162cbe7689eb1da4e80186ad (diff) | |
download | qemu-33fe584f7026bfaa13bb8a943f85c879e06bbdc6.zip qemu-33fe584f7026bfaa13bb8a943f85c879e06bbdc6.tar.gz qemu-33fe584f7026bfaa13bb8a943f85c879e06bbdc6.tar.bz2 |
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>
Diffstat (limited to 'target/riscv/cpu.h')
-rw-r--r-- | target/riscv/cpu.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index e129c3d..b90ca82 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -177,6 +177,14 @@ struct CPUArchState { uint64_t mstatus; uint64_t mip; + /* + * MIP contains the software writable version of SEIP ORed with the + * external interrupt value. The MIP register is always up-to-date. + * To keep track of the current source, we also save booleans of the values + * here. + */ + bool external_seip; + bool software_seip; uint64_t miclaim; |