pmap_kernel.c revision 1.2.16.1 1 1.2.16.1 jruoho /* $NetBSD: pmap_kernel.c,v 1.2.16.1 2011/06/06 09:06:29 jruoho Exp $ */
2 1.2.16.1 jruoho /*-
3 1.2.16.1 jruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
4 1.2.16.1 jruoho * All rights reserved.
5 1.2.16.1 jruoho *
6 1.2.16.1 jruoho * This code is derived from software contributed to The NetBSD Foundation
7 1.2.16.1 jruoho * by Matt Thomas of 3am Software Foundry.
8 1.2.16.1 jruoho *
9 1.2.16.1 jruoho * Redistribution and use in source and binary forms, with or without
10 1.2.16.1 jruoho * modification, are permitted provided that the following conditions
11 1.2.16.1 jruoho * are met:
12 1.2.16.1 jruoho * 1. Redistributions of source code must retain the above copyright
13 1.2.16.1 jruoho * notice, this list of conditions and the following disclaimer.
14 1.2.16.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright
15 1.2.16.1 jruoho * notice, this list of conditions and the following disclaimer in the
16 1.2.16.1 jruoho * documentation and/or other materials provided with the distribution.
17 1.2.16.1 jruoho *
18 1.2.16.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19 1.2.16.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 1.2.16.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 1.2.16.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22 1.2.16.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 1.2.16.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 1.2.16.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 1.2.16.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 1.2.16.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 1.2.16.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 1.2.16.1 jruoho * POSSIBILITY OF SUCH DAMAGE.
29 1.2.16.1 jruoho */
30 1.2.16.1 jruoho
31 1.2.16.1 jruoho #include <sys/cdefs.h>
32 1.2.16.1 jruoho
33 1.2.16.1 jruoho __KERNEL_RCSID(1, "$NetBSD: pmap_kernel.c,v 1.2.16.1 2011/06/06 09:06:29 jruoho Exp $");
34 1.2.16.1 jruoho
35 1.2.16.1 jruoho #include "opt_ddb.h"
36 1.2.16.1 jruoho #include "opt_pmap.h"
37 1.2 pooka
38 1.1 pooka #include <sys/param.h>
39 1.1 pooka #include <uvm/uvm_extern.h>
40 1.2.16.1 jruoho
41 1.1 pooka extern struct pmap kernel_pmap_;
42 1.1 pooka struct pmap *const kernel_pmap_ptr = &kernel_pmap_;
43 1.2.16.1 jruoho
44 1.2.16.1 jruoho u_int
45 1.2.16.1 jruoho powerpc_mmap_flags(paddr_t pa)
46 1.2.16.1 jruoho {
47 1.2.16.1 jruoho u_int flags = PMAP_MD_NOCACHE;
48 1.2.16.1 jruoho
49 1.2.16.1 jruoho if (pa & POWERPC_MMAP_FLAG_PREFETCHABLE)
50 1.2.16.1 jruoho flags |= PMAP_MD_PREFETCHABLE;
51 1.2.16.1 jruoho if (pa & POWERPC_MMAP_FLAG_CACHEABLE)
52 1.2.16.1 jruoho flags &= ~PMAP_MD_NOCACHE;
53 1.2.16.1 jruoho return flags;
54 1.2.16.1 jruoho }
55 1.2.16.1 jruoho
56 1.2.16.1 jruoho #ifdef PMAP_NEEDS_FIXUP
57 1.2.16.1 jruoho #include <powerpc/instr.h>
58 1.2.16.1 jruoho
59 1.2.16.1 jruoho const struct pmap_ops *pmapops;
60 1.2.16.1 jruoho
61 1.2.16.1 jruoho void
62 1.2.16.1 jruoho pmap_fixup_stubs(const struct pmap_ops *ops)
63 1.2.16.1 jruoho {
64 1.2.16.1 jruoho extern uint32_t _ftext[], _etext[];
65 1.2.16.1 jruoho extern uint32_t __stub_pmap_start[], __stub_pmap_end[];
66 1.2.16.1 jruoho
67 1.2.16.1 jruoho pmapops = ops;
68 1.2.16.1 jruoho
69 1.2.16.1 jruoho powerpc_fixup_stubs(_ftext, _etext, __stub_pmap_start, __stub_pmap_end);
70 1.2.16.1 jruoho }
71 1.2.16.1 jruoho
72 1.2.16.1 jruoho #define __stub __section(".stub.pmap") __noprofile
73 1.2.16.1 jruoho
74 1.2.16.1 jruoho int pmap_pte_spill(struct pmap *, vaddr_t, bool) __stub;
75 1.2.16.1 jruoho void pmap_real_memory(paddr_t *, psize_t *) __stub;
76 1.2.16.1 jruoho void pmap_init(void) __stub;
77 1.2.16.1 jruoho void pmap_virtual_space(vaddr_t *, vaddr_t *) __stub;
78 1.2.16.1 jruoho pmap_t pmap_create(void) __stub;
79 1.2.16.1 jruoho void pmap_reference(pmap_t) __stub;
80 1.2.16.1 jruoho void pmap_destroy(pmap_t) __stub;
81 1.2.16.1 jruoho void pmap_copy(pmap_t, pmap_t, vaddr_t, vsize_t, vaddr_t) __stub;
82 1.2.16.1 jruoho void pmap_update(pmap_t) __stub;
83 1.2.16.1 jruoho int pmap_enter(pmap_t, vaddr_t, paddr_t, vm_prot_t, u_int) __stub;
84 1.2.16.1 jruoho void pmap_remove(pmap_t, vaddr_t, vaddr_t) __stub;
85 1.2.16.1 jruoho void pmap_kenter_pa(vaddr_t, paddr_t, vm_prot_t, u_int) __stub;
86 1.2.16.1 jruoho void pmap_kremove(vaddr_t, vsize_t) __stub;
87 1.2.16.1 jruoho bool pmap_extract(pmap_t, vaddr_t, paddr_t *) __stub;
88 1.2.16.1 jruoho
89 1.2.16.1 jruoho void pmap_protect(pmap_t, vaddr_t, vaddr_t, vm_prot_t) __stub;
90 1.2.16.1 jruoho void pmap_unwire(pmap_t, vaddr_t) __stub;
91 1.2.16.1 jruoho void pmap_page_protect(struct vm_page *, vm_prot_t) __stub;
92 1.2.16.1 jruoho bool pmap_query_bit(struct vm_page *, int) __stub;
93 1.2.16.1 jruoho bool pmap_clear_bit(struct vm_page *, int) __stub;
94 1.2.16.1 jruoho
95 1.2.16.1 jruoho void pmap_activate(struct lwp *) __stub;
96 1.2.16.1 jruoho void pmap_deactivate(struct lwp *) __stub;
97 1.2.16.1 jruoho
98 1.2.16.1 jruoho void pmap_pinit(pmap_t) __stub;
99 1.2.16.1 jruoho void pmap_procwr(struct proc *, vaddr_t, size_t) __stub;
100 1.2.16.1 jruoho
101 1.2.16.1 jruoho #if defined(DEBUG) || defined(PMAPCHECK) || defined(DDB)
102 1.2.16.1 jruoho void pmap_pte_print(volatile struct pte *) __stub;
103 1.2.16.1 jruoho void pmap_pteg_check(void) __stub;
104 1.2.16.1 jruoho void pmap_print_mmuregs(void) __stub;
105 1.2.16.1 jruoho void pmap_print_pte(pmap_t, vaddr_t) __stub;
106 1.2.16.1 jruoho void pmap_pteg_dist(void) __stub;
107 1.2.16.1 jruoho #endif
108 1.2.16.1 jruoho #if defined(DEBUG) || defined(PMAPCHECK)
109 1.2.16.1 jruoho void pmap_pvo_verify(void) __stub;
110 1.2.16.1 jruoho #endif
111 1.2.16.1 jruoho vaddr_t pmap_steal_memory(vsize_t, vaddr_t *, vaddr_t *) __stub;
112 1.2.16.1 jruoho void pmap_bootstrap(paddr_t, paddr_t) __stub;
113 1.2.16.1 jruoho
114 1.2.16.1 jruoho int
115 1.2.16.1 jruoho pmap_pte_spill(struct pmap *pm, vaddr_t va, bool exec)
116 1.2.16.1 jruoho {
117 1.2.16.1 jruoho return (*pmapops->pmapop_pte_spill)(pm, va, exec);
118 1.2.16.1 jruoho }
119 1.2.16.1 jruoho
120 1.2.16.1 jruoho void
121 1.2.16.1 jruoho pmap_real_memory(paddr_t *start, psize_t *size)
122 1.2.16.1 jruoho {
123 1.2.16.1 jruoho (*pmapops->pmapop_real_memory)(start, size);
124 1.2.16.1 jruoho }
125 1.2.16.1 jruoho
126 1.2.16.1 jruoho void
127 1.2.16.1 jruoho pmap_init(void)
128 1.2.16.1 jruoho {
129 1.2.16.1 jruoho (*pmapops->pmapop_init)();
130 1.2.16.1 jruoho }
131 1.2.16.1 jruoho
132 1.2.16.1 jruoho void
133 1.2.16.1 jruoho pmap_virtual_space(vaddr_t *startp, vaddr_t *endp)
134 1.2.16.1 jruoho {
135 1.2.16.1 jruoho (*pmapops->pmapop_virtual_space)(startp, endp);
136 1.2.16.1 jruoho }
137 1.2.16.1 jruoho
138 1.2.16.1 jruoho pmap_t
139 1.2.16.1 jruoho pmap_create(void)
140 1.2.16.1 jruoho {
141 1.2.16.1 jruoho return (*pmapops->pmapop_create)();
142 1.2.16.1 jruoho }
143 1.2.16.1 jruoho
144 1.2.16.1 jruoho void
145 1.2.16.1 jruoho pmap_reference(pmap_t pm)
146 1.2.16.1 jruoho {
147 1.2.16.1 jruoho (*pmapops->pmapop_reference)(pm);
148 1.2.16.1 jruoho }
149 1.2.16.1 jruoho
150 1.2.16.1 jruoho void
151 1.2.16.1 jruoho pmap_destroy(pmap_t pm)
152 1.2.16.1 jruoho {
153 1.2.16.1 jruoho (*pmapops->pmapop_destroy)(pm);
154 1.2.16.1 jruoho }
155 1.2.16.1 jruoho
156 1.2.16.1 jruoho void
157 1.2.16.1 jruoho pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_va, vsize_t len,
158 1.2.16.1 jruoho vaddr_t src_va)
159 1.2.16.1 jruoho {
160 1.2.16.1 jruoho (*pmapops->pmapop_copy)(dst_pmap, src_pmap, dst_va, len, src_va);
161 1.2.16.1 jruoho }
162 1.2.16.1 jruoho
163 1.2.16.1 jruoho void
164 1.2.16.1 jruoho pmap_update(pmap_t pm)
165 1.2.16.1 jruoho {
166 1.2.16.1 jruoho (*pmapops->pmapop_update)(pm);
167 1.2.16.1 jruoho }
168 1.2.16.1 jruoho
169 1.2.16.1 jruoho int
170 1.2.16.1 jruoho pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
171 1.2.16.1 jruoho {
172 1.2.16.1 jruoho return (*pmapops->pmapop_enter)(pm, va, pa, prot, flags);
173 1.2.16.1 jruoho }
174 1.2.16.1 jruoho
175 1.2.16.1 jruoho void
176 1.2.16.1 jruoho pmap_remove(pmap_t pm, vaddr_t start, vaddr_t end)
177 1.2.16.1 jruoho {
178 1.2.16.1 jruoho (*pmapops->pmapop_remove)(pm, start, end);
179 1.2.16.1 jruoho }
180 1.2.16.1 jruoho
181 1.2.16.1 jruoho void
182 1.2.16.1 jruoho pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
183 1.2.16.1 jruoho {
184 1.2.16.1 jruoho (*pmapops->pmapop_kenter_pa)(va, pa, prot, flags);
185 1.2.16.1 jruoho }
186 1.2.16.1 jruoho
187 1.2.16.1 jruoho void
188 1.2.16.1 jruoho pmap_kremove(vaddr_t start, vsize_t end)
189 1.2.16.1 jruoho {
190 1.2.16.1 jruoho (*pmapops->pmapop_kremove)(start, end);
191 1.2.16.1 jruoho }
192 1.2.16.1 jruoho
193 1.2.16.1 jruoho bool
194 1.2.16.1 jruoho pmap_extract(pmap_t pm, vaddr_t va, paddr_t *pap)
195 1.2.16.1 jruoho {
196 1.2.16.1 jruoho return (*pmapops->pmapop_extract)(pm, va, pap);
197 1.2.16.1 jruoho }
198 1.2.16.1 jruoho
199 1.2.16.1 jruoho void
200 1.2.16.1 jruoho pmap_protect(pmap_t pm, vaddr_t start, vaddr_t end, vm_prot_t prot)
201 1.2.16.1 jruoho {
202 1.2.16.1 jruoho (*pmapops->pmapop_protect)(pm, start, end, prot);
203 1.2.16.1 jruoho }
204 1.2.16.1 jruoho
205 1.2.16.1 jruoho void
206 1.2.16.1 jruoho pmap_unwire(pmap_t pm, vaddr_t va)
207 1.2.16.1 jruoho {
208 1.2.16.1 jruoho (*pmapops->pmapop_unwire)(pm, va);
209 1.2.16.1 jruoho }
210 1.2.16.1 jruoho
211 1.2.16.1 jruoho void
212 1.2.16.1 jruoho pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
213 1.2.16.1 jruoho {
214 1.2.16.1 jruoho (*pmapops->pmapop_page_protect)(pg, prot);
215 1.2.16.1 jruoho }
216 1.2.16.1 jruoho
217 1.2.16.1 jruoho bool
218 1.2.16.1 jruoho pmap_query_bit(struct vm_page *pg, int ptebit)
219 1.2.16.1 jruoho {
220 1.2.16.1 jruoho return (*pmapops->pmapop_query_bit)(pg, ptebit);
221 1.2.16.1 jruoho }
222 1.2.16.1 jruoho
223 1.2.16.1 jruoho bool
224 1.2.16.1 jruoho pmap_clear_bit(struct vm_page *pg, int ptebit)
225 1.2.16.1 jruoho {
226 1.2.16.1 jruoho return (*pmapops->pmapop_clear_bit)(pg, ptebit);
227 1.2.16.1 jruoho }
228 1.2.16.1 jruoho
229 1.2.16.1 jruoho void
230 1.2.16.1 jruoho pmap_activate(struct lwp *l)
231 1.2.16.1 jruoho {
232 1.2.16.1 jruoho (*pmapops->pmapop_activate)(l);
233 1.2.16.1 jruoho }
234 1.2.16.1 jruoho
235 1.2.16.1 jruoho void
236 1.2.16.1 jruoho pmap_deactivate(struct lwp *l)
237 1.2.16.1 jruoho {
238 1.2.16.1 jruoho (*pmapops->pmapop_deactivate)(l);
239 1.2.16.1 jruoho }
240 1.2.16.1 jruoho
241 1.2.16.1 jruoho void
242 1.2.16.1 jruoho pmap_pinit(pmap_t pm)
243 1.2.16.1 jruoho {
244 1.2.16.1 jruoho (*pmapops->pmapop_pinit)(pm);
245 1.2.16.1 jruoho }
246 1.2.16.1 jruoho
247 1.2.16.1 jruoho void
248 1.2.16.1 jruoho pmap_procwr(struct proc *p, vaddr_t va, size_t len)
249 1.2.16.1 jruoho {
250 1.2.16.1 jruoho (*pmapops->pmapop_procwr)(p, va, len);
251 1.2.16.1 jruoho }
252 1.2.16.1 jruoho
253 1.2.16.1 jruoho #if defined(DEBUG) || defined(PMAPCHECK) || defined(DDB)
254 1.2.16.1 jruoho void
255 1.2.16.1 jruoho pmap_pte_print(volatile struct pte *ptep)
256 1.2.16.1 jruoho {
257 1.2.16.1 jruoho (*pmapops->pmapop_pte_print)(ptep);
258 1.2.16.1 jruoho }
259 1.2.16.1 jruoho
260 1.2.16.1 jruoho void
261 1.2.16.1 jruoho pmap_pteg_check(void)
262 1.2.16.1 jruoho {
263 1.2.16.1 jruoho (*pmapops->pmapop_pteg_check)();
264 1.2.16.1 jruoho }
265 1.2.16.1 jruoho
266 1.2.16.1 jruoho void
267 1.2.16.1 jruoho pmap_print_mmuregs(void)
268 1.2.16.1 jruoho {
269 1.2.16.1 jruoho (*pmapops->pmapop_print_mmuregs)();
270 1.2.16.1 jruoho }
271 1.2.16.1 jruoho
272 1.2.16.1 jruoho void
273 1.2.16.1 jruoho pmap_print_pte(pmap_t pm, vaddr_t va)
274 1.2.16.1 jruoho {
275 1.2.16.1 jruoho (*pmapops->pmapop_print_pte)(pm, va);
276 1.2.16.1 jruoho }
277 1.2.16.1 jruoho
278 1.2.16.1 jruoho void
279 1.2.16.1 jruoho pmap_pteg_dist(void)
280 1.2.16.1 jruoho {
281 1.2.16.1 jruoho (*pmapops->pmapop_pteg_dist)();
282 1.2.16.1 jruoho }
283 1.2.16.1 jruoho #endif
284 1.2.16.1 jruoho
285 1.2.16.1 jruoho #if defined(DEBUG) || defined(PMAPCHECK)
286 1.2.16.1 jruoho void
287 1.2.16.1 jruoho pmap_pvo_verify(void)
288 1.2.16.1 jruoho {
289 1.2.16.1 jruoho (*pmapops->pmapop_pvo_verify)();
290 1.2.16.1 jruoho }
291 1.2.16.1 jruoho #endif
292 1.2.16.1 jruoho
293 1.2.16.1 jruoho vaddr_t
294 1.2.16.1 jruoho pmap_steal_memory(vsize_t vsize, vaddr_t *vstartp, vaddr_t *vendp)
295 1.2.16.1 jruoho {
296 1.2.16.1 jruoho return (*pmapops->pmapop_steal_memory)(vsize, vstartp, vendp);
297 1.2.16.1 jruoho }
298 1.2.16.1 jruoho
299 1.2.16.1 jruoho void
300 1.2.16.1 jruoho pmap_bootstrap(paddr_t startkernel, paddr_t endkernel)
301 1.2.16.1 jruoho {
302 1.2.16.1 jruoho (*pmapops->pmapop_bootstrap)(startkernel, endkernel);
303 1.2.16.1 jruoho }
304 1.2.16.1 jruoho #endif
305