2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2005 Peter Grehan
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #ifndef _MACHINE_MMUVAR_H_
30 #define _MACHINE_MMUVAR_H_
32 typedef void (*pmap_bootstrap_t
)(vm_offset_t
, vm_offset_t
);
33 typedef void (*pmap_cpu_bootstrap_t
)(int);
34 typedef void (*pmap_kenter_t
)(vm_offset_t
, vm_paddr_t pa
);
35 typedef void (*pmap_kenter_attr_t
)(vm_offset_t
, vm_paddr_t
, vm_memattr_t
);
36 typedef void (*pmap_kremove_t
)(vm_offset_t
);
37 typedef void *(*pmap_mapdev_t
)(vm_paddr_t
, vm_size_t
);
38 typedef void *(*pmap_mapdev_attr_t
)(vm_paddr_t
, vm_size_t
, vm_memattr_t
);
39 typedef void (*pmap_unmapdev_t
)(void *, vm_size_t
);
40 typedef void (*pmap_page_set_memattr_t
)(vm_page_t
, vm_memattr_t
);
41 typedef int (*pmap_change_attr_t
)(vm_offset_t
, vm_size_t
, vm_memattr_t
);
42 typedef int (*pmap_map_user_ptr_t
)(pmap_t
, volatile const void *,
43 void **, size_t, size_t *);
44 typedef int (*pmap_decode_kernel_ptr_t
)(vm_offset_t
, int *, vm_offset_t
*);
45 typedef vm_paddr_t (*pmap_kextract_t
)(vm_offset_t
);
46 typedef int (*pmap_dev_direct_mapped_t
)(vm_paddr_t
, vm_size_t
);
48 typedef void (*pmap_page_array_startup_t
)(long);
49 typedef void (*pmap_advise_t
)(pmap_t
, vm_offset_t
, vm_offset_t
, int);
50 typedef void (*pmap_clear_modify_t
)(vm_page_t
);
51 typedef void (*pmap_remove_write_t
)(vm_page_t
);
52 typedef void (*pmap_copy_t
)(pmap_t
, pmap_t
, vm_offset_t
, vm_size_t
, vm_offset_t
);
53 typedef void (*pmap_copy_page_t
)(vm_page_t
, vm_page_t
);
54 typedef void (*pmap_copy_pages_t
)(vm_page_t
*, vm_offset_t
,
55 vm_page_t
*, vm_offset_t
, int);
56 typedef int (*pmap_enter_t
)(pmap_t
, vm_offset_t
, vm_page_t
, vm_prot_t
,
58 typedef void (*pmap_enter_object_t
)(pmap_t
, vm_offset_t
, vm_offset_t
,
59 vm_page_t
, vm_prot_t
);
60 typedef void (*pmap_enter_quick_t
)(pmap_t
, vm_offset_t
, vm_page_t
, vm_prot_t
);
61 typedef vm_paddr_t (*pmap_extract_t
)(pmap_t
, vm_offset_t
);
62 typedef vm_page_t (*pmap_extract_and_hold_t
)(pmap_t
, vm_offset_t
, vm_prot_t
);
63 typedef void (*pmap_growkernel_t
)(vm_offset_t
);
64 typedef void (*pmap_init_t
)(void);
65 typedef bool (*pmap_is_modified_t
)(vm_page_t
);
66 typedef bool (*pmap_is_prefaultable_t
)(pmap_t
, vm_offset_t
);
67 typedef bool (*pmap_is_referenced_t
)(vm_page_t
);
68 typedef int (*pmap_ts_referenced_t
)(vm_page_t
);
69 typedef vm_offset_t (*pmap_map_t
)(vm_offset_t
*, vm_paddr_t
, vm_paddr_t
, int);
70 typedef void (*pmap_object_init_pt_t
)(pmap_t
, vm_offset_t
, vm_object_t
,
71 vm_pindex_t
, vm_size_t
);
72 typedef bool (*pmap_page_exists_quick_t
)(pmap_t
, vm_page_t
);
73 typedef bool (*pmap_page_is_mapped_t
)(vm_page_t
);
74 typedef void (*pmap_page_init_t
)(vm_page_t
);
75 typedef int (*pmap_page_wired_mappings_t
)(vm_page_t
);
76 typedef void (*pmap_pinit0_t
)(pmap_t
);
77 typedef void (*pmap_protect_t
)(pmap_t
, vm_offset_t
, vm_offset_t
, vm_prot_t
);
78 typedef void (*pmap_qenter_t
)(vm_offset_t
, vm_page_t
*, int);
79 typedef void (*pmap_qremove_t
)(vm_offset_t
, int);
80 typedef void (*pmap_release_t
)(pmap_t
);
81 typedef void (*pmap_remove_t
)(pmap_t
, vm_offset_t
, vm_offset_t
);
82 typedef void (*pmap_remove_all_t
)(vm_page_t
);
83 typedef void (*pmap_remove_pages_t
)(pmap_t
);
84 typedef void (*pmap_unwire_t
)(pmap_t
, vm_offset_t
, vm_offset_t
);
85 typedef void (*pmap_zero_page_t
)(vm_page_t
);
86 typedef void (*pmap_zero_page_area_t
)(vm_page_t
, int, int);
87 typedef int (*pmap_mincore_t
)(pmap_t
, vm_offset_t
, vm_paddr_t
*);
88 typedef void (*pmap_activate_t
)(struct thread
*);
89 typedef void (*pmap_deactivate_t
)(struct thread
*);
90 typedef void (*pmap_align_superpage_t
)(vm_object_t
, vm_ooffset_t
,
91 vm_offset_t
*, vm_size_t
);
93 typedef void (*pmap_sync_icache_t
)(pmap_t
, vm_offset_t
, vm_size_t
);
94 typedef void (*pmap_dumpsys_map_chunk_t
)(vm_paddr_t
, size_t, void **);
95 typedef void (*pmap_dumpsys_unmap_chunk_t
)(vm_paddr_t
, size_t, void *);
96 typedef void (*pmap_dumpsys_pa_init_t
)(void);
97 typedef size_t (*pmap_dumpsys_scan_pmap_t
)(struct bitset
*dump_bitset
);
98 typedef void *(*pmap_dumpsys_dump_pmap_init_t
)(unsigned);
99 typedef void *(*pmap_dumpsys_dump_pmap_t
)(void *, void *, u_long
*);
100 typedef vm_offset_t (*pmap_quick_enter_page_t
)(vm_page_t
);
101 typedef void (*pmap_quick_remove_page_t
)(vm_offset_t
);
102 typedef bool (*pmap_ps_enabled_t
)(pmap_t
);
103 typedef void (*pmap_tlbie_all_t
)(void);
104 typedef void (*pmap_installer_t
)(void);
107 pmap_installer_t install
;
108 pmap_bootstrap_t bootstrap
;
109 pmap_cpu_bootstrap_t cpu_bootstrap
;
110 pmap_kenter_t kenter
;
111 pmap_kenter_attr_t kenter_attr
;
112 pmap_kremove_t kremove
;
113 pmap_mapdev_t mapdev
;
114 pmap_mapdev_attr_t mapdev_attr
;
115 pmap_unmapdev_t unmapdev
;
116 pmap_page_set_memattr_t page_set_memattr
;
117 pmap_change_attr_t change_attr
;
118 pmap_map_user_ptr_t map_user_ptr
;
119 pmap_decode_kernel_ptr_t decode_kernel_ptr
;
120 pmap_kextract_t kextract
;
121 pmap_dev_direct_mapped_t dev_direct_mapped
;
122 pmap_advise_t advise
;
123 pmap_clear_modify_t clear_modify
;
124 pmap_remove_write_t remove_write
;
126 pmap_copy_page_t copy_page
;
127 pmap_copy_pages_t copy_pages
;
129 pmap_enter_object_t enter_object
;
130 pmap_enter_quick_t enter_quick
;
131 pmap_extract_t extract
;
132 pmap_extract_and_hold_t extract_and_hold
;
133 pmap_growkernel_t growkernel
;
135 pmap_is_modified_t is_modified
;
136 pmap_is_prefaultable_t is_prefaultable
;
137 pmap_is_referenced_t is_referenced
;
138 pmap_ts_referenced_t ts_referenced
;
139 pmap_page_is_mapped_t page_is_mapped
;
140 pmap_ps_enabled_t ps_enabled
;
142 pmap_object_init_pt_t object_init_pt
;
143 pmap_page_exists_quick_t page_exists_quick
;
144 pmap_page_init_t page_init
;
145 pmap_page_wired_mappings_t page_wired_mappings
;
147 pmap_pinit0_t pinit0
;
148 pmap_protect_t protect
;
149 pmap_qenter_t qenter
;
150 pmap_qremove_t qremove
;
151 pmap_release_t release
;
152 pmap_remove_t remove
;
153 pmap_remove_all_t remove_all
;
154 pmap_remove_pages_t remove_pages
;
155 pmap_unwire_t unwire
;
156 pmap_zero_page_t zero_page
;
157 pmap_zero_page_area_t zero_page_area
;
158 pmap_mincore_t mincore
;
159 pmap_activate_t activate
;
160 pmap_deactivate_t deactivate
;
161 pmap_align_superpage_t align_superpage
;
162 pmap_sync_icache_t sync_icache
;
163 pmap_quick_enter_page_t quick_enter_page
;
164 pmap_quick_remove_page_t quick_remove_page
;
165 pmap_page_array_startup_t page_array_startup
;
166 pmap_dumpsys_map_chunk_t dumpsys_map_chunk
;
167 pmap_dumpsys_unmap_chunk_t dumpsys_unmap_chunk
;
168 pmap_dumpsys_pa_init_t dumpsys_pa_init
;
169 pmap_dumpsys_scan_pmap_t dumpsys_scan_pmap
;
170 pmap_dumpsys_dump_pmap_init_t dumpsys_dump_pmap_init
;
171 pmap_dumpsys_dump_pmap_t dumpsys_dump_pmap
;
172 pmap_tlbie_all_t tlbie_all
;
177 const struct mmu_kobj
*base
;
178 const struct pmap_funcs
*funcs
;
181 typedef struct mmu_kobj
*mmu_t
;
183 /* The currently installed pmap object. */
184 extern mmu_t mmu_obj
;
187 * Resolve a given pmap function.
188 * 'func' is the function name less the 'pmap_' * prefix.
190 #define PMAP_RESOLVE_FUNC(func) \
193 const struct mmu_kobj *mmu = mmu_obj; \
195 f = mmu->funcs->func; \
196 if (f != NULL) break; \
198 } while (mmu != NULL); \
201 #define MMU_DEF(name, ident, methods) \
203 const struct mmu_kobj name = { \
204 ident, NULL, &methods \
206 DATA_SET(mmu_set, name)
208 #define MMU_DEF_INHERIT(name, ident, methods, base1) \
210 const struct mmu_kobj name = { \
211 ident, &base1, &methods, \
213 DATA_SET(mmu_set, name)
218 #define MMU_TYPE_BOOKE "mmu_booke" /* Book-E MMU specification */
219 #define MMU_TYPE_OEA "mmu_oea" /* 32-bit OEA */
220 #define MMU_TYPE_G5 "mmu_g5" /* 64-bit bridge (ibm 970) */
221 #define MMU_TYPE_RADIX "mmu_radix" /* 64-bit native ISA 3.0 (POWER9) radix */
222 #define MMU_TYPE_8xx "mmu_8xx" /* 8xx quicc TLB */
224 #endif /* _MACHINE_MMUVAR_H_ */