All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xen: require Xen 4.11.0 or later
@ 2026-10-31  8:34 Paolo Bonzini
  2026-11-02  9:22 ` Daniel P. Berrangé
  0 siblings, 1 reply; 2+ messages in thread
From: Paolo Bonzini @ 2026-10-31  8:34 UTC (permalink / raw)
  To: qemu-devel

Xen 4.11 was released on July 10, 2018.  Require it to clean up
code that deals with old versions that lacked utility libraries.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build                 |  44 ++------
 include/hw/xen/xen_native.h | 215 +-----------------------------------
 hw/xen/xen-operations.c     |   5 -
 scripts/xen-detect.c        | 152 +++----------------------
 4 files changed, 26 insertions(+), 390 deletions(-)

diff --git a/meson.build b/meson.build
index d18677e026a..8ab378e7b1b 100644
--- a/meson.build
+++ b/meson.build
@@ -975,7 +975,7 @@ endif
 xen = not_found
 if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
   xencontrol = dependency('xencontrol', required: false,
-                          method: 'pkg-config')
+                          version: '>=4.11.0', method: 'pkg-config')
   if xencontrol.found()
     xen_pc = declare_dependency(version: xencontrol.version(),
       dependencies: [
@@ -996,45 +996,23 @@ if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
         dependency('xendevicemodel', required: false,
                    method: 'pkg-config',
                    disabler: true),
-        # optional, no "disabler: true"
         dependency('xentoolcore', required: false,
-                   method: 'pkg-config')])
+                   method: 'pkg-config',
+                   disabler: true)])
     if xen_pc.found()
       xen = xen_pc
     endif
   endif
   if not xen.found()
-    xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
-    xen_libs = {
-      '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
-      '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
-      '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
-      '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
-      '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
-    }
-    xen_deps = {}
-    foreach ver: xen_tests
-      # cache the various library tests to avoid polluting the logs
-      xen_test_deps = []
-      foreach l: xen_libs[ver]
-        if l not in xen_deps
-          xen_deps += { l: cc.find_library(l, required: false) }
-        endif
-        xen_test_deps += xen_deps[l]
-      endforeach
-
-      # Use -D to pick just one of the test programs in scripts/xen-detect.c
-      xen_version = ver.split('.')
-      xen_ctrl_version = xen_version[0] + \
-        ('0' + xen_version[1]).substring(-2) + \
-        ('0' + xen_version[2]).substring(-2)
-      if cc.links(files('scripts/xen-detect.c'),
-                  args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
-                  dependencies: xen_test_deps)
-        xen = declare_dependency(version: ver, dependencies: xen_test_deps)
-        break
-      endif
+    xen_test_deps = []
+    foreach l: [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ]
+      xen_test_deps += cc.find_library(l, required: get_option('xen'))
     endforeach
+
+    # Use -D to pick just one of the test programs in scripts/xen-detect.c
+    if cc.links(files('scripts/xen-detect.c'), dependencies: xen_test_deps)
+      xen = declare_dependency(version: '4.11.0', dependencies: xen_test_deps)
+    endif
   endif
   if xen.found()
     accelerators += 'CONFIG_XEN'
diff --git a/include/hw/xen/xen_native.h b/include/hw/xen/xen_native.h
index 5caf91a6162..260148ceabb 100644
--- a/include/hw/xen/xen_native.h
+++ b/include/hw/xen/xen_native.h
@@ -24,231 +24,18 @@
 extern xc_interface *xen_xc;
 
 /*
- * We don't support Xen prior to 4.7.1.
+ * We don't support Xen prior to 4.11.0.
  */
 
 #include <xenforeignmemory.h>
 
 extern xenforeignmemory_handle *xen_fmem;
 
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900
-
-typedef xc_interface xendevicemodel_handle;
-
-#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40900 */
-
 #undef XC_WANT_COMPAT_DEVICEMODEL_API
 #include <xendevicemodel.h>
 
-#endif
-
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41100
-
-static inline int xendevicemodel_relocate_memory(
-    xendevicemodel_handle *dmod, domid_t domid, uint32_t size, uint64_t src_gfn,
-    uint64_t dst_gfn)
-{
-    uint32_t i;
-    int rc;
-
-    for (i = 0; i < size; i++) {
-        unsigned long idx = src_gfn + i;
-        xen_pfn_t gpfn = dst_gfn + i;
-
-        rc = xc_domain_add_to_physmap(xen_xc, domid, XENMAPSPACE_gmfn, idx,
-                                      gpfn);
-        if (rc) {
-            return rc;
-        }
-    }
-
-    return 0;
-}
-
-static inline int xendevicemodel_pin_memory_cacheattr(
-    xendevicemodel_handle *dmod, domid_t domid, uint64_t start, uint64_t end,
-    uint32_t type)
-{
-    return xc_domain_pin_memory_cacheattr(xen_xc, domid, start, end, type);
-}
-
-typedef void xenforeignmemory_resource_handle;
-
-#define XENMEM_resource_ioreq_server 0
-
-#define XENMEM_resource_ioreq_server_frame_bufioreq 0
-#define XENMEM_resource_ioreq_server_frame_ioreq(n) (1 + (n))
-
-static inline xenforeignmemory_resource_handle *xenforeignmemory_map_resource(
-    xenforeignmemory_handle *fmem, domid_t domid, unsigned int type,
-    unsigned int id, unsigned long frame, unsigned long nr_frames,
-    void **paddr, int prot, int flags)
-{
-    errno = EOPNOTSUPP;
-    return NULL;
-}
-
-static inline int xenforeignmemory_unmap_resource(
-    xenforeignmemory_handle *fmem, xenforeignmemory_resource_handle *fres)
-{
-    return 0;
-}
-
-#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION < 41100 */
-
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41000
-
-#define XEN_COMPAT_PHYSMAP
-static inline void *xenforeignmemory_map2(xenforeignmemory_handle *h,
-                                          uint32_t dom, void *addr,
-                                          int prot, int flags, size_t pages,
-                                          const xen_pfn_t arr[/*pages*/],
-                                          int err[/*pages*/])
-{
-    assert(addr == NULL && flags == 0);
-    return xenforeignmemory_map(h, dom, prot, pages, arr, err);
-}
-
-static inline int xentoolcore_restrict_all(domid_t domid)
-{
-    errno = ENOTTY;
-    return -1;
-}
-
-static inline int xendevicemodel_shutdown(xendevicemodel_handle *dmod,
-                                          domid_t domid, unsigned int reason)
-{
-    errno = ENOTTY;
-    return -1;
-}
-
-#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 41000 */
-
 #include <xentoolcore.h>
 
-#endif
-
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900
-
-static inline xendevicemodel_handle *xendevicemodel_open(
-    struct xentoollog_logger *logger, unsigned int open_flags)
-{
-    return xen_xc;
-}
-
-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);
-}
-
-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);
-}
-
-#endif
-
 extern xendevicemodel_handle *xen_dmod;
 
 static inline int xen_set_mem_type(domid_t domid, hvmmem_type_t type,
diff --git a/hw/xen/xen-operations.c b/hw/xen/xen-operations.c
index e00983ec447..d4b177e17e0 100644
--- a/hw/xen/xen-operations.c
+++ b/hw/xen/xen-operations.c
@@ -89,8 +89,6 @@ done:
     return rc;
 }
 
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40800
-
 static int libxengnttab_backend_grant_copy(xengnttab_handle *xgt,
                                            bool to_domain, uint32_t domid,
                                            XenGrantCopySegment *segs,
@@ -149,7 +147,6 @@ done:
     g_free(xengnttab_segs);
     return rc;
 }
-#endif
 
 static xenevtchn_handle *libxenevtchn_backend_open(void)
 {
@@ -406,7 +403,6 @@ struct xenstore_backend_ops libxenstore_backend_ops = {
 
 void setup_xen_backend_ops(void)
 {
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40800
     xengnttab_handle *xgt = xengnttab_open(NULL, 0);
 
     if (xgt) {
@@ -415,7 +411,6 @@ void setup_xen_backend_ops(void)
         }
         xengnttab_close(xgt);
     }
-#endif
     xen_evtchn_ops = &libxenevtchn_backend_ops;
     xen_gnttab_ops = &libxengnttab_backend_ops;
     xen_foreignmem_ops = &libxenforeignmem_backend_ops;
diff --git a/scripts/xen-detect.c b/scripts/xen-detect.c
index db049e605cf..8c4f02fa3f6 100644
--- a/scripts/xen-detect.c
+++ b/scripts/xen-detect.c
@@ -1,143 +1,19 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
-/* Test programs for various Xen versions that QEMU supports.  */
-#if CONFIG_XEN_CTRL_INTERFACE_VERSION == 41100
-  #undef XC_WANT_COMPAT_DEVICEMODEL_API
-  #define __XEN_TOOLS__
-  #include <xendevicemodel.h>
-  #include <xenforeignmemory.h>
-  int main(void) {
-    xendevicemodel_handle *xd;
-    xenforeignmemory_handle *xfmem;
+/* Test programs for Xen 4.11.0+.  */
+#undef XC_WANT_COMPAT_DEVICEMODEL_API
+#define __XEN_TOOLS__
+#include <xendevicemodel.h>
+#include <xenforeignmemory.h>
+int main(void) {
+  xendevicemodel_handle *xd;
+  xenforeignmemory_handle *xfmem;
 
-    xd = xendevicemodel_open(0, 0);
-    xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
+  xd = xendevicemodel_open(0, 0);
+  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
 
-    xfmem = xenforeignmemory_open(0, 0);
-    xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
+  xfmem = xenforeignmemory_open(0, 0);
+  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
 
-    return 0;
-  }
-
-#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 41000
-  #undef XC_WANT_COMPAT_MAP_FOREIGN_API
-  #include <xenforeignmemory.h>
-  #include <xentoolcore.h>
-  int main(void) {
-    xenforeignmemory_handle *xfmem;
-
-    xfmem = xenforeignmemory_open(0, 0);
-    xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
-    xentoolcore_restrict_all(0);
-
-    return 0;
-  }
-
-#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40900
-  #undef XC_WANT_COMPAT_DEVICEMODEL_API
-  #define __XEN_TOOLS__
-  #include <xendevicemodel.h>
-  int main(void) {
-    xendevicemodel_handle *xd;
-
-    xd = xendevicemodel_open(0, 0);
-    xendevicemodel_close(xd);
-
-    return 0;
-  }
-
-#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40800
-  /*
-   * If we have stable libs the we don't want the libxc compat
-   * layers, regardless of what CFLAGS we may have been given.
-   *
-   * Also, check if xengnttab_grant_copy_segment_t is defined and
-   * grant copy operation is implemented.
-   */
-  #undef XC_WANT_COMPAT_EVTCHN_API
-  #undef XC_WANT_COMPAT_GNTTAB_API
-  #undef XC_WANT_COMPAT_MAP_FOREIGN_API
-  #include <xenctrl.h>
-  #include <xenstore.h>
-  #include <xenevtchn.h>
-  #include <xengnttab.h>
-  #include <xenforeignmemory.h>
-  #include <stdint.h>
-  #include <xen/hvm/hvm_info_table.h>
-  #if !defined(HVM_MAX_VCPUS)
-  # error HVM_MAX_VCPUS not defined
-  #endif
-  int main(void) {
-    xc_interface *xc = NULL;
-    xenforeignmemory_handle *xfmem;
-    xenevtchn_handle *xe;
-    xengnttab_handle *xg;
-    xengnttab_grant_copy_segment_t* seg = NULL;
-
-    xs_daemon_open();
-
-    xc = xc_interface_open(0, 0, 0);
-    xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
-    xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
-    xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
-    xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
-
-    xfmem = xenforeignmemory_open(0, 0);
-    xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
-
-    xe = xenevtchn_open(0, 0);
-    xenevtchn_fd(xe);
-
-    xg = xengnttab_open(0, 0);
-    xengnttab_grant_copy(xg, 0, seg);
-
-    return 0;
-  }
-
-#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40701
-  /*
-   * If we have stable libs the we don't want the libxc compat
-   * layers, regardless of what CFLAGS we may have been given.
-   */
-  #undef XC_WANT_COMPAT_EVTCHN_API
-  #undef XC_WANT_COMPAT_GNTTAB_API
-  #undef XC_WANT_COMPAT_MAP_FOREIGN_API
-  #include <xenctrl.h>
-  #include <xenstore.h>
-  #include <xenevtchn.h>
-  #include <xengnttab.h>
-  #include <xenforeignmemory.h>
-  #include <stdint.h>
-  #include <xen/hvm/hvm_info_table.h>
-  #if !defined(HVM_MAX_VCPUS)
-  # error HVM_MAX_VCPUS not defined
-  #endif
-  int main(void) {
-    xc_interface *xc = NULL;
-    xenforeignmemory_handle *xfmem;
-    xenevtchn_handle *xe;
-    xengnttab_handle *xg;
-
-    xs_daemon_open();
-
-    xc = xc_interface_open(0, 0, 0);
-    xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
-    xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
-    xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
-    xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
-
-    xfmem = xenforeignmemory_open(0, 0);
-    xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
-
-    xe = xenevtchn_open(0, 0);
-    xenevtchn_fd(xe);
-
-    xg = xengnttab_open(0, 0);
-    xengnttab_map_grant_ref(xg, 0, 0, 0);
-
-    return 0;
-  }
-
-#else
-#error invalid CONFIG_XEN_CTRL_INTERFACE_VERSION
-#endif
+  return 0;
+}
-- 
2.56.0



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] xen: require Xen 4.11.0 or later
  2026-10-31  8:34 [PATCH] xen: require Xen 4.11.0 or later Paolo Bonzini
@ 2026-11-02  9:22 ` Daniel P. Berrangé
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel P. Berrangé @ 2026-11-02  9:22 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Sat, Oct 31, 2026 at 09:34:40AM +0100, Paolo Bonzini wrote:
> Xen 4.11 was released on July 10, 2018.  Require it to clean up
> code that deals with old versions that lacked utility libraries.

We can update to a far newer min version than that AFAICT.

The oldest targets are:

    Debian 13: 4.20
 Ubuntu 24.04: 4.17.3
 SUSE Leap 15: 4.18.2

  https://repology.org/project/xen/versions

So per our platform support policy, we can bump the
min version to 4.17.0 now.

> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build                 |  44 ++------
>  include/hw/xen/xen_native.h | 215 +-----------------------------------
>  hw/xen/xen-operations.c     |   5 -
>  scripts/xen-detect.c        | 152 +++----------------------
>  4 files changed, 26 insertions(+), 390 deletions(-)
> 
> diff --git a/meson.build b/meson.build
> index d18677e026a..8ab378e7b1b 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -975,7 +975,7 @@ endif
>  xen = not_found
>  if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
>    xencontrol = dependency('xencontrol', required: false,
> -                          method: 'pkg-config')
> +                          version: '>=4.11.0', method: 'pkg-config')
>    if xencontrol.found()
>      xen_pc = declare_dependency(version: xencontrol.version(),
>        dependencies: [
> @@ -996,45 +996,23 @@ if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
>          dependency('xendevicemodel', required: false,
>                     method: 'pkg-config',
>                     disabler: true),
> -        # optional, no "disabler: true"
>          dependency('xentoolcore', required: false,
> -                   method: 'pkg-config')])
> +                   method: 'pkg-config',
> +                   disabler: true)])
>      if xen_pc.found()
>        xen = xen_pc
>      endif
>    endif
>    if not xen.found()
> -    xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
> -    xen_libs = {
> -      '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
> -      '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
> -      '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
> -      '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
> -      '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
> -    }
> -    xen_deps = {}
> -    foreach ver: xen_tests
> -      # cache the various library tests to avoid polluting the logs
> -      xen_test_deps = []
> -      foreach l: xen_libs[ver]
> -        if l not in xen_deps
> -          xen_deps += { l: cc.find_library(l, required: false) }
> -        endif
> -        xen_test_deps += xen_deps[l]
> -      endforeach
> -
> -      # Use -D to pick just one of the test programs in scripts/xen-detect.c
> -      xen_version = ver.split('.')
> -      xen_ctrl_version = xen_version[0] + \
> -        ('0' + xen_version[1]).substring(-2) + \
> -        ('0' + xen_version[2]).substring(-2)
> -      if cc.links(files('scripts/xen-detect.c'),
> -                  args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
> -                  dependencies: xen_test_deps)
> -        xen = declare_dependency(version: ver, dependencies: xen_test_deps)
> -        break
> -      endif
> +    xen_test_deps = []
> +    foreach l: [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ]
> +      xen_test_deps += cc.find_library(l, required: get_option('xen'))
>      endforeach
> +
> +    # Use -D to pick just one of the test programs in scripts/xen-detect.c
> +    if cc.links(files('scripts/xen-detect.c'), dependencies: xen_test_deps)
> +      xen = declare_dependency(version: '4.11.0', dependencies: xen_test_deps)
> +    endif
>    endif
>    if xen.found()
>      accelerators += 'CONFIG_XEN'
> diff --git a/include/hw/xen/xen_native.h b/include/hw/xen/xen_native.h
> index 5caf91a6162..260148ceabb 100644
> --- a/include/hw/xen/xen_native.h
> +++ b/include/hw/xen/xen_native.h
> @@ -24,231 +24,18 @@
>  extern xc_interface *xen_xc;
>  
>  /*
> - * We don't support Xen prior to 4.7.1.
> + * We don't support Xen prior to 4.11.0.
>   */
>  
>  #include <xenforeignmemory.h>
>  
>  extern xenforeignmemory_handle *xen_fmem;
>  
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900
> -
> -typedef xc_interface xendevicemodel_handle;
> -
> -#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40900 */
> -
>  #undef XC_WANT_COMPAT_DEVICEMODEL_API
>  #include <xendevicemodel.h>
>  
> -#endif
> -
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41100
> -
> -static inline int xendevicemodel_relocate_memory(
> -    xendevicemodel_handle *dmod, domid_t domid, uint32_t size, uint64_t src_gfn,
> -    uint64_t dst_gfn)
> -{
> -    uint32_t i;
> -    int rc;
> -
> -    for (i = 0; i < size; i++) {
> -        unsigned long idx = src_gfn + i;
> -        xen_pfn_t gpfn = dst_gfn + i;
> -
> -        rc = xc_domain_add_to_physmap(xen_xc, domid, XENMAPSPACE_gmfn, idx,
> -                                      gpfn);
> -        if (rc) {
> -            return rc;
> -        }
> -    }
> -
> -    return 0;
> -}
> -
> -static inline int xendevicemodel_pin_memory_cacheattr(
> -    xendevicemodel_handle *dmod, domid_t domid, uint64_t start, uint64_t end,
> -    uint32_t type)
> -{
> -    return xc_domain_pin_memory_cacheattr(xen_xc, domid, start, end, type);
> -}
> -
> -typedef void xenforeignmemory_resource_handle;
> -
> -#define XENMEM_resource_ioreq_server 0
> -
> -#define XENMEM_resource_ioreq_server_frame_bufioreq 0
> -#define XENMEM_resource_ioreq_server_frame_ioreq(n) (1 + (n))
> -
> -static inline xenforeignmemory_resource_handle *xenforeignmemory_map_resource(
> -    xenforeignmemory_handle *fmem, domid_t domid, unsigned int type,
> -    unsigned int id, unsigned long frame, unsigned long nr_frames,
> -    void **paddr, int prot, int flags)
> -{
> -    errno = EOPNOTSUPP;
> -    return NULL;
> -}
> -
> -static inline int xenforeignmemory_unmap_resource(
> -    xenforeignmemory_handle *fmem, xenforeignmemory_resource_handle *fres)
> -{
> -    return 0;
> -}
> -
> -#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION < 41100 */
> -
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41000
> -
> -#define XEN_COMPAT_PHYSMAP
> -static inline void *xenforeignmemory_map2(xenforeignmemory_handle *h,
> -                                          uint32_t dom, void *addr,
> -                                          int prot, int flags, size_t pages,
> -                                          const xen_pfn_t arr[/*pages*/],
> -                                          int err[/*pages*/])
> -{
> -    assert(addr == NULL && flags == 0);
> -    return xenforeignmemory_map(h, dom, prot, pages, arr, err);
> -}
> -
> -static inline int xentoolcore_restrict_all(domid_t domid)
> -{
> -    errno = ENOTTY;
> -    return -1;
> -}
> -
> -static inline int xendevicemodel_shutdown(xendevicemodel_handle *dmod,
> -                                          domid_t domid, unsigned int reason)
> -{
> -    errno = ENOTTY;
> -    return -1;
> -}
> -
> -#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 41000 */
> -
>  #include <xentoolcore.h>
>  
> -#endif
> -
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900
> -
> -static inline xendevicemodel_handle *xendevicemodel_open(
> -    struct xentoollog_logger *logger, unsigned int open_flags)
> -{
> -    return xen_xc;
> -}
> -
> -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);
> -}
> -
> -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);
> -}
> -
> -#endif
> -
>  extern xendevicemodel_handle *xen_dmod;
>  
>  static inline int xen_set_mem_type(domid_t domid, hvmmem_type_t type,
> diff --git a/hw/xen/xen-operations.c b/hw/xen/xen-operations.c
> index e00983ec447..d4b177e17e0 100644
> --- a/hw/xen/xen-operations.c
> +++ b/hw/xen/xen-operations.c
> @@ -89,8 +89,6 @@ done:
>      return rc;
>  }
>  
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40800
> -
>  static int libxengnttab_backend_grant_copy(xengnttab_handle *xgt,
>                                             bool to_domain, uint32_t domid,
>                                             XenGrantCopySegment *segs,
> @@ -149,7 +147,6 @@ done:
>      g_free(xengnttab_segs);
>      return rc;
>  }
> -#endif
>  
>  static xenevtchn_handle *libxenevtchn_backend_open(void)
>  {
> @@ -406,7 +403,6 @@ struct xenstore_backend_ops libxenstore_backend_ops = {
>  
>  void setup_xen_backend_ops(void)
>  {
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40800
>      xengnttab_handle *xgt = xengnttab_open(NULL, 0);
>  
>      if (xgt) {
> @@ -415,7 +411,6 @@ void setup_xen_backend_ops(void)
>          }
>          xengnttab_close(xgt);
>      }
> -#endif
>      xen_evtchn_ops = &libxenevtchn_backend_ops;
>      xen_gnttab_ops = &libxengnttab_backend_ops;
>      xen_foreignmem_ops = &libxenforeignmem_backend_ops;
> diff --git a/scripts/xen-detect.c b/scripts/xen-detect.c
> index db049e605cf..8c4f02fa3f6 100644
> --- a/scripts/xen-detect.c
> +++ b/scripts/xen-detect.c
> @@ -1,143 +1,19 @@
>  /* SPDX-License-Identifier: GPL-2.0-or-later */
>  
> -/* Test programs for various Xen versions that QEMU supports.  */
> -#if CONFIG_XEN_CTRL_INTERFACE_VERSION == 41100
> -  #undef XC_WANT_COMPAT_DEVICEMODEL_API
> -  #define __XEN_TOOLS__
> -  #include <xendevicemodel.h>
> -  #include <xenforeignmemory.h>
> -  int main(void) {
> -    xendevicemodel_handle *xd;
> -    xenforeignmemory_handle *xfmem;
> +/* Test programs for Xen 4.11.0+.  */
> +#undef XC_WANT_COMPAT_DEVICEMODEL_API
> +#define __XEN_TOOLS__
> +#include <xendevicemodel.h>
> +#include <xenforeignmemory.h>
> +int main(void) {
> +  xendevicemodel_handle *xd;
> +  xenforeignmemory_handle *xfmem;
>  
> -    xd = xendevicemodel_open(0, 0);
> -    xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
> +  xd = xendevicemodel_open(0, 0);
> +  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
>  
> -    xfmem = xenforeignmemory_open(0, 0);
> -    xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
> +  xfmem = xenforeignmemory_open(0, 0);
> +  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
>  
> -    return 0;
> -  }
> -
> -#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 41000
> -  #undef XC_WANT_COMPAT_MAP_FOREIGN_API
> -  #include <xenforeignmemory.h>
> -  #include <xentoolcore.h>
> -  int main(void) {
> -    xenforeignmemory_handle *xfmem;
> -
> -    xfmem = xenforeignmemory_open(0, 0);
> -    xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
> -    xentoolcore_restrict_all(0);
> -
> -    return 0;
> -  }
> -
> -#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40900
> -  #undef XC_WANT_COMPAT_DEVICEMODEL_API
> -  #define __XEN_TOOLS__
> -  #include <xendevicemodel.h>
> -  int main(void) {
> -    xendevicemodel_handle *xd;
> -
> -    xd = xendevicemodel_open(0, 0);
> -    xendevicemodel_close(xd);
> -
> -    return 0;
> -  }
> -
> -#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40800
> -  /*
> -   * If we have stable libs the we don't want the libxc compat
> -   * layers, regardless of what CFLAGS we may have been given.
> -   *
> -   * Also, check if xengnttab_grant_copy_segment_t is defined and
> -   * grant copy operation is implemented.
> -   */
> -  #undef XC_WANT_COMPAT_EVTCHN_API
> -  #undef XC_WANT_COMPAT_GNTTAB_API
> -  #undef XC_WANT_COMPAT_MAP_FOREIGN_API
> -  #include <xenctrl.h>
> -  #include <xenstore.h>
> -  #include <xenevtchn.h>
> -  #include <xengnttab.h>
> -  #include <xenforeignmemory.h>
> -  #include <stdint.h>
> -  #include <xen/hvm/hvm_info_table.h>
> -  #if !defined(HVM_MAX_VCPUS)
> -  # error HVM_MAX_VCPUS not defined
> -  #endif
> -  int main(void) {
> -    xc_interface *xc = NULL;
> -    xenforeignmemory_handle *xfmem;
> -    xenevtchn_handle *xe;
> -    xengnttab_handle *xg;
> -    xengnttab_grant_copy_segment_t* seg = NULL;
> -
> -    xs_daemon_open();
> -
> -    xc = xc_interface_open(0, 0, 0);
> -    xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
> -    xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
> -    xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
> -    xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
> -
> -    xfmem = xenforeignmemory_open(0, 0);
> -    xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
> -
> -    xe = xenevtchn_open(0, 0);
> -    xenevtchn_fd(xe);
> -
> -    xg = xengnttab_open(0, 0);
> -    xengnttab_grant_copy(xg, 0, seg);
> -
> -    return 0;
> -  }
> -
> -#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40701
> -  /*
> -   * If we have stable libs the we don't want the libxc compat
> -   * layers, regardless of what CFLAGS we may have been given.
> -   */
> -  #undef XC_WANT_COMPAT_EVTCHN_API
> -  #undef XC_WANT_COMPAT_GNTTAB_API
> -  #undef XC_WANT_COMPAT_MAP_FOREIGN_API
> -  #include <xenctrl.h>
> -  #include <xenstore.h>
> -  #include <xenevtchn.h>
> -  #include <xengnttab.h>
> -  #include <xenforeignmemory.h>
> -  #include <stdint.h>
> -  #include <xen/hvm/hvm_info_table.h>
> -  #if !defined(HVM_MAX_VCPUS)
> -  # error HVM_MAX_VCPUS not defined
> -  #endif
> -  int main(void) {
> -    xc_interface *xc = NULL;
> -    xenforeignmemory_handle *xfmem;
> -    xenevtchn_handle *xe;
> -    xengnttab_handle *xg;
> -
> -    xs_daemon_open();
> -
> -    xc = xc_interface_open(0, 0, 0);
> -    xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
> -    xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
> -    xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
> -    xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
> -
> -    xfmem = xenforeignmemory_open(0, 0);
> -    xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
> -
> -    xe = xenevtchn_open(0, 0);
> -    xenevtchn_fd(xe);
> -
> -    xg = xengnttab_open(0, 0);
> -    xengnttab_map_grant_ref(xg, 0, 0, 0);
> -
> -    return 0;
> -  }
> -
> -#else
> -#error invalid CONFIG_XEN_CTRL_INTERFACE_VERSION
> -#endif
> +  return 0;
> +}
> -- 
> 2.56.0
> 
> 

With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-11-02  9:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-31  8:34 [PATCH] xen: require Xen 4.11.0 or later Paolo Bonzini
2026-11-02  9:22 ` Daniel P. Berrangé

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.