On Sat, May 27, 2023 at 2:24 AM Rajnesh Kanwal <rkan...@rivosinc.com> wrote: > > This is to allow virtual interrupts to be inserted into S and VS > modes. Given virtual interrupts will be maintained in separate > mvip and hvip CSRs, riscv_cpu_update_mip will no longer be in the > path and interrupts need to be triggered for these cases from > rmw_hvip64 and rmw_mvip64 functions. > > Signed-off-by: Rajnesh Kanwal <rkan...@rivosinc.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/cpu.h | 1 + > target/riscv/cpu_helper.c | 25 ++++++++++++++++++------- > 2 files changed, 19 insertions(+), 7 deletions(-) > > diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h > index de7e43126a..de55bfb775 100644 > --- a/target/riscv/cpu.h > +++ b/target/riscv/cpu.h > @@ -562,6 +562,7 @@ void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env); > int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint64_t interrupts); > uint64_t riscv_cpu_update_mip(CPURISCVState *env, uint64_t mask, > uint64_t value); > +void riscv_cpu_interrupt(CPURISCVState *env); > #define BOOL_TO_MASK(x) (-!!(x)) /* helper for riscv_cpu_update_mip value */ > void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(void *), > void *arg); > diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c > index b25ee179e9..c79ec4db76 100644 > --- a/target/riscv/cpu_helper.c > +++ b/target/riscv/cpu_helper.c > @@ -609,11 +609,12 @@ int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint64_t > interrupts) > } > } > > -uint64_t riscv_cpu_update_mip(CPURISCVState *env, uint64_t mask, > - uint64_t value) > +void riscv_cpu_interrupt(CPURISCVState *env) > { > + uint64_t gein, vsgein = 0, vstip = 0; > CPUState *cs = env_cpu(env); > - uint64_t gein, vsgein = 0, vstip = 0, old = env->mip; > + > + QEMU_IOTHREAD_LOCK_GUARD(); > > if (env->virt_enabled) { > gein = get_field(env->hstatus, HSTATUS_VGEIN); > @@ -622,15 +623,25 @@ uint64_t riscv_cpu_update_mip(CPURISCVState *env, > uint64_t mask, > > vstip = env->vstime_irq ? MIP_VSTIP : 0; > > - QEMU_IOTHREAD_LOCK_GUARD(); > - > - env->mip = (env->mip & ~mask) | (value & mask); > - > if (env->mip | vsgein | vstip) { > cpu_interrupt(cs, CPU_INTERRUPT_HARD); > } else { > cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); > } > +} > + > +uint64_t riscv_cpu_update_mip(CPURISCVState *env, uint64_t mask, uint64_t > value) > +{ > + uint64_t old = env->mip; > + > + /* No need to update mip for VSTIP */ > + mask = ((mask == MIP_VSTIP) && env->vstime_irq) ? 0 : mask; > + > + QEMU_IOTHREAD_LOCK_GUARD(); > + > + env->mip = (env->mip & ~mask) | (value & mask); > + > + riscv_cpu_interrupt(env); > > return old; > } > -- > 2.25.1 > >