On Mon, Jul 29, 2024 at 5:52 PM LIU Zhiwei <zhiwei_...@linux.alibaba.com> wrote:
>
>
> On 2024/7/29 14:07, Alvin Che-Chia Chang(張哲嘉) wrote:
> > Hi Zhiwei,
> >
> >> -----Original Message-----
> >> From: LIU Zhiwei <zhiwei_...@linux.alibaba.com>
> >> Sent: Monday, July 29, 2024 1:47 PM
> >> To: Alvin Che-Chia Chang(張哲嘉) <alvi...@andestech.com>;
> >> qemu-ri...@nongnu.org; qemu-devel@nongnu.org
> >> Cc: alistair.fran...@wdc.com; bin.m...@windriver.com;
> >> liwei1...@gmail.com; dbarb...@ventanamicro.com
> >> Subject: Re: [PATCH] RISC-V: Remove riscv_cpu_claim_interrupts()
> >>
> >> [EXTERNAL MAIL]
> >>
> >> On 2024/7/27 12:27, Alvin Chang wrote:
> >>> The function of riscv_cpu_claim_interrupts() was introduced in commit
> >>> e3e7039 ("RISC-V: Allow interrupt controllers to claim interrupts") to
> >>> enforce hardware controlled of SEIP signal when there is an attached
> >>> external interrupt controller.
> >>>
> >>> In later RISC-V privileged specification version 1.10, SEIP became
> >>> software-writable, even if there is an attached external interrupt
> >>> controller. Thus, the commit 33fe584 ("target/riscv: Allow software
> >>> access to MIP SEIP") was introduced to remove that limitation, and it
> >>> also removed the usage of "miclaim" mask.
> >>>
> >>> It seems the function of riscv_cpu_claim_interrupts() is no longer used.
> >>> Therefore, we remove it in this commit.
> >> As MTIP/MSIP/MEIP in mip are still read-only fields in mip. I think we 
> >> should
> >> not remove it.
> > IIUC, riscv_cpu_claim_interrupts() was used to achieve exclusive control 
> > between external interrupt controller and software.
> It still  can be used as an exclusive check. For example, two interrupt
> controllers try to bind the same MEIP field.

Exactly, that's what riscv_cpu_claim_interrupts() is doing. It's
checking to ensure that multiple interrupt controllers don't bind to
the same MIP field.

So the function is still used.

I think we could debate if we need it or not. I do think it's probably
worth keeping as it doesn't really cost us anything and it might help
catch setup issues.

Alistair

> > It is not used to check the read-only fields such as MTIP/MSIP/MEIP in mip.
> Once it was.
> > Moreover, env->miclaim is no longer used in latest code.
> Yes, we don't need it any more. When you remove it,   upgrade the
> version number in machine.c is necessary.
> >
> >> Perhaps we should  add an assert for read-only fields for this function.
> > I agree. Maybe we can add relevant assertions for those fields in 
> > rmw_mip64() ?
>
> Just make them readable by adding a write mask for them.
>
> Thanks,
> Zhiwei
>
> >
> >
> > Best regards,
> > Alvin
> >
> >> Thanks,
> >> Zhiwei
> >>
> >>> Signed-off-by: Alvin Chang <alvi...@andestech.com>
> >>> ---
> >>>    hw/intc/riscv_aclint.c    | 20 --------------------
> >>>    hw/intc/riscv_aplic.c     | 11 -----------
> >>>    hw/intc/riscv_imsic.c     |  8 --------
> >>>    hw/intc/sifive_plic.c     | 15 ---------------
> >>>    target/riscv/cpu.c        |  1 -
> >>>    target/riscv/cpu.h        |  3 ---
> >>>    target/riscv/cpu_helper.c | 11 -----------
> >>>    target/riscv/machine.c    |  1 -
> >>>    8 files changed, 70 deletions(-)
> >>>
> >>> diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c index
> >>> e9f0536b1c..54cf69dada 100644
> >>> --- a/hw/intc/riscv_aclint.c
> >>> +++ b/hw/intc/riscv_aclint.c
> >>> @@ -280,7 +280,6 @@ static Property riscv_aclint_mtimer_properties[] = {
> >>>    static void riscv_aclint_mtimer_realize(DeviceState *dev, Error **errp)
> >>>    {
> >>>        RISCVAclintMTimerState *s = RISCV_ACLINT_MTIMER(dev);
> >>> -    int i;
> >>>
> >>>        memory_region_init_io(&s->mmio, OBJECT(dev),
> >> &riscv_aclint_mtimer_ops,
> >>>                              s, TYPE_RISCV_ACLINT_MTIMER,
> >>> s->aperture_size); @@ -291,14 +290,6 @@ static void
> >>> riscv_aclint_mtimer_realize(DeviceState *dev, Error **errp)
> >>>
> >>>        s->timers = g_new0(QEMUTimer *, s->num_harts);
> >>>        s->timecmp = g_new0(uint64_t, s->num_harts);
> >>> -    /* Claim timer interrupt bits */
> >>> -    for (i = 0; i < s->num_harts; i++) {
> >>> -        RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(s->hartid_base + i));
> >>> -        if (riscv_cpu_claim_interrupts(cpu, MIP_MTIP) < 0) {
> >>> -            error_report("MTIP already claimed");
> >>> -            exit(1);
> >>> -        }
> >>> -    }
> >>>    }
> >>>
> >>>    static void riscv_aclint_mtimer_reset_enter(Object *obj, ResetType
> >>> type) @@ -472,7 +463,6 @@ static Property riscv_aclint_swi_properties[] = 
> >>> {
> >>>    static void riscv_aclint_swi_realize(DeviceState *dev, Error **errp)
> >>>    {
> >>>        RISCVAclintSwiState *swi = RISCV_ACLINT_SWI(dev);
> >>> -    int i;
> >>>
> >>>        memory_region_init_io(&swi->mmio, OBJECT(dev),
> >> &riscv_aclint_swi_ops, swi,
> >>>                              TYPE_RISCV_ACLINT_SWI,
> >>> RISCV_ACLINT_SWI_SIZE); @@ -480,16 +470,6 @@ static void
> >>> riscv_aclint_swi_realize(DeviceState *dev, Error **errp)
> >>>
> >>>        swi->soft_irqs = g_new(qemu_irq, swi->num_harts);
> >>>        qdev_init_gpio_out(dev, swi->soft_irqs, swi->num_harts);
> >>> -
> >>> -    /* Claim software interrupt bits */
> >>> -    for (i = 0; i < swi->num_harts; i++) {
> >>> -        RISCVCPU *cpu = RISCV_CPU(qemu_get_cpu(swi->hartid_base +
> >> i));
> >>> -        /* We don't claim mip.SSIP because it is writable by software */
> >>> -        if (riscv_cpu_claim_interrupts(cpu, swi->sswi ? 0 : MIP_MSIP) < 
> >>> 0)
> >> {
> >>> -            error_report("MSIP already claimed");
> >>> -            exit(1);
> >>> -        }
> >>> -    }
> >>>    }
> >>>
> >>>    static void riscv_aclint_swi_reset_enter(Object *obj, ResetType
> >>> type) diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c index
> >>> 32edd6d07b..cde8337542 100644
> >>> --- a/hw/intc/riscv_aplic.c
> >>> +++ b/hw/intc/riscv_aplic.c
> >>> @@ -873,17 +873,6 @@ static void riscv_aplic_realize(DeviceState *dev,
> >> Error **errp)
> >>>        if (!aplic->msimode) {
> >>>            aplic->external_irqs = g_malloc(sizeof(qemu_irq) *
> >> aplic->num_harts);
> >>>            qdev_init_gpio_out(dev, aplic->external_irqs,
> >>> aplic->num_harts);
> >>> -
> >>> -        /* Claim the CPU interrupt to be triggered by this APLIC */
> >>> -        for (i = 0; i < aplic->num_harts; i++) {
> >>> -            RISCVCPU *cpu =
> >> RISCV_CPU(cpu_by_arch_id(aplic->hartid_base + i));
> >>> -            if (riscv_cpu_claim_interrupts(cpu,
> >>> -                (aplic->mmode) ? MIP_MEIP : MIP_SEIP) < 0) {
> >>> -                error_report("%s already claimed",
> >>> -                             (aplic->mmode) ? "MEIP" : "SEIP");
> >>> -                exit(1);
> >>> -            }
> >>> -        }
> >>>        }
> >>>
> >>>        msi_nonbroken = true;
> >>> diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c index
> >>> b90f0d731d..8c61a5f28b 100644
> >>> --- a/hw/intc/riscv_imsic.c
> >>> +++ b/hw/intc/riscv_imsic.c
> >>> @@ -347,14 +347,6 @@ static void riscv_imsic_realize(DeviceState *dev,
> >> Error **errp)
> >>>                              IMSIC_MMIO_SIZE(imsic->num_pages));
> >>>        sysbus_init_mmio(SYS_BUS_DEVICE(dev), &imsic->mmio);
> >>>
> >>> -    /* Claim the CPU interrupt to be triggered by this IMSIC */
> >>> -    if (riscv_cpu_claim_interrupts(rcpu,
> >>> -            (imsic->mmode) ? MIP_MEIP : MIP_SEIP) < 0) {
> >>> -        error_setg(errp, "%s already claimed",
> >>> -                   (imsic->mmode) ? "MEIP" : "SEIP");
> >>> -        return;
> >>> -    }
> >>> -
> >>>        /* Create output IRQ lines */
> >>>        imsic->external_irqs = g_malloc(sizeof(qemu_irq) *
> >> imsic->num_pages);
> >>>        qdev_init_gpio_out(dev, imsic->external_irqs, imsic->num_pages);
> >>> diff --git a/hw/intc/sifive_plic.c b/hw/intc/sifive_plic.c index
> >>> e559f11805..f0f3dcce1f 100644
> >>> --- a/hw/intc/sifive_plic.c
> >>> +++ b/hw/intc/sifive_plic.c
> >>> @@ -356,7 +356,6 @@ static void sifive_plic_irq_request(void *opaque, int
> >> irq, int level)
> >>>    static void sifive_plic_realize(DeviceState *dev, Error **errp)
> >>>    {
> >>>        SiFivePLICState *s = SIFIVE_PLIC(dev);
> >>> -    int i;
> >>>
> >>>        memory_region_init_io(&s->mmio, OBJECT(dev), &sifive_plic_ops, s,
> >>>                              TYPE_SIFIVE_PLIC, s->aperture_size); @@
> >>> -385,20 +384,6 @@ static void sifive_plic_realize(DeviceState *dev, Error
> >> **errp)
> >>>        s->m_external_irqs = g_malloc(sizeof(qemu_irq) * s->num_harts);
> >>>        qdev_init_gpio_out(dev, s->m_external_irqs, s->num_harts);
> >>>
> >>> -    /*
> >>> -     * We can't allow the supervisor to control SEIP as this would allow 
> >>> the
> >>> -     * supervisor to clear a pending external interrupt which will 
> >>> result in
> >>> -     * lost a interrupt in the case a PLIC is attached. The SEIP bit 
> >>> must be
> >>> -     * hardware controlled when a PLIC is attached.
> >>> -     */
> >>> -    for (i = 0; i < s->num_harts; i++) {
> >>> -        RISCVCPU *cpu = RISCV_CPU(qemu_get_cpu(s->hartid_base + i));
> >>> -        if (riscv_cpu_claim_interrupts(cpu, MIP_SEIP) < 0) {
> >>> -            error_setg(errp, "SEIP already claimed");
> >>> -            return;
> >>> -        }
> >>> -    }
> >>> -
> >>>        msi_nonbroken = true;
> >>>    }
> >>>
> >>> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index
> >>> a90808a3ba..19feb032d6 100644
> >>> --- a/target/riscv/cpu.c
> >>> +++ b/target/riscv/cpu.c
> >>> @@ -967,7 +967,6 @@ static void riscv_cpu_reset_hold(Object *obj,
> >> ResetType type)
> >>>            }
> >>>        }
> >>>        env->mcause = 0;
> >>> -    env->miclaim = MIP_SGEIP;
> >>>        env->pc = env->resetvec;
> >>>        env->bins = 0;
> >>>        env->two_stage_lookup = false;
> >>> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index
> >>> 1619c3acb6..6277979afd 100644
> >>> --- a/target/riscv/cpu.h
> >>> +++ b/target/riscv/cpu.h
> >>> @@ -258,8 +258,6 @@ struct CPUArchState {
> >>>        bool external_seip;
> >>>        bool software_seip;
> >>>
> >>> -    uint64_t miclaim;
> >>> -
> >>>        uint64_t mie;
> >>>        uint64_t mideleg;
> >>>
> >>> @@ -565,7 +563,6 @@ void riscv_cpu_do_transaction_failed(CPUState *cs,
> >> hwaddr physaddr,
> >>>    hwaddr riscv_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
> >>>    bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request);
> >>>    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); diff --git
> >>> a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index
> >>> 395a1d9140..bcafa55acd 100644
> >>> --- a/target/riscv/cpu_helper.c
> >>> +++ b/target/riscv/cpu_helper.c
> >>> @@ -619,17 +619,6 @@ void riscv_cpu_set_geilen(CPURISCVState *env,
> >> target_ulong geilen)
> >>>        env->geilen = geilen;
> >>>    }
> >>>
> >>> -int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint64_t interrupts) -{
> >>> -    CPURISCVState *env = &cpu->env;
> >>> -    if (env->miclaim & interrupts) {
> >>> -        return -1;
> >>> -    } else {
> >>> -        env->miclaim |= interrupts;
> >>> -        return 0;
> >>> -    }
> >>> -}
> >>> -
> >>>    void riscv_cpu_interrupt(CPURISCVState *env)
> >>>    {
> >>>        uint64_t gein, vsgein = 0, vstip = 0, irqf = 0; diff --git
> >>> a/target/riscv/machine.c b/target/riscv/machine.c index
> >>> 492c2c6d9d..0eabb6c076 100644
> >>> --- a/target/riscv/machine.c
> >>> +++ b/target/riscv/machine.c
> >>> @@ -378,7 +378,6 @@ const VMStateDescription vmstate_riscv_cpu = {
> >>>            VMSTATE_UINTTL(env.mhartid, RISCVCPU),
> >>>            VMSTATE_UINT64(env.mstatus, RISCVCPU),
> >>>            VMSTATE_UINT64(env.mip, RISCVCPU),
> >>> -        VMSTATE_UINT64(env.miclaim, RISCVCPU),
> >>>            VMSTATE_UINT64(env.mie, RISCVCPU),
> >>>            VMSTATE_UINT64(env.mvien, RISCVCPU),
> >>>            VMSTATE_UINT64(env.mvip, RISCVCPU),
> > CONFIDENTIALITY NOTICE:
> >
> > This e-mail (and its attachments) may contain confidential and legally 
> > privileged information or information protected from disclosure. If you are 
> > not the intended recipient, you are hereby notified that any disclosure, 
> > copying, distribution, or use of the information contained herein is 
> > strictly prohibited. In this case, please immediately notify the sender by 
> > return e-mail, delete the message (and any accompanying documents) and 
> > destroy all printed hard copies. Thank you for your cooperation.
> >
> > Copyright ANDES TECHNOLOGY CORPORATION - All Rights Reserved.
>

Reply via email to