]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
Sleep button support for guest. origin/HEAD origin/master
authorKamala Narasimhan <kamala.narasimhan@citrix.com>
Wed, 18 Feb 2009 21:08:50 +0000 (16:08 -0500)
committerKamala Narasimhan <kamala.narasimhan@citrix.com>
Wed, 18 Feb 2009 21:08:50 +0000 (16:08 -0500)
hw/pc.h
hw/piix4acpi.c
xenstore.c

diff --git a/hw/pc.h b/hw/pc.h
index a4ffc3893aae4c01c9dbe7f5f360ea651bb6d3b9..6c4a2fd699beda0719bdd3a2b6bf05e9e46f9948 100644 (file)
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -104,6 +104,7 @@ void acpi_php_add(int);
 void acpi_php_del(int);
 void acpi_ac_adapter_state_changed(void);
 void acpi_power_button_pressed(void);
+void acpi_sleep_button_pressed(void);
 void acpi_lid_state_changed(void);
 
 void acpi_oem_event(void);
index c661fa65ed092a53bb3c46e24251e0b649158867..e39a3497b5be5094a05139a5dc78cd87b7031fd7 100644 (file)
@@ -56,6 +56,7 @@
 #define ACPI_PHP_GPE_BIT 3
 #define ACPI_AC_POWER_STATE_BIT 0x1c
 #define ACPI_POWER_BUTTON_BIT 0x1
+#define ACPI_SLEEP_BUTTON_BIT 0x0
 #define ACPI_LID_STATE_BIT 0x17 
 #define ACPI_OEM_EVENT_BIT 0x18
 #define ACPI_PHP_SLOT_NUM PHP_SLOT_LEN
@@ -238,6 +239,18 @@ void acpi_power_button_pressed(void)
     }
 }
 
+void acpi_sleep_button_pressed(void)
+{
+    GPEState *s = &gpe_state;
+
+    if ( !test_bit(&s->gpe0_sts[0], ACPI_SLEEP_BUTTON_BIT) &&
+         test_bit(&s->gpe0_en[0], ACPI_SLEEP_BUTTON_BIT) ) {
+        set_bit(&s->gpe0_sts[0], ACPI_SLEEP_BUTTON_BIT);
+        s->sci_asserted = 1;
+        qemu_irq_raise(sci_irq);
+    }
+}
+
 void acpi_lid_state_changed(void)
 {
     GPEState *s = &gpe_state;
index 6b577b2b9699f378abbc032025b66a221f5d7d32..b73c346b47853d57934dc7fc7b0da458c908f1b8 100644 (file)
@@ -861,6 +861,10 @@ void xenstore_process_event(void *opaque)
         goto out;
     }
 
+    if (!strcmp(vec[XS_WATCH_TOKEN], "slpbuttonpressedevt")) {
+        acpi_sleep_button_pressed();
+    }
+
     if (!strcmp(vec[XS_WATCH_TOKEN], "lidstatechangeevt")) {
         acpi_lid_state_changed();
         goto out;
@@ -1290,6 +1294,7 @@ void xenstore_register_for_pm_events(void)
    xs_watch(xsh, "/pm/events/acadapterstatechanged", "acadapterstatechangeevt");
    xs_watch(xsh, "/pm/events/lidstatechanged", "lidstatechangeevt");
    xs_watch(xsh, "/pm/events/powerbuttonpressed", "pwrbuttonpressedevt");
+   xs_watch(xsh, "/pm/events/sleepbuttonpressed", "slpbuttonpressedevt");
 }
 
 void xenstore_register_for_oem_events(void)