Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/powerpc/include/mmuvar.h
39536 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2005 Peter Grehan
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
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.
15
*
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
26
* SUCH DAMAGE.
27
*/
28
29
#ifndef _MACHINE_MMUVAR_H_
30
#define _MACHINE_MMUVAR_H_
31
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);
47
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,
57
u_int, int8_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 int (*pmap_growkernel_nopanic_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);
92
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);
105
106
struct pmap_funcs {
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;
125
pmap_copy_t copy;
126
pmap_copy_page_t copy_page;
127
pmap_copy_pages_t copy_pages;
128
pmap_enter_t enter;
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_nopanic_t growkernel_nopanic;
134
pmap_init_t init;
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;
141
pmap_map_t map;
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;
146
pmap_pinit_t pinit;
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;
173
174
};
175
struct mmu_kobj {
176
const char *name;
177
const struct mmu_kobj *base;
178
const struct pmap_funcs *funcs;
179
};
180
181
typedef struct mmu_kobj *mmu_t;
182
183
/* The currently installed pmap object. */
184
extern mmu_t mmu_obj;
185
186
/*
187
* Resolve a given pmap function.
188
* 'func' is the function name less the 'pmap_' * prefix.
189
*/
190
#define PMAP_RESOLVE_FUNC(func) \
191
({ \
192
pmap_##func##_t f; \
193
const struct mmu_kobj *mmu = mmu_obj; \
194
do { \
195
f = mmu->funcs->func; \
196
if (f != NULL) break; \
197
mmu = mmu->base; \
198
} while (mmu != NULL); \
199
f;})
200
201
#define MMU_DEF(name, ident, methods) \
202
\
203
const struct mmu_kobj name = { \
204
ident, NULL, &methods \
205
}; \
206
DATA_SET(mmu_set, name)
207
208
#define MMU_DEF_INHERIT(name, ident, methods, base1) \
209
\
210
const struct mmu_kobj name = { \
211
ident, &base1, &methods, \
212
}; \
213
DATA_SET(mmu_set, name)
214
215
/*
216
* Known MMU names
217
*/
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 */
223
224
#endif /* _MACHINE_MMUVAR_H_ */
225
226