Commit 992d918d01 for qemu.org

commit 992d918d012018eb20a25a3b2e736d247f67509c
Author: Joel Stanley <joel@jms.id.au>
Date:   Tue Jun 30 12:19:43 2026 +0930

    hw/riscv/aia: Configure stride for the M-mode IMSIC

    riscv_create_aia() currently hard-codes the M-IMSIC at one 4 KiB page
    per hart and gives callers no way to widen it.

    Add an m_imsic_stride parameter that supplies the per hart byte
    stride directly. The virt machine passes IMSIC_HART_SIZE(0)
    (= 4 KiB), preserving its existing compact layout.

    The parameter only changes how the slots are spaced, with the rest of
    each slot reserved. This allows future platforms that have different
    layouts to control the stride.

    Reviewed-by: Philippe Mathieu-Daudé <philmd@mailo.com>
    Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Message-ID: <20260630024952.1520546-6-joel@jms.id.au>
    Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c
index 82ea9d48ea..ed89160029 100644
--- a/hw/riscv/aia.c
+++ b/hw/riscv/aia.c
@@ -25,6 +25,7 @@ uint32_t imsic_num_bits(uint32_t count)
 }

 DeviceState *riscv_create_aia(bool msimode, int aia_guests,
+                             uint32_t m_imsic_stride,
                              uint16_t num_sources,
                              const MemMapEntry *aplic_m,
                              const MemMapEntry *aplic_s,
@@ -47,7 +48,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guests,
             /* Per-socket M-level IMSICs */
             addr = imsic_m->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_SHIFT);
             for (i = 0; i < hart_count; i++) {
-                riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
+                riscv_imsic_create(addr + i * m_imsic_stride,
                                    base_hartid + i, true, 1,
                                    num_msis);
             }
diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h
index 5ad0a902be..565f91accc 100644
--- a/hw/riscv/aia.h
+++ b/hw/riscv/aia.h
@@ -14,6 +14,7 @@
 uint32_t imsic_num_bits(uint32_t count);

 DeviceState *riscv_create_aia(bool msimode, int aia_guests,
+                             uint32_t m_imsic_stride,
                              uint16_t num_sources,
                              const MemMapEntry *aplic_m,
                              const MemMapEntry *aplic_s,
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 8f80c0607b..b68067cfdd 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1401,6 +1401,7 @@ static void virt_machine_init(MachineState *machine)
         } else {
             s->irqchip[i] = riscv_create_aia(s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC,
                                              s->aia_guests,
+                                             IMSIC_HART_SIZE(0),
                                              s->num_sources,
                                              &s->memmap[VIRT_APLIC_M],
                                              &s->memmap[VIRT_APLIC_S],