From: Anthony PERARD <anthony.per...@citrix.com> Signed-off-by: Anthony PERARD <anthony.per...@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(-)
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 173d781..1bcd40e 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 @@ -179,6 +180,9 @@ static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width, 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 dd3fb68..8920550 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -44,6 +44,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 b94d56e..939d9b7 100644 --- a/xen-all.c +++ b/xen-all.c @@ -460,6 +460,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; -- 1.7.1