Hi Cedric > Subject: Re: [PATCH v5 03/29] hw/intc/aspeed: Introduce dynamic allocation > for regs array > > On 3/6/25 11:38, Jamin Lin wrote: > > Currently, the size of the "regs" array is 0x2000, which is too large. > > To save code size and avoid mapping large unused gaps, will update it > > to only map the useful set of registers. This update will support > > multiple sub-regions with different sizes. > > > > To address the redundant size issue, replace the static "regs" array > > with a dynamically allocated "regs" memory. > > > > Introduce a new "aspeed_intc_unrealize" function to free the allocated > > "regs" > > memory. > > > > Signed-off-by: Jamin Lin <jamin_...@aspeedtech.com> > > --- > > include/hw/intc/aspeed_intc.h | 2 +- > > hw/intc/aspeed_intc.c | 12 +++++++++++- > > 2 files changed, 12 insertions(+), 2 deletions(-) > > > > diff --git a/include/hw/intc/aspeed_intc.h > > b/include/hw/intc/aspeed_intc.h index 03324f05ab..47ea0520b5 100644 > > --- a/include/hw/intc/aspeed_intc.h > > +++ b/include/hw/intc/aspeed_intc.h > > @@ -27,7 +27,7 @@ struct AspeedINTCState { > > MemoryRegion iomem; > > MemoryRegion iomem_container; > > > > - uint32_t regs[ASPEED_INTC_NR_REGS]; > > + uint32_t *regs; > > OrIRQState orgates[ASPEED_INTC_NR_INTS]; > > qemu_irq output_pins[ASPEED_INTC_NR_INTS]; > > > > diff --git a/hw/intc/aspeed_intc.c b/hw/intc/aspeed_intc.c index > > 465f41e4fd..feb2c52441 100644 > > --- a/hw/intc/aspeed_intc.c > > +++ b/hw/intc/aspeed_intc.c > > @@ -289,7 +289,7 @@ static void aspeed_intc_reset(DeviceState *dev) > > { > > AspeedINTCState *s = ASPEED_INTC(dev); > > > > - memset(s->regs, 0, sizeof(s->regs)); > > + memset(s->regs, 0, ASPEED_INTC_NR_REGS); > > this is not the same size. s->regs is larger than ASPEED_INTC_NR_REGS. Will fix it. > > > memset(s->enable, 0, sizeof(s->enable)); > > memset(s->mask, 0, sizeof(s->mask)); > > memset(s->pending, 0, sizeof(s->pending)); @@ -307,6 +307,7 @@ > > static void aspeed_intc_realize(DeviceState *dev, Error **errp) > > > > sysbus_init_mmio(sbd, &s->iomem_container); > > > > + s->regs = g_malloc0(ASPEED_INTC_NR_REGS); > > please use g_new(....)
Will do Thanks for review and suggestion. Jamin > > > Thanks, > > C. > > > > memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_intc_ops, > s, > > TYPE_ASPEED_INTC ".regs", > > ASPEED_INTC_NR_REGS << 2); > > > > @@ -322,12 +323,21 @@ static void aspeed_intc_realize(DeviceState *dev, > Error **errp) > > } > > } > > > > +static void aspeed_intc_unrealize(DeviceState *dev) { > > + AspeedINTCState *s = ASPEED_INTC(dev); > > + > > + g_free(s->regs); > > + s->regs = NULL; > > +} > > + > > static void aspeed_intc_class_init(ObjectClass *klass, void *data) > > { > > DeviceClass *dc = DEVICE_CLASS(klass); > > > > dc->desc = "ASPEED INTC Controller"; > > dc->realize = aspeed_intc_realize; > > + dc->unrealize = aspeed_intc_unrealize; > > device_class_set_legacy_reset(dc, aspeed_intc_reset); > > dc->vmsd = NULL; > > }