xref: /qemu/scripts/xen-detect.c (revision c4b8ffcb)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 /* Test programs for various Xen versions that QEMU supports.  */
4 #if CONFIG_XEN_CTRL_INTERFACE_VERSION == 41100
5   #undef XC_WANT_COMPAT_DEVICEMODEL_API
6   #define __XEN_TOOLS__
7   #include <xendevicemodel.h>
8   #include <xenforeignmemory.h>
9   int main(void) {
10     xendevicemodel_handle *xd;
11     xenforeignmemory_handle *xfmem;
12 
13     xd = xendevicemodel_open(0, 0);
14     xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
15 
16     xfmem = xenforeignmemory_open(0, 0);
17     xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
18 
19     return 0;
20   }
21 
22 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 41000
23   #undef XC_WANT_COMPAT_MAP_FOREIGN_API
24   #include <xenforeignmemory.h>
25   #include <xentoolcore.h>
26   int main(void) {
27     xenforeignmemory_handle *xfmem;
28 
29     xfmem = xenforeignmemory_open(0, 0);
30     xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
31     xentoolcore_restrict_all(0);
32 
33     return 0;
34   }
35 
36 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40900
37   #undef XC_WANT_COMPAT_DEVICEMODEL_API
38   #define __XEN_TOOLS__
39   #include <xendevicemodel.h>
40   int main(void) {
41     xendevicemodel_handle *xd;
42 
43     xd = xendevicemodel_open(0, 0);
44     xendevicemodel_close(xd);
45 
46     return 0;
47   }
48 
49 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40800
50   /*
51    * If we have stable libs the we don't want the libxc compat
52    * layers, regardless of what CFLAGS we may have been given.
53    *
54    * Also, check if xengnttab_grant_copy_segment_t is defined and
55    * grant copy operation is implemented.
56    */
57   #undef XC_WANT_COMPAT_EVTCHN_API
58   #undef XC_WANT_COMPAT_GNTTAB_API
59   #undef XC_WANT_COMPAT_MAP_FOREIGN_API
60   #include <xenctrl.h>
61   #include <xenstore.h>
62   #include <xenevtchn.h>
63   #include <xengnttab.h>
64   #include <xenforeignmemory.h>
65   #include <stdint.h>
66   #include <xen/hvm/hvm_info_table.h>
67   #if !defined(HVM_MAX_VCPUS)
68   # error HVM_MAX_VCPUS not defined
69   #endif
70   int main(void) {
71     xc_interface *xc = NULL;
72     xenforeignmemory_handle *xfmem;
73     xenevtchn_handle *xe;
74     xengnttab_handle *xg;
75     xengnttab_grant_copy_segment_t* seg = NULL;
76 
77     xs_daemon_open();
78 
79     xc = xc_interface_open(0, 0, 0);
80     xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
81     xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
82     xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
83     xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
84 
85     xfmem = xenforeignmemory_open(0, 0);
86     xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
87 
88     xe = xenevtchn_open(0, 0);
89     xenevtchn_fd(xe);
90 
91     xg = xengnttab_open(0, 0);
92     xengnttab_grant_copy(xg, 0, seg);
93 
94     return 0;
95   }
96 
97 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40701
98   /*
99    * If we have stable libs the we don't want the libxc compat
100    * layers, regardless of what CFLAGS we may have been given.
101    */
102   #undef XC_WANT_COMPAT_EVTCHN_API
103   #undef XC_WANT_COMPAT_GNTTAB_API
104   #undef XC_WANT_COMPAT_MAP_FOREIGN_API
105   #include <xenctrl.h>
106   #include <xenstore.h>
107   #include <xenevtchn.h>
108   #include <xengnttab.h>
109   #include <xenforeignmemory.h>
110   #include <stdint.h>
111   #include <xen/hvm/hvm_info_table.h>
112   #if !defined(HVM_MAX_VCPUS)
113   # error HVM_MAX_VCPUS not defined
114   #endif
115   int main(void) {
116     xc_interface *xc = NULL;
117     xenforeignmemory_handle *xfmem;
118     xenevtchn_handle *xe;
119     xengnttab_handle *xg;
120 
121     xs_daemon_open();
122 
123     xc = xc_interface_open(0, 0, 0);
124     xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
125     xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
126     xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
127     xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
128 
129     xfmem = xenforeignmemory_open(0, 0);
130     xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
131 
132     xe = xenevtchn_open(0, 0);
133     xenevtchn_fd(xe);
134 
135     xg = xengnttab_open(0, 0);
136     xengnttab_map_grant_ref(xg, 0, 0, 0);
137 
138     return 0;
139   }
140 
141 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40600
142   #include <xenctrl.h>
143   #include <xenstore.h>
144   #include <stdint.h>
145   #include <xen/hvm/hvm_info_table.h>
146   #if !defined(HVM_MAX_VCPUS)
147   # error HVM_MAX_VCPUS not defined
148   #endif
149   int main(void) {
150     xc_interface *xc;
151     xs_daemon_open();
152     xc = xc_interface_open(0, 0, 0);
153     xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
154     xc_gnttab_open(NULL, 0);
155     xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
156     xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
157     xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
158     xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
159     return 0;
160   }
161 
162 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40500
163   #include <xenctrl.h>
164   #include <xenstore.h>
165   #include <stdint.h>
166   #include <xen/hvm/hvm_info_table.h>
167   #if !defined(HVM_MAX_VCPUS)
168   # error HVM_MAX_VCPUS not defined
169   #endif
170   int main(void) {
171     xc_interface *xc;
172     xs_daemon_open();
173     xc = xc_interface_open(0, 0, 0);
174     xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
175     xc_gnttab_open(NULL, 0);
176     xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
177     xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
178     xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
179     return 0;
180   }
181 
182 #elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40200
183   #include <xenctrl.h>
184   #include <xenstore.h>
185   #include <stdint.h>
186   #include <xen/hvm/hvm_info_table.h>
187   #if !defined(HVM_MAX_VCPUS)
188   # error HVM_MAX_VCPUS not defined
189   #endif
190   int main(void) {
191     xc_interface *xc;
192     xs_daemon_open();
193     xc = xc_interface_open(0, 0, 0);
194     xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
195     xc_gnttab_open(NULL, 0);
196     xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
197     xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
198     return 0;
199   }
200 
201 #else
202 #error invalid CONFIG_XEN_CTRL_INTERFACE_VERSION
203 #endif
204