LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File ioemu-hvm-pv-support.patch of Package xen (Project home:charlesa:Factory)

---
 tools/qemu-xen-traditional-dir-remote/hw/xen_platform.c |   46 ++++++++++++++++
 1 file changed, 46 insertions(+)

Index: xen-4.9.0-testing/tools/qemu-xen-traditional-dir-remote/xen-hooks.mak
===================================================================
--- xen-4.9.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xen-hooks.mak
+++ xen-4.9.0-testing/tools/qemu-xen-traditional-dir-remote/xen-hooks.mak
@@ -3,6 +3,9 @@ CPPFLAGS+= -I$(XEN_ROOT)/tools/libs/evtc
 CPPFLAGS+= -I$(XEN_ROOT)/tools/libs/gnttab/include
 CPPFLAGS+= -DXC_WANT_COMPAT_MAP_FOREIGN_API
 CPPFLAGS+= -DXC_WANT_COMPAT_DEVICEMODEL_API
+CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc
+CPPFLAGS+= -I$(XEN_ROOT)/tools/libs/call/include
+CPPFLAGS+= -I$(XEN_ROOT)/tools/libs/foreignmemory/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/xenstore/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/include
Index: xen-4.9.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_platform.c
===================================================================
--- xen-4.9.0-testing.orig/tools/qemu-xen-traditional-dir-remote/hw/xen_platform.c
+++ xen-4.9.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_platform.c
@@ -30,6 +30,8 @@
 #include "qemu-xen.h"
 #include "net.h"
 #include "xen_platform.h"
+#include "sysemu.h"
+#include <xc_private.h>
 
 #include <assert.h>
 #include <xenguest.h>
@@ -335,8 +337,52 @@ static void xen_platform_ioport_writeb(v
     }
 }
 
+static uint32_t ioport_base;
+
+static void suse_platform_ioport_write(void *opaque, uint32_t addr, uint32_t val)
+{
+    DECLARE_DOMCTL;
+    int rc;
+
+    if (val == 0)
+        qemu_invalidate_map_cache();
+
+    switch (addr - ioport_base) {
+    case 0:
+	/* FIXME Unknown who makes use of this code! */
+        fprintf(logfile, "Init hypercall page %x, addr %x.\n", val, addr);
+        domctl.domain = (domid_t)domid;
+        domctl.u.hypercall_init.gmfn = val;
+        domctl.cmd = XEN_DOMCTL_hypercall_init;
+        rc = xc_domctl(xc_handle, &domctl);
+        fprintf(logfile, "result -> %d.\n", rc);
+        break;
+    case 4:
+	/* xen-kmp used this since xen-3.0.4, instead the official protocol from xen-3.3+
+	 * pre vmdp 1.7 made use of 4 and 8 depending on how vmdp was configured.
+	 * If vmdp was to control both disk and LAN it would use 4.
+	 * If it controlled just disk or just LAN, it would use 8 below. */
+        fprintf(logfile, "Disconnect IDE hard disk...\n");
+        ide_unplug_harddisks();
+        fprintf(logfile, "Disconnect netifs...\n");
+        pci_unplug_netifs();
+        fprintf(logfile, "Shutdown taps...\n");
+        net_tap_shutdown_all();
+        fprintf(logfile, "Done.\n");
+        break;
+    default:
+        fprintf(logfile, "Write %x to bad port %x (base %x) on evtchn device.\n",
+            val, addr, ioport_base);
+        break;
+    }
+}
+
 static void platform_ioport_map(PCIDevice *pci_dev, int region_num, uint32_t addr, uint32_t size, int type)
 {
+    ioport_base = addr;
+
+    register_ioport_write(addr, 16, 4, suse_platform_ioport_write, NULL);
+
     PCIXenPlatformState *d = (PCIXenPlatformState *)pci_dev;
     register_ioport_write(addr, size, 1, xen_platform_ioport_writeb, d);
     register_ioport_read(addr, size, 1, xen_platform_ioport_readb, d);