1*5741Smrj /*
2*5741Smrj  * CDDL HEADER START
3*5741Smrj  *
4*5741Smrj  * The contents of this file are subject to the terms of the
5*5741Smrj  * Common Development and Distribution License (the "License").
6*5741Smrj  * You may not use this file except in compliance with the License.
7*5741Smrj  *
8*5741Smrj  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5741Smrj  * or http://www.opensolaris.org/os/licensing.
10*5741Smrj  * See the License for the specific language governing permissions
11*5741Smrj  * and limitations under the License.
12*5741Smrj  *
13*5741Smrj  * When distributing Covered Code, include this CDDL HEADER in each
14*5741Smrj  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5741Smrj  * If applicable, add the following below this CDDL HEADER, with the
16*5741Smrj  * fields enclosed by brackets "[]" replaced with your own identifying
17*5741Smrj  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5741Smrj  *
19*5741Smrj  * CDDL HEADER END
20*5741Smrj  */
21*5741Smrj 
22*5741Smrj /*
23*5741Smrj  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*5741Smrj  * Use is subject to license terms.
25*5741Smrj  */
26*5741Smrj 
27*5741Smrj /*
28*5741Smrj  *
29*5741Smrj  * Communication to/from hypervisor.
30*5741Smrj  *
31*5741Smrj  * Copyright (c) 2002-2004, K A Fraser
32*5741Smrj  *
33*5741Smrj  * Permission is hereby granted, free of charge, to any person obtaining a copy
34*5741Smrj  * of this source file (the "Software"), to deal in the Software without
35*5741Smrj  * restriction, including without limitation the rights to use, copy, modify,
36*5741Smrj  * merge, publish, distribute, sublicense, and/or sell copies of the Software,
37*5741Smrj  * and to permit persons to whom the Software is furnished to do so, subject to
38*5741Smrj  * the following conditions:
39*5741Smrj  *
40*5741Smrj  * The above copyright notice and this permission notice shall be included in
41*5741Smrj  * all copies or substantial portions of the Software.
42*5741Smrj  *
43*5741Smrj  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44*5741Smrj  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45*5741Smrj  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46*5741Smrj  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47*5741Smrj  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
48*5741Smrj  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
49*5741Smrj  * IN THE SOFTWARE.
50*5741Smrj  */
51*5741Smrj 
52*5741Smrj #ifndef _SYS_HYPERVISOR_H
53*5741Smrj #define	_SYS_HYPERVISOR_H
54*5741Smrj 
55*5741Smrj #pragma ident	"%Z%%M%	%I%	%E% SMI"
56*5741Smrj 
57*5741Smrj #ifdef __cplusplus
58*5741Smrj extern "C" {
59*5741Smrj #endif
60*5741Smrj 
61*5741Smrj #ifdef XPV_HVM_DRIVER
62*5741Smrj #include <sys/xpv_support.h>
63*5741Smrj #else
64*5741Smrj #include <sys/xpv_impl.h>
65*5741Smrj #endif
66*5741Smrj #include <sys/xen_errno.h>
67*5741Smrj 
68*5741Smrj #if !defined(_ASM)
69*5741Smrj 
70*5741Smrj #include <sys/processor.h>
71*5741Smrj #include <sys/cpuvar.h>
72*5741Smrj #ifndef XPV_HVM_DRIVER
73*5741Smrj #include <sys/xen_mmu.h>
74*5741Smrj #endif
75*5741Smrj #include <sys/systm.h>
76*5741Smrj #include <xen/public/callback.h>
77*5741Smrj #include <xen/public/event_channel.h>
78*5741Smrj #include <xen/public/grant_table.h>
79*5741Smrj #include <xen/public/io/blkif.h>
80*5741Smrj #include <xen/public/io/xenbus.h>
81*5741Smrj #include <xen/public/memory.h>
82*5741Smrj #include <xen/public/nmi.h>
83*5741Smrj #include <xen/public/physdev.h>
84*5741Smrj #include <xen/public/sched.h>
85*5741Smrj #include <xen/public/sysctl.h>
86*5741Smrj #include <xen/public/platform.h>
87*5741Smrj #include <xen/public/vcpu.h>
88*5741Smrj #include <xen/public/version.h>
89*5741Smrj #include <xen/public/acm_ops.h>
90*5741Smrj #include <xen/public/hvm/params.h>
91*5741Smrj 
92*5741Smrj extern shared_info_t *HYPERVISOR_shared_info;
93*5741Smrj extern void *HYPERVISOR_console_page;
94*5741Smrj 
95*5741Smrj /* -- move these definitions elsewhere -- */
96*5741Smrj 
97*5741Smrj extern int xen_debug_handler(void *);
98*5741Smrj extern void xen_printf(const char *, ...) __KPRINTFLIKE(1);
99*5741Smrj #pragma rarely_called(xen_printf)
100*5741Smrj 
101*5741Smrj extern void xen_callback(void);
102*5741Smrj extern void xen_failsafe_callback(void);
103*5741Smrj 
104*5741Smrj extern hrtime_t xpv_gethrtime(void);
105*5741Smrj extern hrtime_t xpv_getsystime(void);
106*5741Smrj 
107*5741Smrj extern void xpv_time_suspend(void);
108*5741Smrj extern void xpv_time_resume(void);
109*5741Smrj 
110*5741Smrj extern void startup_xen_version(void);
111*5741Smrj 
112*5741Smrj extern void mach_cpucontext_reset(cpu_t *);
113*5741Smrj extern void mach_cpucontext_restore(cpu_t *);
114*5741Smrj 
115*5741Smrj extern void mp_enter_barrier(void);
116*5741Smrj extern void mp_leave_barrier(void);
117*5741Smrj 
118*5741Smrj extern cpuset_t cpu_suspend_lost_set;
119*5741Smrj 
120*5741Smrj extern int xen_gdt_setprot(cpu_t *, uint_t);
121*5741Smrj extern int xen_ldt_setprot(user_desc_t *, size_t, uint_t);
122*5741Smrj 
123*5741Smrj /*
124*5741Smrj  * Wrappered versions of the hypercalls that diagnose/panic on failure
125*5741Smrj  */
126*5741Smrj extern void xen_set_gdt(ulong_t *, int);
127*5741Smrj extern void xen_set_ldt(user_desc_t *, uint_t);
128*5741Smrj extern void xen_stack_switch(ulong_t, ulong_t);
129*5741Smrj extern long xen_set_trap_table(trap_info_t *);
130*5741Smrj 
131*5741Smrj #if defined(__amd64)
132*5741Smrj extern void xen_set_segment_base(int, ulong_t);
133*5741Smrj #endif	/* __amd64 */
134*5741Smrj extern long xen_vcpu_up(processorid_t);
135*5741Smrj extern long xen_vcpu_down(processorid_t);
136*5741Smrj extern void xen_enable_user_iopl(void);
137*5741Smrj extern void xen_disable_user_iopl(void);
138*5741Smrj 
139*5741Smrj /*
140*5741Smrj  * A quick way to ask if we're DOM0 or not ..
141*5741Smrj  */
142*5741Smrj #ifdef XPV_HVM_DRIVER
143*5741Smrj 
144*5741Smrj #define	DOMAIN_IS_INITDOMAIN(info)	(__lintzero)
145*5741Smrj #define	DOMAIN_IS_PRIVILEGED(info)	(__lintzero)
146*5741Smrj 
147*5741Smrj #else
148*5741Smrj 
149*5741Smrj #define	DOMAIN_IS_INITDOMAIN(info)	\
150*5741Smrj 	(((info)->flags & SIF_INITDOMAIN) == SIF_INITDOMAIN)
151*5741Smrj 
152*5741Smrj #define	DOMAIN_IS_PRIVILEGED(info)	\
153*5741Smrj 	(((info)->flags & SIF_PRIVILEGED) == SIF_PRIVILEGED)
154*5741Smrj 
155*5741Smrj #endif
156*5741Smrj 
157*5741Smrj /*
158*5741Smrj  * start of day information passed up from the hypervisor
159*5741Smrj  */
160*5741Smrj extern start_info_t *xen_info;
161*5741Smrj 
162*5741Smrj extern long __hypercall0(int);
163*5741Smrj extern long __hypercall1(int, ulong_t);
164*5741Smrj extern long __hypercall2(int, ulong_t, ulong_t);
165*5741Smrj extern long __hypercall3(int, ulong_t, ulong_t, ulong_t);
166*5741Smrj extern long __hypercall4(int, ulong_t, ulong_t, ulong_t, ulong_t);
167*5741Smrj extern long __hypercall5(int, ulong_t, ulong_t, ulong_t, ulong_t, ulong_t);
168*5741Smrj 
169*5741Smrj extern int __hypercall0_int(int);
170*5741Smrj extern int __hypercall1_int(int, ulong_t);
171*5741Smrj extern int __hypercall2_int(int, ulong_t, ulong_t);
172*5741Smrj extern int __hypercall3_int(int, ulong_t, ulong_t, ulong_t);
173*5741Smrj extern int __hypercall4_int(int, ulong_t, ulong_t, ulong_t, ulong_t);
174*5741Smrj extern int __hypercall5_int(int, ulong_t, ulong_t, ulong_t, ulong_t, ulong_t);
175*5741Smrj 
176*5741Smrj extern long HYPERVISOR_set_trap_table(trap_info_t *);
177*5741Smrj extern int HYPERVISOR_mmu_update(mmu_update_t *, int, int *, domid_t);
178*5741Smrj extern long HYPERVISOR_set_gdt(ulong_t *, int);
179*5741Smrj extern long HYPERVISOR_stack_switch(ulong_t, ulong_t);
180*5741Smrj #if defined(__amd64)
181*5741Smrj extern long HYPERVISOR_set_callbacks(ulong_t, ulong_t, ulong_t);
182*5741Smrj #else
183*5741Smrj extern long HYPERVISOR_set_callbacks(ulong_t, ulong_t, ulong_t, ulong_t);
184*5741Smrj #endif
185*5741Smrj extern long HYPERVISOR_fpu_taskswitch(int);
186*5741Smrj /* *** __HYPERVISOR_sched_op_compat *** OBSOLETED */
187*5741Smrj extern long HYPERVISOR_platform_op(xen_platform_op_t *);
188*5741Smrj /* *** __HYPERVISOR_set_debugreg *** NOT IMPLEMENTED */
189*5741Smrj /* *** __HYPERVISOR_get_debugreg *** NOT IMPLEMENTED */
190*5741Smrj extern long HYPERVISOR_update_descriptor(maddr_t, uint64_t);
191*5741Smrj extern long HYPERVISOR_memory_op(int, void *);
192*5741Smrj extern long HYPERVISOR_multicall(void *, uint_t);
193*5741Smrj extern int HYPERVISOR_update_va_mapping(ulong_t, uint64_t, ulong_t);
194*5741Smrj extern long HYPERVISOR_set_timer_op(uint64_t);
195*5741Smrj /* *** __HYPERVISOR_event_channel_op_compat *** OBSOLETED */
196*5741Smrj extern long HYPERVISOR_xen_version(int, void *);
197*5741Smrj extern long HYPERVISOR_console_io(int, int, char *);
198*5741Smrj /* *** __HYPERVISOR_physdev_op_compat *** OBSOLETED */
199*5741Smrj extern long HYPERVISOR_grant_table_op(unsigned int, void *, unsigned int);
200*5741Smrj extern long HYPERVISOR_vm_assist(unsigned int, unsigned int);
201*5741Smrj extern int HYPERVISOR_update_va_mapping_otherdomain(ulong_t,
202*5741Smrj     uint64_t, ulong_t, domid_t);
203*5741Smrj /* *** __HYPERVISOR_iret *** IN i86xpv/sys/machprivregs.h */
204*5741Smrj extern long HYPERVISOR_vcpu_op(int, int, void *);
205*5741Smrj #if defined(__amd64)
206*5741Smrj extern long HYPERVISOR_set_segment_base(int, ulong_t);
207*5741Smrj #endif	/* __amd64 */
208*5741Smrj extern int HYPERVISOR_mmuext_op(struct mmuext_op *, int, uint_t *, domid_t);
209*5741Smrj extern long HYPERVISOR_acm_op(int cmd, void *);
210*5741Smrj extern long HYPERVISOR_nmi_op(int cmd, void *);
211*5741Smrj extern long HYPERVISOR_sched_op(int, void *);
212*5741Smrj extern long HYPERVISOR_callback_op(int, void *);
213*5741Smrj /* *** __HYPERVISOR_xenoprof_op *** NOT IMPLEMENTED */
214*5741Smrj extern long HYPERVISOR_event_channel_op(int, void *); /* does return long */
215*5741Smrj extern long HYPERVISOR_physdev_op(int, void *);
216*5741Smrj extern long HYPERVISOR_hvm_op(int cmd, void *);
217*5741Smrj extern long HYPERVISOR_sysctl(xen_sysctl_t *);
218*5741Smrj extern long HYPERVISOR_domctl(xen_domctl_t *domctl);
219*5741Smrj /* *** __HYPERVISOR_kexec_op *** NOT IMPLEMENTED */
220*5741Smrj 
221*5741Smrj 
222*5741Smrj /*
223*5741Smrj  * HYPERCALL HELPER ROUTINES
224*5741Smrj  *    These don't have their own unique hypercalls.
225*5741Smrj  */
226*5741Smrj extern long HYPERVISOR_yield(void);
227*5741Smrj extern long HYPERVISOR_block(void);
228*5741Smrj extern long HYPERVISOR_shutdown(uint_t);
229*5741Smrj extern long HYPERVISOR_poll(evtchn_port_t *, uint_t, uint64_t);
230*5741Smrj extern long HYPERVISOR_suspend(ulong_t);
231*5741Smrj 
232*5741Smrj #endif /* !_ASM */
233*5741Smrj 
234*5741Smrj #ifdef __cplusplus
235*5741Smrj }
236*5741Smrj #endif
237*5741Smrj 
238*5741Smrj #endif /* _SYS_HYPERVISOR_H */
239