On 3/6/26 08:58, Joel Stanley 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]>
---
  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,

hw/riscv/virt-acpi-build.c:74:    uint64_t imsic_socket_addr, imsic_addr;
hw/riscv/virt.c:532: uint32_t imsic_max_hart_per_socket, imsic_addr, imsic_size; target/riscv/kvm/kvm-cpu.c:1829: uint64_t socket, base_hart, hart_count, socket_imsic_base, imsic_addr;

Why choose hwaddr for a stride (region size)?

Using uint64_t:
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>

                               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],



Reply via email to