1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
3 *
4 * Copyright (c) 1991 Regents of the University of California.
5 * All rights reserved.
6 * Copyright (c) 1994 John S. Dyson
7 * All rights reserved.
8 * Copyright (c) 1994 David Greenman
9 * All rights reserved.
10 * Copyright (c) 2003 Peter Wemm
11 * All rights reserved.
12 * Copyright (c) 2005-2010 Alan L. Cox <[email protected]>
13 * All rights reserved.
14 * Copyright (c) 2014 Andrew Turner
15 * All rights reserved.
16 * Copyright (c) 2014 The FreeBSD Foundation
17 * All rights reserved.
18 * Copyright (c) 2015-2018 Ruslan Bukin <[email protected]>
19 * All rights reserved.
20 *
21 * This code is derived from software contributed to Berkeley by
22 * the Systems Programming Group of the University of Utah Computer
23 * Science Department and William Jolitz of UUNET Technologies Inc.
24 *
25 * Portions of this software were developed by Andrew Turner under
26 * sponsorship from The FreeBSD Foundation.
27 *
28 * Portions of this software were developed by SRI International and the
29 * University of Cambridge Computer Laboratory under DARPA/AFRL contract
30 * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
31 *
32 * Portions of this software were developed by the University of Cambridge
33 * Computer Laboratory as part of the CTSRD Project, with support from the
34 * UK Higher Education Innovation Fund (HEIF).
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 * must display the following acknowledgement:
46 * This product includes software developed by the University of
47 * California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
65 */
66 /*-
67 * Copyright (c) 2003 Networks Associates Technology, Inc.
68 * All rights reserved.
69 *
70 * This software was developed for the FreeBSD Project by Jake Burkholder,
71 * Safeport Network Services, and Network Associates Laboratories, the
72 * Security Research Division of Network Associates, Inc. under
73 * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
74 * CHATS research program.
75 *
76 * Redistribution and use in source and binary forms, with or without
77 * modification, are permitted provided that the following conditions
78 * are met:
79 * 1. Redistributions of source code must retain the above copyright
80 * notice, this list of conditions and the following disclaimer.
81 * 2. Redistributions in binary form must reproduce the above copyright
82 * notice, this list of conditions and the following disclaimer in the
83 * documentation and/or other materials provided with the distribution.
84 *
85 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
86 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
87 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
88 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
89 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
90 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
91 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
92 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
93 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
94 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
95 * SUCH DAMAGE.
96 */
97
98 #include <sys/cdefs.h>
99 /*
100 * Manages physical address maps.
101 *
102 * Since the information managed by this module is
103 * also stored by the logical address mapping module,
104 * this module may throw away valid virtual-to-physical
105 * mappings at almost any time. However, invalidations
106 * of virtual-to-physical mappings must be done as
107 * requested.
108 *
109 * In order to cope with hardware architectures which
110 * make virtual-to-physical map invalidates expensive,
111 * this module may delay invalidate or reduced protection
112 * operations until such time as they are actually
113 * necessary. This module is given full information as
114 * to which processors are currently using which maps,
115 * and to when physical maps must be made correct.
116 */
117
118 #include <sys/param.h>
119 #include <sys/systm.h>
120 #include <sys/bitstring.h>
121 #include <sys/bus.h>
122 #include <sys/cpuset.h>
123 #include <sys/kernel.h>
124 #include <sys/ktr.h>
125 #include <sys/lock.h>
126 #include <sys/malloc.h>
127 #include <sys/mman.h>
128 #include <sys/msgbuf.h>
129 #include <sys/mutex.h>
130 #include <sys/physmem.h>
131 #include <sys/proc.h>
132 #include <sys/rwlock.h>
133 #include <sys/sbuf.h>
134 #include <sys/sx.h>
135 #include <sys/vmem.h>
136 #include <sys/vmmeter.h>
137 #include <sys/sched.h>
138 #include <sys/sysctl.h>
139 #include <sys/smp.h>
140
141 #include <vm/vm.h>
142 #include <vm/vm_param.h>
143 #include <vm/vm_kern.h>
144 #include <vm/vm_page.h>
145 #include <vm/vm_map.h>
146 #include <vm/vm_object.h>
147 #include <vm/vm_extern.h>
148 #include <vm/vm_pageout.h>
149 #include <vm/vm_pager.h>
150 #include <vm/vm_phys.h>
151 #include <vm/vm_radix.h>
152 #include <vm/vm_reserv.h>
153 #include <vm/vm_dumpset.h>
154 #include <vm/uma.h>
155
156 #include <machine/machdep.h>
157 #include <machine/md_var.h>
158 #include <machine/pcb.h>
159 #include <machine/sbi.h>
160
161 /*
162 * Boundary values for the page table page index space:
163 *
164 * L3 pages: [0, NUL2E)
165 * L2 pages: [NUL2E, NUL2E + NUL1E)
166 * L1 pages: [NUL2E + NUL1E, NUL2E + NUL1E + NUL0E)
167 *
168 * Note that these ranges are used in both SV39 and SV48 mode. In SV39 mode the
169 * ranges are not fully populated since there are at most Ln_ENTRIES^2 L3 pages
170 * in a set of page tables.
171 */
172 #define NUL0E Ln_ENTRIES
173 #define NUL1E (Ln_ENTRIES * NUL0E)
174 #define NUL2E (Ln_ENTRIES * NUL1E)
175
176 #ifdef PV_STATS
177 #define PV_STAT(x) do { x ; } while (0)
178 #define __pv_stat_used
179 #else
180 #define PV_STAT(x) do { } while (0)
181 #define __pv_stat_used __unused
182 #endif
183
184 #define pmap_l1_pindex(v) (NUL2E + ((v) >> L1_SHIFT))
185 #define pmap_l2_pindex(v) ((v) >> L2_SHIFT)
186 #define pa_to_pvh(pa) (&pv_table[pa_index(pa)])
187
188 #define NPV_LIST_LOCKS MAXCPU
189
190 #define PHYS_TO_PV_LIST_LOCK(pa) \
191 (&pv_list_locks[pmap_l2_pindex(pa) % NPV_LIST_LOCKS])
192
193 #define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa) do { \
194 struct rwlock **_lockp = (lockp); \
195 struct rwlock *_new_lock; \
196 \
197 _new_lock = PHYS_TO_PV_LIST_LOCK(pa); \
198 if (_new_lock != *_lockp) { \
199 if (*_lockp != NULL) \
200 rw_wunlock(*_lockp); \
201 *_lockp = _new_lock; \
202 rw_wlock(*_lockp); \
203 } \
204 } while (0)
205
206 #define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m) \
207 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
208
209 #define RELEASE_PV_LIST_LOCK(lockp) do { \
210 struct rwlock **_lockp = (lockp); \
211 \
212 if (*_lockp != NULL) { \
213 rw_wunlock(*_lockp); \
214 *_lockp = NULL; \
215 } \
216 } while (0)
217
218 #define VM_PAGE_TO_PV_LIST_LOCK(m) \
219 PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
220
221 static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
222 "VM/pmap parameters");
223
224 /* The list of all the user pmaps */
225 LIST_HEAD(pmaplist, pmap);
226 static struct pmaplist allpmaps = LIST_HEAD_INITIALIZER();
227
228 enum pmap_mode __read_frequently pmap_mode = PMAP_MODE_SV39;
229 SYSCTL_INT(_vm_pmap, OID_AUTO, mode, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
230 &pmap_mode, 0,
231 "translation mode, 0 = SV39, 1 = SV48");
232
233 struct pmap kernel_pmap_store;
234
235 vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */
236 vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */
237 vm_offset_t kernel_vm_end = 0;
238
239 vm_paddr_t dmap_phys_base; /* The start of the dmap region */
240 vm_paddr_t dmap_phys_max; /* The limit of the dmap region */
241 vm_offset_t dmap_max_addr; /* The virtual address limit of the dmap */
242
243 /* This code assumes all L1 DMAP entries will be used */
244 CTASSERT((DMAP_MIN_ADDRESS & ~L1_OFFSET) == DMAP_MIN_ADDRESS);
245 CTASSERT((DMAP_MAX_ADDRESS & ~L1_OFFSET) == DMAP_MAX_ADDRESS);
246
247 /*
248 * This code assumes that the early DEVMAP is L2_SIZE aligned and is fully
249 * contained within a single L2 entry. The early DTB is mapped immediately
250 * before the devmap L2 entry.
251 */
252 CTASSERT((PMAP_MAPDEV_EARLY_SIZE & L2_OFFSET) == 0);
253 CTASSERT((VM_EARLY_DTB_ADDRESS & L2_OFFSET) == 0);
254 CTASSERT(VM_EARLY_DTB_ADDRESS < (VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE));
255
256 static struct rwlock_padalign pvh_global_lock;
257 static struct mtx_padalign allpmaps_lock;
258
259 static int __read_frequently superpages_enabled = 1;
260 SYSCTL_INT(_vm_pmap, OID_AUTO, superpages_enabled,
261 CTLFLAG_RDTUN, &superpages_enabled, 0,
262 "Enable support for transparent superpages");
263
264 static SYSCTL_NODE(_vm_pmap, OID_AUTO, l2, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
265 "2MB page mapping counters");
266
267 static u_long pmap_l2_demotions;
268 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, demotions, CTLFLAG_RD,
269 &pmap_l2_demotions, 0,
270 "2MB page demotions");
271
272 static u_long pmap_l2_mappings;
273 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, mappings, CTLFLAG_RD,
274 &pmap_l2_mappings, 0,
275 "2MB page mappings");
276
277 static u_long pmap_l2_p_failures;
278 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, p_failures, CTLFLAG_RD,
279 &pmap_l2_p_failures, 0,
280 "2MB page promotion failures");
281
282 static u_long pmap_l2_promotions;
283 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, promotions, CTLFLAG_RD,
284 &pmap_l2_promotions, 0,
285 "2MB page promotions");
286
287 /*
288 * Data for the pv entry allocation mechanism
289 */
290 static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
291 static struct mtx pv_chunks_mutex;
292 static struct rwlock pv_list_locks[NPV_LIST_LOCKS];
293 static struct md_page *pv_table;
294 static struct md_page pv_dummy;
295
296 extern cpuset_t all_harts;
297
298 /*
299 * Internal flags for pmap_enter()'s helper functions.
300 */
301 #define PMAP_ENTER_NORECLAIM 0x1000000 /* Don't reclaim PV entries. */
302 #define PMAP_ENTER_NOREPLACE 0x2000000 /* Don't replace mappings. */
303
304 static void free_pv_chunk(struct pv_chunk *pc);
305 static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
306 static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp);
307 static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp);
308 static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
309 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
310 vm_offset_t va);
311 static bool pmap_demote_l2(pmap_t pmap, pd_entry_t *l2, vm_offset_t va);
312 static bool pmap_demote_l2_locked(pmap_t pmap, pd_entry_t *l2,
313 vm_offset_t va, struct rwlock **lockp);
314 static int pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2,
315 u_int flags, vm_page_t m, struct rwlock **lockp);
316 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
317 vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp);
318 static int pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t sva,
319 pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp);
320 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
321 vm_page_t m, struct rwlock **lockp);
322
323 static vm_page_t _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex,
324 struct rwlock **lockp);
325
326 static void _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m,
327 struct spglist *free);
328 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t, struct spglist *);
329
330 static int pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode);
331
332 #define pmap_clear(pte) pmap_store(pte, 0)
333 #define pmap_clear_bits(pte, bits) atomic_clear_64(pte, bits)
334 #define pmap_load_store(pte, entry) atomic_swap_64(pte, entry)
335 #define pmap_load_clear(pte) pmap_load_store(pte, 0)
336 #define pmap_load(pte) atomic_load_64(pte)
337 #define pmap_store(pte, entry) atomic_store_64(pte, entry)
338 #define pmap_store_bits(pte, bits) atomic_set_64(pte, bits)
339
340 /********************/
341 /* Inline functions */
342 /********************/
343
344 static __inline void
pagecopy(void * s,void * d)345 pagecopy(void *s, void *d)
346 {
347
348 memcpy(d, s, PAGE_SIZE);
349 }
350
351 static __inline void
pagezero(void * p)352 pagezero(void *p)
353 {
354
355 bzero(p, PAGE_SIZE);
356 }
357
358 #define pmap_l0_index(va) (((va) >> L0_SHIFT) & Ln_ADDR_MASK)
359 #define pmap_l1_index(va) (((va) >> L1_SHIFT) & Ln_ADDR_MASK)
360 #define pmap_l2_index(va) (((va) >> L2_SHIFT) & Ln_ADDR_MASK)
361 #define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK)
362
363 #define PTE_TO_PHYS(pte) \
364 ((((pte) & ~PTE_HI_MASK) >> PTE_PPN0_S) * PAGE_SIZE)
365 #define L2PTE_TO_PHYS(l2) \
366 ((((l2) & ~PTE_HI_MASK) >> PTE_PPN1_S) << L2_SHIFT)
367
368 static __inline pd_entry_t *
pmap_l0(pmap_t pmap,vm_offset_t va)369 pmap_l0(pmap_t pmap, vm_offset_t va)
370 {
371 KASSERT(pmap_mode != PMAP_MODE_SV39, ("%s: in SV39 mode", __func__));
372 KASSERT(VIRT_IS_VALID(va),
373 ("%s: malformed virtual address %#lx", __func__, va));
374 return (&pmap->pm_top[pmap_l0_index(va)]);
375 }
376
377 static __inline pd_entry_t *
pmap_l0_to_l1(pd_entry_t * l0,vm_offset_t va)378 pmap_l0_to_l1(pd_entry_t *l0, vm_offset_t va)
379 {
380 vm_paddr_t phys;
381 pd_entry_t *l1;
382
383 KASSERT(pmap_mode != PMAP_MODE_SV39, ("%s: in SV39 mode", __func__));
384 phys = PTE_TO_PHYS(pmap_load(l0));
385 l1 = (pd_entry_t *)PHYS_TO_DMAP(phys);
386
387 return (&l1[pmap_l1_index(va)]);
388 }
389
390 static __inline pd_entry_t *
pmap_l1(pmap_t pmap,vm_offset_t va)391 pmap_l1(pmap_t pmap, vm_offset_t va)
392 {
393 pd_entry_t *l0;
394
395 KASSERT(VIRT_IS_VALID(va),
396 ("%s: malformed virtual address %#lx", __func__, va));
397 if (pmap_mode == PMAP_MODE_SV39) {
398 return (&pmap->pm_top[pmap_l1_index(va)]);
399 } else {
400 l0 = pmap_l0(pmap, va);
401 if ((pmap_load(l0) & PTE_V) == 0)
402 return (NULL);
403 if ((pmap_load(l0) & PTE_RX) != 0)
404 return (NULL);
405 return (pmap_l0_to_l1(l0, va));
406 }
407 }
408
409 static __inline pd_entry_t *
pmap_l1_to_l2(pd_entry_t * l1,vm_offset_t va)410 pmap_l1_to_l2(pd_entry_t *l1, vm_offset_t va)
411 {
412 vm_paddr_t phys;
413 pd_entry_t *l2;
414
415 phys = PTE_TO_PHYS(pmap_load(l1));
416 l2 = (pd_entry_t *)PHYS_TO_DMAP(phys);
417
418 return (&l2[pmap_l2_index(va)]);
419 }
420
421 static __inline pd_entry_t *
pmap_l2(pmap_t pmap,vm_offset_t va)422 pmap_l2(pmap_t pmap, vm_offset_t va)
423 {
424 pd_entry_t *l1;
425
426 l1 = pmap_l1(pmap, va);
427 if (l1 == NULL)
428 return (NULL);
429 if ((pmap_load(l1) & PTE_V) == 0)
430 return (NULL);
431 if ((pmap_load(l1) & PTE_RX) != 0)
432 return (NULL);
433
434 return (pmap_l1_to_l2(l1, va));
435 }
436
437 static __inline pt_entry_t *
pmap_l2_to_l3(pd_entry_t * l2,vm_offset_t va)438 pmap_l2_to_l3(pd_entry_t *l2, vm_offset_t va)
439 {
440 vm_paddr_t phys;
441 pt_entry_t *l3;
442
443 phys = PTE_TO_PHYS(pmap_load(l2));
444 l3 = (pd_entry_t *)PHYS_TO_DMAP(phys);
445
446 return (&l3[pmap_l3_index(va)]);
447 }
448
449 static __inline pt_entry_t *
pmap_l3(pmap_t pmap,vm_offset_t va)450 pmap_l3(pmap_t pmap, vm_offset_t va)
451 {
452 pd_entry_t *l2;
453
454 l2 = pmap_l2(pmap, va);
455 if (l2 == NULL)
456 return (NULL);
457 if ((pmap_load(l2) & PTE_V) == 0)
458 return (NULL);
459 if ((pmap_load(l2) & PTE_RX) != 0)
460 return (NULL);
461
462 return (pmap_l2_to_l3(l2, va));
463 }
464
465 static __inline void
pmap_resident_count_inc(pmap_t pmap,int count)466 pmap_resident_count_inc(pmap_t pmap, int count)
467 {
468
469 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
470 pmap->pm_stats.resident_count += count;
471 }
472
473 static __inline void
pmap_resident_count_dec(pmap_t pmap,int count)474 pmap_resident_count_dec(pmap_t pmap, int count)
475 {
476
477 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
478 KASSERT(pmap->pm_stats.resident_count >= count,
479 ("pmap %p resident count underflow %ld %d", pmap,
480 pmap->pm_stats.resident_count, count));
481 pmap->pm_stats.resident_count -= count;
482 }
483
484 static void
pmap_distribute_l1(struct pmap * pmap,vm_pindex_t l1index,pt_entry_t entry)485 pmap_distribute_l1(struct pmap *pmap, vm_pindex_t l1index,
486 pt_entry_t entry)
487 {
488 struct pmap *user_pmap;
489 pd_entry_t *l1;
490
491 /*
492 * Distribute new kernel L1 entry to all the user pmaps. This is only
493 * necessary with three-level paging configured: with four-level paging
494 * the kernel's half of the top-level page table page is static and can
495 * simply be copied at pmap initialization time.
496 */
497 if (pmap != kernel_pmap || pmap_mode != PMAP_MODE_SV39)
498 return;
499
500 mtx_lock(&allpmaps_lock);
501 LIST_FOREACH(user_pmap, &allpmaps, pm_list) {
502 l1 = &user_pmap->pm_top[l1index];
503 pmap_store(l1, entry);
504 }
505 mtx_unlock(&allpmaps_lock);
506 }
507
508 static pt_entry_t *
pmap_early_page_idx(vm_offset_t l1pt,vm_offset_t va,u_int * l1_slot,u_int * l2_slot)509 pmap_early_page_idx(vm_offset_t l1pt, vm_offset_t va, u_int *l1_slot,
510 u_int *l2_slot)
511 {
512 pt_entry_t *l2;
513 pd_entry_t *l1 __diagused;
514
515 l1 = (pd_entry_t *)l1pt;
516 *l1_slot = (va >> L1_SHIFT) & Ln_ADDR_MASK;
517
518 /* Check locore has used a table L1 map */
519 KASSERT((l1[*l1_slot] & PTE_RX) == 0,
520 ("Invalid bootstrap L1 table"));
521
522 /* Find the address of the L2 table */
523 l2 = (pt_entry_t *)init_pt_va;
524 *l2_slot = pmap_l2_index(va);
525
526 return (l2);
527 }
528
529 static vm_paddr_t
pmap_early_vtophys(vm_offset_t l1pt,vm_offset_t va)530 pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
531 {
532 u_int l1_slot, l2_slot;
533 pt_entry_t *l2;
534 vm_paddr_t ret;
535
536 l2 = pmap_early_page_idx(l1pt, va, &l1_slot, &l2_slot);
537
538 /* Check locore has used L2 superpages */
539 KASSERT((l2[l2_slot] & PTE_RX) != 0,
540 ("Invalid bootstrap L2 table"));
541
542 /* L2 is superpages */
543 ret = L2PTE_TO_PHYS(l2[l2_slot]);
544 ret += (va & L2_OFFSET);
545
546 return (ret);
547 }
548
549 static void
pmap_bootstrap_dmap(vm_offset_t kern_l1,vm_paddr_t min_pa,vm_paddr_t max_pa)550 pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, vm_paddr_t max_pa)
551 {
552 vm_offset_t va;
553 vm_paddr_t pa;
554 pd_entry_t *l1;
555 u_int l1_slot;
556 pt_entry_t entry;
557 pn_t pn;
558
559 pa = dmap_phys_base = min_pa & ~L1_OFFSET;
560 va = DMAP_MIN_ADDRESS;
561 l1 = (pd_entry_t *)kern_l1;
562 l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS);
563
564 for (; va < DMAP_MAX_ADDRESS && pa < max_pa;
565 pa += L1_SIZE, va += L1_SIZE, l1_slot++) {
566 KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
567
568 /* superpages */
569 pn = (pa / PAGE_SIZE);
570 entry = PTE_KERN;
571 entry |= (pn << PTE_PPN0_S);
572 pmap_store(&l1[l1_slot], entry);
573 }
574
575 /* Set the upper limit of the DMAP region */
576 dmap_phys_max = pa;
577 dmap_max_addr = va;
578
579 sfence_vma();
580 }
581
582 static vm_offset_t
pmap_bootstrap_l3(vm_offset_t l1pt,vm_offset_t va,vm_offset_t l3_start)583 pmap_bootstrap_l3(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l3_start)
584 {
585 vm_offset_t l3pt;
586 pt_entry_t entry;
587 pd_entry_t *l2;
588 vm_paddr_t pa;
589 u_int l2_slot;
590 pn_t pn;
591
592 KASSERT((va & L2_OFFSET) == 0, ("Invalid virtual address"));
593
594 l2 = pmap_l2(kernel_pmap, va);
595 l2 = (pd_entry_t *)((uintptr_t)l2 & ~(PAGE_SIZE - 1));
596 l2_slot = pmap_l2_index(va);
597 l3pt = l3_start;
598
599 for (; va < VM_MAX_KERNEL_ADDRESS; l2_slot++, va += L2_SIZE) {
600 KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index"));
601
602 pa = pmap_early_vtophys(l1pt, l3pt);
603 pn = (pa / PAGE_SIZE);
604 entry = (PTE_V);
605 entry |= (pn << PTE_PPN0_S);
606 pmap_store(&l2[l2_slot], entry);
607 l3pt += PAGE_SIZE;
608 }
609
610 /* Clean the L2 page table */
611 memset((void *)l3_start, 0, l3pt - l3_start);
612
613 return (l3pt);
614 }
615
616 /*
617 * Bootstrap the system enough to run with virtual memory.
618 */
619 void
pmap_bootstrap(vm_offset_t l1pt,vm_paddr_t kernstart,vm_size_t kernlen)620 pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
621 {
622 vm_paddr_t physmap[PHYS_AVAIL_ENTRIES];
623 uint64_t satp;
624 vm_offset_t dpcpu, freemempos, l0pv, msgbufpv;
625 vm_paddr_t l0pa, l1pa, max_pa, min_pa, pa;
626 pd_entry_t *l0p;
627 pt_entry_t *l2p;
628 u_int l1_slot, l2_slot;
629 u_int physmap_idx;
630 int i, mode;
631
632 printf("pmap_bootstrap %lx %lx %lx\n", l1pt, kernstart, kernlen);
633
634 /* Set this early so we can use the pagetable walking functions */
635 kernel_pmap_store.pm_top = (pd_entry_t *)l1pt;
636 PMAP_LOCK_INIT(kernel_pmap);
637 TAILQ_INIT(&kernel_pmap->pm_pvchunk);
638 vm_radix_init(&kernel_pmap->pm_root);
639
640 rw_init(&pvh_global_lock, "pmap pv global");
641
642 /*
643 * Set the current CPU as active in the kernel pmap. Secondary cores
644 * will add themselves later in init_secondary(). The SBI firmware
645 * may rely on this mask being precise, so CPU_FILL() is not used.
646 */
647 CPU_SET(PCPU_GET(hart), &kernel_pmap->pm_active);
648
649 /* Assume the address we were loaded to is a valid physical address. */
650 min_pa = max_pa = kernstart;
651
652 physmap_idx = physmem_avail(physmap, nitems(physmap));
653 physmap_idx /= 2;
654
655 /*
656 * Find the minimum physical address. physmap is sorted,
657 * but may contain empty ranges.
658 */
659 for (i = 0; i < physmap_idx * 2; i += 2) {
660 if (physmap[i] == physmap[i + 1])
661 continue;
662 if (physmap[i] <= min_pa)
663 min_pa = physmap[i];
664 if (physmap[i + 1] > max_pa)
665 max_pa = physmap[i + 1];
666 }
667 printf("physmap_idx %u\n", physmap_idx);
668 printf("min_pa %lx\n", min_pa);
669 printf("max_pa %lx\n", max_pa);
670
671 /* Create a direct map region early so we can use it for pa -> va */
672 pmap_bootstrap_dmap(l1pt, min_pa, max_pa);
673
674 /*
675 * Read the page table to find out what is already mapped.
676 * This assumes we have mapped a block of memory from KERNBASE
677 * using a single L1 entry.
678 */
679 (void)pmap_early_page_idx(l1pt, KERNBASE, &l1_slot, &l2_slot);
680
681 /* Sanity check the index, KERNBASE should be the first VA */
682 KASSERT(l2_slot == 0, ("The L2 index is non-zero"));
683
684 freemempos = roundup2(KERNBASE + kernlen, PAGE_SIZE);
685
686 /* Create the l3 tables for the early devmap */
687 freemempos = pmap_bootstrap_l3(l1pt,
688 VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE, freemempos);
689
690 /*
691 * Invalidate the mapping we created for the DTB. At this point a copy
692 * has been created, and we no longer need it. We want to avoid the
693 * possibility of an aliased mapping in the future.
694 */
695 l2p = pmap_l2(kernel_pmap, VM_EARLY_DTB_ADDRESS);
696 if ((pmap_load(l2p) & PTE_V) != 0)
697 pmap_clear(l2p);
698
699 sfence_vma();
700
701 #define alloc_pages(var, np) \
702 (var) = freemempos; \
703 freemempos += (np * PAGE_SIZE); \
704 memset((char *)(var), 0, ((np) * PAGE_SIZE));
705
706 mode = 0;
707 TUNABLE_INT_FETCH("vm.pmap.mode", &mode);
708 if (mode == PMAP_MODE_SV48 && (mmu_caps & MMU_SV48) != 0) {
709 /*
710 * Enable SV48 mode: allocate an L0 page and set SV48 mode in
711 * SATP. If the implementation does not provide SV48 mode,
712 * the mode read back from the (WARL) SATP register will be
713 * unchanged, and we continue in SV39 mode.
714 */
715 alloc_pages(l0pv, 1);
716 l0p = (void *)l0pv;
717 l1pa = pmap_early_vtophys(l1pt, l1pt);
718 l0p[pmap_l0_index(KERNBASE)] = PTE_V |
719 ((l1pa >> PAGE_SHIFT) << PTE_PPN0_S);
720
721 l0pa = pmap_early_vtophys(l1pt, l0pv);
722 csr_write(satp, (l0pa >> PAGE_SHIFT) | SATP_MODE_SV48);
723 satp = csr_read(satp);
724 if ((satp & SATP_MODE_M) == SATP_MODE_SV48) {
725 pmap_mode = PMAP_MODE_SV48;
726 kernel_pmap_store.pm_top = l0p;
727 } else {
728 /* Mode didn't change, give the page back. */
729 freemempos -= PAGE_SIZE;
730 }
731 }
732
733 /* Allocate dynamic per-cpu area. */
734 alloc_pages(dpcpu, DPCPU_SIZE / PAGE_SIZE);
735 dpcpu_init((void *)dpcpu, 0);
736
737 /* Allocate memory for the msgbuf, e.g. for /sbin/dmesg */
738 alloc_pages(msgbufpv, round_page(msgbufsize) / PAGE_SIZE);
739 msgbufp = (void *)msgbufpv;
740
741 virtual_avail = roundup2(freemempos, L2_SIZE);
742 virtual_end = VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE;
743 kernel_vm_end = virtual_avail;
744
745 pa = pmap_early_vtophys(l1pt, freemempos);
746
747 physmem_exclude_region(kernstart, pa - kernstart, EXFLAG_NOALLOC);
748 }
749
750 /*
751 * Initialize a vm_page's machine-dependent fields.
752 */
753 void
pmap_page_init(vm_page_t m)754 pmap_page_init(vm_page_t m)
755 {
756
757 TAILQ_INIT(&m->md.pv_list);
758 m->md.pv_memattr = VM_MEMATTR_WRITE_BACK;
759 }
760
761 /*
762 * Initialize the pmap module.
763 *
764 * Called by vm_mem_init(), to initialize any structures that the pmap
765 * system needs to map virtual memory.
766 */
767 void
pmap_init(void)768 pmap_init(void)
769 {
770 vm_size_t s;
771 int i, pv_npg;
772
773 /*
774 * Initialize the pv chunk and pmap list mutexes.
775 */
776 mtx_init(&pv_chunks_mutex, "pmap pv chunk list", NULL, MTX_DEF);
777 mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_DEF);
778
779 /*
780 * Initialize the pool of pv list locks.
781 */
782 for (i = 0; i < NPV_LIST_LOCKS; i++)
783 rw_init(&pv_list_locks[i], "pmap pv list");
784
785 /*
786 * Calculate the size of the pv head table for superpages.
787 */
788 pv_npg = howmany(vm_phys_segs[vm_phys_nsegs - 1].end, L2_SIZE);
789
790 /*
791 * Allocate memory for the pv head table for superpages.
792 */
793 s = (vm_size_t)(pv_npg * sizeof(struct md_page));
794 s = round_page(s);
795 pv_table = kmem_malloc(s, M_WAITOK | M_ZERO);
796 for (i = 0; i < pv_npg; i++)
797 TAILQ_INIT(&pv_table[i].pv_list);
798 TAILQ_INIT(&pv_dummy.pv_list);
799
800 if (superpages_enabled)
801 pagesizes[1] = L2_SIZE;
802 }
803
804 #ifdef SMP
805 /*
806 * For SMP, these functions have to use IPIs for coherence.
807 *
808 * In general, the calling thread uses a plain fence to order the
809 * writes to the page tables before invoking an SBI callback to invoke
810 * sfence_vma() on remote CPUs.
811 */
812 static void
pmap_invalidate_page(pmap_t pmap,vm_offset_t va)813 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
814 {
815 cpuset_t mask;
816
817 sched_pin();
818 mask = pmap->pm_active;
819 CPU_CLR(PCPU_GET(hart), &mask);
820 fence();
821 if (!CPU_EMPTY(&mask) && smp_started)
822 sbi_remote_sfence_vma(mask.__bits, va, 1);
823 sfence_vma_page(va);
824 sched_unpin();
825 }
826
827 static void
pmap_invalidate_range(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)828 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
829 {
830 cpuset_t mask;
831
832 sched_pin();
833 mask = pmap->pm_active;
834 CPU_CLR(PCPU_GET(hart), &mask);
835 fence();
836 if (!CPU_EMPTY(&mask) && smp_started)
837 sbi_remote_sfence_vma(mask.__bits, sva, eva - sva + 1);
838
839 /*
840 * Might consider a loop of sfence_vma_page() for a small
841 * number of pages in the future.
842 */
843 sfence_vma();
844 sched_unpin();
845 }
846
847 static void
pmap_invalidate_all(pmap_t pmap)848 pmap_invalidate_all(pmap_t pmap)
849 {
850 cpuset_t mask;
851
852 sched_pin();
853 mask = pmap->pm_active;
854 CPU_CLR(PCPU_GET(hart), &mask);
855
856 /*
857 * XXX: The SBI doc doesn't detail how to specify x0 as the
858 * address to perform a global fence. BBL currently treats
859 * all sfence_vma requests as global however.
860 */
861 fence();
862 if (!CPU_EMPTY(&mask) && smp_started)
863 sbi_remote_sfence_vma(mask.__bits, 0, 0);
864 sfence_vma();
865 sched_unpin();
866 }
867 #else
868 /*
869 * Normal, non-SMP, invalidation functions.
870 * We inline these within pmap.c for speed.
871 */
872 static __inline void
pmap_invalidate_page(pmap_t pmap,vm_offset_t va)873 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
874 {
875
876 sfence_vma_page(va);
877 }
878
879 static __inline void
pmap_invalidate_range(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)880 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
881 {
882
883 /*
884 * Might consider a loop of sfence_vma_page() for a small
885 * number of pages in the future.
886 */
887 sfence_vma();
888 }
889
890 static __inline void
pmap_invalidate_all(pmap_t pmap)891 pmap_invalidate_all(pmap_t pmap)
892 {
893
894 sfence_vma();
895 }
896 #endif
897
898 /*
899 * Routine: pmap_extract
900 * Function:
901 * Extract the physical page address associated
902 * with the given map/virtual_address pair.
903 */
904 vm_paddr_t
pmap_extract(pmap_t pmap,vm_offset_t va)905 pmap_extract(pmap_t pmap, vm_offset_t va)
906 {
907 pd_entry_t *l2p, l2;
908 pt_entry_t *l3p;
909 vm_paddr_t pa;
910
911 pa = 0;
912
913 /*
914 * Start with an L2 lookup, L1 superpages are currently not implemented.
915 */
916 PMAP_LOCK(pmap);
917 l2p = pmap_l2(pmap, va);
918 if (l2p != NULL && ((l2 = pmap_load(l2p)) & PTE_V) != 0) {
919 if ((l2 & PTE_RWX) == 0) {
920 l3p = pmap_l2_to_l3(l2p, va);
921 if (l3p != NULL) {
922 pa = PTE_TO_PHYS(pmap_load(l3p));
923 pa |= (va & L3_OFFSET);
924 }
925 } else {
926 /* L2 is a superpage mapping. */
927 pa = L2PTE_TO_PHYS(l2);
928 pa |= (va & L2_OFFSET);
929 }
930 }
931 PMAP_UNLOCK(pmap);
932 return (pa);
933 }
934
935 /*
936 * Routine: pmap_extract_and_hold
937 * Function:
938 * Atomically extract and hold the physical page
939 * with the given pmap and virtual address pair
940 * if that mapping permits the given protection.
941 */
942 vm_page_t
pmap_extract_and_hold(pmap_t pmap,vm_offset_t va,vm_prot_t prot)943 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
944 {
945 pt_entry_t *l3p, l3;
946 vm_paddr_t phys;
947 vm_page_t m;
948
949 m = NULL;
950 PMAP_LOCK(pmap);
951 l3p = pmap_l3(pmap, va);
952 if (l3p != NULL && (l3 = pmap_load(l3p)) != 0) {
953 if ((l3 & PTE_W) != 0 || (prot & VM_PROT_WRITE) == 0) {
954 phys = PTE_TO_PHYS(l3);
955 m = PHYS_TO_VM_PAGE(phys);
956 if (!vm_page_wire_mapped(m))
957 m = NULL;
958 }
959 }
960 PMAP_UNLOCK(pmap);
961 return (m);
962 }
963
964 vm_paddr_t
pmap_kextract(vm_offset_t va)965 pmap_kextract(vm_offset_t va)
966 {
967 pd_entry_t *l2, l2e;
968 pt_entry_t *l3;
969 vm_paddr_t pa;
970
971 if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
972 pa = DMAP_TO_PHYS(va);
973 } else {
974 l2 = pmap_l2(kernel_pmap, va);
975 if (l2 == NULL)
976 panic("pmap_kextract: No l2");
977 l2e = pmap_load(l2);
978 /*
979 * Beware of concurrent promotion and demotion! We must
980 * use l2e rather than loading from l2 multiple times to
981 * ensure we see a consistent state, including the
982 * implicit load in pmap_l2_to_l3. It is, however, safe
983 * to use an old l2e because the L3 page is preserved by
984 * promotion.
985 */
986 if ((l2e & PTE_RX) != 0) {
987 /* superpages */
988 pa = L2PTE_TO_PHYS(l2e);
989 pa |= (va & L2_OFFSET);
990 return (pa);
991 }
992
993 l3 = pmap_l2_to_l3(&l2e, va);
994 if (l3 == NULL)
995 panic("pmap_kextract: No l3...");
996 pa = PTE_TO_PHYS(pmap_load(l3));
997 pa |= (va & PAGE_MASK);
998 }
999 return (pa);
1000 }
1001
1002 /***************************************************
1003 * Low level mapping routines.....
1004 ***************************************************/
1005
1006 void
pmap_kenter(vm_offset_t sva,vm_size_t size,vm_paddr_t pa,int mode __unused)1007 pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode __unused)
1008 {
1009 pt_entry_t entry;
1010 pt_entry_t *l3;
1011 vm_offset_t va;
1012 pn_t pn;
1013
1014 KASSERT((pa & L3_OFFSET) == 0,
1015 ("pmap_kenter_device: Invalid physical address"));
1016 KASSERT((sva & L3_OFFSET) == 0,
1017 ("pmap_kenter_device: Invalid virtual address"));
1018 KASSERT((size & PAGE_MASK) == 0,
1019 ("pmap_kenter_device: Mapping is not page-sized"));
1020
1021 va = sva;
1022 while (size != 0) {
1023 l3 = pmap_l3(kernel_pmap, va);
1024 KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
1025
1026 pn = (pa / PAGE_SIZE);
1027 entry = PTE_KERN;
1028 entry |= (pn << PTE_PPN0_S);
1029 pmap_store(l3, entry);
1030
1031 va += PAGE_SIZE;
1032 pa += PAGE_SIZE;
1033 size -= PAGE_SIZE;
1034 }
1035 pmap_invalidate_range(kernel_pmap, sva, va);
1036 }
1037
1038 void
pmap_kenter_device(vm_offset_t sva,vm_size_t size,vm_paddr_t pa)1039 pmap_kenter_device(vm_offset_t sva, vm_size_t size, vm_paddr_t pa)
1040 {
1041 pmap_kenter(sva, size, pa, VM_MEMATTR_DEVICE);
1042 }
1043
1044 /*
1045 * Remove a page from the kernel pagetables.
1046 * Note: not SMP coherent.
1047 */
1048 void
pmap_kremove(vm_offset_t va)1049 pmap_kremove(vm_offset_t va)
1050 {
1051 pt_entry_t *l3;
1052
1053 l3 = pmap_l3(kernel_pmap, va);
1054 KASSERT(l3 != NULL, ("pmap_kremove: Invalid address"));
1055
1056 pmap_clear(l3);
1057 sfence_vma();
1058 }
1059
1060 void
pmap_kremove_device(vm_offset_t sva,vm_size_t size)1061 pmap_kremove_device(vm_offset_t sva, vm_size_t size)
1062 {
1063 pt_entry_t *l3;
1064 vm_offset_t va;
1065
1066 KASSERT((sva & L3_OFFSET) == 0,
1067 ("pmap_kremove_device: Invalid virtual address"));
1068 KASSERT((size & PAGE_MASK) == 0,
1069 ("pmap_kremove_device: Mapping is not page-sized"));
1070
1071 va = sva;
1072 while (size != 0) {
1073 l3 = pmap_l3(kernel_pmap, va);
1074 KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
1075 pmap_clear(l3);
1076
1077 va += PAGE_SIZE;
1078 size -= PAGE_SIZE;
1079 }
1080
1081 pmap_invalidate_range(kernel_pmap, sva, va);
1082 }
1083
1084 /*
1085 * Used to map a range of physical addresses into kernel
1086 * virtual address space.
1087 *
1088 * The value passed in '*virt' is a suggested virtual address for
1089 * the mapping. Architectures which can support a direct-mapped
1090 * physical to virtual region can return the appropriate address
1091 * within that region, leaving '*virt' unchanged. Other
1092 * architectures should map the pages starting at '*virt' and
1093 * update '*virt' with the first usable address after the mapped
1094 * region.
1095 */
1096 vm_offset_t
pmap_map(vm_offset_t * virt,vm_paddr_t start,vm_paddr_t end,int prot)1097 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
1098 {
1099
1100 return PHYS_TO_DMAP(start);
1101 }
1102
1103 /*
1104 * Add a list of wired pages to the kva
1105 * this routine is only used for temporary
1106 * kernel mappings that do not need to have
1107 * page modification or references recorded.
1108 * Note that old mappings are simply written
1109 * over. The page *must* be wired.
1110 * Note: SMP coherent. Uses a ranged shootdown IPI.
1111 */
1112 void
pmap_qenter(vm_offset_t sva,vm_page_t * ma,int count)1113 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
1114 {
1115 pt_entry_t *l3, pa;
1116 vm_offset_t va;
1117 vm_page_t m;
1118 pt_entry_t entry;
1119 pn_t pn;
1120 int i;
1121
1122 va = sva;
1123 for (i = 0; i < count; i++) {
1124 m = ma[i];
1125 pa = VM_PAGE_TO_PHYS(m);
1126 pn = (pa / PAGE_SIZE);
1127 l3 = pmap_l3(kernel_pmap, va);
1128
1129 entry = PTE_KERN;
1130 entry |= (pn << PTE_PPN0_S);
1131 pmap_store(l3, entry);
1132
1133 va += L3_SIZE;
1134 }
1135 pmap_invalidate_range(kernel_pmap, sva, va);
1136 }
1137
1138 /*
1139 * This routine tears out page mappings from the
1140 * kernel -- it is meant only for temporary mappings.
1141 * Note: SMP coherent. Uses a ranged shootdown IPI.
1142 */
1143 void
pmap_qremove(vm_offset_t sva,int count)1144 pmap_qremove(vm_offset_t sva, int count)
1145 {
1146 pt_entry_t *l3;
1147 vm_offset_t va;
1148
1149 KASSERT(sva >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", sva));
1150
1151 for (va = sva; count-- > 0; va += PAGE_SIZE) {
1152 l3 = pmap_l3(kernel_pmap, va);
1153 KASSERT(l3 != NULL, ("pmap_kremove: Invalid address"));
1154 pmap_clear(l3);
1155 }
1156 pmap_invalidate_range(kernel_pmap, sva, va);
1157 }
1158
1159 bool
pmap_ps_enabled(pmap_t pmap __unused)1160 pmap_ps_enabled(pmap_t pmap __unused)
1161 {
1162
1163 return (superpages_enabled);
1164 }
1165
1166 /***************************************************
1167 * Page table page management routines.....
1168 ***************************************************/
1169 /*
1170 * Schedule the specified unused page table page to be freed. Specifically,
1171 * add the page to the specified list of pages that will be released to the
1172 * physical memory manager after the TLB has been updated.
1173 */
1174 static __inline void
pmap_add_delayed_free_list(vm_page_t m,struct spglist * free,boolean_t set_PG_ZERO)1175 pmap_add_delayed_free_list(vm_page_t m, struct spglist *free,
1176 boolean_t set_PG_ZERO)
1177 {
1178
1179 if (set_PG_ZERO)
1180 m->flags |= PG_ZERO;
1181 else
1182 m->flags &= ~PG_ZERO;
1183 SLIST_INSERT_HEAD(free, m, plinks.s.ss);
1184 }
1185
1186 /*
1187 * Inserts the specified page table page into the specified pmap's collection
1188 * of idle page table pages. Each of a pmap's page table pages is responsible
1189 * for mapping a distinct range of virtual addresses. The pmap's collection is
1190 * ordered by this virtual address range.
1191 *
1192 * If "promoted" is false, then the page table page "mpte" must be zero filled;
1193 * "mpte"'s valid field will be set to 0.
1194 *
1195 * If "promoted" is true and "all_l3e_PTE_A_set" is false, then "mpte" must
1196 * contain valid mappings with identical attributes except for PTE_A;
1197 * "mpte"'s valid field will be set to 1.
1198 *
1199 * If "promoted" and "all_l3e_PTE_A_set" are both true, then "mpte" must contain
1200 * valid mappings with identical attributes including PTE_A; "mpte"'s valid
1201 * field will be set to VM_PAGE_BITS_ALL.
1202 */
1203 static __inline int
pmap_insert_pt_page(pmap_t pmap,vm_page_t mpte,bool promoted,bool all_l3e_PTE_A_set)1204 pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte, bool promoted,
1205 bool all_l3e_PTE_A_set)
1206 {
1207
1208 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1209 KASSERT(promoted || !all_l3e_PTE_A_set,
1210 ("a zero-filled PTP can't have PTE_A set in every PTE"));
1211 mpte->valid = promoted ? (all_l3e_PTE_A_set ? VM_PAGE_BITS_ALL : 1) : 0;
1212 return (vm_radix_insert(&pmap->pm_root, mpte));
1213 }
1214
1215 /*
1216 * Removes the page table page mapping the specified virtual address from the
1217 * specified pmap's collection of idle page table pages, and returns it.
1218 * Otherwise, returns NULL if there is no page table page corresponding to the
1219 * specified virtual address.
1220 */
1221 static __inline vm_page_t
pmap_remove_pt_page(pmap_t pmap,vm_offset_t va)1222 pmap_remove_pt_page(pmap_t pmap, vm_offset_t va)
1223 {
1224
1225 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1226 return (vm_radix_remove(&pmap->pm_root, pmap_l2_pindex(va)));
1227 }
1228
1229 /*
1230 * Decrements a page table page's reference count, which is used to record the
1231 * number of valid page table entries within the page. If the reference count
1232 * drops to zero, then the page table page is unmapped. Returns TRUE if the
1233 * page table page was unmapped and FALSE otherwise.
1234 */
1235 static inline boolean_t
pmap_unwire_ptp(pmap_t pmap,vm_offset_t va,vm_page_t m,struct spglist * free)1236 pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
1237 {
1238 KASSERT(m->ref_count > 0,
1239 ("%s: page %p ref count underflow", __func__, m));
1240
1241 --m->ref_count;
1242 if (m->ref_count == 0) {
1243 _pmap_unwire_ptp(pmap, va, m, free);
1244 return (TRUE);
1245 } else {
1246 return (FALSE);
1247 }
1248 }
1249
1250 static void
_pmap_unwire_ptp(pmap_t pmap,vm_offset_t va,vm_page_t m,struct spglist * free)1251 _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
1252 {
1253 vm_paddr_t phys;
1254
1255 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1256 if (m->pindex >= NUL2E + NUL1E) {
1257 pd_entry_t *l0;
1258 l0 = pmap_l0(pmap, va);
1259 pmap_clear(l0);
1260 } else if (m->pindex >= NUL2E) {
1261 pd_entry_t *l1;
1262 l1 = pmap_l1(pmap, va);
1263 pmap_clear(l1);
1264 pmap_distribute_l1(pmap, pmap_l1_index(va), 0);
1265 } else {
1266 pd_entry_t *l2;
1267 l2 = pmap_l2(pmap, va);
1268 pmap_clear(l2);
1269 }
1270 pmap_resident_count_dec(pmap, 1);
1271 if (m->pindex < NUL2E) {
1272 pd_entry_t *l1;
1273 vm_page_t pdpg;
1274
1275 l1 = pmap_l1(pmap, va);
1276 phys = PTE_TO_PHYS(pmap_load(l1));
1277 pdpg = PHYS_TO_VM_PAGE(phys);
1278 pmap_unwire_ptp(pmap, va, pdpg, free);
1279 } else if (m->pindex < NUL2E + NUL1E && pmap_mode != PMAP_MODE_SV39) {
1280 pd_entry_t *l0;
1281 vm_page_t pdpg;
1282
1283 MPASS(pmap_mode != PMAP_MODE_SV39);
1284 l0 = pmap_l0(pmap, va);
1285 phys = PTE_TO_PHYS(pmap_load(l0));
1286 pdpg = PHYS_TO_VM_PAGE(phys);
1287 pmap_unwire_ptp(pmap, va, pdpg, free);
1288 }
1289 pmap_invalidate_page(pmap, va);
1290
1291 vm_wire_sub(1);
1292
1293 /*
1294 * Put page on a list so that it is released after
1295 * *ALL* TLB shootdown is done
1296 */
1297 pmap_add_delayed_free_list(m, free, TRUE);
1298 }
1299
1300 /*
1301 * After removing a page table entry, this routine is used to
1302 * conditionally free the page, and manage the reference count.
1303 */
1304 static int
pmap_unuse_pt(pmap_t pmap,vm_offset_t va,pd_entry_t ptepde,struct spglist * free)1305 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde,
1306 struct spglist *free)
1307 {
1308 vm_page_t mpte;
1309
1310 if (va >= VM_MAXUSER_ADDRESS)
1311 return (0);
1312 KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
1313 mpte = PHYS_TO_VM_PAGE(PTE_TO_PHYS(ptepde));
1314 return (pmap_unwire_ptp(pmap, va, mpte, free));
1315 }
1316
1317 static uint64_t
pmap_satp_mode(void)1318 pmap_satp_mode(void)
1319 {
1320 return (pmap_mode == PMAP_MODE_SV39 ? SATP_MODE_SV39 : SATP_MODE_SV48);
1321 }
1322
1323 void
pmap_pinit0(pmap_t pmap)1324 pmap_pinit0(pmap_t pmap)
1325 {
1326 PMAP_LOCK_INIT(pmap);
1327 bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
1328 pmap->pm_top = kernel_pmap->pm_top;
1329 pmap->pm_satp = pmap_satp_mode() |
1330 (vtophys(pmap->pm_top) >> PAGE_SHIFT);
1331 CPU_ZERO(&pmap->pm_active);
1332 TAILQ_INIT(&pmap->pm_pvchunk);
1333 vm_radix_init(&pmap->pm_root);
1334 pmap_activate_boot(pmap);
1335 }
1336
1337 int
pmap_pinit(pmap_t pmap)1338 pmap_pinit(pmap_t pmap)
1339 {
1340 vm_paddr_t topphys;
1341 vm_page_t mtop;
1342 size_t i;
1343
1344 mtop = vm_page_alloc_noobj(VM_ALLOC_WIRED | VM_ALLOC_ZERO |
1345 VM_ALLOC_WAITOK);
1346
1347 topphys = VM_PAGE_TO_PHYS(mtop);
1348 pmap->pm_top = (pd_entry_t *)PHYS_TO_DMAP(topphys);
1349 pmap->pm_satp = pmap_satp_mode() | (topphys >> PAGE_SHIFT);
1350
1351 bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
1352
1353 CPU_ZERO(&pmap->pm_active);
1354
1355 if (pmap_mode == PMAP_MODE_SV39) {
1356 /*
1357 * Copy L1 entries from the kernel pmap. This must be done with
1358 * the allpmaps lock held to avoid races with
1359 * pmap_distribute_l1().
1360 */
1361 mtx_lock(&allpmaps_lock);
1362 LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1363 for (i = pmap_l1_index(VM_MIN_KERNEL_ADDRESS);
1364 i < pmap_l1_index(VM_MAX_KERNEL_ADDRESS); i++)
1365 pmap->pm_top[i] = kernel_pmap->pm_top[i];
1366 for (i = pmap_l1_index(DMAP_MIN_ADDRESS);
1367 i < pmap_l1_index(DMAP_MAX_ADDRESS); i++)
1368 pmap->pm_top[i] = kernel_pmap->pm_top[i];
1369 mtx_unlock(&allpmaps_lock);
1370 } else {
1371 i = pmap_l0_index(VM_MIN_KERNEL_ADDRESS);
1372 pmap->pm_top[i] = kernel_pmap->pm_top[i];
1373 }
1374
1375 TAILQ_INIT(&pmap->pm_pvchunk);
1376 vm_radix_init(&pmap->pm_root);
1377
1378 return (1);
1379 }
1380
1381 /*
1382 * This routine is called if the desired page table page does not exist.
1383 *
1384 * If page table page allocation fails, this routine may sleep before
1385 * returning NULL. It sleeps only if a lock pointer was given.
1386 *
1387 * Note: If a page allocation fails at page table level two or three,
1388 * one or two pages may be held during the wait, only to be released
1389 * afterwards. This conservative approach is easily argued to avoid
1390 * race conditions.
1391 */
1392 static vm_page_t
_pmap_alloc_l3(pmap_t pmap,vm_pindex_t ptepindex,struct rwlock ** lockp)1393 _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp)
1394 {
1395 vm_page_t m, pdpg;
1396 pt_entry_t entry;
1397 vm_paddr_t phys;
1398 pn_t pn;
1399
1400 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1401
1402 /*
1403 * Allocate a page table page.
1404 */
1405 m = vm_page_alloc_noobj(VM_ALLOC_WIRED | VM_ALLOC_ZERO);
1406 if (m == NULL) {
1407 if (lockp != NULL) {
1408 RELEASE_PV_LIST_LOCK(lockp);
1409 PMAP_UNLOCK(pmap);
1410 rw_runlock(&pvh_global_lock);
1411 vm_wait(NULL);
1412 rw_rlock(&pvh_global_lock);
1413 PMAP_LOCK(pmap);
1414 }
1415
1416 /*
1417 * Indicate the need to retry. While waiting, the page table
1418 * page may have been allocated.
1419 */
1420 return (NULL);
1421 }
1422 m->pindex = ptepindex;
1423
1424 /*
1425 * Map the pagetable page into the process address space, if
1426 * it isn't already there.
1427 */
1428 pn = VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT;
1429 if (ptepindex >= NUL2E + NUL1E) {
1430 pd_entry_t *l0;
1431 vm_pindex_t l0index;
1432
1433 KASSERT(pmap_mode != PMAP_MODE_SV39,
1434 ("%s: pindex %#lx in SV39 mode", __func__, ptepindex));
1435 KASSERT(ptepindex < NUL2E + NUL1E + NUL0E,
1436 ("%s: pindex %#lx out of range", __func__, ptepindex));
1437
1438 l0index = ptepindex - (NUL2E + NUL1E);
1439 l0 = &pmap->pm_top[l0index];
1440 KASSERT((pmap_load(l0) & PTE_V) == 0,
1441 ("%s: L0 entry %#lx is valid", __func__, pmap_load(l0)));
1442
1443 entry = PTE_V | (pn << PTE_PPN0_S);
1444 pmap_store(l0, entry);
1445 } else if (ptepindex >= NUL2E) {
1446 pd_entry_t *l0, *l1;
1447 vm_pindex_t l0index, l1index;
1448
1449 l1index = ptepindex - NUL2E;
1450 if (pmap_mode == PMAP_MODE_SV39) {
1451 l1 = &pmap->pm_top[l1index];
1452 } else {
1453 l0index = l1index >> Ln_ENTRIES_SHIFT;
1454 l0 = &pmap->pm_top[l0index];
1455 if (pmap_load(l0) == 0) {
1456 /* Recurse to allocate the L1 page. */
1457 if (_pmap_alloc_l3(pmap,
1458 NUL2E + NUL1E + l0index, lockp) == NULL)
1459 goto fail;
1460 phys = PTE_TO_PHYS(pmap_load(l0));
1461 } else {
1462 phys = PTE_TO_PHYS(pmap_load(l0));
1463 pdpg = PHYS_TO_VM_PAGE(phys);
1464 pdpg->ref_count++;
1465 }
1466 l1 = (pd_entry_t *)PHYS_TO_DMAP(phys);
1467 l1 = &l1[ptepindex & Ln_ADDR_MASK];
1468 }
1469 KASSERT((pmap_load(l1) & PTE_V) == 0,
1470 ("%s: L1 entry %#lx is valid", __func__, pmap_load(l1)));
1471
1472 entry = PTE_V | (pn << PTE_PPN0_S);
1473 pmap_store(l1, entry);
1474 pmap_distribute_l1(pmap, l1index, entry);
1475 } else {
1476 vm_pindex_t l0index, l1index;
1477 pd_entry_t *l0, *l1, *l2;
1478
1479 l1index = ptepindex >> (L1_SHIFT - L2_SHIFT);
1480 if (pmap_mode == PMAP_MODE_SV39) {
1481 l1 = &pmap->pm_top[l1index];
1482 if (pmap_load(l1) == 0) {
1483 /* recurse for allocating page dir */
1484 if (_pmap_alloc_l3(pmap, NUL2E + l1index,
1485 lockp) == NULL)
1486 goto fail;
1487 } else {
1488 phys = PTE_TO_PHYS(pmap_load(l1));
1489 pdpg = PHYS_TO_VM_PAGE(phys);
1490 pdpg->ref_count++;
1491 }
1492 } else {
1493 l0index = l1index >> Ln_ENTRIES_SHIFT;
1494 l0 = &pmap->pm_top[l0index];
1495 if (pmap_load(l0) == 0) {
1496 /* Recurse to allocate the L1 entry. */
1497 if (_pmap_alloc_l3(pmap, NUL2E + l1index,
1498 lockp) == NULL)
1499 goto fail;
1500 phys = PTE_TO_PHYS(pmap_load(l0));
1501 l1 = (pd_entry_t *)PHYS_TO_DMAP(phys);
1502 l1 = &l1[l1index & Ln_ADDR_MASK];
1503 } else {
1504 phys = PTE_TO_PHYS(pmap_load(l0));
1505 l1 = (pd_entry_t *)PHYS_TO_DMAP(phys);
1506 l1 = &l1[l1index & Ln_ADDR_MASK];
1507 if (pmap_load(l1) == 0) {
1508 /* Recurse to allocate the L2 page. */
1509 if (_pmap_alloc_l3(pmap,
1510 NUL2E + l1index, lockp) == NULL)
1511 goto fail;
1512 } else {
1513 phys = PTE_TO_PHYS(pmap_load(l1));
1514 pdpg = PHYS_TO_VM_PAGE(phys);
1515 pdpg->ref_count++;
1516 }
1517 }
1518 }
1519
1520 phys = PTE_TO_PHYS(pmap_load(l1));
1521 l2 = (pd_entry_t *)PHYS_TO_DMAP(phys);
1522 l2 = &l2[ptepindex & Ln_ADDR_MASK];
1523 KASSERT((pmap_load(l2) & PTE_V) == 0,
1524 ("%s: L2 entry %#lx is valid", __func__, pmap_load(l2)));
1525
1526 entry = PTE_V | (pn << PTE_PPN0_S);
1527 pmap_store(l2, entry);
1528 }
1529
1530 pmap_resident_count_inc(pmap, 1);
1531
1532 return (m);
1533
1534 fail:
1535 vm_page_unwire_noq(m);
1536 vm_page_free_zero(m);
1537 return (NULL);
1538 }
1539
1540 static vm_page_t
pmap_alloc_l2(pmap_t pmap,vm_offset_t va,struct rwlock ** lockp)1541 pmap_alloc_l2(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
1542 {
1543 pd_entry_t *l1;
1544 vm_page_t l2pg;
1545 vm_pindex_t l2pindex;
1546
1547 retry:
1548 l1 = pmap_l1(pmap, va);
1549 if (l1 != NULL && (pmap_load(l1) & PTE_V) != 0) {
1550 KASSERT((pmap_load(l1) & PTE_RWX) == 0,
1551 ("%s: L1 entry %#lx for VA %#lx is a leaf", __func__,
1552 pmap_load(l1), va));
1553 /* Add a reference to the L2 page. */
1554 l2pg = PHYS_TO_VM_PAGE(PTE_TO_PHYS(pmap_load(l1)));
1555 l2pg->ref_count++;
1556 } else {
1557 /* Allocate a L2 page. */
1558 l2pindex = pmap_l2_pindex(va) >> Ln_ENTRIES_SHIFT;
1559 l2pg = _pmap_alloc_l3(pmap, NUL2E + l2pindex, lockp);
1560 if (l2pg == NULL && lockp != NULL)
1561 goto retry;
1562 }
1563 return (l2pg);
1564 }
1565
1566 static vm_page_t
pmap_alloc_l3(pmap_t pmap,vm_offset_t va,struct rwlock ** lockp)1567 pmap_alloc_l3(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
1568 {
1569 vm_pindex_t ptepindex;
1570 pd_entry_t *l2;
1571 vm_paddr_t phys;
1572 vm_page_t m;
1573
1574 /*
1575 * Calculate pagetable page index
1576 */
1577 ptepindex = pmap_l2_pindex(va);
1578 retry:
1579 /*
1580 * Get the page directory entry
1581 */
1582 l2 = pmap_l2(pmap, va);
1583
1584 /*
1585 * If the page table page is mapped, we just increment the
1586 * hold count, and activate it.
1587 */
1588 if (l2 != NULL && pmap_load(l2) != 0) {
1589 phys = PTE_TO_PHYS(pmap_load(l2));
1590 m = PHYS_TO_VM_PAGE(phys);
1591 m->ref_count++;
1592 } else {
1593 /*
1594 * Here if the pte page isn't mapped, or if it has been
1595 * deallocated.
1596 */
1597 m = _pmap_alloc_l3(pmap, ptepindex, lockp);
1598 if (m == NULL && lockp != NULL)
1599 goto retry;
1600 }
1601 return (m);
1602 }
1603
1604 /***************************************************
1605 * Pmap allocation/deallocation routines.
1606 ***************************************************/
1607
1608 /*
1609 * Release any resources held by the given physical map.
1610 * Called when a pmap initialized by pmap_pinit is being released.
1611 * Should only be called if the map contains no valid mappings.
1612 */
1613 void
pmap_release(pmap_t pmap)1614 pmap_release(pmap_t pmap)
1615 {
1616 vm_page_t m;
1617
1618 KASSERT(pmap->pm_stats.resident_count == 0,
1619 ("pmap_release: pmap resident count %ld != 0",
1620 pmap->pm_stats.resident_count));
1621 KASSERT(CPU_EMPTY(&pmap->pm_active),
1622 ("releasing active pmap %p", pmap));
1623
1624 if (pmap_mode == PMAP_MODE_SV39) {
1625 mtx_lock(&allpmaps_lock);
1626 LIST_REMOVE(pmap, pm_list);
1627 mtx_unlock(&allpmaps_lock);
1628 }
1629
1630 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_top));
1631 vm_page_unwire_noq(m);
1632 vm_page_free(m);
1633 }
1634
1635 static int
kvm_size(SYSCTL_HANDLER_ARGS)1636 kvm_size(SYSCTL_HANDLER_ARGS)
1637 {
1638 unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS;
1639
1640 return sysctl_handle_long(oidp, &ksize, 0, req);
1641 }
1642 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
1643 0, 0, kvm_size, "LU",
1644 "Size of KVM");
1645
1646 static int
kvm_free(SYSCTL_HANDLER_ARGS)1647 kvm_free(SYSCTL_HANDLER_ARGS)
1648 {
1649 unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
1650
1651 return sysctl_handle_long(oidp, &kfree, 0, req);
1652 }
1653 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
1654 0, 0, kvm_free, "LU",
1655 "Amount of KVM free");
1656
1657 /*
1658 * grow the number of kernel page table entries, if needed
1659 */
1660 void
pmap_growkernel(vm_offset_t addr)1661 pmap_growkernel(vm_offset_t addr)
1662 {
1663 vm_paddr_t paddr;
1664 vm_page_t nkpg;
1665 pd_entry_t *l1, *l2;
1666 pt_entry_t entry;
1667 pn_t pn;
1668
1669 mtx_assert(&kernel_map->system_mtx, MA_OWNED);
1670
1671 addr = roundup2(addr, L2_SIZE);
1672 if (addr - 1 >= vm_map_max(kernel_map))
1673 addr = vm_map_max(kernel_map);
1674 while (kernel_vm_end < addr) {
1675 l1 = pmap_l1(kernel_pmap, kernel_vm_end);
1676 if (pmap_load(l1) == 0) {
1677 /* We need a new PDP entry */
1678 nkpg = vm_page_alloc_noobj(VM_ALLOC_INTERRUPT |
1679 VM_ALLOC_WIRED | VM_ALLOC_ZERO);
1680 if (nkpg == NULL)
1681 panic("pmap_growkernel: no memory to grow kernel");
1682 nkpg->pindex = kernel_vm_end >> L1_SHIFT;
1683 paddr = VM_PAGE_TO_PHYS(nkpg);
1684
1685 pn = (paddr / PAGE_SIZE);
1686 entry = (PTE_V);
1687 entry |= (pn << PTE_PPN0_S);
1688 pmap_store(l1, entry);
1689 pmap_distribute_l1(kernel_pmap,
1690 pmap_l1_index(kernel_vm_end), entry);
1691 continue; /* try again */
1692 }
1693 l2 = pmap_l1_to_l2(l1, kernel_vm_end);
1694 if ((pmap_load(l2) & PTE_V) != 0 &&
1695 (pmap_load(l2) & PTE_RWX) == 0) {
1696 kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
1697 if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
1698 kernel_vm_end = vm_map_max(kernel_map);
1699 break;
1700 }
1701 continue;
1702 }
1703
1704 nkpg = vm_page_alloc_noobj(VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED |
1705 VM_ALLOC_ZERO);
1706 if (nkpg == NULL)
1707 panic("pmap_growkernel: no memory to grow kernel");
1708 nkpg->pindex = kernel_vm_end >> L2_SHIFT;
1709 paddr = VM_PAGE_TO_PHYS(nkpg);
1710
1711 pn = (paddr / PAGE_SIZE);
1712 entry = (PTE_V);
1713 entry |= (pn << PTE_PPN0_S);
1714 pmap_store(l2, entry);
1715
1716 pmap_invalidate_page(kernel_pmap, kernel_vm_end);
1717
1718 kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
1719 if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
1720 kernel_vm_end = vm_map_max(kernel_map);
1721 break;
1722 }
1723 }
1724 }
1725
1726 /***************************************************
1727 * page management routines.
1728 ***************************************************/
1729
1730 static const uint64_t pc_freemask[_NPCM] = {
1731 [0 ... _NPCM - 2] = PC_FREEN,
1732 [_NPCM - 1] = PC_FREEL
1733 };
1734
1735 #if 0
1736 #ifdef PV_STATS
1737 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
1738
1739 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
1740 "Current number of pv entry chunks");
1741 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
1742 "Current number of pv entry chunks allocated");
1743 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
1744 "Current number of pv entry chunks frees");
1745 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
1746 "Number of times tried to get a chunk page but failed.");
1747
1748 static long pv_entry_frees, pv_entry_allocs, pv_entry_count;
1749 static int pv_entry_spare;
1750
1751 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
1752 "Current number of pv entry frees");
1753 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
1754 "Current number of pv entry allocs");
1755 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
1756 "Current number of pv entries");
1757 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
1758 "Current number of spare pv entries");
1759 #endif
1760 #endif /* 0 */
1761
1762 /*
1763 * We are in a serious low memory condition. Resort to
1764 * drastic measures to free some pages so we can allocate
1765 * another pv entry chunk.
1766 *
1767 * Returns NULL if PV entries were reclaimed from the specified pmap.
1768 *
1769 * We do not, however, unmap 2mpages because subsequent accesses will
1770 * allocate per-page pv entries until repromotion occurs, thereby
1771 * exacerbating the shortage of free pv entries.
1772 */
1773 static vm_page_t
reclaim_pv_chunk(pmap_t locked_pmap,struct rwlock ** lockp)1774 reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
1775 {
1776
1777 panic("RISCVTODO: reclaim_pv_chunk");
1778 }
1779
1780 /*
1781 * free the pv_entry back to the free list
1782 */
1783 static void
free_pv_entry(pmap_t pmap,pv_entry_t pv)1784 free_pv_entry(pmap_t pmap, pv_entry_t pv)
1785 {
1786 struct pv_chunk *pc;
1787 int idx, field, bit;
1788
1789 rw_assert(&pvh_global_lock, RA_LOCKED);
1790 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1791 PV_STAT(atomic_add_long(&pv_entry_frees, 1));
1792 PV_STAT(atomic_add_int(&pv_entry_spare, 1));
1793 PV_STAT(atomic_subtract_long(&pv_entry_count, 1));
1794 pc = pv_to_chunk(pv);
1795 idx = pv - &pc->pc_pventry[0];
1796 field = idx / 64;
1797 bit = idx % 64;
1798 pc->pc_map[field] |= 1ul << bit;
1799 if (!pc_is_free(pc)) {
1800 /* 98% of the time, pc is already at the head of the list. */
1801 if (__predict_false(pc != TAILQ_FIRST(&pmap->pm_pvchunk))) {
1802 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1803 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1804 }
1805 return;
1806 }
1807 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1808 free_pv_chunk(pc);
1809 }
1810
1811 static void
free_pv_chunk(struct pv_chunk * pc)1812 free_pv_chunk(struct pv_chunk *pc)
1813 {
1814 vm_page_t m;
1815
1816 mtx_lock(&pv_chunks_mutex);
1817 TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
1818 mtx_unlock(&pv_chunks_mutex);
1819 PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV));
1820 PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
1821 PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
1822 /* entire chunk is free, return it */
1823 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
1824 dump_drop_page(m->phys_addr);
1825 vm_page_unwire_noq(m);
1826 vm_page_free(m);
1827 }
1828
1829 /*
1830 * Returns a new PV entry, allocating a new PV chunk from the system when
1831 * needed. If this PV chunk allocation fails and a PV list lock pointer was
1832 * given, a PV chunk is reclaimed from an arbitrary pmap. Otherwise, NULL is
1833 * returned.
1834 *
1835 * The given PV list lock may be released.
1836 */
1837 static pv_entry_t
get_pv_entry(pmap_t pmap,struct rwlock ** lockp)1838 get_pv_entry(pmap_t pmap, struct rwlock **lockp)
1839 {
1840 int bit, field;
1841 pv_entry_t pv;
1842 struct pv_chunk *pc;
1843 vm_page_t m;
1844
1845 rw_assert(&pvh_global_lock, RA_LOCKED);
1846 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1847 PV_STAT(atomic_add_long(&pv_entry_allocs, 1));
1848 retry:
1849 pc = TAILQ_FIRST(&pmap->pm_pvchunk);
1850 if (pc != NULL) {
1851 for (field = 0; field < _NPCM; field++) {
1852 if (pc->pc_map[field]) {
1853 bit = ffsl(pc->pc_map[field]) - 1;
1854 break;
1855 }
1856 }
1857 if (field < _NPCM) {
1858 pv = &pc->pc_pventry[field * 64 + bit];
1859 pc->pc_map[field] &= ~(1ul << bit);
1860 /* If this was the last item, move it to tail */
1861 if (pc_is_full(pc)) {
1862 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1863 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc,
1864 pc_list);
1865 }
1866 PV_STAT(atomic_add_long(&pv_entry_count, 1));
1867 PV_STAT(atomic_subtract_int(&pv_entry_spare, 1));
1868 return (pv);
1869 }
1870 }
1871 /* No free items, allocate another chunk */
1872 m = vm_page_alloc_noobj(VM_ALLOC_WIRED);
1873 if (m == NULL) {
1874 if (lockp == NULL) {
1875 PV_STAT(pc_chunk_tryfail++);
1876 return (NULL);
1877 }
1878 m = reclaim_pv_chunk(pmap, lockp);
1879 if (m == NULL)
1880 goto retry;
1881 }
1882 PV_STAT(atomic_add_int(&pc_chunk_count, 1));
1883 PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
1884 dump_add_page(m->phys_addr);
1885 pc = (void *)PHYS_TO_DMAP(m->phys_addr);
1886 pc->pc_pmap = pmap;
1887 pc->pc_map[0] = PC_FREEN & ~1ul; /* preallocated bit 0 */
1888 pc->pc_map[1] = PC_FREEN;
1889 pc->pc_map[2] = PC_FREEL;
1890 mtx_lock(&pv_chunks_mutex);
1891 TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
1892 mtx_unlock(&pv_chunks_mutex);
1893 pv = &pc->pc_pventry[0];
1894 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1895 PV_STAT(atomic_add_long(&pv_entry_count, 1));
1896 PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV - 1));
1897 return (pv);
1898 }
1899
1900 /*
1901 * Ensure that the number of spare PV entries in the specified pmap meets or
1902 * exceeds the given count, "needed".
1903 *
1904 * The given PV list lock may be released.
1905 */
1906 static void
reserve_pv_entries(pmap_t pmap,int needed,struct rwlock ** lockp)1907 reserve_pv_entries(pmap_t pmap, int needed, struct rwlock **lockp)
1908 {
1909 struct pch new_tail;
1910 struct pv_chunk *pc;
1911 vm_page_t m;
1912 int avail, free;
1913 bool reclaimed;
1914
1915 rw_assert(&pvh_global_lock, RA_LOCKED);
1916 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1917 KASSERT(lockp != NULL, ("reserve_pv_entries: lockp is NULL"));
1918
1919 /*
1920 * Newly allocated PV chunks must be stored in a private list until
1921 * the required number of PV chunks have been allocated. Otherwise,
1922 * reclaim_pv_chunk() could recycle one of these chunks. In
1923 * contrast, these chunks must be added to the pmap upon allocation.
1924 */
1925 TAILQ_INIT(&new_tail);
1926 retry:
1927 avail = 0;
1928 TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
1929 bit_count((bitstr_t *)pc->pc_map, 0,
1930 sizeof(pc->pc_map) * NBBY, &free);
1931 if (free == 0)
1932 break;
1933 avail += free;
1934 if (avail >= needed)
1935 break;
1936 }
1937 for (reclaimed = false; avail < needed; avail += _NPCPV) {
1938 m = vm_page_alloc_noobj(VM_ALLOC_WIRED);
1939 if (m == NULL) {
1940 m = reclaim_pv_chunk(pmap, lockp);
1941 if (m == NULL)
1942 goto retry;
1943 reclaimed = true;
1944 }
1945 /* XXX PV STATS */
1946 #if 0
1947 dump_add_page(m->phys_addr);
1948 #endif
1949 pc = (void *)PHYS_TO_DMAP(m->phys_addr);
1950 pc->pc_pmap = pmap;
1951 pc->pc_map[0] = PC_FREEN;
1952 pc->pc_map[1] = PC_FREEN;
1953 pc->pc_map[2] = PC_FREEL;
1954 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1955 TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru);
1956
1957 /*
1958 * The reclaim might have freed a chunk from the current pmap.
1959 * If that chunk contained available entries, we need to
1960 * re-count the number of available entries.
1961 */
1962 if (reclaimed)
1963 goto retry;
1964 }
1965 if (!TAILQ_EMPTY(&new_tail)) {
1966 mtx_lock(&pv_chunks_mutex);
1967 TAILQ_CONCAT(&pv_chunks, &new_tail, pc_lru);
1968 mtx_unlock(&pv_chunks_mutex);
1969 }
1970 }
1971
1972 /*
1973 * First find and then remove the pv entry for the specified pmap and virtual
1974 * address from the specified pv list. Returns the pv entry if found and NULL
1975 * otherwise. This operation can be performed on pv lists for either 4KB or
1976 * 2MB page mappings.
1977 */
1978 static __inline pv_entry_t
pmap_pvh_remove(struct md_page * pvh,pmap_t pmap,vm_offset_t va)1979 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
1980 {
1981 pv_entry_t pv;
1982
1983 rw_assert(&pvh_global_lock, RA_LOCKED);
1984 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
1985 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
1986 TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
1987 pvh->pv_gen++;
1988 break;
1989 }
1990 }
1991 return (pv);
1992 }
1993
1994 /*
1995 * First find and then destroy the pv entry for the specified pmap and virtual
1996 * address. This operation can be performed on pv lists for either 4KB or 2MB
1997 * page mappings.
1998 */
1999 static void
pmap_pvh_free(struct md_page * pvh,pmap_t pmap,vm_offset_t va)2000 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
2001 {
2002 pv_entry_t pv;
2003
2004 pv = pmap_pvh_remove(pvh, pmap, va);
2005
2006 KASSERT(pv != NULL, ("pmap_pvh_free: pv not found for %#lx", va));
2007 free_pv_entry(pmap, pv);
2008 }
2009
2010 /*
2011 * Conditionally create the PV entry for a 4KB page mapping if the required
2012 * memory can be allocated without resorting to reclamation.
2013 */
2014 static boolean_t
pmap_try_insert_pv_entry(pmap_t pmap,vm_offset_t va,vm_page_t m,struct rwlock ** lockp)2015 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m,
2016 struct rwlock **lockp)
2017 {
2018 pv_entry_t pv;
2019
2020 rw_assert(&pvh_global_lock, RA_LOCKED);
2021 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2022 /* Pass NULL instead of the lock pointer to disable reclamation. */
2023 if ((pv = get_pv_entry(pmap, NULL)) != NULL) {
2024 pv->pv_va = va;
2025 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
2026 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2027 m->md.pv_gen++;
2028 return (TRUE);
2029 } else
2030 return (FALSE);
2031 }
2032
2033 /*
2034 * After demotion from a 2MB page mapping to 512 4KB page mappings,
2035 * destroy the pv entry for the 2MB page mapping and reinstantiate the pv
2036 * entries for each of the 4KB page mappings.
2037 */
2038 static void __unused
pmap_pv_demote_l2(pmap_t pmap,vm_offset_t va,vm_paddr_t pa,struct rwlock ** lockp)2039 pmap_pv_demote_l2(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
2040 struct rwlock **lockp)
2041 {
2042 struct md_page *pvh;
2043 struct pv_chunk *pc;
2044 pv_entry_t pv;
2045 vm_page_t m;
2046 vm_offset_t va_last;
2047 int bit, field;
2048
2049 rw_assert(&pvh_global_lock, RA_LOCKED);
2050 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2051 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
2052
2053 /*
2054 * Transfer the 2mpage's pv entry for this mapping to the first
2055 * page's pv list. Once this transfer begins, the pv list lock
2056 * must not be released until the last pv entry is reinstantiated.
2057 */
2058 pvh = pa_to_pvh(pa);
2059 va &= ~L2_OFFSET;
2060 pv = pmap_pvh_remove(pvh, pmap, va);
2061 KASSERT(pv != NULL, ("pmap_pv_demote_l2: pv not found"));
2062 m = PHYS_TO_VM_PAGE(pa);
2063 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2064 m->md.pv_gen++;
2065 /* Instantiate the remaining 511 pv entries. */
2066 va_last = va + L2_SIZE - PAGE_SIZE;
2067 for (;;) {
2068 pc = TAILQ_FIRST(&pmap->pm_pvchunk);
2069 KASSERT(!pc_is_full(pc), ("pmap_pv_demote_l2: missing spare"));
2070 for (field = 0; field < _NPCM; field++) {
2071 while (pc->pc_map[field] != 0) {
2072 bit = ffsl(pc->pc_map[field]) - 1;
2073 pc->pc_map[field] &= ~(1ul << bit);
2074 pv = &pc->pc_pventry[field * 64 + bit];
2075 va += PAGE_SIZE;
2076 pv->pv_va = va;
2077 m++;
2078 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2079 ("pmap_pv_demote_l2: page %p is not managed", m));
2080 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2081 m->md.pv_gen++;
2082 if (va == va_last)
2083 goto out;
2084 }
2085 }
2086 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2087 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
2088 }
2089 out:
2090 if (pc_is_free(pc)) {
2091 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2092 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
2093 }
2094 /* XXX PV stats */
2095 }
2096
2097 #if VM_NRESERVLEVEL > 0
2098 static void
pmap_pv_promote_l2(pmap_t pmap,vm_offset_t va,vm_paddr_t pa,struct rwlock ** lockp)2099 pmap_pv_promote_l2(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
2100 struct rwlock **lockp)
2101 {
2102 struct md_page *pvh;
2103 pv_entry_t pv;
2104 vm_page_t m;
2105 vm_offset_t va_last;
2106
2107 rw_assert(&pvh_global_lock, RA_LOCKED);
2108 KASSERT((pa & L2_OFFSET) == 0,
2109 ("pmap_pv_promote_l2: misaligned pa %#lx", pa));
2110
2111 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
2112
2113 m = PHYS_TO_VM_PAGE(pa);
2114 va = va & ~L2_OFFSET;
2115 pv = pmap_pvh_remove(&m->md, pmap, va);
2116 KASSERT(pv != NULL, ("pmap_pv_promote_l2: pv for %#lx not found", va));
2117 pvh = pa_to_pvh(pa);
2118 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
2119 pvh->pv_gen++;
2120
2121 va_last = va + L2_SIZE - PAGE_SIZE;
2122 do {
2123 m++;
2124 va += PAGE_SIZE;
2125 pmap_pvh_free(&m->md, pmap, va);
2126 } while (va < va_last);
2127 }
2128 #endif /* VM_NRESERVLEVEL > 0 */
2129
2130 /*
2131 * Create the PV entry for a 2MB page mapping. Always returns true unless the
2132 * flag PMAP_ENTER_NORECLAIM is specified. If that flag is specified, returns
2133 * false if the PV entry cannot be allocated without resorting to reclamation.
2134 */
2135 static bool
pmap_pv_insert_l2(pmap_t pmap,vm_offset_t va,pd_entry_t l2e,u_int flags,struct rwlock ** lockp)2136 pmap_pv_insert_l2(pmap_t pmap, vm_offset_t va, pd_entry_t l2e, u_int flags,
2137 struct rwlock **lockp)
2138 {
2139 struct md_page *pvh;
2140 pv_entry_t pv;
2141 vm_paddr_t pa;
2142
2143 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2144 /* Pass NULL instead of the lock pointer to disable reclamation. */
2145 if ((pv = get_pv_entry(pmap, (flags & PMAP_ENTER_NORECLAIM) != 0 ?
2146 NULL : lockp)) == NULL)
2147 return (false);
2148 pv->pv_va = va;
2149 pa = PTE_TO_PHYS(l2e);
2150 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
2151 pvh = pa_to_pvh(pa);
2152 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
2153 pvh->pv_gen++;
2154 return (true);
2155 }
2156
2157 static void
pmap_remove_kernel_l2(pmap_t pmap,pt_entry_t * l2,vm_offset_t va)2158 pmap_remove_kernel_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va)
2159 {
2160 pt_entry_t newl2, oldl2 __diagused;
2161 vm_page_t ml3;
2162 vm_paddr_t ml3pa;
2163
2164 KASSERT(!VIRT_IN_DMAP(va), ("removing direct mapping of %#lx", va));
2165 KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap));
2166 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2167
2168 ml3 = pmap_remove_pt_page(pmap, va);
2169 if (ml3 == NULL)
2170 panic("pmap_remove_kernel_l2: Missing pt page");
2171
2172 ml3pa = VM_PAGE_TO_PHYS(ml3);
2173 newl2 = ml3pa | PTE_V;
2174
2175 /*
2176 * If this page table page was unmapped by a promotion, then it
2177 * contains valid mappings. Zero it to invalidate those mappings.
2178 */
2179 if (vm_page_any_valid(ml3))
2180 pagezero((void *)PHYS_TO_DMAP(ml3pa));
2181
2182 /*
2183 * Demote the mapping.
2184 */
2185 oldl2 = pmap_load_store(l2, newl2);
2186 KASSERT(oldl2 == 0, ("%s: found existing mapping at %p: %#lx",
2187 __func__, l2, oldl2));
2188 }
2189
2190 /*
2191 * pmap_remove_l2: Do the things to unmap a level 2 superpage.
2192 */
2193 static int
pmap_remove_l2(pmap_t pmap,pt_entry_t * l2,vm_offset_t sva,pd_entry_t l1e,struct spglist * free,struct rwlock ** lockp)2194 pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
2195 pd_entry_t l1e, struct spglist *free, struct rwlock **lockp)
2196 {
2197 struct md_page *pvh;
2198 pt_entry_t oldl2;
2199 vm_offset_t eva, va;
2200 vm_page_t m, ml3;
2201
2202 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2203 KASSERT((sva & L2_OFFSET) == 0, ("pmap_remove_l2: sva is not aligned"));
2204 oldl2 = pmap_load_clear(l2);
2205 KASSERT((oldl2 & PTE_RWX) != 0,
2206 ("pmap_remove_l2: L2e %lx is not a superpage mapping", oldl2));
2207
2208 /*
2209 * The sfence.vma documentation states that it is sufficient to specify
2210 * a single address within a superpage mapping. However, since we do
2211 * not perform any invalidation upon promotion, TLBs may still be
2212 * caching 4KB mappings within the superpage, so we must invalidate the
2213 * entire range.
2214 */
2215 pmap_invalidate_range(pmap, sva, sva + L2_SIZE);
2216 if ((oldl2 & PTE_SW_WIRED) != 0)
2217 pmap->pm_stats.wired_count -= L2_SIZE / PAGE_SIZE;
2218 pmap_resident_count_dec(pmap, L2_SIZE / PAGE_SIZE);
2219 if ((oldl2 & PTE_SW_MANAGED) != 0) {
2220 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, PTE_TO_PHYS(oldl2));
2221 pvh = pa_to_pvh(PTE_TO_PHYS(oldl2));
2222 pmap_pvh_free(pvh, pmap, sva);
2223 eva = sva + L2_SIZE;
2224 for (va = sva, m = PHYS_TO_VM_PAGE(PTE_TO_PHYS(oldl2));
2225 va < eva; va += PAGE_SIZE, m++) {
2226 if ((oldl2 & PTE_D) != 0)
2227 vm_page_dirty(m);
2228 if ((oldl2 & PTE_A) != 0)
2229 vm_page_aflag_set(m, PGA_REFERENCED);
2230 if (TAILQ_EMPTY(&m->md.pv_list) &&
2231 TAILQ_EMPTY(&pvh->pv_list))
2232 vm_page_aflag_clear(m, PGA_WRITEABLE);
2233 }
2234 }
2235 if (pmap == kernel_pmap) {
2236 pmap_remove_kernel_l2(pmap, l2, sva);
2237 } else {
2238 ml3 = pmap_remove_pt_page(pmap, sva);
2239 if (ml3 != NULL) {
2240 KASSERT(vm_page_any_valid(ml3),
2241 ("pmap_remove_l2: l3 page not promoted"));
2242 pmap_resident_count_dec(pmap, 1);
2243 KASSERT(ml3->ref_count == Ln_ENTRIES,
2244 ("pmap_remove_l2: l3 page ref count error"));
2245 ml3->ref_count = 1;
2246 vm_page_unwire_noq(ml3);
2247 pmap_add_delayed_free_list(ml3, free, FALSE);
2248 }
2249 }
2250 return (pmap_unuse_pt(pmap, sva, l1e, free));
2251 }
2252
2253 /*
2254 * pmap_remove_l3: do the things to unmap a page in a process
2255 */
2256 static int
pmap_remove_l3(pmap_t pmap,pt_entry_t * l3,vm_offset_t va,pd_entry_t l2e,struct spglist * free,struct rwlock ** lockp)2257 pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t va,
2258 pd_entry_t l2e, struct spglist *free, struct rwlock **lockp)
2259 {
2260 struct md_page *pvh;
2261 pt_entry_t old_l3;
2262 vm_paddr_t phys;
2263 vm_page_t m;
2264
2265 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2266 old_l3 = pmap_load_clear(l3);
2267 pmap_invalidate_page(pmap, va);
2268 if (old_l3 & PTE_SW_WIRED)
2269 pmap->pm_stats.wired_count -= 1;
2270 pmap_resident_count_dec(pmap, 1);
2271 if (old_l3 & PTE_SW_MANAGED) {
2272 phys = PTE_TO_PHYS(old_l3);
2273 m = PHYS_TO_VM_PAGE(phys);
2274 if ((old_l3 & PTE_D) != 0)
2275 vm_page_dirty(m);
2276 if (old_l3 & PTE_A)
2277 vm_page_aflag_set(m, PGA_REFERENCED);
2278 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
2279 pmap_pvh_free(&m->md, pmap, va);
2280 if (TAILQ_EMPTY(&m->md.pv_list) &&
2281 (m->flags & PG_FICTITIOUS) == 0) {
2282 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
2283 if (TAILQ_EMPTY(&pvh->pv_list))
2284 vm_page_aflag_clear(m, PGA_WRITEABLE);
2285 }
2286 }
2287
2288 return (pmap_unuse_pt(pmap, va, l2e, free));
2289 }
2290
2291 /*
2292 * Remove the given range of addresses from the specified map.
2293 *
2294 * It is assumed that the start and end are properly
2295 * rounded to the page size.
2296 */
2297 void
pmap_remove(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)2298 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2299 {
2300 struct spglist free;
2301 struct rwlock *lock;
2302 vm_offset_t va, va_next;
2303 pd_entry_t *l0, *l1, *l2, l2e;
2304 pt_entry_t *l3;
2305
2306 /*
2307 * Perform an unsynchronized read. This is, however, safe.
2308 */
2309 if (pmap->pm_stats.resident_count == 0)
2310 return;
2311
2312 SLIST_INIT(&free);
2313
2314 rw_rlock(&pvh_global_lock);
2315 PMAP_LOCK(pmap);
2316
2317 lock = NULL;
2318 for (; sva < eva; sva = va_next) {
2319 if (pmap->pm_stats.resident_count == 0)
2320 break;
2321
2322 if (pmap_mode == PMAP_MODE_SV48) {
2323 l0 = pmap_l0(pmap, sva);
2324 if (pmap_load(l0) == 0) {
2325 va_next = (sva + L0_SIZE) & ~L0_OFFSET;
2326 if (va_next < sva)
2327 va_next = eva;
2328 continue;
2329 }
2330 l1 = pmap_l0_to_l1(l0, sva);
2331 } else {
2332 l1 = pmap_l1(pmap, sva);
2333 }
2334
2335 if (pmap_load(l1) == 0) {
2336 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
2337 if (va_next < sva)
2338 va_next = eva;
2339 continue;
2340 }
2341
2342 /*
2343 * Calculate index for next page table.
2344 */
2345 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
2346 if (va_next < sva)
2347 va_next = eva;
2348
2349 l2 = pmap_l1_to_l2(l1, sva);
2350 if (l2 == NULL)
2351 continue;
2352 if ((l2e = pmap_load(l2)) == 0)
2353 continue;
2354 if ((l2e & PTE_RWX) != 0) {
2355 if (sva + L2_SIZE == va_next && eva >= va_next) {
2356 (void)pmap_remove_l2(pmap, l2, sva,
2357 pmap_load(l1), &free, &lock);
2358 continue;
2359 } else if (!pmap_demote_l2_locked(pmap, l2, sva,
2360 &lock)) {
2361 /*
2362 * The large page mapping was destroyed.
2363 */
2364 continue;
2365 }
2366 l2e = pmap_load(l2);
2367 }
2368
2369 /*
2370 * Limit our scan to either the end of the va represented
2371 * by the current page table page, or to the end of the
2372 * range being removed.
2373 */
2374 if (va_next > eva)
2375 va_next = eva;
2376
2377 va = va_next;
2378 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
2379 sva += L3_SIZE) {
2380 if (pmap_load(l3) == 0) {
2381 if (va != va_next) {
2382 pmap_invalidate_range(pmap, va, sva);
2383 va = va_next;
2384 }
2385 continue;
2386 }
2387 if (va == va_next)
2388 va = sva;
2389 if (pmap_remove_l3(pmap, l3, sva, l2e, &free, &lock)) {
2390 sva += L3_SIZE;
2391 break;
2392 }
2393 }
2394 if (va != va_next)
2395 pmap_invalidate_range(pmap, va, sva);
2396 }
2397 if (lock != NULL)
2398 rw_wunlock(lock);
2399 rw_runlock(&pvh_global_lock);
2400 PMAP_UNLOCK(pmap);
2401 vm_page_free_pages_toq(&free, false);
2402 }
2403
2404 /*
2405 * Routine: pmap_remove_all
2406 * Function:
2407 * Removes this physical page from
2408 * all physical maps in which it resides.
2409 * Reflects back modify bits to the pager.
2410 *
2411 * Notes:
2412 * Original versions of this routine were very
2413 * inefficient because they iteratively called
2414 * pmap_remove (slow...)
2415 */
2416
2417 void
pmap_remove_all(vm_page_t m)2418 pmap_remove_all(vm_page_t m)
2419 {
2420 struct spglist free;
2421 struct md_page *pvh;
2422 pmap_t pmap;
2423 pt_entry_t *l3, l3e;
2424 pd_entry_t *l2, l2e __diagused;
2425 pv_entry_t pv;
2426 vm_offset_t va;
2427
2428 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2429 ("pmap_remove_all: page %p is not managed", m));
2430 SLIST_INIT(&free);
2431 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
2432 pa_to_pvh(VM_PAGE_TO_PHYS(m));
2433
2434 rw_wlock(&pvh_global_lock);
2435 while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
2436 pmap = PV_PMAP(pv);
2437 PMAP_LOCK(pmap);
2438 va = pv->pv_va;
2439 l2 = pmap_l2(pmap, va);
2440 (void)pmap_demote_l2(pmap, l2, va);
2441 PMAP_UNLOCK(pmap);
2442 }
2443 while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
2444 pmap = PV_PMAP(pv);
2445 PMAP_LOCK(pmap);
2446 pmap_resident_count_dec(pmap, 1);
2447 l2 = pmap_l2(pmap, pv->pv_va);
2448 KASSERT(l2 != NULL, ("pmap_remove_all: no l2 table found"));
2449 l2e = pmap_load(l2);
2450
2451 KASSERT((l2e & PTE_RX) == 0,
2452 ("pmap_remove_all: found a superpage in %p's pv list", m));
2453
2454 l3 = pmap_l2_to_l3(l2, pv->pv_va);
2455 l3e = pmap_load_clear(l3);
2456 pmap_invalidate_page(pmap, pv->pv_va);
2457 if (l3e & PTE_SW_WIRED)
2458 pmap->pm_stats.wired_count--;
2459 if ((l3e & PTE_A) != 0)
2460 vm_page_aflag_set(m, PGA_REFERENCED);
2461
2462 /*
2463 * Update the vm_page_t clean and reference bits.
2464 */
2465 if ((l3e & PTE_D) != 0)
2466 vm_page_dirty(m);
2467 pmap_unuse_pt(pmap, pv->pv_va, pmap_load(l2), &free);
2468 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
2469 m->md.pv_gen++;
2470 free_pv_entry(pmap, pv);
2471 PMAP_UNLOCK(pmap);
2472 }
2473 vm_page_aflag_clear(m, PGA_WRITEABLE);
2474 rw_wunlock(&pvh_global_lock);
2475 vm_page_free_pages_toq(&free, false);
2476 }
2477
2478 /*
2479 * Set the physical protection on the
2480 * specified range of this map as requested.
2481 */
2482 void
pmap_protect(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,vm_prot_t prot)2483 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2484 {
2485 pd_entry_t *l0, *l1, *l2, l2e;
2486 pt_entry_t *l3, l3e, mask;
2487 vm_page_t m, mt;
2488 vm_paddr_t pa;
2489 vm_offset_t va_next;
2490 bool anychanged, pv_lists_locked;
2491
2492 if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2493 pmap_remove(pmap, sva, eva);
2494 return;
2495 }
2496
2497 if ((prot & (VM_PROT_WRITE | VM_PROT_EXECUTE)) ==
2498 (VM_PROT_WRITE | VM_PROT_EXECUTE))
2499 return;
2500
2501 anychanged = false;
2502 pv_lists_locked = false;
2503 mask = 0;
2504 if ((prot & VM_PROT_WRITE) == 0)
2505 mask |= PTE_W | PTE_D;
2506 if ((prot & VM_PROT_EXECUTE) == 0)
2507 mask |= PTE_X;
2508 resume:
2509 PMAP_LOCK(pmap);
2510 for (; sva < eva; sva = va_next) {
2511 if (pmap_mode == PMAP_MODE_SV48) {
2512 l0 = pmap_l0(pmap, sva);
2513 if (pmap_load(l0) == 0) {
2514 va_next = (sva + L0_SIZE) & ~L0_OFFSET;
2515 if (va_next < sva)
2516 va_next = eva;
2517 continue;
2518 }
2519 l1 = pmap_l0_to_l1(l0, sva);
2520 } else {
2521 l1 = pmap_l1(pmap, sva);
2522 }
2523
2524 if (pmap_load(l1) == 0) {
2525 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
2526 if (va_next < sva)
2527 va_next = eva;
2528 continue;
2529 }
2530
2531 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
2532 if (va_next < sva)
2533 va_next = eva;
2534
2535 l2 = pmap_l1_to_l2(l1, sva);
2536 if (l2 == NULL || (l2e = pmap_load(l2)) == 0)
2537 continue;
2538 if ((l2e & PTE_RWX) != 0) {
2539 if (sva + L2_SIZE == va_next && eva >= va_next) {
2540 retryl2:
2541 if ((prot & VM_PROT_WRITE) == 0 &&
2542 (l2e & (PTE_SW_MANAGED | PTE_D)) ==
2543 (PTE_SW_MANAGED | PTE_D)) {
2544 pa = PTE_TO_PHYS(l2e);
2545 m = PHYS_TO_VM_PAGE(pa);
2546 for (mt = m; mt < &m[Ln_ENTRIES]; mt++)
2547 vm_page_dirty(mt);
2548 }
2549 if (!atomic_fcmpset_long(l2, &l2e, l2e & ~mask))
2550 goto retryl2;
2551 anychanged = true;
2552 continue;
2553 } else {
2554 if (!pv_lists_locked) {
2555 pv_lists_locked = true;
2556 if (!rw_try_rlock(&pvh_global_lock)) {
2557 if (anychanged)
2558 pmap_invalidate_all(
2559 pmap);
2560 PMAP_UNLOCK(pmap);
2561 rw_rlock(&pvh_global_lock);
2562 goto resume;
2563 }
2564 }
2565 if (!pmap_demote_l2(pmap, l2, sva)) {
2566 /*
2567 * The large page mapping was destroyed.
2568 */
2569 continue;
2570 }
2571 }
2572 }
2573
2574 if (va_next > eva)
2575 va_next = eva;
2576
2577 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
2578 sva += L3_SIZE) {
2579 l3e = pmap_load(l3);
2580 retryl3:
2581 if ((l3e & PTE_V) == 0)
2582 continue;
2583 if ((prot & VM_PROT_WRITE) == 0 &&
2584 (l3e & (PTE_SW_MANAGED | PTE_D)) ==
2585 (PTE_SW_MANAGED | PTE_D)) {
2586 m = PHYS_TO_VM_PAGE(PTE_TO_PHYS(l3e));
2587 vm_page_dirty(m);
2588 }
2589 if (!atomic_fcmpset_long(l3, &l3e, l3e & ~mask))
2590 goto retryl3;
2591 anychanged = true;
2592 }
2593 }
2594 if (anychanged)
2595 pmap_invalidate_all(pmap);
2596 if (pv_lists_locked)
2597 rw_runlock(&pvh_global_lock);
2598 PMAP_UNLOCK(pmap);
2599 }
2600
2601 int
pmap_fault(pmap_t pmap,vm_offset_t va,vm_prot_t ftype)2602 pmap_fault(pmap_t pmap, vm_offset_t va, vm_prot_t ftype)
2603 {
2604 pd_entry_t *l2, l2e;
2605 pt_entry_t bits, *pte, oldpte;
2606 int rv;
2607
2608 KASSERT(VIRT_IS_VALID(va), ("pmap_fault: invalid va %#lx", va));
2609
2610 rv = 0;
2611 PMAP_LOCK(pmap);
2612 l2 = pmap_l2(pmap, va);
2613 if (l2 == NULL || ((l2e = pmap_load(l2)) & PTE_V) == 0)
2614 goto done;
2615 if ((l2e & PTE_RWX) == 0) {
2616 pte = pmap_l2_to_l3(l2, va);
2617 if (pte == NULL || ((oldpte = pmap_load(pte)) & PTE_V) == 0)
2618 goto done;
2619 } else {
2620 pte = l2;
2621 oldpte = l2e;
2622 }
2623
2624 if ((pmap != kernel_pmap && (oldpte & PTE_U) == 0) ||
2625 (ftype == VM_PROT_WRITE && (oldpte & PTE_W) == 0) ||
2626 (ftype == VM_PROT_EXECUTE && (oldpte & PTE_X) == 0) ||
2627 (ftype == VM_PROT_READ && (oldpte & PTE_R) == 0))
2628 goto done;
2629
2630 bits = PTE_A;
2631 if (ftype == VM_PROT_WRITE)
2632 bits |= PTE_D;
2633
2634 /*
2635 * Spurious faults can occur if the implementation caches invalid
2636 * entries in the TLB, or if simultaneous accesses on multiple CPUs
2637 * race with each other.
2638 */
2639 if ((oldpte & bits) != bits)
2640 pmap_store_bits(pte, bits);
2641 sfence_vma();
2642 rv = 1;
2643 done:
2644 PMAP_UNLOCK(pmap);
2645 return (rv);
2646 }
2647
2648 static bool
pmap_demote_l2(pmap_t pmap,pd_entry_t * l2,vm_offset_t va)2649 pmap_demote_l2(pmap_t pmap, pd_entry_t *l2, vm_offset_t va)
2650 {
2651 struct rwlock *lock;
2652 bool rv;
2653
2654 lock = NULL;
2655 rv = pmap_demote_l2_locked(pmap, l2, va, &lock);
2656 if (lock != NULL)
2657 rw_wunlock(lock);
2658 return (rv);
2659 }
2660
2661 /*
2662 * Tries to demote a 2MB page mapping. If demotion fails, the 2MB page
2663 * mapping is invalidated.
2664 */
2665 static bool
pmap_demote_l2_locked(pmap_t pmap,pd_entry_t * l2,vm_offset_t va,struct rwlock ** lockp)2666 pmap_demote_l2_locked(pmap_t pmap, pd_entry_t *l2, vm_offset_t va,
2667 struct rwlock **lockp)
2668 {
2669 struct spglist free;
2670 vm_page_t mpte;
2671 pd_entry_t newl2, oldl2;
2672 pt_entry_t *firstl3, newl3;
2673 vm_paddr_t mptepa;
2674 int i;
2675
2676 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2677
2678 oldl2 = pmap_load(l2);
2679 KASSERT((oldl2 & PTE_RWX) != 0,
2680 ("pmap_demote_l2_locked: oldl2 is not a leaf entry"));
2681 if ((oldl2 & PTE_A) == 0 || (mpte = pmap_remove_pt_page(pmap, va)) ==
2682 NULL) {
2683 KASSERT((oldl2 & PTE_SW_WIRED) == 0,
2684 ("pmap_demote_l2_locked: page table page for a wired mapping is missing"));
2685 if ((oldl2 & PTE_A) == 0 || (mpte = vm_page_alloc_noobj(
2686 (VIRT_IN_DMAP(va) ? VM_ALLOC_INTERRUPT : 0) |
2687 VM_ALLOC_WIRED)) == NULL) {
2688 SLIST_INIT(&free);
2689 (void)pmap_remove_l2(pmap, l2, va & ~L2_OFFSET,
2690 pmap_load(pmap_l1(pmap, va)), &free, lockp);
2691 vm_page_free_pages_toq(&free, true);
2692 CTR2(KTR_PMAP, "pmap_demote_l2_locked: "
2693 "failure for va %#lx in pmap %p", va, pmap);
2694 return (false);
2695 }
2696 mpte->pindex = pmap_l2_pindex(va);
2697 if (va < VM_MAXUSER_ADDRESS) {
2698 mpte->ref_count = Ln_ENTRIES;
2699 pmap_resident_count_inc(pmap, 1);
2700 }
2701 }
2702 mptepa = VM_PAGE_TO_PHYS(mpte);
2703 firstl3 = (pt_entry_t *)PHYS_TO_DMAP(mptepa);
2704 newl2 = ((mptepa / PAGE_SIZE) << PTE_PPN0_S) | PTE_V;
2705 KASSERT((oldl2 & PTE_A) != 0,
2706 ("pmap_demote_l2_locked: oldl2 is missing PTE_A"));
2707 KASSERT((oldl2 & (PTE_D | PTE_W)) != PTE_W,
2708 ("pmap_demote_l2_locked: oldl2 is missing PTE_D"));
2709 newl3 = oldl2;
2710
2711 /*
2712 * If the page table page is not leftover from an earlier promotion,
2713 * initialize it.
2714 */
2715 if (!vm_page_all_valid(mpte)) {
2716 for (i = 0; i < Ln_ENTRIES; i++)
2717 pmap_store(firstl3 + i, newl3 + (i << PTE_PPN0_S));
2718 }
2719 KASSERT(PTE_TO_PHYS(pmap_load(firstl3)) == PTE_TO_PHYS(newl3),
2720 ("pmap_demote_l2_locked: firstl3 and newl3 map different physical "
2721 "addresses"));
2722
2723 /*
2724 * If the mapping has changed attributes, update the PTEs.
2725 */
2726 if ((pmap_load(firstl3) & PTE_PROMOTE) != (newl3 & PTE_PROMOTE))
2727 for (i = 0; i < Ln_ENTRIES; i++)
2728 pmap_store(firstl3 + i, newl3 + (i << PTE_PPN0_S));
2729
2730 /*
2731 * The spare PV entries must be reserved prior to demoting the
2732 * mapping, that is, prior to changing the L2 entry. Otherwise, the
2733 * state of the L2 entry and the PV lists will be inconsistent, which
2734 * can result in reclaim_pv_chunk() attempting to remove a PV entry from
2735 * the wrong PV list and pmap_pv_demote_l2() failing to find the
2736 * expected PV entry for the 2MB page mapping that is being demoted.
2737 */
2738 if ((oldl2 & PTE_SW_MANAGED) != 0)
2739 reserve_pv_entries(pmap, Ln_ENTRIES - 1, lockp);
2740
2741 /*
2742 * Demote the mapping.
2743 */
2744 pmap_store(l2, newl2);
2745
2746 /*
2747 * Demote the PV entry.
2748 */
2749 if ((oldl2 & PTE_SW_MANAGED) != 0)
2750 pmap_pv_demote_l2(pmap, va, PTE_TO_PHYS(oldl2), lockp);
2751
2752 atomic_add_long(&pmap_l2_demotions, 1);
2753 CTR2(KTR_PMAP, "pmap_demote_l2_locked: success for va %#lx in pmap %p",
2754 va, pmap);
2755 return (true);
2756 }
2757
2758 #if VM_NRESERVLEVEL > 0
2759 static bool
pmap_promote_l2(pmap_t pmap,pd_entry_t * l2,vm_offset_t va,vm_page_t ml3,struct rwlock ** lockp)2760 pmap_promote_l2(pmap_t pmap, pd_entry_t *l2, vm_offset_t va, vm_page_t ml3,
2761 struct rwlock **lockp)
2762 {
2763 pt_entry_t all_l3e_PTE_A, *firstl3, firstl3e, *l3, l3e;
2764 vm_paddr_t pa;
2765
2766 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2767 if (!pmap_ps_enabled(pmap))
2768 return (false);
2769
2770 KASSERT((pmap_load(l2) & PTE_RWX) == 0,
2771 ("pmap_promote_l2: invalid l2 entry %p", l2));
2772
2773 /*
2774 * Examine the first L3E in the specified PTP. Abort if this L3E is
2775 * ineligible for promotion or does not map the first 4KB physical page
2776 * within a 2MB page.
2777 */
2778 firstl3 = (pt_entry_t *)PHYS_TO_DMAP(PTE_TO_PHYS(pmap_load(l2)));
2779 firstl3e = pmap_load(firstl3);
2780 pa = PTE_TO_PHYS(firstl3e);
2781 if ((pa & L2_OFFSET) != 0) {
2782 CTR2(KTR_PMAP, "pmap_promote_l2: failure for va %#lx pmap %p",
2783 va, pmap);
2784 atomic_add_long(&pmap_l2_p_failures, 1);
2785 return (false);
2786 }
2787
2788 /*
2789 * Downgrade a clean, writable mapping to read-only to ensure that the
2790 * hardware does not set PTE_D while we are comparing PTEs.
2791 *
2792 * Upon a write access to a clean mapping, the implementation will
2793 * either atomically check protections and set PTE_D, or raise a page
2794 * fault. In the latter case, the pmap lock provides atomicity. Thus,
2795 * we do not issue an sfence.vma here and instead rely on pmap_fault()
2796 * to do so lazily.
2797 */
2798 while ((firstl3e & (PTE_W | PTE_D)) == PTE_W) {
2799 if (atomic_fcmpset_64(firstl3, &firstl3e, firstl3e & ~PTE_W)) {
2800 firstl3e &= ~PTE_W;
2801 break;
2802 }
2803 }
2804
2805 /*
2806 * Examine each of the other PTEs in the specified PTP. Abort if this
2807 * PTE maps an unexpected 4KB physical page or does not have identical
2808 * characteristics to the first PTE.
2809 */
2810 all_l3e_PTE_A = firstl3e & PTE_A;
2811 pa += L2_SIZE - PAGE_SIZE;
2812 for (l3 = firstl3 + Ln_ENTRIES - 1; l3 > firstl3; l3--) {
2813 l3e = pmap_load(l3);
2814 if (PTE_TO_PHYS(l3e) != pa) {
2815 CTR2(KTR_PMAP,
2816 "pmap_promote_l2: failure for va %#lx pmap %p",
2817 va, pmap);
2818 atomic_add_long(&pmap_l2_p_failures, 1);
2819 return (false);
2820 }
2821 while ((l3e & (PTE_W | PTE_D)) == PTE_W) {
2822 if (atomic_fcmpset_64(l3, &l3e, l3e & ~PTE_W)) {
2823 l3e &= ~PTE_W;
2824 break;
2825 }
2826 }
2827 if ((l3e & PTE_PROMOTE) != (firstl3e & PTE_PROMOTE)) {
2828 CTR2(KTR_PMAP,
2829 "pmap_promote_l2: failure for va %#lx pmap %p",
2830 va, pmap);
2831 atomic_add_long(&pmap_l2_p_failures, 1);
2832 return (false);
2833 }
2834 all_l3e_PTE_A &= l3e;
2835 pa -= PAGE_SIZE;
2836 }
2837
2838 /*
2839 * Unless all PTEs have PTE_A set, clear it from the superpage
2840 * mapping, so that promotions triggered by speculative mappings,
2841 * such as pmap_enter_quick(), don't automatically mark the
2842 * underlying pages as referenced.
2843 */
2844 firstl3e &= ~PTE_A | all_l3e_PTE_A;
2845
2846 /*
2847 * Save the page table page in its current state until the L2
2848 * mapping the superpage is demoted by pmap_demote_l2() or
2849 * destroyed by pmap_remove_l3().
2850 */
2851 if (ml3 == NULL)
2852 ml3 = PHYS_TO_VM_PAGE(PTE_TO_PHYS(pmap_load(l2)));
2853 KASSERT(ml3->pindex == pmap_l2_pindex(va),
2854 ("pmap_promote_l2: page table page's pindex is wrong"));
2855 if (pmap_insert_pt_page(pmap, ml3, true, all_l3e_PTE_A != 0)) {
2856 CTR2(KTR_PMAP, "pmap_promote_l2: failure for va %#lx pmap %p",
2857 va, pmap);
2858 atomic_add_long(&pmap_l2_p_failures, 1);
2859 return (false);
2860 }
2861
2862 if ((firstl3e & PTE_SW_MANAGED) != 0)
2863 pmap_pv_promote_l2(pmap, va, PTE_TO_PHYS(firstl3e), lockp);
2864
2865 pmap_store(l2, firstl3e);
2866
2867 atomic_add_long(&pmap_l2_promotions, 1);
2868 CTR2(KTR_PMAP, "pmap_promote_l2: success for va %#lx in pmap %p", va,
2869 pmap);
2870 return (true);
2871 }
2872 #endif
2873
2874 /*
2875 * Insert the given physical page (p) at
2876 * the specified virtual address (v) in the
2877 * target physical map with the protection requested.
2878 *
2879 * If specified, the page will be wired down, meaning
2880 * that the related pte can not be reclaimed.
2881 *
2882 * NB: This is the only routine which MAY NOT lazy-evaluate
2883 * or lose information. That is, this routine must actually
2884 * insert this page into the given map NOW.
2885 */
2886 int
pmap_enter(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot,u_int flags,int8_t psind)2887 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2888 u_int flags, int8_t psind)
2889 {
2890 struct rwlock *lock;
2891 pd_entry_t *l1, *l2, l2e;
2892 pt_entry_t new_l3, orig_l3;
2893 pt_entry_t *l3;
2894 pv_entry_t pv;
2895 vm_paddr_t opa, pa, l2_pa, l3_pa;
2896 vm_page_t mpte, om, l2_m, l3_m;
2897 pt_entry_t entry;
2898 pn_t l2_pn, l3_pn, pn;
2899 int rv;
2900 bool nosleep;
2901
2902 va = trunc_page(va);
2903 if ((m->oflags & VPO_UNMANAGED) == 0)
2904 VM_PAGE_OBJECT_BUSY_ASSERT(m);
2905 pa = VM_PAGE_TO_PHYS(m);
2906 pn = (pa / PAGE_SIZE);
2907
2908 new_l3 = PTE_V | PTE_R | PTE_A;
2909 if (prot & VM_PROT_EXECUTE)
2910 new_l3 |= PTE_X;
2911 if (flags & VM_PROT_WRITE)
2912 new_l3 |= PTE_D;
2913 if (prot & VM_PROT_WRITE)
2914 new_l3 |= PTE_W;
2915 if (va < VM_MAX_USER_ADDRESS)
2916 new_l3 |= PTE_U;
2917
2918 new_l3 |= (pn << PTE_PPN0_S);
2919 if ((flags & PMAP_ENTER_WIRED) != 0)
2920 new_l3 |= PTE_SW_WIRED;
2921
2922 /*
2923 * Set modified bit gratuitously for writeable mappings if
2924 * the page is unmanaged. We do not want to take a fault
2925 * to do the dirty bit accounting for these mappings.
2926 */
2927 if ((m->oflags & VPO_UNMANAGED) != 0) {
2928 if (prot & VM_PROT_WRITE)
2929 new_l3 |= PTE_D;
2930 } else
2931 new_l3 |= PTE_SW_MANAGED;
2932
2933 CTR2(KTR_PMAP, "pmap_enter: %.16lx -> %.16lx", va, pa);
2934
2935 lock = NULL;
2936 mpte = NULL;
2937 rw_rlock(&pvh_global_lock);
2938 PMAP_LOCK(pmap);
2939 if (psind == 1) {
2940 /* Assert the required virtual and physical alignment. */
2941 KASSERT((va & L2_OFFSET) == 0,
2942 ("pmap_enter: va %#lx unaligned", va));
2943 KASSERT(m->psind > 0, ("pmap_enter: m->psind < psind"));
2944 rv = pmap_enter_l2(pmap, va, new_l3, flags, m, &lock);
2945 goto out;
2946 }
2947
2948 l2 = pmap_l2(pmap, va);
2949 if (l2 != NULL && ((l2e = pmap_load(l2)) & PTE_V) != 0 &&
2950 ((l2e & PTE_RWX) == 0 || pmap_demote_l2_locked(pmap, l2,
2951 va, &lock))) {
2952 l3 = pmap_l2_to_l3(l2, va);
2953 if (va < VM_MAXUSER_ADDRESS) {
2954 mpte = PHYS_TO_VM_PAGE(PTE_TO_PHYS(pmap_load(l2)));
2955 mpte->ref_count++;
2956 }
2957 } else if (va < VM_MAXUSER_ADDRESS) {
2958 nosleep = (flags & PMAP_ENTER_NOSLEEP) != 0;
2959 mpte = pmap_alloc_l3(pmap, va, nosleep ? NULL : &lock);
2960 if (mpte == NULL && nosleep) {
2961 CTR0(KTR_PMAP, "pmap_enter: mpte == NULL");
2962 if (lock != NULL)
2963 rw_wunlock(lock);
2964 rw_runlock(&pvh_global_lock);
2965 PMAP_UNLOCK(pmap);
2966 return (KERN_RESOURCE_SHORTAGE);
2967 }
2968 l3 = pmap_l3(pmap, va);
2969 } else {
2970 l3 = pmap_l3(pmap, va);
2971 /* TODO: This is not optimal, but should mostly work */
2972 if (l3 == NULL) {
2973 if (l2 == NULL) {
2974 l2_m = vm_page_alloc_noobj(VM_ALLOC_WIRED |
2975 VM_ALLOC_ZERO);
2976 if (l2_m == NULL)
2977 panic("pmap_enter: l2 pte_m == NULL");
2978
2979 l2_pa = VM_PAGE_TO_PHYS(l2_m);
2980 l2_pn = (l2_pa / PAGE_SIZE);
2981
2982 l1 = pmap_l1(pmap, va);
2983 entry = (PTE_V);
2984 entry |= (l2_pn << PTE_PPN0_S);
2985 pmap_store(l1, entry);
2986 pmap_distribute_l1(pmap, pmap_l1_index(va), entry);
2987 l2 = pmap_l1_to_l2(l1, va);
2988 }
2989
2990 l3_m = vm_page_alloc_noobj(VM_ALLOC_WIRED |
2991 VM_ALLOC_ZERO);
2992 if (l3_m == NULL)
2993 panic("pmap_enter: l3 pte_m == NULL");
2994
2995 l3_pa = VM_PAGE_TO_PHYS(l3_m);
2996 l3_pn = (l3_pa / PAGE_SIZE);
2997 entry = (PTE_V);
2998 entry |= (l3_pn << PTE_PPN0_S);
2999 pmap_store(l2, entry);
3000 l3 = pmap_l2_to_l3(l2, va);
3001 }
3002 pmap_invalidate_page(pmap, va);
3003 }
3004
3005 orig_l3 = pmap_load(l3);
3006 opa = PTE_TO_PHYS(orig_l3);
3007 pv = NULL;
3008
3009 /*
3010 * Is the specified virtual address already mapped?
3011 */
3012 if ((orig_l3 & PTE_V) != 0) {
3013 /*
3014 * Wiring change, just update stats. We don't worry about
3015 * wiring PT pages as they remain resident as long as there
3016 * are valid mappings in them. Hence, if a user page is wired,
3017 * the PT page will be also.
3018 */
3019 if ((flags & PMAP_ENTER_WIRED) != 0 &&
3020 (orig_l3 & PTE_SW_WIRED) == 0)
3021 pmap->pm_stats.wired_count++;
3022 else if ((flags & PMAP_ENTER_WIRED) == 0 &&
3023 (orig_l3 & PTE_SW_WIRED) != 0)
3024 pmap->pm_stats.wired_count--;
3025
3026 /*
3027 * Remove the extra PT page reference.
3028 */
3029 if (mpte != NULL) {
3030 mpte->ref_count--;
3031 KASSERT(mpte->ref_count > 0,
3032 ("pmap_enter: missing reference to page table page,"
3033 " va: 0x%lx", va));
3034 }
3035
3036 /*
3037 * Has the physical page changed?
3038 */
3039 if (opa == pa) {
3040 /*
3041 * No, might be a protection or wiring change.
3042 */
3043 if ((orig_l3 & PTE_SW_MANAGED) != 0 &&
3044 (new_l3 & PTE_W) != 0)
3045 vm_page_aflag_set(m, PGA_WRITEABLE);
3046 goto validate;
3047 }
3048
3049 /*
3050 * The physical page has changed. Temporarily invalidate
3051 * the mapping. This ensures that all threads sharing the
3052 * pmap keep a consistent view of the mapping, which is
3053 * necessary for the correct handling of COW faults. It
3054 * also permits reuse of the old mapping's PV entry,
3055 * avoiding an allocation.
3056 *
3057 * For consistency, handle unmanaged mappings the same way.
3058 */
3059 orig_l3 = pmap_load_clear(l3);
3060 KASSERT(PTE_TO_PHYS(orig_l3) == opa,
3061 ("pmap_enter: unexpected pa update for %#lx", va));
3062 if ((orig_l3 & PTE_SW_MANAGED) != 0) {
3063 om = PHYS_TO_VM_PAGE(opa);
3064
3065 /*
3066 * The pmap lock is sufficient to synchronize with
3067 * concurrent calls to pmap_page_test_mappings() and
3068 * pmap_ts_referenced().
3069 */
3070 if ((orig_l3 & PTE_D) != 0)
3071 vm_page_dirty(om);
3072 if ((orig_l3 & PTE_A) != 0)
3073 vm_page_aflag_set(om, PGA_REFERENCED);
3074 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
3075 pv = pmap_pvh_remove(&om->md, pmap, va);
3076 KASSERT(pv != NULL,
3077 ("pmap_enter: no PV entry for %#lx", va));
3078 if ((new_l3 & PTE_SW_MANAGED) == 0)
3079 free_pv_entry(pmap, pv);
3080 if ((om->a.flags & PGA_WRITEABLE) != 0 &&
3081 TAILQ_EMPTY(&om->md.pv_list) &&
3082 ((om->flags & PG_FICTITIOUS) != 0 ||
3083 TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)))
3084 vm_page_aflag_clear(om, PGA_WRITEABLE);
3085 }
3086 pmap_invalidate_page(pmap, va);
3087 orig_l3 = 0;
3088 } else {
3089 /*
3090 * Increment the counters.
3091 */
3092 if ((new_l3 & PTE_SW_WIRED) != 0)
3093 pmap->pm_stats.wired_count++;
3094 pmap_resident_count_inc(pmap, 1);
3095 }
3096 /*
3097 * Enter on the PV list if part of our managed memory.
3098 */
3099 if ((new_l3 & PTE_SW_MANAGED) != 0) {
3100 if (pv == NULL) {
3101 pv = get_pv_entry(pmap, &lock);
3102 pv->pv_va = va;
3103 }
3104 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
3105 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
3106 m->md.pv_gen++;
3107 if ((new_l3 & PTE_W) != 0)
3108 vm_page_aflag_set(m, PGA_WRITEABLE);
3109 }
3110
3111 validate:
3112 /*
3113 * Sync the i-cache on all harts before updating the PTE
3114 * if the new PTE is executable.
3115 */
3116 if (prot & VM_PROT_EXECUTE)
3117 pmap_sync_icache(pmap, va, PAGE_SIZE);
3118
3119 /*
3120 * Update the L3 entry.
3121 */
3122 if (orig_l3 != 0) {
3123 orig_l3 = pmap_load_store(l3, new_l3);
3124 pmap_invalidate_page(pmap, va);
3125 KASSERT(PTE_TO_PHYS(orig_l3) == pa,
3126 ("pmap_enter: invalid update"));
3127 if ((orig_l3 & (PTE_D | PTE_SW_MANAGED)) ==
3128 (PTE_D | PTE_SW_MANAGED))
3129 vm_page_dirty(m);
3130 } else {
3131 pmap_store(l3, new_l3);
3132 }
3133
3134 #if VM_NRESERVLEVEL > 0
3135 if (mpte != NULL && mpte->ref_count == Ln_ENTRIES &&
3136 (m->flags & PG_FICTITIOUS) == 0 &&
3137 vm_reserv_level_iffullpop(m) == 0)
3138 (void)pmap_promote_l2(pmap, l2, va, mpte, &lock);
3139 #endif
3140
3141 rv = KERN_SUCCESS;
3142 out:
3143 if (lock != NULL)
3144 rw_wunlock(lock);
3145 rw_runlock(&pvh_global_lock);
3146 PMAP_UNLOCK(pmap);
3147 return (rv);
3148 }
3149
3150 /*
3151 * Tries to create a read- and/or execute-only 2MB page mapping. Returns
3152 * KERN_SUCCESS if the mapping was created. Otherwise, returns an error
3153 * value. See pmap_enter_l2() for the possible error values when "no sleep",
3154 * "no replace", and "no reclaim" are specified.
3155 */
3156 static int
pmap_enter_2mpage(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot,struct rwlock ** lockp)3157 pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
3158 struct rwlock **lockp)
3159 {
3160 pd_entry_t new_l2;
3161 pn_t pn;
3162
3163 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3164
3165 pn = VM_PAGE_TO_PHYS(m) / PAGE_SIZE;
3166 new_l2 = (pd_entry_t)((pn << PTE_PPN0_S) | PTE_R | PTE_V);
3167 if ((m->oflags & VPO_UNMANAGED) == 0)
3168 new_l2 |= PTE_SW_MANAGED;
3169 if ((prot & VM_PROT_EXECUTE) != 0)
3170 new_l2 |= PTE_X;
3171 if (va < VM_MAXUSER_ADDRESS)
3172 new_l2 |= PTE_U;
3173 return (pmap_enter_l2(pmap, va, new_l2, PMAP_ENTER_NOSLEEP |
3174 PMAP_ENTER_NOREPLACE | PMAP_ENTER_NORECLAIM, NULL, lockp));
3175 }
3176
3177 /*
3178 * Returns true if every page table entry in the specified page table is
3179 * zero.
3180 */
3181 static bool
pmap_every_pte_zero(vm_paddr_t pa)3182 pmap_every_pte_zero(vm_paddr_t pa)
3183 {
3184 pt_entry_t *pt_end, *pte;
3185
3186 KASSERT((pa & PAGE_MASK) == 0, ("pa is misaligned"));
3187 pte = (pt_entry_t *)PHYS_TO_DMAP(pa);
3188 for (pt_end = pte + Ln_ENTRIES; pte < pt_end; pte++) {
3189 if (*pte != 0)
3190 return (false);
3191 }
3192 return (true);
3193 }
3194
3195 /*
3196 * Tries to create the specified 2MB page mapping. Returns KERN_SUCCESS if
3197 * the mapping was created, and one of KERN_FAILURE, KERN_NO_SPACE, or
3198 * KERN_RESOURCE_SHORTAGE otherwise. Returns KERN_FAILURE if
3199 * PMAP_ENTER_NOREPLACE was specified and a 4KB page mapping already exists
3200 * within the 2MB virtual address range starting at the specified virtual
3201 * address. Returns KERN_NO_SPACE if PMAP_ENTER_NOREPLACE was specified and a
3202 * 2MB page mapping already exists at the specified virtual address. Returns
3203 * KERN_RESOURCE_SHORTAGE if either (1) PMAP_ENTER_NOSLEEP was specified and a
3204 * page table page allocation failed or (2) PMAP_ENTER_NORECLAIM was specified
3205 * and a PV entry allocation failed.
3206 *
3207 * The parameter "m" is only used when creating a managed, writeable mapping.
3208 */
3209 static int
pmap_enter_l2(pmap_t pmap,vm_offset_t va,pd_entry_t new_l2,u_int flags,vm_page_t m,struct rwlock ** lockp)3210 pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2, u_int flags,
3211 vm_page_t m, struct rwlock **lockp)
3212 {
3213 struct spglist free;
3214 pd_entry_t *l2, *l3, oldl2;
3215 vm_offset_t sva;
3216 vm_page_t l2pg, mt;
3217 vm_page_t uwptpg;
3218
3219 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3220
3221 if ((l2pg = pmap_alloc_l2(pmap, va, (flags & PMAP_ENTER_NOSLEEP) != 0 ?
3222 NULL : lockp)) == NULL) {
3223 CTR2(KTR_PMAP, "pmap_enter_l2: failed to allocate PT page"
3224 " for va %#lx in pmap %p", va, pmap);
3225 return (KERN_RESOURCE_SHORTAGE);
3226 }
3227
3228 l2 = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(l2pg));
3229 l2 = &l2[pmap_l2_index(va)];
3230 if ((oldl2 = pmap_load(l2)) != 0) {
3231 KASSERT(l2pg->ref_count > 1,
3232 ("pmap_enter_l2: l2pg's ref count is too low"));
3233 if ((flags & PMAP_ENTER_NOREPLACE) != 0) {
3234 if ((oldl2 & PTE_RWX) != 0) {
3235 l2pg->ref_count--;
3236 CTR2(KTR_PMAP,
3237 "pmap_enter_l2: no space for va %#lx"
3238 " in pmap %p", va, pmap);
3239 return (KERN_NO_SPACE);
3240 } else if (va < VM_MAXUSER_ADDRESS ||
3241 !pmap_every_pte_zero(L2PTE_TO_PHYS(oldl2))) {
3242 l2pg->ref_count--;
3243 CTR2(KTR_PMAP, "pmap_enter_l2:"
3244 " failed to replace existing mapping"
3245 " for va %#lx in pmap %p", va, pmap);
3246 return (KERN_FAILURE);
3247 }
3248 }
3249 SLIST_INIT(&free);
3250 if ((oldl2 & PTE_RWX) != 0)
3251 (void)pmap_remove_l2(pmap, l2, va,
3252 pmap_load(pmap_l1(pmap, va)), &free, lockp);
3253 else
3254 for (sva = va; sva < va + L2_SIZE; sva += PAGE_SIZE) {
3255 l3 = pmap_l2_to_l3(l2, sva);
3256 if ((pmap_load(l3) & PTE_V) != 0 &&
3257 pmap_remove_l3(pmap, l3, sva, oldl2, &free,
3258 lockp) != 0)
3259 break;
3260 }
3261 vm_page_free_pages_toq(&free, true);
3262 if (va >= VM_MAXUSER_ADDRESS) {
3263 /*
3264 * Both pmap_remove_l2() and pmap_remove_l3() will
3265 * leave the kernel page table page zero filled.
3266 */
3267 mt = PHYS_TO_VM_PAGE(PTE_TO_PHYS(pmap_load(l2)));
3268 if (pmap_insert_pt_page(pmap, mt, false, false))
3269 panic("pmap_enter_l2: trie insert failed");
3270 } else
3271 KASSERT(pmap_load(l2) == 0,
3272 ("pmap_enter_l2: non-zero L2 entry %p", l2));
3273 }
3274
3275 /*
3276 * Allocate leaf ptpage for wired userspace pages.
3277 */
3278 uwptpg = NULL;
3279 if ((new_l2 & PTE_SW_WIRED) != 0 && pmap != kernel_pmap) {
3280 uwptpg = vm_page_alloc_noobj(VM_ALLOC_WIRED);
3281 if (uwptpg == NULL) {
3282 return (KERN_RESOURCE_SHORTAGE);
3283 }
3284 uwptpg->pindex = pmap_l2_pindex(va);
3285 if (pmap_insert_pt_page(pmap, uwptpg, true, false)) {
3286 vm_page_unwire_noq(uwptpg);
3287 vm_page_free(uwptpg);
3288 return (KERN_RESOURCE_SHORTAGE);
3289 }
3290 pmap_resident_count_inc(pmap, 1);
3291 uwptpg->ref_count = Ln_ENTRIES;
3292 }
3293 if ((new_l2 & PTE_SW_MANAGED) != 0) {
3294 /*
3295 * Abort this mapping if its PV entry could not be created.
3296 */
3297 if (!pmap_pv_insert_l2(pmap, va, new_l2, flags, lockp)) {
3298 SLIST_INIT(&free);
3299 if (pmap_unwire_ptp(pmap, va, l2pg, &free)) {
3300 /*
3301 * Although "va" is not mapped, paging-structure
3302 * caches could nonetheless have entries that
3303 * refer to the freed page table pages.
3304 * Invalidate those entries.
3305 */
3306 pmap_invalidate_page(pmap, va);
3307 vm_page_free_pages_toq(&free, true);
3308 }
3309 if (uwptpg != NULL) {
3310 mt = pmap_remove_pt_page(pmap, va);
3311 KASSERT(mt == uwptpg,
3312 ("removed pt page %p, expected %p", mt,
3313 uwptpg));
3314 pmap_resident_count_dec(pmap, 1);
3315 uwptpg->ref_count = 1;
3316 vm_page_unwire_noq(uwptpg);
3317 vm_page_free(uwptpg);
3318 }
3319 CTR2(KTR_PMAP,
3320 "pmap_enter_l2: failed to create PV entry"
3321 " for va %#lx in pmap %p", va, pmap);
3322 return (KERN_RESOURCE_SHORTAGE);
3323 }
3324 if ((new_l2 & PTE_W) != 0)
3325 for (mt = m; mt < &m[L2_SIZE / PAGE_SIZE]; mt++)
3326 vm_page_aflag_set(mt, PGA_WRITEABLE);
3327 }
3328
3329 /*
3330 * Increment counters.
3331 */
3332 if ((new_l2 & PTE_SW_WIRED) != 0)
3333 pmap->pm_stats.wired_count += L2_SIZE / PAGE_SIZE;
3334 pmap->pm_stats.resident_count += L2_SIZE / PAGE_SIZE;
3335
3336 /*
3337 * Map the superpage.
3338 */
3339 pmap_store(l2, new_l2);
3340
3341 atomic_add_long(&pmap_l2_mappings, 1);
3342 CTR2(KTR_PMAP, "pmap_enter_l2: success for va %#lx in pmap %p",
3343 va, pmap);
3344
3345 return (KERN_SUCCESS);
3346 }
3347
3348 /*
3349 * Maps a sequence of resident pages belonging to the same object.
3350 * The sequence begins with the given page m_start. This page is
3351 * mapped at the given virtual address start. Each subsequent page is
3352 * mapped at a virtual address that is offset from start by the same
3353 * amount as the page is offset from m_start within the object. The
3354 * last page in the sequence is the page with the largest offset from
3355 * m_start that can be mapped at a virtual address less than the given
3356 * virtual address end. Not every virtual page between start and end
3357 * is mapped; only those for which a resident page exists with the
3358 * corresponding offset from m_start are mapped.
3359 */
3360 void
pmap_enter_object(pmap_t pmap,vm_offset_t start,vm_offset_t end,vm_page_t m_start,vm_prot_t prot)3361 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
3362 vm_page_t m_start, vm_prot_t prot)
3363 {
3364 struct rwlock *lock;
3365 vm_offset_t va;
3366 vm_page_t m, mpte;
3367 vm_pindex_t diff, psize;
3368 int rv;
3369
3370 VM_OBJECT_ASSERT_LOCKED(m_start->object);
3371
3372 psize = atop(end - start);
3373 mpte = NULL;
3374 m = m_start;
3375 lock = NULL;
3376 rw_rlock(&pvh_global_lock);
3377 PMAP_LOCK(pmap);
3378 while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
3379 va = start + ptoa(diff);
3380 if ((va & L2_OFFSET) == 0 && va + L2_SIZE <= end &&
3381 m->psind == 1 && pmap_ps_enabled(pmap) &&
3382 ((rv = pmap_enter_2mpage(pmap, va, m, prot, &lock)) ==
3383 KERN_SUCCESS || rv == KERN_NO_SPACE))
3384 m = &m[L2_SIZE / PAGE_SIZE - 1];
3385 else
3386 mpte = pmap_enter_quick_locked(pmap, va, m, prot, mpte,
3387 &lock);
3388 m = TAILQ_NEXT(m, listq);
3389 }
3390 if (lock != NULL)
3391 rw_wunlock(lock);
3392 rw_runlock(&pvh_global_lock);
3393 PMAP_UNLOCK(pmap);
3394 }
3395
3396 /*
3397 * this code makes some *MAJOR* assumptions:
3398 * 1. Current pmap & pmap exists.
3399 * 2. Not wired.
3400 * 3. Read access.
3401 * 4. No page table pages.
3402 * but is *MUCH* faster than pmap_enter...
3403 */
3404
3405 void
pmap_enter_quick(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot)3406 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
3407 {
3408 struct rwlock *lock;
3409
3410 lock = NULL;
3411 rw_rlock(&pvh_global_lock);
3412 PMAP_LOCK(pmap);
3413 (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock);
3414 if (lock != NULL)
3415 rw_wunlock(lock);
3416 rw_runlock(&pvh_global_lock);
3417 PMAP_UNLOCK(pmap);
3418 }
3419
3420 static vm_page_t
pmap_enter_quick_locked(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot,vm_page_t mpte,struct rwlock ** lockp)3421 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
3422 vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
3423 {
3424 struct spglist free;
3425 vm_paddr_t phys;
3426 pd_entry_t *l2;
3427 pt_entry_t *l3, newl3;
3428
3429 KASSERT(!VA_IS_CLEANMAP(va) ||
3430 (m->oflags & VPO_UNMANAGED) != 0,
3431 ("pmap_enter_quick_locked: managed mapping within the clean submap"));
3432 rw_assert(&pvh_global_lock, RA_LOCKED);
3433 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3434 l2 = NULL;
3435
3436 CTR2(KTR_PMAP, "pmap_enter_quick_locked: %p %lx", pmap, va);
3437 /*
3438 * In the case that a page table page is not
3439 * resident, we are creating it here.
3440 */
3441 if (va < VM_MAXUSER_ADDRESS) {
3442 vm_pindex_t l2pindex;
3443
3444 /*
3445 * Calculate pagetable page index
3446 */
3447 l2pindex = pmap_l2_pindex(va);
3448 if (mpte && (mpte->pindex == l2pindex)) {
3449 mpte->ref_count++;
3450 } else {
3451 /*
3452 * Get the l2 entry
3453 */
3454 l2 = pmap_l2(pmap, va);
3455
3456 /*
3457 * If the page table page is mapped, we just increment
3458 * the hold count, and activate it. Otherwise, we
3459 * attempt to allocate a page table page. If this
3460 * attempt fails, we don't retry. Instead, we give up.
3461 */
3462 if (l2 != NULL && pmap_load(l2) != 0) {
3463 if ((pmap_load(l2) & PTE_RWX) != 0)
3464 return (NULL);
3465 phys = PTE_TO_PHYS(pmap_load(l2));
3466 mpte = PHYS_TO_VM_PAGE(phys);
3467 mpte->ref_count++;
3468 } else {
3469 /*
3470 * Pass NULL instead of the PV list lock
3471 * pointer, because we don't intend to sleep.
3472 */
3473 mpte = _pmap_alloc_l3(pmap, l2pindex, NULL);
3474 if (mpte == NULL)
3475 return (mpte);
3476 }
3477 }
3478 l3 = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mpte));
3479 l3 = &l3[pmap_l3_index(va)];
3480 } else {
3481 mpte = NULL;
3482 l3 = pmap_l3(kernel_pmap, va);
3483 }
3484 if (l3 == NULL)
3485 panic("pmap_enter_quick_locked: No l3");
3486 if (pmap_load(l3) != 0) {
3487 if (mpte != NULL)
3488 mpte->ref_count--;
3489 return (NULL);
3490 }
3491
3492 /*
3493 * Enter on the PV list if part of our managed memory.
3494 */
3495 if ((m->oflags & VPO_UNMANAGED) == 0 &&
3496 !pmap_try_insert_pv_entry(pmap, va, m, lockp)) {
3497 if (mpte != NULL) {
3498 SLIST_INIT(&free);
3499 if (pmap_unwire_ptp(pmap, va, mpte, &free))
3500 vm_page_free_pages_toq(&free, false);
3501 }
3502 return (NULL);
3503 }
3504
3505 /*
3506 * Increment counters
3507 */
3508 pmap_resident_count_inc(pmap, 1);
3509
3510 newl3 = ((VM_PAGE_TO_PHYS(m) / PAGE_SIZE) << PTE_PPN0_S) |
3511 PTE_V | PTE_R;
3512 if ((prot & VM_PROT_EXECUTE) != 0)
3513 newl3 |= PTE_X;
3514 if ((m->oflags & VPO_UNMANAGED) == 0)
3515 newl3 |= PTE_SW_MANAGED;
3516 if (va < VM_MAX_USER_ADDRESS)
3517 newl3 |= PTE_U;
3518
3519 /*
3520 * Sync the i-cache on all harts before updating the PTE
3521 * if the new PTE is executable.
3522 */
3523 if (prot & VM_PROT_EXECUTE)
3524 pmap_sync_icache(pmap, va, PAGE_SIZE);
3525
3526 pmap_store(l3, newl3);
3527
3528 #if VM_NRESERVLEVEL > 0
3529 /*
3530 * If both the PTP and the reservation are fully populated, then attempt
3531 * promotion.
3532 */
3533 if ((mpte == NULL || mpte->ref_count == Ln_ENTRIES) &&
3534 (m->flags & PG_FICTITIOUS) == 0 &&
3535 vm_reserv_level_iffullpop(m) == 0) {
3536 if (l2 == NULL)
3537 l2 = pmap_l2(pmap, va);
3538
3539 /*
3540 * If promotion succeeds, then the next call to this function
3541 * should not be given the unmapped PTP as a hint.
3542 */
3543 if (pmap_promote_l2(pmap, l2, va, mpte, lockp))
3544 mpte = NULL;
3545 }
3546 #endif
3547
3548 return (mpte);
3549 }
3550
3551 /*
3552 * This code maps large physical mmap regions into the
3553 * processor address space. Note that some shortcuts
3554 * are taken, but the code works.
3555 */
3556 void
pmap_object_init_pt(pmap_t pmap,vm_offset_t addr,vm_object_t object,vm_pindex_t pindex,vm_size_t size)3557 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
3558 vm_pindex_t pindex, vm_size_t size)
3559 {
3560
3561 VM_OBJECT_ASSERT_WLOCKED(object);
3562 KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
3563 ("pmap_object_init_pt: non-device object"));
3564 }
3565
3566 /*
3567 * Clear the wired attribute from the mappings for the specified range of
3568 * addresses in the given pmap. Every valid mapping within that range
3569 * must have the wired attribute set. In contrast, invalid mappings
3570 * cannot have the wired attribute set, so they are ignored.
3571 *
3572 * The wired attribute of the page table entry is not a hardware feature,
3573 * so there is no need to invalidate any TLB entries.
3574 */
3575 void
pmap_unwire(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)3576 pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3577 {
3578 vm_offset_t va_next;
3579 pd_entry_t *l0, *l1, *l2, l2e;
3580 pt_entry_t *l3, l3e;
3581 bool pv_lists_locked;
3582
3583 pv_lists_locked = false;
3584 retry:
3585 PMAP_LOCK(pmap);
3586 for (; sva < eva; sva = va_next) {
3587 if (pmap_mode == PMAP_MODE_SV48) {
3588 l0 = pmap_l0(pmap, sva);
3589 if (pmap_load(l0) == 0) {
3590 va_next = (sva + L0_SIZE) & ~L0_OFFSET;
3591 if (va_next < sva)
3592 va_next = eva;
3593 continue;
3594 }
3595 l1 = pmap_l0_to_l1(l0, sva);
3596 } else {
3597 l1 = pmap_l1(pmap, sva);
3598 }
3599
3600 if (pmap_load(l1) == 0) {
3601 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
3602 if (va_next < sva)
3603 va_next = eva;
3604 continue;
3605 }
3606
3607 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
3608 if (va_next < sva)
3609 va_next = eva;
3610
3611 l2 = pmap_l1_to_l2(l1, sva);
3612 if ((l2e = pmap_load(l2)) == 0)
3613 continue;
3614 if ((l2e & PTE_RWX) != 0) {
3615 if (sva + L2_SIZE == va_next && eva >= va_next) {
3616 if ((l2e & PTE_SW_WIRED) == 0)
3617 panic("pmap_unwire: l2 %#jx is missing "
3618 "PTE_SW_WIRED", (uintmax_t)l2e);
3619 pmap_clear_bits(l2, PTE_SW_WIRED);
3620 continue;
3621 } else {
3622 if (!pv_lists_locked) {
3623 pv_lists_locked = true;
3624 if (!rw_try_rlock(&pvh_global_lock)) {
3625 PMAP_UNLOCK(pmap);
3626 rw_rlock(&pvh_global_lock);
3627 /* Repeat sva. */
3628 goto retry;
3629 }
3630 }
3631 if (!pmap_demote_l2(pmap, l2, sva))
3632 panic("pmap_unwire: demotion failed");
3633 }
3634 }
3635
3636 if (va_next > eva)
3637 va_next = eva;
3638 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
3639 sva += L3_SIZE) {
3640 if ((l3e = pmap_load(l3)) == 0)
3641 continue;
3642 if ((l3e & PTE_SW_WIRED) == 0)
3643 panic("pmap_unwire: l3 %#jx is missing "
3644 "PTE_SW_WIRED", (uintmax_t)l3e);
3645
3646 /*
3647 * PG_W must be cleared atomically. Although the pmap
3648 * lock synchronizes access to PG_W, another processor
3649 * could be setting PG_M and/or PG_A concurrently.
3650 */
3651 pmap_clear_bits(l3, PTE_SW_WIRED);
3652 pmap->pm_stats.wired_count--;
3653 }
3654 }
3655 if (pv_lists_locked)
3656 rw_runlock(&pvh_global_lock);
3657 PMAP_UNLOCK(pmap);
3658 }
3659
3660 /*
3661 * Copy the range specified by src_addr/len
3662 * from the source map to the range dst_addr/len
3663 * in the destination map.
3664 *
3665 * This routine is only advisory and need not do anything.
3666 */
3667
3668 void
pmap_copy(pmap_t dst_pmap,pmap_t src_pmap,vm_offset_t dst_addr,vm_size_t len,vm_offset_t src_addr)3669 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
3670 vm_offset_t src_addr)
3671 {
3672
3673 }
3674
3675 /*
3676 * pmap_zero_page zeros the specified hardware page by mapping
3677 * the page into KVM and using bzero to clear its contents.
3678 */
3679 void
pmap_zero_page(vm_page_t m)3680 pmap_zero_page(vm_page_t m)
3681 {
3682 vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
3683
3684 pagezero((void *)va);
3685 }
3686
3687 /*
3688 * pmap_zero_page_area zeros the specified hardware page by mapping
3689 * the page into KVM and using bzero to clear its contents.
3690 *
3691 * off and size may not cover an area beyond a single hardware page.
3692 */
3693 void
pmap_zero_page_area(vm_page_t m,int off,int size)3694 pmap_zero_page_area(vm_page_t m, int off, int size)
3695 {
3696 vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
3697
3698 if (off == 0 && size == PAGE_SIZE)
3699 pagezero((void *)va);
3700 else
3701 bzero((char *)va + off, size);
3702 }
3703
3704 /*
3705 * pmap_copy_page copies the specified (machine independent)
3706 * page by mapping the page into virtual memory and using
3707 * bcopy to copy the page, one machine dependent page at a
3708 * time.
3709 */
3710 void
pmap_copy_page(vm_page_t msrc,vm_page_t mdst)3711 pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
3712 {
3713 vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
3714 vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
3715
3716 pagecopy((void *)src, (void *)dst);
3717 }
3718
3719 int unmapped_buf_allowed = 1;
3720
3721 void
pmap_copy_pages(vm_page_t ma[],vm_offset_t a_offset,vm_page_t mb[],vm_offset_t b_offset,int xfersize)3722 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
3723 vm_offset_t b_offset, int xfersize)
3724 {
3725 void *a_cp, *b_cp;
3726 vm_page_t m_a, m_b;
3727 vm_paddr_t p_a, p_b;
3728 vm_offset_t a_pg_offset, b_pg_offset;
3729 int cnt;
3730
3731 while (xfersize > 0) {
3732 a_pg_offset = a_offset & PAGE_MASK;
3733 m_a = ma[a_offset >> PAGE_SHIFT];
3734 p_a = m_a->phys_addr;
3735 b_pg_offset = b_offset & PAGE_MASK;
3736 m_b = mb[b_offset >> PAGE_SHIFT];
3737 p_b = m_b->phys_addr;
3738 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
3739 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
3740 if (__predict_false(!PHYS_IN_DMAP(p_a))) {
3741 panic("!DMAP a %lx", p_a);
3742 } else {
3743 a_cp = (char *)PHYS_TO_DMAP(p_a) + a_pg_offset;
3744 }
3745 if (__predict_false(!PHYS_IN_DMAP(p_b))) {
3746 panic("!DMAP b %lx", p_b);
3747 } else {
3748 b_cp = (char *)PHYS_TO_DMAP(p_b) + b_pg_offset;
3749 }
3750 bcopy(a_cp, b_cp, cnt);
3751 a_offset += cnt;
3752 b_offset += cnt;
3753 xfersize -= cnt;
3754 }
3755 }
3756
3757 vm_offset_t
pmap_quick_enter_page(vm_page_t m)3758 pmap_quick_enter_page(vm_page_t m)
3759 {
3760
3761 return (PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)));
3762 }
3763
3764 void
pmap_quick_remove_page(vm_offset_t addr)3765 pmap_quick_remove_page(vm_offset_t addr)
3766 {
3767 }
3768
3769 /*
3770 * Returns true if the pmap's pv is one of the first
3771 * 16 pvs linked to from this page. This count may
3772 * be changed upwards or downwards in the future; it
3773 * is only necessary that true be returned for a small
3774 * subset of pmaps for proper page aging.
3775 */
3776 boolean_t
pmap_page_exists_quick(pmap_t pmap,vm_page_t m)3777 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
3778 {
3779 struct md_page *pvh;
3780 struct rwlock *lock;
3781 pv_entry_t pv;
3782 int loops = 0;
3783 boolean_t rv;
3784
3785 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3786 ("pmap_page_exists_quick: page %p is not managed", m));
3787 rv = FALSE;
3788 rw_rlock(&pvh_global_lock);
3789 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
3790 rw_rlock(lock);
3791 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
3792 if (PV_PMAP(pv) == pmap) {
3793 rv = TRUE;
3794 break;
3795 }
3796 loops++;
3797 if (loops >= 16)
3798 break;
3799 }
3800 if (!rv && loops < 16 && (m->flags & PG_FICTITIOUS) == 0) {
3801 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
3802 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
3803 if (PV_PMAP(pv) == pmap) {
3804 rv = TRUE;
3805 break;
3806 }
3807 loops++;
3808 if (loops >= 16)
3809 break;
3810 }
3811 }
3812 rw_runlock(lock);
3813 rw_runlock(&pvh_global_lock);
3814 return (rv);
3815 }
3816
3817 /*
3818 * pmap_page_wired_mappings:
3819 *
3820 * Return the number of managed mappings to the given physical page
3821 * that are wired.
3822 */
3823 int
pmap_page_wired_mappings(vm_page_t m)3824 pmap_page_wired_mappings(vm_page_t m)
3825 {
3826 struct md_page *pvh;
3827 struct rwlock *lock;
3828 pmap_t pmap;
3829 pd_entry_t *l2;
3830 pt_entry_t *l3;
3831 pv_entry_t pv;
3832 int count, md_gen, pvh_gen;
3833
3834 if ((m->oflags & VPO_UNMANAGED) != 0)
3835 return (0);
3836 rw_rlock(&pvh_global_lock);
3837 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
3838 rw_rlock(lock);
3839 restart:
3840 count = 0;
3841 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
3842 pmap = PV_PMAP(pv);
3843 if (!PMAP_TRYLOCK(pmap)) {
3844 md_gen = m->md.pv_gen;
3845 rw_runlock(lock);
3846 PMAP_LOCK(pmap);
3847 rw_rlock(lock);
3848 if (md_gen != m->md.pv_gen) {
3849 PMAP_UNLOCK(pmap);
3850 goto restart;
3851 }
3852 }
3853 l2 = pmap_l2(pmap, pv->pv_va);
3854 KASSERT((pmap_load(l2) & PTE_RWX) == 0,
3855 ("%s: found a 2mpage in page %p's pv list", __func__, m));
3856 l3 = pmap_l2_to_l3(l2, pv->pv_va);
3857 if ((pmap_load(l3) & PTE_SW_WIRED) != 0)
3858 count++;
3859 PMAP_UNLOCK(pmap);
3860 }
3861 if ((m->flags & PG_FICTITIOUS) == 0) {
3862 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
3863 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
3864 pmap = PV_PMAP(pv);
3865 if (!PMAP_TRYLOCK(pmap)) {
3866 md_gen = m->md.pv_gen;
3867 pvh_gen = pvh->pv_gen;
3868 rw_runlock(lock);
3869 PMAP_LOCK(pmap);
3870 rw_rlock(lock);
3871 if (md_gen != m->md.pv_gen ||
3872 pvh_gen != pvh->pv_gen) {
3873 PMAP_UNLOCK(pmap);
3874 goto restart;
3875 }
3876 }
3877 l2 = pmap_l2(pmap, pv->pv_va);
3878 if ((pmap_load(l2) & PTE_SW_WIRED) != 0)
3879 count++;
3880 PMAP_UNLOCK(pmap);
3881 }
3882 }
3883 rw_runlock(lock);
3884 rw_runlock(&pvh_global_lock);
3885 return (count);
3886 }
3887
3888 /*
3889 * Returns true if the given page is mapped individually or as part of
3890 * a 2mpage. Otherwise, returns false.
3891 */
3892 bool
pmap_page_is_mapped(vm_page_t m)3893 pmap_page_is_mapped(vm_page_t m)
3894 {
3895 struct rwlock *lock;
3896 bool rv;
3897
3898 if ((m->oflags & VPO_UNMANAGED) != 0)
3899 return (false);
3900 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
3901 rw_rlock(lock);
3902 rv = !TAILQ_EMPTY(&m->md.pv_list) ||
3903 ((m->flags & PG_FICTITIOUS) == 0 &&
3904 !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list));
3905 rw_runlock(lock);
3906 return (rv);
3907 }
3908
3909 static void
pmap_remove_pages_pv(pmap_t pmap,vm_page_t m,pv_entry_t pv,struct spglist * free,bool superpage)3910 pmap_remove_pages_pv(pmap_t pmap, vm_page_t m, pv_entry_t pv,
3911 struct spglist *free, bool superpage)
3912 {
3913 struct md_page *pvh;
3914 vm_page_t mpte, mt;
3915
3916 if (superpage) {
3917 pmap_resident_count_dec(pmap, Ln_ENTRIES);
3918 pvh = pa_to_pvh(m->phys_addr);
3919 TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
3920 pvh->pv_gen++;
3921 if (TAILQ_EMPTY(&pvh->pv_list)) {
3922 for (mt = m; mt < &m[Ln_ENTRIES]; mt++)
3923 if (TAILQ_EMPTY(&mt->md.pv_list) &&
3924 (mt->a.flags & PGA_WRITEABLE) != 0)
3925 vm_page_aflag_clear(mt, PGA_WRITEABLE);
3926 }
3927 mpte = pmap_remove_pt_page(pmap, pv->pv_va);
3928 if (mpte != NULL) {
3929 KASSERT(vm_page_any_valid(mpte),
3930 ("pmap_remove_pages: pte page not promoted"));
3931 pmap_resident_count_dec(pmap, 1);
3932 KASSERT(mpte->ref_count == Ln_ENTRIES,
3933 ("pmap_remove_pages: pte page ref count error"));
3934 mpte->ref_count = 0;
3935 pmap_add_delayed_free_list(mpte, free, FALSE);
3936 }
3937 } else {
3938 pmap_resident_count_dec(pmap, 1);
3939 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
3940 m->md.pv_gen++;
3941 if (TAILQ_EMPTY(&m->md.pv_list) &&
3942 (m->a.flags & PGA_WRITEABLE) != 0) {
3943 pvh = pa_to_pvh(m->phys_addr);
3944 if (TAILQ_EMPTY(&pvh->pv_list))
3945 vm_page_aflag_clear(m, PGA_WRITEABLE);
3946 }
3947 }
3948 }
3949
3950 /*
3951 * Destroy all managed, non-wired mappings in the given user-space
3952 * pmap. This pmap cannot be active on any processor besides the
3953 * caller.
3954 *
3955 * This function cannot be applied to the kernel pmap. Moreover, it
3956 * is not intended for general use. It is only to be used during
3957 * process termination. Consequently, it can be implemented in ways
3958 * that make it faster than pmap_remove(). First, it can more quickly
3959 * destroy mappings by iterating over the pmap's collection of PV
3960 * entries, rather than searching the page table. Second, it doesn't
3961 * have to test and clear the page table entries atomically, because
3962 * no processor is currently accessing the user address space. In
3963 * particular, a page table entry's dirty bit won't change state once
3964 * this function starts.
3965 */
3966 void
pmap_remove_pages(pmap_t pmap)3967 pmap_remove_pages(pmap_t pmap)
3968 {
3969 struct spglist free;
3970 pd_entry_t ptepde;
3971 pt_entry_t *pte, tpte;
3972 vm_page_t m, mt;
3973 pv_entry_t pv;
3974 struct pv_chunk *pc, *npc;
3975 struct rwlock *lock;
3976 int64_t bit;
3977 uint64_t inuse, bitmask;
3978 int allfree, field, freed __pv_stat_used, idx;
3979 bool superpage;
3980
3981 lock = NULL;
3982
3983 SLIST_INIT(&free);
3984 rw_rlock(&pvh_global_lock);
3985 PMAP_LOCK(pmap);
3986 TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
3987 allfree = 1;
3988 freed = 0;
3989 for (field = 0; field < _NPCM; field++) {
3990 inuse = ~pc->pc_map[field] & pc_freemask[field];
3991 while (inuse != 0) {
3992 bit = ffsl(inuse) - 1;
3993 bitmask = 1UL << bit;
3994 idx = field * 64 + bit;
3995 pv = &pc->pc_pventry[idx];
3996 inuse &= ~bitmask;
3997
3998 pte = pmap_l1(pmap, pv->pv_va);
3999 ptepde = pmap_load(pte);
4000 pte = pmap_l1_to_l2(pte, pv->pv_va);
4001 tpte = pmap_load(pte);
4002
4003 KASSERT((tpte & PTE_V) != 0,
4004 ("L2 PTE is invalid... bogus PV entry? "
4005 "va=%#lx, pte=%#lx", pv->pv_va, tpte));
4006 if ((tpte & PTE_RWX) != 0) {
4007 superpage = true;
4008 } else {
4009 ptepde = tpte;
4010 pte = pmap_l2_to_l3(pte, pv->pv_va);
4011 tpte = pmap_load(pte);
4012 superpage = false;
4013 }
4014
4015 /*
4016 * We cannot remove wired pages from a
4017 * process' mapping at this time.
4018 */
4019 if (tpte & PTE_SW_WIRED) {
4020 allfree = 0;
4021 continue;
4022 }
4023
4024 m = PHYS_TO_VM_PAGE(PTE_TO_PHYS(tpte));
4025 KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
4026 m < &vm_page_array[vm_page_array_size],
4027 ("pmap_remove_pages: bad pte %#jx",
4028 (uintmax_t)tpte));
4029
4030 pmap_clear(pte);
4031
4032 /*
4033 * Update the vm_page_t clean/reference bits.
4034 */
4035 if ((tpte & (PTE_D | PTE_W)) ==
4036 (PTE_D | PTE_W)) {
4037 if (superpage)
4038 for (mt = m;
4039 mt < &m[Ln_ENTRIES]; mt++)
4040 vm_page_dirty(mt);
4041 else
4042 vm_page_dirty(m);
4043 }
4044
4045 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
4046
4047 /* Mark free */
4048 pc->pc_map[field] |= bitmask;
4049
4050 pmap_remove_pages_pv(pmap, m, pv, &free,
4051 superpage);
4052 pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free);
4053 freed++;
4054 }
4055 }
4056 PV_STAT(atomic_add_long(&pv_entry_frees, freed));
4057 PV_STAT(atomic_add_int(&pv_entry_spare, freed));
4058 PV_STAT(atomic_subtract_long(&pv_entry_count, freed));
4059 if (allfree) {
4060 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
4061 free_pv_chunk(pc);
4062 }
4063 }
4064 if (lock != NULL)
4065 rw_wunlock(lock);
4066 pmap_invalidate_all(pmap);
4067 rw_runlock(&pvh_global_lock);
4068 PMAP_UNLOCK(pmap);
4069 vm_page_free_pages_toq(&free, false);
4070 }
4071
4072 static bool
pmap_page_test_mappings(vm_page_t m,boolean_t accessed,boolean_t modified)4073 pmap_page_test_mappings(vm_page_t m, boolean_t accessed, boolean_t modified)
4074 {
4075 struct md_page *pvh;
4076 struct rwlock *lock;
4077 pd_entry_t *l2;
4078 pt_entry_t *l3, mask;
4079 pv_entry_t pv;
4080 pmap_t pmap;
4081 int md_gen, pvh_gen;
4082 bool rv;
4083
4084 mask = 0;
4085 if (modified)
4086 mask |= PTE_D;
4087 if (accessed)
4088 mask |= PTE_A;
4089
4090 rv = FALSE;
4091 rw_rlock(&pvh_global_lock);
4092 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
4093 rw_rlock(lock);
4094 restart:
4095 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
4096 pmap = PV_PMAP(pv);
4097 if (!PMAP_TRYLOCK(pmap)) {
4098 md_gen = m->md.pv_gen;
4099 rw_runlock(lock);
4100 PMAP_LOCK(pmap);
4101 rw_rlock(lock);
4102 if (md_gen != m->md.pv_gen) {
4103 PMAP_UNLOCK(pmap);
4104 goto restart;
4105 }
4106 }
4107 l2 = pmap_l2(pmap, pv->pv_va);
4108 KASSERT((pmap_load(l2) & PTE_RWX) == 0,
4109 ("%s: found a 2mpage in page %p's pv list", __func__, m));
4110 l3 = pmap_l2_to_l3(l2, pv->pv_va);
4111 rv = (pmap_load(l3) & mask) == mask;
4112 PMAP_UNLOCK(pmap);
4113 if (rv)
4114 goto out;
4115 }
4116 if ((m->flags & PG_FICTITIOUS) == 0) {
4117 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4118 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
4119 pmap = PV_PMAP(pv);
4120 if (!PMAP_TRYLOCK(pmap)) {
4121 md_gen = m->md.pv_gen;
4122 pvh_gen = pvh->pv_gen;
4123 rw_runlock(lock);
4124 PMAP_LOCK(pmap);
4125 rw_rlock(lock);
4126 if (md_gen != m->md.pv_gen ||
4127 pvh_gen != pvh->pv_gen) {
4128 PMAP_UNLOCK(pmap);
4129 goto restart;
4130 }
4131 }
4132 l2 = pmap_l2(pmap, pv->pv_va);
4133 rv = (pmap_load(l2) & mask) == mask;
4134 PMAP_UNLOCK(pmap);
4135 if (rv)
4136 goto out;
4137 }
4138 }
4139 out:
4140 rw_runlock(lock);
4141 rw_runlock(&pvh_global_lock);
4142 return (rv);
4143 }
4144
4145 /*
4146 * pmap_is_modified:
4147 *
4148 * Return whether or not the specified physical page was modified
4149 * in any physical maps.
4150 */
4151 boolean_t
pmap_is_modified(vm_page_t m)4152 pmap_is_modified(vm_page_t m)
4153 {
4154
4155 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4156 ("pmap_is_modified: page %p is not managed", m));
4157
4158 /*
4159 * If the page is not busied then this check is racy.
4160 */
4161 if (!pmap_page_is_write_mapped(m))
4162 return (FALSE);
4163 return (pmap_page_test_mappings(m, FALSE, TRUE));
4164 }
4165
4166 /*
4167 * pmap_is_prefaultable:
4168 *
4169 * Return whether or not the specified virtual address is eligible
4170 * for prefault.
4171 */
4172 boolean_t
pmap_is_prefaultable(pmap_t pmap,vm_offset_t addr)4173 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
4174 {
4175 pt_entry_t *l3;
4176 boolean_t rv;
4177
4178 /*
4179 * Return TRUE if and only if the L3 entry for the specified virtual
4180 * address is allocated but invalid.
4181 */
4182 rv = FALSE;
4183 PMAP_LOCK(pmap);
4184 l3 = pmap_l3(pmap, addr);
4185 if (l3 != NULL && pmap_load(l3) == 0) {
4186 rv = TRUE;
4187 }
4188 PMAP_UNLOCK(pmap);
4189 return (rv);
4190 }
4191
4192 /*
4193 * pmap_is_referenced:
4194 *
4195 * Return whether or not the specified physical page was referenced
4196 * in any physical maps.
4197 */
4198 boolean_t
pmap_is_referenced(vm_page_t m)4199 pmap_is_referenced(vm_page_t m)
4200 {
4201
4202 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4203 ("pmap_is_referenced: page %p is not managed", m));
4204 return (pmap_page_test_mappings(m, TRUE, FALSE));
4205 }
4206
4207 /*
4208 * Clear the write and modified bits in each of the given page's mappings.
4209 */
4210 void
pmap_remove_write(vm_page_t m)4211 pmap_remove_write(vm_page_t m)
4212 {
4213 struct md_page *pvh;
4214 struct rwlock *lock;
4215 pmap_t pmap;
4216 pd_entry_t *l2;
4217 pt_entry_t *l3, oldl3, newl3;
4218 pv_entry_t next_pv, pv;
4219 vm_offset_t va;
4220 int md_gen, pvh_gen;
4221
4222 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4223 ("pmap_remove_write: page %p is not managed", m));
4224 vm_page_assert_busied(m);
4225
4226 if (!pmap_page_is_write_mapped(m))
4227 return;
4228 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
4229 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
4230 pa_to_pvh(VM_PAGE_TO_PHYS(m));
4231 rw_rlock(&pvh_global_lock);
4232 retry_pv_loop:
4233 rw_wlock(lock);
4234 TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
4235 pmap = PV_PMAP(pv);
4236 if (!PMAP_TRYLOCK(pmap)) {
4237 pvh_gen = pvh->pv_gen;
4238 rw_wunlock(lock);
4239 PMAP_LOCK(pmap);
4240 rw_wlock(lock);
4241 if (pvh_gen != pvh->pv_gen) {
4242 PMAP_UNLOCK(pmap);
4243 rw_wunlock(lock);
4244 goto retry_pv_loop;
4245 }
4246 }
4247 va = pv->pv_va;
4248 l2 = pmap_l2(pmap, va);
4249 if ((pmap_load(l2) & PTE_W) != 0)
4250 (void)pmap_demote_l2_locked(pmap, l2, va, &lock);
4251 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
4252 ("inconsistent pv lock %p %p for page %p",
4253 lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
4254 PMAP_UNLOCK(pmap);
4255 }
4256 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
4257 pmap = PV_PMAP(pv);
4258 if (!PMAP_TRYLOCK(pmap)) {
4259 pvh_gen = pvh->pv_gen;
4260 md_gen = m->md.pv_gen;
4261 rw_wunlock(lock);
4262 PMAP_LOCK(pmap);
4263 rw_wlock(lock);
4264 if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
4265 PMAP_UNLOCK(pmap);
4266 rw_wunlock(lock);
4267 goto retry_pv_loop;
4268 }
4269 }
4270 l2 = pmap_l2(pmap, pv->pv_va);
4271 KASSERT((pmap_load(l2) & PTE_RWX) == 0,
4272 ("%s: found a 2mpage in page %p's pv list", __func__, m));
4273 l3 = pmap_l2_to_l3(l2, pv->pv_va);
4274 oldl3 = pmap_load(l3);
4275 retry:
4276 if ((oldl3 & PTE_W) != 0) {
4277 newl3 = oldl3 & ~(PTE_D | PTE_W);
4278 if (!atomic_fcmpset_long(l3, &oldl3, newl3))
4279 goto retry;
4280 if ((oldl3 & PTE_D) != 0)
4281 vm_page_dirty(m);
4282 pmap_invalidate_page(pmap, pv->pv_va);
4283 }
4284 PMAP_UNLOCK(pmap);
4285 }
4286 rw_wunlock(lock);
4287 vm_page_aflag_clear(m, PGA_WRITEABLE);
4288 rw_runlock(&pvh_global_lock);
4289 }
4290
4291 /*
4292 * pmap_ts_referenced:
4293 *
4294 * Return a count of reference bits for a page, clearing those bits.
4295 * It is not necessary for every reference bit to be cleared, but it
4296 * is necessary that 0 only be returned when there are truly no
4297 * reference bits set.
4298 *
4299 * As an optimization, update the page's dirty field if a modified bit is
4300 * found while counting reference bits. This opportunistic update can be
4301 * performed at low cost and can eliminate the need for some future calls
4302 * to pmap_is_modified(). However, since this function stops after
4303 * finding PMAP_TS_REFERENCED_MAX reference bits, it may not detect some
4304 * dirty pages. Those dirty pages will only be detected by a future call
4305 * to pmap_is_modified().
4306 */
4307 int
pmap_ts_referenced(vm_page_t m)4308 pmap_ts_referenced(vm_page_t m)
4309 {
4310 struct spglist free;
4311 struct md_page *pvh;
4312 struct rwlock *lock;
4313 pv_entry_t pv, pvf;
4314 pmap_t pmap;
4315 pd_entry_t *l2, l2e;
4316 pt_entry_t *l3, l3e;
4317 vm_paddr_t pa;
4318 vm_offset_t va;
4319 int cleared, md_gen, not_cleared, pvh_gen;
4320
4321 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4322 ("pmap_ts_referenced: page %p is not managed", m));
4323 SLIST_INIT(&free);
4324 cleared = 0;
4325 pa = VM_PAGE_TO_PHYS(m);
4326 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : pa_to_pvh(pa);
4327
4328 lock = PHYS_TO_PV_LIST_LOCK(pa);
4329 rw_rlock(&pvh_global_lock);
4330 rw_wlock(lock);
4331 retry:
4332 not_cleared = 0;
4333 if ((pvf = TAILQ_FIRST(&pvh->pv_list)) == NULL)
4334 goto small_mappings;
4335 pv = pvf;
4336 do {
4337 pmap = PV_PMAP(pv);
4338 if (!PMAP_TRYLOCK(pmap)) {
4339 pvh_gen = pvh->pv_gen;
4340 rw_wunlock(lock);
4341 PMAP_LOCK(pmap);
4342 rw_wlock(lock);
4343 if (pvh_gen != pvh->pv_gen) {
4344 PMAP_UNLOCK(pmap);
4345 goto retry;
4346 }
4347 }
4348 va = pv->pv_va;
4349 l2 = pmap_l2(pmap, va);
4350 l2e = pmap_load(l2);
4351 if ((l2e & (PTE_W | PTE_D)) == (PTE_W | PTE_D)) {
4352 /*
4353 * Although l2e is mapping a 2MB page, because
4354 * this function is called at a 4KB page granularity,
4355 * we only update the 4KB page under test.
4356 */
4357 vm_page_dirty(m);
4358 }
4359 if ((l2e & PTE_A) != 0) {
4360 /*
4361 * Since this reference bit is shared by 512 4KB
4362 * pages, it should not be cleared every time it is
4363 * tested. Apply a simple "hash" function on the
4364 * physical page number, the virtual superpage number,
4365 * and the pmap address to select one 4KB page out of
4366 * the 512 on which testing the reference bit will
4367 * result in clearing that reference bit. This
4368 * function is designed to avoid the selection of the
4369 * same 4KB page for every 2MB page mapping.
4370 *
4371 * On demotion, a mapping that hasn't been referenced
4372 * is simply destroyed. To avoid the possibility of a
4373 * subsequent page fault on a demoted wired mapping,
4374 * always leave its reference bit set. Moreover,
4375 * since the superpage is wired, the current state of
4376 * its reference bit won't affect page replacement.
4377 */
4378 if ((((pa >> PAGE_SHIFT) ^ (pv->pv_va >> L2_SHIFT) ^
4379 (uintptr_t)pmap) & (Ln_ENTRIES - 1)) == 0 &&
4380 (l2e & PTE_SW_WIRED) == 0) {
4381 pmap_clear_bits(l2, PTE_A);
4382 pmap_invalidate_page(pmap, va);
4383 cleared++;
4384 } else
4385 not_cleared++;
4386 }
4387 PMAP_UNLOCK(pmap);
4388 /* Rotate the PV list if it has more than one entry. */
4389 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
4390 TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
4391 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
4392 pvh->pv_gen++;
4393 }
4394 if (cleared + not_cleared >= PMAP_TS_REFERENCED_MAX)
4395 goto out;
4396 } while ((pv = TAILQ_FIRST(&pvh->pv_list)) != pvf);
4397 small_mappings:
4398 if ((pvf = TAILQ_FIRST(&m->md.pv_list)) == NULL)
4399 goto out;
4400 pv = pvf;
4401 do {
4402 pmap = PV_PMAP(pv);
4403 if (!PMAP_TRYLOCK(pmap)) {
4404 pvh_gen = pvh->pv_gen;
4405 md_gen = m->md.pv_gen;
4406 rw_wunlock(lock);
4407 PMAP_LOCK(pmap);
4408 rw_wlock(lock);
4409 if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
4410 PMAP_UNLOCK(pmap);
4411 goto retry;
4412 }
4413 }
4414 l2 = pmap_l2(pmap, pv->pv_va);
4415
4416 KASSERT((pmap_load(l2) & PTE_RX) == 0,
4417 ("pmap_ts_referenced: found an invalid l2 table"));
4418
4419 l3 = pmap_l2_to_l3(l2, pv->pv_va);
4420 l3e = pmap_load(l3);
4421 if ((l3e & PTE_D) != 0)
4422 vm_page_dirty(m);
4423 if ((l3e & PTE_A) != 0) {
4424 if ((l3e & PTE_SW_WIRED) == 0) {
4425 /*
4426 * Wired pages cannot be paged out so
4427 * doing accessed bit emulation for
4428 * them is wasted effort. We do the
4429 * hard work for unwired pages only.
4430 */
4431 pmap_clear_bits(l3, PTE_A);
4432 pmap_invalidate_page(pmap, pv->pv_va);
4433 cleared++;
4434 } else
4435 not_cleared++;
4436 }
4437 PMAP_UNLOCK(pmap);
4438 /* Rotate the PV list if it has more than one entry. */
4439 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
4440 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
4441 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
4442 m->md.pv_gen++;
4443 }
4444 } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != pvf && cleared +
4445 not_cleared < PMAP_TS_REFERENCED_MAX);
4446 out:
4447 rw_wunlock(lock);
4448 rw_runlock(&pvh_global_lock);
4449 vm_page_free_pages_toq(&free, false);
4450 return (cleared + not_cleared);
4451 }
4452
4453 /*
4454 * Apply the given advice to the specified range of addresses within the
4455 * given pmap. Depending on the advice, clear the referenced and/or
4456 * modified flags in each mapping and set the mapped page's dirty field.
4457 */
4458 void
pmap_advise(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,int advice)4459 pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
4460 {
4461 }
4462
4463 /*
4464 * Clear the modify bits on the specified physical page.
4465 */
4466 void
pmap_clear_modify(vm_page_t m)4467 pmap_clear_modify(vm_page_t m)
4468 {
4469 struct md_page *pvh;
4470 struct rwlock *lock;
4471 pmap_t pmap;
4472 pv_entry_t next_pv, pv;
4473 pd_entry_t *l2, oldl2;
4474 pt_entry_t *l3;
4475 vm_offset_t va;
4476 int md_gen, pvh_gen;
4477
4478 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4479 ("pmap_clear_modify: page %p is not managed", m));
4480 vm_page_assert_busied(m);
4481
4482 if (!pmap_page_is_write_mapped(m))
4483 return;
4484
4485 /*
4486 * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set.
4487 * If the object containing the page is locked and the page is not
4488 * exclusive busied, then PGA_WRITEABLE cannot be concurrently set.
4489 */
4490 if ((m->a.flags & PGA_WRITEABLE) == 0)
4491 return;
4492 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
4493 pa_to_pvh(VM_PAGE_TO_PHYS(m));
4494 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
4495 rw_rlock(&pvh_global_lock);
4496 rw_wlock(lock);
4497 restart:
4498 TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
4499 pmap = PV_PMAP(pv);
4500 if (!PMAP_TRYLOCK(pmap)) {
4501 pvh_gen = pvh->pv_gen;
4502 rw_wunlock(lock);
4503 PMAP_LOCK(pmap);
4504 rw_wlock(lock);
4505 if (pvh_gen != pvh->pv_gen) {
4506 PMAP_UNLOCK(pmap);
4507 goto restart;
4508 }
4509 }
4510 va = pv->pv_va;
4511 l2 = pmap_l2(pmap, va);
4512 oldl2 = pmap_load(l2);
4513 /* If oldl2 has PTE_W set, then it also has PTE_D set. */
4514 if ((oldl2 & PTE_W) != 0 &&
4515 pmap_demote_l2_locked(pmap, l2, va, &lock) &&
4516 (oldl2 & PTE_SW_WIRED) == 0) {
4517 /*
4518 * Write protect the mapping to a single page so that
4519 * a subsequent write access may repromote.
4520 */
4521 va += VM_PAGE_TO_PHYS(m) - PTE_TO_PHYS(oldl2);
4522 l3 = pmap_l2_to_l3(l2, va);
4523 pmap_clear_bits(l3, PTE_D | PTE_W);
4524 vm_page_dirty(m);
4525 pmap_invalidate_page(pmap, va);
4526 }
4527 PMAP_UNLOCK(pmap);
4528 }
4529 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
4530 pmap = PV_PMAP(pv);
4531 if (!PMAP_TRYLOCK(pmap)) {
4532 md_gen = m->md.pv_gen;
4533 pvh_gen = pvh->pv_gen;
4534 rw_wunlock(lock);
4535 PMAP_LOCK(pmap);
4536 rw_wlock(lock);
4537 if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
4538 PMAP_UNLOCK(pmap);
4539 goto restart;
4540 }
4541 }
4542 l2 = pmap_l2(pmap, pv->pv_va);
4543 KASSERT((pmap_load(l2) & PTE_RWX) == 0,
4544 ("%s: found a 2mpage in page %p's pv list", __func__, m));
4545 l3 = pmap_l2_to_l3(l2, pv->pv_va);
4546 if ((pmap_load(l3) & (PTE_D | PTE_W)) == (PTE_D | PTE_W)) {
4547 pmap_clear_bits(l3, PTE_D | PTE_W);
4548 pmap_invalidate_page(pmap, pv->pv_va);
4549 }
4550 PMAP_UNLOCK(pmap);
4551 }
4552 rw_wunlock(lock);
4553 rw_runlock(&pvh_global_lock);
4554 }
4555
4556 void *
pmap_mapbios(vm_paddr_t pa,vm_size_t size)4557 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
4558 {
4559
4560 return ((void *)PHYS_TO_DMAP(pa));
4561 }
4562
4563 void
pmap_unmapbios(void * p,vm_size_t size)4564 pmap_unmapbios(void *p, vm_size_t size)
4565 {
4566 }
4567
4568 /*
4569 * Sets the memory attribute for the specified page.
4570 */
4571 void
pmap_page_set_memattr(vm_page_t m,vm_memattr_t ma)4572 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
4573 {
4574
4575 m->md.pv_memattr = ma;
4576
4577 /*
4578 * If "m" is a normal page, update its direct mapping. This update
4579 * can be relied upon to perform any cache operations that are
4580 * required for data coherence.
4581 */
4582 if ((m->flags & PG_FICTITIOUS) == 0 &&
4583 pmap_change_attr(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)), PAGE_SIZE,
4584 m->md.pv_memattr) != 0)
4585 panic("memory attribute change on the direct map failed");
4586 }
4587
4588 /*
4589 * Changes the specified virtual address range's memory type to that given by
4590 * the parameter "mode". The specified virtual address range must be
4591 * completely contained within either the direct map or the kernel map.
4592 *
4593 * Returns zero if the change completed successfully, and either EINVAL or
4594 * ENOMEM if the change failed. Specifically, EINVAL is returned if some part
4595 * of the virtual address range was not mapped, and ENOMEM is returned if
4596 * there was insufficient memory available to complete the change. In the
4597 * latter case, the memory type may have been changed on some part of the
4598 * virtual address range.
4599 */
4600 int
pmap_change_attr(vm_offset_t va,vm_size_t size,int mode)4601 pmap_change_attr(vm_offset_t va, vm_size_t size, int mode)
4602 {
4603 int error;
4604
4605 PMAP_LOCK(kernel_pmap);
4606 error = pmap_change_attr_locked(va, size, mode);
4607 PMAP_UNLOCK(kernel_pmap);
4608 return (error);
4609 }
4610
4611 static int
pmap_change_attr_locked(vm_offset_t va,vm_size_t size,int mode)4612 pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode)
4613 {
4614 vm_offset_t base, offset, tmpva;
4615 pd_entry_t *l1, l1e;
4616 pd_entry_t *l2, l2e;
4617 pt_entry_t *l3, l3e;
4618
4619 PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED);
4620 base = trunc_page(va);
4621 offset = va & PAGE_MASK;
4622 size = round_page(offset + size);
4623
4624 if (!VIRT_IN_DMAP(base) &&
4625 !(base >= VM_MIN_KERNEL_ADDRESS && base < VM_MAX_KERNEL_ADDRESS))
4626 return (EINVAL);
4627
4628 for (tmpva = base; tmpva < base + size; ) {
4629 l1 = pmap_l1(kernel_pmap, tmpva);
4630 if (l1 == NULL || ((l1e = pmap_load(l1)) & PTE_V) == 0)
4631 return (EINVAL);
4632 if ((l1e & PTE_RWX) != 0) {
4633 /*
4634 * TODO: Demote if attributes don't match and there
4635 * isn't an L1 page left in the range, and update the
4636 * L1 entry if the attributes don't match but there is
4637 * an L1 page left in the range, once we support the
4638 * upcoming Svpbmt extension.
4639 */
4640 tmpva = (tmpva & ~L1_OFFSET) + L1_SIZE;
4641 continue;
4642 }
4643 l2 = pmap_l1_to_l2(l1, tmpva);
4644 if (l2 == NULL || ((l2e = pmap_load(l2)) & PTE_V) == 0)
4645 return (EINVAL);
4646 if ((l2e & PTE_RWX) != 0) {
4647 /*
4648 * TODO: Demote if attributes don't match and there
4649 * isn't an L2 page left in the range, and update the
4650 * L2 entry if the attributes don't match but there is
4651 * an L2 page left in the range, once we support the
4652 * upcoming Svpbmt extension.
4653 */
4654 tmpva = (tmpva & ~L2_OFFSET) + L2_SIZE;
4655 continue;
4656 }
4657 l3 = pmap_l2_to_l3(l2, tmpva);
4658 if (l3 == NULL || ((l3e = pmap_load(l3)) & PTE_V) == 0)
4659 return (EINVAL);
4660 /*
4661 * TODO: Update the L3 entry if the attributes don't match once
4662 * we support the upcoming Svpbmt extension.
4663 */
4664 tmpva += PAGE_SIZE;
4665 }
4666
4667 return (0);
4668 }
4669
4670 /*
4671 * Perform the pmap work for mincore(2). If the page is not both referenced and
4672 * modified by this pmap, returns its physical address so that the caller can
4673 * find other mappings.
4674 */
4675 int
pmap_mincore(pmap_t pmap,vm_offset_t addr,vm_paddr_t * pap)4676 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
4677 {
4678 pt_entry_t *l2, *l3, tpte;
4679 vm_paddr_t pa;
4680 int val;
4681 bool managed;
4682
4683 PMAP_LOCK(pmap);
4684 l2 = pmap_l2(pmap, addr);
4685 if (l2 != NULL && ((tpte = pmap_load(l2)) & PTE_V) != 0) {
4686 if ((tpte & PTE_RWX) != 0) {
4687 pa = PTE_TO_PHYS(tpte) | (addr & L2_OFFSET);
4688 val = MINCORE_INCORE | MINCORE_PSIND(1);
4689 } else {
4690 l3 = pmap_l2_to_l3(l2, addr);
4691 tpte = pmap_load(l3);
4692 if ((tpte & PTE_V) == 0) {
4693 PMAP_UNLOCK(pmap);
4694 return (0);
4695 }
4696 pa = PTE_TO_PHYS(tpte) | (addr & L3_OFFSET);
4697 val = MINCORE_INCORE;
4698 }
4699
4700 if ((tpte & PTE_D) != 0)
4701 val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
4702 if ((tpte & PTE_A) != 0)
4703 val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
4704 managed = (tpte & PTE_SW_MANAGED) == PTE_SW_MANAGED;
4705 } else {
4706 managed = false;
4707 val = 0;
4708 }
4709 if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
4710 (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) {
4711 *pap = pa;
4712 }
4713 PMAP_UNLOCK(pmap);
4714 return (val);
4715 }
4716
4717 void
pmap_activate_sw(struct thread * td)4718 pmap_activate_sw(struct thread *td)
4719 {
4720 pmap_t oldpmap, pmap;
4721 u_int hart;
4722
4723 oldpmap = PCPU_GET(curpmap);
4724 pmap = vmspace_pmap(td->td_proc->p_vmspace);
4725 if (pmap == oldpmap)
4726 return;
4727 csr_write(satp, pmap->pm_satp);
4728
4729 hart = PCPU_GET(hart);
4730 #ifdef SMP
4731 CPU_SET_ATOMIC(hart, &pmap->pm_active);
4732 CPU_CLR_ATOMIC(hart, &oldpmap->pm_active);
4733 #else
4734 CPU_SET(hart, &pmap->pm_active);
4735 CPU_CLR(hart, &oldpmap->pm_active);
4736 #endif
4737 PCPU_SET(curpmap, pmap);
4738
4739 sfence_vma();
4740 }
4741
4742 void
pmap_activate(struct thread * td)4743 pmap_activate(struct thread *td)
4744 {
4745
4746 critical_enter();
4747 pmap_activate_sw(td);
4748 critical_exit();
4749 }
4750
4751 void
pmap_activate_boot(pmap_t pmap)4752 pmap_activate_boot(pmap_t pmap)
4753 {
4754 u_int hart;
4755
4756 hart = PCPU_GET(hart);
4757 #ifdef SMP
4758 CPU_SET_ATOMIC(hart, &pmap->pm_active);
4759 #else
4760 CPU_SET(hart, &pmap->pm_active);
4761 #endif
4762 PCPU_SET(curpmap, pmap);
4763 }
4764
4765 void
pmap_active_cpus(pmap_t pmap,cpuset_t * res)4766 pmap_active_cpus(pmap_t pmap, cpuset_t *res)
4767 {
4768 *res = pmap->pm_active;
4769 }
4770
4771 void
pmap_sync_icache(pmap_t pmap,vm_offset_t va,vm_size_t sz)4772 pmap_sync_icache(pmap_t pmap, vm_offset_t va, vm_size_t sz)
4773 {
4774 cpuset_t mask;
4775
4776 /*
4777 * From the RISC-V User-Level ISA V2.2:
4778 *
4779 * "To make a store to instruction memory visible to all
4780 * RISC-V harts, the writing hart has to execute a data FENCE
4781 * before requesting that all remote RISC-V harts execute a
4782 * FENCE.I."
4783 *
4784 * However, this is slightly misleading; we still need to
4785 * perform a FENCE.I for the local hart, as FENCE does nothing
4786 * for its icache. FENCE.I alone is also sufficient for the
4787 * local hart.
4788 */
4789 sched_pin();
4790 mask = all_harts;
4791 CPU_CLR(PCPU_GET(hart), &mask);
4792 fence_i();
4793 if (!CPU_EMPTY(&mask) && smp_started) {
4794 fence();
4795 sbi_remote_fence_i(mask.__bits);
4796 }
4797 sched_unpin();
4798 }
4799
4800 /*
4801 * Increase the starting virtual address of the given mapping if a
4802 * different alignment might result in more superpage mappings.
4803 */
4804 void
pmap_align_superpage(vm_object_t object,vm_ooffset_t offset,vm_offset_t * addr,vm_size_t size)4805 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
4806 vm_offset_t *addr, vm_size_t size)
4807 {
4808 vm_offset_t superpage_offset;
4809
4810 if (size < L2_SIZE)
4811 return;
4812 if (object != NULL && (object->flags & OBJ_COLORED) != 0)
4813 offset += ptoa(object->pg_color);
4814 superpage_offset = offset & L2_OFFSET;
4815 if (size - ((L2_SIZE - superpage_offset) & L2_OFFSET) < L2_SIZE ||
4816 (*addr & L2_OFFSET) == superpage_offset)
4817 return;
4818 if ((*addr & L2_OFFSET) < superpage_offset)
4819 *addr = (*addr & ~L2_OFFSET) + superpage_offset;
4820 else
4821 *addr = ((*addr + L2_OFFSET) & ~L2_OFFSET) + superpage_offset;
4822 }
4823
4824 /**
4825 * Get the kernel virtual address of a set of physical pages. If there are
4826 * physical addresses not covered by the DMAP perform a transient mapping
4827 * that will be removed when calling pmap_unmap_io_transient.
4828 *
4829 * \param page The pages the caller wishes to obtain the virtual
4830 * address on the kernel memory map.
4831 * \param vaddr On return contains the kernel virtual memory address
4832 * of the pages passed in the page parameter.
4833 * \param count Number of pages passed in.
4834 * \param can_fault true if the thread using the mapped pages can take
4835 * page faults, false otherwise.
4836 *
4837 * \returns true if the caller must call pmap_unmap_io_transient when
4838 * finished or false otherwise.
4839 *
4840 */
4841 bool
pmap_map_io_transient(vm_page_t page[],vm_offset_t vaddr[],int count,bool can_fault)4842 pmap_map_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
4843 bool can_fault)
4844 {
4845 vm_paddr_t paddr;
4846 bool needs_mapping;
4847 int error __diagused, i;
4848
4849 /*
4850 * Allocate any KVA space that we need, this is done in a separate
4851 * loop to prevent calling vmem_alloc while pinned.
4852 */
4853 needs_mapping = false;
4854 for (i = 0; i < count; i++) {
4855 paddr = VM_PAGE_TO_PHYS(page[i]);
4856 if (__predict_false(paddr >= DMAP_MAX_PHYSADDR)) {
4857 error = vmem_alloc(kernel_arena, PAGE_SIZE,
4858 M_BESTFIT | M_WAITOK, &vaddr[i]);
4859 KASSERT(error == 0, ("vmem_alloc failed: %d", error));
4860 needs_mapping = true;
4861 } else {
4862 vaddr[i] = PHYS_TO_DMAP(paddr);
4863 }
4864 }
4865
4866 /* Exit early if everything is covered by the DMAP */
4867 if (!needs_mapping)
4868 return (false);
4869
4870 if (!can_fault)
4871 sched_pin();
4872 for (i = 0; i < count; i++) {
4873 paddr = VM_PAGE_TO_PHYS(page[i]);
4874 if (paddr >= DMAP_MAX_PHYSADDR) {
4875 panic(
4876 "pmap_map_io_transient: TODO: Map out of DMAP data");
4877 }
4878 }
4879
4880 return (needs_mapping);
4881 }
4882
4883 void
pmap_unmap_io_transient(vm_page_t page[],vm_offset_t vaddr[],int count,bool can_fault)4884 pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
4885 bool can_fault)
4886 {
4887 vm_paddr_t paddr;
4888 int i;
4889
4890 if (!can_fault)
4891 sched_unpin();
4892 for (i = 0; i < count; i++) {
4893 paddr = VM_PAGE_TO_PHYS(page[i]);
4894 if (paddr >= DMAP_MAX_PHYSADDR) {
4895 panic("RISCVTODO: pmap_unmap_io_transient: Unmap data");
4896 }
4897 }
4898 }
4899
4900 boolean_t
pmap_is_valid_memattr(pmap_t pmap __unused,vm_memattr_t mode)4901 pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode)
4902 {
4903
4904 return (mode >= VM_MEMATTR_DEVICE && mode <= VM_MEMATTR_WRITE_BACK);
4905 }
4906
4907 bool
pmap_get_tables(pmap_t pmap,vm_offset_t va,pd_entry_t ** l1,pd_entry_t ** l2,pt_entry_t ** l3)4908 pmap_get_tables(pmap_t pmap, vm_offset_t va, pd_entry_t **l1, pd_entry_t **l2,
4909 pt_entry_t **l3)
4910 {
4911 pd_entry_t *l1p, *l2p;
4912
4913 /* Get l1 directory entry. */
4914 l1p = pmap_l1(pmap, va);
4915 *l1 = l1p;
4916
4917 if (l1p == NULL || (pmap_load(l1p) & PTE_V) == 0)
4918 return (false);
4919
4920 if ((pmap_load(l1p) & PTE_RX) != 0) {
4921 *l2 = NULL;
4922 *l3 = NULL;
4923 return (true);
4924 }
4925
4926 /* Get l2 directory entry. */
4927 l2p = pmap_l1_to_l2(l1p, va);
4928 *l2 = l2p;
4929
4930 if (l2p == NULL || (pmap_load(l2p) & PTE_V) == 0)
4931 return (false);
4932
4933 if ((pmap_load(l2p) & PTE_RX) != 0) {
4934 *l3 = NULL;
4935 return (true);
4936 }
4937
4938 /* Get l3 page table entry. */
4939 *l3 = pmap_l2_to_l3(l2p, va);
4940
4941 return (true);
4942 }
4943
4944 /*
4945 * Track a range of the kernel's virtual address space that is contiguous
4946 * in various mapping attributes.
4947 */
4948 struct pmap_kernel_map_range {
4949 vm_offset_t sva;
4950 pt_entry_t attrs;
4951 int l3pages;
4952 int l2pages;
4953 int l1pages;
4954 };
4955
4956 static void
sysctl_kmaps_dump(struct sbuf * sb,struct pmap_kernel_map_range * range,vm_offset_t eva)4957 sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_map_range *range,
4958 vm_offset_t eva)
4959 {
4960
4961 if (eva <= range->sva)
4962 return;
4963
4964 sbuf_printf(sb, "0x%016lx-0x%016lx r%c%c%c%c %d %d %d\n",
4965 range->sva, eva,
4966 (range->attrs & PTE_W) == PTE_W ? 'w' : '-',
4967 (range->attrs & PTE_X) == PTE_X ? 'x' : '-',
4968 (range->attrs & PTE_U) == PTE_U ? 'u' : 's',
4969 (range->attrs & PTE_G) == PTE_G ? 'g' : '-',
4970 range->l1pages, range->l2pages, range->l3pages);
4971
4972 /* Reset to sentinel value. */
4973 range->sva = 0xfffffffffffffffful;
4974 }
4975
4976 /*
4977 * Determine whether the attributes specified by a page table entry match those
4978 * being tracked by the current range.
4979 */
4980 static bool
sysctl_kmaps_match(struct pmap_kernel_map_range * range,pt_entry_t attrs)4981 sysctl_kmaps_match(struct pmap_kernel_map_range *range, pt_entry_t attrs)
4982 {
4983
4984 return (range->attrs == attrs);
4985 }
4986
4987 static void
sysctl_kmaps_reinit(struct pmap_kernel_map_range * range,vm_offset_t va,pt_entry_t attrs)4988 sysctl_kmaps_reinit(struct pmap_kernel_map_range *range, vm_offset_t va,
4989 pt_entry_t attrs)
4990 {
4991
4992 memset(range, 0, sizeof(*range));
4993 range->sva = va;
4994 range->attrs = attrs;
4995 }
4996
4997 /*
4998 * Given a leaf PTE, derive the mapping's attributes. If they do not match
4999 * those of the current run, dump the address range and its attributes, and
5000 * begin a new run.
5001 */
5002 static void
sysctl_kmaps_check(struct sbuf * sb,struct pmap_kernel_map_range * range,vm_offset_t va,pd_entry_t l1e,pd_entry_t l2e,pt_entry_t l3e)5003 sysctl_kmaps_check(struct sbuf *sb, struct pmap_kernel_map_range *range,
5004 vm_offset_t va, pd_entry_t l1e, pd_entry_t l2e, pt_entry_t l3e)
5005 {
5006 pt_entry_t attrs;
5007
5008 /* The PTE global bit is inherited by lower levels. */
5009 attrs = l1e & PTE_G;
5010 if ((l1e & PTE_RWX) != 0)
5011 attrs |= l1e & (PTE_RWX | PTE_U);
5012 else if (l2e != 0)
5013 attrs |= l2e & PTE_G;
5014 if ((l2e & PTE_RWX) != 0)
5015 attrs |= l2e & (PTE_RWX | PTE_U);
5016 else if (l3e != 0)
5017 attrs |= l3e & (PTE_RWX | PTE_U | PTE_G);
5018
5019 if (range->sva > va || !sysctl_kmaps_match(range, attrs)) {
5020 sysctl_kmaps_dump(sb, range, va);
5021 sysctl_kmaps_reinit(range, va, attrs);
5022 }
5023 }
5024
5025 static int
sysctl_kmaps(SYSCTL_HANDLER_ARGS)5026 sysctl_kmaps(SYSCTL_HANDLER_ARGS)
5027 {
5028 struct pmap_kernel_map_range range;
5029 struct sbuf sbuf, *sb;
5030 pd_entry_t l1e, *l2, l2e;
5031 pt_entry_t *l3, l3e;
5032 vm_offset_t sva;
5033 vm_paddr_t pa;
5034 int error, i, j, k;
5035
5036 error = sysctl_wire_old_buffer(req, 0);
5037 if (error != 0)
5038 return (error);
5039 sb = &sbuf;
5040 sbuf_new_for_sysctl(sb, NULL, PAGE_SIZE, req);
5041
5042 /* Sentinel value. */
5043 range.sva = 0xfffffffffffffffful;
5044
5045 /*
5046 * Iterate over the kernel page tables without holding the kernel pmap
5047 * lock. Kernel page table pages are never freed, so at worst we will
5048 * observe inconsistencies in the output.
5049 */
5050 sva = VM_MIN_KERNEL_ADDRESS;
5051 for (i = pmap_l1_index(sva); i < Ln_ENTRIES; i++) {
5052 if (i == pmap_l1_index(DMAP_MIN_ADDRESS))
5053 sbuf_printf(sb, "\nDirect map:\n");
5054 else if (i == pmap_l1_index(VM_MIN_KERNEL_ADDRESS))
5055 sbuf_printf(sb, "\nKernel map:\n");
5056
5057 l1e = kernel_pmap->pm_top[i];
5058 if ((l1e & PTE_V) == 0) {
5059 sysctl_kmaps_dump(sb, &range, sva);
5060 sva += L1_SIZE;
5061 continue;
5062 }
5063 if ((l1e & PTE_RWX) != 0) {
5064 sysctl_kmaps_check(sb, &range, sva, l1e, 0, 0);
5065 range.l1pages++;
5066 sva += L1_SIZE;
5067 continue;
5068 }
5069 pa = PTE_TO_PHYS(l1e);
5070 l2 = (pd_entry_t *)PHYS_TO_DMAP(pa);
5071
5072 for (j = pmap_l2_index(sva); j < Ln_ENTRIES; j++) {
5073 l2e = l2[j];
5074 if ((l2e & PTE_V) == 0) {
5075 sysctl_kmaps_dump(sb, &range, sva);
5076 sva += L2_SIZE;
5077 continue;
5078 }
5079 if ((l2e & PTE_RWX) != 0) {
5080 sysctl_kmaps_check(sb, &range, sva, l1e, l2e, 0);
5081 range.l2pages++;
5082 sva += L2_SIZE;
5083 continue;
5084 }
5085 pa = PTE_TO_PHYS(l2e);
5086 l3 = (pd_entry_t *)PHYS_TO_DMAP(pa);
5087
5088 for (k = pmap_l3_index(sva); k < Ln_ENTRIES; k++,
5089 sva += L3_SIZE) {
5090 l3e = l3[k];
5091 if ((l3e & PTE_V) == 0) {
5092 sysctl_kmaps_dump(sb, &range, sva);
5093 continue;
5094 }
5095 sysctl_kmaps_check(sb, &range, sva,
5096 l1e, l2e, l3e);
5097 range.l3pages++;
5098 }
5099 }
5100 }
5101
5102 error = sbuf_finish(sb);
5103 sbuf_delete(sb);
5104 return (error);
5105 }
5106 SYSCTL_OID(_vm_pmap, OID_AUTO, kernel_maps,
5107 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_SKIP,
5108 NULL, 0, sysctl_kmaps, "A",
5109 "Dump kernel address layout");
5110