#0 piix4_powerdown (opaque=0x7f804b393410, irq=0, power_failing=1)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/acpi_piix4.c:314
#1 0x00007f8049d072ac in qemu_set_irq (irq=0x7f804b393d80, level=1)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/irq.c:38
#2 0x00007f8049d88494 in qemu_irq_raise (irq=0x7f804b393d80)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/irq.h:12
#3 0x00007f8049d88437 in main_loop_should_exit ()
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/vl.c:1462
#4 0x00007f8049d88507 in main_loop ()
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/vl.c:1486
#5 0x00007f8049d8d1f5 in main (argc=50, argv=0x7fff058a8108,
envp=0x7fff058a82a0) at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/vl.c:3523
piix4_powerdown ->acpi_pm1_evt_power_down -> pm_tmr_timer -> pm_update_sci
pm_update_sci ->qemu_set_irq ->kvm_i8259_set_irq
void acpi_pm1_evt_power_down(ACPIPM1EVT *pm1, ACPIPMTimer *tmr)
{
if (!pm1) {
qemu_system_shutdown_request();
} else if (pm1->en & ACPI_BITMASK_POWER_BUTTON_ENABLE) {
执行下电的关键,就是对pm1->sts进行修改。
pm1->sts |= ACPI_BITMASK_POWER_BUTTON_STATUS;
tmr->update_sci(tmr);
}
}
PIIX4PMState * (qemu_system_powerdown ->opaque) ->pm1a-> sts
p ((PIIX4PMState *)(qemu_system_powerdown->opaque))->pm1a->sts
0
#0 qemu_set_irq (irq=0x7fd4f2ffcce8, level=1)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/irq.c:40
#1 0x00007fd4f1ae6793 in pm_update_sci (s=0x7fd4f303d210)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/acpi_piix4.c:99
#2 0x00007fd4f1ae6830 in pm_tmr_timer (tmr=0x7fd4f303d6a8)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/acpi_piix4.c:108
#3 0x00007fd4f1ae60db in acpi_pm_tmr_timer (opaque=0x7fd4f303d6a8)
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/hw/acpi.c:314
#4 0x00007fd4f1a8c511 in qemu_run_timers (clock=0x7fd4f27ab180)
at qemu-timer.c:420
#5 0x00007fd4f1a8c85c in qemu_run_all_timers () at qemu-timer.c:482
#6 0x00007fd4f1a5d293 in main_loop_wait (nonblocking=0) at main-loop.c:468
#7 0x00007fd4f1a52557 in main_loop ()
at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/vl.c:1484
#8 0x00007fd4f1a5724d in main (argc=48, argv=0x7fffd66aad38,
envp=0x7fffd66aaec0) at /home/sdc/wyf/kvm/qemu-kvm-1.0.1/vl.c:3525
timer更新会调用pm_update_sci。