[PATCH 2/4]: QEMU interface for HVM virtual S3
- add S3 suspend logic in PM1A control register. when guest write
specific value to this register,
QEMU will trigger S3 sleep by
* reset all qemu device
* set CMOS shutdown status as S3 resume, so that rombios will do S3
resume later
* call HVMOP_s3_suspend hypercall to put HVM domain into S3 sleep
state.
Signed-off-by: Yu Ke <ke.yu@xxxxxxxxx>
diff -r 3453c027ddbe tools/ioemu/hw/pc.c
--- a/tools/ioemu/hw/pc.c Tue May 15 15:11:40 2007 -0400
+++ b/tools/ioemu/hw/pc.c Tue May 15 17:22:59 2007 -0400
@@ -822,6 +822,14 @@ static void pc_init_isa(uint64_t ram_siz
initrd_filename, 0);
}
+/* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE)
+ BIOS will read it and start S3 resume at POST*/
+void cmos_set_s3_resume(void){
+ if (rtc_state){
+ rtc_set_memory(rtc_state, 0xF, 0xFE);
+ }
+}
+
QEMUMachine pc_machine = {
"pc",
"Standard PC",
diff -r 3453c027ddbe tools/ioemu/hw/piix4acpi.c
--- a/tools/ioemu/hw/piix4acpi.c Tue May 15 15:11:40 2007 -0400
+++ b/tools/ioemu/hw/piix4acpi.c Tue May 15 20:30:58 2007 -0400
@@ -33,6 +33,7 @@
/* Sleep state type codes as defined by the \_Sx objects in the DSDT.
*/
/* These must be kept in sync with the DSDT (hvmloader/acpi/dsdt.asl)
*/
+#define SLP_TYP_S3 (5 << 10)
#define SLP_TYP_S5 (7 << 10)
typedef struct AcpiDeviceState AcpiDeviceState;
@@ -86,6 +87,13 @@ static void acpiPm1ControlP1_writeb(void
/* Check for power off request. */
if ((val & (SLP_EN|SLP_TYP_Sx)) == (SLP_EN|SLP_TYP_S5))
qemu_system_shutdown_request();
+ else if ((val & (SLP_EN|SLP_TYP_Sx)) == (SLP_EN|SLP_TYP_S3)){
+ /* check for S3 sleep request */
+ qemu_system_reset();
+ cmos_set_s3_resume();
+ xc_hvm_s3_suspend(xc_handle,domid);
+ }
+
}
static uint32_t acpiPm1ControlP1_readb(void *opaque, uint32_t addr)
@@ -104,6 +112,12 @@ static void acpiPm1Control_writew(void *
/* Check for power off request. */
if ((val & (SLP_EN|SLP_TYP_Sx)) == (SLP_EN|SLP_TYP_S5))
qemu_system_shutdown_request();
+ else if ((val & (SLP_EN|SLP_TYP_Sx)) == (SLP_EN|SLP_TYP_S3)){
+ /* check for S3 sleep request */
+ qemu_system_reset();
+ cmos_set_s3_resume();
+ xc_hvm_s3_suspend(xc_handle,domid);
+ }
}
static uint32_t acpiPm1Control_readw(void *opaque, uint32_t addr)
diff -r 3453c027ddbe tools/ioemu/target-i386-dm/helper2.c
--- a/tools/ioemu/target-i386-dm/helper2.c Tue May 15 15:11:40 2007
-0400
+++ b/tools/ioemu/target-i386-dm/helper2.c Tue May 15 17:22:59 2007
-0400
@@ -133,6 +133,7 @@ CPUX86State *cpu_x86_init(void)
/* called from main_cpu_reset */
void cpu_reset(CPUX86State *env)
{
+#if 0
int xcHandle;
int sts;
@@ -149,6 +150,7 @@ void cpu_reset(CPUX86State *env)
fprintf(logfile, "Issued domain %d reboot\n", domid);
xc_interface_close(xcHandle);
}
+#endif
}
void cpu_x86_close(CPUX86State *env)
diff -r 3453c027ddbe tools/ioemu/vl.h
--- a/tools/ioemu/vl.h Tue May 15 15:11:40 2007 -0400
+++ b/tools/ioemu/vl.h Tue May 15 17:22:59 2007 -0400
@@ -1123,6 +1123,7 @@ extern int fd_bootchk;
void ioport_set_a20(int enable);
int ioport_get_a20(void);
+void cmos_set_s3_resume(void);
/* ppc.c */
extern QEMUMachine prep_machine;
diff -r 3453c027ddbe tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c Tue May 15 15:11:40 2007 -0400
+++ b/tools/libxc/xc_misc.c Tue May 15 17:22:59 2007 -0400
@@ -198,6 +198,45 @@ int xc_hvm_set_pci_link_route(
unlock_pages(&arg, sizeof(arg));
return rc;
+}
+
+static int xc_hvm_s3_op(
+ int xc_handle, domid_t dom, HVMOP_S3_t op)
+{
+ DECLARE_HYPERCALL;
+ struct xen_hvm_s3 arg;
+ int rc;
+
+ hypercall.op = __HYPERVISOR_hvm_op;
+ hypercall.arg[0] = HVMOP_S3;
+ hypercall.arg[1] = (unsigned long)&arg;
+
+ arg.domid = dom;
+ arg.op = op;
+
+ if ( (rc = lock_pages(&arg, sizeof(arg))) != 0 )
+ {
+ PERROR("Could not lock memory");
+ return rc;
+ }
+
+ rc = do_xen_hypercall(xc_handle, &hypercall);
+
+ unlock_pages(&arg, sizeof(arg));
+
+ return rc;
+}
+
+int xc_hvm_s3_suspend(
+ int xc_handle, domid_t dom)
+{
+ return xc_hvm_s3_op(xc_handle, dom, HVMOP_S3_suspend);
+}
+
+int xc_hvm_s3_resume(
+ int xc_handle, domid_t dom)
+{
+ return xc_hvm_s3_op(xc_handle, dom, HVMOP_S3_resume);
}
/*
diff -r 3453c027ddbe tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Tue May 15 15:11:40 2007 -0400
+++ b/tools/libxc/xenctrl.h Tue May 15 17:22:59 2007 -0400
@@ -796,6 +796,11 @@ int xc_hvm_set_pci_link_route(
int xc_hvm_set_pci_link_route(
int xc_handle, domid_t dom, uint8_t link, uint8_t isa_irq);
+int xc_hvm_s3_suspend(
+ int xc_handle, domid_t dom);
+
+int xc_hvm_s3_resume(
+ int xc_handle, domid_t dom);
typedef enum {
XC_ERROR_NONE = 0,
qemu.patch
Description: qemu.patch
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|