From 1e96c68c3dad813b28eacd45efd792fc6f9f148e Mon Sep 17 00:00:00 2001 From: Daniel P. Berrange Date: Jul 19 2017 11:26:23 +0000 Subject: Fixes for compat with Xen 4.9 Signed-off-by: Daniel P. Berrange --- diff --git a/0001-xen-make-use-of-xen_xc-implicit-in-xen_common.h-inli.patch b/0001-xen-make-use-of-xen_xc-implicit-in-xen_common.h-inli.patch new file mode 100644 index 0000000..dc179b9 --- /dev/null +++ b/0001-xen-make-use-of-xen_xc-implicit-in-xen_common.h-inli.patch @@ -0,0 +1,454 @@ +From a3dfd0460492f404228335278c2a4b2afd95c2f4 Mon Sep 17 00:00:00 2001 +From: Paul Durrant +Date: Tue, 7 Mar 2017 10:55:30 +0000 +Subject: [PATCH 1/6] xen: make use of xen_xc implicit in xen_common.h inlines + +Doing this will make the transition to using the new libxendevicemodel +interface less intrusive on the callers of these functions, since using +the new library will require a change of handle. + +NOTE: The patch also moves the 'externs' for xen_xc and xen_fmem from + xen_backend.h to xen_common.h, and the declarations from + xen_backend.c to xen-common.c, which is where they belong. + +Signed-off-by: Paul Durrant +Reviewed-by: Anthony Perard +Reviewed-by: Stefano Stabellini +(cherry picked from commit 260cabed718c4d3137553a4a98de268b0fb166b7) +--- + hw/xen/xen_backend.c | 2 - + include/hw/xen/xen_backend.h | 2 - + include/hw/xen/xen_common.h | 90 +++++++++++++++++++++++--------------------- + xen-common.c | 3 ++ + xen-hvm.c | 20 +++++----- + 5 files changed, 60 insertions(+), 57 deletions(-) + +diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c +index 6c21c37d68..d34c49e152 100644 +--- a/hw/xen/xen_backend.c ++++ b/hw/xen/xen_backend.c +@@ -43,8 +43,6 @@ BusState *xen_sysbus; + /* ------------------------------------------------------------- */ + + /* public */ +-xc_interface *xen_xc = NULL; +-xenforeignmemory_handle *xen_fmem = NULL; + struct xs_handle *xenstore = NULL; + const char *xen_protocol; + +diff --git a/include/hw/xen/xen_backend.h b/include/hw/xen/xen_backend.h +index 4f4799a610..30811a1e5d 100644 +--- a/include/hw/xen/xen_backend.h ++++ b/include/hw/xen/xen_backend.h +@@ -14,8 +14,6 @@ + OBJECT_CHECK(XenDevice, (obj), TYPE_XENBACKEND) + + /* variables */ +-extern xc_interface *xen_xc; +-extern xenforeignmemory_handle *xen_fmem; + extern struct xs_handle *xenstore; + extern const char *xen_protocol; + extern DeviceState *xen_sysdev; +diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h +index dce76ee162..1e08b98617 100644 +--- a/include/hw/xen/xen_common.h ++++ b/include/hw/xen/xen_common.h +@@ -20,6 +20,8 @@ + #include "qemu/queue.h" + #include "hw/xen/trace.h" + ++extern xc_interface *xen_xc; ++ + /* + * We don't support Xen prior to 4.2.0. + */ +@@ -73,6 +75,8 @@ static inline void *xenforeignmemory_map(xc_interface *h, uint32_t dom, + + #endif + ++extern xenforeignmemory_handle *xen_fmem; ++ + void destroy_hvm_domain(bool reboot); + + /* shutdown/destroy current domain because of an error */ +@@ -107,8 +111,7 @@ static inline int xen_get_vmport_regs_pfn(xc_interface *xc, domid_t dom, + + #endif + +-static inline int xen_get_default_ioreq_server_info(xc_interface *xc, +- domid_t dom, ++static inline int xen_get_default_ioreq_server_info(domid_t dom, + xen_pfn_t *ioreq_pfn, + xen_pfn_t *bufioreq_pfn, + evtchn_port_t +@@ -117,7 +120,7 @@ static inline int xen_get_default_ioreq_server_info(xc_interface *xc, + unsigned long param; + int rc; + +- rc = xc_get_hvm_param(xc, dom, HVM_PARAM_IOREQ_PFN, ¶m); ++ rc = xc_get_hvm_param(xen_xc, dom, HVM_PARAM_IOREQ_PFN, ¶m); + if (rc < 0) { + fprintf(stderr, "failed to get HVM_PARAM_IOREQ_PFN\n"); + return -1; +@@ -125,7 +128,7 @@ static inline int xen_get_default_ioreq_server_info(xc_interface *xc, + + *ioreq_pfn = param; + +- rc = xc_get_hvm_param(xc, dom, HVM_PARAM_BUFIOREQ_PFN, ¶m); ++ rc = xc_get_hvm_param(xen_xc, dom, HVM_PARAM_BUFIOREQ_PFN, ¶m); + if (rc < 0) { + fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_PFN\n"); + return -1; +@@ -133,7 +136,7 @@ static inline int xen_get_default_ioreq_server_info(xc_interface *xc, + + *bufioreq_pfn = param; + +- rc = xc_get_hvm_param(xc, dom, HVM_PARAM_BUFIOREQ_EVTCHN, ++ rc = xc_get_hvm_param(xen_xc, dom, HVM_PARAM_BUFIOREQ_EVTCHN, + ¶m); + if (rc < 0) { + fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_EVTCHN\n"); +@@ -156,63 +159,64 @@ static inline int xen_get_default_ioreq_server_info(xc_interface *xc, + + typedef uint16_t ioservid_t; + +-static inline void xen_map_memory_section(xc_interface *xc, domid_t dom, ++static inline void xen_map_memory_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { + } + +-static inline void xen_unmap_memory_section(xc_interface *xc, domid_t dom, ++static inline void xen_unmap_memory_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { + } + +-static inline void xen_map_io_section(xc_interface *xc, domid_t dom, ++static inline void xen_map_io_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { + } + +-static inline void xen_unmap_io_section(xc_interface *xc, domid_t dom, ++static inline void xen_unmap_io_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { + } + +-static inline void xen_map_pcidev(xc_interface *xc, domid_t dom, ++static inline void xen_map_pcidev(domid_t dom, + ioservid_t ioservid, + PCIDevice *pci_dev) + { + } + +-static inline void xen_unmap_pcidev(xc_interface *xc, domid_t dom, ++static inline void xen_unmap_pcidev(domid_t dom, + ioservid_t ioservid, + PCIDevice *pci_dev) + { + } + +-static inline void xen_create_ioreq_server(xc_interface *xc, domid_t dom, ++static inline void xen_create_ioreq_server(domid_t dom, + ioservid_t *ioservid) + { + } + +-static inline void xen_destroy_ioreq_server(xc_interface *xc, domid_t dom, ++static inline void xen_destroy_ioreq_server(domid_t dom, + ioservid_t ioservid) + { + } + +-static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, ++static inline int xen_get_ioreq_server_info(domid_t dom, + ioservid_t ioservid, + xen_pfn_t *ioreq_pfn, + xen_pfn_t *bufioreq_pfn, + evtchn_port_t *bufioreq_evtchn) + { +- return xen_get_default_ioreq_server_info(xc, dom, ioreq_pfn, bufioreq_pfn, ++ return xen_get_default_ioreq_server_info(dom, ioreq_pfn, ++ bufioreq_pfn, + bufioreq_evtchn); + } + +-static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, ++static inline int xen_set_ioreq_server_state(domid_t dom, + ioservid_t ioservid, + bool enable) + { +@@ -224,7 +228,7 @@ static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, + + static bool use_default_ioreq_server; + +-static inline void xen_map_memory_section(xc_interface *xc, domid_t dom, ++static inline void xen_map_memory_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { +@@ -237,11 +241,11 @@ static inline void xen_map_memory_section(xc_interface *xc, domid_t dom, + } + + trace_xen_map_mmio_range(ioservid, start_addr, end_addr); +- xc_hvm_map_io_range_to_ioreq_server(xc, dom, ioservid, 1, ++ xc_hvm_map_io_range_to_ioreq_server(xen_xc, dom, ioservid, 1, + start_addr, end_addr); + } + +-static inline void xen_unmap_memory_section(xc_interface *xc, domid_t dom, ++static inline void xen_unmap_memory_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { +@@ -253,13 +257,12 @@ static inline void xen_unmap_memory_section(xc_interface *xc, domid_t dom, + return; + } + +- + trace_xen_unmap_mmio_range(ioservid, start_addr, end_addr); +- xc_hvm_unmap_io_range_from_ioreq_server(xc, dom, ioservid, 1, +- start_addr, end_addr); ++ xc_hvm_unmap_io_range_from_ioreq_server(xen_xc, dom, ioservid, ++ 1, start_addr, end_addr); + } + +-static inline void xen_map_io_section(xc_interface *xc, domid_t dom, ++static inline void xen_map_io_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { +@@ -271,13 +274,12 @@ static inline void xen_map_io_section(xc_interface *xc, domid_t dom, + return; + } + +- + trace_xen_map_portio_range(ioservid, start_addr, end_addr); +- xc_hvm_map_io_range_to_ioreq_server(xc, dom, ioservid, 0, ++ xc_hvm_map_io_range_to_ioreq_server(xen_xc, dom, ioservid, 0, + start_addr, end_addr); + } + +-static inline void xen_unmap_io_section(xc_interface *xc, domid_t dom, ++static inline void xen_unmap_io_section(domid_t dom, + ioservid_t ioservid, + MemoryRegionSection *section) + { +@@ -290,11 +292,11 @@ static inline void xen_unmap_io_section(xc_interface *xc, domid_t dom, + } + + trace_xen_unmap_portio_range(ioservid, start_addr, end_addr); +- xc_hvm_unmap_io_range_from_ioreq_server(xc, dom, ioservid, 0, +- start_addr, end_addr); ++ xc_hvm_unmap_io_range_from_ioreq_server(xen_xc, dom, ioservid, ++ 0, start_addr, end_addr); + } + +-static inline void xen_map_pcidev(xc_interface *xc, domid_t dom, ++static inline void xen_map_pcidev(domid_t dom, + ioservid_t ioservid, + PCIDevice *pci_dev) + { +@@ -304,13 +306,13 @@ static inline void xen_map_pcidev(xc_interface *xc, domid_t dom, + + trace_xen_map_pcidev(ioservid, pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); +- xc_hvm_map_pcidev_to_ioreq_server(xc, dom, ioservid, +- 0, pci_bus_num(pci_dev->bus), ++ xc_hvm_map_pcidev_to_ioreq_server(xen_xc, dom, ioservid, 0, ++ pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), + PCI_FUNC(pci_dev->devfn)); + } + +-static inline void xen_unmap_pcidev(xc_interface *xc, domid_t dom, ++static inline void xen_unmap_pcidev(domid_t dom, + ioservid_t ioservid, + PCIDevice *pci_dev) + { +@@ -320,16 +322,17 @@ static inline void xen_unmap_pcidev(xc_interface *xc, domid_t dom, + + trace_xen_unmap_pcidev(ioservid, pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); +- xc_hvm_unmap_pcidev_from_ioreq_server(xc, dom, ioservid, +- 0, pci_bus_num(pci_dev->bus), ++ xc_hvm_unmap_pcidev_from_ioreq_server(xen_xc, dom, ioservid, 0, ++ pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), + PCI_FUNC(pci_dev->devfn)); + } + +-static inline void xen_create_ioreq_server(xc_interface *xc, domid_t dom, ++static inline void xen_create_ioreq_server(domid_t dom, + ioservid_t *ioservid) + { +- int rc = xc_hvm_create_ioreq_server(xc, dom, HVM_IOREQSRV_BUFIOREQ_ATOMIC, ++ int rc = xc_hvm_create_ioreq_server(xen_xc, dom, ++ HVM_IOREQSRV_BUFIOREQ_ATOMIC, + ioservid); + + if (rc == 0) { +@@ -342,7 +345,7 @@ static inline void xen_create_ioreq_server(xc_interface *xc, domid_t dom, + trace_xen_default_ioreq_server(); + } + +-static inline void xen_destroy_ioreq_server(xc_interface *xc, domid_t dom, ++static inline void xen_destroy_ioreq_server(domid_t dom, + ioservid_t ioservid) + { + if (use_default_ioreq_server) { +@@ -350,27 +353,27 @@ static inline void xen_destroy_ioreq_server(xc_interface *xc, domid_t dom, + } + + trace_xen_ioreq_server_destroy(ioservid); +- xc_hvm_destroy_ioreq_server(xc, dom, ioservid); ++ xc_hvm_destroy_ioreq_server(xen_xc, dom, ioservid); + } + +-static inline int xen_get_ioreq_server_info(xc_interface *xc, domid_t dom, ++static inline int xen_get_ioreq_server_info(domid_t dom, + ioservid_t ioservid, + xen_pfn_t *ioreq_pfn, + xen_pfn_t *bufioreq_pfn, + evtchn_port_t *bufioreq_evtchn) + { + if (use_default_ioreq_server) { +- return xen_get_default_ioreq_server_info(xc, dom, ioreq_pfn, ++ return xen_get_default_ioreq_server_info(dom, ioreq_pfn, + bufioreq_pfn, + bufioreq_evtchn); + } + +- return xc_hvm_get_ioreq_server_info(xc, dom, ioservid, ++ return xc_hvm_get_ioreq_server_info(xen_xc, dom, ioservid, + ioreq_pfn, bufioreq_pfn, + bufioreq_evtchn); + } + +-static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, ++static inline int xen_set_ioreq_server_state(domid_t dom, + ioservid_t ioservid, + bool enable) + { +@@ -379,7 +382,8 @@ static inline int xen_set_ioreq_server_state(xc_interface *xc, domid_t dom, + } + + trace_xen_ioreq_server_state(ioservid, enable); +- return xc_hvm_set_ioreq_server_state(xc, dom, ioservid, enable); ++ return xc_hvm_set_ioreq_server_state(xen_xc, dom, ioservid, ++ enable); + } + + #endif +diff --git a/xen-common.c b/xen-common.c +index fd2c92847e..703e7a5861 100644 +--- a/xen-common.c ++++ b/xen-common.c +@@ -25,6 +25,9 @@ + do { } while (0) + #endif + ++xc_interface *xen_xc; ++xenforeignmemory_handle *xen_fmem; ++ + static int store_dev_info(int domid, Chardev *cs, const char *string) + { + struct xs_handle *xs = NULL; +diff --git a/xen-hvm.c b/xen-hvm.c +index 5043beb98f..dbb8c66dd3 100644 +--- a/xen-hvm.c ++++ b/xen-hvm.c +@@ -454,10 +454,10 @@ static void xen_set_memory(struct MemoryListener *listener, + return; + } else { + if (add) { +- xen_map_memory_section(xen_xc, xen_domid, state->ioservid, ++ xen_map_memory_section(xen_domid, state->ioservid, + section); + } else { +- xen_unmap_memory_section(xen_xc, xen_domid, state->ioservid, ++ xen_unmap_memory_section(xen_domid, state->ioservid, + section); + } + } +@@ -521,7 +521,7 @@ static void xen_io_add(MemoryListener *listener, + + memory_region_ref(mr); + +- xen_map_io_section(xen_xc, xen_domid, state->ioservid, section); ++ xen_map_io_section(xen_domid, state->ioservid, section); + } + + static void xen_io_del(MemoryListener *listener, +@@ -534,7 +534,7 @@ static void xen_io_del(MemoryListener *listener, + return; + } + +- xen_unmap_io_section(xen_xc, xen_domid, state->ioservid, section); ++ xen_unmap_io_section(xen_domid, state->ioservid, section); + + memory_region_unref(mr); + } +@@ -547,7 +547,7 @@ static void xen_device_realize(DeviceListener *listener, + if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { + PCIDevice *pci_dev = PCI_DEVICE(dev); + +- xen_map_pcidev(xen_xc, xen_domid, state->ioservid, pci_dev); ++ xen_map_pcidev(xen_domid, state->ioservid, pci_dev); + } + } + +@@ -559,7 +559,7 @@ static void xen_device_unrealize(DeviceListener *listener, + if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { + PCIDevice *pci_dev = PCI_DEVICE(dev); + +- xen_unmap_pcidev(xen_xc, xen_domid, state->ioservid, pci_dev); ++ xen_unmap_pcidev(xen_domid, state->ioservid, pci_dev); + } + } + +@@ -1139,7 +1139,7 @@ static void xen_hvm_change_state_handler(void *opaque, int running, + xen_main_loop_prepare(state); + } + +- xen_set_ioreq_server_state(xen_xc, xen_domid, ++ xen_set_ioreq_server_state(xen_domid, + state->ioservid, + (rstate == RUN_STATE_RUNNING)); + } +@@ -1227,7 +1227,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) + goto err; + } + +- xen_create_ioreq_server(xen_xc, xen_domid, &state->ioservid); ++ xen_create_ioreq_server(xen_domid, &state->ioservid); + + state->exit.notify = xen_exit_notifier; + qemu_add_exit_notifier(&state->exit); +@@ -1238,7 +1238,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) + state->wakeup.notify = xen_wakeup_notifier; + qemu_register_wakeup_notifier(&state->wakeup); + +- rc = xen_get_ioreq_server_info(xen_xc, xen_domid, state->ioservid, ++ rc = xen_get_ioreq_server_info(xen_domid, state->ioservid, + &ioreq_pfn, &bufioreq_pfn, + &bufioreq_evtchn); + if (rc < 0) { +@@ -1288,7 +1288,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) + /* Note: cpus is empty at this point in init */ + state->cpu_by_vcpu_id = g_malloc0(max_cpus * sizeof(CPUState *)); + +- rc = xen_set_ioreq_server_state(xen_xc, xen_domid, state->ioservid, true); ++ rc = xen_set_ioreq_server_state(xen_domid, state->ioservid, true); + if (rc < 0) { + error_report("failed to enable ioreq server info: error %d handle=%p", + errno, xen_xc); +-- +2.13.0 + diff --git a/0002-xen-rename-xen_modified_memory-to-xen_hvm_modified_m.patch b/0002-xen-rename-xen_modified_memory-to-xen_hvm_modified_m.patch new file mode 100644 index 0000000..b23b2db --- /dev/null +++ b/0002-xen-rename-xen_modified_memory-to-xen_hvm_modified_m.patch @@ -0,0 +1,83 @@ +From 0f6878d5529718216809846dd05b988134cb32d8 Mon Sep 17 00:00:00 2001 +From: Paul Durrant +Date: Tue, 7 Mar 2017 10:55:31 +0000 +Subject: [PATCH 2/6] xen: rename xen_modified_memory() to + xen_hvm_modified_memory() + +This patch is a purely cosmetic change that avoids a name collision in +a subsequent patch. + +Signed-off-by: Paul Durrant +Reviewed-by: Anthony Perard +Reviewed-by: Stefano Stabellini +--- + include/exec/ram_addr.h | 4 ++-- + include/hw/xen/xen.h | 2 +- + xen-hvm-stub.c | 2 +- + xen-hvm.c | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h +index b05dc84ab9..29647303b0 100644 +--- a/include/exec/ram_addr.h ++++ b/include/exec/ram_addr.h +@@ -260,7 +260,7 @@ static inline void cpu_physical_memory_set_dirty_range(ram_addr_t start, + + rcu_read_unlock(); + +- xen_modified_memory(start, length); ++ xen_hvm_modified_memory(start, length); + } + + #if !defined(_WIN32) +@@ -314,7 +314,7 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, + + rcu_read_unlock(); + +- xen_modified_memory(start, pages << TARGET_PAGE_BITS); ++ xen_hvm_modified_memory(start, pages << TARGET_PAGE_BITS); + } else { + uint8_t clients = tcg_enabled() ? DIRTY_CLIENTS_ALL : DIRTY_CLIENTS_NOCODE; + /* +diff --git a/include/hw/xen/xen.h b/include/hw/xen/xen.h +index 09c2ce5170..2b1733b747 100644 +--- a/include/hw/xen/xen.h ++++ b/include/hw/xen/xen.h +@@ -43,7 +43,7 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory); + + void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, + struct MemoryRegion *mr, Error **errp); +-void xen_modified_memory(ram_addr_t start, ram_addr_t length); ++void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length); + + void xen_register_framebuffer(struct MemoryRegion *mr); + +diff --git a/xen-hvm-stub.c b/xen-hvm-stub.c +index c5003251cb..3ca6c51b21 100644 +--- a/xen-hvm-stub.c ++++ b/xen-hvm-stub.c +@@ -50,7 +50,7 @@ void xen_register_framebuffer(MemoryRegion *mr) + { + } + +-void xen_modified_memory(ram_addr_t start, ram_addr_t length) ++void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length) + { + } + +diff --git a/xen-hvm.c b/xen-hvm.c +index dbb8c66dd3..edf4983702 100644 +--- a/xen-hvm.c ++++ b/xen-hvm.c +@@ -1391,7 +1391,7 @@ void xen_shutdown_fatal_error(const char *fmt, ...) + qemu_system_shutdown_request(); + } + +-void xen_modified_memory(ram_addr_t start, ram_addr_t length) ++void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length) + { + if (unlikely(xen_in_migration)) { + int rc; +-- +2.13.0 + diff --git a/0003-xen-create-wrappers-for-all-other-uses-of-xc_hvm_XXX.patch b/0003-xen-create-wrappers-for-all-other-uses-of-xc_hvm_XXX.patch new file mode 100644 index 0000000..a63777a --- /dev/null +++ b/0003-xen-create-wrappers-for-all-other-uses-of-xc_hvm_XXX.patch @@ -0,0 +1,179 @@ +From 8a69b7e617ce170295aaff4616713c11ef2d998c Mon Sep 17 00:00:00 2001 +From: Paul Durrant +Date: Tue, 7 Mar 2017 10:55:32 +0000 +Subject: [PATCH 3/6] xen: create wrappers for all other uses of xc_hvm_XXX() + functions + +This patch creates inline wrapper functions in xen_common.h for all open +coded calls to xc_hvm_XXX() functions outside of xen_common.h so that use +of xen_xc can be made implicit. This again is in preparation for the move +to using libxendevicemodel. + +Signed-off-by: Paul Durrant +Reviewed-by: Anthony Perard +Reviewed-by: Stefano Stabellini +(cherry picked from commit 8f25e7544150abd4bfd4ef35fe152c049b5ea5e7) +--- + hw/i386/xen/xen_platform.c | 2 +- + include/hw/xen/xen_common.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ + xen-hvm.c | 27 +++++++++++++-------------- + 3 files changed, 58 insertions(+), 15 deletions(-) + +diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c +index 6010f35266..1419fc96d2 100644 +--- a/hw/i386/xen/xen_platform.c ++++ b/hw/i386/xen/xen_platform.c +@@ -195,7 +195,7 @@ static void platform_fixed_ioport_writeb(void *opaque, uint32_t addr, uint32_t v + case 0: /* Platform flags */ { + hvmmem_type_t mem_type = (val & PFFLAG_ROM_LOCK) ? + HVMMEM_ram_ro : HVMMEM_ram_rw; +- if (xc_hvm_set_mem_type(xen_xc, xen_domid, mem_type, 0xc0, 0x40)) { ++ if (xen_set_mem_type(xen_domid, mem_type, 0xc0, 0x40)) { + DPRINTF("unable to change ro/rw state of ROM memory area!\n"); + } else { + s->flags = val & PFFLAG_ROM_LOCK; +diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h +index 1e08b98617..31cf25f846 100644 +--- a/include/hw/xen/xen_common.h ++++ b/include/hw/xen/xen_common.h +@@ -26,6 +26,50 @@ extern xc_interface *xen_xc; + * We don't support Xen prior to 4.2.0. + */ + ++static inline int xen_set_mem_type(domid_t domid, hvmmem_type_t type, ++ uint64_t first_pfn, uint32_t nr) ++{ ++ return xc_hvm_set_mem_type(xen_xc, domid, type, first_pfn, nr); ++} ++ ++static inline int xen_set_pci_intx_level(domid_t domid, uint16_t segment, ++ uint8_t bus, uint8_t device, ++ uint8_t intx, unsigned int level) ++{ ++ return xc_hvm_set_pci_intx_level(xen_xc, domid, segment, bus, device, ++ intx, level); ++} ++ ++static inline int xen_set_pci_link_route(domid_t domid, uint8_t link, ++ uint8_t irq) ++{ ++ return xc_hvm_set_pci_link_route(xen_xc, domid, link, irq); ++} ++ ++static inline int xen_inject_msi(domid_t domid, uint64_t msi_addr, ++ uint32_t msi_data) ++{ ++ return xc_hvm_inject_msi(xen_xc, domid, msi_addr, msi_data); ++} ++ ++static inline int xen_set_isa_irq_level(domid_t domid, uint8_t irq, ++ unsigned int level) ++{ ++ return xc_hvm_set_isa_irq_level(xen_xc, domid, irq, level); ++} ++ ++static inline int xen_track_dirty_vram(domid_t domid, uint64_t first_pfn, ++ uint32_t nr, unsigned long *bitmap) ++{ ++ return xc_hvm_track_dirty_vram(xen_xc, domid, first_pfn, nr, bitmap); ++} ++ ++static inline int xen_modified_memory(domid_t domid, uint64_t first_pfn, ++ uint32_t nr) ++{ ++ return xc_hvm_modified_memory(xen_xc, domid, first_pfn, nr); ++} ++ + /* Xen 4.2 through 4.6 */ + #if CONFIG_XEN_CTRL_INTERFACE_VERSION < 471 + +diff --git a/xen-hvm.c b/xen-hvm.c +index edf4983702..4b928cfb30 100644 +--- a/xen-hvm.c ++++ b/xen-hvm.c +@@ -125,8 +125,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) + { +- xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num >> 2, +- irq_num & 3, level); ++ xen_set_pci_intx_level(xen_domid, 0, 0, irq_num >> 2, ++ irq_num & 3, level); + } + + void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) +@@ -141,7 +141,7 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) + } + v &= 0xf; + if (((address + i) >= 0x60) && ((address + i) <= 0x63)) { +- xc_hvm_set_pci_link_route(xen_xc, xen_domid, address + i - 0x60, v); ++ xen_set_pci_link_route(xen_domid, address + i - 0x60, v); + } + } + } +@@ -156,7 +156,7 @@ int xen_is_pirq_msi(uint32_t msi_data) + + void xen_hvm_inject_msi(uint64_t addr, uint32_t data) + { +- xc_hvm_inject_msi(xen_xc, xen_domid, addr, data); ++ xen_inject_msi(xen_domid, addr, data); + } + + static void xen_suspend_notifier(Notifier *notifier, void *data) +@@ -168,7 +168,7 @@ static void xen_suspend_notifier(Notifier *notifier, void *data) + + static void xen_set_irq(void *opaque, int irq, int level) + { +- xc_hvm_set_isa_irq_level(xen_xc, xen_domid, irq, level); ++ xen_set_isa_irq_level(xen_domid, irq, level); + } + + qemu_irq *xen_interrupt_controller_init(void) +@@ -481,10 +481,10 @@ static void xen_set_memory(struct MemoryListener *listener, + section->mr, section->offset_within_region); + } else { + mem_type = HVMMEM_ram_ro; +- if (xc_hvm_set_mem_type(xen_xc, xen_domid, mem_type, +- start_addr >> TARGET_PAGE_BITS, +- size >> TARGET_PAGE_BITS)) { +- DPRINTF("xc_hvm_set_mem_type error, addr: "TARGET_FMT_plx"\n", ++ if (xen_set_mem_type(xen_domid, mem_type, ++ start_addr >> TARGET_PAGE_BITS, ++ size >> TARGET_PAGE_BITS)) { ++ DPRINTF("xen_set_mem_type error, addr: "TARGET_FMT_plx"\n", + start_addr); + } + } +@@ -586,9 +586,8 @@ static void xen_sync_dirty_bitmap(XenIOState *state, + return; + } + +- rc = xc_hvm_track_dirty_vram(xen_xc, xen_domid, +- start_addr >> TARGET_PAGE_BITS, npages, +- bitmap); ++ rc = xen_track_dirty_vram(xen_domid, start_addr >> TARGET_PAGE_BITS, ++ npages, bitmap); + if (rc < 0) { + #ifndef ENODATA + #define ENODATA ENOENT +@@ -634,7 +633,7 @@ static void xen_log_stop(MemoryListener *listener, MemoryRegionSection *section, + if (old & ~new & (1 << DIRTY_MEMORY_VGA)) { + state->log_for_dirtybit = NULL; + /* Disable dirty bit tracking */ +- xc_hvm_track_dirty_vram(xen_xc, xen_domid, 0, 0, NULL); ++ xen_track_dirty_vram(xen_domid, 0, 0, NULL); + } + } + +@@ -1403,7 +1402,7 @@ void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length) + start_pfn = start >> TARGET_PAGE_BITS; + nb_pages = ((start + length + TARGET_PAGE_SIZE - 1) >> TARGET_PAGE_BITS) + - start_pfn; +- rc = xc_hvm_modified_memory(xen_xc, xen_domid, start_pfn, nb_pages); ++ rc = xen_modified_memory(xen_domid, start_pfn, nb_pages); + if (rc) { + fprintf(stderr, + "%s failed for "RAM_ADDR_FMT" ("RAM_ADDR_FMT"): %i, %s\n", +-- +2.13.0 + diff --git a/0004-configure-detect-presence-of-libxendevicemodel.patch b/0004-configure-detect-presence-of-libxendevicemodel.patch new file mode 100644 index 0000000..de3b6e6 --- /dev/null +++ b/0004-configure-detect-presence-of-libxendevicemodel.patch @@ -0,0 +1,60 @@ +From 85f61ad8c70b51e541745503d650d0e628809c17 Mon Sep 17 00:00:00 2001 +From: Paul Durrant +Date: Tue, 7 Mar 2017 10:55:33 +0000 +Subject: [PATCH 4/6] configure: detect presence of libxendevicemodel + +This patch adds code in configure to set CONFIG_XEN_CTRL_INTERFACE_VERSION +to a new value of 490 if libxendevicemodel is present in the build +environment. + +Signed-off-by: Paul Durrant +Signed-off-by: Stefano Stabellini +Reviewed-by: Anthony Perard +Reviewed-by: Stefano Stabellini +(cherry picked from commit da8090ccb7735aed5a46ce27dfbe8486cfce61f5) +--- + configure | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index be4d326ae0..092cb7359d 100755 +--- a/configure ++++ b/configure +@@ -1989,7 +1989,7 @@ fi + + if test "$xen" != "no" ; then + xen_libs="-lxenstore -lxenctrl -lxenguest" +- xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn" ++ xen_stable_libs="-lxencall -lxenforeignmemory -lxengnttab -lxenevtchn" + + # First we test whether Xen headers and libraries are available. + # If no, we are done and there is no Xen support. +@@ -2012,6 +2012,25 @@ EOF + # Xen unstable + elif + cat > $TMPC < ++int main(void) { ++ xendevicemodel_handle *xd; ++ ++ xd = xendevicemodel_open(0, 0); ++ xendevicemodel_close(xd); ++ ++ return 0; ++} ++EOF ++ compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs" ++ then ++ xen_stable_libs="-lxendevicemodel $xen_stable_libs" ++ xen_ctrl_version=490 ++ xen=yes ++ elif ++ cat > $TMPC < +Date: Tue, 7 Mar 2017 10:55:34 +0000 +Subject: [PATCH 5/6] xen: use libxendevicemodel when available + +This patch modifies the wrapper functions in xen_common.h to use the +new xendevicemodel interface if it is available along with compatibility +code to use the old libxenctrl interface if it is not. + +Signed-off-by: Paul Durrant +Signed-off-by: Stefano Stabellini +Reviewed-by: Anthony Perard +Reviewed-by: Stefano Stabellini +(cherry picked from commit d655f34e6d6a68f64e885fa85295e0c7a31ce846) +--- + include/hw/xen/xen_common.h | 203 +++++++++++++++++++++++++++++++++++++------- + xen-common.c | 8 ++ + 2 files changed, 178 insertions(+), 33 deletions(-) + +diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h +index 31cf25f846..b1f5f53e35 100644 +--- a/include/hw/xen/xen_common.h ++++ b/include/hw/xen/xen_common.h +@@ -26,48 +26,184 @@ extern xc_interface *xen_xc; + * We don't support Xen prior to 4.2.0. + */ + ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 490 ++ ++typedef xc_interface xendevicemodel_handle; ++ ++static inline xendevicemodel_handle *xendevicemodel_open( ++ struct xentoollog_logger *logger, unsigned int open_flags) ++{ ++ return xen_xc; ++} ++ ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 450 ++ ++static inline int xendevicemodel_create_ioreq_server( ++ xendevicemodel_handle *dmod, domid_t domid, int handle_bufioreq, ++ ioservid_t *id) ++{ ++ return xc_hvm_create_ioreq_server(dmod, domid, handle_bufioreq, ++ id); ++} ++ ++static inline int xendevicemodel_get_ioreq_server_info( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, ++ xen_pfn_t *ioreq_pfn, xen_pfn_t *bufioreq_pfn, ++ evtchn_port_t *bufioreq_port) ++{ ++ return xc_hvm_get_ioreq_server_info(dmod, domid, id, ioreq_pfn, ++ bufioreq_pfn, bufioreq_port); ++} ++ ++static inline int xendevicemodel_map_io_range_to_ioreq_server( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, int is_mmio, ++ uint64_t start, uint64_t end) ++{ ++ return xc_hvm_map_io_range_to_ioreq_server(dmod, domid, id, is_mmio, ++ start, end); ++} ++ ++static inline int xendevicemodel_unmap_io_range_from_ioreq_server( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, int is_mmio, ++ uint64_t start, uint64_t end) ++{ ++ return xc_hvm_unmap_io_range_from_ioreq_server(dmod, domid, id, is_mmio, ++ start, end); ++} ++ ++static inline int xendevicemodel_map_pcidev_to_ioreq_server( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, ++ uint16_t segment, uint8_t bus, uint8_t device, uint8_t function) ++{ ++ return xc_hvm_map_pcidev_to_ioreq_server(dmod, domid, id, segment, ++ bus, device, function); ++} ++ ++static inline int xendevicemodel_unmap_pcidev_from_ioreq_server( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, ++ uint16_t segment, uint8_t bus, uint8_t device, uint8_t function) ++{ ++ return xc_hvm_unmap_pcidev_from_ioreq_server(dmod, domid, id, segment, ++ bus, device, function); ++} ++ ++static inline int xendevicemodel_destroy_ioreq_server( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id) ++{ ++ return xc_hvm_destroy_ioreq_server(dmod, domid, id); ++} ++ ++static inline int xendevicemodel_set_ioreq_server_state( ++ xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, int enabled) ++{ ++ return xc_hvm_set_ioreq_server_state(dmod, domid, id, enabled); ++} ++ ++#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 450 */ ++ ++static inline int xendevicemodel_set_pci_intx_level( ++ xendevicemodel_handle *dmod, domid_t domid, uint16_t segment, ++ uint8_t bus, uint8_t device, uint8_t intx, unsigned int level) ++{ ++ return xc_hvm_set_pci_intx_level(dmod, domid, segment, bus, device, ++ intx, level); ++} ++ ++static inline int xendevicemodel_set_isa_irq_level( ++ xendevicemodel_handle *dmod, domid_t domid, uint8_t irq, ++ unsigned int level) ++{ ++ return xc_hvm_set_isa_irq_level(dmod, domid, irq, level); ++} ++ ++static inline int xendevicemodel_set_pci_link_route( ++ xendevicemodel_handle *dmod, domid_t domid, uint8_t link, uint8_t irq) ++{ ++ return xc_hvm_set_pci_link_route(dmod, domid, link, irq); ++} ++ ++static inline int xendevicemodel_inject_msi( ++ xendevicemodel_handle *dmod, domid_t domid, uint64_t msi_addr, ++ uint32_t msi_data) ++{ ++ return xc_hvm_inject_msi(dmod, domid, msi_addr, msi_data); ++} ++ ++static inline int xendevicemodel_track_dirty_vram( ++ xendevicemodel_handle *dmod, domid_t domid, uint64_t first_pfn, ++ uint32_t nr, unsigned long *dirty_bitmap) ++{ ++ return xc_hvm_track_dirty_vram(dmod, domid, first_pfn, nr, ++ dirty_bitmap); ++} ++ ++static inline int xendevicemodel_modified_memory( ++ xendevicemodel_handle *dmod, domid_t domid, uint64_t first_pfn, ++ uint32_t nr) ++{ ++ return xc_hvm_modified_memory(dmod, domid, first_pfn, nr); ++} ++ ++static inline int xendevicemodel_set_mem_type( ++ xendevicemodel_handle *dmod, domid_t domid, hvmmem_type_t mem_type, ++ uint64_t first_pfn, uint32_t nr) ++{ ++ return xc_hvm_set_mem_type(dmod, domid, mem_type, first_pfn, nr); ++} ++ ++#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 490 */ ++ ++#undef XC_WANT_COMPAT_DEVICEMODEL_API ++#include ++ ++#endif ++ ++extern xendevicemodel_handle *xen_dmod; ++ + static inline int xen_set_mem_type(domid_t domid, hvmmem_type_t type, + uint64_t first_pfn, uint32_t nr) + { +- return xc_hvm_set_mem_type(xen_xc, domid, type, first_pfn, nr); ++ return xendevicemodel_set_mem_type(xen_dmod, domid, type, first_pfn, ++ nr); + } + + static inline int xen_set_pci_intx_level(domid_t domid, uint16_t segment, + uint8_t bus, uint8_t device, + uint8_t intx, unsigned int level) + { +- return xc_hvm_set_pci_intx_level(xen_xc, domid, segment, bus, device, +- intx, level); ++ return xendevicemodel_set_pci_intx_level(xen_dmod, domid, segment, bus, ++ device, intx, level); + } + + static inline int xen_set_pci_link_route(domid_t domid, uint8_t link, + uint8_t irq) + { +- return xc_hvm_set_pci_link_route(xen_xc, domid, link, irq); ++ return xendevicemodel_set_pci_link_route(xen_dmod, domid, link, irq); + } + + static inline int xen_inject_msi(domid_t domid, uint64_t msi_addr, + uint32_t msi_data) + { +- return xc_hvm_inject_msi(xen_xc, domid, msi_addr, msi_data); ++ return xendevicemodel_inject_msi(xen_dmod, domid, msi_addr, msi_data); + } + + static inline int xen_set_isa_irq_level(domid_t domid, uint8_t irq, + unsigned int level) + { +- return xc_hvm_set_isa_irq_level(xen_xc, domid, irq, level); ++ return xendevicemodel_set_isa_irq_level(xen_dmod, domid, irq, level); + } + + static inline int xen_track_dirty_vram(domid_t domid, uint64_t first_pfn, + uint32_t nr, unsigned long *bitmap) + { +- return xc_hvm_track_dirty_vram(xen_xc, domid, first_pfn, nr, bitmap); ++ return xendevicemodel_track_dirty_vram(xen_dmod, domid, first_pfn, nr, ++ bitmap); + } + + static inline int xen_modified_memory(domid_t domid, uint64_t first_pfn, + uint32_t nr) + { +- return xc_hvm_modified_memory(xen_xc, domid, first_pfn, nr); ++ return xendevicemodel_modified_memory(xen_dmod, domid, first_pfn, nr); + } + + /* Xen 4.2 through 4.6 */ +@@ -97,6 +233,7 @@ typedef xc_gnttab xengnttab_handle; + xc_gnttab_map_domain_grant_refs(h, c, d, r, p) + + #define xenforeignmemory_open(l, f) xen_xc ++#define xenforeignmemory_close(h) + + static inline void *xenforeignmemory_map(xc_interface *h, uint32_t dom, + int prot, size_t pages, +@@ -285,8 +422,8 @@ static inline void xen_map_memory_section(domid_t dom, + } + + trace_xen_map_mmio_range(ioservid, start_addr, end_addr); +- xc_hvm_map_io_range_to_ioreq_server(xen_xc, dom, ioservid, 1, +- start_addr, end_addr); ++ xendevicemodel_map_io_range_to_ioreq_server(xen_dmod, dom, ioservid, 1, ++ start_addr, end_addr); + } + + static inline void xen_unmap_memory_section(domid_t dom, +@@ -302,8 +439,8 @@ static inline void xen_unmap_memory_section(domid_t dom, + } + + trace_xen_unmap_mmio_range(ioservid, start_addr, end_addr); +- xc_hvm_unmap_io_range_from_ioreq_server(xen_xc, dom, ioservid, +- 1, start_addr, end_addr); ++ xendevicemodel_unmap_io_range_from_ioreq_server(xen_dmod, dom, ioservid, ++ 1, start_addr, end_addr); + } + + static inline void xen_map_io_section(domid_t dom, +@@ -319,8 +456,8 @@ static inline void xen_map_io_section(domid_t dom, + } + + trace_xen_map_portio_range(ioservid, start_addr, end_addr); +- xc_hvm_map_io_range_to_ioreq_server(xen_xc, dom, ioservid, 0, +- start_addr, end_addr); ++ xendevicemodel_map_io_range_to_ioreq_server(xen_dmod, dom, ioservid, 0, ++ start_addr, end_addr); + } + + static inline void xen_unmap_io_section(domid_t dom, +@@ -336,8 +473,8 @@ static inline void xen_unmap_io_section(domid_t dom, + } + + trace_xen_unmap_portio_range(ioservid, start_addr, end_addr); +- xc_hvm_unmap_io_range_from_ioreq_server(xen_xc, dom, ioservid, +- 0, start_addr, end_addr); ++ xendevicemodel_unmap_io_range_from_ioreq_server(xen_dmod, dom, ioservid, ++ 0, start_addr, end_addr); + } + + static inline void xen_map_pcidev(domid_t dom, +@@ -350,10 +487,10 @@ static inline void xen_map_pcidev(domid_t dom, + + trace_xen_map_pcidev(ioservid, pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); +- xc_hvm_map_pcidev_to_ioreq_server(xen_xc, dom, ioservid, 0, +- pci_bus_num(pci_dev->bus), +- PCI_SLOT(pci_dev->devfn), +- PCI_FUNC(pci_dev->devfn)); ++ xendevicemodel_map_pcidev_to_ioreq_server(xen_dmod, dom, ioservid, 0, ++ pci_bus_num(pci_dev->bus), ++ PCI_SLOT(pci_dev->devfn), ++ PCI_FUNC(pci_dev->devfn)); + } + + static inline void xen_unmap_pcidev(domid_t dom, +@@ -366,18 +503,18 @@ static inline void xen_unmap_pcidev(domid_t dom, + + trace_xen_unmap_pcidev(ioservid, pci_bus_num(pci_dev->bus), + PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); +- xc_hvm_unmap_pcidev_from_ioreq_server(xen_xc, dom, ioservid, 0, +- pci_bus_num(pci_dev->bus), +- PCI_SLOT(pci_dev->devfn), +- PCI_FUNC(pci_dev->devfn)); ++ xendevicemodel_unmap_pcidev_from_ioreq_server(xen_dmod, dom, ioservid, 0, ++ pci_bus_num(pci_dev->bus), ++ PCI_SLOT(pci_dev->devfn), ++ PCI_FUNC(pci_dev->devfn)); + } + + static inline void xen_create_ioreq_server(domid_t dom, + ioservid_t *ioservid) + { +- int rc = xc_hvm_create_ioreq_server(xen_xc, dom, +- HVM_IOREQSRV_BUFIOREQ_ATOMIC, +- ioservid); ++ int rc = xendevicemodel_create_ioreq_server(xen_dmod, dom, ++ HVM_IOREQSRV_BUFIOREQ_ATOMIC, ++ ioservid); + + if (rc == 0) { + trace_xen_ioreq_server_create(*ioservid); +@@ -397,7 +534,7 @@ static inline void xen_destroy_ioreq_server(domid_t dom, + } + + trace_xen_ioreq_server_destroy(ioservid); +- xc_hvm_destroy_ioreq_server(xen_xc, dom, ioservid); ++ xendevicemodel_destroy_ioreq_server(xen_dmod, dom, ioservid); + } + + static inline int xen_get_ioreq_server_info(domid_t dom, +@@ -412,9 +549,9 @@ static inline int xen_get_ioreq_server_info(domid_t dom, + bufioreq_evtchn); + } + +- return xc_hvm_get_ioreq_server_info(xen_xc, dom, ioservid, +- ioreq_pfn, bufioreq_pfn, +- bufioreq_evtchn); ++ return xendevicemodel_get_ioreq_server_info(xen_dmod, dom, ioservid, ++ ioreq_pfn, bufioreq_pfn, ++ bufioreq_evtchn); + } + + static inline int xen_set_ioreq_server_state(domid_t dom, +@@ -426,8 +563,8 @@ static inline int xen_set_ioreq_server_state(domid_t dom, + } + + trace_xen_ioreq_server_state(ioservid, enable); +- return xc_hvm_set_ioreq_server_state(xen_xc, dom, ioservid, +- enable); ++ return xendevicemodel_set_ioreq_server_state(xen_dmod, dom, ioservid, ++ enable); + } + + #endif +diff --git a/xen-common.c b/xen-common.c +index 703e7a5861..ae76150e8a 100644 +--- a/xen-common.c ++++ b/xen-common.c +@@ -27,6 +27,7 @@ + + xc_interface *xen_xc; + xenforeignmemory_handle *xen_fmem; ++xendevicemodel_handle *xen_dmod; + + static int store_dev_info(int domid, Chardev *cs, const char *string) + { +@@ -128,6 +129,13 @@ static int xen_init(MachineState *ms) + xc_interface_close(xen_xc); + return -1; + } ++ xen_dmod = xendevicemodel_open(0, 0); ++ if (xen_dmod == NULL) { ++ xen_pv_printf(NULL, 0, "can't open xen devicemodel interface\n"); ++ xenforeignmemory_close(xen_fmem); ++ xc_interface_close(xen_xc); ++ return -1; ++ } + qemu_add_vm_change_state_handler(xen_change_state_handler, NULL); + + global_state_set_optional(); +-- +2.13.0 + diff --git a/0006-xen-use-5-digit-xen-versions.patch b/0006-xen-use-5-digit-xen-versions.patch new file mode 100644 index 0000000..4a63356 --- /dev/null +++ b/0006-xen-use-5-digit-xen-versions.patch @@ -0,0 +1,217 @@ +From 490e4b67768f167736c0a1084a5d6917431c783e Mon Sep 17 00:00:00 2001 +From: Juergen Gross +Date: Thu, 16 Mar 2017 15:19:52 +0100 +Subject: [PATCH 6/6] xen: use 5 digit xen versions + +Today qemu is using e.g. the value 480 for Xen version 4.8.0. As some +Xen version tests are using ">" relations this scheme will lead to +problems when Xen version 4.10.0 is being reached. + +Instead of the 3 digit schem use a 5 digit scheme (e.g. 40800 for +version 4.8.0). + +Signed-off-by: Juergen Gross +Signed-off-by: Stefano Stabellini +Reviewed-by: Stefano Stabellini +(cherry picked from commit f1167ee684279bffabe7bb3ab23eff87577fe427) +--- + configure | 16 ++++++++-------- + hw/block/xen_disk.c | 2 +- + include/hw/xen/xen_common.h | 22 +++++++++++----------- + 3 files changed, 20 insertions(+), 20 deletions(-) + +diff --git a/configure b/configure +index 092cb7359d..d5ee30aad8 100755 +--- a/configure ++++ b/configure +@@ -2027,7 +2027,7 @@ EOF + compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs" + then + xen_stable_libs="-lxendevicemodel $xen_stable_libs" +- xen_ctrl_version=490 ++ xen_ctrl_version=40900 + xen=yes + elif + cat > $TMPC < $TMPC < $TMPC <= 480 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40800 + + static void ioreq_free_copy_buffers(struct ioreq *ioreq) + { +diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h +index b1f5f53e35..fa990a07c0 100644 +--- a/include/hw/xen/xen_common.h ++++ b/include/hw/xen/xen_common.h +@@ -26,7 +26,7 @@ extern xc_interface *xen_xc; + * We don't support Xen prior to 4.2.0. + */ + +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 490 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900 + + typedef xc_interface xendevicemodel_handle; + +@@ -36,7 +36,7 @@ static inline xendevicemodel_handle *xendevicemodel_open( + return xen_xc; + } + +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 450 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40500 + + static inline int xendevicemodel_create_ioreq_server( + xendevicemodel_handle *dmod, domid_t domid, int handle_bufioreq, +@@ -99,7 +99,7 @@ static inline int xendevicemodel_set_ioreq_server_state( + return xc_hvm_set_ioreq_server_state(dmod, domid, id, enabled); + } + +-#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 450 */ ++#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40500 */ + + static inline int xendevicemodel_set_pci_intx_level( + xendevicemodel_handle *dmod, domid_t domid, uint16_t segment, +@@ -151,7 +151,7 @@ static inline int xendevicemodel_set_mem_type( + return xc_hvm_set_mem_type(dmod, domid, mem_type, first_pfn, nr); + } + +-#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 490 */ ++#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40900 */ + + #undef XC_WANT_COMPAT_DEVICEMODEL_API + #include +@@ -207,7 +207,7 @@ static inline int xen_modified_memory(domid_t domid, uint64_t first_pfn, + } + + /* Xen 4.2 through 4.6 */ +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 471 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40701 + + typedef xc_interface xenforeignmemory_handle; + typedef xc_evtchn xenevtchn_handle; +@@ -248,7 +248,7 @@ static inline void *xenforeignmemory_map(xc_interface *h, uint32_t dom, + + #define xenforeignmemory_unmap(h, p, s) munmap(p, s * XC_PAGE_SIZE) + +-#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 471 */ ++#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40701 */ + + #include + #include +@@ -284,7 +284,7 @@ static inline int xen_get_vmport_regs_pfn(xc_interface *xc, domid_t dom, + #endif + + /* Xen before 4.6 */ +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 460 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40600 + + #ifndef HVM_IOREQSRV_BUFIOREQ_ATOMIC + #define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2 +@@ -330,7 +330,7 @@ static inline int xen_get_default_ioreq_server_info(domid_t dom, + } + + /* Xen before 4.5 */ +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 450 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40500 + + #ifndef HVM_PARAM_BUFIOREQ_EVTCHN + #define HVM_PARAM_BUFIOREQ_EVTCHN 26 +@@ -569,7 +569,7 @@ static inline int xen_set_ioreq_server_state(domid_t dom, + + #endif + +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 460 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40600 + static inline int xen_xc_domain_add_to_physmap(xc_interface *xch, uint32_t domid, + unsigned int space, + unsigned long idx, +@@ -592,7 +592,7 @@ static inline int xen_xc_domain_add_to_physmap(xc_interface *xch, uint32_t domid + #endif + + #ifdef CONFIG_XEN_PV_DOMAIN_BUILD +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 470 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40700 + static inline int xen_domain_create(xc_interface *xc, uint32_t ssidref, + xen_domain_handle_t handle, uint32_t flags, + uint32_t *pdomid) +@@ -611,7 +611,7 @@ static inline int xen_domain_create(xc_interface *xc, uint32_t ssidref, + + /* Xen before 4.8 */ + +-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 480 ++#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40800 + + + typedef void *xengnttab_grant_copy_segment_t; +-- +2.13.0 + diff --git a/qemu.spec b/qemu.spec index f09dccf..7c48551 100644 --- a/qemu.spec +++ b/qemu.spec @@ -92,7 +92,7 @@ Requires: %{name}-block-ssh = %{epoch}:%{version}-%{release} Summary: QEMU is a FAST! processor emulator Name: qemu Version: 2.9.0 -Release: 5%{?rcrel}%{?dist} +Release: 6%{?rcrel}%{?dist} Epoch: 2 License: GPLv2+ and LGPLv2+ and BSD Group: Development/Tools @@ -160,6 +160,13 @@ Patch0104: 0104-qemu-nbd-Ignore-SIGPIPE.patch # Build fix; https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg06005.html Patch0200: 0200-Update-references-of-struct-ucontext-to-ucontext_t.patch +Patch1001: 0001-xen-make-use-of-xen_xc-implicit-in-xen_common.h-inli.patch +Patch1002: 0002-xen-rename-xen_modified_memory-to-xen_hvm_modified_m.patch +Patch1003: 0003-xen-create-wrappers-for-all-other-uses-of-xc_hvm_XXX.patch +Patch1004: 0004-configure-detect-presence-of-libxendevicemodel.patch +Patch1005: 0005-xen-use-libxendevicemodel-when-available.patch +Patch1006: 0006-xen-use-5-digit-xen-versions.patch + # documentation deps BuildRequires: texinfo # For /usr/bin/pod2man @@ -2033,6 +2040,9 @@ getent passwd qemu >/dev/null || \ %changelog +* Wed Jul 19 2017 Nathaniel McCallum - 2:2.9.0-6 +- Fixes for compat with Xen 4.9 + * Tue Jul 18 2017 Nathaniel McCallum - 2:2.9.0-5 - Fix ucontext_t references