Patchwork [V6,15/15] acpi-piix4: Add Xen hypercall for sleep state.

login
register
mail settings
Submitter Anthony PERARD
Date Oct. 21, 2010, 5:36 p.m.
Message ID <1287682587-18642-16-git-send-email-anthony.perard@citrix.com>
Download mbox | patch
Permalink /patch/68732/
State New
Headers show

Comments

Anthony PERARD - Oct. 21, 2010, 5:36 p.m.
From: Anthony PERARD <anthony.perard@citrix.com>

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/acpi_piix4.c |    4 ++++
 hw/xen.h        |    2 ++
 xen-all.c       |    7 +++++++
 xen-stub.c      |    4 ++++
 4 files changed, 17 insertions(+), 0 deletions(-)

Patch

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index f74f34c..c9a3694 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -23,6 +23,7 @@ 
 #include "acpi.h"
 #include "sysemu.h"
 #include "range.h"
+#include "xen.h"
 
 //#define DEBUG
 
@@ -172,6 +173,9 @@  static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
                     if (s->cmos_s3) {
                         qemu_irq_raise(s->cmos_s3);
                     }
+                    if (xen_enabled()) {
+                        xen_set_hvm_sleep_state();
+                    }
                 default:
                     break;
                 }
diff --git a/hw/xen.h b/hw/xen.h
index 0261ae6..23796bc 100644
--- a/hw/xen.h
+++ b/hw/xen.h
@@ -38,6 +38,8 @@  int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
 void xen_piix3_set_irq(void *opaque, int irq_num, int level);
 void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len);
 
+void xen_set_hvm_sleep_state(void);
+
 int xen_init(int smp_cpus);
 
 #if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
diff --git a/xen-all.c b/xen-all.c
index fc862cb..11a5911 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -459,6 +459,13 @@  static void xen_main_loop_prepare(XenIOState *state)
 }
 
 
+/* ACPI */
+
+void xen_set_hvm_sleep_state(void)
+{
+    xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3);
+}
+
 /* Initialise Xen */
 
 static void xen_vm_change_state_handler(void *opaque, int running, int reason)
diff --git a/xen-stub.c b/xen-stub.c
index c9f477d..d22f475 100644
--- a/xen-stub.c
+++ b/xen-stub.c
@@ -28,6 +28,10 @@  void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size)
 {
 }
 
+void xen_set_hvm_sleep_state(void)
+{
+}
+
 int xen_init(int smp_cpus)
 {
     return -ENOSYS;