On Thu, Jun 4, 2026 at 6:14 PM Qingwei Hu <[email protected]> wrote: > > Each RISC-V MADT RINTC entry contains an External Interrupt Controller > ID field. On the virt machine without AIA, this field identifies the > S-mode PLIC context associated with the hart. > > TCG virt has both M-mode and S-mode PLIC contexts, so the S-mode context > ID is odd and 2 * local_cpu_id + 1 is correct. KVM virt exposes only > S-mode PLIC contexts, and those contexts are numbered contiguously from > 0. Reporting the TCG context ID for KVM makes the guest enable a > different PLIC context from the one used by QEMU. > > With ACPI enabled, this can leave PCI INTx interrupts pending in QEMU > while the guest-programmed PLIC context remains disabled. A virtio-blk > root disk can then stall during boot because its first interrupt is never > delivered. > > Use local_cpu_id for KVM and keep the existing odd S-mode context ID for > TCG. > > Fixes: d641da6ed43 ("hw/riscv/virt-acpi-build.c: Add PLIC in MADT") > Signed-off-by: Qingwei Hu <[email protected]> > --- > hw/riscv/virt-acpi-build.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c > index 413d47d70e..6b06d9aa87 100644 > --- a/hw/riscv/virt-acpi-build.c > +++ b/hw/riscv/virt-acpi-build.c > @@ -100,6 +100,8 @@ static void riscv_acpi_madt_add_rintc(uint32_t uid, > build_append_int_noprefix(entry, > ACPI_BUILD_INTC_ID( > arch_ids->cpus[uid].props.node_id, > + kvm_enabled() ? > + local_cpu_id : > 2 * local_cpu_id + 1), > 4); > } else { > -- > LGTM.
Reviewed-by: Sunil V L <[email protected]>
