]> xenbits.xen.org Git - xenclient/ioemu-pq.git/commitdiff
Send xenstore notification while entering different Sx states.
authorKamala Narasimhan <kamala.narasimhan@citrix.com>
Tue, 17 Nov 2009 14:50:06 +0000 (09:50 -0500)
committerKamala Narasimhan <kamala.narasimhan@citrix.com>
Tue, 17 Nov 2009 14:50:06 +0000 (09:50 -0500)
master/series
master/xenstore-notify-pm-events [new file with mode: 0644]

index 9d28e481f9b4460a2b09181b011bd2feabb4d013..7a680eadcfaca3b376ea244f17c1dc568f5765b6 100644 (file)
@@ -17,7 +17,7 @@ suspend-by-signal
 battery-management
 oem-features
 thermal-management
-
+xenstore-notify-pm-events
 
 vga-passthrough
 switcher
diff --git a/master/xenstore-notify-pm-events b/master/xenstore-notify-pm-events
new file mode 100644 (file)
index 0000000..1001533
--- /dev/null
@@ -0,0 +1,66 @@
+diff --git a/hw/piix4acpi.c b/hw/piix4acpi.c
+index 4e0410b..06b0bfa 100644
+--- a/hw/piix4acpi.c
++++ b/hw/piix4acpi.c
+@@ -35,6 +35,10 @@
+ #include <xen/hvm/ioreq.h>
+ #include <xen/hvm/params.h>
++#define GUEST_STATE_SLEEP     3
++#define GUEST_STATE_HIBERNATE 4
++#define GUEST_STATE_SHUTDOWN  5
++
+ /* PM1a_CNT bits, as defined in the ACPI specification. */
+ #define SCI_EN            (1 <<  0)
+ #define GBL_RLS           (1 <<  2)
+@@ -139,10 +143,15 @@ static void acpi_shutdown(uint32_t val)
+         s3_shutdown_flag = 0;
+         cmos_set_s3_resume();
+         xc_set_hvm_param(xc_handle, domid, HVM_PARAM_ACPI_S_STATE, 3);
++        xenstore_guest_pm_notification(GUEST_STATE_SLEEP);
+         break;
+     case SLP_TYP_S4:
++        qemu_system_shutdown_request();
++        xenstore_guest_pm_notification(GUEST_STATE_HIBERNATE);
++        break;
+     case SLP_TYP_S5:
+         qemu_system_shutdown_request();
++        xenstore_guest_pm_notification(GUEST_STATE_SHUTDOWN);
+         break;
+     default:
+         break;
+diff --git a/qemu-xen.h b/qemu-xen.h
+index 0b6214c..5ad40a8 100644
+--- a/qemu-xen.h
++++ b/qemu-xen.h
+@@ -124,6 +124,7 @@ void xenstore_dm_finished_startup(void);
+ int xenstore_vm_write(int domid, const char *key, const char *val);
+ char *xenstore_vm_read(int domid, const char *key, unsigned int *len);
+ char *xenstore_device_model_read(int domid, const char *key, unsigned int *len);
++int xenstore_guest_pm_notification(int state);
+ int xenstore_extended_power_mgmt_read_int(const char *key, int default_value);
+ char *xenstore_read_battery_data(int battery_status);
+ int xenstore_refresh_battery_status(void);
+diff --git a/xenstore.c b/xenstore.c
+index 3cd2ba6..a298f40 100644
+--- a/xenstore.c
++++ b/xenstore.c
+@@ -1718,6 +1718,18 @@ int xenstore_write(const char *path, const char *val)
+     return xs_write(xsh, XBT_NULL, path, val, strlen(val));
+ }
++int xenstore_guest_pm_notification(int state)
++{
++    int ret;
++    char *value = NULL;
++
++    if (pasprintf(&value, "%d", state) == -1)
++        return -1;
++
++    ret = xenstore_dom_write(domid, "power-state", value);
++    free(value);
++    return ret;
++}
+ /* Advertise through xenstore that the device model is up and the
+    domain can be started. */