On 01/29/2016 08:46 AM, Shannon Zhao wrote: > > > On 2016/1/29 22:35, Wei Huang wrote: >> >> >> On 01/29/2016 04:10 AM, Shannon Zhao wrote: >>> Hi, >>> >>> This makes ACPI work well but makes DT not work. The reason is >>> systemd or >>> acpid open /dev/input/event0 failed. So the interrupt could be >>> injected and >>> could see under /proc/interrupts but guest doesn't have any action. I'll >>> investigate why it opens failed later. >> >> That is interesting. Could you try it with the following? This reverses >> the order to down-up and worked on ACPI case. >> > Yeah, that's very weird. > >> qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 0); >> qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 1); >> > I'll try this tomorrow. But even if this works, it's still weird.
To reproduce this case, do the following steps using current upstream qemu: create vm => reboot vm (succeed) => reboot or shutdown vm (fail). Apparently the last interrupt wasn't received correctly. -Wei > >> Thanks, >> -Wei >> >>> >>> 2016年1月29日星期五,Wei Huang <w...@redhat.com> 写道: >>> >>>> When QEMU is hook'ed up with libvirt/virsh, the first ACPI reboot >>>> request will succeed; but the following shutdown/reboot requests >>>> fail to trigger VMs to react. Notice that in mach-virt machine >>>> model GPIO is defined as edge-triggered and active-high in ACPI. >>>> This patch changes the behavior of powerdown notifier from PULLUP >>>> to PULSE. It solves the problem described above (i.e. reboot >>>> continues to work). >>>> >>>> Signed-off-by: Wei Huang <w...@redhat.com <javascript:;>> >>>> --- >>>> hw/arm/virt.c | 2 +- >>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>> >>>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c >>>> index 05f9087..b5468a9 100644 >>>> --- a/hw/arm/virt.c >>>> +++ b/hw/arm/virt.c >>>> @@ -546,7 +546,7 @@ static DeviceState *pl061_dev; >>>> static void virt_powerdown_req(Notifier *n, void *opaque) >>>> { >>>> /* use gpio Pin 3 for power button event */ >>>> - qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 1); >>>> + qemu_irq_pulse(qdev_get_gpio_in(pl061_dev, 3)); >>>> } >>>> >>>> static Notifier virt_system_powerdown_notifier = { >>>> -- >>>> 1.8.3.1 >>>> >>>> >>> >