include/hw/intc/riscv_imsic.h | 3 ++-
hw/intc/riscv_imsic.c | 6 ++++--
hw/riscv/aia.c | 6 ++++--
hw/riscv/xiangshan_kmh.c | 5 +++--
4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/include/hw/intc/riscv_imsic.h b/include/hw/intc/riscv_imsic.h
index fae999731dff..8295b1f14452 100644
--- a/include/hw/intc/riscv_imsic.h
+++ b/include/hw/intc/riscv_imsic.h
@@ -62,7 +62,8 @@ struct RISCVIMSICState {
uint32_t num_irqs;
};
-DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
+DeviceState *riscv_imsic_create(MemoryRegion *mr, hwaddr addr,
+ uint32_t hartid, bool mmode,
uint32_t num_pages, uint32_t num_ids);
#endif
diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c
index d6b46cdca220..26dd10a0462c 100644
--- a/hw/intc/riscv_imsic.c
+++ b/hw/intc/riscv_imsic.c
@@ -495,7 +495,8 @@ type_init(riscv_imsic_register_types)
/*
* Create IMSIC device.
*/
-DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
+DeviceState *riscv_imsic_create(MemoryRegion *mr, hwaddr addr,
+ uint32_t hartid, bool mmode,
uint32_t num_pages, uint32_t num_ids)
{
DeviceState *dev = qdev_new(TYPE_RISCV_IMSIC);
@@ -518,7 +519,8 @@ DeviceState *riscv_imsic_create(hwaddr addr, uint32_t
hartid, bool mmode,
qdev_prop_set_uint32(dev, "num-irqs", num_ids + 1);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
- sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
+ memory_region_add_subregion(mr, addr,
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
if (!kvm_irqchip_in_kernel()) {
for (i = 0; i < num_pages; i++) {
diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c
index 651552c8f970..49cb14349f00 100644
--- a/hw/riscv/aia.c
+++ b/hw/riscv/aia.c
@@ -52,7 +52,8 @@ DeviceState *riscv_create_aia(MemoryRegion *mr, 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 * m_imsic_stride,
+ riscv_imsic_create(mr,
+ addr + i * m_imsic_stride,
base_hartid + i, true, 1,
num_msis);
}
@@ -61,7 +62,8 @@ DeviceState *riscv_create_aia(MemoryRegion *mr, bool msimode,
int aia_guests,
/* Per-socket S-level IMSICs */
addr = imsic_s->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_SHIFT);
for (i = 0; i < hart_count; i++) {
- riscv_imsic_create(addr + i * s_imsic_stride,
+ riscv_imsic_create(mr,
+ addr + i * s_imsic_stride,
base_hartid + i, false, 1 + aia_guests,
num_msis);
}
diff --git a/hw/riscv/xiangshan_kmh.c b/hw/riscv/xiangshan_kmh.c
index 94f9d02a00b9..9eb608f8c578 100644
--- a/hw/riscv/xiangshan_kmh.c
+++ b/hw/riscv/xiangshan_kmh.c
@@ -65,14 +65,15 @@ static DeviceState *xiangshan_kmh_create_aia(uint32_t
num_harts)
/* M-level IMSICs */
addr = memmap[XIANGSHAN_KMH_IMSIC_M].base;
for (i = 0; i < num_harts; i++) {
- riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0), i, true,
+ riscv_imsic_create(get_system_memory(),
+ addr + i * IMSIC_HART_SIZE(0), i, true,
1, XIANGSHAN_KMH_IMSIC_NUM_IDS);
}
/* S-level IMSICs */
addr = memmap[XIANGSHAN_KMH_IMSIC_S].base;
for (i = 0; i < num_harts; i++) {
- riscv_imsic_create(addr +
+ riscv_imsic_create(get_system_memory(), addr +
i *
IMSIC_HART_SIZE(XIANGSHAN_KMH_IMSIC_GUEST_BITS),
i, false, 1 + XIANGSHAN_KMH_IMSIC_GUEST_BITS,
XIANGSHAN_KMH_IMSIC_NUM_IDS);