]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/xen/hypervisor.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / 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$
9  */
10
11 #ifndef __XEN_HYPERVISOR_H__
12 #define __XEN_HYPERVISOR_H__
13
14 #ifdef XENHVM
15
16 #define is_running_on_xen()     (HYPERVISOR_shared_info != NULL)
17
18 #else
19
20 #define is_running_on_xen() 1
21
22 #endif
23
24 #ifdef PAE
25 #ifndef CONFIG_X86_PAE
26 #define CONFIG_X86_PAE
27 #endif
28 #endif
29
30 #include <sys/cdefs.h>
31 #include <sys/systm.h>
32 #include <xen/interface/xen.h>
33 #include <xen/interface/platform.h>
34 #include <xen/interface/event_channel.h>
35 #include <xen/interface/physdev.h>
36 #include <xen/interface/sched.h>
37 #include <xen/interface/callback.h>
38 #include <xen/interface/memory.h>
39 #include <machine/xen/hypercall.h>
40
41 #if defined(__amd64__)
42 #define MULTI_UVMFLAGS_INDEX 2
43 #define MULTI_UVMDOMID_INDEX 3
44 #else
45 #define MULTI_UVMFLAGS_INDEX 3
46 #define MULTI_UVMDOMID_INDEX 4
47 #endif
48
49 #ifdef CONFIG_XEN_PRIVILEGED_GUEST
50 #define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
51 #else
52 #define is_initial_xendomain() 0
53 #endif
54
55 extern start_info_t *xen_start_info;
56
57 extern uint64_t get_system_time(int ticks);
58
59 static inline int 
60 HYPERVISOR_console_write(char *str, int count)
61 {
62     return HYPERVISOR_console_io(CONSOLEIO_write, count, str); 
63 }
64
65 static inline void HYPERVISOR_crash(void) __dead2;
66
67 static inline int
68 HYPERVISOR_yield(void)
69 {
70         int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
71
72 #if CONFIG_XEN_COMPAT <= 0x030002
73         if (rc == -ENOXENSYS)
74                 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
75 #endif
76         return (rc);
77 }
78
79 static inline int
80 HYPERVISOR_block(
81         void)
82 {
83         int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
84
85 #if CONFIG_XEN_COMPAT <= 0x030002
86         if (rc == -ENOXENSYS)
87                 rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
88 #endif
89         return (rc);
90 }
91
92
93 static inline void 
94 HYPERVISOR_shutdown(unsigned int reason)
95 {
96         struct sched_shutdown sched_shutdown = {
97                 .reason = reason
98         };
99
100         HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
101 #if CONFIG_XEN_COMPAT <= 0x030002
102         HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
103 #endif
104 }
105
106 static inline void
107 HYPERVISOR_crash(void) 
108 {
109         HYPERVISOR_shutdown(SHUTDOWN_crash); 
110         /* NEVER REACHED */
111         for (;;) ; /* eliminate noreturn error */ 
112 }
113
114 /* Transfer control to hypervisor until an event is detected on one */
115 /* of the specified ports or the specified number of ticks elapse */
116 static inline int
117 HYPERVISOR_poll(
118         evtchn_port_t *ports, unsigned int nr_ports, int ticks)
119 {
120         int rc;
121         struct sched_poll sched_poll = {
122                 .nr_ports = nr_ports,
123                 .timeout = get_system_time(ticks)
124         };
125         set_xen_guest_handle(sched_poll.ports, ports);
126
127         rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
128 #if CONFIG_XEN_COMPAT <= 0x030002
129         if (rc == -ENOXENSYS)
130                 rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
131 #endif  
132         return (rc);
133 }
134
135 static inline void
136 MULTI_update_va_mapping(
137         multicall_entry_t *mcl, unsigned long va,
138         uint64_t new_val, unsigned long flags)
139 {
140     mcl->op = __HYPERVISOR_update_va_mapping;
141     mcl->args[0] = va;
142 #if defined(__amd64__)
143     mcl->args[1] = new_val;
144 #elif defined(PAE)
145     mcl->args[1] = (uint32_t)(new_val & 0xffffffff) ;
146     mcl->args[2] = (uint32_t)(new_val >> 32);
147 #else
148     mcl->args[1] = new_val;
149     mcl->args[2] = 0;
150 #endif
151     mcl->args[MULTI_UVMFLAGS_INDEX] = flags;
152 }
153
154 #endif /* __XEN_HYPERVISOR_H__ */