1 /******************************************************************************
2  * hypercall.h
3  */
4 
5 #ifndef __XEN_HYPERCALL_H__
6 #define __XEN_HYPERCALL_H__
7 
8 #include <xen/types.h>
9 #include <xen/time.h>
10 #include <public/xen.h>
11 #include <public/domctl.h>
12 #include <public/sysctl.h>
13 #include <public/platform.h>
14 #include <public/event_channel.h>
15 #include <public/version.h>
16 #include <public/pmu.h>
17 #include <public/hvm/dm_op.h>
18 #include <asm/hypercall.h>
19 #include <xsm/xsm.h>
20 
21 extern long
22 do_sched_op(
23     int cmd,
24     XEN_GUEST_HANDLE_PARAM(void) arg);
25 
26 extern long
27 do_domctl(
28     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
29 
30 extern long
31 arch_do_domctl(
32     struct xen_domctl *domctl, struct domain *d,
33     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
34 
35 extern long
36 do_sysctl(
37     XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl);
38 
39 extern long
40 arch_do_sysctl(
41     struct xen_sysctl *sysctl,
42     XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl);
43 
44 extern long
45 do_platform_op(
46     XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op);
47 
48 /*
49  * To allow safe resume of do_memory_op() after preemption, we need to know
50  * at what point in the page list to resume. For this purpose I steal the
51  * high-order bits of the @cmd parameter, which are otherwise unused and zero.
52  *
53  * Note that both of these values are effectively part of the ABI, even if
54  * we don't need to make them a formal part of it: A guest suspended for
55  * migration in the middle of a continuation would fail to work if resumed on
56  * a hypervisor using different values.
57  */
58 #define MEMOP_EXTENT_SHIFT 6 /* cmd[:6] == start_extent */
59 #define MEMOP_CMD_MASK     ((1 << MEMOP_EXTENT_SHIFT) - 1)
60 
61 extern long
62 do_memory_op(
63     unsigned long cmd,
64     XEN_GUEST_HANDLE_PARAM(void) arg);
65 
66 extern long
67 do_multicall(
68     XEN_GUEST_HANDLE_PARAM(multicall_entry_t) call_list,
69     unsigned int nr_calls);
70 
71 extern long
72 do_set_timer_op(
73     s_time_t timeout);
74 
75 extern long
76 do_event_channel_op(
77     int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
78 
79 extern long
80 do_xen_version(
81     int cmd,
82     XEN_GUEST_HANDLE_PARAM(void) arg);
83 
84 extern long
85 do_console_io(
86     unsigned int cmd,
87     unsigned int count,
88     XEN_GUEST_HANDLE_PARAM(char) buffer);
89 
90 extern long
91 do_grant_table_op(
92     unsigned int cmd,
93     XEN_GUEST_HANDLE_PARAM(void) uop,
94     unsigned int count);
95 
96 extern long
97 do_vm_assist(
98     unsigned int cmd,
99     unsigned int type);
100 
101 extern long
102 do_vcpu_op(
103     int cmd,
104     unsigned int vcpuid,
105     XEN_GUEST_HANDLE_PARAM(void) arg);
106 
107 struct vcpu;
108 extern long
109 arch_do_vcpu_op(int cmd,
110     struct vcpu *v,
111     XEN_GUEST_HANDLE_PARAM(void) arg);
112 
113 extern long
114 do_nmi_op(
115     unsigned int cmd,
116     XEN_GUEST_HANDLE_PARAM(void) arg);
117 
118 extern long
119 do_hvm_op(
120     unsigned long op,
121     XEN_GUEST_HANDLE_PARAM(void) arg);
122 
123 extern long
124 do_kexec_op(
125     unsigned long op,
126     XEN_GUEST_HANDLE_PARAM(void) uarg);
127 
128 extern long
129 do_xsm_op(
130     XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_xsm_op);
131 
132 #ifdef CONFIG_ARGO
133 extern long do_argo_op(
134     unsigned int cmd,
135     XEN_GUEST_HANDLE_PARAM(void) arg1,
136     XEN_GUEST_HANDLE_PARAM(void) arg2,
137     unsigned long arg3,
138     unsigned long arg4);
139 #endif
140 
141 extern long
142 do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
143 
144 extern long
145 do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
146 
147 extern long
148 do_dm_op(
149     domid_t domid,
150     unsigned int nr_bufs,
151     XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs);
152 
153 #ifdef CONFIG_HYPFS
154 extern long
155 do_hypfs_op(
156     unsigned int cmd,
157     XEN_GUEST_HANDLE_PARAM(const_char) arg1,
158     unsigned long arg2,
159     XEN_GUEST_HANDLE_PARAM(void) arg3,
160     unsigned long arg4);
161 #endif
162 
163 #ifdef CONFIG_COMPAT
164 
165 extern int
166 compat_memory_op(
167     unsigned int cmd,
168     XEN_GUEST_HANDLE_PARAM(void) arg);
169 
170 extern int
171 compat_grant_table_op(
172     unsigned int cmd,
173     XEN_GUEST_HANDLE_PARAM(void) uop,
174     unsigned int count);
175 
176 extern int
177 compat_vcpu_op(
178     int cmd,
179     unsigned int vcpuid,
180     XEN_GUEST_HANDLE_PARAM(void) arg);
181 
182 extern int
183 compat_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
184 
185 extern int
186 compat_xen_version(
187     int cmd,
188     XEN_GUEST_HANDLE_PARAM(void) arg);
189 
190 extern int
191 compat_sched_op(
192     int cmd,
193     XEN_GUEST_HANDLE_PARAM(void) arg);
194 
195 extern int
196 compat_set_timer_op(
197     u32 lo,
198     s32 hi);
199 
200 extern int compat_xsm_op(
201     XEN_GUEST_HANDLE_PARAM(xsm_op_t) op);
202 
203 extern int compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg);
204 
205 DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
206 extern int compat_multicall(
207     XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list,
208     uint32_t nr_calls);
209 
210 #ifdef CONFIG_ARGO
211 extern long compat_argo_op(
212     unsigned int cmd,
213     XEN_GUEST_HANDLE_PARAM(void) arg1,
214     XEN_GUEST_HANDLE_PARAM(void) arg2,
215     unsigned long arg3,
216     unsigned long arg4);
217 #endif
218 
219 #include <compat/hvm/dm_op.h>
220 
221 extern int
222 compat_dm_op(
223     domid_t domid,
224     unsigned int nr_bufs,
225     XEN_GUEST_HANDLE_PARAM(void) bufs);
226 
227 #endif
228 
229 void arch_get_xen_caps(xen_capabilities_info_t *info);
230 
231 #endif /* __XEN_HYPERCALL_H__ */
232