On 9/3/20 1:28 PM, Peter Maydell wrote: > On Thu, 3 Sep 2020 at 12:24, Li Qiang <liq...@gmail.com> wrote: >> Peter Maydell <peter.mayd...@linaro.org> 于2020年9月3日周四 下午7:19写道: >>> No. Any device can have an inbound or outbound qemu_irq line. >>> We use them not just for actual IRQ lines but for any >>> situation where we need to pass an on-or-off signal from >>> one device to another. >> >> Could you please provide some example, I haven't noticed this before. > > Look at any device that calls qdev_init_gpio_in() or > qdev_init_gpio_in_named() for an example of inbound signals. > Outbound signals might be created via qdev_init_gpio_out(), > qdev_init_gpio_out_named() or sysbus_init_irq().
Not sure if this is a valid example, but when adding: -- >8 -- diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c index bca71b5934b..b8b4ba362b1 100644 --- a/hw/intc/ioapic.c +++ b/hw/intc/ioapic.c @@ -96,6 +96,8 @@ static void ioapic_service(IOAPICCommonState *s) uint32_t mask; uint64_t entry; + assert(!resettable_is_in_reset(OBJECT(s))); + for (i = 0; i < IOAPIC_NUM_PINS; i++) { mask = 1 << i; if (s->irr & mask) { --- I get a MMIO write triggered from an IRQ: (gdb) bt #3 0x0000555558e44a12 in memory_region_write_accessor (mr=0x61600001ab10, addr=0, value=0x7fffffffaa10, size=4, shift=0, mask=4294967295, attrs=...) at softmmu/memory.c:482 #4 0x0000555558e4453b in access_with_adjusted_size (addr=0, value=0x7fffffffaa10, size=4, access_size_min=1, access_size_max=4, access_fn= 0x555558e44600 <memory_region_write_accessor>, mr=0x61600001ab10, attrs=...) at softmmu/memory.c:545 #5 0x0000555558e42c56 in memory_region_dispatch_write (mr=0x61600001ab10, addr=0, data=0, op=MO_32, attrs=...) at softmmu/memory.c:1466 #6 0x0000555558f322b3 in address_space_stl_internal (as=0x55555c0120e0 <address_space_memory>, addr=4276092928, val=0, attrs=..., result=0x0, endian=DEVICE_LITTLE_ENDIAN) at memory_ldst.c.inc:315 #7 0x0000555558f32802 in address_space_stl_le (as=0x55555c0120e0 <address_space_memory>, addr=4276092928, val=0, attrs=..., result=0x0) at memory_ldst.c.inc:353 #8 0x0000555558be2e22 in stl_le_phys (as=0x55555c0120e0 <address_space_memory>, addr=4276092928, val=0) at /home/phil/source/qemu/include/exec/memory_ldst_phys.h.inc:103 #9 0x0000555558be0e14 in ioapic_service (s=0x61b000002a80) at hw/intc/ioapic.c:138 #10 0x0000555558be4901 in ioapic_set_irq (opaque=0x61b000002a80, vector=2, level=1) at hw/intc/ioapic.c:186 #11 0x00005555598769f6 in qemu_set_irq (irq=0x606000040f40, level=1) at hw/core/irq.c:44 #12 0x00005555585fc097 in gsi_handler (opaque=0x61200000b8c0, n=0, level=1) at hw/i386/x86.c:336 #13 0x00005555598769f6 in qemu_set_irq (irq=0x60600003db80, level=1) at hw/core/irq.c:44 #14 0x0000555557653047 in hpet_handle_legacy_irq (opaque=0x61f000000080, n=0, level=1) at hw/timer/hpet.c:707 #15 0x00005555598769f6 in qemu_set_irq (irq=0x606000042500, level=1) at hw/core/irq.c:44 #16 0x00005555571c0686 in pit_irq_timer_update (s=0x616000032018, current_time=0) at hw/timer/i8254.c:262 #17 0x00005555571c01c9 in pit_irq_control (opaque=0x616000031e80, n=0, enable=1) at hw/timer/i8254.c:304 #18 0x00005555598769f6 in qemu_set_irq (irq=0x6060000435e0, level=1) at hw/core/irq.c:44 #19 0x00005555576518cb in hpet_reset (d=0x61f000000080) at hw/timer/hpet.c:690 #20 0x000055555986dfbe in device_transitional_reset (obj=0x61f000000080) at hw/core/qdev.c:1114 #21 0x0000555559870e8e in resettable_phase_hold (obj=0x61f000000080, opaque=0x0, type=RESET_TYPE_COLD) at hw/core/resettable.c:182 #22 0x0000555559846add in bus_reset_child_foreach (obj=0x60c00002e000, cb=0x5555598707e0 <resettable_phase_hold>, opaque=0x0, type=RESET_TYPE_COLD) at hw/core/bus.c:94 #23 0x0000555559873c29 in resettable_child_foreach (rc=0x60e00003e160, obj=0x60c00002e000, cb=0x5555598707e0 <resettable_phase_hold>, opaque=0x0, type=RESET_TYPE_COLD) at hw/core/resettable.c:96 #24 0x0000555559870b01 in resettable_phase_hold (obj=0x60c00002e000, opaque=0x0, type=RESET_TYPE_COLD) at hw/core/resettable.c:173 #25 0x000055555986fbc3 in resettable_assert_reset (obj=0x60c00002e000, type=RESET_TYPE_COLD) at hw/core/resettable.c:60 #26 0x000055555986fa6a in resettable_reset (obj=0x60c00002e000, type=RESET_TYPE_COLD) at hw/core/resettable.c:45 #27 0x00005555598725ba in resettable_cold_reset_fn (opaque=0x60c00002e000) at hw/core/resettable.c:269 #28 0x000055555986f9e9 in qemu_devices_reset () at hw/core/reset.c:69 #29 0x000055555865d711 in pc_machine_reset (machine=0x615000020100) at hw/i386/pc.c:1901 #30 0x00005555589ea197 in qemu_system_reset (reason=SHUTDOWN_CAUSE_NONE) at softmmu/vl.c:1403 #31 0x00005555589f7738 in qemu_init (argc=16, argv=0x7fffffffd278, envp=0x7fffffffd300) at softmmu/vl.c:4458 #32 0x00005555571615fa in main (argc=16, argv=0x7fffffffd278, envp=0x7fffffffd300) at softmmu/main.c:49