On 25/08/10 12:26PM, Aditya Gupta wrote: > > <...snip...> > > About the error, seems xive2 always expecting powernv10 chip, I will > have to rethink how should I use the same xive2 for powernv11. >
There's a type cast to Pnv10Chip in 'pnv_xive2_get_remote'. The cast is only temporarily used to get the 'PnvXive2' object in the Pnv10Chip. It's the only place in hw/intc/pnv_xive2.c assuming Pnv10Chip object. Thinking to have a helper function to just return the 'PnvXive2' object inside the chip, given a 'PnvChip'. Or the below change where we are adding another pointer in PnvChipClass: diff --git a/hw/intc/pnv_xive2.c b/hw/intc/pnv_xive2.c index e019cad5c14c..9832be5fd297 100644 --- a/hw/intc/pnv_xive2.c +++ b/hw/intc/pnv_xive2.c @@ -110,8 +110,8 @@ static PnvXive2 *pnv_xive2_get_remote(uint32_t vsd_type, hwaddr fwd_addr) int i; for (i = 0; i < pnv->num_chips; i++) { - Pnv10Chip *chip10 = PNV10_CHIP(pnv->chips[i]); - PnvXive2 *xive = &chip10->xive; + PnvChipClass *k = PNV_CHIP_GET_CLASS(pnv->chips[i]); + PnvXive2 *xive = k->intc_get(pnv->chips[i]); /* * Is this the XIVE matching the forwarded VSD address is for this Which one do you suggest ? Or should I look for another way ? I am preferring the first way to have a helper, but both ways look hacky. Attaching complete patch at end of the message. Thanks, - Aditya G > > > > Thanks, > > > > C. > > > > > > [ 6.806342] e1000e 0001:02:03.0 eth0: MAC: 3, PHY: 8, PBA No: 000000-000 > > [ 6.844448] e1000e 0001:02:03.0 enP1p2s3: renamed from eth0 > > ../include/hw/ppc/pnv_chip.h:110:PNV10_CHIP: Object 0x555556ab0cf0 is not > > an instance of type pnv10-chip > > > > Thread 1 "qemu-system-ppc" received signal SIGABRT, Aborted. > > 0x00007ffff6a8d02c in __pthread_kill_implementation () from /lib64/libc.so.6 > > Missing rpms, try: dnf --enablerepo='*debug*' install > > capstone-debuginfo-4.0.2-10.el9.x86_64 gnutls-debuginfo-3.8.3-9.el9.x86_64 > > pixman-debuginfo-0.40.0-6.el9.x86_64 zlib-debuginfo-1.2.11-40.el9.x86_64 > > lzo-debuginfo-2.10-7.el9.x86_64 SDL2-debuginfo-2.26.0-1.el9.x86_64 > > libpmem-debuginfo-1.12.1-1.el9.x86_64 libfdt-debuginfo-1.6.0-7.el9.x86_64 > > numactl-libs-debuginfo-2.0.19-1.el9.x86_64 > > glib2-debuginfo-2.68.4-16.el9_6.2.x86_64 > > libzstd-debuginfo-1.5.5-1.el9.x86_64 libslirp-debuginfo-4.4.0-8.el9.x86_64 > > elfutils-libs-debuginfo-0.193-1.el9.x86_64 > > ncurses-libs-debuginfo-6.2-12.20210508.el9.x86_64 > > usbredir-debuginfo-0.13.0-2.el9.x86_64 > > libusbx-debuginfo-1.0.26-1.el9.x86_64 glibc-debuginfo-2.34-221.el9.x86_64 > > p11-kit-debuginfo-0.25.3-3.el9.x86_64 libidn2-debuginfo-2.3.0-7.el9.x86_64 > > libunistring-debuginfo-0.9.10-15.el9.x86_64 > > libtasn1-debuginfo-4.16.0-9.el9.x86_64 nettle-debuginfo-3.10.1-1.el9.x86_64 > > ndctl-libs-debuginfo-78-2.el9.x86_64 daxctl-libs-debuginfo-78-2.el9.x86_64 > > libmount-debuginfo-2.37.4-21.el9.x86_64 > > libselinux-debuginfo-3.6-3.el9.x86_64 libffi-debuginfo-3.4.2-8.el9.x86_64 > > pcre-debuginfo-8.44-4.el9.x86_64 > > elfutils-libelf-debuginfo-0.193-1.el9.x86_64 > > xz-libs-debuginfo-5.2.5-8.el9_0.x86_64 > > bzip2-libs-debuginfo-1.0.8-10.el9_5.x86_64 > > systemd-libs-debuginfo-252-53.el9.x86_64 > > libuuid-debuginfo-2.37.4-21.el9.x86_64 kmod-libs-debuginfo-28-10.el9.x86_64 > > libblkid-debuginfo-2.37.4-21.el9.x86_64 pcre2-debuginfo-10.40-6.el9.x86_64 > > libgcc-debuginfo-11.5.0-9.el9.x86_64 > > openssl-libs-debuginfo-3.5.1-3.el9.x86_64 > > (gdb) bt > > #0 0x00007ffff6a8d02c in __pthread_kill_implementation () at > > /lib64/libc.so.6 > > #1 0x00007ffff6a3fb86 in raise () at /lib64/libc.so.6 > > #2 0x00007ffff6a29873 in abort () at /lib64/libc.so.6 > > #3 0x0000555555d62988 in object_dynamic_cast_assert > > (obj=0x555556ab0cf0, typename=typename@entry=0x5555560528a5 > > "pnv10-chip", file=file@entry=0x555556051628 > > "/home/legoater/work/qemu/qemu.git/include/hw/ppc/pnv_chip.h", > > line=line@entry=110, func=func@entry=0x55555606a2c8 <__func__.27> > > "PNV10_CHIP") > > at ../qom/object.c:925 > > #4 0x0000555555cfe852 in PNV10_CHIP (obj=<optimized out>) at > > /home/legoater/work/qemu/qemu.git/include/hw/ppc/pnv_chip.h:110 > > #5 pnv_xive2_get_remote (fwd_addr=<optimized out>, vsd_type=2) at > > ../hw/intc/pnv_xive2.c:113 > > #6 pnv_xive2_vst_addr (idx=15, blk=<optimized out>, type=2, > > xive=<optimized out>) at ../hw/intc/pnv_xive2.c:265 > > #7 pnv_xive2_vst_addr (xive=<optimized out>, type=2, blk=<optimized out>, > > idx=15) at ../hw/intc/pnv_xive2.c:244 > > #8 0x0000555555cfec35 in pnv_xive2_vst_read (xive=0x555556ab1500, type=2, > > blk=1 '\001', idx=15, data=0x7fffffffcf20) > > at ../hw/intc/pnv_xive2.c:286 > > #9 0x0000555555d06a69 in xive2_router_get_end (end=0x7fffffffcf20, > > end_idx=15, end_blk=1 '\001', xrtr=0x555556ab1500) > > at ../hw/intc/xive2.c:1437 > > #10 xive2_router_end_notify > > (xrtr=xrtr@entry=0x555556ab1500, end_blk=1 '\001', end_idx=15, > > end_data=97, redistribute=redistribute@entry=false) > > at ../hw/intc/xive2.c:1669 > > #11 0x0000555555d06990 in xive2_notify (xrtr=0x555556ab1500, lisn=1040385, > > pq_checked=<optimized out>) > > at ../hw/intc/xive2.c:1955 > > #12 0x0000555555add8bb in memory_region_write_accessor > > (mr=mr@entry=0x555556ab3e00, addr=136365408256, > > value=value@entry=0x7fffffffd0e8, size=size@entry=8, shift=<optimized out>, > > mask=mask@entry=18446744073709551615, attrs=...) at ../system/memory.c:490 > > #13 0x0000555555adf1a2 in access_with_adjusted_size > > (addr=addr@entry=136365408256, value=value@entry=0x7fffffffd0e8, > > size=size@entry=8, access_size_min=<optimized out>, > > access_size_max=<optimized out>, access_fn=0x555555add850 > > <memory_region_write_accessor>, mr=0x555556ab3e00, attrs=...) > > at ../system/memory.c:561 > > #14 0x0000555555ae0164 in memory_region_dispatch_write > > (mr=mr@entry=0x555556ab3e00, addr=136365408256, data=<optimized out>, > > data@entry=0, op=<optimized out>, attrs=attrs@entry=...) at > > ../system/memory.c:1553 > > #15 0x0000555555ae8357 in address_space_stq_internal > > (as=<optimized out>, addr=addr@entry=1694483783811072, val=val@entry=0, > > attrs=..., result=result@entry=0x7fffffffd1f4, > > endian=endian@entry=DEVICE_BIG_ENDIAN) at ../system/memory_ldst.c.inc:479 > > #16 0x0000555555aeef0b in address_space_stq_be > > (as=<optimized out>, addr=addr@entry=1694483783811072, val=val@entry=0, > > attrs=..., > > attrs@entry=..., result=result@entry=0x7fffffffd1f4) at > > ../system/memory_ldst.c.inc:524 > > #17 0x0000555555d2159c in pnv_phb4_xive_notify_abt (pq_checked=false, > > srcno=<optimized out>, phb=0x5555574bc500) > > at ../hw/pci-host/pnv_phb4.c:1650 > > #18 pnv_phb4_xive_notify (xf=<optimized out>, srcno=<optimized out>, > > pq_checked=<optimized out>) > > at ../hw/pci-host/pnv_phb4.c:1686 > > #19 0x0000555555d203f0 in qemu_irq_pulse (irq=0x5555574c8440) at > > /home/legoater/work/qemu/qemu.git/include/hw/irq.h:33 > > #20 pnv_phb4_msi_write (opaque=<optimized out>, addr=<optimized out>, > > data=<optimized out>, size=<optimized out>) > > at ../hw/pci-host/pnv_phb4.c:1423 > > #21 0x0000555555add8bb in memory_region_write_accessor > > (mr=mr@entry=0x55555d8c76b0, addr=0, value=value@entry=0x7fffffffd318, > > size=size@entry=4, shift=<optimized out>, mask=mask@entry=4294967295, > > attrs=...) at ../system/memory.c:490 > > #22 0x0000555555adf23b in access_with_adjusted_size > > (addr=addr@entry=0, value=value@entry=0x7fffffffd318, > > size=size@entry=4, access_size_min=<optimized out>, > > access_size_max=<optimized out>, access_fn=0x555555add850 > > <memory_region_write_accessor>, mr=0x55555d8c76b0, attrs=...) > > at ../system/memory.c:566 > > #23 0x0000555555ae0164 in memory_region_dispatch_write > > (mr=mr@entry=0x55555d8c76b0, addr=0, data=<optimized out>, > > data@entry=1, op=op@entry=MO_32, attrs=attrs@entry=...) at > > ../system/memory.c:1553 > > #24 0x0000555555aee333 in address_space_stl_internal > > (endian=DEVICE_LITTLE_ENDIAN, result=0x0, attrs=..., val=1, > > addr=<optimized out>, as=<optimized out>) > > at ../system/memory_ldst.c.inc:319 > > #25 address_space_stl_le (as=<optimized out>, addr=<optimized out>, val=1, > > attrs=..., result=0x0) > > at ../system/memory_ldst.c.inc:357 > > #26 0x0000555555ef3c05 in aio_bh_call (bh=bh@entry=0x55555d0d59e0) at > > ../util/async.c:172 > > #27 0x0000555555ef3d35 in aio_bh_poll (ctx=ctx@entry=0x55555667ad50) at > > ../util/async.c:219 > > #28 0x0000555555edcede in aio_dispatch (ctx=0x55555667ad50) at > > ../util/aio-posix.c:436 > > #29 0x0000555555ef3a7e in aio_ctx_dispatch (source=<optimized out>, > > callback=<optimized out>, user_data=<optimized out>) > > at ../util/async.c:361 > > #30 0x00007ffff76c0f4f in g_main_context_dispatch () at > > /lib64/libglib-2.0.so.0 > > #31 0x0000555555ef5058 in glib_pollfds_poll () at ../util/main-loop.c:287 > > #32 os_host_main_loop_wait (timeout=0) at ../util/main-loop.c:310 > > #33 main_loop_wait (nonblocking=nonblocking@entry=0) at > > ../util/main-loop.c:589 > > #34 0x0000555555af89b3 in qemu_main_loop () at ../system/runstate.c:905 > > #35 0x0000555555e4273c in qemu_default_main (opaque=opaque@entry=0x0) at > > ../system/main.c:50 > > #36 0x000055555589eddd in main (argc=<optimized out>, argv=<optimized out>) > > at ../system/main.c:93 > > The patch which fixes the issue, adding another pointer in PnvChipClass: diff --git a/hw/intc/pnv_xive2.c b/hw/intc/pnv_xive2.c index e019cad5c14c..9832be5fd297 100644 --- a/hw/intc/pnv_xive2.c +++ b/hw/intc/pnv_xive2.c @@ -110,8 +110,8 @@ static PnvXive2 *pnv_xive2_get_remote(uint32_t vsd_type, hwaddr fwd_addr) int i; for (i = 0; i < pnv->num_chips; i++) { - Pnv10Chip *chip10 = PNV10_CHIP(pnv->chips[i]); - PnvXive2 *xive = &chip10->xive; + PnvChipClass *k = PNV_CHIP_GET_CLASS(pnv->chips[i]); + PnvXive2 *xive = k->intc_get(pnv->chips[i]); /* * Is this the XIVE matching the forwarded VSD address is for this diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 673bb54c6789..81889ede2e0c 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1488,6 +1488,11 @@ static void pnv_chip_power10_intc_print_info(PnvChip *chip, PowerPCCPU *cpu, xive_tctx_pic_print_info(XIVE_TCTX(pnv_cpu_state(cpu)->intc), buf); } +static PnvXive2 *pnv_chip_power10_intc_get(PnvChip *chip) +{ + return &PNV10_CHIP(chip)->xive; +} + static void pnv_chip_power11_intc_create(PnvChip *chip, PowerPCCPU *cpu, Error **errp) { @@ -1532,6 +1537,11 @@ static void pnv_chip_power11_intc_print_info(PnvChip *chip, PowerPCCPU *cpu, xive_tctx_pic_print_info(XIVE_TCTX(pnv_cpu_state(cpu)->intc), buf); } +static PnvXive2 *pnv_chip_power11_intc_get(PnvChip *chip) +{ + return &PNV11_CHIP(chip)->xive; +} + /* * Allowed core identifiers on a POWER8 Processor Chip : * @@ -2716,6 +2726,7 @@ static void pnv_chip_power10_class_init(ObjectClass *klass, const void *data) k->intc_reset = pnv_chip_power10_intc_reset; k->intc_destroy = pnv_chip_power10_intc_destroy; k->intc_print_info = pnv_chip_power10_intc_print_info; + k->intc_get = pnv_chip_power10_intc_get; k->isa_create = pnv_chip_power10_isa_create; k->dt_populate = pnv_chip_power10_dt_populate; k->pic_print_info = pnv_chip_power10_pic_print_info; @@ -2749,6 +2760,7 @@ static void pnv_chip_power11_class_init(ObjectClass *klass, const void *data) k->intc_reset = pnv_chip_power11_intc_reset; k->intc_destroy = pnv_chip_power11_intc_destroy; k->intc_print_info = pnv_chip_power11_intc_print_info; + k->intc_get = pnv_chip_power11_intc_get; k->isa_create = pnv_chip_power11_isa_create; k->dt_populate = pnv_chip_power11_dt_populate; k->pic_print_info = pnv_chip_power11_pic_print_info; diff --git a/include/hw/ppc/pnv_chip.h b/include/hw/ppc/pnv_chip.h index 6bd930f8b439..dcdbf519f894 100644 --- a/include/hw/ppc/pnv_chip.h +++ b/include/hw/ppc/pnv_chip.h @@ -170,6 +170,7 @@ struct PnvChipClass { void (*intc_reset)(PnvChip *chip, PowerPCCPU *cpu); void (*intc_destroy)(PnvChip *chip, PowerPCCPU *cpu); void (*intc_print_info)(PnvChip *chip, PowerPCCPU *cpu, GString *buf); + PnvXive2* (*intc_get)(PnvChip *chip); ISABus *(*isa_create)(PnvChip *chip, Error **errp); void (*dt_populate)(PnvChip *chip, void *fdt); void (*pic_print_info)(PnvChip *chip, GString *buf);