hypercalls.h revision 1.2 1 1.2 bouyer /* $NetBSD: hypercalls.h,v 1.2 2020/04/25 15:26:17 bouyer Exp $ */
2 1.2 bouyer
3 1.2 bouyer /*
4 1.2 bouyer * Copyright (c) 2006 Manuel Bouyer.
5 1.2 bouyer *
6 1.2 bouyer * Redistribution and use in source and binary forms, with or without
7 1.2 bouyer * modification, are permitted provided that the following conditions
8 1.2 bouyer * are met:
9 1.2 bouyer * 1. Redistributions of source code must retain the above copyright
10 1.2 bouyer * notice, this list of conditions and the following disclaimer.
11 1.2 bouyer * 2. Redistributions in binary form must reproduce the above copyright
12 1.2 bouyer * notice, this list of conditions and the following disclaimer in the
13 1.2 bouyer * documentation and/or other materials provided with the distribution.
14 1.2 bouyer *
15 1.2 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.2 bouyer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 1.2 bouyer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 1.2 bouyer * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 1.2 bouyer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 1.2 bouyer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 1.2 bouyer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 1.2 bouyer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 1.2 bouyer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 1.2 bouyer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 1.2 bouyer *
26 1.2 bouyer */
27 1.2 bouyer
28 1.2 bouyer /*
29 1.2 bouyer *
30 1.2 bouyer * Communication to/from hypervisor.
31 1.2 bouyer *
32 1.2 bouyer * Copyright (c) 2002-2004, K A Fraser
33 1.2 bouyer *
34 1.2 bouyer * Permission is hereby granted, free of charge, to any person obtaining a copy
35 1.2 bouyer * of this source file (the "Software"), to deal in the Software without
36 1.2 bouyer * restriction, including without limitation the rights to use, copy, modify,
37 1.2 bouyer * merge, publish, distribute, sublicense, and/or sell copies of the Software,
38 1.2 bouyer * and to permit persons to whom the Software is furnished to do so, subject to
39 1.2 bouyer * the following conditions:
40 1.2 bouyer *
41 1.2 bouyer * The above copyright notice and this permission notice shall be included in
42 1.2 bouyer * all copies or substantial portions of the Software.
43 1.2 bouyer *
44 1.2 bouyer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
45 1.2 bouyer * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
46 1.2 bouyer * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
47 1.2 bouyer * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
48 1.2 bouyer * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
49 1.2 bouyer * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
50 1.2 bouyer * IN THE SOFTWARE.
51 1.2 bouyer */
52 1.2 bouyer
53 1.2 bouyer
54 1.2 bouyer #ifndef _XENI386_HYPERVISOR_H_
55 1.2 bouyer #define _XENI386_HYPERVISOR_H_
56 1.2 bouyer /*
57 1.2 bouyer * Assembler stubs for hyper-calls.
58 1.2 bouyer */
59 1.2 bouyer
60 1.2 bouyer #include <machine/pte.h> /* pt_entry_t */
61 1.2 bouyer
62 1.2 bouyer /* hypercall via the hypercall call page */
63 1.2 bouyer #define __str(x) #x
64 1.2 bouyer #define _str(x) __str(x)
65 1.2 bouyer #define _hypercall(name, input_const, output_const) \
66 1.2 bouyer __asm volatile ( \
67 1.2 bouyer "call hypercall_page + ("_str(name)" * 32)" \
68 1.2 bouyer : output_const \
69 1.2 bouyer : input_const \
70 1.2 bouyer : "memory" )
71 1.2 bouyer
72 1.2 bouyer #define _harg(...) __VA_ARGS__
73 1.2 bouyer
74 1.2 bouyer
75 1.2 bouyer static __inline int
76 1.2 bouyer HYPERVISOR_set_trap_table(trap_info_t *table)
77 1.2 bouyer {
78 1.2 bouyer int ret;
79 1.2 bouyer unsigned long ign1;
80 1.2 bouyer
81 1.2 bouyer _hypercall(__HYPERVISOR_set_trap_table, _harg("1" (table)),
82 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
83 1.2 bouyer
84 1.2 bouyer return ret;
85 1.2 bouyer }
86 1.2 bouyer
87 1.2 bouyer static __inline int
88 1.2 bouyer HYPERVISOR_set_gdt(unsigned long *frame_list, int entries)
89 1.2 bouyer {
90 1.2 bouyer int ret;
91 1.2 bouyer unsigned long ign1, ign2;
92 1.2 bouyer
93 1.2 bouyer _hypercall(__HYPERVISOR_set_gdt, _harg("1" (frame_list), "2" (entries)),
94 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
95 1.2 bouyer
96 1.2 bouyer return ret;
97 1.2 bouyer }
98 1.2 bouyer
99 1.2 bouyer static __inline int
100 1.2 bouyer HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp)
101 1.2 bouyer {
102 1.2 bouyer int ret;
103 1.2 bouyer unsigned long ign1, ign2;
104 1.2 bouyer
105 1.2 bouyer _hypercall(__HYPERVISOR_stack_switch, _harg("1" (ss), "2" (esp)),
106 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
107 1.2 bouyer
108 1.2 bouyer return ret;
109 1.2 bouyer }
110 1.2 bouyer
111 1.2 bouyer static __inline int
112 1.2 bouyer HYPERVISOR_set_callbacks(
113 1.2 bouyer unsigned long event_selector, unsigned long event_address,
114 1.2 bouyer unsigned long failsafe_selector, unsigned long failsafe_address)
115 1.2 bouyer {
116 1.2 bouyer int ret;
117 1.2 bouyer unsigned long ign1, ign2, ign3, ign4;
118 1.2 bouyer
119 1.2 bouyer _hypercall(__HYPERVISOR_set_callbacks,
120 1.2 bouyer _harg("1" (event_selector),"2" (event_address),
121 1.2 bouyer "3" (failsafe_selector), "4" (failsafe_address)),
122 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)));
123 1.2 bouyer
124 1.2 bouyer return ret;
125 1.2 bouyer }
126 1.2 bouyer
127 1.2 bouyer #if __XEN_INTERFACE_VERSION__ < 0x00030204
128 1.2 bouyer static __inline int
129 1.2 bouyer HYPERVISOR_dom0_op(dom0_op_t *dom0_op)
130 1.2 bouyer {
131 1.2 bouyer int ret;
132 1.2 bouyer unsigned long ign1;
133 1.2 bouyer
134 1.2 bouyer dom0_op->interface_version = DOM0_INTERFACE_VERSION;
135 1.2 bouyer _hypercall(__HYPERVISOR_dom0_op, _harg("1" (dom0_op)),
136 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
137 1.2 bouyer
138 1.2 bouyer return ret;
139 1.2 bouyer }
140 1.2 bouyer #endif /* __XEN_INTERFACE_VERSION__ */
141 1.2 bouyer
142 1.2 bouyer static __inline int
143 1.2 bouyer HYPERVISOR_set_debugreg(int reg, unsigned long value)
144 1.2 bouyer {
145 1.2 bouyer int ret;
146 1.2 bouyer unsigned long ign1, ign2;
147 1.2 bouyer
148 1.2 bouyer _hypercall(__HYPERVISOR_set_debugreg, _harg("1" (reg), "2" (value)),
149 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
150 1.2 bouyer
151 1.2 bouyer return ret;
152 1.2 bouyer }
153 1.2 bouyer
154 1.2 bouyer static __inline unsigned long
155 1.2 bouyer HYPERVISOR_get_debugreg(int reg)
156 1.2 bouyer {
157 1.2 bouyer unsigned long ret;
158 1.2 bouyer unsigned long ign1;
159 1.2 bouyer
160 1.2 bouyer _hypercall(__HYPERVISOR_get_debugreg, _harg("1" (reg)),
161 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
162 1.2 bouyer
163 1.2 bouyer return ret;
164 1.2 bouyer }
165 1.2 bouyer
166 1.2 bouyer #include <xen/include/public/arch-x86/xen-mca.h>
167 1.2 bouyer
168 1.2 bouyer static __inline int
169 1.2 bouyer HYPERVISOR_machine_check(struct xen_mc *mc)
170 1.2 bouyer {
171 1.2 bouyer int ret;
172 1.2 bouyer unsigned long ign1;
173 1.2 bouyer
174 1.2 bouyer mc->interface_version = XEN_MCA_INTERFACE_VERSION;
175 1.2 bouyer _hypercall(__HYPERVISOR_mca, _harg("1" (mc)),
176 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
177 1.2 bouyer
178 1.2 bouyer return ret;
179 1.2 bouyer }
180 1.2 bouyer
181 1.2 bouyer static __inline int
182 1.2 bouyer HYPERVISOR_hvm_op(int cmd, void *arg)
183 1.2 bouyer {
184 1.2 bouyer int ret;
185 1.2 bouyer unsigned long ign1, ign2;
186 1.2 bouyer
187 1.2 bouyer _hypercall(__HYPERVISOR_hvm_op, _harg("1" (cmd), "2" (arg)),
188 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
189 1.2 bouyer
190 1.2 bouyer return ret;
191 1.2 bouyer }
192 1.2 bouyer
193 1.2 bouyer static __inline int
194 1.2 bouyer HYPERVISOR_mmu_update(mmu_update_t *req, int count, int *success_count,
195 1.2 bouyer domid_t domid)
196 1.2 bouyer {
197 1.2 bouyer int ret;
198 1.2 bouyer unsigned long ign1, ign2, ign3, ign4;
199 1.2 bouyer
200 1.2 bouyer _hypercall(__HYPERVISOR_mmu_update,
201 1.2 bouyer _harg("1" (req), "2" (count), "3" (success_count), "4" (domid)),
202 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)));
203 1.2 bouyer
204 1.2 bouyer return ret;
205 1.2 bouyer }
206 1.2 bouyer
207 1.2 bouyer static __inline int
208 1.2 bouyer HYPERVISOR_mmuext_op(struct mmuext_op *op, int count, int *success_count,
209 1.2 bouyer domid_t domid)
210 1.2 bouyer {
211 1.2 bouyer int ret;
212 1.2 bouyer unsigned long ign1, ign2, ign3, ign4;
213 1.2 bouyer
214 1.2 bouyer _hypercall(__HYPERVISOR_mmuext_op,
215 1.2 bouyer _harg("1" (op), "2" (count), "3" (success_count), "4" (domid)),
216 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)));
217 1.2 bouyer
218 1.2 bouyer return ret;
219 1.2 bouyer }
220 1.2 bouyer
221 1.2 bouyer static __inline int
222 1.2 bouyer HYPERVISOR_fpu_taskswitch(int set)
223 1.2 bouyer {
224 1.2 bouyer long ret;
225 1.2 bouyer long ign1;
226 1.2 bouyer
227 1.2 bouyer _hypercall(__HYPERVISOR_fpu_taskswitch, _harg("1" (set)),
228 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
229 1.2 bouyer
230 1.2 bouyer return ret;
231 1.2 bouyer }
232 1.2 bouyer
233 1.2 bouyer static __inline int
234 1.2 bouyer HYPERVISOR_update_descriptor(uint64_t ma, uint32_t word1, uint32_t word2)
235 1.2 bouyer {
236 1.2 bouyer int ret;
237 1.2 bouyer unsigned long ign1, ign2, ign3, ign4;
238 1.2 bouyer int ma1 = ma & 0xffffffff;
239 1.2 bouyer int ma2 = (ma >> 32) & 0xffffffff;
240 1.2 bouyer
241 1.2 bouyer _hypercall(__HYPERVISOR_update_descriptor,
242 1.2 bouyer _harg("1" (ma1), "2" (ma2), "3" (word1), "4" (word2)),
243 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)));
244 1.2 bouyer
245 1.2 bouyer return ret;
246 1.2 bouyer }
247 1.2 bouyer
248 1.2 bouyer static __inline int
249 1.2 bouyer HYPERVISOR_memory_op(unsigned int cmd, void *arg)
250 1.2 bouyer {
251 1.2 bouyer int ret;
252 1.2 bouyer unsigned long ign1, ign2;
253 1.2 bouyer
254 1.2 bouyer _hypercall(__HYPERVISOR_memory_op, _harg("1" (cmd), "2" (arg)),
255 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
256 1.2 bouyer
257 1.2 bouyer return ret;
258 1.2 bouyer }
259 1.2 bouyer
260 1.2 bouyer #ifdef XENPV
261 1.2 bouyer static __inline int
262 1.2 bouyer HYPERVISOR_update_va_mapping(unsigned long page_nr, pt_entry_t new_val,
263 1.2 bouyer unsigned long flags)
264 1.2 bouyer {
265 1.2 bouyer int ret;
266 1.2 bouyer unsigned long ign1, ign2, ign3, ign4;
267 1.2 bouyer unsigned long pte_low, pte_hi;
268 1.2 bouyer
269 1.2 bouyer pte_low = new_val & 0xffffffff;
270 1.2 bouyer pte_hi = new_val >> 32;
271 1.2 bouyer
272 1.2 bouyer _hypercall(__HYPERVISOR_update_va_mapping,
273 1.2 bouyer _harg("1" (page_nr), "2" (pte_low), "3" (pte_hi), "4" (flags)),
274 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)));
275 1.2 bouyer
276 1.2 bouyer #ifdef notdef
277 1.2 bouyer if (__predict_false(ret < 0))
278 1.2 bouyer panic("Failed update VA mapping: %08lx, %08lx, %08lx",
279 1.2 bouyer page_nr, new_val, flags);
280 1.2 bouyer #endif
281 1.2 bouyer
282 1.2 bouyer return ret;
283 1.2 bouyer }
284 1.2 bouyer
285 1.2 bouyer static __inline int
286 1.2 bouyer HYPERVISOR_update_va_mapping_otherdomain(unsigned long page_nr,
287 1.2 bouyer pt_entry_t new_val, unsigned long flags, domid_t domid)
288 1.2 bouyer {
289 1.2 bouyer int ret;
290 1.2 bouyer unsigned long ign1, ign2, ign3, ign4, ign5;
291 1.2 bouyer unsigned long pte_low, pte_hi;
292 1.2 bouyer
293 1.2 bouyer pte_low = new_val & 0xffffffff;
294 1.2 bouyer pte_hi = new_val >> 32;
295 1.2 bouyer
296 1.2 bouyer _hypercall(__HYPERVISOR_update_va_mapping_otherdomain,
297 1.2 bouyer _harg("1" (page_nr), "2" (pte_low), "3" (pte_hi), "4" (flags), "5" (domid)),
298 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4),
299 1.2 bouyer "=D" (ign5)));
300 1.2 bouyer
301 1.2 bouyer return ret;
302 1.2 bouyer }
303 1.2 bouyer #endif /* XENPV */
304 1.2 bouyer
305 1.2 bouyer static __inline int
306 1.2 bouyer HYPERVISOR_xen_version(int cmd, void *arg)
307 1.2 bouyer {
308 1.2 bouyer int ret;
309 1.2 bouyer unsigned long ign1, ign2;
310 1.2 bouyer
311 1.2 bouyer _hypercall(__HYPERVISOR_xen_version, _harg("1" (cmd), "2" (arg)),
312 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
313 1.2 bouyer
314 1.2 bouyer return ret;
315 1.2 bouyer }
316 1.2 bouyer
317 1.2 bouyer static __inline int
318 1.2 bouyer HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count)
319 1.2 bouyer {
320 1.2 bouyer int ret;
321 1.2 bouyer unsigned long ign1, ign2, ign3;
322 1.2 bouyer
323 1.2 bouyer _hypercall(__HYPERVISOR_grant_table_op,
324 1.2 bouyer _harg("1" (cmd), "2" (uop), "3" (count)),
325 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)));
326 1.2 bouyer
327 1.2 bouyer return ret;
328 1.2 bouyer }
329 1.2 bouyer
330 1.2 bouyer
331 1.2 bouyer static __inline int
332 1.2 bouyer HYPERVISOR_vcpu_op(int cmd, int vcpuid, void *extra_args)
333 1.2 bouyer {
334 1.2 bouyer long ret;
335 1.2 bouyer unsigned long ign1, ign2, ign3;
336 1.2 bouyer
337 1.2 bouyer _hypercall(__HYPERVISOR_vcpu_op,
338 1.2 bouyer _harg("1" (cmd), "2" (vcpuid), "3" (extra_args)),
339 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)));
340 1.2 bouyer
341 1.2 bouyer return ret;
342 1.2 bouyer }
343 1.2 bouyer
344 1.2 bouyer static __inline long
345 1.2 bouyer HYPERVISOR_yield(void)
346 1.2 bouyer {
347 1.2 bouyer long ret;
348 1.2 bouyer unsigned long ign1, ign2;
349 1.2 bouyer
350 1.2 bouyer _hypercall(__HYPERVISOR_sched_op, _harg("1" (SCHEDOP_yield), "2" (0)),
351 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
352 1.2 bouyer
353 1.2 bouyer return ret;
354 1.2 bouyer }
355 1.2 bouyer
356 1.2 bouyer static __inline long
357 1.2 bouyer HYPERVISOR_block(void)
358 1.2 bouyer {
359 1.2 bouyer long ret;
360 1.2 bouyer unsigned long ign1, ign2;
361 1.2 bouyer
362 1.2 bouyer _hypercall(__HYPERVISOR_sched_op, _harg("1" (SCHEDOP_block), "2" (0)),
363 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
364 1.2 bouyer
365 1.2 bouyer return ret;
366 1.2 bouyer }
367 1.2 bouyer
368 1.2 bouyer static __inline long
369 1.2 bouyer HYPERVISOR_shutdown(void)
370 1.2 bouyer {
371 1.2 bouyer long ret;
372 1.2 bouyer unsigned long ign1, ign2;
373 1.2 bouyer
374 1.2 bouyer #if __XEN_INTERFACE_VERSION__ >= 0x00030201
375 1.2 bouyer
376 1.2 bouyer struct sched_shutdown shutdown_reason = {
377 1.2 bouyer .reason = SHUTDOWN_poweroff
378 1.2 bouyer };
379 1.2 bouyer
380 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
381 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (&shutdown_reason)),
382 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
383 1.2 bouyer #else
384 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
385 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (SHUTDOWN_poweroff)),
386 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
387 1.2 bouyer
388 1.2 bouyer #endif
389 1.2 bouyer
390 1.2 bouyer return ret;
391 1.2 bouyer }
392 1.2 bouyer
393 1.2 bouyer static __inline long
394 1.2 bouyer HYPERVISOR_crash(void)
395 1.2 bouyer {
396 1.2 bouyer long ret;
397 1.2 bouyer unsigned long ign1, ign2;
398 1.2 bouyer
399 1.2 bouyer #if __XEN_INTERFACE_VERSION__ >= 0x00030201
400 1.2 bouyer
401 1.2 bouyer struct sched_shutdown shutdown_reason = {
402 1.2 bouyer .reason = SHUTDOWN_crash
403 1.2 bouyer };
404 1.2 bouyer
405 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
406 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (&shutdown_reason)),
407 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
408 1.2 bouyer #else
409 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
410 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (SHUTDOWN_crash)),
411 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
412 1.2 bouyer #endif
413 1.2 bouyer
414 1.2 bouyer return ret;
415 1.2 bouyer }
416 1.2 bouyer
417 1.2 bouyer static __inline long
418 1.2 bouyer HYPERVISOR_reboot(void)
419 1.2 bouyer {
420 1.2 bouyer long ret;
421 1.2 bouyer unsigned long ign1, ign2;
422 1.2 bouyer
423 1.2 bouyer #if __XEN_INTERFACE_VERSION__ >= 0x00030201
424 1.2 bouyer
425 1.2 bouyer struct sched_shutdown shutdown_reason = {
426 1.2 bouyer .reason = SHUTDOWN_reboot
427 1.2 bouyer };
428 1.2 bouyer
429 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
430 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (&shutdown_reason)),
431 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
432 1.2 bouyer #else
433 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
434 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (SHUTDOWN_reboot)),
435 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
436 1.2 bouyer #endif
437 1.2 bouyer
438 1.2 bouyer return ret;
439 1.2 bouyer }
440 1.2 bouyer
441 1.2 bouyer static __inline long
442 1.2 bouyer HYPERVISOR_suspend(unsigned long srec)
443 1.2 bouyer {
444 1.2 bouyer long ret;
445 1.2 bouyer unsigned long ign1, ign2, ign3;
446 1.2 bouyer
447 1.2 bouyer #if __XEN_INTERFACE_VERSION__ >= 0x00030201
448 1.2 bouyer
449 1.2 bouyer struct sched_shutdown shutdown_reason = {
450 1.2 bouyer .reason = SHUTDOWN_suspend
451 1.2 bouyer };
452 1.2 bouyer
453 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
454 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (&shutdown_reason), "3" (srec)),
455 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)));
456 1.2 bouyer #else
457 1.2 bouyer _hypercall(__HYPERVISOR_sched_op,
458 1.2 bouyer _harg("1" (SCHEDOP_shutdown), "2" (SHUTDOWN_suspend), "3" (srec)),
459 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)));
460 1.2 bouyer #endif
461 1.2 bouyer
462 1.2 bouyer return ret;
463 1.2 bouyer }
464 1.2 bouyer
465 1.2 bouyer static __inline long
466 1.2 bouyer HYPERVISOR_set_timer_op(uint64_t timeout)
467 1.2 bouyer {
468 1.2 bouyer long ret;
469 1.2 bouyer unsigned long timeout_hi = (unsigned long)(timeout>>32);
470 1.2 bouyer unsigned long timeout_lo = (unsigned long)timeout;
471 1.2 bouyer unsigned long ign1, ign2;
472 1.2 bouyer
473 1.2 bouyer _hypercall(__HYPERVISOR_set_timer_op,
474 1.2 bouyer _harg("1" (timeout_lo), "2" (timeout_hi)),
475 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
476 1.2 bouyer
477 1.2 bouyer return ret;
478 1.2 bouyer }
479 1.2 bouyer
480 1.2 bouyer static __inline int
481 1.2 bouyer HYPERVISOR_platform_op(struct xen_platform_op *platform_op)
482 1.2 bouyer {
483 1.2 bouyer int ret;
484 1.2 bouyer unsigned long ign1;
485 1.2 bouyer
486 1.2 bouyer platform_op->interface_version = XENPF_INTERFACE_VERSION;
487 1.2 bouyer _hypercall(__HYPERVISOR_platform_op, _harg("1" (platform_op)),
488 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
489 1.2 bouyer
490 1.2 bouyer return ret;
491 1.2 bouyer }
492 1.2 bouyer
493 1.2 bouyer static __inline int
494 1.2 bouyer HYPERVISOR_multicall(void *call_list, int nr_calls)
495 1.2 bouyer {
496 1.2 bouyer int ret;
497 1.2 bouyer unsigned long ign1, ign2;
498 1.2 bouyer
499 1.2 bouyer _hypercall(__HYPERVISOR_multicall,
500 1.2 bouyer _harg("1" (call_list), "2" (nr_calls)),
501 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
502 1.2 bouyer
503 1.2 bouyer return ret;
504 1.2 bouyer }
505 1.2 bouyer
506 1.2 bouyer
507 1.2 bouyer static __inline int
508 1.2 bouyer HYPERVISOR_event_channel_op(evtchn_op_t *op)
509 1.2 bouyer {
510 1.2 bouyer int ret;
511 1.2 bouyer unsigned long ign1;
512 1.2 bouyer
513 1.2 bouyer #if __XEN_INTERFACE_VERSION__ < 0x00030202
514 1.2 bouyer _hypercall(__HYPERVISOR_event_channel_op, _harg("1" (op)),
515 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
516 1.2 bouyer #else
517 1.2 bouyer unsigned long ign2;
518 1.2 bouyer
519 1.2 bouyer _hypercall(__HYPERVISOR_event_channel_op, _harg("1" (op->cmd), "2" (&op->u)),
520 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
521 1.2 bouyer #endif
522 1.2 bouyer return ret;
523 1.2 bouyer }
524 1.2 bouyer
525 1.2 bouyer static __inline int
526 1.2 bouyer HYPERVISOR_console_io(int cmd, int count, char *str)
527 1.2 bouyer {
528 1.2 bouyer int ret;
529 1.2 bouyer unsigned long ign1, ign2, ign3;
530 1.2 bouyer
531 1.2 bouyer _hypercall(__HYPERVISOR_console_io,
532 1.2 bouyer _harg("1" (cmd), "2" (count), "3" (str)),
533 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)));
534 1.2 bouyer
535 1.2 bouyer return ret;
536 1.2 bouyer }
537 1.2 bouyer
538 1.2 bouyer static __inline int
539 1.2 bouyer HYPERVISOR_physdev_op(int cmd, void *physdev_op)
540 1.2 bouyer {
541 1.2 bouyer int ret;
542 1.2 bouyer unsigned long ign1, ign2;
543 1.2 bouyer
544 1.2 bouyer _hypercall(__HYPERVISOR_physdev_op, _harg("1" (cmd), "2" (physdev_op)),
545 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
546 1.2 bouyer
547 1.2 bouyer return ret;
548 1.2 bouyer }
549 1.2 bouyer
550 1.2 bouyer static __inline int
551 1.2 bouyer HYPERVISOR_vm_assist(unsigned int cmd, unsigned int type)
552 1.2 bouyer {
553 1.2 bouyer int ret;
554 1.2 bouyer unsigned long ign1, ign2;
555 1.2 bouyer
556 1.2 bouyer _hypercall(__HYPERVISOR_vm_assist, _harg("1" (cmd), "2" (type)),
557 1.2 bouyer _harg("=a" (ret), "=b" (ign1), "=c" (ign2)));
558 1.2 bouyer
559 1.2 bouyer return ret;
560 1.2 bouyer }
561 1.2 bouyer
562 1.2 bouyer static __inline int
563 1.2 bouyer HYPERVISOR_sysctl(void *sysctl)
564 1.2 bouyer {
565 1.2 bouyer int ret;
566 1.2 bouyer unsigned long ign1;
567 1.2 bouyer
568 1.2 bouyer _hypercall(__HYPERVISOR_sysctl, _harg("1" (sysctl)),
569 1.2 bouyer _harg("=a" (ret), "=b" (ign1)));
570 1.2 bouyer
571 1.2 bouyer return ret;
572 1.2 bouyer }
573 1.2 bouyer #endif /* _XENI386_HYPERVISOR_H_ */
574