FreeBSD/Linux Kernel Cross Reference
sys/xen/hypervisor.h
1 /******************************************************************************
2 * hypervisor.h
3 *
4 * Linux-specific hypervisor handling.
5 *
6 * Copyright (c) 2002, K A Fraser
7 *
8 * $FreeBSD: releng/12.0/sys/xen/hypervisor.h 289686 2015-10-21 10:44:07Z royger $
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 <xen/interface/xen.h>
17 #include <xen/interface/platform.h>
18 #include <xen/interface/event_channel.h>
19 #include <xen/interface/physdev.h>
20 #include <xen/interface/sched.h>
21 #include <xen/interface/callback.h>
22 #include <xen/interface/memory.h>
23 #include <machine/xen/hypercall.h>
24
25 extern uint64_t get_system_time(int ticks);
26
27 static inline int
28 HYPERVISOR_console_write(const char *str, int count)
29 {
30 return HYPERVISOR_console_io(CONSOLEIO_write, count, str);
31 }
32
33 static inline int
34 HYPERVISOR_yield(void)
35 {
36 int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
37
38 #if CONFIG_XEN_COMPAT <= 0x030002
39 if (rc == -ENOXENSYS)
40 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
41 #endif
42 return (rc);
43 }
44
45 static inline int
46 HYPERVISOR_block(
47 void)
48 {
49 int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
50
51 #if CONFIG_XEN_COMPAT <= 0x030002
52 if (rc == -ENOXENSYS)
53 rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
54 #endif
55 return (rc);
56 }
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__ */
Cache object: b04481a2203257ae4955605509bcf061
|