]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/arm64/arm64/pmap.c
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / sys / arm64 / arm64 / pmap.c
1 /*-
2  * Copyright (c) 1991 Regents of the University of California.
3  * All rights reserved.
4  * Copyright (c) 1994 John S. Dyson
5  * All rights reserved.
6  * Copyright (c) 1994 David Greenman
7  * All rights reserved.
8  * Copyright (c) 2003 Peter Wemm
9  * All rights reserved.
10  * Copyright (c) 2005-2010 Alan L. Cox <alc@cs.rice.edu>
11  * All rights reserved.
12  * Copyright (c) 2014 Andrew Turner
13  * All rights reserved.
14  * Copyright (c) 2014-2016 The FreeBSD Foundation
15  * All rights reserved.
16  *
17  * This code is derived from software contributed to Berkeley by
18  * the Systems Programming Group of the University of Utah Computer
19  * Science Department and William Jolitz of UUNET Technologies Inc.
20  *
21  * This software was developed by Andrew Turner under sponsorship from
22  * the FreeBSD Foundation.
23  *
24  * Redistribution and use in source and binary forms, with or without
25  * modification, are permitted provided that the following conditions
26  * are met:
27  * 1. Redistributions of source code must retain the above copyright
28  *    notice, this list of conditions and the following disclaimer.
29  * 2. Redistributions in binary form must reproduce the above copyright
30  *    notice, this list of conditions and the following disclaimer in the
31  *    documentation and/or other materials provided with the distribution.
32  * 3. All advertising materials mentioning features or use of this software
33  *    must display the following acknowledgement:
34  *      This product includes software developed by the University of
35  *      California, Berkeley and its contributors.
36  * 4. Neither the name of the University nor the names of its contributors
37  *    may be used to endorse or promote products derived from this software
38  *    without specific prior written permission.
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
53  */
54 /*-
55  * Copyright (c) 2003 Networks Associates Technology, Inc.
56  * All rights reserved.
57  *
58  * This software was developed for the FreeBSD Project by Jake Burkholder,
59  * Safeport Network Services, and Network Associates Laboratories, the
60  * Security Research Division of Network Associates, Inc. under
61  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
62  * CHATS research program.
63  *
64  * Redistribution and use in source and binary forms, with or without
65  * modification, are permitted provided that the following conditions
66  * are met:
67  * 1. Redistributions of source code must retain the above copyright
68  *    notice, this list of conditions and the following disclaimer.
69  * 2. Redistributions in binary form must reproduce the above copyright
70  *    notice, this list of conditions and the following disclaimer in the
71  *    documentation and/or other materials provided with the distribution.
72  *
73  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
74  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
76  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
77  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
78  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
79  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
80  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
81  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
82  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
83  * SUCH DAMAGE.
84  */
85
86 #include <sys/cdefs.h>
87 __FBSDID("$FreeBSD$");
88
89 /*
90  *      Manages physical address maps.
91  *
92  *      Since the information managed by this module is
93  *      also stored by the logical address mapping module,
94  *      this module may throw away valid virtual-to-physical
95  *      mappings at almost any time.  However, invalidations
96  *      of virtual-to-physical mappings must be done as
97  *      requested.
98  *
99  *      In order to cope with hardware architectures which
100  *      make virtual-to-physical map invalidates expensive,
101  *      this module may delay invalidate or reduced protection
102  *      operations until such time as they are actually
103  *      necessary.  This module is given full information as
104  *      to which processors are currently using which maps,
105  *      and to when physical maps must be made correct.
106  */
107
108 #include "opt_vm.h"
109
110 #include <sys/param.h>
111 #include <sys/bitstring.h>
112 #include <sys/bus.h>
113 #include <sys/systm.h>
114 #include <sys/kernel.h>
115 #include <sys/ktr.h>
116 #include <sys/limits.h>
117 #include <sys/lock.h>
118 #include <sys/malloc.h>
119 #include <sys/mman.h>
120 #include <sys/msgbuf.h>
121 #include <sys/mutex.h>
122 #include <sys/physmem.h>
123 #include <sys/proc.h>
124 #include <sys/rwlock.h>
125 #include <sys/sbuf.h>
126 #include <sys/sx.h>
127 #include <sys/vmem.h>
128 #include <sys/vmmeter.h>
129 #include <sys/sched.h>
130 #include <sys/sysctl.h>
131 #include <sys/_unrhdr.h>
132 #include <sys/smp.h>
133
134 #include <vm/vm.h>
135 #include <vm/vm_param.h>
136 #include <vm/vm_kern.h>
137 #include <vm/vm_page.h>
138 #include <vm/vm_map.h>
139 #include <vm/vm_object.h>
140 #include <vm/vm_extern.h>
141 #include <vm/vm_pageout.h>
142 #include <vm/vm_pager.h>
143 #include <vm/vm_phys.h>
144 #include <vm/vm_radix.h>
145 #include <vm/vm_reserv.h>
146 #include <vm/uma.h>
147
148 #include <machine/machdep.h>
149 #include <machine/md_var.h>
150 #include <machine/pcb.h>
151
152 #define PMAP_ASSERT_STAGE1(pmap)        MPASS((pmap)->pm_stage == PM_STAGE1)
153 #define PMAP_ASSERT_STAGE2(pmap)        MPASS((pmap)->pm_stage == PM_STAGE2)
154
155 #define NL0PG           (PAGE_SIZE/(sizeof (pd_entry_t)))
156 #define NL1PG           (PAGE_SIZE/(sizeof (pd_entry_t)))
157 #define NL2PG           (PAGE_SIZE/(sizeof (pd_entry_t)))
158 #define NL3PG           (PAGE_SIZE/(sizeof (pt_entry_t)))
159
160 #define NUL0E           L0_ENTRIES
161 #define NUL1E           (NUL0E * NL1PG)
162 #define NUL2E           (NUL1E * NL2PG)
163
164 #if !defined(DIAGNOSTIC)
165 #ifdef __GNUC_GNU_INLINE__
166 #define PMAP_INLINE     __attribute__((__gnu_inline__)) inline
167 #else
168 #define PMAP_INLINE     extern inline
169 #endif
170 #else
171 #define PMAP_INLINE
172 #endif
173
174 #ifdef PV_STATS
175 #define PV_STAT(x)      do { x ; } while (0)
176 #else
177 #define PV_STAT(x)      do { } while (0)
178 #endif
179
180 #define pmap_l0_pindex(v)       (NUL2E + NUL1E + ((v) >> L0_SHIFT))
181 #define pmap_l1_pindex(v)       (NUL2E + ((v) >> L1_SHIFT))
182 #define pmap_l2_pindex(v)       ((v) >> L2_SHIFT)
183
184 static struct md_page *
185 pa_to_pvh(vm_paddr_t pa)
186 {
187         struct vm_phys_seg *seg;
188         int segind;
189
190         for (segind = 0; segind < vm_phys_nsegs; segind++) {
191                 seg = &vm_phys_segs[segind];
192                 if (pa >= seg->start && pa < seg->end)
193                         return ((struct md_page *)seg->md_first +
194                             pmap_l2_pindex(pa) - pmap_l2_pindex(seg->start));
195         }
196         panic("pa 0x%jx not within vm_phys_segs", (uintmax_t)pa);
197 }
198
199 static struct md_page *
200 page_to_pvh(vm_page_t m)
201 {
202         struct vm_phys_seg *seg;
203
204         seg = &vm_phys_segs[m->segind];
205         return ((struct md_page *)seg->md_first +
206             pmap_l2_pindex(VM_PAGE_TO_PHYS(m)) - pmap_l2_pindex(seg->start));
207 }
208
209 #define NPV_LIST_LOCKS  MAXCPU
210
211 #define PHYS_TO_PV_LIST_LOCK(pa)        \
212                         (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS])
213
214 #define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa)  do {    \
215         struct rwlock **_lockp = (lockp);               \
216         struct rwlock *_new_lock;                       \
217                                                         \
218         _new_lock = PHYS_TO_PV_LIST_LOCK(pa);           \
219         if (_new_lock != *_lockp) {                     \
220                 if (*_lockp != NULL)                    \
221                         rw_wunlock(*_lockp);            \
222                 *_lockp = _new_lock;                    \
223                 rw_wlock(*_lockp);                      \
224         }                                               \
225 } while (0)
226
227 #define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m)        \
228                         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
229
230 #define RELEASE_PV_LIST_LOCK(lockp)             do {    \
231         struct rwlock **_lockp = (lockp);               \
232                                                         \
233         if (*_lockp != NULL) {                          \
234                 rw_wunlock(*_lockp);                    \
235                 *_lockp = NULL;                         \
236         }                                               \
237 } while (0)
238
239 #define VM_PAGE_TO_PV_LIST_LOCK(m)      \
240                         PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
241
242 /*
243  * The presence of this flag indicates that the mapping is writeable.
244  * If the ATTR_S1_AP_RO bit is also set, then the mapping is clean, otherwise
245  * it is dirty.  This flag may only be set on managed mappings.
246  *
247  * The DBM bit is reserved on ARMv8.0 but it seems we can safely treat it
248  * as a software managed bit.
249  */
250 #define ATTR_SW_DBM     ATTR_DBM
251
252 struct pmap kernel_pmap_store;
253
254 /* Used for mapping ACPI memory before VM is initialized */
255 #define PMAP_PREINIT_MAPPING_COUNT      32
256 #define PMAP_PREINIT_MAPPING_SIZE       (PMAP_PREINIT_MAPPING_COUNT * L2_SIZE)
257 static vm_offset_t preinit_map_va;      /* Start VA of pre-init mapping space */
258 static int vm_initialized = 0;          /* No need to use pre-init maps when set */
259
260 /*
261  * Reserve a few L2 blocks starting from 'preinit_map_va' pointer.
262  * Always map entire L2 block for simplicity.
263  * VA of L2 block = preinit_map_va + i * L2_SIZE
264  */
265 static struct pmap_preinit_mapping {
266         vm_paddr_t      pa;
267         vm_offset_t     va;
268         vm_size_t       size;
269 } pmap_preinit_mapping[PMAP_PREINIT_MAPPING_COUNT];
270
271 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
272 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
273 vm_offset_t kernel_vm_end = 0;
274
275 /*
276  * Data for the pv entry allocation mechanism.
277  */
278 static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
279 static struct mtx pv_chunks_mutex;
280 static struct rwlock pv_list_locks[NPV_LIST_LOCKS];
281 static struct md_page *pv_table;
282 static struct md_page pv_dummy;
283
284 vm_paddr_t dmap_phys_base;      /* The start of the dmap region */
285 vm_paddr_t dmap_phys_max;       /* The limit of the dmap region */
286 vm_offset_t dmap_max_addr;      /* The virtual address limit of the dmap */
287
288 /* This code assumes all L1 DMAP entries will be used */
289 CTASSERT((DMAP_MIN_ADDRESS  & ~L0_OFFSET) == DMAP_MIN_ADDRESS);
290 CTASSERT((DMAP_MAX_ADDRESS  & ~L0_OFFSET) == DMAP_MAX_ADDRESS);
291
292 #define DMAP_TABLES     ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT)
293 extern pt_entry_t pagetable_dmap[];
294
295 #define PHYSMAP_SIZE    (2 * (VM_PHYSSEG_MAX - 1))
296 static vm_paddr_t physmap[PHYSMAP_SIZE];
297 static u_int physmap_idx;
298
299 static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
300     "VM/pmap parameters");
301
302 /*
303  * This ASID allocator uses a bit vector ("asid_set") to remember which ASIDs
304  * that it has currently allocated to a pmap, a cursor ("asid_next") to
305  * optimize its search for a free ASID in the bit vector, and an epoch number
306  * ("asid_epoch") to indicate when it has reclaimed all previously allocated
307  * ASIDs that are not currently active on a processor.
308  *
309  * The current epoch number is always in the range [0, INT_MAX).  Negative
310  * numbers and INT_MAX are reserved for special cases that are described
311  * below.
312  */
313 struct asid_set {
314         int asid_bits;
315         bitstr_t *asid_set;
316         int asid_set_size;
317         int asid_next;
318         int asid_epoch;
319         struct mtx asid_set_mutex;
320 };
321
322 static struct asid_set asids;
323 static struct asid_set vmids;
324
325 static SYSCTL_NODE(_vm_pmap, OID_AUTO, asid, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
326     "ASID allocator");
327 SYSCTL_INT(_vm_pmap_asid, OID_AUTO, bits, CTLFLAG_RD, &asids.asid_bits, 0,
328     "The number of bits in an ASID");
329 SYSCTL_INT(_vm_pmap_asid, OID_AUTO, next, CTLFLAG_RD, &asids.asid_next, 0,
330     "The last allocated ASID plus one");
331 SYSCTL_INT(_vm_pmap_asid, OID_AUTO, epoch, CTLFLAG_RD, &asids.asid_epoch, 0,
332     "The current epoch number");
333
334 static SYSCTL_NODE(_vm_pmap, OID_AUTO, vmid, CTLFLAG_RD, 0, "VMID allocator");
335 SYSCTL_INT(_vm_pmap_vmid, OID_AUTO, bits, CTLFLAG_RD, &vmids.asid_bits, 0,
336     "The number of bits in an VMID");
337 SYSCTL_INT(_vm_pmap_vmid, OID_AUTO, next, CTLFLAG_RD, &vmids.asid_next, 0,
338     "The last allocated VMID plus one");
339 SYSCTL_INT(_vm_pmap_vmid, OID_AUTO, epoch, CTLFLAG_RD, &vmids.asid_epoch, 0,
340     "The current epoch number");
341
342 void (*pmap_clean_stage2_tlbi)(void);
343 void (*pmap_invalidate_vpipt_icache)(void);
344
345 /*
346  * A pmap's cookie encodes an ASID and epoch number.  Cookies for reserved
347  * ASIDs have a negative epoch number, specifically, INT_MIN.  Cookies for
348  * dynamically allocated ASIDs have a non-negative epoch number.
349  *
350  * An invalid ASID is represented by -1.
351  *
352  * There are two special-case cookie values: (1) COOKIE_FROM(-1, INT_MIN),
353  * which indicates that an ASID should never be allocated to the pmap, and
354  * (2) COOKIE_FROM(-1, INT_MAX), which indicates that an ASID should be
355  * allocated when the pmap is next activated.
356  */
357 #define COOKIE_FROM(asid, epoch)        ((long)((u_int)(asid) | \
358                                             ((u_long)(epoch) << 32)))
359 #define COOKIE_TO_ASID(cookie)          ((int)(cookie))
360 #define COOKIE_TO_EPOCH(cookie)         ((int)((u_long)(cookie) >> 32))
361
362 static int superpages_enabled = 1;
363 SYSCTL_INT(_vm_pmap, OID_AUTO, superpages_enabled,
364     CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &superpages_enabled, 0,
365     "Are large page mappings enabled?");
366
367 /*
368  * Internal flags for pmap_enter()'s helper functions.
369  */
370 #define PMAP_ENTER_NORECLAIM    0x1000000       /* Don't reclaim PV entries. */
371 #define PMAP_ENTER_NOREPLACE    0x2000000       /* Don't replace mappings. */
372
373 static void     free_pv_chunk(struct pv_chunk *pc);
374 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
375 static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp);
376 static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp);
377 static void     pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
378 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
379                     vm_offset_t va);
380
381 static void pmap_abort_ptp(pmap_t pmap, vm_offset_t va, vm_page_t mpte);
382 static bool pmap_activate_int(pmap_t pmap);
383 static void pmap_alloc_asid(pmap_t pmap);
384 static int pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode);
385 static pt_entry_t *pmap_demote_l1(pmap_t pmap, pt_entry_t *l1, vm_offset_t va);
386 static pt_entry_t *pmap_demote_l2_locked(pmap_t pmap, pt_entry_t *l2,
387     vm_offset_t va, struct rwlock **lockp);
388 static pt_entry_t *pmap_demote_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va);
389 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
390     vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp);
391 static int pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2,
392     u_int flags, vm_page_t m, struct rwlock **lockp);
393 static int pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
394     pd_entry_t l1e, struct spglist *free, struct rwlock **lockp);
395 static int pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t sva,
396     pd_entry_t l2e, struct spglist *free, struct rwlock **lockp);
397 static void pmap_reset_asid_set(pmap_t pmap);
398 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
399     vm_page_t m, struct rwlock **lockp);
400
401 static vm_page_t _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex,
402                 struct rwlock **lockp);
403
404 static void _pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m,
405     struct spglist *free);
406 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t, struct spglist *);
407 static __inline vm_page_t pmap_remove_pt_page(pmap_t pmap, vm_offset_t va);
408
409 /*
410  * These load the old table data and store the new value.
411  * They need to be atomic as the System MMU may write to the table at
412  * the same time as the CPU.
413  */
414 #define pmap_clear(table)               atomic_store_64(table, 0)
415 #define pmap_clear_bits(table, bits)    atomic_clear_64(table, bits)
416 #define pmap_load(table)                (*table)
417 #define pmap_load_clear(table)          atomic_swap_64(table, 0)
418 #define pmap_load_store(table, entry)   atomic_swap_64(table, entry)
419 #define pmap_set_bits(table, bits)      atomic_set_64(table, bits)
420 #define pmap_store(table, entry)        atomic_store_64(table, entry)
421
422 /********************/
423 /* Inline functions */
424 /********************/
425
426 static __inline void
427 pagecopy(void *s, void *d)
428 {
429
430         memcpy(d, s, PAGE_SIZE);
431 }
432
433 static __inline pd_entry_t *
434 pmap_l0(pmap_t pmap, vm_offset_t va)
435 {
436
437         return (&pmap->pm_l0[pmap_l0_index(va)]);
438 }
439
440 static __inline pd_entry_t *
441 pmap_l0_to_l1(pd_entry_t *l0, vm_offset_t va)
442 {
443         pd_entry_t *l1;
444
445         l1 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l0) & ~ATTR_MASK);
446         return (&l1[pmap_l1_index(va)]);
447 }
448
449 static __inline pd_entry_t *
450 pmap_l1(pmap_t pmap, vm_offset_t va)
451 {
452         pd_entry_t *l0;
453
454         l0 = pmap_l0(pmap, va);
455         if ((pmap_load(l0) & ATTR_DESCR_MASK) != L0_TABLE)
456                 return (NULL);
457
458         return (pmap_l0_to_l1(l0, va));
459 }
460
461 static __inline pd_entry_t *
462 pmap_l1_to_l2(pd_entry_t *l1p, vm_offset_t va)
463 {
464         pd_entry_t l1, *l2p;
465
466         l1 = pmap_load(l1p);
467
468         /*
469          * The valid bit may be clear if pmap_update_entry() is concurrently
470          * modifying the entry, so for KVA only the entry type may be checked.
471          */
472         KASSERT(va >= VM_MAX_USER_ADDRESS || (l1 & ATTR_DESCR_VALID) != 0,
473             ("%s: L1 entry %#lx for %#lx is invalid", __func__, l1, va));
474         KASSERT((l1 & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_TABLE,
475             ("%s: L1 entry %#lx for %#lx is a leaf", __func__, l1, va));
476         l2p = (pd_entry_t *)PHYS_TO_DMAP(l1 & ~ATTR_MASK);
477         return (&l2p[pmap_l2_index(va)]);
478 }
479
480 static __inline pd_entry_t *
481 pmap_l2(pmap_t pmap, vm_offset_t va)
482 {
483         pd_entry_t *l1;
484
485         l1 = pmap_l1(pmap, va);
486         if ((pmap_load(l1) & ATTR_DESCR_MASK) != L1_TABLE)
487                 return (NULL);
488
489         return (pmap_l1_to_l2(l1, va));
490 }
491
492 static __inline pt_entry_t *
493 pmap_l2_to_l3(pd_entry_t *l2p, vm_offset_t va)
494 {
495         pd_entry_t l2;
496         pt_entry_t *l3p;
497
498         l2 = pmap_load(l2p);
499
500         /*
501          * The valid bit may be clear if pmap_update_entry() is concurrently
502          * modifying the entry, so for KVA only the entry type may be checked.
503          */
504         KASSERT(va >= VM_MAX_USER_ADDRESS || (l2 & ATTR_DESCR_VALID) != 0,
505             ("%s: L2 entry %#lx for %#lx is invalid", __func__, l2, va));
506         KASSERT((l2 & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_TABLE,
507             ("%s: L2 entry %#lx for %#lx is a leaf", __func__, l2, va));
508         l3p = (pt_entry_t *)PHYS_TO_DMAP(l2 & ~ATTR_MASK);
509         return (&l3p[pmap_l3_index(va)]);
510 }
511
512 /*
513  * Returns the lowest valid pde for a given virtual address.
514  * The next level may or may not point to a valid page or block.
515  */
516 static __inline pd_entry_t *
517 pmap_pde(pmap_t pmap, vm_offset_t va, int *level)
518 {
519         pd_entry_t *l0, *l1, *l2, desc;
520
521         l0 = pmap_l0(pmap, va);
522         desc = pmap_load(l0) & ATTR_DESCR_MASK;
523         if (desc != L0_TABLE) {
524                 *level = -1;
525                 return (NULL);
526         }
527
528         l1 = pmap_l0_to_l1(l0, va);
529         desc = pmap_load(l1) & ATTR_DESCR_MASK;
530         if (desc != L1_TABLE) {
531                 *level = 0;
532                 return (l0);
533         }
534
535         l2 = pmap_l1_to_l2(l1, va);
536         desc = pmap_load(l2) & ATTR_DESCR_MASK;
537         if (desc != L2_TABLE) {
538                 *level = 1;
539                 return (l1);
540         }
541
542         *level = 2;
543         return (l2);
544 }
545
546 /*
547  * Returns the lowest valid pte block or table entry for a given virtual
548  * address. If there are no valid entries return NULL and set the level to
549  * the first invalid level.
550  */
551 static __inline pt_entry_t *
552 pmap_pte(pmap_t pmap, vm_offset_t va, int *level)
553 {
554         pd_entry_t *l1, *l2, desc;
555         pt_entry_t *l3;
556
557         l1 = pmap_l1(pmap, va);
558         if (l1 == NULL) {
559                 *level = 0;
560                 return (NULL);
561         }
562         desc = pmap_load(l1) & ATTR_DESCR_MASK;
563         if (desc == L1_BLOCK) {
564                 *level = 1;
565                 return (l1);
566         }
567
568         if (desc != L1_TABLE) {
569                 *level = 1;
570                 return (NULL);
571         }
572
573         l2 = pmap_l1_to_l2(l1, va);
574         desc = pmap_load(l2) & ATTR_DESCR_MASK;
575         if (desc == L2_BLOCK) {
576                 *level = 2;
577                 return (l2);
578         }
579
580         if (desc != L2_TABLE) {
581                 *level = 2;
582                 return (NULL);
583         }
584
585         *level = 3;
586         l3 = pmap_l2_to_l3(l2, va);
587         if ((pmap_load(l3) & ATTR_DESCR_MASK) != L3_PAGE)
588                 return (NULL);
589
590         return (l3);
591 }
592
593 bool
594 pmap_ps_enabled(pmap_t pmap __unused)
595 {
596
597         return (superpages_enabled != 0);
598 }
599
600 bool
601 pmap_get_tables(pmap_t pmap, vm_offset_t va, pd_entry_t **l0, pd_entry_t **l1,
602     pd_entry_t **l2, pt_entry_t **l3)
603 {
604         pd_entry_t *l0p, *l1p, *l2p;
605
606         if (pmap->pm_l0 == NULL)
607                 return (false);
608
609         l0p = pmap_l0(pmap, va);
610         *l0 = l0p;
611
612         if ((pmap_load(l0p) & ATTR_DESCR_MASK) != L0_TABLE)
613                 return (false);
614
615         l1p = pmap_l0_to_l1(l0p, va);
616         *l1 = l1p;
617
618         if ((pmap_load(l1p) & ATTR_DESCR_MASK) == L1_BLOCK) {
619                 *l2 = NULL;
620                 *l3 = NULL;
621                 return (true);
622         }
623
624         if ((pmap_load(l1p) & ATTR_DESCR_MASK) != L1_TABLE)
625                 return (false);
626
627         l2p = pmap_l1_to_l2(l1p, va);
628         *l2 = l2p;
629
630         if ((pmap_load(l2p) & ATTR_DESCR_MASK) == L2_BLOCK) {
631                 *l3 = NULL;
632                 return (true);
633         }
634
635         if ((pmap_load(l2p) & ATTR_DESCR_MASK) != L2_TABLE)
636                 return (false);
637
638         *l3 = pmap_l2_to_l3(l2p, va);
639
640         return (true);
641 }
642
643 static __inline int
644 pmap_l3_valid(pt_entry_t l3)
645 {
646
647         return ((l3 & ATTR_DESCR_MASK) == L3_PAGE);
648 }
649
650 CTASSERT(L1_BLOCK == L2_BLOCK);
651
652 static pt_entry_t
653 pmap_pte_memattr(pmap_t pmap, vm_memattr_t memattr)
654 {
655         pt_entry_t val;
656
657         if (pmap->pm_stage == PM_STAGE1) {
658                 val = ATTR_S1_IDX(memattr);
659                 if (memattr == VM_MEMATTR_DEVICE)
660                         val |= ATTR_S1_XN;
661                 return (val);
662         }
663
664         val = 0;
665
666         switch (memattr) {
667         case VM_MEMATTR_DEVICE:
668                 return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_DEVICE_nGnRnE) |
669                     ATTR_S2_XN(ATTR_S2_XN_ALL));
670         case VM_MEMATTR_UNCACHEABLE:
671                 return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_NC));
672         case VM_MEMATTR_WRITE_BACK:
673                 return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_WB));
674         case VM_MEMATTR_WRITE_THROUGH:
675                 return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_WT));
676         default:
677                 panic("%s: invalid memory attribute %x", __func__, memattr);
678         }
679 }
680
681 static pt_entry_t
682 pmap_pte_prot(pmap_t pmap, vm_prot_t prot)
683 {
684         pt_entry_t val;
685
686         val = 0;
687         if (pmap->pm_stage == PM_STAGE1) {
688                 if ((prot & VM_PROT_EXECUTE) == 0)
689                         val |= ATTR_S1_XN;
690                 if ((prot & VM_PROT_WRITE) == 0)
691                         val |= ATTR_S1_AP(ATTR_S1_AP_RO);
692         } else {
693                 if ((prot & VM_PROT_WRITE) != 0)
694                         val |= ATTR_S2_S2AP(ATTR_S2_S2AP_WRITE);
695                 if ((prot & VM_PROT_READ) != 0)
696                         val |= ATTR_S2_S2AP(ATTR_S2_S2AP_READ);
697                 if ((prot & VM_PROT_EXECUTE) == 0)
698                         val |= ATTR_S2_XN(ATTR_S2_XN_ALL);
699         }
700
701         return (val);
702 }
703
704 /*
705  * Checks if the PTE is dirty.
706  */
707 static inline int
708 pmap_pte_dirty(pmap_t pmap, pt_entry_t pte)
709 {
710
711         KASSERT((pte & ATTR_SW_MANAGED) != 0, ("pte %#lx is unmanaged", pte));
712
713         if (pmap->pm_stage == PM_STAGE1) {
714                 KASSERT((pte & (ATTR_S1_AP_RW_BIT | ATTR_SW_DBM)) != 0,
715                     ("pte %#lx is writeable and missing ATTR_SW_DBM", pte));
716
717                 return ((pte & (ATTR_S1_AP_RW_BIT | ATTR_SW_DBM)) ==
718                     (ATTR_S1_AP(ATTR_S1_AP_RW) | ATTR_SW_DBM));
719         }
720
721         return ((pte & ATTR_S2_S2AP(ATTR_S2_S2AP_WRITE)) ==
722             ATTR_S2_S2AP(ATTR_S2_S2AP_WRITE));
723 }
724
725 static __inline void
726 pmap_resident_count_inc(pmap_t pmap, int count)
727 {
728
729         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
730         pmap->pm_stats.resident_count += count;
731 }
732
733 static __inline void
734 pmap_resident_count_dec(pmap_t pmap, int count)
735 {
736
737         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
738         KASSERT(pmap->pm_stats.resident_count >= count,
739             ("pmap %p resident count underflow %ld %d", pmap,
740             pmap->pm_stats.resident_count, count));
741         pmap->pm_stats.resident_count -= count;
742 }
743
744 static pt_entry_t *
745 pmap_early_page_idx(vm_offset_t l1pt, vm_offset_t va, u_int *l1_slot,
746     u_int *l2_slot)
747 {
748         pt_entry_t *l2;
749         pd_entry_t *l1;
750
751         l1 = (pd_entry_t *)l1pt;
752         *l1_slot = (va >> L1_SHIFT) & Ln_ADDR_MASK;
753
754         /* Check locore has used a table L1 map */
755         KASSERT((l1[*l1_slot] & ATTR_DESCR_MASK) == L1_TABLE,
756            ("Invalid bootstrap L1 table"));
757         /* Find the address of the L2 table */
758         l2 = (pt_entry_t *)init_pt_va;
759         *l2_slot = pmap_l2_index(va);
760
761         return (l2);
762 }
763
764 static vm_paddr_t
765 pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
766 {
767         u_int l1_slot, l2_slot;
768         pt_entry_t *l2;
769
770         l2 = pmap_early_page_idx(l1pt, va, &l1_slot, &l2_slot);
771
772         return ((l2[l2_slot] & ~ATTR_MASK) + (va & L2_OFFSET));
773 }
774
775 static vm_offset_t
776 pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa,
777     vm_offset_t freemempos)
778 {
779         pt_entry_t *l2;
780         vm_offset_t va;
781         vm_paddr_t l2_pa, pa;
782         u_int l1_slot, l2_slot, prev_l1_slot;
783         int i;
784
785         dmap_phys_base = min_pa & ~L1_OFFSET;
786         dmap_phys_max = 0;
787         dmap_max_addr = 0;
788         l2 = NULL;
789         prev_l1_slot = -1;
790
791 #define DMAP_TABLES     ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT)
792         memset(pagetable_dmap, 0, PAGE_SIZE * DMAP_TABLES);
793
794         for (i = 0; i < (physmap_idx * 2); i += 2) {
795                 pa = physmap[i] & ~L2_OFFSET;
796                 va = pa - dmap_phys_base + DMAP_MIN_ADDRESS;
797
798                 /* Create L2 mappings at the start of the region */
799                 if ((pa & L1_OFFSET) != 0) {
800                         l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
801                         if (l1_slot != prev_l1_slot) {
802                                 prev_l1_slot = l1_slot;
803                                 l2 = (pt_entry_t *)freemempos;
804                                 l2_pa = pmap_early_vtophys(kern_l1,
805                                     (vm_offset_t)l2);
806                                 freemempos += PAGE_SIZE;
807
808                                 pmap_store(&pagetable_dmap[l1_slot],
809                                     (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE);
810
811                                 memset(l2, 0, PAGE_SIZE);
812                         }
813                         KASSERT(l2 != NULL,
814                             ("pmap_bootstrap_dmap: NULL l2 map"));
815                         for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1];
816                             pa += L2_SIZE, va += L2_SIZE) {
817                                 /*
818                                  * We are on a boundary, stop to
819                                  * create a level 1 block
820                                  */
821                                 if ((pa & L1_OFFSET) == 0)
822                                         break;
823
824                                 l2_slot = pmap_l2_index(va);
825                                 KASSERT(l2_slot != 0, ("..."));
826                                 pmap_store(&l2[l2_slot],
827                                     (pa & ~L2_OFFSET) | ATTR_DEFAULT |
828                                     ATTR_S1_XN |
829                                     ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) |
830                                     L2_BLOCK);
831                         }
832                         KASSERT(va == (pa - dmap_phys_base + DMAP_MIN_ADDRESS),
833                             ("..."));
834                 }
835
836                 for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1] &&
837                     (physmap[i + 1] - pa) >= L1_SIZE;
838                     pa += L1_SIZE, va += L1_SIZE) {
839                         l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
840                         pmap_store(&pagetable_dmap[l1_slot],
841                             (pa & ~L1_OFFSET) | ATTR_DEFAULT | ATTR_S1_XN |
842                             ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | L1_BLOCK);
843                 }
844
845                 /* Create L2 mappings at the end of the region */
846                 if (pa < physmap[i + 1]) {
847                         l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
848                         if (l1_slot != prev_l1_slot) {
849                                 prev_l1_slot = l1_slot;
850                                 l2 = (pt_entry_t *)freemempos;
851                                 l2_pa = pmap_early_vtophys(kern_l1,
852                                     (vm_offset_t)l2);
853                                 freemempos += PAGE_SIZE;
854
855                                 pmap_store(&pagetable_dmap[l1_slot],
856                                     (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE);
857
858                                 memset(l2, 0, PAGE_SIZE);
859                         }
860                         KASSERT(l2 != NULL,
861                             ("pmap_bootstrap_dmap: NULL l2 map"));
862                         for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1];
863                             pa += L2_SIZE, va += L2_SIZE) {
864                                 l2_slot = pmap_l2_index(va);
865                                 pmap_store(&l2[l2_slot],
866                                     (pa & ~L2_OFFSET) | ATTR_DEFAULT |
867                                     ATTR_S1_XN |
868                                     ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) |
869                                     L2_BLOCK);
870                         }
871                 }
872
873                 if (pa > dmap_phys_max) {
874                         dmap_phys_max = pa;
875                         dmap_max_addr = va;
876                 }
877         }
878
879         cpu_tlb_flushID();
880
881         return (freemempos);
882 }
883
884 static vm_offset_t
885 pmap_bootstrap_l2(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l2_start)
886 {
887         vm_offset_t l2pt;
888         vm_paddr_t pa;
889         pd_entry_t *l1;
890         u_int l1_slot;
891
892         KASSERT((va & L1_OFFSET) == 0, ("Invalid virtual address"));
893
894         l1 = (pd_entry_t *)l1pt;
895         l1_slot = pmap_l1_index(va);
896         l2pt = l2_start;
897
898         for (; va < VM_MAX_KERNEL_ADDRESS; l1_slot++, va += L1_SIZE) {
899                 KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
900
901                 pa = pmap_early_vtophys(l1pt, l2pt);
902                 pmap_store(&l1[l1_slot],
903                     (pa & ~Ln_TABLE_MASK) | L1_TABLE);
904                 l2pt += PAGE_SIZE;
905         }
906
907         /* Clean the L2 page table */
908         memset((void *)l2_start, 0, l2pt - l2_start);
909
910         return l2pt;
911 }
912
913 static vm_offset_t
914 pmap_bootstrap_l3(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l3_start)
915 {
916         vm_offset_t l3pt;
917         vm_paddr_t pa;
918         pd_entry_t *l2;
919         u_int l2_slot;
920
921         KASSERT((va & L2_OFFSET) == 0, ("Invalid virtual address"));
922
923         l2 = pmap_l2(kernel_pmap, va);
924         l2 = (pd_entry_t *)rounddown2((uintptr_t)l2, PAGE_SIZE);
925         l2_slot = pmap_l2_index(va);
926         l3pt = l3_start;
927
928         for (; va < VM_MAX_KERNEL_ADDRESS; l2_slot++, va += L2_SIZE) {
929                 KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index"));
930
931                 pa = pmap_early_vtophys(l1pt, l3pt);
932                 pmap_store(&l2[l2_slot],
933                     (pa & ~Ln_TABLE_MASK) | ATTR_S1_UXN | L2_TABLE);
934                 l3pt += PAGE_SIZE;
935         }
936
937         /* Clean the L2 page table */
938         memset((void *)l3_start, 0, l3pt - l3_start);
939
940         return l3pt;
941 }
942
943 /*
944  *      Bootstrap the system enough to run with virtual memory.
945  */
946 void
947 pmap_bootstrap(vm_offset_t l0pt, vm_offset_t l1pt, vm_paddr_t kernstart,
948     vm_size_t kernlen)
949 {
950         vm_offset_t freemempos;
951         vm_offset_t dpcpu, msgbufpv;
952         vm_paddr_t start_pa, pa, min_pa;
953         uint64_t kern_delta;
954         int i;
955
956         /* Verify that the ASID is set through TTBR0. */
957         KASSERT((READ_SPECIALREG(tcr_el1) & TCR_A1) == 0,
958             ("pmap_bootstrap: TCR_EL1.A1 != 0"));
959
960         kern_delta = KERNBASE - kernstart;
961
962         printf("pmap_bootstrap %lx %lx %lx\n", l1pt, kernstart, kernlen);
963         printf("%lx\n", l1pt);
964         printf("%lx\n", (KERNBASE >> L1_SHIFT) & Ln_ADDR_MASK);
965
966         /* Set this early so we can use the pagetable walking functions */
967         kernel_pmap_store.pm_l0 = (pd_entry_t *)l0pt;
968         PMAP_LOCK_INIT(kernel_pmap);
969         kernel_pmap->pm_l0_paddr = l0pt - kern_delta;
970         kernel_pmap->pm_cookie = COOKIE_FROM(-1, INT_MIN);
971         kernel_pmap->pm_stage = PM_STAGE1;
972         kernel_pmap->pm_asid_set = &asids;
973
974         /* Assume the address we were loaded to is a valid physical address */
975         min_pa = KERNBASE - kern_delta;
976
977         physmap_idx = physmem_avail(physmap, nitems(physmap));
978         physmap_idx /= 2;
979
980         /*
981          * Find the minimum physical address. physmap is sorted,
982          * but may contain empty ranges.
983          */
984         for (i = 0; i < physmap_idx * 2; i += 2) {
985                 if (physmap[i] == physmap[i + 1])
986                         continue;
987                 if (physmap[i] <= min_pa)
988                         min_pa = physmap[i];
989         }
990
991         freemempos = KERNBASE + kernlen;
992         freemempos = roundup2(freemempos, PAGE_SIZE);
993
994         /* Create a direct map region early so we can use it for pa -> va */
995         freemempos = pmap_bootstrap_dmap(l1pt, min_pa, freemempos);
996
997         start_pa = pa = KERNBASE - kern_delta;
998
999         /*
1000          * Create the l2 tables up to VM_MAX_KERNEL_ADDRESS.  We assume that the
1001          * loader allocated the first and only l2 page table page used to map
1002          * the kernel, preloaded files and module metadata.
1003          */
1004         freemempos = pmap_bootstrap_l2(l1pt, KERNBASE + L1_SIZE, freemempos);
1005         /* And the l3 tables for the early devmap */
1006         freemempos = pmap_bootstrap_l3(l1pt,
1007             VM_MAX_KERNEL_ADDRESS - (PMAP_MAPDEV_EARLY_SIZE), freemempos);
1008
1009         cpu_tlb_flushID();
1010
1011 #define alloc_pages(var, np)                                            \
1012         (var) = freemempos;                                             \
1013         freemempos += (np * PAGE_SIZE);                                 \
1014         memset((char *)(var), 0, ((np) * PAGE_SIZE));
1015
1016         /* Allocate dynamic per-cpu area. */
1017         alloc_pages(dpcpu, DPCPU_SIZE / PAGE_SIZE);
1018         dpcpu_init((void *)dpcpu, 0);
1019
1020         /* Allocate memory for the msgbuf, e.g. for /sbin/dmesg */
1021         alloc_pages(msgbufpv, round_page(msgbufsize) / PAGE_SIZE);
1022         msgbufp = (void *)msgbufpv;
1023
1024         /* Reserve some VA space for early BIOS/ACPI mapping */
1025         preinit_map_va = roundup2(freemempos, L2_SIZE);
1026
1027         virtual_avail = preinit_map_va + PMAP_PREINIT_MAPPING_SIZE;
1028         virtual_avail = roundup2(virtual_avail, L1_SIZE);
1029         virtual_end = VM_MAX_KERNEL_ADDRESS - (PMAP_MAPDEV_EARLY_SIZE);
1030         kernel_vm_end = virtual_avail;
1031
1032         pa = pmap_early_vtophys(l1pt, freemempos);
1033
1034         physmem_exclude_region(start_pa, pa - start_pa, EXFLAG_NOALLOC);
1035
1036         cpu_tlb_flushID();
1037 }
1038
1039 /*
1040  *      Initialize a vm_page's machine-dependent fields.
1041  */
1042 void
1043 pmap_page_init(vm_page_t m)
1044 {
1045
1046         TAILQ_INIT(&m->md.pv_list);
1047         m->md.pv_memattr = VM_MEMATTR_WRITE_BACK;
1048 }
1049
1050 static void
1051 pmap_init_asids(struct asid_set *set, int bits)
1052 {
1053         int i;
1054
1055         set->asid_bits = bits;
1056
1057         /*
1058          * We may be too early in the overall initialization process to use
1059          * bit_alloc().
1060          */
1061         set->asid_set_size = 1 << set->asid_bits;
1062         set->asid_set = (bitstr_t *)kmem_malloc(bitstr_size(set->asid_set_size),
1063             M_WAITOK | M_ZERO);
1064         for (i = 0; i < ASID_FIRST_AVAILABLE; i++)
1065                 bit_set(set->asid_set, i);
1066         set->asid_next = ASID_FIRST_AVAILABLE;
1067         mtx_init(&set->asid_set_mutex, "asid set", NULL, MTX_SPIN);
1068 }
1069
1070 /*
1071  *      Initialize the pmap module.
1072  *      Called by vm_init, to initialize any structures that the pmap
1073  *      system needs to map virtual memory.
1074  */
1075 void
1076 pmap_init(void)
1077 {
1078         struct vm_phys_seg *seg, *next_seg;
1079         struct md_page *pvh;
1080         vm_size_t s;
1081         uint64_t mmfr1;
1082         int i, pv_npg, vmid_bits;
1083
1084         /*
1085          * Are large page mappings enabled?
1086          */
1087         TUNABLE_INT_FETCH("vm.pmap.superpages_enabled", &superpages_enabled);
1088         if (superpages_enabled) {
1089                 KASSERT(MAXPAGESIZES > 1 && pagesizes[1] == 0,
1090                     ("pmap_init: can't assign to pagesizes[1]"));
1091                 pagesizes[1] = L2_SIZE;
1092                 KASSERT(MAXPAGESIZES > 2 && pagesizes[2] == 0,
1093                     ("pmap_init: can't assign to pagesizes[2]"));
1094                 pagesizes[2] = L1_SIZE;
1095         }
1096
1097         /*
1098          * Initialize the ASID allocator.
1099          */
1100         pmap_init_asids(&asids,
1101             (READ_SPECIALREG(tcr_el1) & TCR_ASID_16) != 0 ? 16 : 8);
1102
1103         if (has_hyp()) {
1104                 mmfr1 = READ_SPECIALREG(id_aa64mmfr1_el1);
1105                 vmid_bits = 8;
1106
1107                 if (ID_AA64MMFR1_VMIDBits_VAL(mmfr1) ==
1108                     ID_AA64MMFR1_VMIDBits_16)
1109                         vmid_bits = 16;
1110                 pmap_init_asids(&vmids, vmid_bits);
1111         }
1112
1113         /*
1114          * Initialize the pv chunk list mutex.
1115          */
1116         mtx_init(&pv_chunks_mutex, "pmap pv chunk list", NULL, MTX_DEF);
1117
1118         /*
1119          * Initialize the pool of pv list locks.
1120          */
1121         for (i = 0; i < NPV_LIST_LOCKS; i++)
1122                 rw_init(&pv_list_locks[i], "pmap pv list");
1123
1124         /*
1125          * Calculate the size of the pv head table for superpages.
1126          */
1127         pv_npg = 0;
1128         for (i = 0; i < vm_phys_nsegs; i++) {
1129                 seg = &vm_phys_segs[i];
1130                 pv_npg += pmap_l2_pindex(roundup2(seg->end, L2_SIZE)) -
1131                     pmap_l2_pindex(seg->start);
1132         }
1133
1134         /*
1135          * Allocate memory for the pv head table for superpages.
1136          */
1137         s = (vm_size_t)(pv_npg * sizeof(struct md_page));
1138         s = round_page(s);
1139         pv_table = (struct md_page *)kmem_malloc(s, M_WAITOK | M_ZERO);
1140         for (i = 0; i < pv_npg; i++)
1141                 TAILQ_INIT(&pv_table[i].pv_list);
1142         TAILQ_INIT(&pv_dummy.pv_list);
1143
1144         /*
1145          * Set pointers from vm_phys_segs to pv_table.
1146          */
1147         for (i = 0, pvh = pv_table; i < vm_phys_nsegs; i++) {
1148                 seg = &vm_phys_segs[i];
1149                 seg->md_first = pvh;
1150                 pvh += pmap_l2_pindex(roundup2(seg->end, L2_SIZE)) -
1151                     pmap_l2_pindex(seg->start);
1152
1153                 /*
1154                  * If there is a following segment, and the final
1155                  * superpage of this segment and the initial superpage
1156                  * of the next segment are the same then adjust the
1157                  * pv_table entry for that next segment down by one so
1158                  * that the pv_table entries will be shared.
1159                  */
1160                 if (i + 1 < vm_phys_nsegs) {
1161                         next_seg = &vm_phys_segs[i + 1];
1162                         if (pmap_l2_pindex(roundup2(seg->end, L2_SIZE)) - 1 ==
1163                             pmap_l2_pindex(next_seg->start)) {
1164                                 pvh--;
1165                         }
1166                 }
1167         }
1168
1169         vm_initialized = 1;
1170 }
1171
1172 static SYSCTL_NODE(_vm_pmap, OID_AUTO, l2, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
1173     "2MB page mapping counters");
1174
1175 static u_long pmap_l2_demotions;
1176 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, demotions, CTLFLAG_RD,
1177     &pmap_l2_demotions, 0, "2MB page demotions");
1178
1179 static u_long pmap_l2_mappings;
1180 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, mappings, CTLFLAG_RD,
1181     &pmap_l2_mappings, 0, "2MB page mappings");
1182
1183 static u_long pmap_l2_p_failures;
1184 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, p_failures, CTLFLAG_RD,
1185     &pmap_l2_p_failures, 0, "2MB page promotion failures");
1186
1187 static u_long pmap_l2_promotions;
1188 SYSCTL_ULONG(_vm_pmap_l2, OID_AUTO, promotions, CTLFLAG_RD,
1189     &pmap_l2_promotions, 0, "2MB page promotions");
1190
1191 /*
1192  * Invalidate a single TLB entry.
1193  */
1194 static __inline void
1195 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
1196 {
1197         uint64_t r;
1198
1199         PMAP_ASSERT_STAGE1(pmap);
1200
1201         dsb(ishst);
1202         if (pmap == kernel_pmap) {
1203                 r = atop(va);
1204                 __asm __volatile("tlbi vaae1is, %0" : : "r" (r));
1205         } else {
1206                 r = ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie)) | atop(va);
1207                 __asm __volatile("tlbi vae1is, %0" : : "r" (r));
1208         }
1209         dsb(ish);
1210         isb();
1211 }
1212
1213 static __inline void
1214 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
1215 {
1216         uint64_t end, r, start;
1217
1218         PMAP_ASSERT_STAGE1(pmap);
1219
1220         dsb(ishst);
1221         if (pmap == kernel_pmap) {
1222                 start = atop(sva);
1223                 end = atop(eva);
1224                 for (r = start; r < end; r++)
1225                         __asm __volatile("tlbi vaae1is, %0" : : "r" (r));
1226         } else {
1227                 start = end = ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie));
1228                 start |= atop(sva);
1229                 end |= atop(eva);
1230                 for (r = start; r < end; r++)
1231                         __asm __volatile("tlbi vae1is, %0" : : "r" (r));
1232         }
1233         dsb(ish);
1234         isb();
1235 }
1236
1237 static __inline void
1238 pmap_invalidate_all(pmap_t pmap)
1239 {
1240         uint64_t r;
1241
1242         PMAP_ASSERT_STAGE1(pmap);
1243
1244         dsb(ishst);
1245         if (pmap == kernel_pmap) {
1246                 __asm __volatile("tlbi vmalle1is");
1247         } else {
1248                 r = ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie));
1249                 __asm __volatile("tlbi aside1is, %0" : : "r" (r));
1250         }
1251         dsb(ish);
1252         isb();
1253 }
1254
1255 /*
1256  *      Routine:        pmap_extract
1257  *      Function:
1258  *              Extract the physical page address associated
1259  *              with the given map/virtual_address pair.
1260  */
1261 vm_paddr_t
1262 pmap_extract(pmap_t pmap, vm_offset_t va)
1263 {
1264         pt_entry_t *pte, tpte;
1265         vm_paddr_t pa;
1266         int lvl;
1267
1268         pa = 0;
1269         PMAP_LOCK(pmap);
1270         /*
1271          * Find the block or page map for this virtual address. pmap_pte
1272          * will return either a valid block/page entry, or NULL.
1273          */
1274         pte = pmap_pte(pmap, va, &lvl);
1275         if (pte != NULL) {
1276                 tpte = pmap_load(pte);
1277                 pa = tpte & ~ATTR_MASK;
1278                 switch(lvl) {
1279                 case 1:
1280                         KASSERT((tpte & ATTR_DESCR_MASK) == L1_BLOCK,
1281                             ("pmap_extract: Invalid L1 pte found: %lx",
1282                             tpte & ATTR_DESCR_MASK));
1283                         pa |= (va & L1_OFFSET);
1284                         break;
1285                 case 2:
1286                         KASSERT((tpte & ATTR_DESCR_MASK) == L2_BLOCK,
1287                             ("pmap_extract: Invalid L2 pte found: %lx",
1288                             tpte & ATTR_DESCR_MASK));
1289                         pa |= (va & L2_OFFSET);
1290                         break;
1291                 case 3:
1292                         KASSERT((tpte & ATTR_DESCR_MASK) == L3_PAGE,
1293                             ("pmap_extract: Invalid L3 pte found: %lx",
1294                             tpte & ATTR_DESCR_MASK));
1295                         pa |= (va & L3_OFFSET);
1296                         break;
1297                 }
1298         }
1299         PMAP_UNLOCK(pmap);
1300         return (pa);
1301 }
1302
1303 /*
1304  *      Routine:        pmap_extract_and_hold
1305  *      Function:
1306  *              Atomically extract and hold the physical page
1307  *              with the given pmap and virtual address pair
1308  *              if that mapping permits the given protection.
1309  */
1310 vm_page_t
1311 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
1312 {
1313         pt_entry_t *pte, tpte;
1314         vm_offset_t off;
1315         vm_page_t m;
1316         int lvl;
1317         bool use;
1318
1319         m = NULL;
1320         PMAP_LOCK(pmap);
1321         pte = pmap_pte(pmap, va, &lvl);
1322         if (pte != NULL) {
1323                 tpte = pmap_load(pte);
1324
1325                 KASSERT(lvl > 0 && lvl <= 3,
1326                     ("pmap_extract_and_hold: Invalid level %d", lvl));
1327                 CTASSERT(L1_BLOCK == L2_BLOCK);
1328                 KASSERT((lvl == 3 && (tpte & ATTR_DESCR_MASK) == L3_PAGE) ||
1329                     (lvl < 3 && (tpte & ATTR_DESCR_MASK) == L1_BLOCK),
1330                     ("pmap_extract_and_hold: Invalid pte at L%d: %lx", lvl,
1331                      tpte & ATTR_DESCR_MASK));
1332
1333                 use = false;
1334                 if ((prot & VM_PROT_WRITE) == 0)
1335                         use = true;
1336                 else if (pmap->pm_stage == PM_STAGE1 &&
1337                     (tpte & ATTR_S1_AP_RW_BIT) == ATTR_S1_AP(ATTR_S1_AP_RW))
1338                         use = true;
1339                 else if (pmap->pm_stage == PM_STAGE2 &&
1340                     ((tpte & ATTR_S2_S2AP(ATTR_S2_S2AP_WRITE)) ==
1341                      ATTR_S2_S2AP(ATTR_S2_S2AP_WRITE)))
1342                         use = true;
1343
1344                 if (use) {
1345                         switch (lvl) {
1346                         case 1:
1347                                 off = va & L1_OFFSET;
1348                                 break;
1349                         case 2:
1350                                 off = va & L2_OFFSET;
1351                                 break;
1352                         case 3:
1353                         default:
1354                                 off = 0;
1355                         }
1356                         m = PHYS_TO_VM_PAGE((tpte & ~ATTR_MASK) | off);
1357                         if (m != NULL && !vm_page_wire_mapped(m))
1358                                 m = NULL;
1359                 }
1360         }
1361         PMAP_UNLOCK(pmap);
1362         return (m);
1363 }
1364
1365 vm_paddr_t
1366 pmap_kextract(vm_offset_t va)
1367 {
1368         pt_entry_t *pte, tpte;
1369
1370         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS)
1371                 return (DMAP_TO_PHYS(va));
1372         pte = pmap_l1(kernel_pmap, va);
1373         if (pte == NULL)
1374                 return (0);
1375
1376         /*
1377          * A concurrent pmap_update_entry() will clear the entry's valid bit
1378          * but leave the rest of the entry unchanged.  Therefore, we treat a
1379          * non-zero entry as being valid, and we ignore the valid bit when
1380          * determining whether the entry maps a block, page, or table.
1381          */
1382         tpte = pmap_load(pte);
1383         if (tpte == 0)
1384                 return (0);
1385         if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK)
1386                 return ((tpte & ~ATTR_MASK) | (va & L1_OFFSET));
1387         pte = pmap_l1_to_l2(&tpte, va);
1388         tpte = pmap_load(pte);
1389         if (tpte == 0)
1390                 return (0);
1391         if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK)
1392                 return ((tpte & ~ATTR_MASK) | (va & L2_OFFSET));
1393         pte = pmap_l2_to_l3(&tpte, va);
1394         tpte = pmap_load(pte);
1395         if (tpte == 0)
1396                 return (0);
1397         return ((tpte & ~ATTR_MASK) | (va & L3_OFFSET));
1398 }
1399
1400 /***************************************************
1401  * Low level mapping routines.....
1402  ***************************************************/
1403
1404 void
1405 pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode)
1406 {
1407         pd_entry_t *pde;
1408         pt_entry_t *pte, attr;
1409         vm_offset_t va;
1410         int lvl;
1411
1412         KASSERT((pa & L3_OFFSET) == 0,
1413            ("pmap_kenter: Invalid physical address"));
1414         KASSERT((sva & L3_OFFSET) == 0,
1415            ("pmap_kenter: Invalid virtual address"));
1416         KASSERT((size & PAGE_MASK) == 0,
1417             ("pmap_kenter: Mapping is not page-sized"));
1418
1419         attr = ATTR_DEFAULT | ATTR_S1_AP(ATTR_S1_AP_RW) | ATTR_S1_XN |
1420             ATTR_S1_IDX(mode) | L3_PAGE;
1421         va = sva;
1422         while (size != 0) {
1423                 pde = pmap_pde(kernel_pmap, va, &lvl);
1424                 KASSERT(pde != NULL,
1425                     ("pmap_kenter: Invalid page entry, va: 0x%lx", va));
1426                 KASSERT(lvl == 2, ("pmap_kenter: Invalid level %d", lvl));
1427
1428                 pte = pmap_l2_to_l3(pde, va);
1429                 pmap_load_store(pte, (pa & ~L3_OFFSET) | attr);
1430
1431                 va += PAGE_SIZE;
1432                 pa += PAGE_SIZE;
1433                 size -= PAGE_SIZE;
1434         }
1435         pmap_invalidate_range(kernel_pmap, sva, va);
1436 }
1437
1438 void
1439 pmap_kenter_device(vm_offset_t sva, vm_size_t size, vm_paddr_t pa)
1440 {
1441
1442         pmap_kenter(sva, size, pa, VM_MEMATTR_DEVICE);
1443 }
1444
1445 /*
1446  * Remove a page from the kernel pagetables.
1447  */
1448 PMAP_INLINE void
1449 pmap_kremove(vm_offset_t va)
1450 {
1451         pt_entry_t *pte;
1452         int lvl;
1453
1454         pte = pmap_pte(kernel_pmap, va, &lvl);
1455         KASSERT(pte != NULL, ("pmap_kremove: Invalid address"));
1456         KASSERT(lvl == 3, ("pmap_kremove: Invalid pte level %d", lvl));
1457
1458         pmap_clear(pte);
1459         pmap_invalidate_page(kernel_pmap, va);
1460 }
1461
1462 void
1463 pmap_kremove_device(vm_offset_t sva, vm_size_t size)
1464 {
1465         pt_entry_t *pte;
1466         vm_offset_t va;
1467         int lvl;
1468
1469         KASSERT((sva & L3_OFFSET) == 0,
1470            ("pmap_kremove_device: Invalid virtual address"));
1471         KASSERT((size & PAGE_MASK) == 0,
1472             ("pmap_kremove_device: Mapping is not page-sized"));
1473
1474         va = sva;
1475         while (size != 0) {
1476                 pte = pmap_pte(kernel_pmap, va, &lvl);
1477                 KASSERT(pte != NULL, ("Invalid page table, va: 0x%lx", va));
1478                 KASSERT(lvl == 3,
1479                     ("Invalid device pagetable level: %d != 3", lvl));
1480                 pmap_clear(pte);
1481
1482                 va += PAGE_SIZE;
1483                 size -= PAGE_SIZE;
1484         }
1485         pmap_invalidate_range(kernel_pmap, sva, va);
1486 }
1487
1488 /*
1489  *      Used to map a range of physical addresses into kernel
1490  *      virtual address space.
1491  *
1492  *      The value passed in '*virt' is a suggested virtual address for
1493  *      the mapping. Architectures which can support a direct-mapped
1494  *      physical to virtual region can return the appropriate address
1495  *      within that region, leaving '*virt' unchanged. Other
1496  *      architectures should map the pages starting at '*virt' and
1497  *      update '*virt' with the first usable address after the mapped
1498  *      region.
1499  */
1500 vm_offset_t
1501 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
1502 {
1503         return PHYS_TO_DMAP(start);
1504 }
1505
1506 /*
1507  * Add a list of wired pages to the kva
1508  * this routine is only used for temporary
1509  * kernel mappings that do not need to have
1510  * page modification or references recorded.
1511  * Note that old mappings are simply written
1512  * over.  The page *must* be wired.
1513  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1514  */
1515 void
1516 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
1517 {
1518         pd_entry_t *pde;
1519         pt_entry_t *pte, pa;
1520         vm_offset_t va;
1521         vm_page_t m;
1522         int i, lvl;
1523
1524         va = sva;
1525         for (i = 0; i < count; i++) {
1526                 pde = pmap_pde(kernel_pmap, va, &lvl);
1527                 KASSERT(pde != NULL,
1528                     ("pmap_qenter: Invalid page entry, va: 0x%lx", va));
1529                 KASSERT(lvl == 2,
1530                     ("pmap_qenter: Invalid level %d", lvl));
1531
1532                 m = ma[i];
1533                 pa = VM_PAGE_TO_PHYS(m) | ATTR_DEFAULT |
1534                     ATTR_S1_AP(ATTR_S1_AP_RW) | ATTR_S1_XN |
1535                     ATTR_S1_IDX(m->md.pv_memattr) | L3_PAGE;
1536                 pte = pmap_l2_to_l3(pde, va);
1537                 pmap_load_store(pte, pa);
1538
1539                 va += L3_SIZE;
1540         }
1541         pmap_invalidate_range(kernel_pmap, sva, va);
1542 }
1543
1544 /*
1545  * This routine tears out page mappings from the
1546  * kernel -- it is meant only for temporary mappings.
1547  */
1548 void
1549 pmap_qremove(vm_offset_t sva, int count)
1550 {
1551         pt_entry_t *pte;
1552         vm_offset_t va;
1553         int lvl;
1554
1555         KASSERT(sva >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", sva));
1556
1557         va = sva;
1558         while (count-- > 0) {
1559                 pte = pmap_pte(kernel_pmap, va, &lvl);
1560                 KASSERT(lvl == 3,
1561                     ("Invalid device pagetable level: %d != 3", lvl));
1562                 if (pte != NULL) {
1563                         pmap_clear(pte);
1564                 }
1565
1566                 va += PAGE_SIZE;
1567         }
1568         pmap_invalidate_range(kernel_pmap, sva, va);
1569 }
1570
1571 /***************************************************
1572  * Page table page management routines.....
1573  ***************************************************/
1574 /*
1575  * Schedule the specified unused page table page to be freed.  Specifically,
1576  * add the page to the specified list of pages that will be released to the
1577  * physical memory manager after the TLB has been updated.
1578  */
1579 static __inline void
1580 pmap_add_delayed_free_list(vm_page_t m, struct spglist *free,
1581     boolean_t set_PG_ZERO)
1582 {
1583
1584         if (set_PG_ZERO)
1585                 m->flags |= PG_ZERO;
1586         else
1587                 m->flags &= ~PG_ZERO;
1588         SLIST_INSERT_HEAD(free, m, plinks.s.ss);
1589 }
1590
1591 /*
1592  * Decrements a page table page's reference count, which is used to record the
1593  * number of valid page table entries within the page.  If the reference count
1594  * drops to zero, then the page table page is unmapped.  Returns TRUE if the
1595  * page table page was unmapped and FALSE otherwise.
1596  */
1597 static inline boolean_t
1598 pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
1599 {
1600
1601         --m->ref_count;
1602         if (m->ref_count == 0) {
1603                 _pmap_unwire_l3(pmap, va, m, free);
1604                 return (TRUE);
1605         } else
1606                 return (FALSE);
1607 }
1608
1609 static void
1610 _pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
1611 {
1612
1613         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1614         /*
1615          * unmap the page table page
1616          */
1617         if (m->pindex >= (NUL2E + NUL1E)) {
1618                 /* l1 page */
1619                 pd_entry_t *l0;
1620
1621                 l0 = pmap_l0(pmap, va);
1622                 pmap_clear(l0);
1623         } else if (m->pindex >= NUL2E) {
1624                 /* l2 page */
1625                 pd_entry_t *l1;
1626
1627                 l1 = pmap_l1(pmap, va);
1628                 pmap_clear(l1);
1629         } else {
1630                 /* l3 page */
1631                 pd_entry_t *l2;
1632
1633                 l2 = pmap_l2(pmap, va);
1634                 pmap_clear(l2);
1635         }
1636         pmap_resident_count_dec(pmap, 1);
1637         if (m->pindex < NUL2E) {
1638                 /* We just released an l3, unhold the matching l2 */
1639                 pd_entry_t *l1, tl1;
1640                 vm_page_t l2pg;
1641
1642                 l1 = pmap_l1(pmap, va);
1643                 tl1 = pmap_load(l1);
1644                 l2pg = PHYS_TO_VM_PAGE(tl1 & ~ATTR_MASK);
1645                 pmap_unwire_l3(pmap, va, l2pg, free);
1646         } else if (m->pindex < (NUL2E + NUL1E)) {
1647                 /* We just released an l2, unhold the matching l1 */
1648                 pd_entry_t *l0, tl0;
1649                 vm_page_t l1pg;
1650
1651                 l0 = pmap_l0(pmap, va);
1652                 tl0 = pmap_load(l0);
1653                 l1pg = PHYS_TO_VM_PAGE(tl0 & ~ATTR_MASK);
1654                 pmap_unwire_l3(pmap, va, l1pg, free);
1655         }
1656         pmap_invalidate_page(pmap, va);
1657
1658         /*
1659          * Put page on a list so that it is released after
1660          * *ALL* TLB shootdown is done
1661          */
1662         pmap_add_delayed_free_list(m, free, TRUE);
1663 }
1664
1665 /*
1666  * After removing a page table entry, this routine is used to
1667  * conditionally free the page, and manage the reference count.
1668  */
1669 static int
1670 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde,
1671     struct spglist *free)
1672 {
1673         vm_page_t mpte;
1674
1675         if (va >= VM_MAXUSER_ADDRESS)
1676                 return (0);
1677         KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
1678         mpte = PHYS_TO_VM_PAGE(ptepde & ~ATTR_MASK);
1679         return (pmap_unwire_l3(pmap, va, mpte, free));
1680 }
1681
1682 /*
1683  * Release a page table page reference after a failed attempt to create a
1684  * mapping.
1685  */
1686 static void
1687 pmap_abort_ptp(pmap_t pmap, vm_offset_t va, vm_page_t mpte)
1688 {
1689         struct spglist free;
1690
1691         SLIST_INIT(&free);
1692         if (pmap_unwire_l3(pmap, va, mpte, &free)) {
1693                 /*
1694                  * Although "va" was never mapped, the TLB could nonetheless
1695                  * have intermediate entries that refer to the freed page
1696                  * table pages.  Invalidate those entries.
1697                  *
1698                  * XXX redundant invalidation (See _pmap_unwire_l3().)
1699                  */
1700                 pmap_invalidate_page(pmap, va);
1701                 vm_page_free_pages_toq(&free, true);
1702         }
1703 }
1704
1705 void
1706 pmap_pinit0(pmap_t pmap)
1707 {
1708
1709         PMAP_LOCK_INIT(pmap);
1710         bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
1711         pmap->pm_l0_paddr = READ_SPECIALREG(ttbr0_el1);
1712         pmap->pm_l0 = (pd_entry_t *)PHYS_TO_DMAP(pmap->pm_l0_paddr);
1713         pmap->pm_root.rt_root = 0;
1714         pmap->pm_cookie = COOKIE_FROM(ASID_RESERVED_FOR_PID_0, INT_MIN);
1715         pmap->pm_stage = PM_STAGE1;
1716         pmap->pm_asid_set = &asids;
1717
1718         PCPU_SET(curpmap, pmap);
1719 }
1720
1721 int
1722 pmap_pinit_stage(pmap_t pmap, enum pmap_stage stage)
1723 {
1724         vm_page_t l0pt;
1725
1726         /*
1727          * allocate the l0 page
1728          */
1729         while ((l0pt = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
1730             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL)
1731                 vm_wait(NULL);
1732
1733         pmap->pm_l0_paddr = VM_PAGE_TO_PHYS(l0pt);
1734         pmap->pm_l0 = (pd_entry_t *)PHYS_TO_DMAP(pmap->pm_l0_paddr);
1735
1736         if ((l0pt->flags & PG_ZERO) == 0)
1737                 pagezero(pmap->pm_l0);
1738
1739         pmap->pm_root.rt_root = 0;
1740         bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
1741         pmap->pm_cookie = COOKIE_FROM(-1, INT_MAX);
1742
1743         pmap->pm_stage = stage;
1744         switch (stage) {
1745         case PM_STAGE1:
1746                 pmap->pm_asid_set = &asids;
1747                 break;
1748         case PM_STAGE2:
1749                 pmap->pm_asid_set = &vmids;
1750                 break;
1751         default:
1752                 panic("%s: Invalid pmap type %d", __func__, stage);
1753                 break;
1754         }
1755
1756         /* XXX Temporarily disable deferred ASID allocation. */
1757         pmap_alloc_asid(pmap);
1758
1759         return (1);
1760 }
1761
1762 int
1763 pmap_pinit(pmap_t pmap)
1764 {
1765
1766         return (pmap_pinit_stage(pmap, PM_STAGE1));
1767 }
1768
1769 /*
1770  * This routine is called if the desired page table page does not exist.
1771  *
1772  * If page table page allocation fails, this routine may sleep before
1773  * returning NULL.  It sleeps only if a lock pointer was given.
1774  *
1775  * Note: If a page allocation fails at page table level two or three,
1776  * one or two pages may be held during the wait, only to be released
1777  * afterwards.  This conservative approach is easily argued to avoid
1778  * race conditions.
1779  */
1780 static vm_page_t
1781 _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp)
1782 {
1783         vm_page_t m, l1pg, l2pg;
1784
1785         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1786
1787         /*
1788          * Allocate a page table page.
1789          */
1790         if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
1791             VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
1792                 if (lockp != NULL) {
1793                         RELEASE_PV_LIST_LOCK(lockp);
1794                         PMAP_UNLOCK(pmap);
1795                         vm_wait(NULL);
1796                         PMAP_LOCK(pmap);
1797                 }
1798
1799                 /*
1800                  * Indicate the need to retry.  While waiting, the page table
1801                  * page may have been allocated.
1802                  */
1803                 return (NULL);
1804         }
1805         if ((m->flags & PG_ZERO) == 0)
1806                 pmap_zero_page(m);
1807
1808         /*
1809          * Because of AArch64's weak memory consistency model, we must have a
1810          * barrier here to ensure that the stores for zeroing "m", whether by
1811          * pmap_zero_page() or an earlier function, are visible before adding
1812          * "m" to the page table.  Otherwise, a page table walk by another
1813          * processor's MMU could see the mapping to "m" and a stale, non-zero
1814          * PTE within "m".
1815          */
1816         dmb(ishst);
1817
1818         /*
1819          * Map the pagetable page into the process address space, if
1820          * it isn't already there.
1821          */
1822
1823         if (ptepindex >= (NUL2E + NUL1E)) {
1824                 pd_entry_t *l0;
1825                 vm_pindex_t l0index;
1826
1827                 l0index = ptepindex - (NUL2E + NUL1E);
1828                 l0 = &pmap->pm_l0[l0index];
1829                 pmap_store(l0, VM_PAGE_TO_PHYS(m) | L0_TABLE);
1830         } else if (ptepindex >= NUL2E) {
1831                 vm_pindex_t l0index, l1index;
1832                 pd_entry_t *l0, *l1;
1833                 pd_entry_t tl0;
1834
1835                 l1index = ptepindex - NUL2E;
1836                 l0index = l1index >> L0_ENTRIES_SHIFT;
1837
1838                 l0 = &pmap->pm_l0[l0index];
1839                 tl0 = pmap_load(l0);
1840                 if (tl0 == 0) {
1841                         /* recurse for allocating page dir */
1842                         if (_pmap_alloc_l3(pmap, NUL2E + NUL1E + l0index,
1843                             lockp) == NULL) {
1844                                 vm_page_unwire_noq(m);
1845                                 vm_page_free_zero(m);
1846                                 return (NULL);
1847                         }
1848                 } else {
1849                         l1pg = PHYS_TO_VM_PAGE(tl0 & ~ATTR_MASK);
1850                         l1pg->ref_count++;
1851                 }
1852
1853                 l1 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l0) & ~ATTR_MASK);
1854                 l1 = &l1[ptepindex & Ln_ADDR_MASK];
1855                 pmap_store(l1, VM_PAGE_TO_PHYS(m) | L1_TABLE);
1856         } else {
1857                 vm_pindex_t l0index, l1index;
1858                 pd_entry_t *l0, *l1, *l2;
1859                 pd_entry_t tl0, tl1;
1860
1861                 l1index = ptepindex >> Ln_ENTRIES_SHIFT;
1862                 l0index = l1index >> L0_ENTRIES_SHIFT;
1863
1864                 l0 = &pmap->pm_l0[l0index];
1865                 tl0 = pmap_load(l0);
1866                 if (tl0 == 0) {
1867                         /* recurse for allocating page dir */
1868                         if (_pmap_alloc_l3(pmap, NUL2E + l1index,
1869                             lockp) == NULL) {
1870                                 vm_page_unwire_noq(m);
1871                                 vm_page_free_zero(m);
1872                                 return (NULL);
1873                         }
1874                         tl0 = pmap_load(l0);
1875                         l1 = (pd_entry_t *)PHYS_TO_DMAP(tl0 & ~ATTR_MASK);
1876                         l1 = &l1[l1index & Ln_ADDR_MASK];
1877                 } else {
1878                         l1 = (pd_entry_t *)PHYS_TO_DMAP(tl0 & ~ATTR_MASK);
1879                         l1 = &l1[l1index & Ln_ADDR_MASK];
1880                         tl1 = pmap_load(l1);
1881                         if (tl1 == 0) {
1882                                 /* recurse for allocating page dir */
1883                                 if (_pmap_alloc_l3(pmap, NUL2E + l1index,
1884                                     lockp) == NULL) {
1885                                         vm_page_unwire_noq(m);
1886                                         vm_page_free_zero(m);
1887                                         return (NULL);
1888                                 }
1889                         } else {
1890                                 l2pg = PHYS_TO_VM_PAGE(tl1 & ~ATTR_MASK);
1891                                 l2pg->ref_count++;
1892                         }
1893                 }
1894
1895                 l2 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l1) & ~ATTR_MASK);
1896                 l2 = &l2[ptepindex & Ln_ADDR_MASK];
1897                 pmap_store(l2, VM_PAGE_TO_PHYS(m) | L2_TABLE);
1898         }
1899
1900         pmap_resident_count_inc(pmap, 1);
1901
1902         return (m);
1903 }
1904
1905 static pd_entry_t *
1906 pmap_alloc_l2(pmap_t pmap, vm_offset_t va, vm_page_t *l2pgp,
1907     struct rwlock **lockp)
1908 {
1909         pd_entry_t *l1, *l2;
1910         vm_page_t l2pg;
1911         vm_pindex_t l2pindex;
1912
1913 retry:
1914         l1 = pmap_l1(pmap, va);
1915         if (l1 != NULL && (pmap_load(l1) & ATTR_DESCR_MASK) == L1_TABLE) {
1916                 l2 = pmap_l1_to_l2(l1, va);
1917                 if (va < VM_MAXUSER_ADDRESS) {
1918                         /* Add a reference to the L2 page. */
1919                         l2pg = PHYS_TO_VM_PAGE(pmap_load(l1) & ~ATTR_MASK);
1920                         l2pg->ref_count++;
1921                 } else
1922                         l2pg = NULL;
1923         } else if (va < VM_MAXUSER_ADDRESS) {
1924                 /* Allocate a L2 page. */
1925                 l2pindex = pmap_l2_pindex(va) >> Ln_ENTRIES_SHIFT;
1926                 l2pg = _pmap_alloc_l3(pmap, NUL2E + l2pindex, lockp);
1927                 if (l2pg == NULL) {
1928                         if (lockp != NULL)
1929                                 goto retry;
1930                         else
1931                                 return (NULL);
1932                 }
1933                 l2 = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(l2pg));
1934                 l2 = &l2[pmap_l2_index(va)];
1935         } else
1936                 panic("pmap_alloc_l2: missing page table page for va %#lx",
1937                     va);
1938         *l2pgp = l2pg;
1939         return (l2);
1940 }
1941
1942 static vm_page_t
1943 pmap_alloc_l3(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
1944 {
1945         vm_pindex_t ptepindex;
1946         pd_entry_t *pde, tpde;
1947 #ifdef INVARIANTS
1948         pt_entry_t *pte;
1949 #endif
1950         vm_page_t m;
1951         int lvl;
1952
1953         /*
1954          * Calculate pagetable page index
1955          */
1956         ptepindex = pmap_l2_pindex(va);
1957 retry:
1958         /*
1959          * Get the page directory entry
1960          */
1961         pde = pmap_pde(pmap, va, &lvl);
1962
1963         /*
1964          * If the page table page is mapped, we just increment the hold count,
1965          * and activate it. If we get a level 2 pde it will point to a level 3
1966          * table.
1967          */
1968         switch (lvl) {
1969         case -1:
1970                 break;
1971         case 0:
1972 #ifdef INVARIANTS
1973                 pte = pmap_l0_to_l1(pde, va);
1974                 KASSERT(pmap_load(pte) == 0,
1975                     ("pmap_alloc_l3: TODO: l0 superpages"));
1976 #endif
1977                 break;
1978         case 1:
1979 #ifdef INVARIANTS
1980                 pte = pmap_l1_to_l2(pde, va);
1981                 KASSERT(pmap_load(pte) == 0,
1982                     ("pmap_alloc_l3: TODO: l1 superpages"));
1983 #endif
1984                 break;
1985         case 2:
1986                 tpde = pmap_load(pde);
1987                 if (tpde != 0) {
1988                         m = PHYS_TO_VM_PAGE(tpde & ~ATTR_MASK);
1989                         m->ref_count++;
1990                         return (m);
1991                 }
1992                 break;
1993         default:
1994                 panic("pmap_alloc_l3: Invalid level %d", lvl);
1995         }
1996
1997         /*
1998          * Here if the pte page isn't mapped, or if it has been deallocated.
1999          */
2000         m = _pmap_alloc_l3(pmap, ptepindex, lockp);
2001         if (m == NULL && lockp != NULL)
2002                 goto retry;
2003
2004         return (m);
2005 }
2006
2007 /***************************************************
2008  * Pmap allocation/deallocation routines.
2009  ***************************************************/
2010
2011 /*
2012  * Release any resources held by the given physical map.
2013  * Called when a pmap initialized by pmap_pinit is being released.
2014  * Should only be called if the map contains no valid mappings.
2015  */
2016 void
2017 pmap_release(pmap_t pmap)
2018 {
2019         struct asid_set *set;
2020         vm_page_t m;
2021         int asid;
2022
2023         KASSERT(pmap->pm_stats.resident_count == 0,
2024             ("pmap_release: pmap resident count %ld != 0",
2025             pmap->pm_stats.resident_count));
2026         KASSERT(vm_radix_is_empty(&pmap->pm_root),
2027             ("pmap_release: pmap has reserved page table page(s)"));
2028
2029         set = pmap->pm_asid_set;
2030         KASSERT(set != NULL, ("%s: NULL asid set", __func__));
2031
2032         /*
2033          * Allow the ASID to be reused. In stage 2 VMIDs we don't invalidate
2034          * the entries when removing them so rely on a later tlb invalidation.
2035          * this will happen when updating the VMID generation. Because of this
2036          * we don't reuse VMIDs within a generation.
2037          */
2038         if (pmap->pm_stage == PM_STAGE1) {
2039                 mtx_lock_spin(&set->asid_set_mutex);
2040                 if (COOKIE_TO_EPOCH(pmap->pm_cookie) == set->asid_epoch) {
2041                         asid = COOKIE_TO_ASID(pmap->pm_cookie);
2042                         KASSERT(asid >= ASID_FIRST_AVAILABLE &&
2043                             asid < set->asid_set_size,
2044                             ("pmap_release: pmap cookie has out-of-range asid"));
2045                         bit_clear(set->asid_set, asid);
2046                 }
2047                 mtx_unlock_spin(&set->asid_set_mutex);
2048         }
2049
2050         m = PHYS_TO_VM_PAGE(pmap->pm_l0_paddr);
2051         vm_page_unwire_noq(m);
2052         vm_page_free_zero(m);
2053 }
2054
2055 static int
2056 kvm_size(SYSCTL_HANDLER_ARGS)
2057 {
2058         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS;
2059
2060         return sysctl_handle_long(oidp, &ksize, 0, req);
2061 }
2062 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
2063     0, 0, kvm_size, "LU",
2064     "Size of KVM");
2065
2066 static int
2067 kvm_free(SYSCTL_HANDLER_ARGS)
2068 {
2069         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
2070
2071         return sysctl_handle_long(oidp, &kfree, 0, req);
2072 }
2073 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
2074     0, 0, kvm_free, "LU",
2075     "Amount of KVM free");
2076
2077 /*
2078  * grow the number of kernel page table entries, if needed
2079  */
2080 void
2081 pmap_growkernel(vm_offset_t addr)
2082 {
2083         vm_paddr_t paddr;
2084         vm_page_t nkpg;
2085         pd_entry_t *l0, *l1, *l2;
2086
2087         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
2088
2089         addr = roundup2(addr, L2_SIZE);
2090         if (addr - 1 >= vm_map_max(kernel_map))
2091                 addr = vm_map_max(kernel_map);
2092         while (kernel_vm_end < addr) {
2093                 l0 = pmap_l0(kernel_pmap, kernel_vm_end);
2094                 KASSERT(pmap_load(l0) != 0,
2095                     ("pmap_growkernel: No level 0 kernel entry"));
2096
2097                 l1 = pmap_l0_to_l1(l0, kernel_vm_end);
2098                 if (pmap_load(l1) == 0) {
2099                         /* We need a new PDP entry */
2100                         nkpg = vm_page_alloc(NULL, kernel_vm_end >> L1_SHIFT,
2101                             VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ |
2102                             VM_ALLOC_WIRED | VM_ALLOC_ZERO);
2103                         if (nkpg == NULL)
2104                                 panic("pmap_growkernel: no memory to grow kernel");
2105                         if ((nkpg->flags & PG_ZERO) == 0)
2106                                 pmap_zero_page(nkpg);
2107                         /* See the dmb() in _pmap_alloc_l3(). */
2108                         dmb(ishst);
2109                         paddr = VM_PAGE_TO_PHYS(nkpg);
2110                         pmap_store(l1, paddr | L1_TABLE);
2111                         continue; /* try again */
2112                 }
2113                 l2 = pmap_l1_to_l2(l1, kernel_vm_end);
2114                 if (pmap_load(l2) != 0) {
2115                         kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
2116                         if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
2117                                 kernel_vm_end = vm_map_max(kernel_map);
2118                                 break;
2119                         }
2120                         continue;
2121                 }
2122
2123                 nkpg = vm_page_alloc(NULL, kernel_vm_end >> L2_SHIFT,
2124                     VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
2125                     VM_ALLOC_ZERO);
2126                 if (nkpg == NULL)
2127                         panic("pmap_growkernel: no memory to grow kernel");
2128                 if ((nkpg->flags & PG_ZERO) == 0)
2129                         pmap_zero_page(nkpg);
2130                 /* See the dmb() in _pmap_alloc_l3(). */
2131                 dmb(ishst);
2132                 paddr = VM_PAGE_TO_PHYS(nkpg);
2133                 pmap_store(l2, paddr | L2_TABLE);
2134
2135                 kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
2136                 if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
2137                         kernel_vm_end = vm_map_max(kernel_map);
2138                         break;
2139                 }
2140         }
2141 }
2142
2143 /***************************************************
2144  * page management routines.
2145  ***************************************************/
2146
2147 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
2148 CTASSERT(_NPCM == 3);
2149 CTASSERT(_NPCPV == 168);
2150
2151 static __inline struct pv_chunk *
2152 pv_to_chunk(pv_entry_t pv)
2153 {
2154
2155         return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK));
2156 }
2157
2158 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
2159
2160 #define PC_FREE0        0xfffffffffffffffful
2161 #define PC_FREE1        0xfffffffffffffffful
2162 #define PC_FREE2        0x000000fffffffffful
2163
2164 static const uint64_t pc_freemask[_NPCM] = { PC_FREE0, PC_FREE1, PC_FREE2 };
2165
2166 #if 0
2167 #ifdef PV_STATS
2168 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
2169
2170 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
2171         "Current number of pv entry chunks");
2172 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
2173         "Current number of pv entry chunks allocated");
2174 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
2175         "Current number of pv entry chunks frees");
2176 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
2177         "Number of times tried to get a chunk page but failed.");
2178
2179 static long pv_entry_frees, pv_entry_allocs, pv_entry_count;
2180 static int pv_entry_spare;
2181
2182 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
2183         "Current number of pv entry frees");
2184 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
2185         "Current number of pv entry allocs");
2186 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
2187         "Current number of pv entries");
2188 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
2189         "Current number of spare pv entries");
2190 #endif
2191 #endif /* 0 */
2192
2193 /*
2194  * We are in a serious low memory condition.  Resort to
2195  * drastic measures to free some pages so we can allocate
2196  * another pv entry chunk.
2197  *
2198  * Returns NULL if PV entries were reclaimed from the specified pmap.
2199  *
2200  * We do not, however, unmap 2mpages because subsequent accesses will
2201  * allocate per-page pv entries until repromotion occurs, thereby
2202  * exacerbating the shortage of free pv entries.
2203  */
2204 static vm_page_t
2205 reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
2206 {
2207         struct pv_chunk *pc, *pc_marker, *pc_marker_end;
2208         struct pv_chunk_header pc_marker_b, pc_marker_end_b;
2209         struct md_page *pvh;
2210         pd_entry_t *pde;
2211         pmap_t next_pmap, pmap;
2212         pt_entry_t *pte, tpte;
2213         pv_entry_t pv;
2214         vm_offset_t va;
2215         vm_page_t m, m_pc;
2216         struct spglist free;
2217         uint64_t inuse;
2218         int bit, field, freed, lvl;
2219         static int active_reclaims = 0;
2220
2221         PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
2222         KASSERT(lockp != NULL, ("reclaim_pv_chunk: lockp is NULL"));
2223
2224         pmap = NULL;
2225         m_pc = NULL;
2226         SLIST_INIT(&free);
2227         bzero(&pc_marker_b, sizeof(pc_marker_b));
2228         bzero(&pc_marker_end_b, sizeof(pc_marker_end_b));
2229         pc_marker = (struct pv_chunk *)&pc_marker_b;
2230         pc_marker_end = (struct pv_chunk *)&pc_marker_end_b;
2231
2232         mtx_lock(&pv_chunks_mutex);
2233         active_reclaims++;
2234         TAILQ_INSERT_HEAD(&pv_chunks, pc_marker, pc_lru);
2235         TAILQ_INSERT_TAIL(&pv_chunks, pc_marker_end, pc_lru);
2236         while ((pc = TAILQ_NEXT(pc_marker, pc_lru)) != pc_marker_end &&
2237             SLIST_EMPTY(&free)) {
2238                 next_pmap = pc->pc_pmap;
2239                 if (next_pmap == NULL) {
2240                         /*
2241                          * The next chunk is a marker.  However, it is
2242                          * not our marker, so active_reclaims must be
2243                          * > 1.  Consequently, the next_chunk code
2244                          * will not rotate the pv_chunks list.
2245                          */
2246                         goto next_chunk;
2247                 }
2248                 mtx_unlock(&pv_chunks_mutex);
2249
2250                 /*
2251                  * A pv_chunk can only be removed from the pc_lru list
2252                  * when both pv_chunks_mutex is owned and the
2253                  * corresponding pmap is locked.
2254                  */
2255                 if (pmap != next_pmap) {
2256                         if (pmap != NULL && pmap != locked_pmap)
2257                                 PMAP_UNLOCK(pmap);
2258                         pmap = next_pmap;
2259                         /* Avoid deadlock and lock recursion. */
2260                         if (pmap > locked_pmap) {
2261                                 RELEASE_PV_LIST_LOCK(lockp);
2262                                 PMAP_LOCK(pmap);
2263                                 mtx_lock(&pv_chunks_mutex);
2264                                 continue;
2265                         } else if (pmap != locked_pmap) {
2266                                 if (PMAP_TRYLOCK(pmap)) {
2267                                         mtx_lock(&pv_chunks_mutex);
2268                                         continue;
2269                                 } else {
2270                                         pmap = NULL; /* pmap is not locked */
2271                                         mtx_lock(&pv_chunks_mutex);
2272                                         pc = TAILQ_NEXT(pc_marker, pc_lru);
2273                                         if (pc == NULL ||
2274                                             pc->pc_pmap != next_pmap)
2275                                                 continue;
2276                                         goto next_chunk;
2277                                 }
2278                         }
2279                 }
2280
2281                 /*
2282                  * Destroy every non-wired, 4 KB page mapping in the chunk.
2283                  */
2284                 freed = 0;
2285                 for (field = 0; field < _NPCM; field++) {
2286                         for (inuse = ~pc->pc_map[field] & pc_freemask[field];
2287                             inuse != 0; inuse &= ~(1UL << bit)) {
2288                                 bit = ffsl(inuse) - 1;
2289                                 pv = &pc->pc_pventry[field * 64 + bit];
2290                                 va = pv->pv_va;
2291                                 pde = pmap_pde(pmap, va, &lvl);
2292                                 if (lvl != 2)
2293                                         continue;
2294                                 pte = pmap_l2_to_l3(pde, va);
2295                                 tpte = pmap_load(pte);
2296                                 if ((tpte & ATTR_SW_WIRED) != 0)
2297                                         continue;
2298                                 tpte = pmap_load_clear(pte);
2299                                 m = PHYS_TO_VM_PAGE(tpte & ~ATTR_MASK);
2300                                 if (pmap_pte_dirty(pmap, tpte))
2301                                         vm_page_dirty(m);
2302                                 if ((tpte & ATTR_AF) != 0) {
2303                                         pmap_invalidate_page(pmap, va);
2304                                         vm_page_aflag_set(m, PGA_REFERENCED);
2305                                 }
2306                                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
2307                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
2308                                 m->md.pv_gen++;
2309                                 if (TAILQ_EMPTY(&m->md.pv_list) &&
2310                                     (m->flags & PG_FICTITIOUS) == 0) {
2311                                         pvh = page_to_pvh(m);
2312                                         if (TAILQ_EMPTY(&pvh->pv_list)) {
2313                                                 vm_page_aflag_clear(m,
2314                                                     PGA_WRITEABLE);
2315                                         }
2316                                 }
2317                                 pc->pc_map[field] |= 1UL << bit;
2318                                 pmap_unuse_pt(pmap, va, pmap_load(pde), &free);
2319                                 freed++;
2320                         }
2321                 }
2322                 if (freed == 0) {
2323                         mtx_lock(&pv_chunks_mutex);
2324                         goto next_chunk;
2325                 }
2326                 /* Every freed mapping is for a 4 KB page. */
2327                 pmap_resident_count_dec(pmap, freed);
2328                 PV_STAT(atomic_add_long(&pv_entry_frees, freed));
2329                 PV_STAT(atomic_add_int(&pv_entry_spare, freed));
2330                 PV_STAT(atomic_subtract_long(&pv_entry_count, freed));
2331                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2332                 if (pc->pc_map[0] == PC_FREE0 && pc->pc_map[1] == PC_FREE1 &&
2333                     pc->pc_map[2] == PC_FREE2) {
2334                         PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV));
2335                         PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
2336                         PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
2337                         /* Entire chunk is free; return it. */
2338                         m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
2339                         dump_drop_page(m_pc->phys_addr);
2340                         mtx_lock(&pv_chunks_mutex);
2341                         TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
2342                         break;
2343                 }
2344                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2345                 mtx_lock(&pv_chunks_mutex);
2346                 /* One freed pv entry in locked_pmap is sufficient. */
2347                 if (pmap == locked_pmap)
2348                         break;
2349
2350 next_chunk:
2351                 TAILQ_REMOVE(&pv_chunks, pc_marker, pc_lru);
2352                 TAILQ_INSERT_AFTER(&pv_chunks, pc, pc_marker, pc_lru);
2353                 if (active_reclaims == 1 && pmap != NULL) {
2354                         /*
2355                          * Rotate the pv chunks list so that we do not
2356                          * scan the same pv chunks that could not be
2357                          * freed (because they contained a wired
2358                          * and/or superpage mapping) on every
2359                          * invocation of reclaim_pv_chunk().
2360                          */
2361                         while ((pc = TAILQ_FIRST(&pv_chunks)) != pc_marker) {
2362                                 MPASS(pc->pc_pmap != NULL);
2363                                 TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
2364                                 TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
2365                         }
2366                 }
2367         }
2368         TAILQ_REMOVE(&pv_chunks, pc_marker, pc_lru);
2369         TAILQ_REMOVE(&pv_chunks, pc_marker_end, pc_lru);
2370         active_reclaims--;
2371         mtx_unlock(&pv_chunks_mutex);
2372         if (pmap != NULL && pmap != locked_pmap)
2373                 PMAP_UNLOCK(pmap);
2374         if (m_pc == NULL && !SLIST_EMPTY(&free)) {
2375                 m_pc = SLIST_FIRST(&free);
2376                 SLIST_REMOVE_HEAD(&free, plinks.s.ss);
2377                 /* Recycle a freed page table page. */
2378                 m_pc->ref_count = 1;
2379         }
2380         vm_page_free_pages_toq(&free, true);
2381         return (m_pc);
2382 }
2383
2384 /*
2385  * free the pv_entry back to the free list
2386  */
2387 static void
2388 free_pv_entry(pmap_t pmap, pv_entry_t pv)
2389 {
2390         struct pv_chunk *pc;
2391         int idx, field, bit;
2392
2393         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2394         PV_STAT(atomic_add_long(&pv_entry_frees, 1));
2395         PV_STAT(atomic_add_int(&pv_entry_spare, 1));
2396         PV_STAT(atomic_subtract_long(&pv_entry_count, 1));
2397         pc = pv_to_chunk(pv);
2398         idx = pv - &pc->pc_pventry[0];
2399         field = idx / 64;
2400         bit = idx % 64;
2401         pc->pc_map[field] |= 1ul << bit;
2402         if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
2403             pc->pc_map[2] != PC_FREE2) {
2404                 /* 98% of the time, pc is already at the head of the list. */
2405                 if (__predict_false(pc != TAILQ_FIRST(&pmap->pm_pvchunk))) {
2406                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2407                         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2408                 }
2409                 return;
2410         }
2411         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2412         free_pv_chunk(pc);
2413 }
2414
2415 static void
2416 free_pv_chunk(struct pv_chunk *pc)
2417 {
2418         vm_page_t m;
2419
2420         mtx_lock(&pv_chunks_mutex);
2421         TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
2422         mtx_unlock(&pv_chunks_mutex);
2423         PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV));
2424         PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
2425         PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
2426         /* entire chunk is free, return it */
2427         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
2428         dump_drop_page(m->phys_addr);
2429         vm_page_unwire_noq(m);
2430         vm_page_free(m);
2431 }
2432
2433 /*
2434  * Returns a new PV entry, allocating a new PV chunk from the system when
2435  * needed.  If this PV chunk allocation fails and a PV list lock pointer was
2436  * given, a PV chunk is reclaimed from an arbitrary pmap.  Otherwise, NULL is
2437  * returned.
2438  *
2439  * The given PV list lock may be released.
2440  */
2441 static pv_entry_t
2442 get_pv_entry(pmap_t pmap, struct rwlock **lockp)
2443 {
2444         int bit, field;
2445         pv_entry_t pv;
2446         struct pv_chunk *pc;
2447         vm_page_t m;
2448
2449         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2450         PV_STAT(atomic_add_long(&pv_entry_allocs, 1));
2451 retry:
2452         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
2453         if (pc != NULL) {
2454                 for (field = 0; field < _NPCM; field++) {
2455                         if (pc->pc_map[field]) {
2456                                 bit = ffsl(pc->pc_map[field]) - 1;
2457                                 break;
2458                         }
2459                 }
2460                 if (field < _NPCM) {
2461                         pv = &pc->pc_pventry[field * 64 + bit];
2462                         pc->pc_map[field] &= ~(1ul << bit);
2463                         /* If this was the last item, move it to tail */
2464                         if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
2465                             pc->pc_map[2] == 0) {
2466                                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2467                                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc,
2468                                     pc_list);
2469                         }
2470                         PV_STAT(atomic_add_long(&pv_entry_count, 1));
2471                         PV_STAT(atomic_subtract_int(&pv_entry_spare, 1));
2472                         return (pv);
2473                 }
2474         }
2475         /* No free items, allocate another chunk */
2476         m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
2477             VM_ALLOC_WIRED);
2478         if (m == NULL) {
2479                 if (lockp == NULL) {
2480                         PV_STAT(pc_chunk_tryfail++);
2481                         return (NULL);
2482                 }
2483                 m = reclaim_pv_chunk(pmap, lockp);
2484                 if (m == NULL)
2485                         goto retry;
2486         }
2487         PV_STAT(atomic_add_int(&pc_chunk_count, 1));
2488         PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
2489         dump_add_page(m->phys_addr);
2490         pc = (void *)PHYS_TO_DMAP(m->phys_addr);
2491         pc->pc_pmap = pmap;
2492         pc->pc_map[0] = PC_FREE0 & ~1ul;        /* preallocated bit 0 */
2493         pc->pc_map[1] = PC_FREE1;
2494         pc->pc_map[2] = PC_FREE2;
2495         mtx_lock(&pv_chunks_mutex);
2496         TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
2497         mtx_unlock(&pv_chunks_mutex);
2498         pv = &pc->pc_pventry[0];
2499         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2500         PV_STAT(atomic_add_long(&pv_entry_count, 1));
2501         PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV - 1));
2502         return (pv);
2503 }
2504
2505 /*
2506  * Ensure that the number of spare PV entries in the specified pmap meets or
2507  * exceeds the given count, "needed".
2508  *
2509  * The given PV list lock may be released.
2510  */
2511 static void
2512 reserve_pv_entries(pmap_t pmap, int needed, struct rwlock **lockp)
2513 {
2514         struct pch new_tail;
2515         struct pv_chunk *pc;
2516         vm_page_t m;
2517         int avail, free;
2518         bool reclaimed;
2519
2520         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2521         KASSERT(lockp != NULL, ("reserve_pv_entries: lockp is NULL"));
2522
2523         /*
2524          * Newly allocated PV chunks must be stored in a private list until
2525          * the required number of PV chunks have been allocated.  Otherwise,
2526          * reclaim_pv_chunk() could recycle one of these chunks.  In
2527          * contrast, these chunks must be added to the pmap upon allocation.
2528          */
2529         TAILQ_INIT(&new_tail);
2530 retry:
2531         avail = 0;
2532         TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
2533                 bit_count((bitstr_t *)pc->pc_map, 0,
2534                     sizeof(pc->pc_map) * NBBY, &free);
2535                 if (free == 0)
2536                         break;
2537                 avail += free;
2538                 if (avail >= needed)
2539                         break;
2540         }
2541         for (reclaimed = false; avail < needed; avail += _NPCPV) {
2542                 m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
2543                     VM_ALLOC_WIRED);
2544                 if (m == NULL) {
2545                         m = reclaim_pv_chunk(pmap, lockp);
2546                         if (m == NULL)
2547                                 goto retry;
2548                         reclaimed = true;
2549                 }
2550                 PV_STAT(atomic_add_int(&pc_chunk_count, 1));
2551                 PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
2552                 dump_add_page(m->phys_addr);
2553                 pc = (void *)PHYS_TO_DMAP(m->phys_addr);
2554                 pc->pc_pmap = pmap;
2555                 pc->pc_map[0] = PC_FREE0;
2556                 pc->pc_map[1] = PC_FREE1;
2557                 pc->pc_map[2] = PC_FREE2;
2558                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2559                 TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru);
2560                 PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV));
2561
2562                 /*
2563                  * The reclaim might have freed a chunk from the current pmap.
2564                  * If that chunk contained available entries, we need to
2565                  * re-count the number of available entries.
2566                  */
2567                 if (reclaimed)
2568                         goto retry;
2569         }
2570         if (!TAILQ_EMPTY(&new_tail)) {
2571                 mtx_lock(&pv_chunks_mutex);
2572                 TAILQ_CONCAT(&pv_chunks, &new_tail, pc_lru);
2573                 mtx_unlock(&pv_chunks_mutex);
2574         }
2575 }
2576
2577 /*
2578  * First find and then remove the pv entry for the specified pmap and virtual
2579  * address from the specified pv list.  Returns the pv entry if found and NULL
2580  * otherwise.  This operation can be performed on pv lists for either 4KB or
2581  * 2MB page mappings.
2582  */
2583 static __inline pv_entry_t
2584 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
2585 {
2586         pv_entry_t pv;
2587
2588         TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
2589                 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
2590                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
2591                         pvh->pv_gen++;
2592                         break;
2593                 }
2594         }
2595         return (pv);
2596 }
2597
2598 /*
2599  * After demotion from a 2MB page mapping to 512 4KB page mappings,
2600  * destroy the pv entry for the 2MB page mapping and reinstantiate the pv
2601  * entries for each of the 4KB page mappings.
2602  */
2603 static void
2604 pmap_pv_demote_l2(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
2605     struct rwlock **lockp)
2606 {
2607         struct md_page *pvh;
2608         struct pv_chunk *pc;
2609         pv_entry_t pv;
2610         vm_offset_t va_last;
2611         vm_page_t m;
2612         int bit, field;
2613
2614         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2615         KASSERT((va & L2_OFFSET) == 0,
2616             ("pmap_pv_demote_l2: va is not 2mpage aligned"));
2617         KASSERT((pa & L2_OFFSET) == 0,
2618             ("pmap_pv_demote_l2: pa is not 2mpage aligned"));
2619         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
2620
2621         /*
2622          * Transfer the 2mpage's pv entry for this mapping to the first
2623          * page's pv list.  Once this transfer begins, the pv list lock
2624          * must not be released until the last pv entry is reinstantiated.
2625          */
2626         pvh = pa_to_pvh(pa);
2627         pv = pmap_pvh_remove(pvh, pmap, va);
2628         KASSERT(pv != NULL, ("pmap_pv_demote_l2: pv not found"));
2629         m = PHYS_TO_VM_PAGE(pa);
2630         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2631         m->md.pv_gen++;
2632         /* Instantiate the remaining Ln_ENTRIES - 1 pv entries. */
2633         PV_STAT(atomic_add_long(&pv_entry_allocs, Ln_ENTRIES - 1));
2634         va_last = va + L2_SIZE - PAGE_SIZE;
2635         for (;;) {
2636                 pc = TAILQ_FIRST(&pmap->pm_pvchunk);
2637                 KASSERT(pc->pc_map[0] != 0 || pc->pc_map[1] != 0 ||
2638                     pc->pc_map[2] != 0, ("pmap_pv_demote_l2: missing spare"));
2639                 for (field = 0; field < _NPCM; field++) {
2640                         while (pc->pc_map[field]) {
2641                                 bit = ffsl(pc->pc_map[field]) - 1;
2642                                 pc->pc_map[field] &= ~(1ul << bit);
2643                                 pv = &pc->pc_pventry[field * 64 + bit];
2644                                 va += PAGE_SIZE;
2645                                 pv->pv_va = va;
2646                                 m++;
2647                                 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2648                             ("pmap_pv_demote_l2: page %p is not managed", m));
2649                                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2650                                 m->md.pv_gen++;
2651                                 if (va == va_last)
2652                                         goto out;
2653                         }
2654                 }
2655                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2656                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
2657         }
2658 out:
2659         if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 && pc->pc_map[2] == 0) {
2660                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2661                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
2662         }
2663         PV_STAT(atomic_add_long(&pv_entry_count, Ln_ENTRIES - 1));
2664         PV_STAT(atomic_subtract_int(&pv_entry_spare, Ln_ENTRIES - 1));
2665 }
2666
2667 /*
2668  * First find and then destroy the pv entry for the specified pmap and virtual
2669  * address.  This operation can be performed on pv lists for either 4KB or 2MB
2670  * page mappings.
2671  */
2672 static void
2673 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
2674 {
2675         pv_entry_t pv;
2676
2677         pv = pmap_pvh_remove(pvh, pmap, va);
2678         KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
2679         free_pv_entry(pmap, pv);
2680 }
2681
2682 /*
2683  * Conditionally create the PV entry for a 4KB page mapping if the required
2684  * memory can be allocated without resorting to reclamation.
2685  */
2686 static boolean_t
2687 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m,
2688     struct rwlock **lockp)
2689 {
2690         pv_entry_t pv;
2691
2692         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2693         /* Pass NULL instead of the lock pointer to disable reclamation. */
2694         if ((pv = get_pv_entry(pmap, NULL)) != NULL) {
2695                 pv->pv_va = va;
2696                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
2697                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2698                 m->md.pv_gen++;
2699                 return (TRUE);
2700         } else
2701                 return (FALSE);
2702 }
2703
2704 /*
2705  * Create the PV entry for a 2MB page mapping.  Always returns true unless the
2706  * flag PMAP_ENTER_NORECLAIM is specified.  If that flag is specified, returns
2707  * false if the PV entry cannot be allocated without resorting to reclamation.
2708  */
2709 static bool
2710 pmap_pv_insert_l2(pmap_t pmap, vm_offset_t va, pd_entry_t l2e, u_int flags,
2711     struct rwlock **lockp)
2712 {
2713         struct md_page *pvh;
2714         pv_entry_t pv;
2715         vm_paddr_t pa;
2716
2717         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2718         /* Pass NULL instead of the lock pointer to disable reclamation. */
2719         if ((pv = get_pv_entry(pmap, (flags & PMAP_ENTER_NORECLAIM) != 0 ?
2720             NULL : lockp)) == NULL)
2721                 return (false);
2722         pv->pv_va = va;
2723         pa = l2e & ~ATTR_MASK;
2724         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
2725         pvh = pa_to_pvh(pa);
2726         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
2727         pvh->pv_gen++;
2728         return (true);
2729 }
2730
2731 static void
2732 pmap_remove_kernel_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va)
2733 {
2734         pt_entry_t newl2, oldl2;
2735         vm_page_t ml3;
2736         vm_paddr_t ml3pa;
2737
2738         KASSERT(!VIRT_IN_DMAP(va), ("removing direct mapping of %#lx", va));
2739         KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap));
2740         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2741
2742         ml3 = pmap_remove_pt_page(pmap, va);
2743         if (ml3 == NULL)
2744                 panic("pmap_remove_kernel_l2: Missing pt page");
2745
2746         ml3pa = VM_PAGE_TO_PHYS(ml3);
2747         newl2 = ml3pa | L2_TABLE;
2748
2749         /*
2750          * If this page table page was unmapped by a promotion, then it
2751          * contains valid mappings.  Zero it to invalidate those mappings.
2752          */
2753         if (ml3->valid != 0)
2754                 pagezero((void *)PHYS_TO_DMAP(ml3pa));
2755
2756         /*
2757          * Demote the mapping.  The caller must have already invalidated the
2758          * mapping (i.e., the "break" in break-before-make).
2759          */
2760         oldl2 = pmap_load_store(l2, newl2);
2761         KASSERT(oldl2 == 0, ("%s: found existing mapping at %p: %#lx",
2762             __func__, l2, oldl2));
2763 }
2764
2765 /*
2766  * pmap_remove_l2: Do the things to unmap a level 2 superpage.
2767  */
2768 static int
2769 pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
2770     pd_entry_t l1e, struct spglist *free, struct rwlock **lockp)
2771 {
2772         struct md_page *pvh;
2773         pt_entry_t old_l2;
2774         vm_offset_t eva, va;
2775         vm_page_t m, ml3;
2776
2777         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2778         KASSERT((sva & L2_OFFSET) == 0, ("pmap_remove_l2: sva is not aligned"));
2779         old_l2 = pmap_load_clear(l2);
2780         KASSERT((old_l2 & ATTR_DESCR_MASK) == L2_BLOCK,
2781             ("pmap_remove_l2: L2e %lx is not a block mapping", old_l2));
2782
2783         /*
2784          * Since a promotion must break the 4KB page mappings before making
2785          * the 2MB page mapping, a pmap_invalidate_page() suffices.
2786          */
2787         pmap_invalidate_page(pmap, sva);
2788
2789         if (old_l2 & ATTR_SW_WIRED)
2790                 pmap->pm_stats.wired_count -= L2_SIZE / PAGE_SIZE;
2791         pmap_resident_count_dec(pmap, L2_SIZE / PAGE_SIZE);
2792         if (old_l2 & ATTR_SW_MANAGED) {
2793                 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, old_l2 & ~ATTR_MASK);
2794                 pvh = pa_to_pvh(old_l2 & ~ATTR_MASK);
2795                 pmap_pvh_free(pvh, pmap, sva);
2796                 eva = sva + L2_SIZE;
2797                 for (va = sva, m = PHYS_TO_VM_PAGE(old_l2 & ~ATTR_MASK);
2798                     va < eva; va += PAGE_SIZE, m++) {
2799                         if (pmap_pte_dirty(pmap, old_l2))
2800                                 vm_page_dirty(m);
2801                         if (old_l2 & ATTR_AF)
2802                                 vm_page_aflag_set(m, PGA_REFERENCED);
2803                         if (TAILQ_EMPTY(&m->md.pv_list) &&
2804                             TAILQ_EMPTY(&pvh->pv_list))
2805                                 vm_page_aflag_clear(m, PGA_WRITEABLE);
2806                 }
2807         }
2808         if (pmap == kernel_pmap) {
2809                 pmap_remove_kernel_l2(pmap, l2, sva);
2810         } else {
2811                 ml3 = pmap_remove_pt_page(pmap, sva);
2812                 if (ml3 != NULL) {
2813                         KASSERT(ml3->valid == VM_PAGE_BITS_ALL,
2814                             ("pmap_remove_l2: l3 page not promoted"));
2815                         pmap_resident_count_dec(pmap, 1);
2816                         KASSERT(ml3->ref_count == NL3PG,
2817                             ("pmap_remove_l2: l3 page ref count error"));
2818                         ml3->ref_count = 0;
2819                         pmap_add_delayed_free_list(ml3, free, FALSE);
2820                 }
2821         }
2822         return (pmap_unuse_pt(pmap, sva, l1e, free));
2823 }
2824
2825 /*
2826  * pmap_remove_l3: do the things to unmap a page in a process
2827  */
2828 static int
2829 pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t va,
2830     pd_entry_t l2e, struct spglist *free, struct rwlock **lockp)
2831 {
2832         struct md_page *pvh;
2833         pt_entry_t old_l3;
2834         vm_page_t m;
2835
2836         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2837         old_l3 = pmap_load_clear(l3);
2838         pmap_invalidate_page(pmap, va);
2839         if (old_l3 & ATTR_SW_WIRED)
2840                 pmap->pm_stats.wired_count -= 1;
2841         pmap_resident_count_dec(pmap, 1);
2842         if (old_l3 & ATTR_SW_MANAGED) {
2843                 m = PHYS_TO_VM_PAGE(old_l3 & ~ATTR_MASK);
2844                 if (pmap_pte_dirty(pmap, old_l3))
2845                         vm_page_dirty(m);
2846                 if (old_l3 & ATTR_AF)
2847                         vm_page_aflag_set(m, PGA_REFERENCED);
2848                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
2849                 pmap_pvh_free(&m->md, pmap, va);
2850                 if (TAILQ_EMPTY(&m->md.pv_list) &&
2851                     (m->flags & PG_FICTITIOUS) == 0) {
2852                         pvh = page_to_pvh(m);
2853                         if (TAILQ_EMPTY(&pvh->pv_list))
2854                                 vm_page_aflag_clear(m, PGA_WRITEABLE);
2855                 }
2856         }
2857         return (pmap_unuse_pt(pmap, va, l2e, free));
2858 }
2859
2860 /*
2861  * Remove the specified range of addresses from the L3 page table that is
2862  * identified by the given L2 entry.
2863  */
2864 static void
2865 pmap_remove_l3_range(pmap_t pmap, pd_entry_t l2e, vm_offset_t sva,
2866     vm_offset_t eva, struct spglist *free, struct rwlock **lockp)
2867 {
2868         struct md_page *pvh;
2869         struct rwlock *new_lock;
2870         pt_entry_t *l3, old_l3;
2871         vm_offset_t va;
2872         vm_page_t l3pg, m;
2873
2874         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2875         KASSERT(rounddown2(sva, L2_SIZE) + L2_SIZE == roundup2(eva, L2_SIZE),
2876             ("pmap_remove_l3_range: range crosses an L3 page table boundary"));
2877         l3pg = sva < VM_MAXUSER_ADDRESS ? PHYS_TO_VM_PAGE(l2e & ~ATTR_MASK) :
2878             NULL;
2879         va = eva;
2880         for (l3 = pmap_l2_to_l3(&l2e, sva); sva != eva; l3++, sva += L3_SIZE) {
2881                 if (!pmap_l3_valid(pmap_load(l3))) {
2882                         if (va != eva) {
2883                                 pmap_invalidate_range(pmap, va, sva);
2884                                 va = eva;
2885                         }
2886                         continue;
2887                 }
2888                 old_l3 = pmap_load_clear(l3);
2889                 if ((old_l3 & ATTR_SW_WIRED) != 0)
2890                         pmap->pm_stats.wired_count--;
2891                 pmap_resident_count_dec(pmap, 1);
2892                 if ((old_l3 & ATTR_SW_MANAGED) != 0) {
2893                         m = PHYS_TO_VM_PAGE(old_l3 & ~ATTR_MASK);
2894                         if (pmap_pte_dirty(pmap, old_l3))
2895                                 vm_page_dirty(m);
2896                         if ((old_l3 & ATTR_AF) != 0)
2897                                 vm_page_aflag_set(m, PGA_REFERENCED);
2898                         new_lock = PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m));
2899                         if (new_lock != *lockp) {
2900                                 if (*lockp != NULL) {
2901                                         /*
2902                                          * Pending TLB invalidations must be
2903                                          * performed before the PV list lock is
2904                                          * released.  Otherwise, a concurrent
2905                                          * pmap_remove_all() on a physical page
2906                                          * could return while a stale TLB entry
2907                                          * still provides access to that page. 
2908                                          */
2909                                         if (va != eva) {
2910                                                 pmap_invalidate_range(pmap, va,
2911                                                     sva);
2912                                                 va = eva;
2913                                         }
2914                                         rw_wunlock(*lockp);
2915                                 }
2916                                 *lockp = new_lock;
2917                                 rw_wlock(*lockp);
2918                         }
2919                         pmap_pvh_free(&m->md, pmap, sva);
2920                         if (TAILQ_EMPTY(&m->md.pv_list) &&
2921                             (m->flags & PG_FICTITIOUS) == 0) {
2922                                 pvh = page_to_pvh(m);
2923                                 if (TAILQ_EMPTY(&pvh->pv_list))
2924                                         vm_page_aflag_clear(m, PGA_WRITEABLE);
2925                         }
2926                 }
2927                 if (va == eva)
2928                         va = sva;
2929                 if (l3pg != NULL && pmap_unwire_l3(pmap, sva, l3pg, free)) {
2930                         sva += L3_SIZE;
2931                         break;
2932                 }
2933         }
2934         if (va != eva)
2935                 pmap_invalidate_range(pmap, va, sva);
2936 }
2937
2938 /*
2939  *      Remove the given range of addresses from the specified map.
2940  *
2941  *      It is assumed that the start and end are properly
2942  *      rounded to the page size.
2943  */
2944 void
2945 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2946 {
2947         struct rwlock *lock;
2948         vm_offset_t va_next;
2949         pd_entry_t *l0, *l1, *l2;
2950         pt_entry_t l3_paddr;
2951         struct spglist free;
2952
2953         /*
2954          * Perform an unsynchronized read.  This is, however, safe.
2955          */
2956         if (pmap->pm_stats.resident_count == 0)
2957                 return;
2958
2959         SLIST_INIT(&free);
2960
2961         PMAP_LOCK(pmap);
2962
2963         lock = NULL;
2964         for (; sva < eva; sva = va_next) {
2965                 if (pmap->pm_stats.resident_count == 0)
2966                         break;
2967
2968                 l0 = pmap_l0(pmap, sva);
2969                 if (pmap_load(l0) == 0) {
2970                         va_next = (sva + L0_SIZE) & ~L0_OFFSET;
2971                         if (va_next < sva)
2972                                 va_next = eva;
2973                         continue;
2974                 }
2975
2976                 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
2977                 if (va_next < sva)
2978                         va_next = eva;
2979                 l1 = pmap_l0_to_l1(l0, sva);
2980                 if (pmap_load(l1) == 0)
2981                         continue;
2982                 if ((pmap_load(l1) & ATTR_DESCR_MASK) == L1_BLOCK) {
2983                         KASSERT(va_next <= eva,
2984                             ("partial update of non-transparent 1G page "
2985                             "l1 %#lx sva %#lx eva %#lx va_next %#lx",
2986                             pmap_load(l1), sva, eva, va_next));
2987                         MPASS(pmap != kernel_pmap);
2988                         MPASS((pmap_load(l1) & ATTR_SW_MANAGED) == 0);
2989                         pmap_clear(l1);
2990                         pmap_invalidate_page(pmap, sva);
2991                         pmap_resident_count_dec(pmap, L1_SIZE / PAGE_SIZE);
2992                         pmap_unuse_pt(pmap, sva, pmap_load(l0), &free);
2993                         continue;
2994                 }
2995
2996                 /*
2997                  * Calculate index for next page table.
2998                  */
2999                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
3000                 if (va_next < sva)
3001                         va_next = eva;
3002
3003                 l2 = pmap_l1_to_l2(l1, sva);
3004                 if (l2 == NULL)
3005                         continue;
3006
3007                 l3_paddr = pmap_load(l2);
3008
3009                 if ((l3_paddr & ATTR_DESCR_MASK) == L2_BLOCK) {
3010                         if (sva + L2_SIZE == va_next && eva >= va_next) {
3011                                 pmap_remove_l2(pmap, l2, sva, pmap_load(l1),
3012                                     &free, &lock);
3013                                 continue;
3014                         } else if (pmap_demote_l2_locked(pmap, l2, sva,
3015                             &lock) == NULL)
3016                                 continue;
3017                         l3_paddr = pmap_load(l2);
3018                 }
3019
3020                 /*
3021                  * Weed out invalid mappings.
3022                  */
3023                 if ((l3_paddr & ATTR_DESCR_MASK) != L2_TABLE)
3024                         continue;
3025
3026                 /*
3027                  * Limit our scan to either the end of the va represented
3028                  * by the current page table page, or to the end of the
3029                  * range being removed.
3030                  */
3031                 if (va_next > eva)
3032                         va_next = eva;
3033
3034                 pmap_remove_l3_range(pmap, l3_paddr, sva, va_next, &free,
3035                     &lock);
3036         }
3037         if (lock != NULL)
3038                 rw_wunlock(lock);
3039         PMAP_UNLOCK(pmap);
3040         vm_page_free_pages_toq(&free, true);
3041 }
3042
3043 /*
3044  *      Routine:        pmap_remove_all
3045  *      Function:
3046  *              Removes this physical page from
3047  *              all physical maps in which it resides.
3048  *              Reflects back modify bits to the pager.
3049  *
3050  *      Notes:
3051  *              Original versions of this routine were very
3052  *              inefficient because they iteratively called
3053  *              pmap_remove (slow...)
3054  */
3055
3056 void
3057 pmap_remove_all(vm_page_t m)
3058 {
3059         struct md_page *pvh;
3060         pv_entry_t pv;
3061         pmap_t pmap;
3062         struct rwlock *lock;
3063         pd_entry_t *pde, tpde;
3064         pt_entry_t *pte, tpte;
3065         vm_offset_t va;
3066         struct spglist free;
3067         int lvl, pvh_gen, md_gen;
3068
3069         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3070             ("pmap_remove_all: page %p is not managed", m));
3071         SLIST_INIT(&free);
3072         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
3073         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : page_to_pvh(m);
3074 retry:
3075         rw_wlock(lock);
3076         while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
3077                 pmap = PV_PMAP(pv);
3078                 if (!PMAP_TRYLOCK(pmap)) {
3079                         pvh_gen = pvh->pv_gen;
3080                         rw_wunlock(lock);
3081                         PMAP_LOCK(pmap);
3082                         rw_wlock(lock);
3083                         if (pvh_gen != pvh->pv_gen) {
3084                                 rw_wunlock(lock);
3085                                 PMAP_UNLOCK(pmap);
3086                                 goto retry;
3087                         }
3088                 }
3089                 va = pv->pv_va;
3090                 pte = pmap_pte(pmap, va, &lvl);
3091                 KASSERT(pte != NULL,
3092                     ("pmap_remove_all: no page table entry found"));
3093                 KASSERT(lvl == 2,
3094                     ("pmap_remove_all: invalid pte level %d", lvl));
3095
3096                 pmap_demote_l2_locked(pmap, pte, va, &lock);
3097                 PMAP_UNLOCK(pmap);
3098         }
3099         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3100                 pmap = PV_PMAP(pv);
3101                 PMAP_ASSERT_STAGE1(pmap);
3102                 if (!PMAP_TRYLOCK(pmap)) {
3103                         pvh_gen = pvh->pv_gen;
3104                         md_gen = m->md.pv_gen;
3105                         rw_wunlock(lock);
3106                         PMAP_LOCK(pmap);
3107                         rw_wlock(lock);
3108                         if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
3109                                 rw_wunlock(lock);
3110                                 PMAP_UNLOCK(pmap);
3111                                 goto retry;
3112                         }
3113                 }
3114                 pmap_resident_count_dec(pmap, 1);
3115
3116                 pde = pmap_pde(pmap, pv->pv_va, &lvl);
3117                 KASSERT(pde != NULL,
3118                     ("pmap_remove_all: no page directory entry found"));
3119                 KASSERT(lvl == 2,
3120                     ("pmap_remove_all: invalid pde level %d", lvl));
3121                 tpde = pmap_load(pde);
3122
3123                 pte = pmap_l2_to_l3(pde, pv->pv_va);
3124                 tpte = pmap_load_clear(pte);
3125                 if (tpte & ATTR_SW_WIRED)
3126                         pmap->pm_stats.wired_count--;
3127                 if ((tpte & ATTR_AF) != 0) {
3128                         pmap_invalidate_page(pmap, pv->pv_va);
3129                         vm_page_aflag_set(m, PGA_REFERENCED);
3130                 }
3131
3132                 /*
3133                  * Update the vm_page_t clean and reference bits.
3134                  */
3135                 if (pmap_pte_dirty(pmap, tpte))
3136                         vm_page_dirty(m);
3137                 pmap_unuse_pt(pmap, pv->pv_va, tpde, &free);
3138                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
3139                 m->md.pv_gen++;
3140                 free_pv_entry(pmap, pv);
3141                 PMAP_UNLOCK(pmap);
3142         }
3143         vm_page_aflag_clear(m, PGA_WRITEABLE);
3144         rw_wunlock(lock);
3145         vm_page_free_pages_toq(&free, true);
3146 }
3147
3148 /*
3149  * pmap_protect_l2: do the things to protect a 2MB page in a pmap
3150  */
3151 static void
3152 pmap_protect_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva, pt_entry_t mask,
3153     pt_entry_t nbits)
3154 {
3155         pd_entry_t old_l2;
3156         vm_page_t m, mt;
3157
3158         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3159         PMAP_ASSERT_STAGE1(pmap);
3160         KASSERT((sva & L2_OFFSET) == 0,
3161             ("pmap_protect_l2: sva is not 2mpage aligned"));
3162         old_l2 = pmap_load(l2);
3163         KASSERT((old_l2 & ATTR_DESCR_MASK) == L2_BLOCK,
3164             ("pmap_protect_l2: L2e %lx is not a block mapping", old_l2));
3165
3166         /*
3167          * Return if the L2 entry already has the desired access restrictions
3168          * in place.
3169          */
3170 retry:
3171         if ((old_l2 & mask) == nbits)
3172                 return;
3173
3174         /*
3175          * When a dirty read/write superpage mapping is write protected,
3176          * update the dirty field of each of the superpage's constituent 4KB
3177          * pages.
3178          */
3179         if ((old_l2 & ATTR_SW_MANAGED) != 0 &&
3180             (nbits & ATTR_S1_AP(ATTR_S1_AP_RO)) != 0 &&
3181             pmap_pte_dirty(pmap, old_l2)) {
3182                 m = PHYS_TO_VM_PAGE(old_l2 & ~ATTR_MASK);
3183                 for (mt = m; mt < &m[L2_SIZE / PAGE_SIZE]; mt++)
3184                         vm_page_dirty(mt);
3185         }
3186
3187         if (!atomic_fcmpset_64(l2, &old_l2, (old_l2 & ~mask) | nbits))
3188                 goto retry;
3189
3190         /*
3191          * Since a promotion must break the 4KB page mappings before making
3192          * the 2MB page mapping, a pmap_invalidate_page() suffices.
3193          */
3194         pmap_invalidate_page(pmap, sva);
3195 }
3196
3197 /*
3198  *      Set the physical protection on the
3199  *      specified range of this map as requested.
3200  */
3201 void
3202 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
3203 {
3204         vm_offset_t va, va_next;
3205         pd_entry_t *l0, *l1, *l2;
3206         pt_entry_t *l3p, l3, mask, nbits;
3207
3208         PMAP_ASSERT_STAGE1(pmap);
3209         KASSERT((prot & ~VM_PROT_ALL) == 0, ("invalid prot %x", prot));
3210         if (prot == VM_PROT_NONE) {
3211                 pmap_remove(pmap, sva, eva);
3212                 return;
3213         }
3214
3215         mask = nbits = 0;
3216         if ((prot & VM_PROT_WRITE) == 0) {
3217                 mask |= ATTR_S1_AP_RW_BIT | ATTR_SW_DBM;
3218                 nbits |= ATTR_S1_AP(ATTR_S1_AP_RO);
3219         }
3220         if ((prot & VM_PROT_EXECUTE) == 0) {
3221                 mask |= ATTR_S1_XN;
3222                 nbits |= ATTR_S1_XN;
3223         }
3224         if (mask == 0)
3225                 return;
3226
3227         PMAP_LOCK(pmap);
3228         for (; sva < eva; sva = va_next) {
3229                 l0 = pmap_l0(pmap, sva);
3230                 if (pmap_load(l0) == 0) {
3231                         va_next = (sva + L0_SIZE) & ~L0_OFFSET;
3232                         if (va_next < sva)
3233                                 va_next = eva;
3234                         continue;
3235                 }
3236
3237                 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
3238                 if (va_next < sva)
3239                         va_next = eva;
3240                 l1 = pmap_l0_to_l1(l0, sva);
3241                 if (pmap_load(l1) == 0)
3242                         continue;
3243                 if ((pmap_load(l1) & ATTR_DESCR_MASK) == L1_BLOCK) {
3244                         KASSERT(va_next <= eva,
3245                             ("partial update of non-transparent 1G page "
3246                             "l1 %#lx sva %#lx eva %#lx va_next %#lx",
3247                             pmap_load(l1), sva, eva, va_next));
3248                         MPASS((pmap_load(l1) & ATTR_SW_MANAGED) == 0);
3249                         if ((pmap_load(l1) & mask) != nbits) {
3250                                 pmap_store(l1, (pmap_load(l1) & ~mask) | nbits);
3251                                 pmap_invalidate_page(pmap, sva);
3252                         }
3253                         continue;
3254                 }
3255
3256                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
3257                 if (va_next < sva)
3258                         va_next = eva;
3259
3260                 l2 = pmap_l1_to_l2(l1, sva);
3261                 if (pmap_load(l2) == 0)
3262                         continue;
3263
3264                 if ((pmap_load(l2) & ATTR_DESCR_MASK) == L2_BLOCK) {
3265                         if (sva + L2_SIZE == va_next && eva >= va_next) {
3266                                 pmap_protect_l2(pmap, l2, sva, mask, nbits);
3267                                 continue;
3268                         } else if (pmap_demote_l2(pmap, l2, sva) == NULL)
3269                                 continue;
3270                 }
3271                 KASSERT((pmap_load(l2) & ATTR_DESCR_MASK) == L2_TABLE,
3272                     ("pmap_protect: Invalid L2 entry after demotion"));
3273
3274                 if (va_next > eva)
3275                         va_next = eva;
3276
3277                 va = va_next;
3278                 for (l3p = pmap_l2_to_l3(l2, sva); sva != va_next; l3p++,
3279                     sva += L3_SIZE) {
3280                         l3 = pmap_load(l3p);
3281 retry:
3282                         /*
3283                          * Go to the next L3 entry if the current one is
3284                          * invalid or already has the desired access
3285                          * restrictions in place.  (The latter case occurs
3286                          * frequently.  For example, in a "buildworld"
3287                          * workload, almost 1 out of 4 L3 entries already
3288                          * have the desired restrictions.)
3289                          */
3290                         if (!pmap_l3_valid(l3) || (l3 & mask) == nbits) {
3291                                 if (va != va_next) {
3292                                         pmap_invalidate_range(pmap, va, sva);
3293                                         va = va_next;
3294                                 }
3295                                 continue;
3296                         }
3297
3298                         /*
3299                          * When a dirty read/write mapping is write protected,
3300                          * update the page's dirty field.
3301                          */
3302                         if ((l3 & ATTR_SW_MANAGED) != 0 &&
3303                             (nbits & ATTR_S1_AP(ATTR_S1_AP_RO)) != 0 &&
3304                             pmap_pte_dirty(pmap, l3))
3305                                 vm_page_dirty(PHYS_TO_VM_PAGE(l3 & ~ATTR_MASK));
3306
3307                         if (!atomic_fcmpset_64(l3p, &l3, (l3 & ~mask) | nbits))
3308                                 goto retry;
3309                         if (va == va_next)
3310                                 va = sva;
3311                 }
3312                 if (va != va_next)
3313                         pmap_invalidate_range(pmap, va, sva);
3314         }
3315         PMAP_UNLOCK(pmap);
3316 }
3317
3318 /*
3319  * Inserts the specified page table page into the specified pmap's collection
3320  * of idle page table pages.  Each of a pmap's page table pages is responsible
3321  * for mapping a distinct range of virtual addresses.  The pmap's collection is
3322  * ordered by this virtual address range.
3323  *
3324  * If "promoted" is false, then the page table page "mpte" must be zero filled.
3325  */
3326 static __inline int
3327 pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte, bool promoted)
3328 {
3329
3330         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3331         mpte->valid = promoted ? VM_PAGE_BITS_ALL : 0;
3332         return (vm_radix_insert(&pmap->pm_root, mpte));
3333 }
3334
3335 /*
3336  * Removes the page table page mapping the specified virtual address from the
3337  * specified pmap's collection of idle page table pages, and returns it.
3338  * Otherwise, returns NULL if there is no page table page corresponding to the
3339  * specified virtual address.
3340  */
3341 static __inline vm_page_t
3342 pmap_remove_pt_page(pmap_t pmap, vm_offset_t va)
3343 {
3344
3345         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3346         return (vm_radix_remove(&pmap->pm_root, pmap_l2_pindex(va)));
3347 }
3348
3349 /*
3350  * Performs a break-before-make update of a pmap entry. This is needed when
3351  * either promoting or demoting pages to ensure the TLB doesn't get into an
3352  * inconsistent state.
3353  */
3354 static void
3355 pmap_update_entry(pmap_t pmap, pd_entry_t *pte, pd_entry_t newpte,
3356     vm_offset_t va, vm_size_t size)
3357 {
3358         register_t intr;
3359
3360         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3361
3362         /*
3363          * Ensure we don't get switched out with the page table in an
3364          * inconsistent state. We also need to ensure no interrupts fire
3365          * as they may make use of an address we are about to invalidate.
3366          */
3367         intr = intr_disable();
3368
3369         /*
3370          * Clear the old mapping's valid bit, but leave the rest of the entry
3371          * unchanged, so that a lockless, concurrent pmap_kextract() can still
3372          * lookup the physical address.
3373          */
3374         pmap_clear_bits(pte, ATTR_DESCR_VALID);
3375         pmap_invalidate_range(pmap, va, va + size);
3376
3377         /* Create the new mapping */
3378         pmap_store(pte, newpte);
3379         dsb(ishst);
3380
3381         intr_restore(intr);
3382 }
3383
3384 #if VM_NRESERVLEVEL > 0
3385 /*
3386  * After promotion from 512 4KB page mappings to a single 2MB page mapping,
3387  * replace the many pv entries for the 4KB page mappings by a single pv entry
3388  * for the 2MB page mapping.
3389  */
3390 static void
3391 pmap_pv_promote_l2(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
3392     struct rwlock **lockp)
3393 {
3394         struct md_page *pvh;
3395         pv_entry_t pv;
3396         vm_offset_t va_last;
3397         vm_page_t m;
3398
3399         KASSERT((pa & L2_OFFSET) == 0,
3400             ("pmap_pv_promote_l2: pa is not 2mpage aligned"));
3401         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
3402
3403         /*
3404          * Transfer the first page's pv entry for this mapping to the 2mpage's
3405          * pv list.  Aside from avoiding the cost of a call to get_pv_entry(),
3406          * a transfer avoids the possibility that get_pv_entry() calls
3407          * reclaim_pv_chunk() and that reclaim_pv_chunk() removes one of the
3408          * mappings that is being promoted.
3409          */
3410         m = PHYS_TO_VM_PAGE(pa);
3411         va = va & ~L2_OFFSET;
3412         pv = pmap_pvh_remove(&m->md, pmap, va);
3413         KASSERT(pv != NULL, ("pmap_pv_promote_l2: pv not found"));
3414         pvh = pa_to_pvh(pa);
3415         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
3416         pvh->pv_gen++;
3417         /* Free the remaining NPTEPG - 1 pv entries. */
3418         va_last = va + L2_SIZE - PAGE_SIZE;
3419         do {
3420                 m++;
3421                 va += PAGE_SIZE;
3422                 pmap_pvh_free(&m->md, pmap, va);
3423         } while (va < va_last);
3424 }
3425
3426 /*
3427  * Tries to promote the 512, contiguous 4KB page mappings that are within a
3428  * single level 2 table entry to a single 2MB page mapping.  For promotion
3429  * to occur, two conditions must be met: (1) the 4KB page mappings must map
3430  * aligned, contiguous physical memory and (2) the 4KB page mappings must have
3431  * identical characteristics.
3432  */
3433 static void
3434 pmap_promote_l2(pmap_t pmap, pd_entry_t *l2, vm_offset_t va,
3435     struct rwlock **lockp)
3436 {
3437         pt_entry_t *firstl3, *l3, newl2, oldl3, pa;
3438         vm_page_t mpte;
3439         vm_offset_t sva;
3440
3441         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3442         PMAP_ASSERT_STAGE1(pmap);
3443
3444         sva = va & ~L2_OFFSET;
3445         firstl3 = pmap_l2_to_l3(l2, sva);
3446         newl2 = pmap_load(firstl3);
3447
3448 setl2:
3449         if (((newl2 & (~ATTR_MASK | ATTR_AF)) & L2_OFFSET) != ATTR_AF) {
3450                 atomic_add_long(&pmap_l2_p_failures, 1);
3451                 CTR2(KTR_PMAP, "pmap_promote_l2: failure for va %#lx"
3452                     " in pmap %p", va, pmap);
3453                 return;
3454         }
3455
3456         if ((newl2 & (ATTR_S1_AP_RW_BIT | ATTR_SW_DBM)) ==
3457             (ATTR_S1_AP(ATTR_S1_AP_RO) | ATTR_SW_DBM)) {
3458                 if (!atomic_fcmpset_64(l2, &newl2, newl2 & ~ATTR_SW_DBM))
3459                         goto setl2;
3460                 newl2 &= ~ATTR_SW_DBM;
3461         }
3462
3463         pa = newl2 + L2_SIZE - PAGE_SIZE;
3464         for (l3 = firstl3 + NL3PG - 1; l3 > firstl3; l3--) {
3465                 oldl3 = pmap_load(l3);
3466 setl3:
3467                 if ((oldl3 & (ATTR_S1_AP_RW_BIT | ATTR_SW_DBM)) ==
3468                     (ATTR_S1_AP(ATTR_S1_AP_RO) | ATTR_SW_DBM)) {
3469                         if (!atomic_fcmpset_64(l3, &oldl3, oldl3 &
3470                             ~ATTR_SW_DBM))
3471                                 goto setl3;
3472                         oldl3 &= ~ATTR_SW_DBM;
3473                 }
3474                 if (oldl3 != pa) {
3475                         atomic_add_long(&pmap_l2_p_failures, 1);
3476                         CTR2(KTR_PMAP, "pmap_promote_l2: failure for va %#lx"
3477                             " in pmap %p", va, pmap);
3478                         return;
3479                 }
3480                 pa -= PAGE_SIZE;
3481         }
3482
3483         /*
3484          * Save the page table page in its current state until the L2
3485          * mapping the superpage is demoted by pmap_demote_l2() or
3486          * destroyed by pmap_remove_l3().
3487          */
3488         mpte = PHYS_TO_VM_PAGE(pmap_load(l2) & ~ATTR_MASK);
3489         KASSERT(mpte >= vm_page_array &&
3490             mpte < &vm_page_array[vm_page_array_size],
3491             ("pmap_promote_l2: page table page is out of range"));
3492         KASSERT(mpte->pindex == pmap_l2_pindex(va),
3493             ("pmap_promote_l2: page table page's pindex is wrong"));
3494         if (pmap_insert_pt_page(pmap, mpte, true)) {
3495                 atomic_add_long(&pmap_l2_p_failures, 1);
3496                 CTR2(KTR_PMAP,
3497                     "pmap_promote_l2: failure for va %#lx in pmap %p", va,
3498                     pmap);
3499                 return;
3500         }
3501
3502         if ((newl2 & ATTR_SW_MANAGED) != 0)
3503                 pmap_pv_promote_l2(pmap, va, newl2 & ~ATTR_MASK, lockp);
3504
3505         newl2 &= ~ATTR_DESCR_MASK;
3506         newl2 |= L2_BLOCK;
3507
3508         pmap_update_entry(pmap, l2, newl2, sva, L2_SIZE);
3509
3510         atomic_add_long(&pmap_l2_promotions, 1);
3511         CTR2(KTR_PMAP, "pmap_promote_l2: success for va %#lx in pmap %p", va,
3512                     pmap);
3513 }
3514 #endif /* VM_NRESERVLEVEL > 0 */
3515
3516 static int
3517 pmap_enter_largepage(pmap_t pmap, vm_offset_t va, pt_entry_t newpte, int flags,
3518     int psind)
3519 {
3520         pd_entry_t *l0p, *l1p, *l2p, origpte;
3521         vm_page_t mp;
3522
3523         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3524         KASSERT(psind > 0 && psind < MAXPAGESIZES,
3525             ("psind %d unexpected", psind));
3526         KASSERT(((newpte & ~ATTR_MASK) & (pagesizes[psind] - 1)) == 0,
3527             ("unaligned phys address %#lx newpte %#lx psind %d",
3528             (newpte & ~ATTR_MASK), newpte, psind));
3529
3530 restart:
3531         if (psind == 2) {
3532                 l0p = pmap_l0(pmap, va);
3533                 if ((pmap_load(l0p) & ATTR_DESCR_VALID) == 0) {
3534                         mp = _pmap_alloc_l3(pmap, pmap_l0_pindex(va), NULL);
3535                         if (mp == NULL) {
3536                                 if ((flags & PMAP_ENTER_NOSLEEP) != 0)
3537                                         return (KERN_RESOURCE_SHORTAGE);
3538                                 PMAP_UNLOCK(pmap);
3539                                 vm_wait(NULL);
3540                                 PMAP_LOCK(pmap);
3541                                 goto restart;
3542                         }
3543                         l1p = pmap_l0_to_l1(l0p, va);
3544                         KASSERT(l1p != NULL, ("va %#lx lost l1 entry", va));
3545                         origpte = pmap_load(l1p);
3546                 } else {
3547                         l1p = pmap_l0_to_l1(l0p, va);
3548                         KASSERT(l1p != NULL, ("va %#lx lost l1 entry", va));
3549                         origpte = pmap_load(l1p);
3550                         if ((origpte & ATTR_DESCR_VALID) == 0) {
3551                                 mp = PHYS_TO_VM_PAGE(pmap_load(l0p) &
3552                                     ~ATTR_MASK);
3553                                 mp->ref_count++;
3554                         }
3555                 }
3556                 KASSERT((origpte & ATTR_DESCR_VALID) == 0 ||
3557                     ((origpte & ATTR_DESCR_MASK) == L1_BLOCK &&
3558                      (origpte & ~ATTR_MASK) == (newpte & ~ATTR_MASK)),
3559                     ("va %#lx changing 1G phys page l1 %#lx newpte %#lx",
3560                     va, origpte, newpte));
3561                 pmap_store(l1p, newpte);
3562         } else /* (psind == 1) */ {
3563                 l2p = pmap_l2(pmap, va);
3564                 if (l2p == NULL) {
3565                         mp = _pmap_alloc_l3(pmap, pmap_l1_pindex(va), NULL);
3566                         if (mp == NULL) {
3567                                 if ((flags & PMAP_ENTER_NOSLEEP) != 0)
3568                                         return (KERN_RESOURCE_SHORTAGE);
3569                                 PMAP_UNLOCK(pmap);
3570                                 vm_wait(NULL);
3571                                 PMAP_LOCK(pmap);
3572                                 goto restart;
3573                         }
3574                         l2p = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mp));
3575                         l2p = &l2p[pmap_l2_index(va)];
3576                         origpte = pmap_load(l2p);
3577                 } else {
3578                         l1p = pmap_l1(pmap, va);
3579                         origpte = pmap_load(l2p);
3580                         if ((origpte & ATTR_DESCR_VALID) == 0) {
3581                                 mp = PHYS_TO_VM_PAGE(pmap_load(l1p) &
3582                                     ~ATTR_MASK);
3583                                 mp->ref_count++;
3584                         }
3585                 }
3586                 KASSERT((origpte & ATTR_DESCR_VALID) == 0 ||
3587                     ((origpte & ATTR_DESCR_MASK) == L2_BLOCK &&
3588                      (origpte & ~ATTR_MASK) == (newpte & ~ATTR_MASK)),
3589                     ("va %#lx changing 2M phys page l2 %#lx newpte %#lx",
3590                     va, origpte, newpte));
3591                 pmap_store(l2p, newpte);
3592         }
3593         dsb(ishst);
3594
3595         if ((origpte & ATTR_DESCR_VALID) == 0)
3596                 pmap_resident_count_inc(pmap, pagesizes[psind] / PAGE_SIZE);
3597         if ((newpte & ATTR_SW_WIRED) != 0 && (origpte & ATTR_SW_WIRED) == 0)
3598                 pmap->pm_stats.wired_count += pagesizes[psind] / PAGE_SIZE;
3599         else if ((newpte & ATTR_SW_WIRED) == 0 &&
3600             (origpte & ATTR_SW_WIRED) != 0)
3601                 pmap->pm_stats.wired_count -= pagesizes[psind] / PAGE_SIZE;
3602
3603         return (KERN_SUCCESS);
3604 }
3605
3606 /*
3607  *      Insert the given physical page (p) at
3608  *      the specified virtual address (v) in the
3609  *      target physical map with the protection requested.
3610  *
3611  *      If specified, the page will be wired down, meaning
3612  *      that the related pte can not be reclaimed.
3613  *
3614  *      NB:  This is the only routine which MAY NOT lazy-evaluate
3615  *      or lose information.  That is, this routine must actually
3616  *      insert this page into the given map NOW.
3617  */
3618 int
3619 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
3620     u_int flags, int8_t psind)
3621 {
3622         struct rwlock *lock;
3623         pd_entry_t *pde;
3624         pt_entry_t new_l3, orig_l3;
3625         pt_entry_t *l2, *l3;
3626         pv_entry_t pv;
3627         vm_paddr_t opa, pa;
3628         vm_page_t mpte, om;
3629         boolean_t nosleep;
3630         int lvl, rv;
3631
3632         va = trunc_page(va);
3633         if ((m->oflags & VPO_UNMANAGED) == 0)
3634                 VM_PAGE_OBJECT_BUSY_ASSERT(m);
3635         pa = VM_PAGE_TO_PHYS(m);
3636         new_l3 = (pt_entry_t)(pa | ATTR_DEFAULT | L3_PAGE);
3637         new_l3 |= pmap_pte_memattr(pmap, m->md.pv_memattr);
3638         new_l3 |= pmap_pte_prot(pmap, prot);
3639
3640         if ((flags & PMAP_ENTER_WIRED) != 0)
3641                 new_l3 |= ATTR_SW_WIRED;
3642         if (pmap->pm_stage == PM_STAGE1) {
3643                 if (va < VM_MAXUSER_ADDRESS)
3644                         new_l3 |= ATTR_S1_AP(ATTR_S1_AP_USER) | ATTR_S1_PXN;
3645                 else
3646                         new_l3 |= ATTR_S1_UXN;
3647                 if (pmap != kernel_pmap)
3648                         new_l3 |= ATTR_S1_nG;
3649         } else {
3650                 /*
3651                  * Clear the access flag on executable mappings, this will be
3652                  * set later when the page is accessed. The fault handler is
3653                  * required to invalidate the I-cache.
3654                  *
3655                  * TODO: Switch to the valid flag to allow hardware management
3656                  * of the access flag. Much of the pmap code assumes the
3657                  * valid flag is set and fails to destroy the old page tables
3658                  * correctly if it is clear.
3659                  */
3660                 if (prot & VM_PROT_EXECUTE)
3661                         new_l3 &= ~ATTR_AF;
3662         }
3663         if ((m->oflags & VPO_UNMANAGED) == 0) {
3664                 new_l3 |= ATTR_SW_MANAGED;
3665                 if ((prot & VM_PROT_WRITE) != 0) {
3666                         new_l3 |= ATTR_SW_DBM;
3667                         if ((flags & VM_PROT_WRITE) == 0) {
3668                                 if (pmap->pm_stage == PM_STAGE1)
3669                                         new_l3 |= ATTR_S1_AP(ATTR_S1_AP_RO);
3670                                 else
3671                                         new_l3 &=
3672                                             ~ATTR_S2_S2AP(ATTR_S2_S2AP_WRITE);
3673                         }
3674                 }
3675         }
3676
3677         CTR2(KTR_PMAP, "pmap_enter: %.16lx -> %.16lx", va, pa);
3678
3679         lock = NULL;
3680         PMAP_LOCK(pmap);
3681         if ((flags & PMAP_ENTER_LARGEPAGE) != 0) {
3682                 KASSERT((m->oflags & VPO_UNMANAGED) != 0,
3683                     ("managed largepage va %#lx flags %#x", va, flags));
3684                 new_l3 &= ~L3_PAGE;
3685                 if (psind == 2)
3686                         new_l3 |= L1_BLOCK;
3687                 else /* (psind == 1) */
3688                         new_l3 |= L2_BLOCK;
3689                 rv = pmap_enter_largepage(pmap, va, new_l3, flags, psind);
3690                 goto out;
3691         }
3692         if (psind == 1) {
3693                 /* Assert the required virtual and physical alignment. */
3694                 KASSERT((va & L2_OFFSET) == 0, ("pmap_enter: va unaligned"));
3695                 KASSERT(m->psind > 0, ("pmap_enter: m->psind < psind"));
3696                 rv = pmap_enter_l2(pmap, va, (new_l3 & ~L3_PAGE) | L2_BLOCK,
3697                     flags, m, &lock);
3698                 goto out;
3699         }
3700         mpte = NULL;
3701
3702         /*
3703          * In the case that a page table page is not
3704          * resident, we are creating it here.
3705          */
3706 retry:
3707         pde = pmap_pde(pmap, va, &lvl);
3708         if (pde != NULL && lvl == 2) {
3709                 l3 = pmap_l2_to_l3(pde, va);
3710                 if (va < VM_MAXUSER_ADDRESS && mpte == NULL) {
3711                         mpte = PHYS_TO_VM_PAGE(pmap_load(pde) & ~ATTR_MASK);
3712                         mpte->ref_count++;
3713                 }
3714                 goto havel3;
3715         } else if (pde != NULL && lvl == 1) {
3716                 l2 = pmap_l1_to_l2(pde, va);
3717                 if ((pmap_load(l2) & ATTR_DESCR_MASK) == L2_BLOCK &&
3718                     (l3 = pmap_demote_l2_locked(pmap, l2, va, &lock)) != NULL) {
3719                         l3 = &l3[pmap_l3_index(va)];
3720                         if (va < VM_MAXUSER_ADDRESS) {
3721                                 mpte = PHYS_TO_VM_PAGE(
3722                                     pmap_load(l2) & ~ATTR_MASK);
3723                                 mpte->ref_count++;
3724                         }
3725                         goto havel3;
3726                 }
3727                 /* We need to allocate an L3 table. */
3728         }
3729         if (va < VM_MAXUSER_ADDRESS) {
3730                 nosleep = (flags & PMAP_ENTER_NOSLEEP) != 0;
3731
3732                 /*
3733                  * We use _pmap_alloc_l3() instead of pmap_alloc_l3() in order
3734                  * to handle the possibility that a superpage mapping for "va"
3735                  * was created while we slept.
3736                  */
3737                 mpte = _pmap_alloc_l3(pmap, pmap_l2_pindex(va),
3738                     nosleep ? NULL : &lock);
3739                 if (mpte == NULL && nosleep) {
3740                         CTR0(KTR_PMAP, "pmap_enter: mpte == NULL");
3741                         rv = KERN_RESOURCE_SHORTAGE;
3742                         goto out;
3743                 }
3744                 goto retry;
3745         } else
3746                 panic("pmap_enter: missing L3 table for kernel va %#lx", va);
3747
3748 havel3:
3749         orig_l3 = pmap_load(l3);
3750         opa = orig_l3 & ~ATTR_MASK;
3751         pv = NULL;
3752
3753         /*
3754          * Is the specified virtual address already mapped?
3755          */
3756         if (pmap_l3_valid(orig_l3)) {
3757                 /*
3758                  * Only allow adding new entries on stage 2 tables for now.
3759                  * This simplifies cache invalidation as we may need to call
3760                  * into EL2 to perform such actions.
3761                  */
3762                 PMAP_ASSERT_STAGE1(pmap);
3763                 /*
3764                  * Wiring change, just update stats. We don't worry about
3765                  * wiring PT pages as they remain resident as long as there
3766                  * are valid mappings in them. Hence, if a user page is wired,
3767                  * the PT page will be also.
3768                  */
3769                 if ((flags & PMAP_ENTER_WIRED) != 0 &&
3770                     (orig_l3 & ATTR_SW_WIRED) == 0)
3771                         pmap->pm_stats.wired_count++;
3772                 else if ((flags & PMAP_ENTER_WIRED) == 0 &&
3773                     (orig_l3 & ATTR_SW_WIRED) != 0)
3774                         pmap->pm_stats.wired_count--;
3775
3776                 /*
3777                  * Remove the extra PT page reference.
3778                  */
3779                 if (mpte != NULL) {
3780                         mpte->ref_count--;
3781                         KASSERT(mpte->ref_count > 0,
3782                             ("pmap_enter: missing reference to page table page,"
3783                              " va: 0x%lx", va));
3784                 }
3785
3786                 /*
3787                  * Has the physical page changed?
3788                  */
3789                 if (opa == pa) {
3790                         /*
3791                          * No, might be a protection or wiring change.
3792                          */
3793                         if ((orig_l3 & ATTR_SW_MANAGED) != 0 &&
3794                             (new_l3 & ATTR_SW_DBM) != 0)
3795                                 vm_page_aflag_set(m, PGA_WRITEABLE);
3796                         goto validate;
3797                 }
3798
3799                 /*
3800                  * The physical page has changed.  Temporarily invalidate
3801                  * the mapping.
3802                  */
3803                 orig_l3 = pmap_load_clear(l3);
3804                 KASSERT((orig_l3 & ~ATTR_MASK) == opa,
3805                     ("pmap_enter: unexpected pa update for %#lx", va));
3806                 if ((orig_l3 & ATTR_SW_MANAGED) != 0) {
3807                         om = PHYS_TO_VM_PAGE(opa);
3808
3809                         /*
3810                          * The pmap lock is sufficient to synchronize with
3811                          * concurrent calls to pmap_page_test_mappings() and
3812                          * pmap_ts_referenced().
3813                          */
3814                         if (pmap_pte_dirty(pmap, orig_l3))
3815                                 vm_page_dirty(om);
3816                         if ((orig_l3 & ATTR_AF) != 0) {
3817                                 pmap_invalidate_page(pmap, va);
3818                                 vm_page_aflag_set(om, PGA_REFERENCED);
3819                         }
3820                         CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
3821                         pv = pmap_pvh_remove(&om->md, pmap, va);
3822                         if ((m->oflags & VPO_UNMANAGED) != 0)
3823                                 free_pv_entry(pmap, pv);
3824                         if ((om->a.flags & PGA_WRITEABLE) != 0 &&
3825                             TAILQ_EMPTY(&om->md.pv_list) &&
3826                             ((om->flags & PG_FICTITIOUS) != 0 ||
3827                             TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)))
3828                                 vm_page_aflag_clear(om, PGA_WRITEABLE);
3829                 } else {
3830                         KASSERT((orig_l3 & ATTR_AF) != 0,
3831                             ("pmap_enter: unmanaged mapping lacks ATTR_AF"));
3832                         pmap_invalidate_page(pmap, va);
3833                 }
3834                 orig_l3 = 0;
3835         } else {
3836                 /*
3837                  * Increment the counters.
3838                  */
3839                 if ((new_l3 & ATTR_SW_WIRED) != 0)
3840                         pmap->pm_stats.wired_count++;
3841                 pmap_resident_count_inc(pmap, 1);
3842         }
3843         /*
3844          * Enter on the PV list if part of our managed memory.
3845          */
3846         if ((m->oflags & VPO_UNMANAGED) == 0) {
3847                 if (pv == NULL) {
3848                         pv = get_pv_entry(pmap, &lock);
3849                         pv->pv_va = va;
3850                 }
3851                 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
3852                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
3853                 m->md.pv_gen++;
3854                 if ((new_l3 & ATTR_SW_DBM) != 0)
3855                         vm_page_aflag_set(m, PGA_WRITEABLE);
3856         }
3857
3858 validate:
3859         if (pmap->pm_stage == PM_STAGE1) {
3860                 /*
3861                  * Sync icache if exec permission and attribute
3862                  * VM_MEMATTR_WRITE_BACK is set. Do it now, before the mapping
3863                  * is stored and made valid for hardware table walk. If done
3864                  * later, then other can access this page before caches are
3865                  * properly synced. Don't do it for kernel memory which is
3866                  * mapped with exec permission even if the memory isn't going
3867                  * to hold executable code. The only time when icache sync is
3868                  * needed is after kernel module is loaded and the relocation
3869                  * info is processed. And it's done in elf_cpu_load_file().
3870                 */
3871                 if ((prot & VM_PROT_EXECUTE) &&  pmap != kernel_pmap &&
3872                     m->md.pv_memattr == VM_MEMATTR_WRITE_BACK &&
3873                     (opa != pa || (orig_l3 & ATTR_S1_XN))) {
3874                         PMAP_ASSERT_STAGE1(pmap);
3875                         cpu_icache_sync_range(PHYS_TO_DMAP(pa), PAGE_SIZE);
3876                 }
3877         } else {
3878                 cpu_dcache_wb_range(PHYS_TO_DMAP(pa), PAGE_SIZE);
3879         }
3880
3881         /*
3882          * Update the L3 entry
3883          */
3884         if (pmap_l3_valid(orig_l3)) {
3885                 PMAP_ASSERT_STAGE1(pmap);
3886                 KASSERT(opa == pa, ("pmap_enter: invalid update"));
3887                 if ((orig_l3 & ~ATTR_AF) != (new_l3 & ~ATTR_AF)) {
3888                         /* same PA, different attributes */
3889                         orig_l3 = pmap_load_store(l3, new_l3);
3890                         pmap_invalidate_page(pmap, va);
3891                         if ((orig_l3 & ATTR_SW_MANAGED) != 0 &&
3892                             pmap_pte_dirty(pmap, orig_l3))
3893                                 vm_page_dirty(m);
3894                 } else {
3895                         /*
3896                          * orig_l3 == new_l3
3897                          * This can happens if multiple threads simultaneously
3898                          * access not yet mapped page. This bad for performance
3899                          * since this can cause full demotion-NOP-promotion
3900                          * cycle.
3901                          * Another possible reasons are:
3902                          * - VM and pmap memory layout are diverged
3903                          * - tlb flush is missing somewhere and CPU doesn't see
3904                          *   actual mapping.
3905                          */
3906                         CTR4(KTR_PMAP, "%s: already mapped page - "
3907                             "pmap %p va 0x%#lx pte 0x%lx",
3908                             __func__, pmap, va, new_l3);
3909                 }
3910         } else {
3911                 /* New mapping */
3912                 pmap_store(l3, new_l3);
3913                 dsb(ishst);
3914         }
3915
3916 #if VM_NRESERVLEVEL > 0
3917         /*
3918          * Try to promote from level 3 pages to a level 2 superpage. This
3919          * currently only works on stage 1 pmaps as pmap_promote_l2 looks at
3920          * stage 1 specific fields and performs a break-before-make sequence
3921          * that is incorrect a stage 2 pmap.
3922          */
3923         if ((mpte == NULL || mpte->ref_count == NL3PG) &&
3924             pmap_ps_enabled(pmap) && pmap->pm_stage == PM_STAGE1 &&
3925             (m->flags & PG_FICTITIOUS) == 0 &&
3926             vm_reserv_level_iffullpop(m) == 0) {
3927                 pmap_promote_l2(pmap, pde, va, &lock);
3928         }
3929 #endif
3930
3931         rv = KERN_SUCCESS;
3932 out:
3933         if (lock != NULL)
3934                 rw_wunlock(lock);
3935         PMAP_UNLOCK(pmap);
3936         return (rv);
3937 }
3938
3939 /*
3940  * Tries to create a read- and/or execute-only 2MB page mapping.  Returns true
3941  * if successful.  Returns false if (1) a page table page cannot be allocated
3942  * without sleeping, (2) a mapping already exists at the specified virtual
3943  * address, or (3) a PV entry cannot be allocated without reclaiming another
3944  * PV entry.
3945  */
3946 static bool
3947 pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
3948     struct rwlock **lockp)
3949 {
3950         pd_entry_t new_l2;
3951
3952         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3953         PMAP_ASSERT_STAGE1(pmap);
3954
3955         new_l2 = (pd_entry_t)(VM_PAGE_TO_PHYS(m) | ATTR_DEFAULT |
3956             ATTR_S1_IDX(m->md.pv_memattr) | ATTR_S1_AP(ATTR_S1_AP_RO) |
3957             L2_BLOCK);
3958         if ((m->oflags & VPO_UNMANAGED) == 0) {
3959                 new_l2 |= ATTR_SW_MANAGED;
3960                 new_l2 &= ~ATTR_AF;
3961         }
3962         if ((prot & VM_PROT_EXECUTE) == 0 ||
3963             m->md.pv_memattr == VM_MEMATTR_DEVICE)
3964                 new_l2 |= ATTR_S1_XN;
3965         if (va < VM_MAXUSER_ADDRESS)
3966                 new_l2 |= ATTR_S1_AP(ATTR_S1_AP_USER) | ATTR_S1_PXN;
3967         else
3968                 new_l2 |= ATTR_S1_UXN;
3969         if (pmap != kernel_pmap)
3970                 new_l2 |= ATTR_S1_nG;
3971         return (pmap_enter_l2(pmap, va, new_l2, PMAP_ENTER_NOSLEEP |
3972             PMAP_ENTER_NOREPLACE | PMAP_ENTER_NORECLAIM, NULL, lockp) ==
3973             KERN_SUCCESS);
3974 }
3975
3976 /*
3977  * Returns true if every page table entry in the specified page table is
3978  * zero.
3979  */
3980 static bool
3981 pmap_every_pte_zero(vm_paddr_t pa)
3982 {
3983         pt_entry_t *pt_end, *pte;
3984
3985         KASSERT((pa & PAGE_MASK) == 0, ("pa is misaligned"));
3986         pte = (pt_entry_t *)PHYS_TO_DMAP(pa);
3987         for (pt_end = pte + Ln_ENTRIES; pte < pt_end; pte++) {
3988                 if (*pte != 0)
3989                         return (false);
3990         }
3991         return (true);
3992 }
3993
3994 /*
3995  * Tries to create the specified 2MB page mapping.  Returns KERN_SUCCESS if
3996  * the mapping was created, and either KERN_FAILURE or KERN_RESOURCE_SHORTAGE
3997  * otherwise.  Returns KERN_FAILURE if PMAP_ENTER_NOREPLACE was specified and
3998  * a mapping already exists at the specified virtual address.  Returns
3999  * KERN_RESOURCE_SHORTAGE if PMAP_ENTER_NOSLEEP was specified and a page table
4000  * page allocation failed.  Returns KERN_RESOURCE_SHORTAGE if
4001  * PMAP_ENTER_NORECLAIM was specified and a PV entry allocation failed.
4002  *
4003  * The parameter "m" is only used when creating a managed, writeable mapping.
4004  */
4005 static int
4006 pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2, u_int flags,
4007     vm_page_t m, struct rwlock **lockp)
4008 {
4009         struct spglist free;
4010         pd_entry_t *l2, old_l2;
4011         vm_page_t l2pg, mt;
4012
4013         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4014
4015         if ((l2 = pmap_alloc_l2(pmap, va, &l2pg, (flags &
4016             PMAP_ENTER_NOSLEEP) != 0 ? NULL : lockp)) == NULL) {
4017                 CTR2(KTR_PMAP, "pmap_enter_l2: failure for va %#lx in pmap %p",
4018                     va, pmap);
4019                 return (KERN_RESOURCE_SHORTAGE);
4020         }
4021
4022         /*
4023          * If there are existing mappings, either abort or remove them.
4024          */
4025         if ((old_l2 = pmap_load(l2)) != 0) {
4026                 KASSERT(l2pg == NULL || l2pg->ref_count > 1,
4027                     ("pmap_enter_l2: l2pg's ref count is too low"));
4028                 if ((flags & PMAP_ENTER_NOREPLACE) != 0 && (va <
4029                     VM_MAXUSER_ADDRESS || (old_l2 & ATTR_DESCR_MASK) ==
4030                     L2_BLOCK || !pmap_every_pte_zero(old_l2 & ~ATTR_MASK))) {
4031                         if (l2pg != NULL)
4032                                 l2pg->ref_count--;
4033                         CTR2(KTR_PMAP, "pmap_enter_l2: failure for va %#lx"
4034                             " in pmap %p", va, pmap);
4035                         return (KERN_FAILURE);
4036                 }
4037                 SLIST_INIT(&free);
4038                 if ((old_l2 & ATTR_DESCR_MASK) == L2_BLOCK)
4039                         (void)pmap_remove_l2(pmap, l2, va,
4040                             pmap_load(pmap_l1(pmap, va)), &free, lockp);
4041                 else
4042                         pmap_remove_l3_range(pmap, old_l2, va, va + L2_SIZE,
4043                             &free, lockp);
4044                 if (va < VM_MAXUSER_ADDRESS) {
4045                         vm_page_free_pages_toq(&free, true);
4046                         KASSERT(pmap_load(l2) == 0,
4047                             ("pmap_enter_l2: non-zero L2 entry %p", l2));
4048                 } else {
4049                         KASSERT(SLIST_EMPTY(&free),
4050                             ("pmap_enter_l2: freed kernel page table page"));
4051
4052                         /*
4053                          * Both pmap_remove_l2() and pmap_remove_l3_range()
4054                          * will leave the kernel page table page zero filled.
4055                          * Nonetheless, the TLB could have an intermediate
4056                          * entry for the kernel page table page.
4057                          */
4058                         mt = PHYS_TO_VM_PAGE(pmap_load(l2) & ~ATTR_MASK);
4059                         if (pmap_insert_pt_page(pmap, mt, false))
4060                                 panic("pmap_enter_l2: trie insert failed");
4061                         pmap_clear(l2);
4062                         pmap_invalidate_page(pmap, va);
4063                 }
4064         }
4065
4066         if ((new_l2 & ATTR_SW_MANAGED) != 0) {
4067                 /*
4068                  * Abort this mapping if its PV entry could not be created.
4069                  */
4070                 if (!pmap_pv_insert_l2(pmap, va, new_l2, flags, lockp)) {
4071                         if (l2pg != NULL)
4072                                 pmap_abort_ptp(pmap, va, l2pg);
4073                         CTR2(KTR_PMAP,
4074                             "pmap_enter_l2: failure for va %#lx in pmap %p",
4075                             va, pmap);
4076                         return (KERN_RESOURCE_SHORTAGE);
4077                 }
4078                 if ((new_l2 & ATTR_SW_DBM) != 0)
4079                         for (mt = m; mt < &m[L2_SIZE / PAGE_SIZE]; mt++)
4080                                 vm_page_aflag_set(mt, PGA_WRITEABLE);
4081         }
4082
4083         /*
4084          * Increment counters.
4085          */
4086         if ((new_l2 & ATTR_SW_WIRED) != 0)
4087                 pmap->pm_stats.wired_count += L2_SIZE / PAGE_SIZE;
4088         pmap->pm_stats.resident_count += L2_SIZE / PAGE_SIZE;
4089
4090         /*
4091          * Map the superpage.
4092          */
4093         pmap_store(l2, new_l2);
4094         dsb(ishst);
4095
4096         atomic_add_long(&pmap_l2_mappings, 1);
4097         CTR2(KTR_PMAP, "pmap_enter_l2: success for va %#lx in pmap %p",
4098             va, pmap);
4099
4100         return (KERN_SUCCESS);
4101 }
4102
4103 /*
4104  * Maps a sequence of resident pages belonging to the same object.
4105  * The sequence begins with the given page m_start.  This page is
4106  * mapped at the given virtual address start.  Each subsequent page is
4107  * mapped at a virtual address that is offset from start by the same
4108  * amount as the page is offset from m_start within the object.  The
4109  * last page in the sequence is the page with the largest offset from
4110  * m_start that can be mapped at a virtual address less than the given
4111  * virtual address end.  Not every virtual page between start and end
4112  * is mapped; only those for which a resident page exists with the
4113  * corresponding offset from m_start are mapped.
4114  */
4115 void
4116 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
4117     vm_page_t m_start, vm_prot_t prot)
4118 {
4119         struct rwlock *lock;
4120         vm_offset_t va;
4121         vm_page_t m, mpte;
4122         vm_pindex_t diff, psize;
4123
4124         VM_OBJECT_ASSERT_LOCKED(m_start->object);
4125
4126         psize = atop(end - start);
4127         mpte = NULL;
4128         m = m_start;
4129         lock = NULL;
4130         PMAP_LOCK(pmap);
4131         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
4132                 va = start + ptoa(diff);
4133                 if ((va & L2_OFFSET) == 0 && va + L2_SIZE <= end &&
4134                     m->psind == 1 && pmap_ps_enabled(pmap) &&
4135                     pmap_enter_2mpage(pmap, va, m, prot, &lock))
4136                         m = &m[L2_SIZE / PAGE_SIZE - 1];
4137                 else
4138                         mpte = pmap_enter_quick_locked(pmap, va, m, prot, mpte,
4139                             &lock);
4140                 m = TAILQ_NEXT(m, listq);
4141         }
4142         if (lock != NULL)
4143                 rw_wunlock(lock);
4144         PMAP_UNLOCK(pmap);
4145 }
4146
4147 /*
4148  * this code makes some *MAJOR* assumptions:
4149  * 1. Current pmap & pmap exists.
4150  * 2. Not wired.
4151  * 3. Read access.
4152  * 4. No page table pages.
4153  * but is *MUCH* faster than pmap_enter...
4154  */
4155
4156 void
4157 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
4158 {
4159         struct rwlock *lock;
4160
4161         lock = NULL;
4162         PMAP_LOCK(pmap);
4163         (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock);
4164         if (lock != NULL)
4165                 rw_wunlock(lock);
4166         PMAP_UNLOCK(pmap);
4167 }
4168
4169 static vm_page_t
4170 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
4171     vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
4172 {
4173         pd_entry_t *pde;
4174         pt_entry_t *l2, *l3, l3_val;
4175         vm_paddr_t pa;
4176         int lvl;
4177
4178         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
4179             (m->oflags & VPO_UNMANAGED) != 0,
4180             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
4181         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4182         PMAP_ASSERT_STAGE1(pmap);
4183
4184         CTR2(KTR_PMAP, "pmap_enter_quick_locked: %p %lx", pmap, va);
4185         /*
4186          * In the case that a page table page is not
4187          * resident, we are creating it here.
4188          */
4189         if (va < VM_MAXUSER_ADDRESS) {
4190                 vm_pindex_t l2pindex;
4191
4192                 /*
4193                  * Calculate pagetable page index
4194                  */
4195                 l2pindex = pmap_l2_pindex(va);
4196                 if (mpte && (mpte->pindex == l2pindex)) {
4197                         mpte->ref_count++;
4198                 } else {
4199                         /*
4200                          * Get the l2 entry
4201                          */
4202                         pde = pmap_pde(pmap, va, &lvl);
4203
4204                         /*
4205                          * If the page table page is mapped, we just increment
4206                          * the hold count, and activate it.  Otherwise, we
4207                          * attempt to allocate a page table page.  If this
4208                          * attempt fails, we don't retry.  Instead, we give up.
4209                          */
4210                         if (lvl == 1) {
4211                                 l2 = pmap_l1_to_l2(pde, va);
4212                                 if ((pmap_load(l2) & ATTR_DESCR_MASK) ==
4213                                     L2_BLOCK)
4214                                         return (NULL);
4215                         }
4216                         if (lvl == 2 && pmap_load(pde) != 0) {
4217                                 mpte =
4218                                     PHYS_TO_VM_PAGE(pmap_load(pde) & ~ATTR_MASK);
4219                                 mpte->ref_count++;
4220                         } else {
4221                                 /*
4222                                  * Pass NULL instead of the PV list lock
4223                                  * pointer, because we don't intend to sleep.
4224                                  */
4225                                 mpte = _pmap_alloc_l3(pmap, l2pindex, NULL);
4226                                 if (mpte == NULL)
4227                                         return (mpte);
4228                         }
4229                 }
4230                 l3 = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mpte));
4231                 l3 = &l3[pmap_l3_index(va)];
4232         } else {
4233                 mpte = NULL;
4234                 pde = pmap_pde(kernel_pmap, va, &lvl);
4235                 KASSERT(pde != NULL,
4236                     ("pmap_enter_quick_locked: Invalid page entry, va: 0x%lx",
4237                      va));
4238                 KASSERT(lvl == 2,
4239                     ("pmap_enter_quick_locked: Invalid level %d", lvl));
4240                 l3 = pmap_l2_to_l3(pde, va);
4241         }
4242
4243         /*
4244          * Abort if a mapping already exists.
4245          */
4246         if (pmap_load(l3) != 0) {
4247                 if (mpte != NULL)
4248                         mpte->ref_count--;
4249                 return (NULL);
4250         }
4251
4252         /*
4253          * Enter on the PV list if part of our managed memory.
4254          */
4255         if ((m->oflags & VPO_UNMANAGED) == 0 &&
4256             !pmap_try_insert_pv_entry(pmap, va, m, lockp)) {
4257                 if (mpte != NULL)
4258                         pmap_abort_ptp(pmap, va, mpte);
4259                 return (NULL);
4260         }
4261
4262         /*
4263          * Increment counters
4264          */
4265         pmap_resident_count_inc(pmap, 1);
4266
4267         pa = VM_PAGE_TO_PHYS(m);
4268         l3_val = pa | ATTR_DEFAULT | ATTR_S1_IDX(m->md.pv_memattr) |
4269             ATTR_S1_AP(ATTR_S1_AP_RO) | L3_PAGE;
4270         if ((prot & VM_PROT_EXECUTE) == 0 ||
4271             m->md.pv_memattr == VM_MEMATTR_DEVICE)
4272                 l3_val |= ATTR_S1_XN;
4273         if (va < VM_MAXUSER_ADDRESS)
4274                 l3_val |= ATTR_S1_AP(ATTR_S1_AP_USER) | ATTR_S1_PXN;
4275         else
4276                 l3_val |= ATTR_S1_UXN;
4277         if (pmap != kernel_pmap)
4278                 l3_val |= ATTR_S1_nG;
4279
4280         /*
4281          * Now validate mapping with RO protection
4282          */
4283         if ((m->oflags & VPO_UNMANAGED) == 0) {
4284                 l3_val |= ATTR_SW_MANAGED;
4285                 l3_val &= ~ATTR_AF;
4286         }
4287
4288         /* Sync icache before the mapping is stored to PTE */
4289         if ((prot & VM_PROT_EXECUTE) && pmap != kernel_pmap &&
4290             m->md.pv_memattr == VM_MEMATTR_WRITE_BACK)
4291                 cpu_icache_sync_range(PHYS_TO_DMAP(pa), PAGE_SIZE);
4292
4293         pmap_store(l3, l3_val);
4294         dsb(ishst);
4295
4296         return (mpte);
4297 }
4298
4299 /*
4300  * This code maps large physical mmap regions into the
4301  * processor address space.  Note that some shortcuts
4302  * are taken, but the code works.
4303  */
4304 void
4305 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
4306     vm_pindex_t pindex, vm_size_t size)
4307 {
4308
4309         VM_OBJECT_ASSERT_WLOCKED(object);
4310         KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
4311             ("pmap_object_init_pt: non-device object"));
4312 }
4313
4314 /*
4315  *      Clear the wired attribute from the mappings for the specified range of
4316  *      addresses in the given pmap.  Every valid mapping within that range
4317  *      must have the wired attribute set.  In contrast, invalid mappings
4318  *      cannot have the wired attribute set, so they are ignored.
4319  *
4320  *      The wired attribute of the page table entry is not a hardware feature,
4321  *      so there is no need to invalidate any TLB entries.
4322  */
4323 void
4324 pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
4325 {
4326         vm_offset_t va_next;
4327         pd_entry_t *l0, *l1, *l2;
4328         pt_entry_t *l3;
4329
4330         PMAP_LOCK(pmap);
4331         for (; sva < eva; sva = va_next) {
4332                 l0 = pmap_l0(pmap, sva);
4333                 if (pmap_load(l0) == 0) {
4334                         va_next = (sva + L0_SIZE) & ~L0_OFFSET;
4335                         if (va_next < sva)
4336                                 va_next = eva;
4337                         continue;
4338                 }
4339
4340                 l1 = pmap_l0_to_l1(l0, sva);
4341                 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
4342                 if (va_next < sva)
4343                         va_next = eva;
4344                 if (pmap_load(l1) == 0)
4345                         continue;
4346
4347                 if ((pmap_load(l1) & ATTR_DESCR_MASK) == L1_BLOCK) {
4348                         KASSERT(va_next <= eva,
4349                             ("partial update of non-transparent 1G page "
4350                             "l1 %#lx sva %#lx eva %#lx va_next %#lx",
4351                             pmap_load(l1), sva, eva, va_next));
4352                         MPASS(pmap != kernel_pmap);
4353                         MPASS((pmap_load(l1) & (ATTR_SW_MANAGED |
4354                             ATTR_SW_WIRED)) == ATTR_SW_WIRED);
4355                         pmap_clear_bits(l1, ATTR_SW_WIRED);
4356                         pmap->pm_stats.wired_count -= L1_SIZE / PAGE_SIZE;
4357                         continue;
4358                 }
4359
4360                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
4361                 if (va_next < sva)
4362                         va_next = eva;
4363
4364                 l2 = pmap_l1_to_l2(l1, sva);
4365                 if (pmap_load(l2) == 0)
4366                         continue;
4367
4368                 if ((pmap_load(l2) & ATTR_DESCR_MASK) == L2_BLOCK) {
4369                         if ((pmap_load(l2) & ATTR_SW_WIRED) == 0)
4370                                 panic("pmap_unwire: l2 %#jx is missing "
4371                                     "ATTR_SW_WIRED", (uintmax_t)pmap_load(l2));
4372
4373                         /*
4374                          * Are we unwiring the entire large page?  If not,
4375                          * demote the mapping and fall through.
4376                          */
4377                         if (sva + L2_SIZE == va_next && eva >= va_next) {
4378                                 pmap_clear_bits(l2, ATTR_SW_WIRED);
4379                                 pmap->pm_stats.wired_count -= L2_SIZE /
4380                                     PAGE_SIZE;
4381                                 continue;
4382                         } else if (pmap_demote_l2(pmap, l2, sva) == NULL)
4383                                 panic("pmap_unwire: demotion failed");
4384                 }
4385                 KASSERT((pmap_load(l2) & ATTR_DESCR_MASK) == L2_TABLE,
4386                     ("pmap_unwire: Invalid l2 entry after demotion"));
4387
4388                 if (va_next > eva)
4389                         va_next = eva;
4390                 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
4391                     sva += L3_SIZE) {
4392                         if (pmap_load(l3) == 0)
4393                                 continue;
4394                         if ((pmap_load(l3) & ATTR_SW_WIRED) == 0)
4395                                 panic("pmap_unwire: l3 %#jx is missing "
4396                                     "ATTR_SW_WIRED", (uintmax_t)pmap_load(l3));
4397
4398                         /*
4399                          * ATTR_SW_WIRED must be cleared atomically.  Although
4400                          * the pmap lock synchronizes access to ATTR_SW_WIRED,
4401                          * the System MMU may write to the entry concurrently.
4402                          */
4403                         pmap_clear_bits(l3, ATTR_SW_WIRED);
4404                         pmap->pm_stats.wired_count--;
4405                 }
4406         }
4407         PMAP_UNLOCK(pmap);
4408 }
4409
4410 /*
4411  *      Copy the range specified by src_addr/len
4412  *      from the source map to the range dst_addr/len
4413  *      in the destination map.
4414  *
4415  *      This routine is only advisory and need not do anything.
4416  *
4417  *      Because the executable mappings created by this routine are copied,
4418  *      it should not have to flush the instruction cache.
4419  */
4420 void
4421 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
4422     vm_offset_t src_addr)
4423 {
4424         struct rwlock *lock;
4425         pd_entry_t *l0, *l1, *l2, srcptepaddr;
4426         pt_entry_t *dst_pte, mask, nbits, ptetemp, *src_pte;
4427         vm_offset_t addr, end_addr, va_next;
4428         vm_page_t dst_m, dstmpte, srcmpte;
4429
4430         PMAP_ASSERT_STAGE1(dst_pmap);
4431         PMAP_ASSERT_STAGE1(src_pmap);
4432
4433         if (dst_addr != src_addr)
4434                 return;
4435         end_addr = src_addr + len;
4436         lock = NULL;
4437         if (dst_pmap < src_pmap) {
4438                 PMAP_LOCK(dst_pmap);
4439                 PMAP_LOCK(src_pmap);
4440         } else {
4441                 PMAP_LOCK(src_pmap);
4442                 PMAP_LOCK(dst_pmap);
4443         }
4444         for (addr = src_addr; addr < end_addr; addr = va_next) {
4445                 l0 = pmap_l0(src_pmap, addr);
4446                 if (pmap_load(l0) == 0) {
4447                         va_next = (addr + L0_SIZE) & ~L0_OFFSET;
4448                         if (va_next < addr)
4449                                 va_next = end_addr;
4450                         continue;
4451                 }
4452
4453                 va_next = (addr + L1_SIZE) & ~L1_OFFSET;
4454                 if (va_next < addr)
4455                         va_next = end_addr;
4456                 l1 = pmap_l0_to_l1(l0, addr);
4457                 if (pmap_load(l1) == 0)
4458                         continue;
4459                 if ((pmap_load(l1) & ATTR_DESCR_MASK) == L1_BLOCK) {
4460                         KASSERT(va_next <= end_addr,
4461                             ("partial update of non-transparent 1G page "
4462                             "l1 %#lx addr %#lx end_addr %#lx va_next %#lx",
4463                             pmap_load(l1), addr, end_addr, va_next));
4464                         srcptepaddr = pmap_load(l1);
4465                         l1 = pmap_l1(dst_pmap, addr);
4466                         if (l1 == NULL) {
4467                                 if (_pmap_alloc_l3(dst_pmap,
4468                                     pmap_l0_pindex(addr), NULL) == NULL)
4469                                         break;
4470                                 l1 = pmap_l1(dst_pmap, addr);
4471                         } else {
4472                                 l0 = pmap_l0(dst_pmap, addr);
4473                                 dst_m = PHYS_TO_VM_PAGE(pmap_load(l0) &
4474                                     ~ATTR_MASK);
4475                                 dst_m->ref_count++;
4476                         }
4477                         KASSERT(pmap_load(l1) == 0,
4478                             ("1G mapping present in dst pmap "
4479                             "l1 %#lx addr %#lx end_addr %#lx va_next %#lx",
4480                             pmap_load(l1), addr, end_addr, va_next));
4481                         pmap_store(l1, srcptepaddr & ~ATTR_SW_WIRED);
4482                         pmap_resident_count_inc(dst_pmap, L1_SIZE / PAGE_SIZE);
4483                         continue;
4484                 }
4485
4486                 va_next = (addr + L2_SIZE) & ~L2_OFFSET;
4487                 if (va_next < addr)
4488                         va_next = end_addr;
4489                 l2 = pmap_l1_to_l2(l1, addr);
4490                 srcptepaddr = pmap_load(l2);
4491                 if (srcptepaddr == 0)
4492                         continue;
4493                 if ((srcptepaddr & ATTR_DESCR_MASK) == L2_BLOCK) {
4494                         if ((addr & L2_OFFSET) != 0 ||
4495                             addr + L2_SIZE > end_addr)
4496                                 continue;
4497                         l2 = pmap_alloc_l2(dst_pmap, addr, &dst_m, NULL);
4498                         if (l2 == NULL)
4499                                 break;
4500                         if (pmap_load(l2) == 0 &&
4501                             ((srcptepaddr & ATTR_SW_MANAGED) == 0 ||
4502                             pmap_pv_insert_l2(dst_pmap, addr, srcptepaddr,
4503                             PMAP_ENTER_NORECLAIM, &lock))) {
4504                                 mask = ATTR_AF | ATTR_SW_WIRED;
4505                                 nbits = 0;
4506                                 if ((srcptepaddr & ATTR_SW_DBM) != 0)
4507                                         nbits |= ATTR_S1_AP_RW_BIT;
4508                                 pmap_store(l2, (srcptepaddr & ~mask) | nbits);
4509                                 pmap_resident_count_inc(dst_pmap, L2_SIZE /
4510                                     PAGE_SIZE);
4511                                 atomic_add_long(&pmap_l2_mappings, 1);
4512                         } else
4513                                 pmap_abort_ptp(dst_pmap, addr, dst_m);
4514                         continue;
4515                 }
4516                 KASSERT((srcptepaddr & ATTR_DESCR_MASK) == L2_TABLE,
4517                     ("pmap_copy: invalid L2 entry"));
4518                 srcptepaddr &= ~ATTR_MASK;
4519                 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr);
4520                 KASSERT(srcmpte->ref_count > 0,
4521                     ("pmap_copy: source page table page is unused"));
4522                 if (va_next > end_addr)
4523                         va_next = end_addr;
4524                 src_pte = (pt_entry_t *)PHYS_TO_DMAP(srcptepaddr);
4525                 src_pte = &src_pte[pmap_l3_index(addr)];
4526                 dstmpte = NULL;
4527                 for (; addr < va_next; addr += PAGE_SIZE, src_pte++) {
4528                         ptetemp = pmap_load(src_pte);
4529
4530                         /*
4531                          * We only virtual copy managed pages.
4532                          */
4533                         if ((ptetemp & ATTR_SW_MANAGED) == 0)
4534                                 continue;
4535
4536                         if (dstmpte != NULL) {
4537                                 KASSERT(dstmpte->pindex == pmap_l2_pindex(addr),
4538                                     ("dstmpte pindex/addr mismatch"));
4539                                 dstmpte->ref_count++;
4540                         } else if ((dstmpte = pmap_alloc_l3(dst_pmap, addr,
4541                             NULL)) == NULL)
4542                                 goto out;
4543                         dst_pte = (pt_entry_t *)
4544                             PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpte));
4545                         dst_pte = &dst_pte[pmap_l3_index(addr)];
4546                         if (pmap_load(dst_pte) == 0 &&
4547                             pmap_try_insert_pv_entry(dst_pmap, addr,
4548                             PHYS_TO_VM_PAGE(ptetemp & ~ATTR_MASK), &lock)) {
4549                                 /*
4550                                  * Clear the wired, modified, and accessed
4551                                  * (referenced) bits during the copy.
4552                                  */
4553                                 mask = ATTR_AF | ATTR_SW_WIRED;
4554                                 nbits = 0;
4555                                 if ((ptetemp & ATTR_SW_DBM) != 0)
4556                                         nbits |= ATTR_S1_AP_RW_BIT;
4557                                 pmap_store(dst_pte, (ptetemp & ~mask) | nbits);
4558                                 pmap_resident_count_inc(dst_pmap, 1);
4559                         } else {
4560                                 pmap_abort_ptp(dst_pmap, addr, dstmpte);
4561                                 goto out;
4562                         }
4563                         /* Have we copied all of the valid mappings? */ 
4564                         if (dstmpte->ref_count >= srcmpte->ref_count)
4565                                 break;
4566                 }
4567         }
4568 out:
4569         /*
4570          * XXX This barrier may not be needed because the destination pmap is
4571          * not active.
4572          */
4573         dsb(ishst);
4574
4575         if (lock != NULL)
4576                 rw_wunlock(lock);
4577         PMAP_UNLOCK(src_pmap);
4578         PMAP_UNLOCK(dst_pmap);
4579 }
4580
4581 /*
4582  *      pmap_zero_page zeros the specified hardware page by mapping
4583  *      the page into KVM and using bzero to clear its contents.
4584  */
4585 void
4586 pmap_zero_page(vm_page_t m)
4587 {
4588         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
4589
4590         pagezero((void *)va);
4591 }
4592
4593 /*
4594  *      pmap_zero_page_area zeros the specified hardware page by mapping
4595  *      the page into KVM and using bzero to clear its contents.
4596  *
4597  *      off and size may not cover an area beyond a single hardware page.
4598  */
4599 void
4600 pmap_zero_page_area(vm_page_t m, int off, int size)
4601 {
4602         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
4603
4604         if (off == 0 && size == PAGE_SIZE)
4605                 pagezero((void *)va);
4606         else
4607                 bzero((char *)va + off, size);
4608 }
4609
4610 /*
4611  *      pmap_copy_page copies the specified (machine independent)
4612  *      page by mapping the page into virtual memory and using
4613  *      bcopy to copy the page, one machine dependent page at a
4614  *      time.
4615  */
4616 void
4617 pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
4618 {
4619         vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
4620         vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
4621
4622         pagecopy((void *)src, (void *)dst);
4623 }
4624
4625 int unmapped_buf_allowed = 1;
4626
4627 void
4628 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
4629     vm_offset_t b_offset, int xfersize)
4630 {
4631         void *a_cp, *b_cp;
4632         vm_page_t m_a, m_b;
4633         vm_paddr_t p_a, p_b;
4634         vm_offset_t a_pg_offset, b_pg_offset;
4635         int cnt;
4636
4637         while (xfersize > 0) {
4638                 a_pg_offset = a_offset & PAGE_MASK;
4639                 m_a = ma[a_offset >> PAGE_SHIFT];
4640                 p_a = m_a->phys_addr;
4641                 b_pg_offset = b_offset & PAGE_MASK;
4642                 m_b = mb[b_offset >> PAGE_SHIFT];
4643                 p_b = m_b->phys_addr;
4644                 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
4645                 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
4646                 if (__predict_false(!PHYS_IN_DMAP(p_a))) {
4647                         panic("!DMAP a %lx", p_a);
4648                 } else {
4649                         a_cp = (char *)PHYS_TO_DMAP(p_a) + a_pg_offset;
4650                 }
4651                 if (__predict_false(!PHYS_IN_DMAP(p_b))) {
4652                         panic("!DMAP b %lx", p_b);
4653                 } else {
4654                         b_cp = (char *)PHYS_TO_DMAP(p_b) + b_pg_offset;
4655                 }
4656                 bcopy(a_cp, b_cp, cnt);
4657                 a_offset += cnt;
4658                 b_offset += cnt;
4659                 xfersize -= cnt;
4660         }
4661 }
4662
4663 vm_offset_t
4664 pmap_quick_enter_page(vm_page_t m)
4665 {
4666
4667         return (PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)));
4668 }
4669
4670 void
4671 pmap_quick_remove_page(vm_offset_t addr)
4672 {
4673 }
4674
4675 /*
4676  * Returns true if the pmap's pv is one of the first
4677  * 16 pvs linked to from this page.  This count may
4678  * be changed upwards or downwards in the future; it
4679  * is only necessary that true be returned for a small
4680  * subset of pmaps for proper page aging.
4681  */
4682 boolean_t
4683 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
4684 {
4685         struct md_page *pvh;
4686         struct rwlock *lock;
4687         pv_entry_t pv;
4688         int loops = 0;
4689         boolean_t rv;
4690
4691         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4692             ("pmap_page_exists_quick: page %p is not managed", m));
4693         rv = FALSE;
4694         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
4695         rw_rlock(lock);
4696         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
4697                 if (PV_PMAP(pv) == pmap) {
4698                         rv = TRUE;
4699                         break;
4700                 }
4701                 loops++;
4702                 if (loops >= 16)
4703                         break;
4704         }
4705         if (!rv && loops < 16 && (m->flags & PG_FICTITIOUS) == 0) {
4706                 pvh = page_to_pvh(m);
4707                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
4708                         if (PV_PMAP(pv) == pmap) {
4709                                 rv = TRUE;
4710                                 break;
4711                         }
4712                         loops++;
4713                         if (loops >= 16)
4714                                 break;
4715                 }
4716         }
4717         rw_runlock(lock);
4718         return (rv);
4719 }
4720
4721 /*
4722  *      pmap_page_wired_mappings:
4723  *
4724  *      Return the number of managed mappings to the given physical page
4725  *      that are wired.
4726  */
4727 int
4728 pmap_page_wired_mappings(vm_page_t m)
4729 {
4730         struct rwlock *lock;
4731         struct md_page *pvh;
4732         pmap_t pmap;
4733         pt_entry_t *pte;
4734         pv_entry_t pv;
4735         int count, lvl, md_gen, pvh_gen;
4736
4737         if ((m->oflags & VPO_UNMANAGED) != 0)
4738                 return (0);
4739         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
4740         rw_rlock(lock);
4741 restart:
4742         count = 0;
4743         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
4744                 pmap = PV_PMAP(pv);
4745                 if (!PMAP_TRYLOCK(pmap)) {
4746                         md_gen = m->md.pv_gen;
4747                         rw_runlock(lock);
4748                         PMAP_LOCK(pmap);
4749                         rw_rlock(lock);
4750                         if (md_gen != m->md.pv_gen) {
4751                                 PMAP_UNLOCK(pmap);
4752                                 goto restart;
4753                         }
4754                 }
4755                 pte = pmap_pte(pmap, pv->pv_va, &lvl);
4756                 if (pte != NULL && (pmap_load(pte) & ATTR_SW_WIRED) != 0)
4757                         count++;
4758                 PMAP_UNLOCK(pmap);
4759         }
4760         if ((m->flags & PG_FICTITIOUS) == 0) {
4761                 pvh = page_to_pvh(m);
4762                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
4763                         pmap = PV_PMAP(pv);
4764                         if (!PMAP_TRYLOCK(pmap)) {
4765                                 md_gen = m->md.pv_gen;
4766                                 pvh_gen = pvh->pv_gen;
4767                                 rw_runlock(lock);
4768                                 PMAP_LOCK(pmap);
4769                                 rw_rlock(lock);
4770                                 if (md_gen != m->md.pv_gen ||
4771                                     pvh_gen != pvh->pv_gen) {
4772                                         PMAP_UNLOCK(pmap);
4773                                         goto restart;
4774                                 }
4775                         }
4776                         pte = pmap_pte(pmap, pv->pv_va, &lvl);
4777                         if (pte != NULL &&
4778                             (pmap_load(pte) & ATTR_SW_WIRED) != 0)
4779                                 count++;
4780                         PMAP_UNLOCK(pmap);
4781                 }
4782         }
4783         rw_runlock(lock);
4784         return (count);
4785 }
4786
4787 /*
4788  * Returns true if the given page is mapped individually or as part of
4789  * a 2mpage.  Otherwise, returns false.
4790  */
4791 bool
4792 pmap_page_is_mapped(vm_page_t m)
4793 {
4794         struct rwlock *lock;
4795         bool rv;
4796
4797         if ((m->oflags & VPO_UNMANAGED) != 0)
4798                 return (false);
4799         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
4800         rw_rlock(lock);
4801         rv = !TAILQ_EMPTY(&m->md.pv_list) ||
4802             ((m->flags & PG_FICTITIOUS) == 0 &&
4803             !TAILQ_EMPTY(&page_to_pvh(m)->pv_list));
4804         rw_runlock(lock);
4805         return (rv);
4806 }
4807
4808 /*
4809  * Destroy all managed, non-wired mappings in the given user-space
4810  * pmap.  This pmap cannot be active on any processor besides the
4811  * caller.
4812  *
4813  * This function cannot be applied to the kernel pmap.  Moreover, it
4814  * is not intended for general use.  It is only to be used during
4815  * process termination.  Consequently, it can be implemented in ways
4816  * that make it faster than pmap_remove().  First, it can more quickly
4817  * destroy mappings by iterating over the pmap's collection of PV
4818  * entries, rather than searching the page table.  Second, it doesn't
4819  * have to test and clear the page table entries atomically, because
4820  * no processor is currently accessing the user address space.  In
4821  * particular, a page table entry's dirty bit won't change state once
4822  * this function starts.
4823  */
4824 void
4825 pmap_remove_pages(pmap_t pmap)
4826 {
4827         pd_entry_t *pde;
4828         pt_entry_t *pte, tpte;
4829         struct spglist free;
4830         vm_page_t m, ml3, mt;
4831         pv_entry_t pv;
4832         struct md_page *pvh;
4833         struct pv_chunk *pc, *npc;
4834         struct rwlock *lock;
4835         int64_t bit;
4836         uint64_t inuse, bitmask;
4837         int allfree, field, freed, idx, lvl;
4838         vm_paddr_t pa;
4839
4840         KASSERT(pmap == PCPU_GET(curpmap), ("non-current pmap %p", pmap));
4841
4842         lock = NULL;
4843
4844         SLIST_INIT(&free);
4845         PMAP_LOCK(pmap);
4846         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
4847                 allfree = 1;
4848                 freed = 0;
4849                 for (field = 0; field < _NPCM; field++) {
4850                         inuse = ~pc->pc_map[field] & pc_freemask[field];
4851                         while (inuse != 0) {
4852                                 bit = ffsl(inuse) - 1;
4853                                 bitmask = 1UL << bit;
4854                                 idx = field * 64 + bit;
4855                                 pv = &pc->pc_pventry[idx];
4856                                 inuse &= ~bitmask;
4857
4858                                 pde = pmap_pde(pmap, pv->pv_va, &lvl);
4859                                 KASSERT(pde != NULL,
4860                                     ("Attempting to remove an unmapped page"));
4861
4862                                 switch(lvl) {
4863                                 case 1:
4864                                         pte = pmap_l1_to_l2(pde, pv->pv_va);
4865                                         tpte = pmap_load(pte); 
4866                                         KASSERT((tpte & ATTR_DESCR_MASK) ==
4867                                             L2_BLOCK,
4868                                             ("Attempting to remove an invalid "
4869                                             "block: %lx", tpte));
4870                                         break;
4871                                 case 2:
4872                                         pte = pmap_l2_to_l3(pde, pv->pv_va);
4873                                         tpte = pmap_load(pte);
4874                                         KASSERT((tpte & ATTR_DESCR_MASK) ==
4875                                             L3_PAGE,
4876                                             ("Attempting to remove an invalid "
4877                                              "page: %lx", tpte));
4878                                         break;
4879                                 default:
4880                                         panic(
4881                                             "Invalid page directory level: %d",
4882                                             lvl);
4883                                 }
4884
4885 /*
4886  * We cannot remove wired pages from a process' mapping at this time
4887  */
4888                                 if (tpte & ATTR_SW_WIRED) {
4889                                         allfree = 0;
4890                                         continue;
4891                                 }
4892
4893                                 pa = tpte & ~ATTR_MASK;
4894
4895                                 m = PHYS_TO_VM_PAGE(pa);
4896                                 KASSERT(m->phys_addr == pa,
4897                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
4898                                     m, (uintmax_t)m->phys_addr,
4899                                     (uintmax_t)tpte));
4900
4901                                 KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
4902                                     m < &vm_page_array[vm_page_array_size],
4903                                     ("pmap_remove_pages: bad pte %#jx",
4904                                     (uintmax_t)tpte));
4905
4906                                 /*
4907                                  * Because this pmap is not active on other
4908                                  * processors, the dirty bit cannot have
4909                                  * changed state since we last loaded pte.
4910                                  */
4911                                 pmap_clear(pte);
4912
4913                                 /*
4914                                  * Update the vm_page_t clean/reference bits.
4915                                  */
4916                                 if (pmap_pte_dirty(pmap, tpte)) {
4917                                         switch (lvl) {
4918                                         case 1:
4919                                                 for (mt = m; mt < &m[L2_SIZE / PAGE_SIZE]; mt++)
4920                                                         vm_page_dirty(mt);
4921                                                 break;
4922                                         case 2:
4923                                                 vm_page_dirty(m);
4924                                                 break;
4925                                         }
4926                                 }
4927
4928                                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
4929
4930                                 /* Mark free */
4931                                 pc->pc_map[field] |= bitmask;
4932                                 switch (lvl) {
4933                                 case 1:
4934                                         pmap_resident_count_dec(pmap,
4935                                             L2_SIZE / PAGE_SIZE);
4936                                         pvh = pa_to_pvh(tpte & ~ATTR_MASK);
4937                                         TAILQ_REMOVE(&pvh->pv_list, pv,pv_next);
4938                                         pvh->pv_gen++;
4939                                         if (TAILQ_EMPTY(&pvh->pv_list)) {
4940                                                 for (mt = m; mt < &m[L2_SIZE / PAGE_SIZE]; mt++)
4941                                                         if ((mt->a.flags & PGA_WRITEABLE) != 0 &&
4942                                                             TAILQ_EMPTY(&mt->md.pv_list))
4943                                                                 vm_page_aflag_clear(mt, PGA_WRITEABLE);
4944                                         }
4945                                         ml3 = pmap_remove_pt_page(pmap,
4946                                             pv->pv_va);
4947                                         if (ml3 != NULL) {
4948                                                 KASSERT(ml3->valid == VM_PAGE_BITS_ALL,
4949                                                     ("pmap_remove_pages: l3 page not promoted"));
4950                                                 pmap_resident_count_dec(pmap,1);
4951                                                 KASSERT(ml3->ref_count == NL3PG,
4952                                                     ("pmap_remove_pages: l3 page ref count error"));
4953                                                 ml3->ref_count = 0;
4954                                                 pmap_add_delayed_free_list(ml3,
4955                                                     &free, FALSE);
4956                                         }
4957                                         break;
4958                                 case 2:
4959                                         pmap_resident_count_dec(pmap, 1);
4960                                         TAILQ_REMOVE(&m->md.pv_list, pv,
4961                                             pv_next);
4962                                         m->md.pv_gen++;
4963                                         if ((m->a.flags & PGA_WRITEABLE) != 0 &&
4964                                             TAILQ_EMPTY(&m->md.pv_list) &&
4965                                             (m->flags & PG_FICTITIOUS) == 0) {
4966                                                 pvh = page_to_pvh(m);
4967                                                 if (TAILQ_EMPTY(&pvh->pv_list))
4968                                                         vm_page_aflag_clear(m,
4969                                                             PGA_WRITEABLE);
4970                                         }
4971                                         break;
4972                                 }
4973                                 pmap_unuse_pt(pmap, pv->pv_va, pmap_load(pde),
4974                                     &free);
4975                                 freed++;
4976                         }
4977                 }
4978                 PV_STAT(atomic_add_long(&pv_entry_frees, freed));
4979                 PV_STAT(atomic_add_int(&pv_entry_spare, freed));
4980                 PV_STAT(atomic_subtract_long(&pv_entry_count, freed));
4981                 if (allfree) {
4982                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
4983                         free_pv_chunk(pc);
4984                 }
4985         }
4986         if (lock != NULL)
4987                 rw_wunlock(lock);
4988         pmap_invalidate_all(pmap);
4989         PMAP_UNLOCK(pmap);
4990         vm_page_free_pages_toq(&free, true);
4991 }
4992
4993 /*
4994  * This is used to check if a page has been accessed or modified.
4995  */
4996 static boolean_t
4997 pmap_page_test_mappings(vm_page_t m, boolean_t accessed, boolean_t modified)
4998 {
4999         struct rwlock *lock;
5000         pv_entry_t pv;
5001         struct md_page *pvh;
5002         pt_entry_t *pte, mask, value;
5003         pmap_t pmap;
5004         int lvl, md_gen, pvh_gen;
5005         boolean_t rv;
5006
5007         rv = FALSE;
5008         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
5009         rw_rlock(lock);
5010 restart:
5011         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
5012                 pmap = PV_PMAP(pv);
5013                 PMAP_ASSERT_STAGE1(pmap);
5014                 if (!PMAP_TRYLOCK(pmap)) {
5015                         md_gen = m->md.pv_gen;
5016                         rw_runlock(lock);
5017                         PMAP_LOCK(pmap);
5018                         rw_rlock(lock);
5019                         if (md_gen != m->md.pv_gen) {
5020                                 PMAP_UNLOCK(pmap);
5021                                 goto restart;
5022                         }
5023                 }
5024                 pte = pmap_pte(pmap, pv->pv_va, &lvl);
5025                 KASSERT(lvl == 3,
5026                     ("pmap_page_test_mappings: Invalid level %d", lvl));
5027                 mask = 0;
5028                 value = 0;
5029                 if (modified) {
5030                         mask |= ATTR_S1_AP_RW_BIT;
5031                         value |= ATTR_S1_AP(ATTR_S1_AP_RW);
5032                 }
5033                 if (accessed) {
5034                         mask |= ATTR_AF | ATTR_DESCR_MASK;
5035                         value |= ATTR_AF | L3_PAGE;
5036                 }
5037                 rv = (pmap_load(pte) & mask) == value;
5038                 PMAP_UNLOCK(pmap);
5039                 if (rv)
5040                         goto out;
5041         }
5042         if ((m->flags & PG_FICTITIOUS) == 0) {
5043                 pvh = page_to_pvh(m);
5044                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
5045                         pmap = PV_PMAP(pv);
5046                         PMAP_ASSERT_STAGE1(pmap);
5047                         if (!PMAP_TRYLOCK(pmap)) {
5048                                 md_gen = m->md.pv_gen;
5049                                 pvh_gen = pvh->pv_gen;
5050                                 rw_runlock(lock);
5051                                 PMAP_LOCK(pmap);
5052                                 rw_rlock(lock);
5053                                 if (md_gen != m->md.pv_gen ||
5054                                     pvh_gen != pvh->pv_gen) {
5055                                         PMAP_UNLOCK(pmap);
5056                                         goto restart;
5057                                 }
5058                         }
5059                         pte = pmap_pte(pmap, pv->pv_va, &lvl);
5060                         KASSERT(lvl == 2,
5061                             ("pmap_page_test_mappings: Invalid level %d", lvl));
5062                         mask = 0;
5063                         value = 0;
5064                         if (modified) {
5065                                 mask |= ATTR_S1_AP_RW_BIT;
5066                                 value |= ATTR_S1_AP(ATTR_S1_AP_RW);
5067                         }
5068                         if (accessed) {
5069                                 mask |= ATTR_AF | ATTR_DESCR_MASK;
5070                                 value |= ATTR_AF | L2_BLOCK;
5071                         }
5072                         rv = (pmap_load(pte) & mask) == value;
5073                         PMAP_UNLOCK(pmap);
5074                         if (rv)
5075                                 goto out;
5076                 }
5077         }
5078 out:
5079         rw_runlock(lock);
5080         return (rv);
5081 }
5082
5083 /*
5084  *      pmap_is_modified:
5085  *
5086  *      Return whether or not the specified physical page was modified
5087  *      in any physical maps.
5088  */
5089 boolean_t
5090 pmap_is_modified(vm_page_t m)
5091 {
5092
5093         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5094             ("pmap_is_modified: page %p is not managed", m));
5095
5096         /*
5097          * If the page is not busied then this check is racy.
5098          */
5099         if (!pmap_page_is_write_mapped(m))
5100                 return (FALSE);
5101         return (pmap_page_test_mappings(m, FALSE, TRUE));
5102 }
5103
5104 /*
5105  *      pmap_is_prefaultable:
5106  *
5107  *      Return whether or not the specified virtual address is eligible
5108  *      for prefault.
5109  */
5110 boolean_t
5111 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
5112 {
5113         pt_entry_t *pte;
5114         boolean_t rv;
5115         int lvl;
5116
5117         rv = FALSE;
5118         PMAP_LOCK(pmap);
5119         pte = pmap_pte(pmap, addr, &lvl);
5120         if (pte != NULL && pmap_load(pte) != 0) {
5121                 rv = TRUE;
5122         }
5123         PMAP_UNLOCK(pmap);
5124         return (rv);
5125 }
5126
5127 /*
5128  *      pmap_is_referenced:
5129  *
5130  *      Return whether or not the specified physical page was referenced
5131  *      in any physical maps.
5132  */
5133 boolean_t
5134 pmap_is_referenced(vm_page_t m)
5135 {
5136
5137         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5138             ("pmap_is_referenced: page %p is not managed", m));
5139         return (pmap_page_test_mappings(m, TRUE, FALSE));
5140 }
5141
5142 /*
5143  * Clear the write and modified bits in each of the given page's mappings.
5144  */
5145 void
5146 pmap_remove_write(vm_page_t m)
5147 {
5148         struct md_page *pvh;
5149         pmap_t pmap;
5150         struct rwlock *lock;
5151         pv_entry_t next_pv, pv;
5152         pt_entry_t oldpte, *pte;
5153         vm_offset_t va;
5154         int lvl, md_gen, pvh_gen;
5155
5156         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5157             ("pmap_remove_write: page %p is not managed", m));
5158         vm_page_assert_busied(m);
5159
5160         if (!pmap_page_is_write_mapped(m))
5161                 return;
5162         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
5163         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : page_to_pvh(m);
5164 retry_pv_loop:
5165         rw_wlock(lock);
5166         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
5167                 pmap = PV_PMAP(pv);
5168                 PMAP_ASSERT_STAGE1(pmap);
5169                 if (!PMAP_TRYLOCK(pmap)) {
5170                         pvh_gen = pvh->pv_gen;
5171                         rw_wunlock(lock);
5172                         PMAP_LOCK(pmap);
5173                         rw_wlock(lock);
5174                         if (pvh_gen != pvh->pv_gen) {
5175                                 PMAP_UNLOCK(pmap);
5176                                 rw_wunlock(lock);
5177                                 goto retry_pv_loop;
5178                         }
5179                 }
5180                 va = pv->pv_va;
5181                 pte = pmap_pte(pmap, pv->pv_va, &lvl);
5182                 if ((pmap_load(pte) & ATTR_SW_DBM) != 0)
5183                         (void)pmap_demote_l2_locked(pmap, pte, va, &lock);
5184                 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
5185                     ("inconsistent pv lock %p %p for page %p",
5186                     lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
5187                 PMAP_UNLOCK(pmap);
5188         }
5189         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
5190                 pmap = PV_PMAP(pv);
5191                 PMAP_ASSERT_STAGE1(pmap);
5192                 if (!PMAP_TRYLOCK(pmap)) {
5193                         pvh_gen = pvh->pv_gen;
5194                         md_gen = m->md.pv_gen;
5195                         rw_wunlock(lock);
5196                         PMAP_LOCK(pmap);
5197                         rw_wlock(lock);
5198                         if (pvh_gen != pvh->pv_gen ||
5199                             md_gen != m->md.pv_gen) {
5200                                 PMAP_UNLOCK(pmap);
5201                                 rw_wunlock(lock);
5202                                 goto retry_pv_loop;
5203                         }
5204                 }
5205                 pte = pmap_pte(pmap, pv->pv_va, &lvl);
5206                 oldpte = pmap_load(pte);
5207 retry:
5208                 if ((oldpte & ATTR_SW_DBM) != 0) {
5209                         if (!atomic_fcmpset_long(pte, &oldpte,
5210                             (oldpte | ATTR_S1_AP_RW_BIT) & ~ATTR_SW_DBM))
5211                                 goto retry;
5212                         if ((oldpte & ATTR_S1_AP_RW_BIT) ==
5213                             ATTR_S1_AP(ATTR_S1_AP_RW))
5214                                 vm_page_dirty(m);
5215                         pmap_invalidate_page(pmap, pv->pv_va);
5216                 }
5217                 PMAP_UNLOCK(pmap);
5218         }
5219         rw_wunlock(lock);
5220         vm_page_aflag_clear(m, PGA_WRITEABLE);
5221 }
5222
5223 /*
5224  *      pmap_ts_referenced:
5225  *
5226  *      Return a count of reference bits for a page, clearing those bits.
5227  *      It is not necessary for every reference bit to be cleared, but it
5228  *      is necessary that 0 only be returned when there are truly no
5229  *      reference bits set.
5230  *
5231  *      As an optimization, update the page's dirty field if a modified bit is
5232  *      found while counting reference bits.  This opportunistic update can be
5233  *      performed at low cost and can eliminate the need for some future calls
5234  *      to pmap_is_modified().  However, since this function stops after
5235  *      finding PMAP_TS_REFERENCED_MAX reference bits, it may not detect some
5236  *      dirty pages.  Those dirty pages will only be detected by a future call
5237  *      to pmap_is_modified().
5238  */
5239 int
5240 pmap_ts_referenced(vm_page_t m)
5241 {
5242         struct md_page *pvh;
5243         pv_entry_t pv, pvf;
5244         pmap_t pmap;
5245         struct rwlock *lock;
5246         pd_entry_t *pde, tpde;
5247         pt_entry_t *pte, tpte;
5248         vm_offset_t va;
5249         vm_paddr_t pa;
5250         int cleared, lvl, md_gen, not_cleared, pvh_gen;
5251         struct spglist free;
5252
5253         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5254             ("pmap_ts_referenced: page %p is not managed", m));
5255         SLIST_INIT(&free);
5256         cleared = 0;
5257         pa = VM_PAGE_TO_PHYS(m);
5258         lock = PHYS_TO_PV_LIST_LOCK(pa);
5259         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : page_to_pvh(m);
5260         rw_wlock(lock);
5261 retry:
5262         not_cleared = 0;
5263         if ((pvf = TAILQ_FIRST(&pvh->pv_list)) == NULL)
5264                 goto small_mappings;
5265         pv = pvf;
5266         do {
5267                 if (pvf == NULL)
5268                         pvf = pv;
5269                 pmap = PV_PMAP(pv);
5270                 if (!PMAP_TRYLOCK(pmap)) {
5271                         pvh_gen = pvh->pv_gen;
5272                         rw_wunlock(lock);
5273                         PMAP_LOCK(pmap);
5274                         rw_wlock(lock);
5275                         if (pvh_gen != pvh->pv_gen) {
5276                                 PMAP_UNLOCK(pmap);
5277                                 goto retry;
5278                         }
5279                 }
5280                 va = pv->pv_va;
5281                 pde = pmap_pde(pmap, pv->pv_va, &lvl);
5282                 KASSERT(pde != NULL, ("pmap_ts_referenced: no l1 table found"));
5283                 KASSERT(lvl == 1,
5284                     ("pmap_ts_referenced: invalid pde level %d", lvl));
5285                 tpde = pmap_load(pde);
5286                 KASSERT((tpde & ATTR_DESCR_MASK) == L1_TABLE,
5287                     ("pmap_ts_referenced: found an invalid l1 table"));
5288                 pte = pmap_l1_to_l2(pde, pv->pv_va);
5289                 tpte = pmap_load(pte);
5290                 if (pmap_pte_dirty(pmap, tpte)) {
5291                         /*
5292                          * Although "tpte" is mapping a 2MB page, because
5293                          * this function is called at a 4KB page granularity,
5294                          * we only update the 4KB page under test.
5295                          */
5296                         vm_page_dirty(m);
5297                 }
5298
5299                 if ((tpte & ATTR_AF) != 0) {
5300                         /*
5301                          * Since this reference bit is shared by 512 4KB pages,
5302                          * it should not be cleared every time it is tested.
5303                          * Apply a simple "hash" function on the physical page
5304                          * number, the virtual superpage number, and the pmap
5305                          * address to select one 4KB page out of the 512 on
5306                          * which testing the reference bit will result in
5307                          * clearing that reference bit.  This function is
5308                          * designed to avoid the selection of the same 4KB page
5309                          * for every 2MB page mapping.
5310                          *
5311                          * On demotion, a mapping that hasn't been referenced
5312                          * is simply destroyed.  To avoid the possibility of a
5313                          * subsequent page fault on a demoted wired mapping,
5314                          * always leave its reference bit set.  Moreover,
5315                          * since the superpage is wired, the current state of
5316                          * its reference bit won't affect page replacement.
5317                          */
5318                         if ((((pa >> PAGE_SHIFT) ^ (pv->pv_va >> L2_SHIFT) ^
5319                             (uintptr_t)pmap) & (Ln_ENTRIES - 1)) == 0 &&
5320                             (tpte & ATTR_SW_WIRED) == 0) {
5321                                 pmap_clear_bits(pte, ATTR_AF);
5322                                 pmap_invalidate_page(pmap, pv->pv_va);
5323                                 cleared++;
5324                         } else
5325                                 not_cleared++;
5326                 }
5327                 PMAP_UNLOCK(pmap);
5328                 /* Rotate the PV list if it has more than one entry. */
5329                 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
5330                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
5331                         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
5332                         pvh->pv_gen++;
5333                 }
5334                 if (cleared + not_cleared >= PMAP_TS_REFERENCED_MAX)
5335                         goto out;
5336         } while ((pv = TAILQ_FIRST(&pvh->pv_list)) != pvf);
5337 small_mappings:
5338         if ((pvf = TAILQ_FIRST(&m->md.pv_list)) == NULL)
5339                 goto out;
5340         pv = pvf;
5341         do {
5342                 if (pvf == NULL)
5343                         pvf = pv;
5344                 pmap = PV_PMAP(pv);
5345                 if (!PMAP_TRYLOCK(pmap)) {
5346                         pvh_gen = pvh->pv_gen;
5347                         md_gen = m->md.pv_gen;
5348                         rw_wunlock(lock);
5349                         PMAP_LOCK(pmap);
5350                         rw_wlock(lock);
5351                         if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
5352                                 PMAP_UNLOCK(pmap);
5353                                 goto retry;
5354                         }
5355                 }
5356                 pde = pmap_pde(pmap, pv->pv_va, &lvl);
5357                 KASSERT(pde != NULL, ("pmap_ts_referenced: no l2 table found"));
5358                 KASSERT(lvl == 2,
5359                     ("pmap_ts_referenced: invalid pde level %d", lvl));
5360                 tpde = pmap_load(pde);
5361                 KASSERT((tpde & ATTR_DESCR_MASK) == L2_TABLE,
5362                     ("pmap_ts_referenced: found an invalid l2 table"));
5363                 pte = pmap_l2_to_l3(pde, pv->pv_va);
5364                 tpte = pmap_load(pte);
5365                 if (pmap_pte_dirty(pmap, tpte))
5366                         vm_page_dirty(m);
5367                 if ((tpte & ATTR_AF) != 0) {
5368                         if ((tpte & ATTR_SW_WIRED) == 0) {
5369                                 pmap_clear_bits(pte, ATTR_AF);
5370                                 pmap_invalidate_page(pmap, pv->pv_va);
5371                                 cleared++;
5372                         } else
5373                                 not_cleared++;
5374                 }
5375                 PMAP_UNLOCK(pmap);
5376                 /* Rotate the PV list if it has more than one entry. */
5377                 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
5378                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
5379                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5380                         m->md.pv_gen++;
5381                 }
5382         } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != pvf && cleared +
5383             not_cleared < PMAP_TS_REFERENCED_MAX);
5384 out:
5385         rw_wunlock(lock);
5386         vm_page_free_pages_toq(&free, true);
5387         return (cleared + not_cleared);
5388 }
5389
5390 /*
5391  *      Apply the given advice to the specified range of addresses within the
5392  *      given pmap.  Depending on the advice, clear the referenced and/or
5393  *      modified flags in each mapping and set the mapped page's dirty field.
5394  */
5395 void
5396 pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
5397 {
5398         struct rwlock *lock;
5399         vm_offset_t va, va_next;
5400         vm_page_t m;
5401         pd_entry_t *l0, *l1, *l2, oldl2;
5402         pt_entry_t *l3, oldl3;
5403
5404         PMAP_ASSERT_STAGE1(pmap);
5405
5406         if (advice != MADV_DONTNEED && advice != MADV_FREE)
5407                 return;
5408
5409         PMAP_LOCK(pmap);
5410         for (; sva < eva; sva = va_next) {
5411                 l0 = pmap_l0(pmap, sva);
5412                 if (pmap_load(l0) == 0) {
5413                         va_next = (sva + L0_SIZE) & ~L0_OFFSET;
5414                         if (va_next < sva)
5415                                 va_next = eva;
5416                         continue;
5417                 }
5418
5419                 va_next = (sva + L1_SIZE) & ~L1_OFFSET;
5420                 if (va_next < sva)
5421                         va_next = eva;
5422                 l1 = pmap_l0_to_l1(l0, sva);
5423                 if (pmap_load(l1) == 0)
5424                         continue;
5425                 if ((pmap_load(l1) & ATTR_DESCR_MASK) == L1_BLOCK) {
5426                         KASSERT(va_next <= eva,
5427                             ("partial update of non-transparent 1G page "
5428                             "l1 %#lx sva %#lx eva %#lx va_next %#lx",
5429                             pmap_load(l1), sva, eva, va_next));
5430                         continue;
5431                 }
5432
5433                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
5434                 if (va_next < sva)
5435                         va_next = eva;
5436                 l2 = pmap_l1_to_l2(l1, sva);
5437                 oldl2 = pmap_load(l2);
5438                 if (oldl2 == 0)
5439                         continue;
5440                 if ((oldl2 & ATTR_DESCR_MASK) == L2_BLOCK) {
5441                         if ((oldl2 & ATTR_SW_MANAGED) == 0)
5442                                 continue;
5443                         lock = NULL;
5444                         if (!pmap_demote_l2_locked(pmap, l2, sva, &lock)) {
5445                                 if (lock != NULL)
5446                                         rw_wunlock(lock);
5447
5448                                 /*
5449                                  * The 2MB page mapping was destroyed.
5450                                  */
5451                                 continue;
5452                         }
5453
5454                         /*
5455                          * Unless the page mappings are wired, remove the
5456                          * mapping to a single page so that a subsequent
5457                          * access may repromote.  Choosing the last page
5458                          * within the address range [sva, min(va_next, eva))
5459                          * generally results in more repromotions.  Since the
5460                          * underlying page table page is fully populated, this
5461                          * removal never frees a page table page.
5462                          */
5463                         if ((oldl2 & ATTR_SW_WIRED) == 0) {
5464                                 va = eva;
5465                                 if (va > va_next)
5466                                         va = va_next;
5467                                 va -= PAGE_SIZE;
5468                                 KASSERT(va >= sva,
5469                                     ("pmap_advise: no address gap"));
5470                                 l3 = pmap_l2_to_l3(l2, va);
5471                                 KASSERT(pmap_load(l3) != 0,
5472                                     ("pmap_advise: invalid PTE"));
5473                                 pmap_remove_l3(pmap, l3, va, pmap_load(l2),
5474                                     NULL, &lock);
5475                         }
5476                         if (lock != NULL)
5477                                 rw_wunlock(lock);
5478                 }
5479                 KASSERT((pmap_load(l2) & ATTR_DESCR_MASK) == L2_TABLE,
5480                     ("pmap_advise: invalid L2 entry after demotion"));
5481                 if (va_next > eva)
5482                         va_next = eva;
5483                 va = va_next;
5484                 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
5485                     sva += L3_SIZE) {
5486                         oldl3 = pmap_load(l3);
5487                         if ((oldl3 & (ATTR_SW_MANAGED | ATTR_DESCR_MASK)) !=
5488                             (ATTR_SW_MANAGED | L3_PAGE))
5489                                 goto maybe_invlrng;
5490                         else if (pmap_pte_dirty(pmap, oldl3)) {
5491                                 if (advice == MADV_DONTNEED) {
5492                                         /*
5493                                          * Future calls to pmap_is_modified()
5494                                          * can be avoided by making the page
5495                                          * dirty now.
5496                                          */
5497                                         m = PHYS_TO_VM_PAGE(oldl3 & ~ATTR_MASK);
5498                                         vm_page_dirty(m);
5499                                 }
5500                                 while (!atomic_fcmpset_long(l3, &oldl3,
5501                                     (oldl3 & ~ATTR_AF) |
5502                                     ATTR_S1_AP(ATTR_S1_AP_RO)))
5503                                         cpu_spinwait();
5504                         } else if ((oldl3 & ATTR_AF) != 0)
5505                                 pmap_clear_bits(l3, ATTR_AF);
5506                         else
5507                                 goto maybe_invlrng;
5508                         if (va == va_next)
5509                                 va = sva;
5510                         continue;
5511 maybe_invlrng:
5512                         if (va != va_next) {
5513                                 pmap_invalidate_range(pmap, va, sva);
5514                                 va = va_next;
5515                         }
5516                 }
5517                 if (va != va_next)
5518                         pmap_invalidate_range(pmap, va, sva);
5519         }
5520         PMAP_UNLOCK(pmap);
5521 }
5522
5523 /*
5524  *      Clear the modify bits on the specified physical page.
5525  */
5526 void
5527 pmap_clear_modify(vm_page_t m)
5528 {
5529         struct md_page *pvh;
5530         struct rwlock *lock;
5531         pmap_t pmap;
5532         pv_entry_t next_pv, pv;
5533         pd_entry_t *l2, oldl2;
5534         pt_entry_t *l3, oldl3;
5535         vm_offset_t va;
5536         int md_gen, pvh_gen;
5537
5538         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5539             ("pmap_clear_modify: page %p is not managed", m));
5540         vm_page_assert_busied(m);
5541
5542         if (!pmap_page_is_write_mapped(m))
5543                 return;
5544         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : page_to_pvh(m);
5545         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
5546         rw_wlock(lock);
5547 restart:
5548         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
5549                 pmap = PV_PMAP(pv);
5550                 PMAP_ASSERT_STAGE1(pmap);
5551                 if (!PMAP_TRYLOCK(pmap)) {
5552                         pvh_gen = pvh->pv_gen;
5553                         rw_wunlock(lock);
5554                         PMAP_LOCK(pmap);
5555                         rw_wlock(lock);
5556                         if (pvh_gen != pvh->pv_gen) {
5557                                 PMAP_UNLOCK(pmap);
5558                                 goto restart;
5559                         }
5560                 }
5561                 va = pv->pv_va;
5562                 l2 = pmap_l2(pmap, va);
5563                 oldl2 = pmap_load(l2);
5564                 /* If oldl2 has ATTR_SW_DBM set, then it is also dirty. */
5565                 if ((oldl2 & ATTR_SW_DBM) != 0 &&
5566                     pmap_demote_l2_locked(pmap, l2, va, &lock) &&
5567                     (oldl2 & ATTR_SW_WIRED) == 0) {
5568                         /*
5569                          * Write protect the mapping to a single page so that
5570                          * a subsequent write access may repromote.
5571                          */
5572                         va += VM_PAGE_TO_PHYS(m) - (oldl2 & ~ATTR_MASK);
5573                         l3 = pmap_l2_to_l3(l2, va);
5574                         oldl3 = pmap_load(l3);
5575                         while (!atomic_fcmpset_long(l3, &oldl3,
5576                             (oldl3 & ~ATTR_SW_DBM) | ATTR_S1_AP(ATTR_S1_AP_RO)))
5577                                 cpu_spinwait();
5578                         vm_page_dirty(m);
5579                         pmap_invalidate_page(pmap, va);
5580                 }
5581                 PMAP_UNLOCK(pmap);
5582         }
5583         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
5584                 pmap = PV_PMAP(pv);
5585                 PMAP_ASSERT_STAGE1(pmap);
5586                 if (!PMAP_TRYLOCK(pmap)) {
5587                         md_gen = m->md.pv_gen;
5588                         pvh_gen = pvh->pv_gen;
5589                         rw_wunlock(lock);
5590                         PMAP_LOCK(pmap);
5591                         rw_wlock(lock);
5592                         if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
5593                                 PMAP_UNLOCK(pmap);
5594                                 goto restart;
5595                         }
5596                 }
5597                 l2 = pmap_l2(pmap, pv->pv_va);
5598                 l3 = pmap_l2_to_l3(l2, pv->pv_va);
5599                 oldl3 = pmap_load(l3);
5600                 if (pmap_l3_valid(oldl3) &&
5601                     (oldl3 & (ATTR_S1_AP_RW_BIT | ATTR_SW_DBM)) == ATTR_SW_DBM){
5602                         pmap_set_bits(l3, ATTR_S1_AP(ATTR_S1_AP_RO));
5603                         pmap_invalidate_page(pmap, pv->pv_va);
5604                 }
5605                 PMAP_UNLOCK(pmap);
5606         }
5607         rw_wunlock(lock);
5608 }
5609
5610 void *
5611 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
5612 {
5613         struct pmap_preinit_mapping *ppim;
5614         vm_offset_t va, offset;
5615         pd_entry_t *pde;
5616         pt_entry_t *l2;
5617         int i, lvl, l2_blocks, free_l2_count, start_idx;
5618
5619         if (!vm_initialized) {
5620                 /*
5621                  * No L3 ptables so map entire L2 blocks where start VA is:
5622                  *      preinit_map_va + start_idx * L2_SIZE
5623                  * There may be duplicate mappings (multiple VA -> same PA) but
5624                  * ARM64 dcache is always PIPT so that's acceptable.
5625                  */
5626                  if (size == 0)
5627                          return (NULL);
5628
5629                  /* Calculate how many L2 blocks are needed for the mapping */
5630                 l2_blocks = (roundup2(pa + size, L2_SIZE) -
5631                     rounddown2(pa, L2_SIZE)) >> L2_SHIFT;
5632
5633                 offset = pa & L2_OFFSET;
5634
5635                 if (preinit_map_va == 0)
5636                         return (NULL);
5637
5638                 /* Map 2MiB L2 blocks from reserved VA space */
5639
5640                 free_l2_count = 0;
5641                 start_idx = -1;
5642                 /* Find enough free contiguous VA space */
5643                 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
5644                         ppim = pmap_preinit_mapping + i;
5645                         if (free_l2_count > 0 && ppim->pa != 0) {
5646                                 /* Not enough space here */
5647                                 free_l2_count = 0;
5648                                 start_idx = -1;
5649                                 continue;
5650                         }
5651
5652                         if (ppim->pa == 0) {
5653                                 /* Free L2 block */
5654                                 if (start_idx == -1)
5655                                         start_idx = i;
5656                                 free_l2_count++;
5657                                 if (free_l2_count == l2_blocks)
5658                                         break;
5659                         }
5660                 }
5661                 if (free_l2_count != l2_blocks)
5662                         panic("%s: too many preinit mappings", __func__);
5663
5664                 va = preinit_map_va + (start_idx * L2_SIZE);
5665                 for (i = start_idx; i < start_idx + l2_blocks; i++) {
5666                         /* Mark entries as allocated */
5667                         ppim = pmap_preinit_mapping + i;
5668                         ppim->pa = pa;
5669                         ppim->va = va + offset;
5670                         ppim->size = size;
5671                 }
5672
5673                 /* Map L2 blocks */
5674                 pa = rounddown2(pa, L2_SIZE);
5675                 for (i = 0; i < l2_blocks; i++) {
5676                         pde = pmap_pde(kernel_pmap, va, &lvl);
5677                         KASSERT(pde != NULL,
5678                             ("pmap_mapbios: Invalid page entry, va: 0x%lx",
5679                             va));
5680                         KASSERT(lvl == 1,
5681                             ("pmap_mapbios: Invalid level %d", lvl));
5682
5683                         /* Insert L2_BLOCK */
5684                         l2 = pmap_l1_to_l2(pde, va);
5685                         pmap_load_store(l2,
5686                             pa | ATTR_DEFAULT | ATTR_S1_XN |
5687                             ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | L2_BLOCK);
5688
5689                         va += L2_SIZE;
5690                         pa += L2_SIZE;
5691                 }
5692                 pmap_invalidate_all(kernel_pmap);
5693
5694                 va = preinit_map_va + (start_idx * L2_SIZE);
5695
5696         } else {
5697                 /* kva_alloc may be used to map the pages */
5698                 offset = pa & PAGE_MASK;
5699                 size = round_page(offset + size);
5700
5701                 va = kva_alloc(size);
5702                 if (va == 0)
5703                         panic("%s: Couldn't allocate KVA", __func__);
5704
5705                 pde = pmap_pde(kernel_pmap, va, &lvl);
5706                 KASSERT(lvl == 2, ("pmap_mapbios: Invalid level %d", lvl));
5707
5708                 /* L3 table is linked */
5709                 va = trunc_page(va);
5710                 pa = trunc_page(pa);
5711                 pmap_kenter(va, size, pa, memory_mapping_mode(pa));
5712         }
5713
5714         return ((void *)(va + offset));
5715 }
5716
5717 void
5718 pmap_unmapbios(vm_offset_t va, vm_size_t size)
5719 {
5720         struct pmap_preinit_mapping *ppim;
5721         vm_offset_t offset, tmpsize, va_trunc;
5722         pd_entry_t *pde;
5723         pt_entry_t *l2;
5724         int i, lvl, l2_blocks, block;
5725         bool preinit_map;
5726
5727         l2_blocks =
5728            (roundup2(va + size, L2_SIZE) - rounddown2(va, L2_SIZE)) >> L2_SHIFT;
5729         KASSERT(l2_blocks > 0, ("pmap_unmapbios: invalid size %lx", size));
5730
5731         /* Remove preinit mapping */
5732         preinit_map = false;
5733         block = 0;
5734         for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
5735                 ppim = pmap_preinit_mapping + i;
5736                 if (ppim->va == va) {
5737                         KASSERT(ppim->size == size,
5738                             ("pmap_unmapbios: size mismatch"));
5739                         ppim->va = 0;
5740                         ppim->pa = 0;
5741                         ppim->size = 0;
5742                         preinit_map = true;
5743                         offset = block * L2_SIZE;
5744                         va_trunc = rounddown2(va, L2_SIZE) + offset;
5745
5746                         /* Remove L2_BLOCK */
5747                         pde = pmap_pde(kernel_pmap, va_trunc, &lvl);
5748                         KASSERT(pde != NULL,
5749                             ("pmap_unmapbios: Invalid page entry, va: 0x%lx",
5750                             va_trunc));
5751                         l2 = pmap_l1_to_l2(pde, va_trunc);
5752                         pmap_clear(l2);
5753
5754                         if (block == (l2_blocks - 1))
5755                                 break;
5756                         block++;
5757                 }
5758         }
5759         if (preinit_map) {
5760                 pmap_invalidate_all(kernel_pmap);
5761                 return;
5762         }
5763
5764         /* Unmap the pages reserved with kva_alloc. */
5765         if (vm_initialized) {
5766                 offset = va & PAGE_MASK;
5767                 size = round_page(offset + size);
5768                 va = trunc_page(va);
5769
5770                 pde = pmap_pde(kernel_pmap, va, &lvl);
5771                 KASSERT(pde != NULL,
5772                     ("pmap_unmapbios: Invalid page entry, va: 0x%lx", va));
5773                 KASSERT(lvl == 2, ("pmap_unmapbios: Invalid level %d", lvl));
5774
5775                 /* Unmap and invalidate the pages */
5776                 for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
5777                         pmap_kremove(va + tmpsize);
5778
5779                 kva_free(va, size);
5780         }
5781 }
5782
5783 /*
5784  * Sets the memory attribute for the specified page.
5785  */
5786 void
5787 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
5788 {
5789
5790         m->md.pv_memattr = ma;
5791
5792         /*
5793          * If "m" is a normal page, update its direct mapping.  This update
5794          * can be relied upon to perform any cache operations that are
5795          * required for data coherence.
5796          */
5797         if ((m->flags & PG_FICTITIOUS) == 0 &&
5798             pmap_change_attr(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)), PAGE_SIZE,
5799             m->md.pv_memattr) != 0)
5800                 panic("memory attribute change on the direct map failed");
5801 }
5802
5803 /*
5804  * Changes the specified virtual address range's memory type to that given by
5805  * the parameter "mode".  The specified virtual address range must be
5806  * completely contained within either the direct map or the kernel map.  If
5807  * the virtual address range is contained within the kernel map, then the
5808  * memory type for each of the corresponding ranges of the direct map is also
5809  * changed.  (The corresponding ranges of the direct map are those ranges that
5810  * map the same physical pages as the specified virtual address range.)  These
5811  * changes to the direct map are necessary because Intel describes the
5812  * behavior of their processors as "undefined" if two or more mappings to the
5813  * same physical page have different memory types.
5814  *
5815  * Returns zero if the change completed successfully, and either EINVAL or
5816  * ENOMEM if the change failed.  Specifically, EINVAL is returned if some part
5817  * of the virtual address range was not mapped, and ENOMEM is returned if
5818  * there was insufficient memory available to complete the change.  In the
5819  * latter case, the memory type may have been changed on some part of the
5820  * virtual address range or the direct map.
5821  */
5822 int
5823 pmap_change_attr(vm_offset_t va, vm_size_t size, int mode)
5824 {
5825         int error;
5826
5827         PMAP_LOCK(kernel_pmap);
5828         error = pmap_change_attr_locked(va, size, mode);
5829         PMAP_UNLOCK(kernel_pmap);
5830         return (error);
5831 }
5832
5833 static int
5834 pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode)
5835 {
5836         vm_offset_t base, offset, tmpva;
5837         pt_entry_t l3, *pte, *newpte;
5838         int lvl;
5839
5840         PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED);
5841         base = trunc_page(va);
5842         offset = va & PAGE_MASK;
5843         size = round_page(offset + size);
5844
5845         if (!VIRT_IN_DMAP(base) &&
5846             !(base >= VM_MIN_KERNEL_ADDRESS && base < VM_MAX_KERNEL_ADDRESS))
5847                 return (EINVAL);
5848
5849         for (tmpva = base; tmpva < base + size; ) {
5850                 pte = pmap_pte(kernel_pmap, tmpva, &lvl);
5851                 if (pte == NULL)
5852                         return (EINVAL);
5853
5854                 if ((pmap_load(pte) & ATTR_S1_IDX_MASK) == ATTR_S1_IDX(mode)) {
5855                         /*
5856                          * We already have the correct attribute,
5857                          * ignore this entry.
5858                          */
5859                         switch (lvl) {
5860                         default:
5861                                 panic("Invalid DMAP table level: %d\n", lvl);
5862                         case 1:
5863                                 tmpva = (tmpva & ~L1_OFFSET) + L1_SIZE;
5864                                 break;
5865                         case 2:
5866                                 tmpva = (tmpva & ~L2_OFFSET) + L2_SIZE;
5867                                 break;
5868                         case 3:
5869                                 tmpva += PAGE_SIZE;
5870                                 break;
5871                         }
5872                 } else {
5873                         /*
5874                          * Split the entry to an level 3 table, then
5875                          * set the new attribute.
5876                          */
5877                         switch (lvl) {
5878                         default:
5879                                 panic("Invalid DMAP table level: %d\n", lvl);
5880                         case 1:
5881                                 newpte = pmap_demote_l1(kernel_pmap, pte,
5882                                     tmpva & ~L1_OFFSET);
5883                                 if (newpte == NULL)
5884                                         return (EINVAL);
5885                                 pte = pmap_l1_to_l2(pte, tmpva);
5886                         case 2:
5887                                 newpte = pmap_demote_l2(kernel_pmap, pte,
5888                                     tmpva);
5889                                 if (newpte == NULL)
5890                                         return (EINVAL);
5891                                 pte = pmap_l2_to_l3(pte, tmpva);
5892                         case 3:
5893                                 /* Update the entry */
5894                                 l3 = pmap_load(pte);
5895                                 l3 &= ~ATTR_S1_IDX_MASK;
5896                                 l3 |= ATTR_S1_IDX(mode);
5897                                 if (mode == VM_MEMATTR_DEVICE)
5898                                         l3 |= ATTR_S1_XN;
5899
5900                                 pmap_update_entry(kernel_pmap, pte, l3, tmpva,
5901                                     PAGE_SIZE);
5902
5903                                 /*
5904                                  * If moving to a non-cacheable entry flush
5905                                  * the cache.
5906                                  */
5907                                 if (mode == VM_MEMATTR_UNCACHEABLE)
5908                                         cpu_dcache_wbinv_range(tmpva, L3_SIZE);
5909
5910                                 break;
5911                         }
5912                         tmpva += PAGE_SIZE;
5913                 }
5914         }
5915
5916         return (0);
5917 }
5918
5919 /*
5920  * Create an L2 table to map all addresses within an L1 mapping.
5921  */
5922 static pt_entry_t *
5923 pmap_demote_l1(pmap_t pmap, pt_entry_t *l1, vm_offset_t va)
5924 {
5925         pt_entry_t *l2, newl2, oldl1;
5926         vm_offset_t tmpl1;
5927         vm_paddr_t l2phys, phys;
5928         vm_page_t ml2;
5929         int i;
5930
5931         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5932         oldl1 = pmap_load(l1);
5933         KASSERT((oldl1 & ATTR_DESCR_MASK) == L1_BLOCK,
5934             ("pmap_demote_l1: Demoting a non-block entry"));
5935         KASSERT((va & L1_OFFSET) == 0,
5936             ("pmap_demote_l1: Invalid virtual address %#lx", va));
5937         KASSERT((oldl1 & ATTR_SW_MANAGED) == 0,
5938             ("pmap_demote_l1: Level 1 table shouldn't be managed"));
5939
5940         tmpl1 = 0;
5941         if (va <= (vm_offset_t)l1 && va + L1_SIZE > (vm_offset_t)l1) {
5942                 tmpl1 = kva_alloc(PAGE_SIZE);
5943                 if (tmpl1 == 0)
5944                         return (NULL);
5945         }
5946
5947         if ((ml2 = vm_page_alloc(NULL, 0, VM_ALLOC_INTERRUPT |
5948             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) {
5949                 CTR2(KTR_PMAP, "pmap_demote_l1: failure for va %#lx"
5950                     " in pmap %p", va, pmap);
5951                 return (NULL);
5952         }
5953
5954         l2phys = VM_PAGE_TO_PHYS(ml2);
5955         l2 = (pt_entry_t *)PHYS_TO_DMAP(l2phys);
5956
5957         /* Address the range points at */
5958         phys = oldl1 & ~ATTR_MASK;
5959         /* The attributed from the old l1 table to be copied */
5960         newl2 = oldl1 & ATTR_MASK;
5961
5962         /* Create the new entries */
5963         for (i = 0; i < Ln_ENTRIES; i++) {
5964                 l2[i] = newl2 | phys;
5965                 phys += L2_SIZE;
5966         }
5967         KASSERT(l2[0] == ((oldl1 & ~ATTR_DESCR_MASK) | L2_BLOCK),
5968             ("Invalid l2 page (%lx != %lx)", l2[0],
5969             (oldl1 & ~ATTR_DESCR_MASK) | L2_BLOCK));
5970
5971         if (tmpl1 != 0) {
5972                 pmap_kenter(tmpl1, PAGE_SIZE,
5973                     DMAP_TO_PHYS((vm_offset_t)l1) & ~L3_OFFSET,
5974                     VM_MEMATTR_WRITE_BACK);
5975                 l1 = (pt_entry_t *)(tmpl1 + ((vm_offset_t)l1 & PAGE_MASK));
5976         }
5977
5978         pmap_update_entry(pmap, l1, l2phys | L1_TABLE, va, PAGE_SIZE);
5979
5980         if (tmpl1 != 0) {
5981                 pmap_kremove(tmpl1);
5982                 kva_free(tmpl1, PAGE_SIZE);
5983         }
5984
5985         return (l2);
5986 }
5987
5988 static void
5989 pmap_fill_l3(pt_entry_t *firstl3, pt_entry_t newl3)
5990 {
5991         pt_entry_t *l3;
5992
5993         for (l3 = firstl3; l3 - firstl3 < Ln_ENTRIES; l3++) {
5994                 *l3 = newl3;
5995                 newl3 += L3_SIZE;
5996         }
5997 }
5998
5999 static void
6000 pmap_demote_l2_abort(pmap_t pmap, vm_offset_t va, pt_entry_t *l2,
6001     struct rwlock **lockp)
6002 {
6003         struct spglist free;
6004
6005         SLIST_INIT(&free);
6006         (void)pmap_remove_l2(pmap, l2, va, pmap_load(pmap_l1(pmap, va)), &free,
6007             lockp);
6008         vm_page_free_pages_toq(&free, true);
6009 }
6010
6011 /*
6012  * Create an L3 table to map all addresses within an L2 mapping.
6013  */
6014 static pt_entry_t *
6015 pmap_demote_l2_locked(pmap_t pmap, pt_entry_t *l2, vm_offset_t va,
6016     struct rwlock **lockp)
6017 {
6018         pt_entry_t *l3, newl3, oldl2;
6019         vm_offset_t tmpl2;
6020         vm_paddr_t l3phys;
6021         vm_page_t ml3;
6022
6023         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6024         PMAP_ASSERT_STAGE1(pmap);
6025         l3 = NULL;
6026         oldl2 = pmap_load(l2);
6027         KASSERT((oldl2 & ATTR_DESCR_MASK) == L2_BLOCK,
6028             ("pmap_demote_l2: Demoting a non-block entry"));
6029         va &= ~L2_OFFSET;
6030
6031         tmpl2 = 0;
6032         if (va <= (vm_offset_t)l2 && va + L2_SIZE > (vm_offset_t)l2) {
6033                 tmpl2 = kva_alloc(PAGE_SIZE);
6034                 if (tmpl2 == 0)
6035                         return (NULL);
6036         }
6037
6038         /*
6039          * Invalidate the 2MB page mapping and return "failure" if the
6040          * mapping was never accessed.
6041          */
6042         if ((oldl2 & ATTR_AF) == 0) {
6043                 KASSERT((oldl2 & ATTR_SW_WIRED) == 0,
6044                     ("pmap_demote_l2: a wired mapping is missing ATTR_AF"));
6045                 pmap_demote_l2_abort(pmap, va, l2, lockp);
6046                 CTR2(KTR_PMAP, "pmap_demote_l2: failure for va %#lx in pmap %p",
6047                     va, pmap);
6048                 goto fail;
6049         }
6050
6051         if ((ml3 = pmap_remove_pt_page(pmap, va)) == NULL) {
6052                 KASSERT((oldl2 & ATTR_SW_WIRED) == 0,
6053                     ("pmap_demote_l2: page table page for a wired mapping"
6054                     " is missing"));
6055
6056                 /*
6057                  * If the page table page is missing and the mapping
6058                  * is for a kernel address, the mapping must belong to
6059                  * the direct map.  Page table pages are preallocated
6060                  * for every other part of the kernel address space,
6061                  * so the direct map region is the only part of the
6062                  * kernel address space that must be handled here.
6063                  */
6064                 KASSERT(va < VM_MAXUSER_ADDRESS || VIRT_IN_DMAP(va),
6065                     ("pmap_demote_l2: No saved mpte for va %#lx", va));
6066
6067                 /*
6068                  * If the 2MB page mapping belongs to the direct map
6069                  * region of the kernel's address space, then the page
6070                  * allocation request specifies the highest possible
6071                  * priority (VM_ALLOC_INTERRUPT).  Otherwise, the
6072                  * priority is normal.
6073                  */
6074                 ml3 = vm_page_alloc(NULL, pmap_l2_pindex(va),
6075                     (VIRT_IN_DMAP(va) ? VM_ALLOC_INTERRUPT : VM_ALLOC_NORMAL) |
6076                     VM_ALLOC_NOOBJ | VM_ALLOC_WIRED);
6077
6078                 /*
6079                  * If the allocation of the new page table page fails,
6080                  * invalidate the 2MB page mapping and return "failure".
6081                  */
6082                 if (ml3 == NULL) {
6083                         pmap_demote_l2_abort(pmap, va, l2, lockp);
6084                         CTR2(KTR_PMAP, "pmap_demote_l2: failure for va %#lx"
6085                             " in pmap %p", va, pmap);
6086                         goto fail;
6087                 }
6088
6089                 if (va < VM_MAXUSER_ADDRESS) {
6090                         ml3->ref_count = NL3PG;
6091                         pmap_resident_count_inc(pmap, 1);
6092                 }
6093         }
6094         l3phys = VM_PAGE_TO_PHYS(ml3);
6095         l3 = (pt_entry_t *)PHYS_TO_DMAP(l3phys);
6096         newl3 = (oldl2 & ~ATTR_DESCR_MASK) | L3_PAGE;
6097         KASSERT((oldl2 & (ATTR_S1_AP_RW_BIT | ATTR_SW_DBM)) !=
6098             (ATTR_S1_AP(ATTR_S1_AP_RO) | ATTR_SW_DBM),
6099             ("pmap_demote_l2: L2 entry is writeable but not dirty"));
6100
6101         /*
6102          * If the page table page is not leftover from an earlier promotion,
6103          * or the mapping attributes have changed, (re)initialize the L3 table.
6104          *
6105          * When pmap_update_entry() clears the old L2 mapping, it (indirectly)
6106          * performs a dsb().  That dsb() ensures that the stores for filling
6107          * "l3" are visible before "l3" is added to the page table.
6108          */
6109         if (ml3->valid == 0 || (l3[0] & ATTR_MASK) != (newl3 & ATTR_MASK))
6110                 pmap_fill_l3(l3, newl3);
6111
6112         /*
6113          * Map the temporary page so we don't lose access to the l2 table.
6114          */
6115         if (tmpl2 != 0) {
6116                 pmap_kenter(tmpl2, PAGE_SIZE,
6117                     DMAP_TO_PHYS((vm_offset_t)l2) & ~L3_OFFSET,
6118                     VM_MEMATTR_WRITE_BACK);
6119                 l2 = (pt_entry_t *)(tmpl2 + ((vm_offset_t)l2 & PAGE_MASK));
6120         }
6121
6122         /*
6123          * The spare PV entries must be reserved prior to demoting the
6124          * mapping, that is, prior to changing the PDE.  Otherwise, the state
6125          * of the L2 and the PV lists will be inconsistent, which can result
6126          * in reclaim_pv_chunk() attempting to remove a PV entry from the
6127          * wrong PV list and pmap_pv_demote_l2() failing to find the expected
6128          * PV entry for the 2MB page mapping that is being demoted.
6129          */
6130         if ((oldl2 & ATTR_SW_MANAGED) != 0)
6131                 reserve_pv_entries(pmap, Ln_ENTRIES - 1, lockp);
6132
6133         /*
6134          * Pass PAGE_SIZE so that a single TLB invalidation is performed on
6135          * the 2MB page mapping.
6136          */
6137         pmap_update_entry(pmap, l2, l3phys | L2_TABLE, va, PAGE_SIZE);
6138
6139         /*
6140          * Demote the PV entry.
6141          */
6142         if ((oldl2 & ATTR_SW_MANAGED) != 0)
6143                 pmap_pv_demote_l2(pmap, va, oldl2 & ~ATTR_MASK, lockp);
6144
6145         atomic_add_long(&pmap_l2_demotions, 1);
6146         CTR3(KTR_PMAP, "pmap_demote_l2: success for va %#lx"
6147             " in pmap %p %lx", va, pmap, l3[0]);
6148
6149 fail:
6150         if (tmpl2 != 0) {
6151                 pmap_kremove(tmpl2);
6152                 kva_free(tmpl2, PAGE_SIZE);
6153         }
6154
6155         return (l3);
6156
6157 }
6158
6159 static pt_entry_t *
6160 pmap_demote_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va)
6161 {
6162         struct rwlock *lock;
6163         pt_entry_t *l3;
6164
6165         lock = NULL;
6166         l3 = pmap_demote_l2_locked(pmap, l2, va, &lock);
6167         if (lock != NULL)
6168                 rw_wunlock(lock);
6169         return (l3);
6170 }
6171
6172 /*
6173  * Perform the pmap work for mincore(2).  If the page is not both referenced and
6174  * modified by this pmap, returns its physical address so that the caller can
6175  * find other mappings.
6176  */
6177 int
6178 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
6179 {
6180         pt_entry_t *pte, tpte;
6181         vm_paddr_t mask, pa;
6182         int lvl, val;
6183         bool managed;
6184
6185         PMAP_ASSERT_STAGE1(pmap);
6186         PMAP_LOCK(pmap);
6187         pte = pmap_pte(pmap, addr, &lvl);
6188         if (pte != NULL) {
6189                 tpte = pmap_load(pte);
6190
6191                 switch (lvl) {
6192                 case 3:
6193                         mask = L3_OFFSET;
6194                         break;
6195                 case 2:
6196                         mask = L2_OFFSET;
6197                         break;
6198                 case 1:
6199                         mask = L1_OFFSET;
6200                         break;
6201                 default:
6202                         panic("pmap_mincore: invalid level %d", lvl);
6203                 }
6204
6205                 managed = (tpte & ATTR_SW_MANAGED) != 0;
6206                 val = MINCORE_INCORE;
6207                 if (lvl != 3)
6208                         val |= MINCORE_PSIND(3 - lvl);
6209                 if ((managed && pmap_pte_dirty(pmap, tpte)) || (!managed &&
6210                     (tpte & ATTR_S1_AP_RW_BIT) == ATTR_S1_AP(ATTR_S1_AP_RW)))
6211                         val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
6212                 if ((tpte & ATTR_AF) == ATTR_AF)
6213                         val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
6214
6215                 pa = (tpte & ~ATTR_MASK) | (addr & mask);
6216         } else {
6217                 managed = false;
6218                 val = 0;
6219         }
6220
6221         if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
6222             (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) {
6223                 *pap = pa;
6224         }
6225         PMAP_UNLOCK(pmap);
6226         return (val);
6227 }
6228
6229 /*
6230  * Garbage collect every ASID that is neither active on a processor nor
6231  * reserved.
6232  */
6233 static void
6234 pmap_reset_asid_set(pmap_t pmap)
6235 {
6236         pmap_t curpmap;
6237         int asid, cpuid, epoch;
6238         struct asid_set *set;
6239         enum pmap_stage stage;
6240
6241         set = pmap->pm_asid_set;
6242         stage = pmap->pm_stage;
6243
6244         set = pmap->pm_asid_set;
6245         KASSERT(set != NULL, ("%s: NULL asid set", __func__));
6246         mtx_assert(&set->asid_set_mutex, MA_OWNED);
6247
6248         /*
6249          * Ensure that the store to asid_epoch is globally visible before the
6250          * loads from pc_curpmap are performed.
6251          */
6252         epoch = set->asid_epoch + 1;
6253         if (epoch == INT_MAX)
6254                 epoch = 0;
6255         set->asid_epoch = epoch;
6256         dsb(ishst);
6257         if (stage == PM_STAGE1) {
6258                 __asm __volatile("tlbi vmalle1is");
6259         } else {
6260                 KASSERT(pmap_clean_stage2_tlbi != NULL,
6261                     ("%s: Unset stage 2 tlb invalidation callback\n",
6262                     __func__));
6263                 pmap_clean_stage2_tlbi();
6264         }
6265         dsb(ish);
6266         bit_nclear(set->asid_set, ASID_FIRST_AVAILABLE,
6267             set->asid_set_size - 1);
6268         CPU_FOREACH(cpuid) {
6269                 if (cpuid == curcpu)
6270                         continue;
6271                 if (stage == PM_STAGE1) {
6272                         curpmap = pcpu_find(cpuid)->pc_curpmap;
6273                         PMAP_ASSERT_STAGE1(pmap);
6274                 } else {
6275                         curpmap = pcpu_find(cpuid)->pc_curvmpmap;
6276                         if (curpmap == NULL)
6277                                 continue;
6278                         PMAP_ASSERT_STAGE2(pmap);
6279                 }
6280                 KASSERT(curpmap->pm_asid_set == set, ("Incorrect set"));
6281                 asid = COOKIE_TO_ASID(curpmap->pm_cookie);
6282                 if (asid == -1)
6283                         continue;
6284                 bit_set(set->asid_set, asid);
6285                 curpmap->pm_cookie = COOKIE_FROM(asid, epoch);
6286         }
6287 }
6288
6289 /*
6290  * Allocate a new ASID for the specified pmap.
6291  */
6292 static void
6293 pmap_alloc_asid(pmap_t pmap)
6294 {
6295         struct asid_set *set;
6296         int new_asid;
6297
6298         set = pmap->pm_asid_set;
6299         KASSERT(set != NULL, ("%s: NULL asid set", __func__));
6300
6301         mtx_lock_spin(&set->asid_set_mutex);
6302
6303         /*
6304          * While this processor was waiting to acquire the asid set mutex,
6305          * pmap_reset_asid_set() running on another processor might have
6306          * updated this pmap's cookie to the current epoch.  In which case, we
6307          * don't need to allocate a new ASID.
6308          */
6309         if (COOKIE_TO_EPOCH(pmap->pm_cookie) == set->asid_epoch)
6310                 goto out;
6311
6312         bit_ffc_at(set->asid_set, set->asid_next, set->asid_set_size,
6313             &new_asid);
6314         if (new_asid == -1) {
6315                 bit_ffc_at(set->asid_set, ASID_FIRST_AVAILABLE,
6316                     set->asid_next, &new_asid);
6317                 if (new_asid == -1) {
6318                         pmap_reset_asid_set(pmap);
6319                         bit_ffc_at(set->asid_set, ASID_FIRST_AVAILABLE,
6320                             set->asid_set_size, &new_asid);
6321                         KASSERT(new_asid != -1, ("ASID allocation failure"));
6322                 }
6323         }
6324         bit_set(set->asid_set, new_asid);
6325         set->asid_next = new_asid + 1;
6326         pmap->pm_cookie = COOKIE_FROM(new_asid, set->asid_epoch);
6327 out:
6328         mtx_unlock_spin(&set->asid_set_mutex);
6329 }
6330
6331 /*
6332  * Compute the value that should be stored in ttbr0 to activate the specified
6333  * pmap.  This value may change from time to time.
6334  */
6335 uint64_t
6336 pmap_to_ttbr0(pmap_t pmap)
6337 {
6338
6339         return (ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie)) |
6340             pmap->pm_l0_paddr);
6341 }
6342
6343 static bool
6344 pmap_activate_int(pmap_t pmap)
6345 {
6346         struct asid_set *set;
6347         int epoch;
6348
6349         KASSERT(PCPU_GET(curpmap) != NULL, ("no active pmap"));
6350         KASSERT(pmap != kernel_pmap, ("kernel pmap activation"));
6351
6352         if ((pmap->pm_stage == PM_STAGE1 && pmap == PCPU_GET(curpmap)) ||
6353             (pmap->pm_stage == PM_STAGE2 && pmap == PCPU_GET(curvmpmap))) {
6354                 /*
6355                  * Handle the possibility that the old thread was preempted
6356                  * after an "ic" or "tlbi" instruction but before it performed
6357                  * a "dsb" instruction.  If the old thread migrates to a new
6358                  * processor, its completion of a "dsb" instruction on that
6359                  * new processor does not guarantee that the "ic" or "tlbi"
6360                  * instructions performed on the old processor have completed.
6361                  */
6362                 dsb(ish);
6363                 return (false);
6364         }
6365
6366         set = pmap->pm_asid_set;
6367         KASSERT(set != NULL, ("%s: NULL asid set", __func__));
6368
6369         /*
6370          * Ensure that the store to curpmap is globally visible before the
6371          * load from asid_epoch is performed.
6372          */
6373         if (pmap->pm_stage == PM_STAGE1)
6374                 PCPU_SET(curpmap, pmap);
6375         else
6376                 PCPU_SET(curvmpmap, pmap);
6377         dsb(ish);
6378         epoch = COOKIE_TO_EPOCH(pmap->pm_cookie);
6379         if (epoch >= 0 && epoch != set->asid_epoch)
6380                 pmap_alloc_asid(pmap);
6381
6382         if (pmap->pm_stage == PM_STAGE1) {
6383                 set_ttbr0(pmap_to_ttbr0(pmap));
6384                 if (PCPU_GET(bcast_tlbi_workaround) != 0)
6385                         invalidate_local_icache();
6386         }
6387         return (true);
6388 }
6389
6390 void
6391 pmap_activate_vm(pmap_t pmap)
6392 {
6393
6394         PMAP_ASSERT_STAGE2(pmap);
6395
6396         (void)pmap_activate_int(pmap);
6397 }
6398
6399 void
6400 pmap_activate(struct thread *td)
6401 {
6402         pmap_t  pmap;
6403
6404         pmap = vmspace_pmap(td->td_proc->p_vmspace);
6405         PMAP_ASSERT_STAGE1(pmap);
6406         critical_enter();
6407         (void)pmap_activate_int(pmap);
6408         critical_exit();
6409 }
6410
6411 /*
6412  * To eliminate the unused parameter "old", we would have to add an instruction
6413  * to cpu_switch().
6414  */
6415 struct pcb *
6416 pmap_switch(struct thread *old __unused, struct thread *new)
6417 {
6418         pcpu_bp_harden bp_harden;
6419         struct pcb *pcb;
6420
6421         /* Store the new curthread */
6422         PCPU_SET(curthread, new);
6423
6424         /* And the new pcb */
6425         pcb = new->td_pcb;
6426         PCPU_SET(curpcb, pcb);
6427
6428         /*
6429          * TODO: We may need to flush the cache here if switching
6430          * to a user process.
6431          */
6432
6433         if (pmap_activate_int(vmspace_pmap(new->td_proc->p_vmspace))) {
6434                 /*
6435                  * Stop userspace from training the branch predictor against
6436                  * other processes. This will call into a CPU specific
6437                  * function that clears the branch predictor state.
6438                  */
6439                 bp_harden = PCPU_GET(bp_harden);
6440                 if (bp_harden != NULL)
6441                         bp_harden();
6442         }
6443
6444         return (pcb);
6445 }
6446
6447 void
6448 pmap_sync_icache(pmap_t pmap, vm_offset_t va, vm_size_t sz)
6449 {
6450
6451         PMAP_ASSERT_STAGE1(pmap);
6452         if (va >= VM_MIN_KERNEL_ADDRESS) {
6453                 cpu_icache_sync_range(va, sz);
6454         } else {
6455                 u_int len, offset;
6456                 vm_paddr_t pa;
6457
6458                 /* Find the length of data in this page to flush */
6459                 offset = va & PAGE_MASK;
6460                 len = imin(PAGE_SIZE - offset, sz);
6461
6462                 while (sz != 0) {
6463                         /* Extract the physical address & find it in the DMAP */
6464                         pa = pmap_extract(pmap, va);
6465                         if (pa != 0)
6466                                 cpu_icache_sync_range(PHYS_TO_DMAP(pa), len);
6467
6468                         /* Move to the next page */
6469                         sz -= len;
6470                         va += len;
6471                         /* Set the length for the next iteration */
6472                         len = imin(PAGE_SIZE, sz);
6473                 }
6474         }
6475 }
6476
6477 static int
6478 pmap_stage2_fault(pmap_t pmap, uint64_t esr, uint64_t far)
6479 {
6480         pd_entry_t *pdep;
6481         pt_entry_t *ptep, pte;
6482         int rv, lvl, dfsc;
6483
6484         PMAP_ASSERT_STAGE2(pmap);
6485         rv = KERN_FAILURE;
6486
6487         /* Data and insn aborts use same encoding for FSC field. */
6488         dfsc = esr & ISS_DATA_DFSC_MASK;
6489         switch (dfsc) {
6490         case ISS_DATA_DFSC_TF_L0:
6491         case ISS_DATA_DFSC_TF_L1:
6492         case ISS_DATA_DFSC_TF_L2:
6493         case ISS_DATA_DFSC_TF_L3:
6494                 PMAP_LOCK(pmap);
6495                 pdep = pmap_pde(pmap, far, &lvl);
6496                 if (pdep == NULL || lvl != (dfsc - ISS_DATA_DFSC_TF_L1)) {
6497                         PMAP_LOCK(pmap);
6498                         break;
6499                 }
6500
6501                 switch (lvl) {
6502                 case 0:
6503                         ptep = pmap_l0_to_l1(pdep, far);
6504                         break;
6505                 case 1:
6506                         ptep = pmap_l1_to_l2(pdep, far);
6507                         break;
6508                 case 2:
6509                         ptep = pmap_l2_to_l3(pdep, far);
6510                         break;
6511                 default:
6512                         panic("%s: Invalid pde level %d", __func__,lvl);
6513                 }
6514                 goto fault_exec;
6515
6516         case ISS_DATA_DFSC_AFF_L1:
6517         case ISS_DATA_DFSC_AFF_L2:
6518         case ISS_DATA_DFSC_AFF_L3:
6519                 PMAP_LOCK(pmap);
6520                 ptep = pmap_pte(pmap, far, &lvl);
6521 fault_exec:
6522                 if (ptep != NULL && (pte = pmap_load(ptep)) != 0) {
6523                         if (icache_vmid) {
6524                                 pmap_invalidate_vpipt_icache();
6525                         } else {
6526                                 /*
6527                                  * If accessing an executable page invalidate
6528                                  * the I-cache so it will be valid when we
6529                                  * continue execution in the guest. The D-cache
6530                                  * is assumed to already be clean to the Point
6531                                  * of Coherency.
6532                                  */
6533                                 if ((pte & ATTR_S2_XN_MASK) !=
6534                                     ATTR_S2_XN(ATTR_S2_XN_NONE)) {
6535                                         invalidate_icache();
6536                                 }
6537                         }
6538                         pmap_set_bits(ptep, ATTR_AF | ATTR_DESCR_VALID);
6539                         rv = KERN_SUCCESS;
6540                 }
6541                 PMAP_UNLOCK(pmap);
6542                 break;
6543         }
6544
6545         return (rv);
6546 }
6547
6548 int
6549 pmap_fault(pmap_t pmap, uint64_t esr, uint64_t far)
6550 {
6551         pt_entry_t pte, *ptep;
6552         register_t intr;
6553         uint64_t ec, par;
6554         int lvl, rv;
6555
6556         rv = KERN_FAILURE;
6557
6558         ec = ESR_ELx_EXCEPTION(esr);
6559         switch (ec) {
6560         case EXCP_INSN_ABORT_L:
6561         case EXCP_INSN_ABORT:
6562         case EXCP_DATA_ABORT_L:
6563         case EXCP_DATA_ABORT:
6564                 break;
6565         default:
6566                 return (rv);
6567         }
6568
6569         if (pmap->pm_stage == PM_STAGE2)
6570                 return (pmap_stage2_fault(pmap, esr, far));
6571
6572         /* Data and insn aborts use same encoding for FSC field. */
6573         switch (esr & ISS_DATA_DFSC_MASK) {
6574         case ISS_DATA_DFSC_AFF_L1:
6575         case ISS_DATA_DFSC_AFF_L2:
6576         case ISS_DATA_DFSC_AFF_L3:
6577                 PMAP_LOCK(pmap);
6578                 ptep = pmap_pte(pmap, far, &lvl);
6579                 if (ptep != NULL) {
6580                         pmap_set_bits(ptep, ATTR_AF);
6581                         rv = KERN_SUCCESS;
6582                         /*
6583                          * XXXMJ as an optimization we could mark the entry
6584                          * dirty if this is a write fault.
6585                          */
6586                 }
6587                 PMAP_UNLOCK(pmap);
6588                 break;
6589         case ISS_DATA_DFSC_PF_L1:
6590         case ISS_DATA_DFSC_PF_L2:
6591         case ISS_DATA_DFSC_PF_L3:
6592                 if ((ec != EXCP_DATA_ABORT_L && ec != EXCP_DATA_ABORT) ||
6593                     (esr & ISS_DATA_WnR) == 0)
6594                         return (rv);
6595                 PMAP_LOCK(pmap);
6596                 ptep = pmap_pte(pmap, far, &lvl);
6597                 if (ptep != NULL &&
6598                     ((pte = pmap_load(ptep)) & ATTR_SW_DBM) != 0) {
6599                         if ((pte & ATTR_S1_AP_RW_BIT) ==
6600                             ATTR_S1_AP(ATTR_S1_AP_RO)) {
6601                                 pmap_clear_bits(ptep, ATTR_S1_AP_RW_BIT);
6602                                 pmap_invalidate_page(pmap, far);
6603                         }
6604                         rv = KERN_SUCCESS;
6605                 }
6606                 PMAP_UNLOCK(pmap);
6607                 break;
6608         case ISS_DATA_DFSC_TF_L0:
6609         case ISS_DATA_DFSC_TF_L1:
6610         case ISS_DATA_DFSC_TF_L2:
6611         case ISS_DATA_DFSC_TF_L3:
6612                 /*
6613                  * Retry the translation.  A break-before-make sequence can
6614                  * produce a transient fault.
6615                  */
6616                 if (pmap == kernel_pmap) {
6617                         /*
6618                          * The translation fault may have occurred within a
6619                          * critical section.  Therefore, we must check the
6620                          * address without acquiring the kernel pmap's lock.
6621                          */
6622                         if (pmap_kextract(far) != 0)
6623                                 rv = KERN_SUCCESS;
6624                 } else {
6625                         PMAP_LOCK(pmap);
6626                         /* Ask the MMU to check the address. */
6627                         intr = intr_disable();
6628                         par = arm64_address_translate_s1e0r(far);
6629                         intr_restore(intr);
6630                         PMAP_UNLOCK(pmap);
6631
6632                         /*
6633                          * If the translation was successful, then we can
6634                          * return success to the trap handler.
6635                          */
6636                         if (PAR_SUCCESS(par))
6637                                 rv = KERN_SUCCESS;
6638                 }
6639                 break;
6640         }
6641
6642         return (rv);
6643 }
6644
6645 /*
6646  *      Increase the starting virtual address of the given mapping if a
6647  *      different alignment might result in more superpage mappings.
6648  */
6649 void
6650 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
6651     vm_offset_t *addr, vm_size_t size)
6652 {
6653         vm_offset_t superpage_offset;
6654
6655         if (size < L2_SIZE)
6656                 return;
6657         if (object != NULL && (object->flags & OBJ_COLORED) != 0)
6658                 offset += ptoa(object->pg_color);
6659         superpage_offset = offset & L2_OFFSET;
6660         if (size - ((L2_SIZE - superpage_offset) & L2_OFFSET) < L2_SIZE ||
6661             (*addr & L2_OFFSET) == superpage_offset)
6662                 return;
6663         if ((*addr & L2_OFFSET) < superpage_offset)
6664                 *addr = (*addr & ~L2_OFFSET) + superpage_offset;
6665         else
6666                 *addr = ((*addr + L2_OFFSET) & ~L2_OFFSET) + superpage_offset;
6667 }
6668
6669 /**
6670  * Get the kernel virtual address of a set of physical pages. If there are
6671  * physical addresses not covered by the DMAP perform a transient mapping
6672  * that will be removed when calling pmap_unmap_io_transient.
6673  *
6674  * \param page        The pages the caller wishes to obtain the virtual
6675  *                    address on the kernel memory map.
6676  * \param vaddr       On return contains the kernel virtual memory address
6677  *                    of the pages passed in the page parameter.
6678  * \param count       Number of pages passed in.
6679  * \param can_fault   TRUE if the thread using the mapped pages can take
6680  *                    page faults, FALSE otherwise.
6681  *
6682  * \returns TRUE if the caller must call pmap_unmap_io_transient when
6683  *          finished or FALSE otherwise.
6684  *
6685  */
6686 boolean_t
6687 pmap_map_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
6688     boolean_t can_fault)
6689 {
6690         vm_paddr_t paddr;
6691         boolean_t needs_mapping;
6692         int error, i;
6693
6694         /*
6695          * Allocate any KVA space that we need, this is done in a separate
6696          * loop to prevent calling vmem_alloc while pinned.
6697          */
6698         needs_mapping = FALSE;
6699         for (i = 0; i < count; i++) {
6700                 paddr = VM_PAGE_TO_PHYS(page[i]);
6701                 if (__predict_false(!PHYS_IN_DMAP(paddr))) {
6702                         error = vmem_alloc(kernel_arena, PAGE_SIZE,
6703                             M_BESTFIT | M_WAITOK, &vaddr[i]);
6704                         KASSERT(error == 0, ("vmem_alloc failed: %d", error));
6705                         needs_mapping = TRUE;
6706                 } else {
6707                         vaddr[i] = PHYS_TO_DMAP(paddr);
6708                 }
6709         }
6710
6711         /* Exit early if everything is covered by the DMAP */
6712         if (!needs_mapping)
6713                 return (FALSE);
6714
6715         if (!can_fault)
6716                 sched_pin();
6717         for (i = 0; i < count; i++) {
6718                 paddr = VM_PAGE_TO_PHYS(page[i]);
6719                 if (!PHYS_IN_DMAP(paddr)) {
6720                         panic(
6721                            "pmap_map_io_transient: TODO: Map out of DMAP data");
6722                 }
6723         }
6724
6725         return (needs_mapping);
6726 }
6727
6728 void
6729 pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
6730     boolean_t can_fault)
6731 {
6732         vm_paddr_t paddr;
6733         int i;
6734
6735         if (!can_fault)
6736                 sched_unpin();
6737         for (i = 0; i < count; i++) {
6738                 paddr = VM_PAGE_TO_PHYS(page[i]);
6739                 if (!PHYS_IN_DMAP(paddr)) {
6740                         panic("ARM64TODO: pmap_unmap_io_transient: Unmap data");
6741                 }
6742         }
6743 }
6744
6745 boolean_t
6746 pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode)
6747 {
6748
6749         return (mode >= VM_MEMATTR_DEVICE && mode <= VM_MEMATTR_WRITE_THROUGH);
6750 }
6751
6752 /*
6753  * Track a range of the kernel's virtual address space that is contiguous
6754  * in various mapping attributes.
6755  */
6756 struct pmap_kernel_map_range {
6757         vm_offset_t sva;
6758         pt_entry_t attrs;
6759         int l3pages;
6760         int l3contig;
6761         int l2blocks;
6762         int l1blocks;
6763 };
6764
6765 static void
6766 sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_map_range *range,
6767     vm_offset_t eva)
6768 {
6769         const char *mode;
6770         int index;
6771
6772         if (eva <= range->sva)
6773                 return;
6774
6775         index = range->attrs & ATTR_S1_IDX_MASK;
6776         switch (index) {
6777         case ATTR_S1_IDX(VM_MEMATTR_DEVICE):
6778                 mode = "DEV";
6779                 break;
6780         case ATTR_S1_IDX(VM_MEMATTR_UNCACHEABLE):
6781                 mode = "UC";
6782                 break;
6783         case ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK):
6784                 mode = "WB";
6785                 break;
6786         case ATTR_S1_IDX(VM_MEMATTR_WRITE_THROUGH):
6787                 mode = "WT";
6788                 break;
6789         default:
6790                 printf(
6791                     "%s: unknown memory type %x for range 0x%016lx-0x%016lx\n",
6792                     __func__, index, range->sva, eva);
6793                 mode = "??";
6794                 break;
6795         }
6796
6797         sbuf_printf(sb, "0x%016lx-0x%016lx r%c%c%c %3s %d %d %d %d\n",
6798             range->sva, eva,
6799             (range->attrs & ATTR_S1_AP_RW_BIT) == ATTR_S1_AP_RW ? 'w' : '-',
6800             (range->attrs & ATTR_S1_PXN) != 0 ? '-' : 'x',
6801             (range->attrs & ATTR_S1_AP_USER) != 0 ? 'u' : 's',
6802             mode, range->l1blocks, range->l2blocks, range->l3contig,
6803             range->l3pages);
6804
6805         /* Reset to sentinel value. */
6806         range->sva = 0xfffffffffffffffful;
6807 }
6808
6809 /*
6810  * Determine whether the attributes specified by a page table entry match those
6811  * being tracked by the current range.
6812  */
6813 static bool
6814 sysctl_kmaps_match(struct pmap_kernel_map_range *range, pt_entry_t attrs)
6815 {
6816
6817         return (range->attrs == attrs);
6818 }
6819
6820 static void
6821 sysctl_kmaps_reinit(struct pmap_kernel_map_range *range, vm_offset_t va,
6822     pt_entry_t attrs)
6823 {
6824
6825         memset(range, 0, sizeof(*range));
6826         range->sva = va;
6827         range->attrs = attrs;
6828 }
6829
6830 /*
6831  * Given a leaf PTE, derive the mapping's attributes.  If they do not match
6832  * those of the current run, dump the address range and its attributes, and
6833  * begin a new run.
6834  */
6835 static void
6836 sysctl_kmaps_check(struct sbuf *sb, struct pmap_kernel_map_range *range,
6837     vm_offset_t va, pd_entry_t l0e, pd_entry_t l1e, pd_entry_t l2e,
6838     pt_entry_t l3e)
6839 {
6840         pt_entry_t attrs;
6841
6842         attrs = l0e & (ATTR_S1_AP_MASK | ATTR_S1_XN);
6843         attrs |= l1e & (ATTR_S1_AP_MASK | ATTR_S1_XN);
6844         if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK)
6845                 attrs |= l1e & ATTR_S1_IDX_MASK;
6846         attrs |= l2e & (ATTR_S1_AP_MASK | ATTR_S1_XN);
6847         if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK)
6848                 attrs |= l2e & ATTR_S1_IDX_MASK;
6849         attrs |= l3e & (ATTR_S1_AP_MASK | ATTR_S1_XN | ATTR_S1_IDX_MASK);
6850
6851         if (range->sva > va || !sysctl_kmaps_match(range, attrs)) {
6852                 sysctl_kmaps_dump(sb, range, va);
6853                 sysctl_kmaps_reinit(range, va, attrs);
6854         }
6855 }
6856
6857 static int
6858 sysctl_kmaps(SYSCTL_HANDLER_ARGS)
6859 {
6860         struct pmap_kernel_map_range range;
6861         struct sbuf sbuf, *sb;
6862         pd_entry_t l0e, *l1, l1e, *l2, l2e;
6863         pt_entry_t *l3, l3e;
6864         vm_offset_t sva;
6865         vm_paddr_t pa;
6866         int error, i, j, k, l;
6867
6868         error = sysctl_wire_old_buffer(req, 0);
6869         if (error != 0)
6870                 return (error);
6871         sb = &sbuf;
6872         sbuf_new_for_sysctl(sb, NULL, PAGE_SIZE, req);
6873
6874         /* Sentinel value. */
6875         range.sva = 0xfffffffffffffffful;
6876
6877         /*
6878          * Iterate over the kernel page tables without holding the kernel pmap
6879          * lock.  Kernel page table pages are never freed, so at worst we will
6880          * observe inconsistencies in the output.
6881          */
6882         for (sva = 0xffff000000000000ul, i = pmap_l0_index(sva); i < Ln_ENTRIES;
6883             i++) {
6884                 if (i == pmap_l0_index(DMAP_MIN_ADDRESS))
6885                         sbuf_printf(sb, "\nDirect map:\n");
6886                 else if (i == pmap_l0_index(VM_MIN_KERNEL_ADDRESS))
6887                         sbuf_printf(sb, "\nKernel map:\n");
6888
6889                 l0e = kernel_pmap->pm_l0[i];
6890                 if ((l0e & ATTR_DESCR_VALID) == 0) {
6891                         sysctl_kmaps_dump(sb, &range, sva);
6892                         sva += L0_SIZE;
6893                         continue;
6894                 }
6895                 pa = l0e & ~ATTR_MASK;
6896                 l1 = (pd_entry_t *)PHYS_TO_DMAP(pa);
6897
6898                 for (j = pmap_l1_index(sva); j < Ln_ENTRIES; j++) {
6899                         l1e = l1[j];
6900                         if ((l1e & ATTR_DESCR_VALID) == 0) {
6901                                 sysctl_kmaps_dump(sb, &range, sva);
6902                                 sva += L1_SIZE;
6903                                 continue;
6904                         }
6905                         if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) {
6906                                 sysctl_kmaps_check(sb, &range, sva, l0e, l1e,
6907                                     0, 0);
6908                                 range.l1blocks++;
6909                                 sva += L1_SIZE;
6910                                 continue;
6911                         }
6912                         pa = l1e & ~ATTR_MASK;
6913                         l2 = (pd_entry_t *)PHYS_TO_DMAP(pa);
6914
6915                         for (k = pmap_l2_index(sva); k < Ln_ENTRIES; k++) {
6916                                 l2e = l2[k];
6917                                 if ((l2e & ATTR_DESCR_VALID) == 0) {
6918                                         sysctl_kmaps_dump(sb, &range, sva);
6919                                         sva += L2_SIZE;
6920                                         continue;
6921                                 }
6922                                 if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) {
6923                                         sysctl_kmaps_check(sb, &range, sva,
6924                                             l0e, l1e, l2e, 0);
6925                                         range.l2blocks++;
6926                                         sva += L2_SIZE;
6927                                         continue;
6928                                 }
6929                                 pa = l2e & ~ATTR_MASK;
6930                                 l3 = (pt_entry_t *)PHYS_TO_DMAP(pa);
6931
6932                                 for (l = pmap_l3_index(sva); l < Ln_ENTRIES;
6933                                     l++, sva += L3_SIZE) {
6934                                         l3e = l3[l];
6935                                         if ((l3e & ATTR_DESCR_VALID) == 0) {
6936                                                 sysctl_kmaps_dump(sb, &range,
6937                                                     sva);
6938                                                 continue;
6939                                         }
6940                                         sysctl_kmaps_check(sb, &range, sva,
6941                                             l0e, l1e, l2e, l3e);
6942                                         if ((l3e & ATTR_CONTIGUOUS) != 0)
6943                                                 range.l3contig += l % 16 == 0 ?
6944                                                     1 : 0;
6945                                         else
6946                                                 range.l3pages++;
6947                                 }
6948                         }
6949                 }
6950         }
6951
6952         error = sbuf_finish(sb);
6953         sbuf_delete(sb);
6954         return (error);
6955 }
6956 SYSCTL_OID(_vm_pmap, OID_AUTO, kernel_maps,
6957     CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
6958     NULL, 0, sysctl_kmaps, "A",
6959     "Dump kernel address layout");