FreeBSD xen subsystem code
hypervisor.h
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
26extern uint64_t get_system_time(int ticks);
27
28static inline int
29HYPERVISOR_console_write(const char *str, int count)
30{
31 return HYPERVISOR_console_io(CONSOLEIO_write, count, str);
32}
33
34static inline int
35HYPERVISOR_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
46static inline int
47HYPERVISOR_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
59static inline void
60HYPERVISOR_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
72static inline void
73HYPERVISOR_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 */
82static inline int
83HYPERVISOR_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__ */