piix4/ich9: do not raise SMI on ACPI enable/disable commands
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 18 Jun 2015 16:28:41 +0000 (18:28 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 6 Jul 2015 15:59:01 +0000 (17:59 +0200)
These commands are handled entirely by QEMU.  Do not raise an SMI
when they happen, because Windows (at least 2008r2) expects these
commands to work and (depending on the value of APMC_EN at
startup) the firmware might not have installed an SMI handler.

When this happens (e.g. the kernel supports SMIs, or you are using
TCG, but you have used "-machine smm=off") RIP is moved to 0x38000
where there is no code to execute.

Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
hw/acpi/piix4.c
hw/isa/lpc_ich9.c

index 3bd1d5a8650e0c9160e4d3f264592d9759bb0cd2..3af0fa726c1f299ed172d2d303e211c8a12cf3bc 100644 (file)
@@ -112,6 +112,9 @@ static void apm_ctrl_changed(uint32_t val, void *arg)
 
     /* ACPI specs 3.0, 4.7.2.5 */
     acpi_pm1_cnt_update(&s->ar, val == ACPI_ENABLE, val == ACPI_DISABLE);
+    if (val == ACPI_ENABLE || val == ACPI_DISABLE) {
+        return;
+    }
 
     if (d->config[0x5b] & (1 << 1)) {
         if (s->smi_irq) {
index b3e0b1fd5250ade04d53252fe46a102773264d1e..341a727f9fc93e39607a37a8776c7cdd0cac75ae 100644 (file)
@@ -375,6 +375,9 @@ static void ich9_apm_ctrl_changed(uint32_t val, void *arg)
     acpi_pm1_cnt_update(&lpc->pm.acpi_regs,
                         val == ICH9_APM_ACPI_ENABLE,
                         val == ICH9_APM_ACPI_DISABLE);
+    if (val == ICH9_APM_ACPI_ENABLE || val == ICH9_APM_ACPI_DISABLE) {
+        return;
+    }
 
     /* SMI_EN = PMBASE + 30. SMI control and enable register */
     if (lpc->pm.smi_en & ICH9_PMIO_SMI_EN_APMC_EN) {