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 <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
25extern uint64_t get_system_time(int ticks);
26
27static inline int
28HYPERVISOR_console_write(const char *str, int count)
29{
30    return HYPERVISOR_console_io(CONSOLEIO_write, count, str);
31}
32
33static inline int
34HYPERVISOR_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
45static inline int
46HYPERVISOR_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
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__ */
102