xref: /freebsd-14.2/sys/riscv/riscv/pmap.c (revision 227b486d)
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