On Wed, Jun 3, 2026 at 5:04 PM Joel Stanley <[email protected]> wrote: > > 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. > > Signed-off-by: Joel Stanley <[email protected]>
With a `uint32_t` Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > hw/riscv/aia.h | 1 + > hw/riscv/aia.c | 3 ++- > hw/riscv/virt.c | 1 + > 3 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h > index 5ad0a902be0d..452e78b9d7ad 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, > + hwaddr m_imsic_stride, > uint16_t num_sources, > const MemMapEntry *aplic_m, > const MemMapEntry *aplic_s, > diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c > index 82ea9d48ea75..840f84d26b98 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, > + hwaddr 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/virt.c b/hw/riscv/virt.c > index 4cd941a6aac6..529bb2fc0132 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -1549,6 +1549,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], > -- > 2.47.3 > >
