/* 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 #include 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 #include 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 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 #include #include #include #include #include #include #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 #include #include #include #include #include #include #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; } #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40600 #include #include #include #include #if !defined(HVM_MAX_VCPUS) # error HVM_MAX_VCPUS not defined #endif int main(void) { xc_interface *xc; xs_daemon_open(); xc = xc_interface_open(0, 0, 0); xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); xc_gnttab_open(NULL, 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); xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0); return 0; } #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40500 #include #include #include #include #if !defined(HVM_MAX_VCPUS) # error HVM_MAX_VCPUS not defined #endif int main(void) { xc_interface *xc; xs_daemon_open(); xc = xc_interface_open(0, 0, 0); xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); xc_gnttab_open(NULL, 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, 0, NULL); return 0; } #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40200 #include #include #include #include #if !defined(HVM_MAX_VCPUS) # error HVM_MAX_VCPUS not defined #endif int main(void) { xc_interface *xc; xs_daemon_open(); xc = xc_interface_open(0, 0, 0); xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); xc_gnttab_open(NULL, 0); xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0); xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000); return 0; } #else #error invalid CONFIG_XEN_CTRL_INTERFACE_VERSION #endif