| /* 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; | 
 |  | 
 |     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); | 
 |  | 
 |     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 |