xref: /freebsd/sys/xen/hypervisor.h (revision d5b0e70f7e04d971691517ce1304d86a1e367e2e)
1 /******************************************************************************
2  * hypervisor.h
3   *
4  * Linux-specific hypervisor handling.
5  *
6  * Copyright (c) 2002, K A Fraser
7  *
8  * $FreeBSD$
9  */
10 
11 #ifndef __XEN_HYPERVISOR_H__
12 #define __XEN_HYPERVISOR_H__
13 
14 #include <sys/cdefs.h>
15 #include <sys/systm.h>
16 #include <contrib/xen/xen.h>
17 #include <contrib/xen/platform.h>
18 #include <contrib/xen/event_channel.h>
19 #include <contrib/xen/physdev.h>
20 #include <contrib/xen/sched.h>
21 #include <contrib/xen/callback.h>
22 #include <contrib/xen/memory.h>
23 #include <contrib/xen/hvm/dm_op.h>
24 #include <machine/xen/hypercall.h>
25 
26 extern uint64_t get_system_time(int ticks);
27 
28 static inline int
29 HYPERVISOR_console_write(const char *str, int count)
30 {
31     return HYPERVISOR_console_io(CONSOLEIO_write, count, str);
32 }
33 
34 static inline int
35 HYPERVISOR_yield(void)
36 {
37         int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
38 
39 #if CONFIG_XEN_COMPAT <= 0x030002
40 	if (rc == -ENOXENSYS)
41 		rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
42 #endif
43         return (rc);
44 }
45 
46 static inline int
47 HYPERVISOR_block(
48         void)
49 {
50         int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
51 
52 #if CONFIG_XEN_COMPAT <= 0x030002
53 	if (rc == -ENOXENSYS)
54 		rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
55 #endif
56         return (rc);
57 }
58 
59 static inline void
60 HYPERVISOR_shutdown(unsigned int reason)
61 {
62 	struct sched_shutdown sched_shutdown = {
63 		.reason = reason
64 	};
65 
66 	HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
67 #if CONFIG_XEN_COMPAT <= 0x030002
68 	HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
69 #endif
70 }
71 
72 static inline void
73 HYPERVISOR_crash(void)
74 {
75         HYPERVISOR_shutdown(SHUTDOWN_crash);
76 	/* NEVER REACHED */
77         for (;;) ; /* eliminate noreturn error */
78 }
79 
80 /* Transfer control to hypervisor until an event is detected on one */
81 /* of the specified ports or the specified number of ticks elapse */
82 static inline int
83 HYPERVISOR_poll(
84 	evtchn_port_t *ports, unsigned int nr_ports, int ticks)
85 {
86 	int rc;
87 	struct sched_poll sched_poll = {
88 		.nr_ports = nr_ports,
89 		.timeout = get_system_time(ticks)
90 	};
91 	set_xen_guest_handle(sched_poll.ports, ports);
92 
93 	rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
94 #if CONFIG_XEN_COMPAT <= 0x030002
95 	if (rc == -ENOXENSYS)
96 		rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
97 #endif
98 	return (rc);
99 }
100 
101 #endif /* __XEN_HYPERVISOR_H__ */
102