* [PATCH 0/2] target/riscv: Allow software access to MIP SEIP @ 2022-03-15 6:40 Alistair Francis 2022-03-15 6:40 ` [PATCH 1/2] target/riscv: cpu: Fixup indentation Alistair Francis 2022-03-15 6:40 ` [PATCH 2/2] target/riscv: Allow software access to MIP SEIP Alistair Francis 0 siblings, 2 replies; 6+ messages in thread From: Alistair Francis @ 2022-03-15 6:40 UTC (permalink / raw) To: qemu-devel, qemu-riscv Cc: Palmer Dabbelt, alistair23, Bin Meng, bmeng.cn, Alistair Francis From: Alistair Francis <alistair.francis@wdc.com> 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 loosing the correct value. This fixes: https://gitlab.com/qemu-project/qemu/-/issues/904 Alistair Francis (2): target/riscv: cpu: Fixup indentation target/riscv: Allow software access to MIP SEIP target/riscv/cpu.h | 8 ++++++++ target/riscv/cpu.c | 16 ++++++++++++---- target/riscv/csr.c | 8 ++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) -- 2.35.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] target/riscv: cpu: Fixup indentation 2022-03-15 6:40 [PATCH 0/2] target/riscv: Allow software access to MIP SEIP Alistair Francis @ 2022-03-15 6:40 ` Alistair Francis 2022-03-15 7:29 ` Bin Meng 2022-03-15 14:59 ` Weiwei Li 2022-03-15 6:40 ` [PATCH 2/2] target/riscv: Allow software access to MIP SEIP Alistair Francis 1 sibling, 2 replies; 6+ messages in thread From: Alistair Francis @ 2022-03-15 6:40 UTC (permalink / raw) To: qemu-devel, qemu-riscv Cc: Palmer Dabbelt, alistair23, Bin Meng, bmeng.cn, Alistair Francis From: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com> --- target/riscv/cpu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index ddda4906ff..a4120c7fb4 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -709,11 +709,11 @@ static void riscv_cpu_set_irq(void *opaque, int irq, int level) case IRQ_S_EXT: case IRQ_VS_EXT: case IRQ_M_EXT: - if (kvm_enabled()) { + if (kvm_enabled()) { kvm_riscv_set_irq(cpu, irq, level); - } else { + } else { riscv_cpu_update_mip(cpu, 1 << irq, BOOL_TO_MASK(level)); - } + } break; default: g_assert_not_reached(); -- 2.35.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] target/riscv: cpu: Fixup indentation 2022-03-15 6:40 ` [PATCH 1/2] target/riscv: cpu: Fixup indentation Alistair Francis @ 2022-03-15 7:29 ` Bin Meng 2022-03-15 14:59 ` Weiwei Li 1 sibling, 0 replies; 6+ messages in thread From: Bin Meng @ 2022-03-15 7:29 UTC (permalink / raw) To: Alistair Francis Cc: open list:RISC-V, Bin Meng, qemu-devel@nongnu.org Developers, Palmer Dabbelt, Alistair Francis, Alistair Francis On Tue, Mar 15, 2022 at 2:40 PM Alistair Francis <alistair.francis@opensource.wdc.com> wrote: > > From: Alistair Francis <alistair.francis@wdc.com> > > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > --- > target/riscv/cpu.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > Reviewed-by: Bin Meng <bmeng.cn@gmail.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] target/riscv: cpu: Fixup indentation 2022-03-15 6:40 ` [PATCH 1/2] target/riscv: cpu: Fixup indentation Alistair Francis 2022-03-15 7:29 ` Bin Meng @ 2022-03-15 14:59 ` Weiwei Li 1 sibling, 0 replies; 6+ messages in thread From: Weiwei Li @ 2022-03-15 14:59 UTC (permalink / raw) To: Alistair Francis, qemu-devel, qemu-riscv Cc: alistair23, Alistair Francis, Bin Meng, Palmer Dabbelt, bmeng.cn [-- Attachment #1: Type: text/plain, Size: 1344 bytes --] Hi Alistair, It seems that there is other indentation problem in cpu.c. Maybe they can be fixed together. /* Do some ISA extension error checking */ if(cpu->cfg.ext_i&& cpu->cfg.ext_e) { error_setg(errp, "I and E extensions are incompatible"); return; } if(!cpu->cfg.ext_i&& !cpu->cfg.ext_e) { error_setg(errp, "Either I or E extension must be set"); return; } Regards, Weiwei Li 在 2022/3/15 下午2:40, Alistair Francis 写道: > From: Alistair Francis <alistair.francis@wdc.com> > > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > --- > target/riscv/cpu.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index ddda4906ff..a4120c7fb4 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -709,11 +709,11 @@ static void riscv_cpu_set_irq(void *opaque, int irq, int level) > case IRQ_S_EXT: > case IRQ_VS_EXT: > case IRQ_M_EXT: > - if (kvm_enabled()) { > + if (kvm_enabled()) { > kvm_riscv_set_irq(cpu, irq, level); > - } else { > + } else { > riscv_cpu_update_mip(cpu, 1 << irq, BOOL_TO_MASK(level)); > - } > + } > break; > default: > g_assert_not_reached(); [-- Attachment #2: Type: text/html, Size: 4733 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] target/riscv: Allow software access to MIP SEIP 2022-03-15 6:40 [PATCH 0/2] target/riscv: Allow software access to MIP SEIP Alistair Francis 2022-03-15 6:40 ` [PATCH 1/2] target/riscv: cpu: Fixup indentation Alistair Francis @ 2022-03-15 6:40 ` Alistair Francis 2022-03-15 8:51 ` Bin Meng 1 sibling, 1 reply; 6+ messages in thread From: Alistair Francis @ 2022-03-15 6:40 UTC (permalink / raw) To: qemu-devel, qemu-riscv Cc: Palmer Dabbelt, alistair23, Bin Meng, bmeng.cn, Alistair Francis From: Alistair Francis <alistair.francis@wdc.com> 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 loosing the correct value. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/904 Signed-off-by: Alistair Francis <alistair.francis@wdc.com> --- target/riscv/cpu.h | 8 ++++++++ target/riscv/cpu.c | 10 +++++++++- target/riscv/csr.c | 8 ++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index c069fe85fa..05d40f8dbd 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -173,6 +173,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; diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index a4120c7fb4..0bd19e16a2 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -706,7 +706,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()) { @@ -715,6 +714,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(); } diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 0606cd0ea8..48e78cf91e 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1403,10 +1403,14 @@ static RISCVException rmw_mip64(CPURISCVState *env, int csrno, uint64_t new_val, uint64_t wr_mask) { RISCVCPU *cpu = env_archcpu(env); - /* Allow software control of delegable interrupts not claimed by hardware */ - uint64_t old_mip, mask = wr_mask & delegable_ints & ~env->miclaim; + uint64_t old_mip, mask = wr_mask & delegable_ints; uint32_t gin; + if (mask & MIP_SEIP) { + env->software_seip = new_val & MIP_SEIP; + } + new_val |= env->external_seip << IRQ_S_EXT; + if (mask) { old_mip = riscv_cpu_update_mip(cpu, mask, (new_val & mask)); } else { -- 2.35.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] target/riscv: Allow software access to MIP SEIP 2022-03-15 6:40 ` [PATCH 2/2] target/riscv: Allow software access to MIP SEIP Alistair Francis @ 2022-03-15 8:51 ` Bin Meng 0 siblings, 0 replies; 6+ messages in thread From: Bin Meng @ 2022-03-15 8:51 UTC (permalink / raw) To: Alistair Francis Cc: open list:RISC-V, Bin Meng, qemu-devel@nongnu.org Developers, Palmer Dabbelt, Alistair Francis, Alistair Francis On Tue, Mar 15, 2022 at 2:40 PM Alistair Francis <alistair.francis@opensource.wdc.com> wrote: > > From: Alistair Francis <alistair.francis@wdc.com> > > 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 > loosing the correct value. losing? > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/904 > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > --- > target/riscv/cpu.h | 8 ++++++++ > target/riscv/cpu.c | 10 +++++++++- > target/riscv/csr.c | 8 ++++++-- > 3 files changed, 23 insertions(+), 3 deletions(-) > Reviewed-by: Bin Meng <bmeng.cn@gmail.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-03-15 15:02 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-03-15 6:40 [PATCH 0/2] target/riscv: Allow software access to MIP SEIP Alistair Francis 2022-03-15 6:40 ` [PATCH 1/2] target/riscv: cpu: Fixup indentation Alistair Francis 2022-03-15 7:29 ` Bin Meng 2022-03-15 14:59 ` Weiwei Li 2022-03-15 6:40 ` [PATCH 2/2] target/riscv: Allow software access to MIP SEIP Alistair Francis 2022-03-15 8:51 ` Bin Meng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).