xref: /illumos-gate/usr/src/uts/i86xpv/sys/xen_mmu.h (revision 349b53dd4e695e3d833b5380540385145b2d3ae8)
1843e1988Sjohnlev /*
2843e1988Sjohnlev  * CDDL HEADER START
3843e1988Sjohnlev  *
4843e1988Sjohnlev  * The contents of this file are subject to the terms of the
5843e1988Sjohnlev  * Common Development and Distribution License (the "License").
6843e1988Sjohnlev  * You may not use this file except in compliance with the License.
7843e1988Sjohnlev  *
8843e1988Sjohnlev  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9843e1988Sjohnlev  * or http://www.opensolaris.org/os/licensing.
10843e1988Sjohnlev  * See the License for the specific language governing permissions
11843e1988Sjohnlev  * and limitations under the License.
12843e1988Sjohnlev  *
13843e1988Sjohnlev  * When distributing Covered Code, include this CDDL HEADER in each
14843e1988Sjohnlev  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15843e1988Sjohnlev  * If applicable, add the following below this CDDL HEADER, with the
16843e1988Sjohnlev  * fields enclosed by brackets "[]" replaced with your own identifying
17843e1988Sjohnlev  * information: Portions Copyright [yyyy] [name of copyright owner]
18843e1988Sjohnlev  *
19843e1988Sjohnlev  * CDDL HEADER END
20843e1988Sjohnlev  */
21843e1988Sjohnlev /*
22*349b53ddSStuart Maybee  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23843e1988Sjohnlev  * Use is subject to license terms.
24843e1988Sjohnlev  */
25843e1988Sjohnlev 
26843e1988Sjohnlev #ifndef _SYS_XEN_MMU_H
27843e1988Sjohnlev #define	_SYS_XEN_MMU_H
28843e1988Sjohnlev 
29843e1988Sjohnlev #ifdef __cplusplus
30843e1988Sjohnlev extern "C" {
31843e1988Sjohnlev #endif
32843e1988Sjohnlev 
33843e1988Sjohnlev /*
34843e1988Sjohnlev  * Platform-dependent MMU routines and types for the hypervisor.
35843e1988Sjohnlev  *
36843e1988Sjohnlev  * WARNING: this header file is used by both dboot and i86pc, so don't go using
37843e1988Sjohnlev  * normal kernel headers.
38843e1988Sjohnlev  */
39843e1988Sjohnlev 
40843e1988Sjohnlev #if (defined(_BOOT) && defined(_BOOT_TARGET_amd64)) || \
41843e1988Sjohnlev 	(!defined(_BOOT) && defined(__amd64))
42843e1988Sjohnlev #define	__target_amd64
43843e1988Sjohnlev #endif
44843e1988Sjohnlev 
45*349b53ddSStuart Maybee typedef uint64_t maddr_t;
46*349b53ddSStuart Maybee #define	mfn_to_ma(mfn)	((maddr_t)(mfn) << MMU_PAGESHIFT)
47*349b53ddSStuart Maybee 
48*349b53ddSStuart Maybee #ifdef __xpv
49*349b53ddSStuart Maybee 
50843e1988Sjohnlev #ifdef __target_amd64
51843e1988Sjohnlev 
52843e1988Sjohnlev #define	IN_HYPERVISOR_VA(va) \
53843e1988Sjohnlev 	((va) >= HYPERVISOR_VIRT_START && (va) < HYPERVISOR_VIRT_END)
54843e1988Sjohnlev 
55*349b53ddSStuart Maybee #else /* __target_amd64 */
56843e1988Sjohnlev 
57843e1988Sjohnlev #define	IN_HYPERVISOR_VA(va) ((va) >= xen_virt_start)
58843e1988Sjohnlev 
59843e1988Sjohnlev /*
60843e1988Sjohnlev  * Do this to help catch any uses.
61843e1988Sjohnlev  */
62843e1988Sjohnlev #undef	HYPERVISOR_VIRT_START
63843e1988Sjohnlev #undef	machine_to_phys_mapping
64843e1988Sjohnlev 
65*349b53ddSStuart Maybee #endif /* __target_amd64 */
66843e1988Sjohnlev 
67843e1988Sjohnlev #undef __target_amd64
68843e1988Sjohnlev 
69843e1988Sjohnlev paddr_t ma_to_pa(maddr_t);
70843e1988Sjohnlev maddr_t pa_to_ma(paddr_t);
71*349b53ddSStuart Maybee #endif /* __xpv */
72843e1988Sjohnlev 
73843e1988Sjohnlev extern uintptr_t xen_virt_start;
74843e1988Sjohnlev extern pfn_t *mfn_to_pfn_mapping;
75843e1988Sjohnlev 
76843e1988Sjohnlev #ifndef _BOOT
77843e1988Sjohnlev 
78843e1988Sjohnlev /*
79843e1988Sjohnlev  * On the hypervisor we need:
80843e1988Sjohnlev  * - a way to map a machine address (ie, not pseudo-physical).
81843e1988Sjohnlev  * - to relocate initial hypervisor data structures into kernel VA range.
82843e1988Sjohnlev  * - a way to translate between physical addresses and machine addresses.
83843e1988Sjohnlev  * - a way to change the machine address behind a physical address.
84843e1988Sjohnlev  */
85843e1988Sjohnlev typedef ulong_t mfn_t;
86843e1988Sjohnlev extern mfn_t *mfn_list;
87843e1988Sjohnlev extern mfn_t *mfn_list_pages;
88843e1988Sjohnlev extern mfn_t *mfn_list_pages_page;
89843e1988Sjohnlev extern ulong_t mfn_count;
90843e1988Sjohnlev extern mfn_t cached_max_mfn;
91843e1988Sjohnlev 
92843e1988Sjohnlev /*
93843e1988Sjohnlev  * locks for mfn_list[] and machine_to_phys_mapping[] when migration / suspend
94843e1988Sjohnlev  * events happen
95843e1988Sjohnlev  */
96843e1988Sjohnlev extern void xen_block_migrate(void);
97843e1988Sjohnlev extern void xen_allow_migrate(void);
98843e1988Sjohnlev extern void xen_start_migrate(void);
99843e1988Sjohnlev extern void xen_end_migrate(void);
100843e1988Sjohnlev 
101843e1988Sjohnlev /*
102843e1988Sjohnlev  * Conversion between machine (hardware) addresses and pseudo-physical
103843e1988Sjohnlev  * addresses.
104843e1988Sjohnlev  */
105*349b53ddSStuart Maybee #ifdef __xpv
106843e1988Sjohnlev pfn_t mfn_to_pfn(mfn_t);
107843e1988Sjohnlev mfn_t pfn_to_mfn(pfn_t);
108*349b53ddSStuart Maybee #endif
109843e1988Sjohnlev 
110843e1988Sjohnlev struct page;
111843e1988Sjohnlev 
112843e1988Sjohnlev void xen_relocate_start_info(void);
113843e1988Sjohnlev 
114843e1988Sjohnlev /*
115843e1988Sjohnlev  * interfaces to create/destroy pfn_t values for devices or foreign memory
116843e1988Sjohnlev  *
117843e1988Sjohnlev  * xen_assign_pfn() creates (or looks up) a local pfn value to use for things
118843e1988Sjohnlev  * like a foreign domain memory mfn or a device mfn.
119843e1988Sjohnlev  *
120843e1988Sjohnlev  * xen_release_pfn() destroys the association between a pfn and foreign mfn.
121843e1988Sjohnlev  */
122843e1988Sjohnlev pfn_t xen_assign_pfn(mfn_t mfn);
123843e1988Sjohnlev void xen_release_pfn(pfn_t);
124843e1988Sjohnlev uint_t pfn_is_foreign(pfn_t);
125843e1988Sjohnlev void reassign_pfn(pfn_t pfn, mfn_t mfn);
126843e1988Sjohnlev 
127843e1988Sjohnlev #define	MFN_INVALID	(-(mfn_t)1)
128843e1988Sjohnlev 
129843e1988Sjohnlev #endif /* !_BOOT */
130843e1988Sjohnlev 
131843e1988Sjohnlev #ifdef __cplusplus
132843e1988Sjohnlev }
133843e1988Sjohnlev #endif
134843e1988Sjohnlev 
135843e1988Sjohnlev #endif	/* _SYS_XEN_MMU_H */
136