xref: /freebsd/sys/xen/xen-os.h (revision c89f1f12b07be43df17cde53a0dcaf4f3a271eba)
176acc41fSJustin T. Gibbs /******************************************************************************
276acc41fSJustin T. Gibbs  * xen/xen-os.h
376acc41fSJustin T. Gibbs  *
476acc41fSJustin T. Gibbs  * Random collection of macros and definition
576acc41fSJustin T. Gibbs  *
676acc41fSJustin T. Gibbs  * Copyright (c) 2003, 2004 Keir Fraser (on behalf of the Xen team)
776acc41fSJustin T. Gibbs  * All rights reserved.
876acc41fSJustin T. Gibbs  *
976acc41fSJustin T. Gibbs  * Permission is hereby granted, free of charge, to any person obtaining a copy
1076acc41fSJustin T. Gibbs  * of this software and associated documentation files (the "Software"), to
1176acc41fSJustin T. Gibbs  * deal in the Software without restriction, including without limitation the
1276acc41fSJustin T. Gibbs  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1376acc41fSJustin T. Gibbs  * sell copies of the Software, and to permit persons to whom the Software is
1476acc41fSJustin T. Gibbs  * furnished to do so, subject to the following conditions:
1576acc41fSJustin T. Gibbs  *
1676acc41fSJustin T. Gibbs  * The above copyright notice and this permission notice shall be included in
1776acc41fSJustin T. Gibbs  * all copies or substantial portions of the Software.
1876acc41fSJustin T. Gibbs  *
1976acc41fSJustin T. Gibbs  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2076acc41fSJustin T. Gibbs  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2176acc41fSJustin T. Gibbs  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2276acc41fSJustin T. Gibbs  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2376acc41fSJustin T. Gibbs  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2476acc41fSJustin T. Gibbs  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2576acc41fSJustin T. Gibbs  * DEALINGS IN THE SOFTWARE.
2676acc41fSJustin T. Gibbs  *
2776acc41fSJustin T. Gibbs  * $FreeBSD$
2876acc41fSJustin T. Gibbs  */
2976acc41fSJustin T. Gibbs 
3076acc41fSJustin T. Gibbs #ifndef _XEN_XEN_OS_H_
3176acc41fSJustin T. Gibbs #define _XEN_XEN_OS_H_
3276acc41fSJustin T. Gibbs 
3376acc41fSJustin T. Gibbs #define  __XEN_INTERFACE_VERSION__ 0x00030208
3476acc41fSJustin T. Gibbs 
3576acc41fSJustin T. Gibbs #define GRANT_REF_INVALID   0xffffffff
3676acc41fSJustin T. Gibbs 
3776acc41fSJustin T. Gibbs #ifdef LOCORE
3876acc41fSJustin T. Gibbs #define __ASSEMBLY__
3976acc41fSJustin T. Gibbs #endif
4076acc41fSJustin T. Gibbs 
4176acc41fSJustin T. Gibbs #include <xen/interface/xen.h>
4276acc41fSJustin T. Gibbs 
43cfa0b7b8SRoger Pau Monné #ifndef __ASSEMBLY__
442117a66aSMitchell Horne #include <xen/hvm.h>
45cfa0b7b8SRoger Pau Monné #include <xen/interface/event_channel.h>
46cfa0b7b8SRoger Pau Monné 
47cfa0b7b8SRoger Pau Monné static inline vm_paddr_t
48cfa0b7b8SRoger Pau Monné xen_get_xenstore_mfn(void)
49cfa0b7b8SRoger Pau Monné {
50cfa0b7b8SRoger Pau Monné 
512117a66aSMitchell Horne 	return (hvm_get_parameter(HVM_PARAM_STORE_PFN));
52cfa0b7b8SRoger Pau Monné }
53cfa0b7b8SRoger Pau Monné 
54cfa0b7b8SRoger Pau Monné static inline evtchn_port_t
55cfa0b7b8SRoger Pau Monné xen_get_xenstore_evtchn(void)
56cfa0b7b8SRoger Pau Monné {
57cfa0b7b8SRoger Pau Monné 
582117a66aSMitchell Horne 	return (hvm_get_parameter(HVM_PARAM_STORE_EVTCHN));
59cfa0b7b8SRoger Pau Monné }
60cfa0b7b8SRoger Pau Monné 
61cfa0b7b8SRoger Pau Monné static inline vm_paddr_t
62cfa0b7b8SRoger Pau Monné xen_get_console_mfn(void)
63cfa0b7b8SRoger Pau Monné {
64cfa0b7b8SRoger Pau Monné 
652117a66aSMitchell Horne 	return (hvm_get_parameter(HVM_PARAM_CONSOLE_PFN));
66cfa0b7b8SRoger Pau Monné }
67cfa0b7b8SRoger Pau Monné 
68cfa0b7b8SRoger Pau Monné static inline evtchn_port_t
69cfa0b7b8SRoger Pau Monné xen_get_console_evtchn(void)
70cfa0b7b8SRoger Pau Monné {
71cfa0b7b8SRoger Pau Monné 
722117a66aSMitchell Horne 	return (hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN));
73cfa0b7b8SRoger Pau Monné }
7476acc41fSJustin T. Gibbs 
7576acc41fSJustin T. Gibbs extern shared_info_t *HYPERVISOR_shared_info;
7676acc41fSJustin T. Gibbs 
77f8f1bb83SRoger Pau Monné extern int xen_disable_pv_disks;
78f8f1bb83SRoger Pau Monné extern int xen_disable_pv_nics;
79f8f1bb83SRoger Pau Monné 
808dee0e9bSRoger Pau Monné extern bool xen_suspend_cancelled;
818dee0e9bSRoger Pau Monné 
8276acc41fSJustin T. Gibbs enum xen_domain_type {
8376acc41fSJustin T. Gibbs 	XEN_NATIVE,             /* running on bare hardware    */
8476acc41fSJustin T. Gibbs 	XEN_PV_DOMAIN,          /* running in a PV domain      */
8576acc41fSJustin T. Gibbs 	XEN_HVM_DOMAIN,         /* running in a Xen hvm domain */
8676acc41fSJustin T. Gibbs };
8776acc41fSJustin T. Gibbs 
8876acc41fSJustin T. Gibbs extern enum xen_domain_type xen_domain_type;
8976acc41fSJustin T. Gibbs 
9076acc41fSJustin T. Gibbs static inline int
9176acc41fSJustin T. Gibbs xen_domain(void)
9276acc41fSJustin T. Gibbs {
9376acc41fSJustin T. Gibbs 	return (xen_domain_type != XEN_NATIVE);
9476acc41fSJustin T. Gibbs }
9576acc41fSJustin T. Gibbs 
9676acc41fSJustin T. Gibbs static inline int
9776acc41fSJustin T. Gibbs xen_pv_domain(void)
9876acc41fSJustin T. Gibbs {
9976acc41fSJustin T. Gibbs 	return (xen_domain_type == XEN_PV_DOMAIN);
10076acc41fSJustin T. Gibbs }
10176acc41fSJustin T. Gibbs 
10276acc41fSJustin T. Gibbs static inline int
10376acc41fSJustin T. Gibbs xen_hvm_domain(void)
10476acc41fSJustin T. Gibbs {
10576acc41fSJustin T. Gibbs 	return (xen_domain_type == XEN_HVM_DOMAIN);
10676acc41fSJustin T. Gibbs }
10776acc41fSJustin T. Gibbs 
1086f4246bcSRoger Pau Monné static inline bool
1096f4246bcSRoger Pau Monné xen_initial_domain(void)
1106f4246bcSRoger Pau Monné {
111cfa0b7b8SRoger Pau Monné 
1122117a66aSMitchell Horne 	return (xen_domain() && (hvm_start_flags & SIF_INITDOMAIN) != 0);
1136f4246bcSRoger Pau Monné }
114*c89f1f12SElliott Mitchell #endif
115*c89f1f12SElliott Mitchell 
116*c89f1f12SElliott Mitchell #include <machine/xen/xen-os.h>
117*c89f1f12SElliott Mitchell 
118*c89f1f12SElliott Mitchell /* Everything below this point is not included by assembler (.S) files. */
119*c89f1f12SElliott Mitchell #ifndef __ASSEMBLY__
1206f4246bcSRoger Pau Monné 
1210df8b29dSRoger Pau Monné /*
1222f9ec994SRoger Pau Monné  * Based on ofed/include/linux/bitops.h
1232f9ec994SRoger Pau Monné  *
1242f9ec994SRoger Pau Monné  * Those helpers are prefixed by xen_ because xen-os.h is widely included
1252f9ec994SRoger Pau Monné  * and we don't want the other drivers using them.
1262f9ec994SRoger Pau Monné  *
1272f9ec994SRoger Pau Monné  */
1282f9ec994SRoger Pau Monné #define NBPL (NBBY * sizeof(long))
1292f9ec994SRoger Pau Monné 
1302f9ec994SRoger Pau Monné static inline bool
1312f9ec994SRoger Pau Monné xen_test_bit(int bit, volatile long *addr)
1322f9ec994SRoger Pau Monné {
1332f9ec994SRoger Pau Monné 	unsigned long mask = 1UL << (bit % NBPL);
1342f9ec994SRoger Pau Monné 
1352f9ec994SRoger Pau Monné 	return !!(atomic_load_acq_long(&addr[bit / NBPL]) & mask);
1362f9ec994SRoger Pau Monné }
1372f9ec994SRoger Pau Monné 
1382f9ec994SRoger Pau Monné static inline void
1392f9ec994SRoger Pau Monné xen_set_bit(int bit, volatile long *addr)
1402f9ec994SRoger Pau Monné {
1412f9ec994SRoger Pau Monné 	atomic_set_long(&addr[bit / NBPL], 1UL << (bit % NBPL));
1422f9ec994SRoger Pau Monné }
1432f9ec994SRoger Pau Monné 
144f186ed52SRoger Pau Monné static inline void
145f186ed52SRoger Pau Monné xen_clear_bit(int bit, volatile long *addr)
146f186ed52SRoger Pau Monné {
147f186ed52SRoger Pau Monné 	atomic_clear_long(&addr[bit / NBPL], 1UL << (bit % NBPL));
148f186ed52SRoger Pau Monné }
149f186ed52SRoger Pau Monné 
15089ee6cecSRoger Pau Monné #undef NBPL
1512f9ec994SRoger Pau Monné 
1522f9ec994SRoger Pau Monné /*
1530df8b29dSRoger Pau Monné  * Functions to allocate/free unused memory in order
1540df8b29dSRoger Pau Monné  * to map memory from other domains.
1550df8b29dSRoger Pau Monné  */
1560df8b29dSRoger Pau Monné struct resource *xenmem_alloc(device_t dev, int *res_id, size_t size);
1570df8b29dSRoger Pau Monné int xenmem_free(device_t dev, int res_id, struct resource *res);
1580df8b29dSRoger Pau Monné 
159c203fa69SRoger Pau Monné /* Debug/emergency function, prints directly to hypervisor console */
160c203fa69SRoger Pau Monné void xc_printf(const char *, ...) __printflike(1, 2);
161c203fa69SRoger Pau Monné 
16276acc41fSJustin T. Gibbs #ifndef xen_mb
16376acc41fSJustin T. Gibbs #define xen_mb() mb()
16476acc41fSJustin T. Gibbs #endif
16576acc41fSJustin T. Gibbs #ifndef xen_rmb
16676acc41fSJustin T. Gibbs #define xen_rmb() rmb()
16776acc41fSJustin T. Gibbs #endif
16876acc41fSJustin T. Gibbs #ifndef xen_wmb
16976acc41fSJustin T. Gibbs #define xen_wmb() wmb()
17076acc41fSJustin T. Gibbs #endif
17176acc41fSJustin T. Gibbs 
17276acc41fSJustin T. Gibbs #endif /* !__ASSEMBLY__ */
17376acc41fSJustin T. Gibbs 
17476acc41fSJustin T. Gibbs #endif /* _XEN_XEN_OS_H_ */
175