]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/amd64/pmap.c
amd64/arm64 pmap: Stop requiring the accessed bit for superpage promotion
[FreeBSD/FreeBSD.git] / sys / amd64 / amd64 / pmap.c
1 /*-
2  * SPDX-License-Identifier: BSD-4-Clause
3  *
4  * Copyright (c) 1991 Regents of the University of California.
5  * All rights reserved.
6  * Copyright (c) 1994 John S. Dyson
7  * All rights reserved.
8  * Copyright (c) 1994 David Greenman
9  * All rights reserved.
10  * Copyright (c) 2003 Peter Wemm
11  * All rights reserved.
12  * Copyright (c) 2005-2010 Alan L. Cox <alc@cs.rice.edu>
13  * All rights reserved.
14  *
15  * This code is derived from software contributed to Berkeley by
16  * the Systems Programming Group of the University of Utah Computer
17  * Science Department and William Jolitz of UUNET Technologies Inc.
18  *
19  * Redistribution and use in source and binary forms, with or without
20  * modification, are permitted provided that the following conditions
21  * are met:
22  * 1. Redistributions of source code must retain the above copyright
23  *    notice, this list of conditions and the following disclaimer.
24  * 2. Redistributions in binary form must reproduce the above copyright
25  *    notice, this list of conditions and the following disclaimer in the
26  *    documentation and/or other materials provided with the distribution.
27  * 3. All advertising materials mentioning features or use of this software
28  *    must display the following acknowledgement:
29  *      This product includes software developed by the University of
30  *      California, Berkeley and its contributors.
31  * 4. Neither the name of the University nor the names of its contributors
32  *    may be used to endorse or promote products derived from this software
33  *    without specific prior written permission.
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
36  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
39  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
41  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45  * SUCH DAMAGE.
46  *
47  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
48  */
49 /*-
50  * Copyright (c) 2003 Networks Associates Technology, Inc.
51  * Copyright (c) 2014-2020 The FreeBSD Foundation
52  * All rights reserved.
53  *
54  * This software was developed for the FreeBSD Project by Jake Burkholder,
55  * Safeport Network Services, and Network Associates Laboratories, the
56  * Security Research Division of Network Associates, Inc. under
57  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
58  * CHATS research program.
59  *
60  * Portions of this software were developed by
61  * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
62  * the FreeBSD Foundation.
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 #define AMD64_NPT_AWARE
87
88 #include <sys/cdefs.h>
89 __FBSDID("$FreeBSD$");
90
91 /*
92  *      Manages physical address maps.
93  *
94  *      Since the information managed by this module is
95  *      also stored by the logical address mapping module,
96  *      this module may throw away valid virtual-to-physical
97  *      mappings at almost any time.  However, invalidations
98  *      of virtual-to-physical mappings must be done as
99  *      requested.
100  *
101  *      In order to cope with hardware architectures which
102  *      make virtual-to-physical map invalidates expensive,
103  *      this module may delay invalidate or reduced protection
104  *      operations until such time as they are actually
105  *      necessary.  This module is given full information as
106  *      to which processors are currently using which maps,
107  *      and to when physical maps must be made correct.
108  */
109
110 #include "opt_ddb.h"
111 #include "opt_pmap.h"
112 #include "opt_vm.h"
113
114 #include <sys/param.h>
115 #include <sys/asan.h>
116 #include <sys/bitstring.h>
117 #include <sys/bus.h>
118 #include <sys/systm.h>
119 #include <sys/counter.h>
120 #include <sys/kernel.h>
121 #include <sys/ktr.h>
122 #include <sys/lock.h>
123 #include <sys/malloc.h>
124 #include <sys/mman.h>
125 #include <sys/msan.h>
126 #include <sys/mutex.h>
127 #include <sys/proc.h>
128 #include <sys/rangeset.h>
129 #include <sys/rwlock.h>
130 #include <sys/sbuf.h>
131 #include <sys/smr.h>
132 #include <sys/sx.h>
133 #include <sys/turnstile.h>
134 #include <sys/vmem.h>
135 #include <sys/vmmeter.h>
136 #include <sys/sched.h>
137 #include <sys/sysctl.h>
138 #include <sys/smp.h>
139 #ifdef DDB
140 #include <sys/kdb.h>
141 #include <ddb/ddb.h>
142 #endif
143
144 #include <vm/vm.h>
145 #include <vm/vm_param.h>
146 #include <vm/vm_kern.h>
147 #include <vm/vm_page.h>
148 #include <vm/vm_map.h>
149 #include <vm/vm_object.h>
150 #include <vm/vm_extern.h>
151 #include <vm/vm_pageout.h>
152 #include <vm/vm_pager.h>
153 #include <vm/vm_phys.h>
154 #include <vm/vm_radix.h>
155 #include <vm/vm_reserv.h>
156 #include <vm/vm_dumpset.h>
157 #include <vm/uma.h>
158
159 #include <machine/asan.h>
160 #include <machine/intr_machdep.h>
161 #include <x86/apicvar.h>
162 #include <x86/ifunc.h>
163 #include <machine/cpu.h>
164 #include <machine/cputypes.h>
165 #include <machine/md_var.h>
166 #include <machine/msan.h>
167 #include <machine/pcb.h>
168 #include <machine/specialreg.h>
169 #ifdef SMP
170 #include <machine/smp.h>
171 #endif
172 #include <machine/sysarch.h>
173 #include <machine/tss.h>
174
175 #ifdef NUMA
176 #define PMAP_MEMDOM     MAXMEMDOM
177 #else
178 #define PMAP_MEMDOM     1
179 #endif
180
181 static __inline boolean_t
182 pmap_type_guest(pmap_t pmap)
183 {
184
185         return ((pmap->pm_type == PT_EPT) || (pmap->pm_type == PT_RVI));
186 }
187
188 static __inline boolean_t
189 pmap_emulate_ad_bits(pmap_t pmap)
190 {
191
192         return ((pmap->pm_flags & PMAP_EMULATE_AD_BITS) != 0);
193 }
194
195 static __inline pt_entry_t
196 pmap_valid_bit(pmap_t pmap)
197 {
198         pt_entry_t mask;
199
200         switch (pmap->pm_type) {
201         case PT_X86:
202         case PT_RVI:
203                 mask = X86_PG_V;
204                 break;
205         case PT_EPT:
206                 if (pmap_emulate_ad_bits(pmap))
207                         mask = EPT_PG_EMUL_V;
208                 else
209                         mask = EPT_PG_READ;
210                 break;
211         default:
212                 panic("pmap_valid_bit: invalid pm_type %d", pmap->pm_type);
213         }
214
215         return (mask);
216 }
217
218 static __inline pt_entry_t
219 pmap_rw_bit(pmap_t pmap)
220 {
221         pt_entry_t mask;
222
223         switch (pmap->pm_type) {
224         case PT_X86:
225         case PT_RVI:
226                 mask = X86_PG_RW;
227                 break;
228         case PT_EPT:
229                 if (pmap_emulate_ad_bits(pmap))
230                         mask = EPT_PG_EMUL_RW;
231                 else
232                         mask = EPT_PG_WRITE;
233                 break;
234         default:
235                 panic("pmap_rw_bit: invalid pm_type %d", pmap->pm_type);
236         }
237
238         return (mask);
239 }
240
241 static pt_entry_t pg_g;
242
243 static __inline pt_entry_t
244 pmap_global_bit(pmap_t pmap)
245 {
246         pt_entry_t mask;
247
248         switch (pmap->pm_type) {
249         case PT_X86:
250                 mask = pg_g;
251                 break;
252         case PT_RVI:
253         case PT_EPT:
254                 mask = 0;
255                 break;
256         default:
257                 panic("pmap_global_bit: invalid pm_type %d", pmap->pm_type);
258         }
259
260         return (mask);
261 }
262
263 static __inline pt_entry_t
264 pmap_accessed_bit(pmap_t pmap)
265 {
266         pt_entry_t mask;
267
268         switch (pmap->pm_type) {
269         case PT_X86:
270         case PT_RVI:
271                 mask = X86_PG_A;
272                 break;
273         case PT_EPT:
274                 if (pmap_emulate_ad_bits(pmap))
275                         mask = EPT_PG_READ;
276                 else
277                         mask = EPT_PG_A;
278                 break;
279         default:
280                 panic("pmap_accessed_bit: invalid pm_type %d", pmap->pm_type);
281         }
282
283         return (mask);
284 }
285
286 static __inline pt_entry_t
287 pmap_modified_bit(pmap_t pmap)
288 {
289         pt_entry_t mask;
290
291         switch (pmap->pm_type) {
292         case PT_X86:
293         case PT_RVI:
294                 mask = X86_PG_M;
295                 break;
296         case PT_EPT:
297                 if (pmap_emulate_ad_bits(pmap))
298                         mask = EPT_PG_WRITE;
299                 else
300                         mask = EPT_PG_M;
301                 break;
302         default:
303                 panic("pmap_modified_bit: invalid pm_type %d", pmap->pm_type);
304         }
305
306         return (mask);
307 }
308
309 static __inline pt_entry_t
310 pmap_pku_mask_bit(pmap_t pmap)
311 {
312
313         return (pmap->pm_type == PT_X86 ? X86_PG_PKU_MASK : 0);
314 }
315
316 static __inline boolean_t
317 safe_to_clear_referenced(pmap_t pmap, pt_entry_t pte)
318 {
319
320         if (!pmap_emulate_ad_bits(pmap))
321                 return (TRUE);
322
323         KASSERT(pmap->pm_type == PT_EPT, ("invalid pm_type %d", pmap->pm_type));
324
325         /*
326          * XWR = 010 or 110 will cause an unconditional EPT misconfiguration
327          * so we don't let the referenced (aka EPT_PG_READ) bit to be cleared
328          * if the EPT_PG_WRITE bit is set.
329          */
330         if ((pte & EPT_PG_WRITE) != 0)
331                 return (FALSE);
332
333         /*
334          * XWR = 100 is allowed only if the PMAP_SUPPORTS_EXEC_ONLY is set.
335          */
336         if ((pte & EPT_PG_EXECUTE) == 0 ||
337             ((pmap->pm_flags & PMAP_SUPPORTS_EXEC_ONLY) != 0))
338                 return (TRUE);
339         else
340                 return (FALSE);
341 }
342
343 #if !defined(DIAGNOSTIC)
344 #ifdef __GNUC_GNU_INLINE__
345 #define PMAP_INLINE     __attribute__((__gnu_inline__)) inline
346 #else
347 #define PMAP_INLINE     extern inline
348 #endif
349 #else
350 #define PMAP_INLINE
351 #endif
352
353 #ifdef PV_STATS
354 #define PV_STAT(x)      do { x ; } while (0)
355 #else
356 #define PV_STAT(x)      do { } while (0)
357 #endif
358
359 #undef pa_index
360 #ifdef NUMA
361 #define pa_index(pa)    ({                                      \
362         KASSERT((pa) <= vm_phys_segs[vm_phys_nsegs - 1].end,    \
363             ("address %lx beyond the last segment", (pa)));     \
364         (pa) >> PDRSHIFT;                                       \
365 })
366 #define pa_to_pmdp(pa)  (&pv_table[pa_index(pa)])
367 #define pa_to_pvh(pa)   (&(pa_to_pmdp(pa)->pv_page))
368 #define PHYS_TO_PV_LIST_LOCK(pa)        ({                      \
369         struct rwlock *_lock;                                   \
370         if (__predict_false((pa) > pmap_last_pa))               \
371                 _lock = &pv_dummy_large.pv_lock;                \
372         else                                                    \
373                 _lock = &(pa_to_pmdp(pa)->pv_lock);             \
374         _lock;                                                  \
375 })
376 #else
377 #define pa_index(pa)    ((pa) >> PDRSHIFT)
378 #define pa_to_pvh(pa)   (&pv_table[pa_index(pa)])
379
380 #define NPV_LIST_LOCKS  MAXCPU
381
382 #define PHYS_TO_PV_LIST_LOCK(pa)        \
383                         (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS])
384 #endif
385
386 #define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa)  do {    \
387         struct rwlock **_lockp = (lockp);               \
388         struct rwlock *_new_lock;                       \
389                                                         \
390         _new_lock = PHYS_TO_PV_LIST_LOCK(pa);           \
391         if (_new_lock != *_lockp) {                     \
392                 if (*_lockp != NULL)                    \
393                         rw_wunlock(*_lockp);            \
394                 *_lockp = _new_lock;                    \
395                 rw_wlock(*_lockp);                      \
396         }                                               \
397 } while (0)
398
399 #define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m)        \
400                         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
401
402 #define RELEASE_PV_LIST_LOCK(lockp)             do {    \
403         struct rwlock **_lockp = (lockp);               \
404                                                         \
405         if (*_lockp != NULL) {                          \
406                 rw_wunlock(*_lockp);                    \
407                 *_lockp = NULL;                         \
408         }                                               \
409 } while (0)
410
411 #define VM_PAGE_TO_PV_LIST_LOCK(m)      \
412                         PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
413
414 /*
415  * Statically allocate kernel pmap memory.  However, memory for
416  * pm_pcids is obtained after the dynamic allocator is operational.
417  * Initialize it with a non-canonical pointer to catch early accesses
418  * regardless of the active mapping.
419  */
420 struct pmap kernel_pmap_store = {
421         .pm_pcidp = (void *)0xdeadbeefdeadbeef,
422 };
423
424 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
425 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
426
427 int nkpt;
428 SYSCTL_INT(_machdep, OID_AUTO, nkpt, CTLFLAG_RD, &nkpt, 0,
429     "Number of kernel page table pages allocated on bootup");
430
431 static int ndmpdp;
432 vm_paddr_t dmaplimit;
433 vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
434 pt_entry_t pg_nx;
435
436 static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
437     "VM/pmap parameters");
438
439 static int pg_ps_enabled = 1;
440 SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
441     &pg_ps_enabled, 0, "Are large page mappings enabled?");
442
443 int __read_frequently la57 = 0;
444 SYSCTL_INT(_vm_pmap, OID_AUTO, la57, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
445     &la57, 0,
446     "5-level paging for host is enabled");
447
448 static bool
449 pmap_is_la57(pmap_t pmap)
450 {
451         if (pmap->pm_type == PT_X86)
452                 return (la57);
453         return (false);         /* XXXKIB handle EPT */
454 }
455
456 #define PAT_INDEX_SIZE  8
457 static int pat_index[PAT_INDEX_SIZE];   /* cache mode to PAT index conversion */
458
459 static u_int64_t        KPTphys;        /* phys addr of kernel level 1 */
460 static u_int64_t        KPDphys;        /* phys addr of kernel level 2 */
461 static u_int64_t        KPDPphys;       /* phys addr of kernel level 3 */
462 u_int64_t               KPML4phys;      /* phys addr of kernel level 4 */
463 u_int64_t               KPML5phys;      /* phys addr of kernel level 5,
464                                            if supported */
465
466 #ifdef KASAN
467 static uint64_t         KASANPDPphys;
468 #endif
469 #ifdef KMSAN
470 static uint64_t         KMSANSHADPDPphys;
471 static uint64_t         KMSANORIGPDPphys;
472
473 /*
474  * To support systems with large amounts of memory, it is necessary to extend
475  * the maximum size of the direct map.  This could eat into the space reserved
476  * for the shadow map.
477  */
478 _Static_assert(DMPML4I + NDMPML4E <= KMSANSHADPML4I, "direct map overflow");
479 #endif
480
481 static pml4_entry_t     *kernel_pml4;
482 static u_int64_t        DMPDphys;       /* phys addr of direct mapped level 2 */
483 static u_int64_t        DMPDPphys;      /* phys addr of direct mapped level 3 */
484 static int              ndmpdpphys;     /* number of DMPDPphys pages */
485
486 vm_paddr_t              kernphys;       /* phys addr of start of bootstrap data */
487 vm_paddr_t              KERNend;        /* and the end */
488
489 /*
490  * pmap_mapdev support pre initialization (i.e. console)
491  */
492 #define PMAP_PREINIT_MAPPING_COUNT      8
493 static struct pmap_preinit_mapping {
494         vm_paddr_t      pa;
495         vm_offset_t     va;
496         vm_size_t       sz;
497         int             mode;
498 } pmap_preinit_mapping[PMAP_PREINIT_MAPPING_COUNT];
499 static int pmap_initialized;
500
501 /*
502  * Data for the pv entry allocation mechanism.
503  * Updates to pv_invl_gen are protected by the pv list lock but reads are not.
504  */
505 #ifdef NUMA
506 static __inline int
507 pc_to_domain(struct pv_chunk *pc)
508 {
509
510         return (vm_phys_domain(DMAP_TO_PHYS((vm_offset_t)pc)));
511 }
512 #else
513 static __inline int
514 pc_to_domain(struct pv_chunk *pc __unused)
515 {
516
517         return (0);
518 }
519 #endif
520
521 struct pv_chunks_list {
522         struct mtx pvc_lock;
523         TAILQ_HEAD(pch, pv_chunk) pvc_list;
524         int active_reclaims;
525 } __aligned(CACHE_LINE_SIZE);
526
527 struct pv_chunks_list __exclusive_cache_line pv_chunks[PMAP_MEMDOM];
528
529 #ifdef  NUMA
530 struct pmap_large_md_page {
531         struct rwlock   pv_lock;
532         struct md_page  pv_page;
533         u_long pv_invl_gen;
534 };
535 __exclusive_cache_line static struct pmap_large_md_page pv_dummy_large;
536 #define pv_dummy pv_dummy_large.pv_page
537 __read_mostly static struct pmap_large_md_page *pv_table;
538 __read_mostly vm_paddr_t pmap_last_pa;
539 #else
540 static struct rwlock __exclusive_cache_line pv_list_locks[NPV_LIST_LOCKS];
541 static u_long pv_invl_gen[NPV_LIST_LOCKS];
542 static struct md_page *pv_table;
543 static struct md_page pv_dummy;
544 #endif
545
546 /*
547  * All those kernel PT submaps that BSD is so fond of
548  */
549 pt_entry_t *CMAP1 = NULL;
550 caddr_t CADDR1 = 0;
551 static vm_offset_t qframe = 0;
552 static struct mtx qframe_mtx;
553
554 static int pmap_flags = PMAP_PDE_SUPERPAGE;     /* flags for x86 pmaps */
555
556 static vmem_t *large_vmem;
557 static u_int lm_ents;
558 #define PMAP_ADDRESS_IN_LARGEMAP(va)    ((va) >= LARGEMAP_MIN_ADDRESS && \
559         (va) < LARGEMAP_MIN_ADDRESS + NBPML4 * (u_long)lm_ents)
560
561 int pmap_pcid_enabled = 1;
562 SYSCTL_INT(_vm_pmap, OID_AUTO, pcid_enabled, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
563     &pmap_pcid_enabled, 0, "Is TLB Context ID enabled ?");
564 int invpcid_works = 0;
565 SYSCTL_INT(_vm_pmap, OID_AUTO, invpcid_works, CTLFLAG_RD, &invpcid_works, 0,
566     "Is the invpcid instruction available ?");
567 int pmap_pcid_invlpg_workaround = 0;
568 SYSCTL_INT(_vm_pmap, OID_AUTO, pcid_invlpg_workaround,
569     CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
570     &pmap_pcid_invlpg_workaround, 0,
571     "Enable small core PCID/INVLPG workaround");
572 int pmap_pcid_invlpg_workaround_uena = 1;
573
574 int __read_frequently pti = 0;
575 SYSCTL_INT(_vm_pmap, OID_AUTO, pti, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
576     &pti, 0,
577     "Page Table Isolation enabled");
578 static vm_object_t pti_obj;
579 static pml4_entry_t *pti_pml4;
580 static vm_pindex_t pti_pg_idx;
581 static bool pti_finalized;
582
583 struct pmap_pkru_range {
584         struct rs_el    pkru_rs_el;
585         u_int           pkru_keyidx;
586         int             pkru_flags;
587 };
588
589 static uma_zone_t pmap_pkru_ranges_zone;
590 static bool pmap_pkru_same(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
591 static pt_entry_t pmap_pkru_get(pmap_t pmap, vm_offset_t va);
592 static void pmap_pkru_on_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
593 static void *pkru_dup_range(void *ctx, void *data);
594 static void pkru_free_range(void *ctx, void *node);
595 static int pmap_pkru_copy(pmap_t dst_pmap, pmap_t src_pmap);
596 static int pmap_pkru_deassign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
597 static void pmap_pkru_deassign_all(pmap_t pmap);
598
599 static COUNTER_U64_DEFINE_EARLY(pcid_save_cnt);
600 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pcid_save_cnt, CTLFLAG_RD,
601     &pcid_save_cnt, "Count of saved TLB context on switch");
602
603 static LIST_HEAD(, pmap_invl_gen) pmap_invl_gen_tracker =
604     LIST_HEAD_INITIALIZER(&pmap_invl_gen_tracker);
605 static struct mtx invl_gen_mtx;
606 /* Fake lock object to satisfy turnstiles interface. */
607 static struct lock_object invl_gen_ts = {
608         .lo_name = "invlts",
609 };
610 static struct pmap_invl_gen pmap_invl_gen_head = {
611         .gen = 1,
612         .next = NULL,
613 };
614 static u_long pmap_invl_gen = 1;
615 static int pmap_invl_waiters;
616 static struct callout pmap_invl_callout;
617 static bool pmap_invl_callout_inited;
618
619 #define PMAP_ASSERT_NOT_IN_DI() \
620     KASSERT(pmap_not_in_di(), ("DI already started"))
621
622 static bool
623 pmap_di_locked(void)
624 {
625         int tun;
626
627         if ((cpu_feature2 & CPUID2_CX16) == 0)
628                 return (true);
629         tun = 0;
630         TUNABLE_INT_FETCH("vm.pmap.di_locked", &tun);
631         return (tun != 0);
632 }
633
634 static int
635 sysctl_pmap_di_locked(SYSCTL_HANDLER_ARGS)
636 {
637         int locked;
638
639         locked = pmap_di_locked();
640         return (sysctl_handle_int(oidp, &locked, 0, req));
641 }
642 SYSCTL_PROC(_vm_pmap, OID_AUTO, di_locked, CTLTYPE_INT | CTLFLAG_RDTUN |
643     CTLFLAG_MPSAFE, 0, 0, sysctl_pmap_di_locked, "",
644     "Locked delayed invalidation");
645
646 static bool pmap_not_in_di_l(void);
647 static bool pmap_not_in_di_u(void);
648 DEFINE_IFUNC(, bool, pmap_not_in_di, (void))
649 {
650
651         return (pmap_di_locked() ? pmap_not_in_di_l : pmap_not_in_di_u);
652 }
653
654 static bool
655 pmap_not_in_di_l(void)
656 {
657         struct pmap_invl_gen *invl_gen;
658
659         invl_gen = &curthread->td_md.md_invl_gen;
660         return (invl_gen->gen == 0);
661 }
662
663 static void
664 pmap_thread_init_invl_gen_l(struct thread *td)
665 {
666         struct pmap_invl_gen *invl_gen;
667
668         invl_gen = &td->td_md.md_invl_gen;
669         invl_gen->gen = 0;
670 }
671
672 static void
673 pmap_delayed_invl_wait_block(u_long *m_gen, u_long *invl_gen)
674 {
675         struct turnstile *ts;
676
677         ts = turnstile_trywait(&invl_gen_ts);
678         if (*m_gen > atomic_load_long(invl_gen))
679                 turnstile_wait(ts, NULL, TS_SHARED_QUEUE);
680         else
681                 turnstile_cancel(ts);
682 }
683
684 static void
685 pmap_delayed_invl_finish_unblock(u_long new_gen)
686 {
687         struct turnstile *ts;
688
689         turnstile_chain_lock(&invl_gen_ts);
690         ts = turnstile_lookup(&invl_gen_ts);
691         if (new_gen != 0)
692                 pmap_invl_gen = new_gen;
693         if (ts != NULL) {
694                 turnstile_broadcast(ts, TS_SHARED_QUEUE);
695                 turnstile_unpend(ts);
696         }
697         turnstile_chain_unlock(&invl_gen_ts);
698 }
699
700 /*
701  * Start a new Delayed Invalidation (DI) block of code, executed by
702  * the current thread.  Within a DI block, the current thread may
703  * destroy both the page table and PV list entries for a mapping and
704  * then release the corresponding PV list lock before ensuring that
705  * the mapping is flushed from the TLBs of any processors with the
706  * pmap active.
707  */
708 static void
709 pmap_delayed_invl_start_l(void)
710 {
711         struct pmap_invl_gen *invl_gen;
712         u_long currgen;
713
714         invl_gen = &curthread->td_md.md_invl_gen;
715         PMAP_ASSERT_NOT_IN_DI();
716         mtx_lock(&invl_gen_mtx);
717         if (LIST_EMPTY(&pmap_invl_gen_tracker))
718                 currgen = pmap_invl_gen;
719         else
720                 currgen = LIST_FIRST(&pmap_invl_gen_tracker)->gen;
721         invl_gen->gen = currgen + 1;
722         LIST_INSERT_HEAD(&pmap_invl_gen_tracker, invl_gen, link);
723         mtx_unlock(&invl_gen_mtx);
724 }
725
726 /*
727  * Finish the DI block, previously started by the current thread.  All
728  * required TLB flushes for the pages marked by
729  * pmap_delayed_invl_page() must be finished before this function is
730  * called.
731  *
732  * This function works by bumping the global DI generation number to
733  * the generation number of the current thread's DI, unless there is a
734  * pending DI that started earlier.  In the latter case, bumping the
735  * global DI generation number would incorrectly signal that the
736  * earlier DI had finished.  Instead, this function bumps the earlier
737  * DI's generation number to match the generation number of the
738  * current thread's DI.
739  */
740 static void
741 pmap_delayed_invl_finish_l(void)
742 {
743         struct pmap_invl_gen *invl_gen, *next;
744
745         invl_gen = &curthread->td_md.md_invl_gen;
746         KASSERT(invl_gen->gen != 0, ("missed invl_start"));
747         mtx_lock(&invl_gen_mtx);
748         next = LIST_NEXT(invl_gen, link);
749         if (next == NULL)
750                 pmap_delayed_invl_finish_unblock(invl_gen->gen);
751         else
752                 next->gen = invl_gen->gen;
753         LIST_REMOVE(invl_gen, link);
754         mtx_unlock(&invl_gen_mtx);
755         invl_gen->gen = 0;
756 }
757
758 static bool
759 pmap_not_in_di_u(void)
760 {
761         struct pmap_invl_gen *invl_gen;
762
763         invl_gen = &curthread->td_md.md_invl_gen;
764         return (((uintptr_t)invl_gen->next & PMAP_INVL_GEN_NEXT_INVALID) != 0);
765 }
766
767 static void
768 pmap_thread_init_invl_gen_u(struct thread *td)
769 {
770         struct pmap_invl_gen *invl_gen;
771
772         invl_gen = &td->td_md.md_invl_gen;
773         invl_gen->gen = 0;
774         invl_gen->next = (void *)PMAP_INVL_GEN_NEXT_INVALID;
775 }
776
777 static bool
778 pmap_di_load_invl(struct pmap_invl_gen *ptr, struct pmap_invl_gen *out)
779 {
780         uint64_t new_high, new_low, old_high, old_low;
781         char res;
782
783         old_low = new_low = 0;
784         old_high = new_high = (uintptr_t)0;
785
786         __asm volatile("lock;cmpxchg16b\t%1"
787             : "=@cce" (res), "+m" (*ptr), "+a" (old_low), "+d" (old_high)
788             : "b"(new_low), "c" (new_high)
789             : "memory", "cc");
790         if (res == 0) {
791                 if ((old_high & PMAP_INVL_GEN_NEXT_INVALID) != 0)
792                         return (false);
793                 out->gen = old_low;
794                 out->next = (void *)old_high;
795         } else {
796                 out->gen = new_low;
797                 out->next = (void *)new_high;
798         }
799         return (true);
800 }
801
802 static bool
803 pmap_di_store_invl(struct pmap_invl_gen *ptr, struct pmap_invl_gen *old_val,
804     struct pmap_invl_gen *new_val)
805 {
806         uint64_t new_high, new_low, old_high, old_low;
807         char res;
808
809         new_low = new_val->gen;
810         new_high = (uintptr_t)new_val->next;
811         old_low = old_val->gen;
812         old_high = (uintptr_t)old_val->next;
813
814         __asm volatile("lock;cmpxchg16b\t%1"
815             : "=@cce" (res), "+m" (*ptr), "+a" (old_low), "+d" (old_high)
816             : "b"(new_low), "c" (new_high)
817             : "memory", "cc");
818         return (res);
819 }
820
821 static COUNTER_U64_DEFINE_EARLY(pv_page_count);
822 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_page_count, CTLFLAG_RD,
823     &pv_page_count, "Current number of allocated pv pages");
824
825 static COUNTER_U64_DEFINE_EARLY(user_pt_page_count);
826 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, user_pt_page_count, CTLFLAG_RD,
827     &user_pt_page_count,
828     "Current number of allocated page table pages for userspace");
829
830 static COUNTER_U64_DEFINE_EARLY(kernel_pt_page_count);
831 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, kernel_pt_page_count, CTLFLAG_RD,
832     &kernel_pt_page_count,
833     "Current number of allocated page table pages for the kernel");
834
835 #ifdef PV_STATS
836
837 static COUNTER_U64_DEFINE_EARLY(invl_start_restart);
838 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_start_restart,
839     CTLFLAG_RD, &invl_start_restart,
840     "Number of delayed TLB invalidation request restarts");
841
842 static COUNTER_U64_DEFINE_EARLY(invl_finish_restart);
843 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_finish_restart, CTLFLAG_RD,
844     &invl_finish_restart,
845     "Number of delayed TLB invalidation completion restarts");
846
847 static int invl_max_qlen;
848 SYSCTL_INT(_vm_pmap, OID_AUTO, invl_max_qlen, CTLFLAG_RD,
849     &invl_max_qlen, 0,
850     "Maximum delayed TLB invalidation request queue length");
851 #endif
852
853 #define di_delay        locks_delay
854
855 static void
856 pmap_delayed_invl_start_u(void)
857 {
858         struct pmap_invl_gen *invl_gen, *p, prev, new_prev;
859         struct thread *td;
860         struct lock_delay_arg lda;
861         uintptr_t prevl;
862         u_char pri;
863 #ifdef PV_STATS
864         int i, ii;
865 #endif
866
867         td = curthread;
868         invl_gen = &td->td_md.md_invl_gen;
869         PMAP_ASSERT_NOT_IN_DI();
870         lock_delay_arg_init(&lda, &di_delay);
871         invl_gen->saved_pri = 0;
872         pri = td->td_base_pri;
873         if (pri > PVM) {
874                 thread_lock(td);
875                 pri = td->td_base_pri;
876                 if (pri > PVM) {
877                         invl_gen->saved_pri = pri;
878                         sched_prio(td, PVM);
879                 }
880                 thread_unlock(td);
881         }
882 again:
883         PV_STAT(i = 0);
884         for (p = &pmap_invl_gen_head;; p = prev.next) {
885                 PV_STAT(i++);
886                 prevl = (uintptr_t)atomic_load_ptr(&p->next);
887                 if ((prevl & PMAP_INVL_GEN_NEXT_INVALID) != 0) {
888                         PV_STAT(counter_u64_add(invl_start_restart, 1));
889                         lock_delay(&lda);
890                         goto again;
891                 }
892                 if (prevl == 0)
893                         break;
894                 prev.next = (void *)prevl;
895         }
896 #ifdef PV_STATS
897         if ((ii = invl_max_qlen) < i)
898                 atomic_cmpset_int(&invl_max_qlen, ii, i);
899 #endif
900
901         if (!pmap_di_load_invl(p, &prev) || prev.next != NULL) {
902                 PV_STAT(counter_u64_add(invl_start_restart, 1));
903                 lock_delay(&lda);
904                 goto again;
905         }
906
907         new_prev.gen = prev.gen;
908         new_prev.next = invl_gen;
909         invl_gen->gen = prev.gen + 1;
910
911         /* Formal fence between store to invl->gen and updating *p. */
912         atomic_thread_fence_rel();
913
914         /*
915          * After inserting an invl_gen element with invalid bit set,
916          * this thread blocks any other thread trying to enter the
917          * delayed invalidation block.  Do not allow to remove us from
918          * the CPU, because it causes starvation for other threads.
919          */
920         critical_enter();
921
922         /*
923          * ABA for *p is not possible there, since p->gen can only
924          * increase.  So if the *p thread finished its di, then
925          * started a new one and got inserted into the list at the
926          * same place, its gen will appear greater than the previously
927          * read gen.
928          */
929         if (!pmap_di_store_invl(p, &prev, &new_prev)) {
930                 critical_exit();
931                 PV_STAT(counter_u64_add(invl_start_restart, 1));
932                 lock_delay(&lda);
933                 goto again;
934         }
935
936         /*
937          * There we clear PMAP_INVL_GEN_NEXT_INVALID in
938          * invl_gen->next, allowing other threads to iterate past us.
939          * pmap_di_store_invl() provides fence between the generation
940          * write and the update of next.
941          */
942         invl_gen->next = NULL;
943         critical_exit();
944 }
945
946 static bool
947 pmap_delayed_invl_finish_u_crit(struct pmap_invl_gen *invl_gen,
948     struct pmap_invl_gen *p)
949 {
950         struct pmap_invl_gen prev, new_prev;
951         u_long mygen;
952
953         /*
954          * Load invl_gen->gen after setting invl_gen->next
955          * PMAP_INVL_GEN_NEXT_INVALID.  This prevents larger
956          * generations to propagate to our invl_gen->gen.  Lock prefix
957          * in atomic_set_ptr() worked as seq_cst fence.
958          */
959         mygen = atomic_load_long(&invl_gen->gen);
960
961         if (!pmap_di_load_invl(p, &prev) || prev.next != invl_gen)
962                 return (false);
963
964         KASSERT(prev.gen < mygen,
965             ("invalid di gen sequence %lu %lu", prev.gen, mygen));
966         new_prev.gen = mygen;
967         new_prev.next = (void *)((uintptr_t)invl_gen->next &
968             ~PMAP_INVL_GEN_NEXT_INVALID);
969
970         /* Formal fence between load of prev and storing update to it. */
971         atomic_thread_fence_rel();
972
973         return (pmap_di_store_invl(p, &prev, &new_prev));
974 }
975
976 static void
977 pmap_delayed_invl_finish_u(void)
978 {
979         struct pmap_invl_gen *invl_gen, *p;
980         struct thread *td;
981         struct lock_delay_arg lda;
982         uintptr_t prevl;
983
984         td = curthread;
985         invl_gen = &td->td_md.md_invl_gen;
986         KASSERT(invl_gen->gen != 0, ("missed invl_start: gen 0"));
987         KASSERT(((uintptr_t)invl_gen->next & PMAP_INVL_GEN_NEXT_INVALID) == 0,
988             ("missed invl_start: INVALID"));
989         lock_delay_arg_init(&lda, &di_delay);
990
991 again:
992         for (p = &pmap_invl_gen_head; p != NULL; p = (void *)prevl) {
993                 prevl = (uintptr_t)atomic_load_ptr(&p->next);
994                 if ((prevl & PMAP_INVL_GEN_NEXT_INVALID) != 0) {
995                         PV_STAT(counter_u64_add(invl_finish_restart, 1));
996                         lock_delay(&lda);
997                         goto again;
998                 }
999                 if ((void *)prevl == invl_gen)
1000                         break;
1001         }
1002
1003         /*
1004          * It is legitimate to not find ourself on the list if a
1005          * thread before us finished its DI and started it again.
1006          */
1007         if (__predict_false(p == NULL)) {
1008                 PV_STAT(counter_u64_add(invl_finish_restart, 1));
1009                 lock_delay(&lda);
1010                 goto again;
1011         }
1012
1013         critical_enter();
1014         atomic_set_ptr((uintptr_t *)&invl_gen->next,
1015             PMAP_INVL_GEN_NEXT_INVALID);
1016         if (!pmap_delayed_invl_finish_u_crit(invl_gen, p)) {
1017                 atomic_clear_ptr((uintptr_t *)&invl_gen->next,
1018                     PMAP_INVL_GEN_NEXT_INVALID);
1019                 critical_exit();
1020                 PV_STAT(counter_u64_add(invl_finish_restart, 1));
1021                 lock_delay(&lda);
1022                 goto again;
1023         }
1024         critical_exit();
1025         if (atomic_load_int(&pmap_invl_waiters) > 0)
1026                 pmap_delayed_invl_finish_unblock(0);
1027         if (invl_gen->saved_pri != 0) {
1028                 thread_lock(td);
1029                 sched_prio(td, invl_gen->saved_pri);
1030                 thread_unlock(td);
1031         }
1032 }
1033
1034 #ifdef DDB
1035 DB_SHOW_COMMAND(di_queue, pmap_di_queue)
1036 {
1037         struct pmap_invl_gen *p, *pn;
1038         struct thread *td;
1039         uintptr_t nextl;
1040         bool first;
1041
1042         for (p = &pmap_invl_gen_head, first = true; p != NULL; p = pn,
1043             first = false) {
1044                 nextl = (uintptr_t)atomic_load_ptr(&p->next);
1045                 pn = (void *)(nextl & ~PMAP_INVL_GEN_NEXT_INVALID);
1046                 td = first ? NULL : __containerof(p, struct thread,
1047                     td_md.md_invl_gen);
1048                 db_printf("gen %lu inv %d td %p tid %d\n", p->gen,
1049                     (nextl & PMAP_INVL_GEN_NEXT_INVALID) != 0, td,
1050                     td != NULL ? td->td_tid : -1);
1051         }
1052 }
1053 #endif
1054
1055 #ifdef PV_STATS
1056 static COUNTER_U64_DEFINE_EARLY(invl_wait);
1057 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_wait,
1058     CTLFLAG_RD, &invl_wait,
1059     "Number of times DI invalidation blocked pmap_remove_all/write");
1060
1061 static COUNTER_U64_DEFINE_EARLY(invl_wait_slow);
1062 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_wait_slow, CTLFLAG_RD,
1063      &invl_wait_slow, "Number of slow invalidation waits for lockless DI");
1064
1065 #endif
1066
1067 #ifdef NUMA
1068 static u_long *
1069 pmap_delayed_invl_genp(vm_page_t m)
1070 {
1071         vm_paddr_t pa;
1072         u_long *gen;
1073
1074         pa = VM_PAGE_TO_PHYS(m);
1075         if (__predict_false((pa) > pmap_last_pa))
1076                 gen = &pv_dummy_large.pv_invl_gen;
1077         else
1078                 gen = &(pa_to_pmdp(pa)->pv_invl_gen);
1079
1080         return (gen);
1081 }
1082 #else
1083 static u_long *
1084 pmap_delayed_invl_genp(vm_page_t m)
1085 {
1086
1087         return (&pv_invl_gen[pa_index(VM_PAGE_TO_PHYS(m)) % NPV_LIST_LOCKS]);
1088 }
1089 #endif
1090
1091 static void
1092 pmap_delayed_invl_callout_func(void *arg __unused)
1093 {
1094
1095         if (atomic_load_int(&pmap_invl_waiters) == 0)
1096                 return;
1097         pmap_delayed_invl_finish_unblock(0);
1098 }
1099
1100 static void
1101 pmap_delayed_invl_callout_init(void *arg __unused)
1102 {
1103
1104         if (pmap_di_locked())
1105                 return;
1106         callout_init(&pmap_invl_callout, 1);
1107         pmap_invl_callout_inited = true;
1108 }
1109 SYSINIT(pmap_di_callout, SI_SUB_CPU + 1, SI_ORDER_ANY,
1110     pmap_delayed_invl_callout_init, NULL);
1111
1112 /*
1113  * Ensure that all currently executing DI blocks, that need to flush
1114  * TLB for the given page m, actually flushed the TLB at the time the
1115  * function returned.  If the page m has an empty PV list and we call
1116  * pmap_delayed_invl_wait(), upon its return we know that no CPU has a
1117  * valid mapping for the page m in either its page table or TLB.
1118  *
1119  * This function works by blocking until the global DI generation
1120  * number catches up with the generation number associated with the
1121  * given page m and its PV list.  Since this function's callers
1122  * typically own an object lock and sometimes own a page lock, it
1123  * cannot sleep.  Instead, it blocks on a turnstile to relinquish the
1124  * processor.
1125  */
1126 static void
1127 pmap_delayed_invl_wait_l(vm_page_t m)
1128 {
1129         u_long *m_gen;
1130 #ifdef PV_STATS
1131         bool accounted = false;
1132 #endif
1133
1134         m_gen = pmap_delayed_invl_genp(m);
1135         while (*m_gen > pmap_invl_gen) {
1136 #ifdef PV_STATS
1137                 if (!accounted) {
1138                         counter_u64_add(invl_wait, 1);
1139                         accounted = true;
1140                 }
1141 #endif
1142                 pmap_delayed_invl_wait_block(m_gen, &pmap_invl_gen);
1143         }
1144 }
1145
1146 static void
1147 pmap_delayed_invl_wait_u(vm_page_t m)
1148 {
1149         u_long *m_gen;
1150         struct lock_delay_arg lda;
1151         bool fast;
1152
1153         fast = true;
1154         m_gen = pmap_delayed_invl_genp(m);
1155         lock_delay_arg_init(&lda, &di_delay);
1156         while (*m_gen > atomic_load_long(&pmap_invl_gen_head.gen)) {
1157                 if (fast || !pmap_invl_callout_inited) {
1158                         PV_STAT(counter_u64_add(invl_wait, 1));
1159                         lock_delay(&lda);
1160                         fast = false;
1161                 } else {
1162                         /*
1163                          * The page's invalidation generation number
1164                          * is still below the current thread's number.
1165                          * Prepare to block so that we do not waste
1166                          * CPU cycles or worse, suffer livelock.
1167                          *
1168                          * Since it is impossible to block without
1169                          * racing with pmap_delayed_invl_finish_u(),
1170                          * prepare for the race by incrementing
1171                          * pmap_invl_waiters and arming a 1-tick
1172                          * callout which will unblock us if we lose
1173                          * the race.
1174                          */
1175                         atomic_add_int(&pmap_invl_waiters, 1);
1176
1177                         /*
1178                          * Re-check the current thread's invalidation
1179                          * generation after incrementing
1180                          * pmap_invl_waiters, so that there is no race
1181                          * with pmap_delayed_invl_finish_u() setting
1182                          * the page generation and checking
1183                          * pmap_invl_waiters.  The only race allowed
1184                          * is for a missed unblock, which is handled
1185                          * by the callout.
1186                          */
1187                         if (*m_gen >
1188                             atomic_load_long(&pmap_invl_gen_head.gen)) {
1189                                 callout_reset(&pmap_invl_callout, 1,
1190                                     pmap_delayed_invl_callout_func, NULL);
1191                                 PV_STAT(counter_u64_add(invl_wait_slow, 1));
1192                                 pmap_delayed_invl_wait_block(m_gen,
1193                                     &pmap_invl_gen_head.gen);
1194                         }
1195                         atomic_add_int(&pmap_invl_waiters, -1);
1196                 }
1197         }
1198 }
1199
1200 DEFINE_IFUNC(, void, pmap_thread_init_invl_gen, (struct thread *))
1201 {
1202
1203         return (pmap_di_locked() ? pmap_thread_init_invl_gen_l :
1204             pmap_thread_init_invl_gen_u);
1205 }
1206
1207 DEFINE_IFUNC(static, void, pmap_delayed_invl_start, (void))
1208 {
1209
1210         return (pmap_di_locked() ? pmap_delayed_invl_start_l :
1211             pmap_delayed_invl_start_u);
1212 }
1213
1214 DEFINE_IFUNC(static, void, pmap_delayed_invl_finish, (void))
1215 {
1216
1217         return (pmap_di_locked() ? pmap_delayed_invl_finish_l :
1218             pmap_delayed_invl_finish_u);
1219 }
1220
1221 DEFINE_IFUNC(static, void, pmap_delayed_invl_wait, (vm_page_t))
1222 {
1223
1224         return (pmap_di_locked() ? pmap_delayed_invl_wait_l :
1225             pmap_delayed_invl_wait_u);
1226 }
1227
1228 /*
1229  * Mark the page m's PV list as participating in the current thread's
1230  * DI block.  Any threads concurrently using m's PV list to remove or
1231  * restrict all mappings to m will wait for the current thread's DI
1232  * block to complete before proceeding.
1233  *
1234  * The function works by setting the DI generation number for m's PV
1235  * list to at least the DI generation number of the current thread.
1236  * This forces a caller of pmap_delayed_invl_wait() to block until
1237  * current thread calls pmap_delayed_invl_finish().
1238  */
1239 static void
1240 pmap_delayed_invl_page(vm_page_t m)
1241 {
1242         u_long gen, *m_gen;
1243
1244         rw_assert(VM_PAGE_TO_PV_LIST_LOCK(m), RA_WLOCKED);
1245         gen = curthread->td_md.md_invl_gen.gen;
1246         if (gen == 0)
1247                 return;
1248         m_gen = pmap_delayed_invl_genp(m);
1249         if (*m_gen < gen)
1250                 *m_gen = gen;
1251 }
1252
1253 /*
1254  * Crashdump maps.
1255  */
1256 static caddr_t crashdumpmap;
1257
1258 /*
1259  * Internal flags for pmap_enter()'s helper functions.
1260  */
1261 #define PMAP_ENTER_NORECLAIM    0x1000000       /* Don't reclaim PV entries. */
1262 #define PMAP_ENTER_NOREPLACE    0x2000000       /* Don't replace mappings. */
1263
1264 /*
1265  * Internal flags for pmap_mapdev_internal() and
1266  * pmap_change_props_locked().
1267  */
1268 #define MAPDEV_FLUSHCACHE       0x00000001      /* Flush cache after mapping. */
1269 #define MAPDEV_SETATTR          0x00000002      /* Modify existing attrs. */
1270 #define MAPDEV_ASSERTVALID      0x00000004      /* Assert mapping validity. */
1271
1272 TAILQ_HEAD(pv_chunklist, pv_chunk);
1273
1274 static void     free_pv_chunk(struct pv_chunk *pc);
1275 static void     free_pv_chunk_batch(struct pv_chunklist *batch);
1276 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
1277 static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp);
1278 static int      popcnt_pc_map_pq(uint64_t *map);
1279 static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp);
1280 static void     reserve_pv_entries(pmap_t pmap, int needed,
1281                     struct rwlock **lockp);
1282 static void     pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
1283                     struct rwlock **lockp);
1284 static bool     pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, pd_entry_t pde,
1285                     u_int flags, struct rwlock **lockp);
1286 #if VM_NRESERVLEVEL > 0
1287 static void     pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
1288                     struct rwlock **lockp);
1289 #endif
1290 static void     pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
1291 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
1292                     vm_offset_t va);
1293
1294 static void     pmap_abort_ptp(pmap_t pmap, vm_offset_t va, vm_page_t mpte);
1295 static int pmap_change_props_locked(vm_offset_t va, vm_size_t size,
1296     vm_prot_t prot, int mode, int flags);
1297 static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va);
1298 static boolean_t pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde,
1299     vm_offset_t va, struct rwlock **lockp);
1300 static boolean_t pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe,
1301     vm_offset_t va);
1302 static int      pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m,
1303                     vm_prot_t prot, struct rwlock **lockp);
1304 static int      pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde,
1305                     u_int flags, vm_page_t m, struct rwlock **lockp);
1306 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
1307     vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp);
1308 static void pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte);
1309 static int pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte, bool promoted,
1310     bool allpte_PG_A_set);
1311 static void pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva,
1312     vm_offset_t eva);
1313 static void pmap_invalidate_cache_range_all(vm_offset_t sva,
1314     vm_offset_t eva);
1315 static void pmap_invalidate_pde_page(pmap_t pmap, vm_offset_t va,
1316                     pd_entry_t pde);
1317 static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
1318 static vm_page_t pmap_large_map_getptp_unlocked(void);
1319 static vm_paddr_t pmap_large_map_kextract(vm_offset_t va);
1320 #if VM_NRESERVLEVEL > 0
1321 static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
1322     vm_page_t mpte, struct rwlock **lockp);
1323 #endif
1324 static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva,
1325     vm_prot_t prot);
1326 static void pmap_pte_props(pt_entry_t *pte, u_long bits, u_long mask);
1327 static void pmap_pti_add_kva_locked(vm_offset_t sva, vm_offset_t eva,
1328     bool exec);
1329 static pdp_entry_t *pmap_pti_pdpe(vm_offset_t va);
1330 static pd_entry_t *pmap_pti_pde(vm_offset_t va);
1331 static void pmap_pti_wire_pte(void *pte);
1332 static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
1333     struct spglist *free, struct rwlock **lockp);
1334 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva,
1335     pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp);
1336 static vm_page_t pmap_remove_pt_page(pmap_t pmap, vm_offset_t va);
1337 static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
1338     struct spglist *free);
1339 static bool     pmap_remove_ptes(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
1340                     pd_entry_t *pde, struct spglist *free,
1341                     struct rwlock **lockp);
1342 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
1343     vm_page_t m, struct rwlock **lockp);
1344 static void pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
1345     pd_entry_t newpde);
1346 static void pmap_update_pde_invalidate(pmap_t, vm_offset_t va, pd_entry_t pde);
1347
1348 static pd_entry_t *pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp,
1349                 struct rwlock **lockp);
1350 static vm_page_t pmap_allocpte_alloc(pmap_t pmap, vm_pindex_t ptepindex,
1351                 struct rwlock **lockp, vm_offset_t va);
1352 static vm_page_t pmap_allocpte_nosleep(pmap_t pmap, vm_pindex_t ptepindex,
1353                 struct rwlock **lockp, vm_offset_t va);
1354 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va,
1355                 struct rwlock **lockp);
1356
1357 static void _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m,
1358     struct spglist *free);
1359 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t, struct spglist *);
1360
1361 static vm_page_t pmap_alloc_pt_page(pmap_t, vm_pindex_t, int);
1362 static void pmap_free_pt_page(pmap_t, vm_page_t, bool);
1363
1364 /********************/
1365 /* Inline functions */
1366 /********************/
1367
1368 /*
1369  * Return a non-clipped indexes for a given VA, which are page table
1370  * pages indexes at the corresponding level.
1371  */
1372 static __inline vm_pindex_t
1373 pmap_pde_pindex(vm_offset_t va)
1374 {
1375         return (va >> PDRSHIFT);
1376 }
1377
1378 static __inline vm_pindex_t
1379 pmap_pdpe_pindex(vm_offset_t va)
1380 {
1381         return (NUPDE + (va >> PDPSHIFT));
1382 }
1383
1384 static __inline vm_pindex_t
1385 pmap_pml4e_pindex(vm_offset_t va)
1386 {
1387         return (NUPDE + NUPDPE + (va >> PML4SHIFT));
1388 }
1389
1390 static __inline vm_pindex_t
1391 pmap_pml5e_pindex(vm_offset_t va)
1392 {
1393         return (NUPDE + NUPDPE + NUPML4E + (va >> PML5SHIFT));
1394 }
1395
1396 static __inline pml4_entry_t *
1397 pmap_pml5e(pmap_t pmap, vm_offset_t va)
1398 {
1399
1400         MPASS(pmap_is_la57(pmap));
1401         return (&pmap->pm_pmltop[pmap_pml5e_index(va)]);
1402 }
1403
1404 static __inline pml4_entry_t *
1405 pmap_pml5e_u(pmap_t pmap, vm_offset_t va)
1406 {
1407
1408         MPASS(pmap_is_la57(pmap));
1409         return (&pmap->pm_pmltopu[pmap_pml5e_index(va)]);
1410 }
1411
1412 static __inline pml4_entry_t *
1413 pmap_pml5e_to_pml4e(pml5_entry_t *pml5e, vm_offset_t va)
1414 {
1415         pml4_entry_t *pml4e;
1416
1417         /* XXX MPASS(pmap_is_la57(pmap); */
1418         pml4e = (pml4_entry_t *)PHYS_TO_DMAP(*pml5e & PG_FRAME);
1419         return (&pml4e[pmap_pml4e_index(va)]);
1420 }
1421
1422 /* Return a pointer to the PML4 slot that corresponds to a VA */
1423 static __inline pml4_entry_t *
1424 pmap_pml4e(pmap_t pmap, vm_offset_t va)
1425 {
1426         pml5_entry_t *pml5e;
1427         pml4_entry_t *pml4e;
1428         pt_entry_t PG_V;
1429
1430         if (pmap_is_la57(pmap)) {
1431                 pml5e = pmap_pml5e(pmap, va);
1432                 PG_V = pmap_valid_bit(pmap);
1433                 if ((*pml5e & PG_V) == 0)
1434                         return (NULL);
1435                 pml4e = (pml4_entry_t *)PHYS_TO_DMAP(*pml5e & PG_FRAME);
1436         } else {
1437                 pml4e = pmap->pm_pmltop;
1438         }
1439         return (&pml4e[pmap_pml4e_index(va)]);
1440 }
1441
1442 static __inline pml4_entry_t *
1443 pmap_pml4e_u(pmap_t pmap, vm_offset_t va)
1444 {
1445         MPASS(!pmap_is_la57(pmap));
1446         return (&pmap->pm_pmltopu[pmap_pml4e_index(va)]);
1447 }
1448
1449 /* Return a pointer to the PDP slot that corresponds to a VA */
1450 static __inline pdp_entry_t *
1451 pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va)
1452 {
1453         pdp_entry_t *pdpe;
1454
1455         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME);
1456         return (&pdpe[pmap_pdpe_index(va)]);
1457 }
1458
1459 /* Return a pointer to the PDP slot that corresponds to a VA */
1460 static __inline pdp_entry_t *
1461 pmap_pdpe(pmap_t pmap, vm_offset_t va)
1462 {
1463         pml4_entry_t *pml4e;
1464         pt_entry_t PG_V;
1465
1466         PG_V = pmap_valid_bit(pmap);
1467         pml4e = pmap_pml4e(pmap, va);
1468         if (pml4e == NULL || (*pml4e & PG_V) == 0)
1469                 return (NULL);
1470         return (pmap_pml4e_to_pdpe(pml4e, va));
1471 }
1472
1473 /* Return a pointer to the PD slot that corresponds to a VA */
1474 static __inline pd_entry_t *
1475 pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
1476 {
1477         pd_entry_t *pde;
1478
1479         KASSERT((*pdpe & PG_PS) == 0,
1480             ("%s: pdpe %#lx is a leaf", __func__, *pdpe));
1481         pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
1482         return (&pde[pmap_pde_index(va)]);
1483 }
1484
1485 /* Return a pointer to the PD slot that corresponds to a VA */
1486 static __inline pd_entry_t *
1487 pmap_pde(pmap_t pmap, vm_offset_t va)
1488 {
1489         pdp_entry_t *pdpe;
1490         pt_entry_t PG_V;
1491
1492         PG_V = pmap_valid_bit(pmap);
1493         pdpe = pmap_pdpe(pmap, va);
1494         if (pdpe == NULL || (*pdpe & PG_V) == 0)
1495                 return (NULL);
1496         KASSERT((*pdpe & PG_PS) == 0,
1497             ("pmap_pde for 1G page, pmap %p va %#lx", pmap, va));
1498         return (pmap_pdpe_to_pde(pdpe, va));
1499 }
1500
1501 /* Return a pointer to the PT slot that corresponds to a VA */
1502 static __inline pt_entry_t *
1503 pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
1504 {
1505         pt_entry_t *pte;
1506
1507         KASSERT((*pde & PG_PS) == 0,
1508             ("%s: pde %#lx is a leaf", __func__, *pde));
1509         pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
1510         return (&pte[pmap_pte_index(va)]);
1511 }
1512
1513 /* Return a pointer to the PT slot that corresponds to a VA */
1514 static __inline pt_entry_t *
1515 pmap_pte(pmap_t pmap, vm_offset_t va)
1516 {
1517         pd_entry_t *pde;
1518         pt_entry_t PG_V;
1519
1520         PG_V = pmap_valid_bit(pmap);
1521         pde = pmap_pde(pmap, va);
1522         if (pde == NULL || (*pde & PG_V) == 0)
1523                 return (NULL);
1524         if ((*pde & PG_PS) != 0)        /* compat with i386 pmap_pte() */
1525                 return ((pt_entry_t *)pde);
1526         return (pmap_pde_to_pte(pde, va));
1527 }
1528
1529 static __inline void
1530 pmap_resident_count_adj(pmap_t pmap, int count)
1531 {
1532
1533         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1534         KASSERT(pmap->pm_stats.resident_count + count >= 0,
1535             ("pmap %p resident count underflow %ld %d", pmap,
1536             pmap->pm_stats.resident_count, count));
1537         pmap->pm_stats.resident_count += count;
1538 }
1539
1540 static __inline void
1541 pmap_pt_page_count_pinit(pmap_t pmap, int count)
1542 {
1543         KASSERT(pmap->pm_stats.resident_count + count >= 0,
1544             ("pmap %p resident count underflow %ld %d", pmap,
1545             pmap->pm_stats.resident_count, count));
1546         pmap->pm_stats.resident_count += count;
1547 }
1548
1549 static __inline void
1550 pmap_pt_page_count_adj(pmap_t pmap, int count)
1551 {
1552         if (pmap == kernel_pmap)
1553                 counter_u64_add(kernel_pt_page_count, count);
1554         else {
1555                 if (pmap != NULL)
1556                         pmap_resident_count_adj(pmap, count);
1557                 counter_u64_add(user_pt_page_count, count);
1558         }
1559 }
1560
1561 pt_entry_t vtoptem __read_mostly = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT +
1562     NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1) << 3;
1563 vm_offset_t PTmap __read_mostly = (vm_offset_t)P4Tmap;
1564
1565 PMAP_INLINE pt_entry_t *
1566 vtopte(vm_offset_t va)
1567 {
1568         KASSERT(va >= VM_MAXUSER_ADDRESS, ("vtopte on a uva/gpa 0x%0lx", va));
1569
1570         return ((pt_entry_t *)(PTmap + ((va >> (PAGE_SHIFT - 3)) & vtoptem)));
1571 }
1572
1573 pd_entry_t vtopdem __read_mostly = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT +
1574     NPML4EPGSHIFT)) - 1) << 3;
1575 vm_offset_t PDmap __read_mostly = (vm_offset_t)P4Dmap;
1576
1577 static __inline pd_entry_t *
1578 vtopde(vm_offset_t va)
1579 {
1580         KASSERT(va >= VM_MAXUSER_ADDRESS, ("vtopde on a uva/gpa 0x%0lx", va));
1581
1582         return ((pt_entry_t *)(PDmap + ((va >> (PDRSHIFT - 3)) & vtopdem)));
1583 }
1584
1585 static u_int64_t
1586 allocpages(vm_paddr_t *firstaddr, int n)
1587 {
1588         u_int64_t ret;
1589
1590         ret = *firstaddr;
1591         bzero((void *)ret, n * PAGE_SIZE);
1592         *firstaddr += n * PAGE_SIZE;
1593         return (ret);
1594 }
1595
1596 CTASSERT(powerof2(NDMPML4E));
1597
1598 /* number of kernel PDP slots */
1599 #define NKPDPE(ptpgs)           howmany(ptpgs, NPDEPG)
1600
1601 static void
1602 nkpt_init(vm_paddr_t addr)
1603 {
1604         int pt_pages;
1605
1606 #ifdef NKPT
1607         pt_pages = NKPT;
1608 #else
1609         pt_pages = howmany(addr - kernphys, NBPDR) + 1; /* +1 for 2M hole @0 */
1610         pt_pages += NKPDPE(pt_pages);
1611
1612         /*
1613          * Add some slop beyond the bare minimum required for bootstrapping
1614          * the kernel.
1615          *
1616          * This is quite important when allocating KVA for kernel modules.
1617          * The modules are required to be linked in the negative 2GB of
1618          * the address space.  If we run out of KVA in this region then
1619          * pmap_growkernel() will need to allocate page table pages to map
1620          * the entire 512GB of KVA space which is an unnecessary tax on
1621          * physical memory.
1622          *
1623          * Secondly, device memory mapped as part of setting up the low-
1624          * level console(s) is taken from KVA, starting at virtual_avail.
1625          * This is because cninit() is called after pmap_bootstrap() but
1626          * before vm_init() and pmap_init(). 20MB for a frame buffer is
1627          * not uncommon.
1628          */
1629         pt_pages += 32;         /* 64MB additional slop. */
1630 #endif
1631         nkpt = pt_pages;
1632 }
1633
1634 /*
1635  * Returns the proper write/execute permission for a physical page that is
1636  * part of the initial boot allocations.
1637  *
1638  * If the page has kernel text, it is marked as read-only. If the page has
1639  * kernel read-only data, it is marked as read-only/not-executable. If the
1640  * page has only read-write data, it is marked as read-write/not-executable.
1641  * If the page is below/above the kernel range, it is marked as read-write.
1642  *
1643  * This function operates on 2M pages, since we map the kernel space that
1644  * way.
1645  */
1646 static inline pt_entry_t
1647 bootaddr_rwx(vm_paddr_t pa)
1648 {
1649         /*
1650          * The kernel is loaded at a 2MB-aligned address, and memory below that
1651          * need not be executable.  The .bss section is padded to a 2MB
1652          * boundary, so memory following the kernel need not be executable
1653          * either.  Preloaded kernel modules have their mapping permissions
1654          * fixed up by the linker.
1655          */
1656         if (pa < trunc_2mpage(kernphys + btext - KERNSTART) ||
1657             pa >= trunc_2mpage(kernphys + _end - KERNSTART))
1658                 return (X86_PG_RW | pg_nx);
1659
1660         /*
1661          * The linker should ensure that the read-only and read-write
1662          * portions don't share the same 2M page, so this shouldn't
1663          * impact read-only data. However, in any case, any page with
1664          * read-write data needs to be read-write.
1665          */
1666         if (pa >= trunc_2mpage(kernphys + brwsection - KERNSTART))
1667                 return (X86_PG_RW | pg_nx);
1668
1669         /*
1670          * Mark any 2M page containing kernel text as read-only. Mark
1671          * other pages with read-only data as read-only and not executable.
1672          * (It is likely a small portion of the read-only data section will
1673          * be marked as read-only, but executable. This should be acceptable
1674          * since the read-only protection will keep the data from changing.)
1675          * Note that fixups to the .text section will still work until we
1676          * set CR0.WP.
1677          */
1678         if (pa < round_2mpage(kernphys + etext - KERNSTART))
1679                 return (0);
1680         return (pg_nx);
1681 }
1682
1683 static void
1684 create_pagetables(vm_paddr_t *firstaddr)
1685 {
1686         pd_entry_t *pd_p;
1687         pdp_entry_t *pdp_p;
1688         pml4_entry_t *p4_p;
1689         uint64_t DMPDkernphys;
1690         vm_paddr_t pax;
1691 #ifdef KASAN
1692         pt_entry_t *pt_p;
1693         uint64_t KASANPDphys, KASANPTphys, KASANphys;
1694         vm_offset_t kasankernbase;
1695         int kasankpdpi, kasankpdi, nkasanpte;
1696 #endif
1697         int i, j, ndm1g, nkpdpe, nkdmpde;
1698
1699         TSENTER();
1700         /* Allocate page table pages for the direct map */
1701         ndmpdp = howmany(ptoa(Maxmem), NBPDP);
1702         if (ndmpdp < 4)         /* Minimum 4GB of dirmap */
1703                 ndmpdp = 4;
1704         ndmpdpphys = howmany(ndmpdp, NPDPEPG);
1705         if (ndmpdpphys > NDMPML4E) {
1706                 /*
1707                  * Each NDMPML4E allows 512 GB, so limit to that,
1708                  * and then readjust ndmpdp and ndmpdpphys.
1709                  */
1710                 printf("NDMPML4E limits system to %d GB\n", NDMPML4E * 512);
1711                 Maxmem = atop(NDMPML4E * NBPML4);
1712                 ndmpdpphys = NDMPML4E;
1713                 ndmpdp = NDMPML4E * NPDEPG;
1714         }
1715         DMPDPphys = allocpages(firstaddr, ndmpdpphys);
1716         ndm1g = 0;
1717         if ((amd_feature & AMDID_PAGE1GB) != 0) {
1718                 /*
1719                  * Calculate the number of 1G pages that will fully fit in
1720                  * Maxmem.
1721                  */
1722                 ndm1g = ptoa(Maxmem) >> PDPSHIFT;
1723
1724                 /*
1725                  * Allocate 2M pages for the kernel. These will be used in
1726                  * place of the one or more 1G pages from ndm1g that maps
1727                  * kernel memory into DMAP.
1728                  */
1729                 nkdmpde = howmany((vm_offset_t)brwsection - KERNSTART +
1730                     kernphys - rounddown2(kernphys, NBPDP), NBPDP);
1731                 DMPDkernphys = allocpages(firstaddr, nkdmpde);
1732         }
1733         if (ndm1g < ndmpdp)
1734                 DMPDphys = allocpages(firstaddr, ndmpdp - ndm1g);
1735         dmaplimit = (vm_paddr_t)ndmpdp << PDPSHIFT;
1736
1737         /* Allocate pages. */
1738         KPML4phys = allocpages(firstaddr, 1);
1739         KPDPphys = allocpages(firstaddr, NKPML4E);
1740 #ifdef KASAN
1741         KASANPDPphys = allocpages(firstaddr, NKASANPML4E);
1742         KASANPDphys = allocpages(firstaddr, 1);
1743 #endif
1744 #ifdef KMSAN
1745         /*
1746          * The KMSAN shadow maps are initially left unpopulated, since there is
1747          * no need to shadow memory above KERNBASE.
1748          */
1749         KMSANSHADPDPphys = allocpages(firstaddr, NKMSANSHADPML4E);
1750         KMSANORIGPDPphys = allocpages(firstaddr, NKMSANORIGPML4E);
1751 #endif
1752
1753         /*
1754          * Allocate the initial number of kernel page table pages required to
1755          * bootstrap.  We defer this until after all memory-size dependent
1756          * allocations are done (e.g. direct map), so that we don't have to
1757          * build in too much slop in our estimate.
1758          *
1759          * Note that when NKPML4E > 1, we have an empty page underneath
1760          * all but the KPML4I'th one, so we need NKPML4E-1 extra (zeroed)
1761          * pages.  (pmap_enter requires a PD page to exist for each KPML4E.)
1762          */
1763         nkpt_init(*firstaddr);
1764         nkpdpe = NKPDPE(nkpt);
1765
1766         KPTphys = allocpages(firstaddr, nkpt);
1767         KPDphys = allocpages(firstaddr, nkpdpe);
1768
1769 #ifdef KASAN
1770         nkasanpte = howmany(nkpt, KASAN_SHADOW_SCALE);
1771         KASANPTphys = allocpages(firstaddr, nkasanpte);
1772         KASANphys = allocpages(firstaddr, nkasanpte * NPTEPG);
1773 #endif
1774
1775         /*
1776          * Connect the zero-filled PT pages to their PD entries.  This
1777          * implicitly maps the PT pages at their correct locations within
1778          * the PTmap.
1779          */
1780         pd_p = (pd_entry_t *)KPDphys;
1781         for (i = 0; i < nkpt; i++)
1782                 pd_p[i] = (KPTphys + ptoa(i)) | X86_PG_RW | X86_PG_V;
1783
1784         /*
1785          * Map from start of the kernel in physical memory (staging
1786          * area) to the end of loader preallocated memory using 2MB
1787          * pages.  This replaces some of the PD entries created above.
1788          * For compatibility, identity map 2M at the start.
1789          */
1790         pd_p[0] = X86_PG_V | PG_PS | pg_g | X86_PG_M | X86_PG_A |
1791             X86_PG_RW | pg_nx;
1792         for (i = 1, pax = kernphys; pax < KERNend; i++, pax += NBPDR) {
1793                 /* Preset PG_M and PG_A because demotion expects it. */
1794                 pd_p[i] = pax | X86_PG_V | PG_PS | pg_g | X86_PG_M |
1795                     X86_PG_A | bootaddr_rwx(pax);
1796         }
1797
1798         /*
1799          * Because we map the physical blocks in 2M pages, adjust firstaddr
1800          * to record the physical blocks we've actually mapped into kernel
1801          * virtual address space.
1802          */
1803         if (*firstaddr < round_2mpage(KERNend))
1804                 *firstaddr = round_2mpage(KERNend);
1805
1806         /* And connect up the PD to the PDP (leaving room for L4 pages) */
1807         pdp_p = (pdp_entry_t *)(KPDPphys + ptoa(KPML4I - KPML4BASE));
1808         for (i = 0; i < nkpdpe; i++)
1809                 pdp_p[i + KPDPI] = (KPDphys + ptoa(i)) | X86_PG_RW | X86_PG_V;
1810
1811 #ifdef KASAN
1812         kasankernbase = kasan_md_addr_to_shad(KERNBASE);
1813         kasankpdpi = pmap_pdpe_index(kasankernbase);
1814         kasankpdi = pmap_pde_index(kasankernbase);
1815
1816         pdp_p = (pdp_entry_t *)KASANPDPphys;
1817         pdp_p[kasankpdpi] = (KASANPDphys | X86_PG_RW | X86_PG_V | pg_nx);
1818
1819         pd_p = (pd_entry_t *)KASANPDphys;
1820         for (i = 0; i < nkasanpte; i++)
1821                 pd_p[i + kasankpdi] = (KASANPTphys + ptoa(i)) | X86_PG_RW |
1822                     X86_PG_V | pg_nx;
1823
1824         pt_p = (pt_entry_t *)KASANPTphys;
1825         for (i = 0; i < nkasanpte * NPTEPG; i++)
1826                 pt_p[i] = (KASANphys + ptoa(i)) | X86_PG_RW | X86_PG_V |
1827                     X86_PG_M | X86_PG_A | pg_nx;
1828 #endif
1829
1830         /*
1831          * Now, set up the direct map region using 2MB and/or 1GB pages.  If
1832          * the end of physical memory is not aligned to a 1GB page boundary,
1833          * then the residual physical memory is mapped with 2MB pages.  Later,
1834          * if pmap_mapdev{_attr}() uses the direct map for non-write-back
1835          * memory, pmap_change_attr() will demote any 2MB or 1GB page mappings
1836          * that are partially used. 
1837          */
1838         pd_p = (pd_entry_t *)DMPDphys;
1839         for (i = NPDEPG * ndm1g, j = 0; i < NPDEPG * ndmpdp; i++, j++) {
1840                 pd_p[j] = (vm_paddr_t)i << PDRSHIFT;
1841                 /* Preset PG_M and PG_A because demotion expects it. */
1842                 pd_p[j] |= X86_PG_RW | X86_PG_V | PG_PS | pg_g |
1843                     X86_PG_M | X86_PG_A | pg_nx;
1844         }
1845         pdp_p = (pdp_entry_t *)DMPDPphys;
1846         for (i = 0; i < ndm1g; i++) {
1847                 pdp_p[i] = (vm_paddr_t)i << PDPSHIFT;
1848                 /* Preset PG_M and PG_A because demotion expects it. */
1849                 pdp_p[i] |= X86_PG_RW | X86_PG_V | PG_PS | pg_g |
1850                     X86_PG_M | X86_PG_A | pg_nx;
1851         }
1852         for (j = 0; i < ndmpdp; i++, j++) {
1853                 pdp_p[i] = DMPDphys + ptoa(j);
1854                 pdp_p[i] |= X86_PG_RW | X86_PG_V | pg_nx;
1855         }
1856
1857         /*
1858          * Instead of using a 1G page for the memory containing the kernel,
1859          * use 2M pages with read-only and no-execute permissions.  (If using 1G
1860          * pages, this will partially overwrite the PDPEs above.)
1861          */
1862         if (ndm1g > 0) {
1863                 pd_p = (pd_entry_t *)DMPDkernphys;
1864                 for (i = 0, pax = rounddown2(kernphys, NBPDP);
1865                     i < NPDEPG * nkdmpde; i++, pax += NBPDR) {
1866                         pd_p[i] = pax | X86_PG_V | PG_PS | pg_g | X86_PG_M |
1867                             X86_PG_A | pg_nx | bootaddr_rwx(pax);
1868                 }
1869                 j = rounddown2(kernphys, NBPDP) >> PDPSHIFT;
1870                 for (i = 0; i < nkdmpde; i++) {
1871                         pdp_p[i + j] = (DMPDkernphys + ptoa(i)) |
1872                             X86_PG_RW | X86_PG_V | pg_nx;
1873                 }
1874         }
1875
1876         /* And recursively map PML4 to itself in order to get PTmap */
1877         p4_p = (pml4_entry_t *)KPML4phys;
1878         p4_p[PML4PML4I] = KPML4phys;
1879         p4_p[PML4PML4I] |= X86_PG_RW | X86_PG_V | pg_nx;
1880
1881 #ifdef KASAN
1882         /* Connect the KASAN shadow map slots up to the PML4. */
1883         for (i = 0; i < NKASANPML4E; i++) {
1884                 p4_p[KASANPML4I + i] = KASANPDPphys + ptoa(i);
1885                 p4_p[KASANPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1886         }
1887 #endif
1888
1889 #ifdef KMSAN
1890         /* Connect the KMSAN shadow map slots up to the PML4. */
1891         for (i = 0; i < NKMSANSHADPML4E; i++) {
1892                 p4_p[KMSANSHADPML4I + i] = KMSANSHADPDPphys + ptoa(i);
1893                 p4_p[KMSANSHADPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1894         }
1895
1896         /* Connect the KMSAN origin map slots up to the PML4. */
1897         for (i = 0; i < NKMSANORIGPML4E; i++) {
1898                 p4_p[KMSANORIGPML4I + i] = KMSANORIGPDPphys + ptoa(i);
1899                 p4_p[KMSANORIGPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1900         }
1901 #endif
1902
1903         /* Connect the Direct Map slots up to the PML4. */
1904         for (i = 0; i < ndmpdpphys; i++) {
1905                 p4_p[DMPML4I + i] = DMPDPphys + ptoa(i);
1906                 p4_p[DMPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1907         }
1908
1909         /* Connect the KVA slots up to the PML4 */
1910         for (i = 0; i < NKPML4E; i++) {
1911                 p4_p[KPML4BASE + i] = KPDPphys + ptoa(i);
1912                 p4_p[KPML4BASE + i] |= X86_PG_RW | X86_PG_V;
1913         }
1914
1915         kernel_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(KPML4phys);
1916         TSEXIT();
1917 }
1918
1919 /*
1920  *      Bootstrap the system enough to run with virtual memory.
1921  *
1922  *      On amd64 this is called after mapping has already been enabled
1923  *      and just syncs the pmap module with what has already been done.
1924  *      [We can't call it easily with mapping off since the kernel is not
1925  *      mapped with PA == VA, hence we would have to relocate every address
1926  *      from the linked base (virtual) address "KERNBASE" to the actual
1927  *      (physical) address starting relative to 0]
1928  */
1929 void
1930 pmap_bootstrap(vm_paddr_t *firstaddr)
1931 {
1932         vm_offset_t va;
1933         pt_entry_t *pte, *pcpu_pte;
1934         struct region_descriptor r_gdt;
1935         uint64_t cr4, pcpu0_phys;
1936         u_long res;
1937         int i;
1938
1939         TSENTER();
1940         KERNend = *firstaddr;
1941         res = atop(KERNend - (vm_paddr_t)kernphys);
1942
1943         if (!pti)
1944                 pg_g = X86_PG_G;
1945
1946         /*
1947          * Create an initial set of page tables to run the kernel in.
1948          */
1949         create_pagetables(firstaddr);
1950
1951         pcpu0_phys = allocpages(firstaddr, 1);
1952
1953         /*
1954          * Add a physical memory segment (vm_phys_seg) corresponding to the
1955          * preallocated kernel page table pages so that vm_page structures
1956          * representing these pages will be created.  The vm_page structures
1957          * are required for promotion of the corresponding kernel virtual
1958          * addresses to superpage mappings.
1959          */
1960         vm_phys_early_add_seg(KPTphys, KPTphys + ptoa(nkpt));
1961
1962         /*
1963          * Account for the virtual addresses mapped by create_pagetables().
1964          */
1965         virtual_avail = (vm_offset_t)KERNSTART + round_2mpage(KERNend -
1966             (vm_paddr_t)kernphys);
1967         virtual_end = VM_MAX_KERNEL_ADDRESS;
1968
1969         /*
1970          * Enable PG_G global pages, then switch to the kernel page
1971          * table from the bootstrap page table.  After the switch, it
1972          * is possible to enable SMEP and SMAP since PG_U bits are
1973          * correct now.
1974          */
1975         cr4 = rcr4();
1976         cr4 |= CR4_PGE;
1977         load_cr4(cr4);
1978         load_cr3(KPML4phys);
1979         if (cpu_stdext_feature & CPUID_STDEXT_SMEP)
1980                 cr4 |= CR4_SMEP;
1981         if (cpu_stdext_feature & CPUID_STDEXT_SMAP)
1982                 cr4 |= CR4_SMAP;
1983         load_cr4(cr4);
1984
1985         /*
1986          * Initialize the kernel pmap (which is statically allocated).
1987          * Count bootstrap data as being resident in case any of this data is
1988          * later unmapped (using pmap_remove()) and freed.
1989          */
1990         PMAP_LOCK_INIT(kernel_pmap);
1991         kernel_pmap->pm_pmltop = kernel_pml4;
1992         kernel_pmap->pm_cr3 = KPML4phys;
1993         kernel_pmap->pm_ucr3 = PMAP_NO_CR3;
1994         TAILQ_INIT(&kernel_pmap->pm_pvchunk);
1995         kernel_pmap->pm_stats.resident_count = res;
1996         kernel_pmap->pm_flags = pmap_flags;
1997
1998         /*
1999          * The kernel pmap is always active on all CPUs.  Once CPUs are
2000          * enumerated, the mask will be set equal to all_cpus.
2001          */
2002         CPU_FILL(&kernel_pmap->pm_active);
2003
2004         /*
2005          * Initialize the TLB invalidations generation number lock.
2006          */
2007         mtx_init(&invl_gen_mtx, "invlgn", NULL, MTX_DEF);
2008
2009         /*
2010          * Reserve some special page table entries/VA space for temporary
2011          * mapping of pages.
2012          */
2013 #define SYSMAP(c, p, v, n)      \
2014         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
2015
2016         va = virtual_avail;
2017         pte = vtopte(va);
2018
2019         /*
2020          * Crashdump maps.  The first page is reused as CMAP1 for the
2021          * memory test.
2022          */
2023         SYSMAP(caddr_t, CMAP1, crashdumpmap, MAXDUMPPGS)
2024         CADDR1 = crashdumpmap;
2025
2026         SYSMAP(struct pcpu *, pcpu_pte, __pcpu, MAXCPU);
2027         virtual_avail = va;
2028
2029         /*
2030          * Map the BSP PCPU now, the rest of the PCPUs are mapped by
2031          * amd64_mp_alloc_pcpu()/start_all_aps() when we know the
2032          * number of CPUs and NUMA affinity.
2033          */
2034         pcpu_pte[0] = pcpu0_phys | X86_PG_V | X86_PG_RW | pg_g | pg_nx |
2035             X86_PG_M | X86_PG_A;
2036         for (i = 1; i < MAXCPU; i++)
2037                 pcpu_pte[i] = 0;
2038
2039         /*
2040          * Re-initialize PCPU area for BSP after switching.
2041          * Make hardware use gdt and common_tss from the new PCPU.
2042          */
2043         STAILQ_INIT(&cpuhead);
2044         wrmsr(MSR_GSBASE, (uint64_t)&__pcpu[0]);
2045         pcpu_init(&__pcpu[0], 0, sizeof(struct pcpu));
2046         amd64_bsp_pcpu_init1(&__pcpu[0]);
2047         amd64_bsp_ist_init(&__pcpu[0]);
2048         __pcpu[0].pc_common_tss.tss_iobase = sizeof(struct amd64tss) +
2049             IOPERM_BITMAP_SIZE;
2050         memcpy(__pcpu[0].pc_gdt, temp_bsp_pcpu.pc_gdt, NGDT *
2051             sizeof(struct user_segment_descriptor));
2052         gdt_segs[GPROC0_SEL].ssd_base = (uintptr_t)&__pcpu[0].pc_common_tss;
2053         ssdtosyssd(&gdt_segs[GPROC0_SEL],
2054             (struct system_segment_descriptor *)&__pcpu[0].pc_gdt[GPROC0_SEL]);
2055         r_gdt.rd_limit = NGDT * sizeof(struct user_segment_descriptor) - 1;
2056         r_gdt.rd_base = (long)__pcpu[0].pc_gdt;
2057         lgdt(&r_gdt);
2058         wrmsr(MSR_GSBASE, (uint64_t)&__pcpu[0]);
2059         ltr(GSEL(GPROC0_SEL, SEL_KPL));
2060         __pcpu[0].pc_dynamic = temp_bsp_pcpu.pc_dynamic;
2061         __pcpu[0].pc_acpi_id = temp_bsp_pcpu.pc_acpi_id;
2062
2063         /*
2064          * Initialize the PAT MSR.
2065          * pmap_init_pat() clears and sets CR4_PGE, which, as a
2066          * side-effect, invalidates stale PG_G TLB entries that might
2067          * have been created in our pre-boot environment.
2068          */
2069         pmap_init_pat();
2070
2071         /* Initialize TLB Context Id. */
2072         if (pmap_pcid_enabled) {
2073                 kernel_pmap->pm_pcidp = (void *)(uintptr_t)
2074                     offsetof(struct pcpu, pc_kpmap_store);
2075
2076                 PCPU_SET(kpmap_store.pm_pcid, PMAP_PCID_KERN);
2077                 PCPU_SET(kpmap_store.pm_gen, 1);
2078
2079                 /*
2080                  * PMAP_PCID_KERN + 1 is used for initialization of
2081                  * proc0 pmap.  The pmap' pcid state might be used by
2082                  * EFIRT entry before first context switch, so it
2083                  * needs to be valid.
2084                  */
2085                 PCPU_SET(pcid_next, PMAP_PCID_KERN + 2);
2086                 PCPU_SET(pcid_gen, 1);
2087
2088                 /*
2089                  * pcpu area for APs is zeroed during AP startup.
2090                  * pc_pcid_next and pc_pcid_gen are initialized by AP
2091                  * during pcpu setup.
2092                  */
2093                 load_cr4(rcr4() | CR4_PCIDE);
2094         }
2095         TSEXIT();
2096 }
2097
2098 /*
2099  * Setup the PAT MSR.
2100  */
2101 void
2102 pmap_init_pat(void)
2103 {
2104         uint64_t pat_msr;
2105         u_long cr0, cr4;
2106         int i;
2107
2108         /* Bail if this CPU doesn't implement PAT. */
2109         if ((cpu_feature & CPUID_PAT) == 0)
2110                 panic("no PAT??");
2111
2112         /* Set default PAT index table. */
2113         for (i = 0; i < PAT_INDEX_SIZE; i++)
2114                 pat_index[i] = -1;
2115         pat_index[PAT_WRITE_BACK] = 0;
2116         pat_index[PAT_WRITE_THROUGH] = 1;
2117         pat_index[PAT_UNCACHEABLE] = 3;
2118         pat_index[PAT_WRITE_COMBINING] = 6;
2119         pat_index[PAT_WRITE_PROTECTED] = 5;
2120         pat_index[PAT_UNCACHED] = 2;
2121
2122         /*
2123          * Initialize default PAT entries.
2124          * Leave the indices 0-3 at the default of WB, WT, UC-, and UC.
2125          * Program 5 and 6 as WP and WC.
2126          *
2127          * Leave 4 and 7 as WB and UC.  Note that a recursive page table
2128          * mapping for a 2M page uses a PAT value with the bit 3 set due
2129          * to its overload with PG_PS.
2130          */
2131         pat_msr = PAT_VALUE(0, PAT_WRITE_BACK) |
2132             PAT_VALUE(1, PAT_WRITE_THROUGH) |
2133             PAT_VALUE(2, PAT_UNCACHED) |
2134             PAT_VALUE(3, PAT_UNCACHEABLE) |
2135             PAT_VALUE(4, PAT_WRITE_BACK) |
2136             PAT_VALUE(5, PAT_WRITE_PROTECTED) |
2137             PAT_VALUE(6, PAT_WRITE_COMBINING) |
2138             PAT_VALUE(7, PAT_UNCACHEABLE);
2139
2140         /* Disable PGE. */
2141         cr4 = rcr4();
2142         load_cr4(cr4 & ~CR4_PGE);
2143
2144         /* Disable caches (CD = 1, NW = 0). */
2145         cr0 = rcr0();
2146         load_cr0((cr0 & ~CR0_NW) | CR0_CD);
2147
2148         /* Flushes caches and TLBs. */
2149         wbinvd();
2150         invltlb();
2151
2152         /* Update PAT and index table. */
2153         wrmsr(MSR_PAT, pat_msr);
2154
2155         /* Flush caches and TLBs again. */
2156         wbinvd();
2157         invltlb();
2158
2159         /* Restore caches and PGE. */
2160         load_cr0(cr0);
2161         load_cr4(cr4);
2162 }
2163
2164 vm_page_t
2165 pmap_page_alloc_below_4g(bool zeroed)
2166 {
2167         return (vm_page_alloc_noobj_contig((zeroed ? VM_ALLOC_ZERO : 0),
2168             1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT));
2169 }
2170
2171 extern const char la57_trampoline[], la57_trampoline_gdt_desc[],
2172     la57_trampoline_gdt[], la57_trampoline_end[];
2173
2174 static void
2175 pmap_bootstrap_la57(void *arg __unused)
2176 {
2177         char *v_code;
2178         pml5_entry_t *v_pml5;
2179         pml4_entry_t *v_pml4;
2180         pdp_entry_t *v_pdp;
2181         pd_entry_t *v_pd;
2182         pt_entry_t *v_pt;
2183         vm_page_t m_code, m_pml4, m_pdp, m_pd, m_pt, m_pml5;
2184         void (*la57_tramp)(uint64_t pml5);
2185         struct region_descriptor r_gdt;
2186
2187         if ((cpu_stdext_feature2 & CPUID_STDEXT2_LA57) == 0)
2188                 return;
2189         TUNABLE_INT_FETCH("vm.pmap.la57", &la57);
2190         if (!la57)
2191                 return;
2192
2193         r_gdt.rd_limit = NGDT * sizeof(struct user_segment_descriptor) - 1;
2194         r_gdt.rd_base = (long)__pcpu[0].pc_gdt;
2195
2196         m_code = pmap_page_alloc_below_4g(true);
2197         v_code = (char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_code));
2198         m_pml5 = pmap_page_alloc_below_4g(true);
2199         KPML5phys = VM_PAGE_TO_PHYS(m_pml5);
2200         v_pml5 = (pml5_entry_t *)PHYS_TO_DMAP(KPML5phys);
2201         m_pml4 = pmap_page_alloc_below_4g(true);
2202         v_pml4 = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pml4));
2203         m_pdp = pmap_page_alloc_below_4g(true);
2204         v_pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pdp));
2205         m_pd = pmap_page_alloc_below_4g(true);
2206         v_pd = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pd));
2207         m_pt = pmap_page_alloc_below_4g(true);
2208         v_pt = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pt));
2209
2210         /*
2211          * Map m_code 1:1, it appears below 4G in KVA due to physical
2212          * address being below 4G.  Since kernel KVA is in upper half,
2213          * the pml4e should be zero and free for temporary use.
2214          */
2215         kernel_pmap->pm_pmltop[pmap_pml4e_index(VM_PAGE_TO_PHYS(m_code))] =
2216             VM_PAGE_TO_PHYS(m_pdp) | X86_PG_V | X86_PG_RW | X86_PG_A |
2217             X86_PG_M;
2218         v_pdp[pmap_pdpe_index(VM_PAGE_TO_PHYS(m_code))] =
2219             VM_PAGE_TO_PHYS(m_pd) | X86_PG_V | X86_PG_RW | X86_PG_A |
2220             X86_PG_M;
2221         v_pd[pmap_pde_index(VM_PAGE_TO_PHYS(m_code))] =
2222             VM_PAGE_TO_PHYS(m_pt) | X86_PG_V | X86_PG_RW | X86_PG_A |
2223             X86_PG_M;
2224         v_pt[pmap_pte_index(VM_PAGE_TO_PHYS(m_code))] =
2225             VM_PAGE_TO_PHYS(m_code) | X86_PG_V | X86_PG_RW | X86_PG_A |
2226             X86_PG_M;
2227
2228         /*
2229          * Add pml5 entry at top of KVA pointing to existing pml4 table,
2230          * entering all existing kernel mappings into level 5 table.
2231          */
2232         v_pml5[pmap_pml5e_index(UPT_MAX_ADDRESS)] = KPML4phys | X86_PG_V |
2233             X86_PG_RW | X86_PG_A | X86_PG_M | pg_g;
2234
2235         /*
2236          * Add pml5 entry for 1:1 trampoline mapping after LA57 is turned on.
2237          */
2238         v_pml5[pmap_pml5e_index(VM_PAGE_TO_PHYS(m_code))] =
2239             VM_PAGE_TO_PHYS(m_pml4) | X86_PG_V | X86_PG_RW | X86_PG_A |
2240             X86_PG_M;
2241         v_pml4[pmap_pml4e_index(VM_PAGE_TO_PHYS(m_code))] =
2242             VM_PAGE_TO_PHYS(m_pdp) | X86_PG_V | X86_PG_RW | X86_PG_A |
2243             X86_PG_M;
2244
2245         /*
2246          * Copy and call the 48->57 trampoline, hope we return there, alive.
2247          */
2248         bcopy(la57_trampoline, v_code, la57_trampoline_end - la57_trampoline);
2249         *(u_long *)(v_code + 2 + (la57_trampoline_gdt_desc - la57_trampoline)) =
2250             la57_trampoline_gdt - la57_trampoline + VM_PAGE_TO_PHYS(m_code);
2251         la57_tramp = (void (*)(uint64_t))VM_PAGE_TO_PHYS(m_code);
2252         invlpg((vm_offset_t)la57_tramp);
2253         la57_tramp(KPML5phys);
2254
2255         /*
2256          * gdt was necessary reset, switch back to our gdt.
2257          */
2258         lgdt(&r_gdt);
2259         wrmsr(MSR_GSBASE, (uint64_t)&__pcpu[0]);
2260         load_ds(_udatasel);
2261         load_es(_udatasel);
2262         load_fs(_ufssel);
2263         ssdtosyssd(&gdt_segs[GPROC0_SEL],
2264             (struct system_segment_descriptor *)&__pcpu[0].pc_gdt[GPROC0_SEL]);
2265         ltr(GSEL(GPROC0_SEL, SEL_KPL));
2266
2267         /*
2268          * Now unmap the trampoline, and free the pages.
2269          * Clear pml5 entry used for 1:1 trampoline mapping.
2270          */
2271         pte_clear(&v_pml5[pmap_pml5e_index(VM_PAGE_TO_PHYS(m_code))]);
2272         invlpg((vm_offset_t)v_code);
2273         vm_page_free(m_code);
2274         vm_page_free(m_pdp);
2275         vm_page_free(m_pd);
2276         vm_page_free(m_pt);
2277
2278         /* 
2279          * Recursively map PML5 to itself in order to get PTmap and
2280          * PDmap.
2281          */
2282         v_pml5[PML5PML5I] = KPML5phys | X86_PG_RW | X86_PG_V | pg_nx;
2283
2284         vtoptem = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT + NPDPEPGSHIFT +
2285             NPML4EPGSHIFT + NPML5EPGSHIFT)) - 1) << 3;
2286         PTmap = (vm_offset_t)P5Tmap;
2287         vtopdem = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT +
2288             NPML4EPGSHIFT + NPML5EPGSHIFT)) - 1) << 3;
2289         PDmap = (vm_offset_t)P5Dmap;
2290
2291         kernel_pmap->pm_cr3 = KPML5phys;
2292         kernel_pmap->pm_pmltop = v_pml5;
2293         pmap_pt_page_count_adj(kernel_pmap, 1);
2294 }
2295 SYSINIT(la57, SI_SUB_KMEM, SI_ORDER_ANY, pmap_bootstrap_la57, NULL);
2296
2297 /*
2298  *      Initialize a vm_page's machine-dependent fields.
2299  */
2300 void
2301 pmap_page_init(vm_page_t m)
2302 {
2303
2304         TAILQ_INIT(&m->md.pv_list);
2305         m->md.pat_mode = PAT_WRITE_BACK;
2306 }
2307
2308 static int pmap_allow_2m_x_ept;
2309 SYSCTL_INT(_vm_pmap, OID_AUTO, allow_2m_x_ept, CTLFLAG_RWTUN | CTLFLAG_NOFETCH,
2310     &pmap_allow_2m_x_ept, 0,
2311     "Allow executable superpage mappings in EPT");
2312
2313 void
2314 pmap_allow_2m_x_ept_recalculate(void)
2315 {
2316         /*
2317          * SKL002, SKL012S.  Since the EPT format is only used by
2318          * Intel CPUs, the vendor check is merely a formality.
2319          */
2320         if (!(cpu_vendor_id != CPU_VENDOR_INTEL ||
2321             (cpu_ia32_arch_caps & IA32_ARCH_CAP_IF_PSCHANGE_MC_NO) != 0 ||
2322             (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
2323             (CPUID_TO_MODEL(cpu_id) == 0x26 ||  /* Atoms */
2324             CPUID_TO_MODEL(cpu_id) == 0x27 ||
2325             CPUID_TO_MODEL(cpu_id) == 0x35 ||
2326             CPUID_TO_MODEL(cpu_id) == 0x36 ||
2327             CPUID_TO_MODEL(cpu_id) == 0x37 ||
2328             CPUID_TO_MODEL(cpu_id) == 0x86 ||
2329             CPUID_TO_MODEL(cpu_id) == 0x1c ||
2330             CPUID_TO_MODEL(cpu_id) == 0x4a ||
2331             CPUID_TO_MODEL(cpu_id) == 0x4c ||
2332             CPUID_TO_MODEL(cpu_id) == 0x4d ||
2333             CPUID_TO_MODEL(cpu_id) == 0x5a ||
2334             CPUID_TO_MODEL(cpu_id) == 0x5c ||
2335             CPUID_TO_MODEL(cpu_id) == 0x5d ||
2336             CPUID_TO_MODEL(cpu_id) == 0x5f ||
2337             CPUID_TO_MODEL(cpu_id) == 0x6e ||
2338             CPUID_TO_MODEL(cpu_id) == 0x7a ||
2339             CPUID_TO_MODEL(cpu_id) == 0x57 ||   /* Knights */
2340             CPUID_TO_MODEL(cpu_id) == 0x85))))
2341                 pmap_allow_2m_x_ept = 1;
2342         TUNABLE_INT_FETCH("hw.allow_2m_x_ept", &pmap_allow_2m_x_ept);
2343 }
2344
2345 static bool
2346 pmap_allow_2m_x_page(pmap_t pmap, bool executable)
2347 {
2348
2349         return (pmap->pm_type != PT_EPT || !executable ||
2350             !pmap_allow_2m_x_ept);
2351 }
2352
2353 #ifdef NUMA
2354 static void
2355 pmap_init_pv_table(void)
2356 {
2357         struct pmap_large_md_page *pvd;
2358         vm_size_t s;
2359         long start, end, highest, pv_npg;
2360         int domain, i, j, pages;
2361
2362         /*
2363          * For correctness we depend on the size being evenly divisible into a
2364          * page. As a tradeoff between performance and total memory use, the
2365          * entry is 64 bytes (aka one cacheline) in size. Not being smaller
2366          * avoids false-sharing, but not being 128 bytes potentially allows for
2367          * avoidable traffic due to adjacent cacheline prefetcher.
2368          *
2369          * Assert the size so that accidental changes fail to compile.
2370          */
2371         CTASSERT((sizeof(*pvd) == 64));
2372
2373         /*
2374          * Calculate the size of the array.
2375          */
2376         pmap_last_pa = vm_phys_segs[vm_phys_nsegs - 1].end;
2377         pv_npg = howmany(pmap_last_pa, NBPDR);
2378         s = (vm_size_t)pv_npg * sizeof(struct pmap_large_md_page);
2379         s = round_page(s);
2380         pv_table = (struct pmap_large_md_page *)kva_alloc(s);
2381         if (pv_table == NULL)
2382                 panic("%s: kva_alloc failed\n", __func__);
2383
2384         /*
2385          * Iterate physical segments to allocate space for respective pages.
2386          */
2387         highest = -1;
2388         s = 0;
2389         for (i = 0; i < vm_phys_nsegs; i++) {
2390                 end = vm_phys_segs[i].end / NBPDR;
2391                 domain = vm_phys_segs[i].domain;
2392
2393                 if (highest >= end)
2394                         continue;
2395
2396                 start = highest + 1;
2397                 pvd = &pv_table[start];
2398
2399                 pages = end - start + 1;
2400                 s = round_page(pages * sizeof(*pvd));
2401                 highest = start + (s / sizeof(*pvd)) - 1;
2402
2403                 for (j = 0; j < s; j += PAGE_SIZE) {
2404                         vm_page_t m = vm_page_alloc_noobj_domain(domain, 0);
2405                         if (m == NULL)
2406                                 panic("failed to allocate PV table page");
2407                         pmap_qenter((vm_offset_t)pvd + j, &m, 1);
2408                 }
2409
2410                 for (j = 0; j < s / sizeof(*pvd); j++) {
2411                         rw_init_flags(&pvd->pv_lock, "pmap pv list", RW_NEW);
2412                         TAILQ_INIT(&pvd->pv_page.pv_list);
2413                         pvd->pv_page.pv_gen = 0;
2414                         pvd->pv_page.pat_mode = 0;
2415                         pvd->pv_invl_gen = 0;
2416                         pvd++;
2417                 }
2418         }
2419         pvd = &pv_dummy_large;
2420         rw_init_flags(&pvd->pv_lock, "pmap pv list dummy", RW_NEW);
2421         TAILQ_INIT(&pvd->pv_page.pv_list);
2422         pvd->pv_page.pv_gen = 0;
2423         pvd->pv_page.pat_mode = 0;
2424         pvd->pv_invl_gen = 0;
2425 }
2426 #else
2427 static void
2428 pmap_init_pv_table(void)
2429 {
2430         vm_size_t s;
2431         long i, pv_npg;
2432
2433         /*
2434          * Initialize the pool of pv list locks.
2435          */
2436         for (i = 0; i < NPV_LIST_LOCKS; i++)
2437                 rw_init(&pv_list_locks[i], "pmap pv list");
2438
2439         /*
2440          * Calculate the size of the pv head table for superpages.
2441          */
2442         pv_npg = howmany(vm_phys_segs[vm_phys_nsegs - 1].end, NBPDR);
2443
2444         /*
2445          * Allocate memory for the pv head table for superpages.
2446          */
2447         s = (vm_size_t)pv_npg * sizeof(struct md_page);
2448         s = round_page(s);
2449         pv_table = kmem_malloc(s, M_WAITOK | M_ZERO);
2450         for (i = 0; i < pv_npg; i++)
2451                 TAILQ_INIT(&pv_table[i].pv_list);
2452         TAILQ_INIT(&pv_dummy.pv_list);
2453 }
2454 #endif
2455
2456 /*
2457  *      Initialize the pmap module.
2458  *      Called by vm_init, to initialize any structures that the pmap
2459  *      system needs to map virtual memory.
2460  */
2461 void
2462 pmap_init(void)
2463 {
2464         struct pmap_preinit_mapping *ppim;
2465         vm_page_t m, mpte;
2466         int error, i, ret, skz63;
2467
2468         /* L1TF, reserve page @0 unconditionally */
2469         vm_page_blacklist_add(0, bootverbose);
2470
2471         /* Detect bare-metal Skylake Server and Skylake-X. */
2472         if (vm_guest == VM_GUEST_NO && cpu_vendor_id == CPU_VENDOR_INTEL &&
2473             CPUID_TO_FAMILY(cpu_id) == 0x6 && CPUID_TO_MODEL(cpu_id) == 0x55) {
2474                 /*
2475                  * Skylake-X errata SKZ63. Processor May Hang When
2476                  * Executing Code In an HLE Transaction Region between
2477                  * 40000000H and 403FFFFFH.
2478                  *
2479                  * Mark the pages in the range as preallocated.  It
2480                  * seems to be impossible to distinguish between
2481                  * Skylake Server and Skylake X.
2482                  */
2483                 skz63 = 1;
2484                 TUNABLE_INT_FETCH("hw.skz63_enable", &skz63);
2485                 if (skz63 != 0) {
2486                         if (bootverbose)
2487                                 printf("SKZ63: skipping 4M RAM starting "
2488                                     "at physical 1G\n");
2489                         for (i = 0; i < atop(0x400000); i++) {
2490                                 ret = vm_page_blacklist_add(0x40000000 +
2491                                     ptoa(i), FALSE);
2492                                 if (!ret && bootverbose)
2493                                         printf("page at %#lx already used\n",
2494                                             0x40000000 + ptoa(i));
2495                         }
2496                 }
2497         }
2498
2499         /* IFU */
2500         pmap_allow_2m_x_ept_recalculate();
2501
2502         /*
2503          * Initialize the vm page array entries for the kernel pmap's
2504          * page table pages.
2505          */ 
2506         PMAP_LOCK(kernel_pmap);
2507         for (i = 0; i < nkpt; i++) {
2508                 mpte = PHYS_TO_VM_PAGE(KPTphys + (i << PAGE_SHIFT));
2509                 KASSERT(mpte >= vm_page_array &&
2510                     mpte < &vm_page_array[vm_page_array_size],
2511                     ("pmap_init: page table page is out of range"));
2512                 mpte->pindex = pmap_pde_pindex(KERNBASE) + i;
2513                 mpte->phys_addr = KPTphys + (i << PAGE_SHIFT);
2514                 mpte->ref_count = 1;
2515
2516                 /*
2517                  * Collect the page table pages that were replaced by a 2MB
2518                  * page in create_pagetables().  They are zero filled.
2519                  */
2520                 if ((i == 0 ||
2521                     kernphys + ((vm_paddr_t)(i - 1) << PDRSHIFT) < KERNend) &&
2522                     pmap_insert_pt_page(kernel_pmap, mpte, false, false))
2523                         panic("pmap_init: pmap_insert_pt_page failed");
2524         }
2525         PMAP_UNLOCK(kernel_pmap);
2526         vm_wire_add(nkpt);
2527
2528         /*
2529          * If the kernel is running on a virtual machine, then it must assume
2530          * that MCA is enabled by the hypervisor.  Moreover, the kernel must
2531          * be prepared for the hypervisor changing the vendor and family that
2532          * are reported by CPUID.  Consequently, the workaround for AMD Family
2533          * 10h Erratum 383 is enabled if the processor's feature set does not
2534          * include at least one feature that is only supported by older Intel
2535          * or newer AMD processors.
2536          */
2537         if (vm_guest != VM_GUEST_NO && (cpu_feature & CPUID_SS) == 0 &&
2538             (cpu_feature2 & (CPUID2_SSSE3 | CPUID2_SSE41 | CPUID2_AESNI |
2539             CPUID2_AVX | CPUID2_XSAVE)) == 0 && (amd_feature2 & (AMDID2_XOP |
2540             AMDID2_FMA4)) == 0)
2541                 workaround_erratum383 = 1;
2542
2543         /*
2544          * Are large page mappings enabled?
2545          */
2546         TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled);
2547         if (pg_ps_enabled) {
2548                 KASSERT(MAXPAGESIZES > 1 && pagesizes[1] == 0,
2549                     ("pmap_init: can't assign to pagesizes[1]"));
2550                 pagesizes[1] = NBPDR;
2551                 if ((amd_feature & AMDID_PAGE1GB) != 0) {
2552                         KASSERT(MAXPAGESIZES > 2 && pagesizes[2] == 0,
2553                             ("pmap_init: can't assign to pagesizes[2]"));
2554                         pagesizes[2] = NBPDP;
2555                 }
2556         }
2557
2558         /*
2559          * Initialize pv chunk lists.
2560          */
2561         for (i = 0; i < PMAP_MEMDOM; i++) {
2562                 mtx_init(&pv_chunks[i].pvc_lock, "pmap pv chunk list", NULL, MTX_DEF);
2563                 TAILQ_INIT(&pv_chunks[i].pvc_list);
2564         }
2565         pmap_init_pv_table();
2566
2567         pmap_initialized = 1;
2568         for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
2569                 ppim = pmap_preinit_mapping + i;
2570                 if (ppim->va == 0)
2571                         continue;
2572                 /* Make the direct map consistent */
2573                 if (ppim->pa < dmaplimit && ppim->pa + ppim->sz <= dmaplimit) {
2574                         (void)pmap_change_attr(PHYS_TO_DMAP(ppim->pa),
2575                             ppim->sz, ppim->mode);
2576                 }
2577                 if (!bootverbose)
2578                         continue;
2579                 printf("PPIM %u: PA=%#lx, VA=%#lx, size=%#lx, mode=%#x\n", i,
2580                     ppim->pa, ppim->va, ppim->sz, ppim->mode);
2581         }
2582
2583         mtx_init(&qframe_mtx, "qfrmlk", NULL, MTX_SPIN);
2584         error = vmem_alloc(kernel_arena, PAGE_SIZE, M_BESTFIT | M_WAITOK,
2585             (vmem_addr_t *)&qframe);
2586         if (error != 0)
2587                 panic("qframe allocation failed");
2588
2589         lm_ents = 8;
2590         TUNABLE_INT_FETCH("vm.pmap.large_map_pml4_entries", &lm_ents);
2591         if (lm_ents > LMEPML4I - LMSPML4I + 1)
2592                 lm_ents = LMEPML4I - LMSPML4I + 1;
2593 #ifdef KMSAN
2594         if (lm_ents > KMSANORIGPML4I - LMSPML4I) {
2595                 printf(
2596             "pmap: shrinking large map for KMSAN (%d slots to %ld slots)\n",
2597                     lm_ents, KMSANORIGPML4I - LMSPML4I);
2598                 lm_ents = KMSANORIGPML4I - LMSPML4I;
2599         }
2600 #endif
2601         if (bootverbose)
2602                 printf("pmap: large map %u PML4 slots (%lu GB)\n",
2603                     lm_ents, (u_long)lm_ents * (NBPML4 / 1024 / 1024 / 1024));
2604         if (lm_ents != 0) {
2605                 large_vmem = vmem_create("large", LARGEMAP_MIN_ADDRESS,
2606                     (vmem_size_t)lm_ents * NBPML4, PAGE_SIZE, 0, M_WAITOK);
2607                 if (large_vmem == NULL) {
2608                         printf("pmap: cannot create large map\n");
2609                         lm_ents = 0;
2610                 }
2611                 for (i = 0; i < lm_ents; i++) {
2612                         m = pmap_large_map_getptp_unlocked();
2613                         /* XXXKIB la57 */
2614                         kernel_pml4[LMSPML4I + i] = X86_PG_V |
2615                             X86_PG_RW | X86_PG_A | X86_PG_M | pg_nx |
2616                             VM_PAGE_TO_PHYS(m);
2617                 }
2618         }
2619 }
2620
2621 SYSCTL_UINT(_vm_pmap, OID_AUTO, large_map_pml4_entries,
2622     CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &lm_ents, 0,
2623     "Maximum number of PML4 entries for use by large map (tunable).  "
2624     "Each entry corresponds to 512GB of address space.");
2625
2626 static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
2627     "2MB page mapping counters");
2628
2629 static COUNTER_U64_DEFINE_EARLY(pmap_pde_demotions);
2630 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, demotions,
2631     CTLFLAG_RD, &pmap_pde_demotions, "2MB page demotions");
2632
2633 static COUNTER_U64_DEFINE_EARLY(pmap_pde_mappings);
2634 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD,
2635     &pmap_pde_mappings, "2MB page mappings");
2636
2637 static COUNTER_U64_DEFINE_EARLY(pmap_pde_p_failures);
2638 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD,
2639     &pmap_pde_p_failures, "2MB page promotion failures");
2640
2641 static COUNTER_U64_DEFINE_EARLY(pmap_pde_promotions);
2642 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD,
2643     &pmap_pde_promotions, "2MB page promotions");
2644
2645 static SYSCTL_NODE(_vm_pmap, OID_AUTO, pdpe, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
2646     "1GB page mapping counters");
2647
2648 static COUNTER_U64_DEFINE_EARLY(pmap_pdpe_demotions);
2649 SYSCTL_COUNTER_U64(_vm_pmap_pdpe, OID_AUTO, demotions, CTLFLAG_RD,
2650     &pmap_pdpe_demotions, "1GB page demotions");
2651
2652 /***************************************************
2653  * Low level helper routines.....
2654  ***************************************************/
2655
2656 static pt_entry_t
2657 pmap_swap_pat(pmap_t pmap, pt_entry_t entry)
2658 {
2659         int x86_pat_bits = X86_PG_PTE_PAT | X86_PG_PDE_PAT;
2660
2661         switch (pmap->pm_type) {
2662         case PT_X86:
2663         case PT_RVI:
2664                 /* Verify that both PAT bits are not set at the same time */
2665                 KASSERT((entry & x86_pat_bits) != x86_pat_bits,
2666                     ("Invalid PAT bits in entry %#lx", entry));
2667
2668                 /* Swap the PAT bits if one of them is set */
2669                 if ((entry & x86_pat_bits) != 0)
2670                         entry ^= x86_pat_bits;
2671                 break;
2672         case PT_EPT:
2673                 /*
2674                  * Nothing to do - the memory attributes are represented
2675                  * the same way for regular pages and superpages.
2676                  */
2677                 break;
2678         default:
2679                 panic("pmap_switch_pat_bits: bad pm_type %d", pmap->pm_type);
2680         }
2681
2682         return (entry);
2683 }
2684
2685 boolean_t
2686 pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode)
2687 {
2688
2689         return (mode >= 0 && mode < PAT_INDEX_SIZE &&
2690             pat_index[(int)mode] >= 0);
2691 }
2692
2693 /*
2694  * Determine the appropriate bits to set in a PTE or PDE for a specified
2695  * caching mode.
2696  */
2697 int
2698 pmap_cache_bits(pmap_t pmap, int mode, boolean_t is_pde)
2699 {
2700         int cache_bits, pat_flag, pat_idx;
2701
2702         if (!pmap_is_valid_memattr(pmap, mode))
2703                 panic("Unknown caching mode %d\n", mode);
2704
2705         switch (pmap->pm_type) {
2706         case PT_X86:
2707         case PT_RVI:
2708                 /* The PAT bit is different for PTE's and PDE's. */
2709                 pat_flag = is_pde ? X86_PG_PDE_PAT : X86_PG_PTE_PAT;
2710
2711                 /* Map the caching mode to a PAT index. */
2712                 pat_idx = pat_index[mode];
2713
2714                 /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
2715                 cache_bits = 0;
2716                 if (pat_idx & 0x4)
2717                         cache_bits |= pat_flag;
2718                 if (pat_idx & 0x2)
2719                         cache_bits |= PG_NC_PCD;
2720                 if (pat_idx & 0x1)
2721                         cache_bits |= PG_NC_PWT;
2722                 break;
2723
2724         case PT_EPT:
2725                 cache_bits = EPT_PG_IGNORE_PAT | EPT_PG_MEMORY_TYPE(mode);
2726                 break;
2727
2728         default:
2729                 panic("unsupported pmap type %d", pmap->pm_type);
2730         }
2731
2732         return (cache_bits);
2733 }
2734
2735 static int
2736 pmap_cache_mask(pmap_t pmap, boolean_t is_pde)
2737 {
2738         int mask;
2739
2740         switch (pmap->pm_type) {
2741         case PT_X86:
2742         case PT_RVI:
2743                 mask = is_pde ? X86_PG_PDE_CACHE : X86_PG_PTE_CACHE;
2744                 break;
2745         case PT_EPT:
2746                 mask = EPT_PG_IGNORE_PAT | EPT_PG_MEMORY_TYPE(0x7);
2747                 break;
2748         default:
2749                 panic("pmap_cache_mask: invalid pm_type %d", pmap->pm_type);
2750         }
2751
2752         return (mask);
2753 }
2754
2755 static int
2756 pmap_pat_index(pmap_t pmap, pt_entry_t pte, bool is_pde)
2757 {
2758         int pat_flag, pat_idx;
2759
2760         pat_idx = 0;
2761         switch (pmap->pm_type) {
2762         case PT_X86:
2763         case PT_RVI:
2764                 /* The PAT bit is different for PTE's and PDE's. */
2765                 pat_flag = is_pde ? X86_PG_PDE_PAT : X86_PG_PTE_PAT;
2766
2767                 if ((pte & pat_flag) != 0)
2768                         pat_idx |= 0x4;
2769                 if ((pte & PG_NC_PCD) != 0)
2770                         pat_idx |= 0x2;
2771                 if ((pte & PG_NC_PWT) != 0)
2772                         pat_idx |= 0x1;
2773                 break;
2774         case PT_EPT:
2775                 if ((pte & EPT_PG_IGNORE_PAT) != 0)
2776                         panic("EPT PTE %#lx has no PAT memory type", pte);
2777                 pat_idx = (pte & EPT_PG_MEMORY_TYPE(0x7)) >> 3;
2778                 break;
2779         }
2780
2781         /* See pmap_init_pat(). */
2782         if (pat_idx == 4)
2783                 pat_idx = 0;
2784         if (pat_idx == 7)
2785                 pat_idx = 3;
2786
2787         return (pat_idx);
2788 }
2789
2790 bool
2791 pmap_ps_enabled(pmap_t pmap)
2792 {
2793
2794         return (pg_ps_enabled && (pmap->pm_flags & PMAP_PDE_SUPERPAGE) != 0);
2795 }
2796
2797 static void
2798 pmap_update_pde_store(pmap_t pmap, pd_entry_t *pde, pd_entry_t newpde)
2799 {
2800
2801         switch (pmap->pm_type) {
2802         case PT_X86:
2803                 break;
2804         case PT_RVI:
2805         case PT_EPT:
2806                 /*
2807                  * XXX
2808                  * This is a little bogus since the generation number is
2809                  * supposed to be bumped up when a region of the address
2810                  * space is invalidated in the page tables.
2811                  *
2812                  * In this case the old PDE entry is valid but yet we want
2813                  * to make sure that any mappings using the old entry are
2814                  * invalidated in the TLB.
2815                  *
2816                  * The reason this works as expected is because we rendezvous
2817                  * "all" host cpus and force any vcpu context to exit as a
2818                  * side-effect.
2819                  */
2820                 atomic_add_long(&pmap->pm_eptgen, 1);
2821                 break;
2822         default:
2823                 panic("pmap_update_pde_store: bad pm_type %d", pmap->pm_type);
2824         }
2825         pde_store(pde, newpde);
2826 }
2827
2828 /*
2829  * After changing the page size for the specified virtual address in the page
2830  * table, flush the corresponding entries from the processor's TLB.  Only the
2831  * calling processor's TLB is affected.
2832  *
2833  * The calling thread must be pinned to a processor.
2834  */
2835 static void
2836 pmap_update_pde_invalidate(pmap_t pmap, vm_offset_t va, pd_entry_t newpde)
2837 {
2838         pt_entry_t PG_G;
2839
2840         if (pmap_type_guest(pmap))
2841                 return;
2842
2843         KASSERT(pmap->pm_type == PT_X86,
2844             ("pmap_update_pde_invalidate: invalid type %d", pmap->pm_type));
2845
2846         PG_G = pmap_global_bit(pmap);
2847
2848         if ((newpde & PG_PS) == 0)
2849                 /* Demotion: flush a specific 2MB page mapping. */
2850                 pmap_invlpg(pmap, va);
2851         else if ((newpde & PG_G) == 0)
2852                 /*
2853                  * Promotion: flush every 4KB page mapping from the TLB
2854                  * because there are too many to flush individually.
2855                  */
2856                 invltlb();
2857         else {
2858                 /*
2859                  * Promotion: flush every 4KB page mapping from the TLB,
2860                  * including any global (PG_G) mappings.
2861                  */
2862                 invltlb_glob();
2863         }
2864 }
2865
2866 /*
2867  * The amd64 pmap uses different approaches to TLB invalidation
2868  * depending on the kernel configuration, available hardware features,
2869  * and known hardware errata.  The kernel configuration option that
2870  * has the greatest operational impact on TLB invalidation is PTI,
2871  * which is enabled automatically on affected Intel CPUs.  The most
2872  * impactful hardware features are first PCID, and then INVPCID
2873  * instruction presence.  PCID usage is quite different for PTI
2874  * vs. non-PTI.
2875  *
2876  * * Kernel Page Table Isolation (PTI or KPTI) is used to mitigate
2877  *   the Meltdown bug in some Intel CPUs.  Under PTI, each user address
2878  *   space is served by two page tables, user and kernel.  The user
2879  *   page table only maps user space and a kernel trampoline.  The
2880  *   kernel trampoline includes the entirety of the kernel text but
2881  *   only the kernel data that is needed to switch from user to kernel
2882  *   mode.  The kernel page table maps the user and kernel address
2883  *   spaces in their entirety.  It is identical to the per-process
2884  *   page table used in non-PTI mode.
2885  *
2886  *   User page tables are only used when the CPU is in user mode.
2887  *   Consequently, some TLB invalidations can be postponed until the
2888  *   switch from kernel to user mode.  In contrast, the user
2889  *   space part of the kernel page table is used for copyout(9), so
2890  *   TLB invalidations on this page table cannot be similarly postponed.
2891  *
2892  *   The existence of a user mode page table for the given pmap is
2893  *   indicated by a pm_ucr3 value that differs from PMAP_NO_CR3, in
2894  *   which case pm_ucr3 contains the %cr3 register value for the user
2895  *   mode page table's root.
2896  *
2897  * * The pm_active bitmask indicates which CPUs currently have the
2898  *   pmap active.  A CPU's bit is set on context switch to the pmap, and
2899  *   cleared on switching off this CPU.  For the kernel page table,
2900  *   the pm_active field is immutable and contains all CPUs.  The
2901  *   kernel page table is always logically active on every processor,
2902  *   but not necessarily in use by the hardware, e.g., in PTI mode.
2903  *
2904  *   When requesting invalidation of virtual addresses with
2905  *   pmap_invalidate_XXX() functions, the pmap sends shootdown IPIs to
2906  *   all CPUs recorded as active in pm_active.  Updates to and reads
2907  *   from pm_active are not synchronized, and so they may race with
2908  *   each other.  Shootdown handlers are prepared to handle the race.
2909  *
2910  * * PCID is an optional feature of the long mode x86 MMU where TLB
2911  *   entries are tagged with the 'Process ID' of the address space
2912  *   they belong to.  This feature provides a limited namespace for
2913  *   process identifiers, 12 bits, supporting 4095 simultaneous IDs
2914  *   total.
2915  *
2916  *   Allocation of a PCID to a pmap is done by an algorithm described
2917  *   in section 15.12, "Other TLB Consistency Algorithms", of
2918  *   Vahalia's book "Unix Internals".  A PCID cannot be allocated for
2919  *   the whole lifetime of a pmap in pmap_pinit() due to the limited
2920  *   namespace.  Instead, a per-CPU, per-pmap PCID is assigned when
2921  *   the CPU is about to start caching TLB entries from a pmap,
2922  *   i.e., on the context switch that activates the pmap on the CPU.
2923  *
2924  *   The PCID allocator maintains a per-CPU, per-pmap generation
2925  *   count, pm_gen, which is incremented each time a new PCID is
2926  *   allocated.  On TLB invalidation, the generation counters for the
2927  *   pmap are zeroed, which signals the context switch code that the
2928  *   previously allocated PCID is no longer valid.  Effectively,
2929  *   zeroing any of these counters triggers a TLB shootdown for the
2930  *   given CPU/address space, due to the allocation of a new PCID.
2931  *
2932  *   Zeroing can be performed remotely.  Consequently, if a pmap is
2933  *   inactive on a CPU, then a TLB shootdown for that pmap and CPU can
2934  *   be initiated by an ordinary memory access to reset the target
2935  *   CPU's generation count within the pmap.  The CPU initiating the
2936  *   TLB shootdown does not need to send an IPI to the target CPU.
2937  *
2938  * * PTI + PCID.  The available PCIDs are divided into two sets: PCIDs
2939  *   for complete (kernel) page tables, and PCIDs for user mode page
2940  *   tables.  A user PCID value is obtained from the kernel PCID value
2941  *   by setting the highest bit, 11, to 1 (0x800 == PMAP_PCID_USER_PT).
2942  *
2943  *   User space page tables are activated on return to user mode, by
2944  *   loading pm_ucr3 into %cr3.  If the PCPU(ucr3_load_mask) requests
2945  *   clearing bit 63 of the loaded ucr3, this effectively causes
2946  *   complete invalidation of the user mode TLB entries for the
2947  *   current pmap.  In which case, local invalidations of individual
2948  *   pages in the user page table are skipped.
2949  *
2950  * * Local invalidation, all modes.  If the requested invalidation is
2951  *   for a specific address or the total invalidation of a currently
2952  *   active pmap, then the TLB is flushed using INVLPG for a kernel
2953  *   page table, and INVPCID(INVPCID_CTXGLOB)/invltlb_glob() for a
2954  *   user space page table(s).
2955  *
2956  *   If the INVPCID instruction is available, it is used to flush user
2957  *   entries from the kernel page table.
2958  *
2959  *   When PCID is enabled, the INVLPG instruction invalidates all TLB
2960  *   entries for the given page that either match the current PCID or
2961  *   are global. Since TLB entries for the same page under different
2962  *   PCIDs are unaffected, kernel pages which reside in all address
2963  *   spaces could be problematic.  We avoid the problem by creating
2964  *   all kernel PTEs with the global flag (PG_G) set, when PTI is
2965  *   disabled.
2966  *
2967  * * mode: PTI disabled, PCID present.  The kernel reserves PCID 0 for its
2968  *   address space, all other 4095 PCIDs are used for user mode spaces
2969  *   as described above.  A context switch allocates a new PCID if
2970  *   the recorded PCID is zero or the recorded generation does not match
2971  *   the CPU's generation, effectively flushing the TLB for this address space.
2972  *   Total remote invalidation is performed by zeroing pm_gen for all CPUs.
2973  *      local user page: INVLPG
2974  *      local kernel page: INVLPG
2975  *      local user total: INVPCID(CTX)
2976  *      local kernel total: INVPCID(CTXGLOB) or invltlb_glob()
2977  *      remote user page, inactive pmap: zero pm_gen
2978  *      remote user page, active pmap: zero pm_gen + IPI:INVLPG
2979  *      (Both actions are required to handle the aforementioned pm_active races.)
2980  *      remote kernel page: IPI:INVLPG
2981  *      remote user total, inactive pmap: zero pm_gen
2982  *      remote user total, active pmap: zero pm_gen + IPI:(INVPCID(CTX) or
2983  *          reload %cr3)
2984  *      (See note above about pm_active races.)
2985  *      remote kernel total: IPI:(INVPCID(CTXGLOB) or invltlb_glob())
2986  *
2987  * PTI enabled, PCID present.
2988  *      local user page: INVLPG for kpt, INVPCID(ADDR) or (INVLPG for ucr3)
2989  *          for upt
2990  *      local kernel page: INVLPG
2991  *      local user total: INVPCID(CTX) or reload %cr3 for kpt, clear PCID_SAVE
2992  *          on loading UCR3 into %cr3 for upt
2993  *      local kernel total: INVPCID(CTXGLOB) or invltlb_glob()
2994  *      remote user page, inactive pmap: zero pm_gen
2995  *      remote user page, active pmap: zero pm_gen + IPI:(INVLPG for kpt,
2996  *          INVPCID(ADDR) for upt)
2997  *      remote kernel page: IPI:INVLPG
2998  *      remote user total, inactive pmap: zero pm_gen
2999  *      remote user total, active pmap: zero pm_gen + IPI:(INVPCID(CTX) for kpt,
3000  *          clear PCID_SAVE on loading UCR3 into $cr3 for upt)
3001  *      remote kernel total: IPI:(INVPCID(CTXGLOB) or invltlb_glob())
3002  *
3003  *  No PCID.
3004  *      local user page: INVLPG
3005  *      local kernel page: INVLPG
3006  *      local user total: reload %cr3
3007  *      local kernel total: invltlb_glob()
3008  *      remote user page, inactive pmap: -
3009  *      remote user page, active pmap: IPI:INVLPG
3010  *      remote kernel page: IPI:INVLPG
3011  *      remote user total, inactive pmap: -
3012  *      remote user total, active pmap: IPI:(reload %cr3)
3013  *      remote kernel total: IPI:invltlb_glob()
3014  *  Since on return to user mode, the reload of %cr3 with ucr3 causes
3015  *  TLB invalidation, no specific action is required for user page table.
3016  *
3017  * EPT.  EPT pmaps do not map KVA, all mappings are userspace.
3018  * XXX TODO
3019  */
3020
3021 #ifdef SMP
3022 /*
3023  * Interrupt the cpus that are executing in the guest context.
3024  * This will force the vcpu to exit and the cached EPT mappings
3025  * will be invalidated by the host before the next vmresume.
3026  */
3027 static __inline void
3028 pmap_invalidate_ept(pmap_t pmap)
3029 {
3030         smr_seq_t goal;
3031         int ipinum;
3032
3033         sched_pin();
3034         KASSERT(!CPU_ISSET(curcpu, &pmap->pm_active),
3035             ("pmap_invalidate_ept: absurd pm_active"));
3036
3037         /*
3038          * The TLB mappings associated with a vcpu context are not
3039          * flushed each time a different vcpu is chosen to execute.
3040          *
3041          * This is in contrast with a process's vtop mappings that
3042          * are flushed from the TLB on each context switch.
3043          *
3044          * Therefore we need to do more than just a TLB shootdown on
3045          * the active cpus in 'pmap->pm_active'. To do this we keep
3046          * track of the number of invalidations performed on this pmap.
3047          *
3048          * Each vcpu keeps a cache of this counter and compares it
3049          * just before a vmresume. If the counter is out-of-date an
3050          * invept will be done to flush stale mappings from the TLB.
3051          *
3052          * To ensure that all vCPU threads have observed the new counter
3053          * value before returning, we use SMR.  Ordering is important here:
3054          * the VMM enters an SMR read section before loading the counter
3055          * and after updating the pm_active bit set.  Thus, pm_active is
3056          * a superset of active readers, and any reader that has observed
3057          * the goal has observed the new counter value.
3058          */
3059         atomic_add_long(&pmap->pm_eptgen, 1);
3060
3061         goal = smr_advance(pmap->pm_eptsmr);
3062
3063         /*
3064          * Force the vcpu to exit and trap back into the hypervisor.
3065          */
3066         ipinum = pmap->pm_flags & PMAP_NESTED_IPIMASK;
3067         ipi_selected(pmap->pm_active, ipinum);
3068         sched_unpin();
3069
3070         /*
3071          * Ensure that all active vCPUs will observe the new generation counter
3072          * value before executing any more guest instructions.
3073          */
3074         smr_wait(pmap->pm_eptsmr, goal);
3075 }
3076
3077 static inline void
3078 pmap_invalidate_preipi_pcid(pmap_t pmap)
3079 {
3080         struct pmap_pcid *pcidp;
3081         u_int cpuid, i;
3082
3083         sched_pin();
3084
3085         cpuid = PCPU_GET(cpuid);
3086         if (pmap != PCPU_GET(curpmap))
3087                 cpuid = 0xffffffff;     /* An impossible value */
3088
3089         CPU_FOREACH(i) {
3090                 if (cpuid != i) {
3091                         pcidp = zpcpu_get_cpu(pmap->pm_pcidp, i);
3092                         pcidp->pm_gen = 0;
3093                 }
3094         }
3095
3096         /*
3097          * The fence is between stores to pm_gen and the read of the
3098          * pm_active mask.  We need to ensure that it is impossible
3099          * for us to miss the bit update in pm_active and
3100          * simultaneously observe a non-zero pm_gen in
3101          * pmap_activate_sw(), otherwise TLB update is missed.
3102          * Without the fence, IA32 allows such an outcome.  Note that
3103          * pm_active is updated by a locked operation, which provides
3104          * the reciprocal fence.
3105          */
3106         atomic_thread_fence_seq_cst();
3107 }
3108
3109 static void
3110 pmap_invalidate_preipi_nopcid(pmap_t pmap __unused)
3111 {
3112         sched_pin();
3113 }
3114
3115 DEFINE_IFUNC(static, void, pmap_invalidate_preipi, (pmap_t))
3116 {
3117         return (pmap_pcid_enabled ? pmap_invalidate_preipi_pcid :
3118             pmap_invalidate_preipi_nopcid);
3119 }
3120
3121 static inline void
3122 pmap_invalidate_page_pcid_cb(pmap_t pmap, vm_offset_t va,
3123     const bool invpcid_works1)
3124 {
3125         struct invpcid_descr d;
3126         uint64_t kcr3, ucr3;
3127         uint32_t pcid;
3128
3129         /*
3130          * Because pm_pcid is recalculated on a context switch, we
3131          * must ensure there is no preemption, not just pinning.
3132          * Otherwise, we might use a stale value below.
3133          */
3134         CRITICAL_ASSERT(curthread);
3135
3136         /*
3137          * No need to do anything with user page tables invalidation
3138          * if there is no user page table, or invalidation is deferred
3139          * until the return to userspace.  ucr3_load_mask is stable
3140          * because we have preemption disabled.
3141          */
3142         if (pmap->pm_ucr3 == PMAP_NO_CR3 ||
3143             PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK)
3144                 return;
3145
3146         pcid = pmap_get_pcid(pmap);
3147         if (invpcid_works1) {
3148                 d.pcid = pcid | PMAP_PCID_USER_PT;
3149                 d.pad = 0;
3150                 d.addr = va;
3151                 invpcid(&d, INVPCID_ADDR);
3152         } else {
3153                 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3154                 ucr3 = pmap->pm_ucr3 | pcid | PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3155                 pmap_pti_pcid_invlpg(ucr3, kcr3, va);
3156         }
3157 }
3158
3159 static void
3160 pmap_invalidate_page_pcid_invpcid_cb(pmap_t pmap, vm_offset_t va)
3161 {
3162         pmap_invalidate_page_pcid_cb(pmap, va, true);
3163 }
3164
3165 static void
3166 pmap_invalidate_page_pcid_noinvpcid_cb(pmap_t pmap, vm_offset_t va)
3167 {
3168         pmap_invalidate_page_pcid_cb(pmap, va, false);
3169 }
3170
3171 static void
3172 pmap_invalidate_page_nopcid_cb(pmap_t pmap __unused, vm_offset_t va __unused)
3173 {
3174 }
3175
3176 DEFINE_IFUNC(static, void, pmap_invalidate_page_cb, (pmap_t, vm_offset_t))
3177 {
3178         if (pmap_pcid_enabled)
3179                 return (invpcid_works ? pmap_invalidate_page_pcid_invpcid_cb :
3180                     pmap_invalidate_page_pcid_noinvpcid_cb);
3181         return (pmap_invalidate_page_nopcid_cb);
3182 }
3183
3184 static void
3185 pmap_invalidate_page_curcpu_cb(pmap_t pmap, vm_offset_t va,
3186     vm_offset_t addr2 __unused)
3187 {
3188         if (pmap == kernel_pmap) {
3189                 pmap_invlpg(kernel_pmap, va);
3190         } else if (pmap == PCPU_GET(curpmap)) {
3191                 invlpg(va);
3192                 pmap_invalidate_page_cb(pmap, va);
3193         }
3194 }
3195
3196 void
3197 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
3198 {
3199         if (pmap_type_guest(pmap)) {
3200                 pmap_invalidate_ept(pmap);
3201                 return;
3202         }
3203
3204         KASSERT(pmap->pm_type == PT_X86,
3205             ("pmap_invalidate_page: invalid type %d", pmap->pm_type));
3206
3207         pmap_invalidate_preipi(pmap);
3208         smp_masked_invlpg(va, pmap, pmap_invalidate_page_curcpu_cb);
3209 }
3210
3211 /* 4k PTEs -- Chosen to exceed the total size of Broadwell L2 TLB */
3212 #define PMAP_INVLPG_THRESHOLD   (4 * 1024 * PAGE_SIZE)
3213
3214 static void
3215 pmap_invalidate_range_pcid_cb(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
3216     const bool invpcid_works1)
3217 {
3218         struct invpcid_descr d;
3219         uint64_t kcr3, ucr3;
3220         uint32_t pcid;
3221
3222         CRITICAL_ASSERT(curthread);
3223
3224         if (pmap != PCPU_GET(curpmap) ||
3225             pmap->pm_ucr3 == PMAP_NO_CR3 ||
3226             PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK)
3227                 return;
3228
3229         pcid = pmap_get_pcid(pmap);
3230         if (invpcid_works1) {
3231                 d.pcid = pcid | PMAP_PCID_USER_PT;
3232                 d.pad = 0;
3233                 for (d.addr = sva; d.addr < eva; d.addr += PAGE_SIZE)
3234                         invpcid(&d, INVPCID_ADDR);
3235         } else {
3236                 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3237                 ucr3 = pmap->pm_ucr3 | pcid | PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3238                 pmap_pti_pcid_invlrng(ucr3, kcr3, sva, eva);
3239         }
3240 }
3241
3242 static void
3243 pmap_invalidate_range_pcid_invpcid_cb(pmap_t pmap, vm_offset_t sva,
3244     vm_offset_t eva)
3245 {
3246         pmap_invalidate_range_pcid_cb(pmap, sva, eva, true);
3247 }
3248
3249 static void
3250 pmap_invalidate_range_pcid_noinvpcid_cb(pmap_t pmap, vm_offset_t sva,
3251     vm_offset_t eva)
3252 {
3253         pmap_invalidate_range_pcid_cb(pmap, sva, eva, false);
3254 }
3255
3256 static void
3257 pmap_invalidate_range_nopcid_cb(pmap_t pmap __unused, vm_offset_t sva __unused,
3258     vm_offset_t eva __unused)
3259 {
3260 }
3261
3262 DEFINE_IFUNC(static, void, pmap_invalidate_range_cb, (pmap_t, vm_offset_t,
3263     vm_offset_t))
3264 {
3265         if (pmap_pcid_enabled)
3266                 return (invpcid_works ? pmap_invalidate_range_pcid_invpcid_cb :
3267                     pmap_invalidate_range_pcid_noinvpcid_cb);
3268         return (pmap_invalidate_range_nopcid_cb);
3269 }
3270
3271 static void
3272 pmap_invalidate_range_curcpu_cb(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3273 {
3274         vm_offset_t addr;
3275
3276         if (pmap == kernel_pmap) {
3277                 if (PCPU_GET(pcid_invlpg_workaround)) {
3278                         struct invpcid_descr d = { 0 };
3279
3280                         invpcid(&d, INVPCID_CTXGLOB);
3281                 } else {
3282                         for (addr = sva; addr < eva; addr += PAGE_SIZE)
3283                                 invlpg(addr);
3284                 }
3285         } else if (pmap == PCPU_GET(curpmap)) {
3286                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
3287                         invlpg(addr);
3288                 pmap_invalidate_range_cb(pmap, sva, eva);
3289         }
3290 }
3291
3292 void
3293 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3294 {
3295         if (eva - sva >= PMAP_INVLPG_THRESHOLD) {
3296                 pmap_invalidate_all(pmap);
3297                 return;
3298         }
3299
3300         if (pmap_type_guest(pmap)) {
3301                 pmap_invalidate_ept(pmap);
3302                 return;
3303         }
3304
3305         KASSERT(pmap->pm_type == PT_X86,
3306             ("pmap_invalidate_range: invalid type %d", pmap->pm_type));
3307
3308         pmap_invalidate_preipi(pmap);
3309         smp_masked_invlpg_range(sva, eva, pmap,
3310             pmap_invalidate_range_curcpu_cb);
3311 }
3312
3313 static inline void
3314 pmap_invalidate_all_pcid_cb(pmap_t pmap, bool invpcid_works1)
3315 {
3316         struct invpcid_descr d;
3317         uint64_t kcr3;
3318         uint32_t pcid;
3319
3320         if (pmap == kernel_pmap) {
3321                 if (invpcid_works1) {
3322                         bzero(&d, sizeof(d));
3323                         invpcid(&d, INVPCID_CTXGLOB);
3324                 } else {
3325                         invltlb_glob();
3326                 }
3327         } else if (pmap == PCPU_GET(curpmap)) {
3328                 CRITICAL_ASSERT(curthread);
3329
3330                 pcid = pmap_get_pcid(pmap);
3331                 if (invpcid_works1) {
3332                         d.pcid = pcid;
3333                         d.pad = 0;
3334                         d.addr = 0;
3335                         invpcid(&d, INVPCID_CTX);
3336                 } else {
3337                         kcr3 = pmap->pm_cr3 | pcid;
3338                         load_cr3(kcr3);
3339                 }
3340                 if (pmap->pm_ucr3 != PMAP_NO_CR3)
3341                         PCPU_SET(ucr3_load_mask, ~CR3_PCID_SAVE);
3342         }
3343 }
3344
3345 static void
3346 pmap_invalidate_all_pcid_invpcid_cb(pmap_t pmap)
3347 {
3348         pmap_invalidate_all_pcid_cb(pmap, true);
3349 }
3350
3351 static void
3352 pmap_invalidate_all_pcid_noinvpcid_cb(pmap_t pmap)
3353 {
3354         pmap_invalidate_all_pcid_cb(pmap, false);
3355 }
3356
3357 static void
3358 pmap_invalidate_all_nopcid_cb(pmap_t pmap)
3359 {
3360         if (pmap == kernel_pmap)
3361                 invltlb_glob();
3362         else if (pmap == PCPU_GET(curpmap))
3363                 invltlb();
3364 }
3365
3366 DEFINE_IFUNC(static, void, pmap_invalidate_all_cb, (pmap_t))
3367 {
3368         if (pmap_pcid_enabled)
3369                 return (invpcid_works ? pmap_invalidate_all_pcid_invpcid_cb :
3370                     pmap_invalidate_all_pcid_noinvpcid_cb);
3371         return (pmap_invalidate_all_nopcid_cb);
3372 }
3373
3374 static void
3375 pmap_invalidate_all_curcpu_cb(pmap_t pmap, vm_offset_t addr1 __unused,
3376     vm_offset_t addr2 __unused)
3377 {
3378         pmap_invalidate_all_cb(pmap);
3379 }
3380
3381 void
3382 pmap_invalidate_all(pmap_t pmap)
3383 {
3384         if (pmap_type_guest(pmap)) {
3385                 pmap_invalidate_ept(pmap);
3386                 return;
3387         }
3388
3389         KASSERT(pmap->pm_type == PT_X86,
3390             ("pmap_invalidate_all: invalid type %d", pmap->pm_type));
3391
3392         pmap_invalidate_preipi(pmap);
3393         smp_masked_invltlb(pmap, pmap_invalidate_all_curcpu_cb);
3394 }
3395
3396 static void
3397 pmap_invalidate_cache_curcpu_cb(pmap_t pmap __unused, vm_offset_t va __unused,
3398     vm_offset_t addr2 __unused)
3399 {
3400         wbinvd();
3401 }
3402
3403 void
3404 pmap_invalidate_cache(void)
3405 {
3406         sched_pin();
3407         smp_cache_flush(pmap_invalidate_cache_curcpu_cb);
3408 }
3409
3410 struct pde_action {
3411         cpuset_t invalidate;    /* processors that invalidate their TLB */
3412         pmap_t pmap;
3413         vm_offset_t va;
3414         pd_entry_t *pde;
3415         pd_entry_t newpde;
3416         u_int store;            /* processor that updates the PDE */
3417 };
3418
3419 static void
3420 pmap_update_pde_action(void *arg)
3421 {
3422         struct pde_action *act = arg;
3423
3424         if (act->store == PCPU_GET(cpuid))
3425                 pmap_update_pde_store(act->pmap, act->pde, act->newpde);
3426 }
3427
3428 static void
3429 pmap_update_pde_teardown(void *arg)
3430 {
3431         struct pde_action *act = arg;
3432
3433         if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
3434                 pmap_update_pde_invalidate(act->pmap, act->va, act->newpde);
3435 }
3436
3437 /*
3438  * Change the page size for the specified virtual address in a way that
3439  * prevents any possibility of the TLB ever having two entries that map the
3440  * same virtual address using different page sizes.  This is the recommended
3441  * workaround for Erratum 383 on AMD Family 10h processors.  It prevents a
3442  * machine check exception for a TLB state that is improperly diagnosed as a
3443  * hardware error.
3444  */
3445 static void
3446 pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
3447 {
3448         struct pde_action act;
3449         cpuset_t active, other_cpus;
3450         u_int cpuid;
3451
3452         sched_pin();
3453         cpuid = PCPU_GET(cpuid);
3454         other_cpus = all_cpus;
3455         CPU_CLR(cpuid, &other_cpus);
3456         if (pmap == kernel_pmap || pmap_type_guest(pmap)) 
3457                 active = all_cpus;
3458         else {
3459                 active = pmap->pm_active;
3460         }
3461         if (CPU_OVERLAP(&active, &other_cpus)) { 
3462                 act.store = cpuid;
3463                 act.invalidate = active;
3464                 act.va = va;
3465                 act.pmap = pmap;
3466                 act.pde = pde;
3467                 act.newpde = newpde;
3468                 CPU_SET(cpuid, &active);
3469                 smp_rendezvous_cpus(active,
3470                     smp_no_rendezvous_barrier, pmap_update_pde_action,
3471                     pmap_update_pde_teardown, &act);
3472         } else {
3473                 pmap_update_pde_store(pmap, pde, newpde);
3474                 if (CPU_ISSET(cpuid, &active))
3475                         pmap_update_pde_invalidate(pmap, va, newpde);
3476         }
3477         sched_unpin();
3478 }
3479 #else /* !SMP */
3480 /*
3481  * Normal, non-SMP, invalidation functions.
3482  */
3483 void
3484 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
3485 {
3486         struct invpcid_descr d;
3487         uint64_t kcr3, ucr3;
3488         uint32_t pcid;
3489
3490         if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
3491                 pmap->pm_eptgen++;
3492                 return;
3493         }
3494         KASSERT(pmap->pm_type == PT_X86,
3495             ("pmap_invalidate_range: unknown type %d", pmap->pm_type));
3496
3497         if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap)) {
3498                 invlpg(va);
3499                 if (pmap == PCPU_GET(curpmap) && pmap_pcid_enabled &&
3500                     pmap->pm_ucr3 != PMAP_NO_CR3) {
3501                         critical_enter();
3502                         pcid = pmap->pm_pcidp->pm_pcid;
3503                         if (invpcid_works) {
3504                                 d.pcid = pcid | PMAP_PCID_USER_PT;
3505                                 d.pad = 0;
3506                                 d.addr = va;
3507                                 invpcid(&d, INVPCID_ADDR);
3508                         } else {
3509                                 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3510                                 ucr3 = pmap->pm_ucr3 | pcid |
3511                                     PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3512                                 pmap_pti_pcid_invlpg(ucr3, kcr3, va);
3513                         }
3514                         critical_exit();
3515                 }
3516         } else if (pmap_pcid_enabled)
3517                 pmap->pm_pcidp->pm_gen = 0;
3518 }
3519
3520 void
3521 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3522 {
3523         struct invpcid_descr d;
3524         vm_offset_t addr;
3525         uint64_t kcr3, ucr3;
3526
3527         if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
3528                 pmap->pm_eptgen++;
3529                 return;
3530         }
3531         KASSERT(pmap->pm_type == PT_X86,
3532             ("pmap_invalidate_range: unknown type %d", pmap->pm_type));
3533
3534         if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap)) {
3535                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
3536                         invlpg(addr);
3537                 if (pmap == PCPU_GET(curpmap) && pmap_pcid_enabled &&
3538                     pmap->pm_ucr3 != PMAP_NO_CR3) {
3539                         critical_enter();
3540                         if (invpcid_works) {
3541                                 d.pcid = pmap->pm_pcidp->pm_pcid |
3542                                     PMAP_PCID_USER_PT;
3543                                 d.pad = 0;
3544                                 d.addr = sva;
3545                                 for (; d.addr < eva; d.addr += PAGE_SIZE)
3546                                         invpcid(&d, INVPCID_ADDR);
3547                         } else {
3548                                 kcr3 = pmap->pm_cr3 | pmap->pm_pcidp->
3549                                     pm_pcid | CR3_PCID_SAVE;
3550                                 ucr3 = pmap->pm_ucr3 | pmap->pm_pcidp->
3551                                     pm_pcid | PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3552                                 pmap_pti_pcid_invlrng(ucr3, kcr3, sva, eva);
3553                         }
3554                         critical_exit();
3555                 }
3556         } else if (pmap_pcid_enabled) {
3557                 pmap->pm_pcidp->pm_gen = 0;
3558         }
3559 }
3560
3561 void
3562 pmap_invalidate_all(pmap_t pmap)
3563 {
3564         struct invpcid_descr d;
3565         uint64_t kcr3, ucr3;
3566
3567         if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
3568                 pmap->pm_eptgen++;
3569                 return;
3570         }
3571         KASSERT(pmap->pm_type == PT_X86,
3572             ("pmap_invalidate_all: unknown type %d", pmap->pm_type));
3573
3574         if (pmap == kernel_pmap) {
3575                 if (pmap_pcid_enabled && invpcid_works) {
3576                         bzero(&d, sizeof(d));
3577                         invpcid(&d, INVPCID_CTXGLOB);
3578                 } else {
3579                         invltlb_glob();
3580                 }
3581         } else if (pmap == PCPU_GET(curpmap)) {
3582                 if (pmap_pcid_enabled) {
3583                         critical_enter();
3584                         if (invpcid_works) {
3585                                 d.pcid = pmap->pm_pcidp->pm_pcid;
3586                                 d.pad = 0;
3587                                 d.addr = 0;
3588                                 invpcid(&d, INVPCID_CTX);
3589                                 if (pmap->pm_ucr3 != PMAP_NO_CR3) {
3590                                         d.pcid |= PMAP_PCID_USER_PT;
3591                                         invpcid(&d, INVPCID_CTX);
3592                                 }
3593                         } else {
3594                                 kcr3 = pmap->pm_cr3 | pmap->pm_pcidp->pm_pcid;
3595                                 if (pmap->pm_ucr3 != PMAP_NO_CR3) {
3596                                         ucr3 = pmap->pm_ucr3 | pmap->pm_pcidp->
3597                                             pm_pcid | PMAP_PCID_USER_PT;
3598                                         pmap_pti_pcid_invalidate(ucr3, kcr3);
3599                                 } else
3600                                         load_cr3(kcr3);
3601                         }
3602                         critical_exit();
3603                 } else {
3604                         invltlb();
3605                 }
3606         } else if (pmap_pcid_enabled) {
3607                 pmap->pm_pcidp->pm_gen = 0;
3608         }
3609 }
3610
3611 PMAP_INLINE void
3612 pmap_invalidate_cache(void)
3613 {
3614
3615         wbinvd();
3616 }
3617
3618 static void
3619 pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
3620 {
3621
3622         pmap_update_pde_store(pmap, pde, newpde);
3623         if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap))
3624                 pmap_update_pde_invalidate(pmap, va, newpde);
3625         else
3626                 pmap->pm_pcidp->pm_gen = 0;
3627 }
3628 #endif /* !SMP */
3629
3630 static void
3631 pmap_invalidate_pde_page(pmap_t pmap, vm_offset_t va, pd_entry_t pde)
3632 {
3633
3634         /*
3635          * When the PDE has PG_PROMOTED set, the 2MB page mapping was created
3636          * by a promotion that did not invalidate the 512 4KB page mappings
3637          * that might exist in the TLB.  Consequently, at this point, the TLB
3638          * may hold both 4KB and 2MB page mappings for the address range [va,
3639          * va + NBPDR).  Therefore, the entire range must be invalidated here.
3640          * In contrast, when PG_PROMOTED is clear, the TLB will not hold any
3641          * 4KB page mappings for the address range [va, va + NBPDR), and so a
3642          * single INVLPG suffices to invalidate the 2MB page mapping from the
3643          * TLB.
3644          */
3645         if ((pde & PG_PROMOTED) != 0)
3646                 pmap_invalidate_range(pmap, va, va + NBPDR - 1);
3647         else
3648                 pmap_invalidate_page(pmap, va);
3649 }
3650
3651 DEFINE_IFUNC(, void, pmap_invalidate_cache_range,
3652     (vm_offset_t sva, vm_offset_t eva))
3653 {
3654
3655         if ((cpu_feature & CPUID_SS) != 0)
3656                 return (pmap_invalidate_cache_range_selfsnoop);
3657         if ((cpu_feature & CPUID_CLFSH) != 0)
3658                 return (pmap_force_invalidate_cache_range);
3659         return (pmap_invalidate_cache_range_all);
3660 }
3661
3662 #define PMAP_CLFLUSH_THRESHOLD   (2 * 1024 * 1024)
3663
3664 static void
3665 pmap_invalidate_cache_range_check_align(vm_offset_t sva, vm_offset_t eva)
3666 {
3667
3668         KASSERT((sva & PAGE_MASK) == 0,
3669             ("pmap_invalidate_cache_range: sva not page-aligned"));
3670         KASSERT((eva & PAGE_MASK) == 0,
3671             ("pmap_invalidate_cache_range: eva not page-aligned"));
3672 }
3673
3674 static void
3675 pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva, vm_offset_t eva)
3676 {
3677
3678         pmap_invalidate_cache_range_check_align(sva, eva);
3679 }
3680
3681 void
3682 pmap_force_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva)
3683 {
3684
3685         sva &= ~(vm_offset_t)(cpu_clflush_line_size - 1);
3686
3687         /*
3688          * XXX: Some CPUs fault, hang, or trash the local APIC
3689          * registers if we use CLFLUSH on the local APIC range.  The
3690          * local APIC is always uncached, so we don't need to flush
3691          * for that range anyway.
3692          */
3693         if (pmap_kextract(sva) == lapic_paddr)
3694                 return;
3695
3696         if ((cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0) {
3697                 /*
3698                  * Do per-cache line flush.  Use a locked
3699                  * instruction to insure that previous stores are
3700                  * included in the write-back.  The processor
3701                  * propagates flush to other processors in the cache
3702                  * coherence domain.
3703                  */
3704                 atomic_thread_fence_seq_cst();
3705                 for (; sva < eva; sva += cpu_clflush_line_size)
3706                         clflushopt(sva);
3707                 atomic_thread_fence_seq_cst();
3708         } else {
3709                 /*
3710                  * Writes are ordered by CLFLUSH on Intel CPUs.
3711                  */
3712                 if (cpu_vendor_id != CPU_VENDOR_INTEL)
3713                         mfence();
3714                 for (; sva < eva; sva += cpu_clflush_line_size)
3715                         clflush(sva);
3716                 if (cpu_vendor_id != CPU_VENDOR_INTEL)
3717                         mfence();
3718         }
3719 }
3720
3721 static void
3722 pmap_invalidate_cache_range_all(vm_offset_t sva, vm_offset_t eva)
3723 {
3724
3725         pmap_invalidate_cache_range_check_align(sva, eva);
3726         pmap_invalidate_cache();
3727 }
3728
3729 /*
3730  * Remove the specified set of pages from the data and instruction caches.
3731  *
3732  * In contrast to pmap_invalidate_cache_range(), this function does not
3733  * rely on the CPU's self-snoop feature, because it is intended for use
3734  * when moving pages into a different cache domain.
3735  */
3736 void
3737 pmap_invalidate_cache_pages(vm_page_t *pages, int count)
3738 {
3739         vm_offset_t daddr, eva;
3740         int i;
3741         bool useclflushopt;
3742
3743         useclflushopt = (cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0;
3744         if (count >= PMAP_CLFLUSH_THRESHOLD / PAGE_SIZE ||
3745             ((cpu_feature & CPUID_CLFSH) == 0 && !useclflushopt))
3746                 pmap_invalidate_cache();
3747         else {
3748                 if (useclflushopt)
3749                         atomic_thread_fence_seq_cst();
3750                 else if (cpu_vendor_id != CPU_VENDOR_INTEL)
3751                         mfence();
3752                 for (i = 0; i < count; i++) {
3753                         daddr = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pages[i]));
3754                         eva = daddr + PAGE_SIZE;
3755                         for (; daddr < eva; daddr += cpu_clflush_line_size) {
3756                                 if (useclflushopt)
3757                                         clflushopt(daddr);
3758                                 else
3759                                         clflush(daddr);
3760                         }
3761                 }
3762                 if (useclflushopt)
3763                         atomic_thread_fence_seq_cst();
3764                 else if (cpu_vendor_id != CPU_VENDOR_INTEL)
3765                         mfence();
3766         }
3767 }
3768
3769 void
3770 pmap_flush_cache_range(vm_offset_t sva, vm_offset_t eva)
3771 {
3772
3773         pmap_invalidate_cache_range_check_align(sva, eva);
3774
3775         if ((cpu_stdext_feature & CPUID_STDEXT_CLWB) == 0) {
3776                 pmap_force_invalidate_cache_range(sva, eva);
3777                 return;
3778         }
3779
3780         /* See comment in pmap_force_invalidate_cache_range(). */
3781         if (pmap_kextract(sva) == lapic_paddr)
3782                 return;
3783
3784         atomic_thread_fence_seq_cst();
3785         for (; sva < eva; sva += cpu_clflush_line_size)
3786                 clwb(sva);
3787         atomic_thread_fence_seq_cst();
3788 }
3789
3790 void
3791 pmap_flush_cache_phys_range(vm_paddr_t spa, vm_paddr_t epa, vm_memattr_t mattr)
3792 {
3793         pt_entry_t *pte;
3794         vm_offset_t vaddr;
3795         int error __diagused;
3796         int pte_bits;
3797
3798         KASSERT((spa & PAGE_MASK) == 0,
3799             ("pmap_flush_cache_phys_range: spa not page-aligned"));
3800         KASSERT((epa & PAGE_MASK) == 0,
3801             ("pmap_flush_cache_phys_range: epa not page-aligned"));
3802
3803         if (spa < dmaplimit) {
3804                 pmap_flush_cache_range(PHYS_TO_DMAP(spa), PHYS_TO_DMAP(MIN(
3805                     dmaplimit, epa)));
3806                 if (dmaplimit >= epa)
3807                         return;
3808                 spa = dmaplimit;
3809         }
3810
3811         pte_bits = pmap_cache_bits(kernel_pmap, mattr, 0) | X86_PG_RW |
3812             X86_PG_V;
3813         error = vmem_alloc(kernel_arena, PAGE_SIZE, M_BESTFIT | M_WAITOK,
3814             &vaddr);
3815         KASSERT(error == 0, ("vmem_alloc failed: %d", error));
3816         pte = vtopte(vaddr);
3817         for (; spa < epa; spa += PAGE_SIZE) {
3818                 sched_pin();
3819                 pte_store(pte, spa | pte_bits);
3820                 pmap_invlpg(kernel_pmap, vaddr);
3821                 /* XXXKIB atomic inside flush_cache_range are excessive */
3822                 pmap_flush_cache_range(vaddr, vaddr + PAGE_SIZE);
3823                 sched_unpin();
3824         }
3825         vmem_free(kernel_arena, vaddr, PAGE_SIZE);
3826 }
3827
3828 /*
3829  *      Routine:        pmap_extract
3830  *      Function:
3831  *              Extract the physical page address associated
3832  *              with the given map/virtual_address pair.
3833  */
3834 vm_paddr_t 
3835 pmap_extract(pmap_t pmap, vm_offset_t va)
3836 {
3837         pdp_entry_t *pdpe;
3838         pd_entry_t *pde;
3839         pt_entry_t *pte, PG_V;
3840         vm_paddr_t pa;
3841
3842         pa = 0;
3843         PG_V = pmap_valid_bit(pmap);
3844         PMAP_LOCK(pmap);
3845         pdpe = pmap_pdpe(pmap, va);
3846         if (pdpe != NULL && (*pdpe & PG_V) != 0) {
3847                 if ((*pdpe & PG_PS) != 0)
3848                         pa = (*pdpe & PG_PS_FRAME) | (va & PDPMASK);
3849                 else {
3850                         pde = pmap_pdpe_to_pde(pdpe, va);
3851                         if ((*pde & PG_V) != 0) {
3852                                 if ((*pde & PG_PS) != 0) {
3853                                         pa = (*pde & PG_PS_FRAME) |
3854                                             (va & PDRMASK);
3855                                 } else {
3856                                         pte = pmap_pde_to_pte(pde, va);
3857                                         pa = (*pte & PG_FRAME) |
3858                                             (va & PAGE_MASK);
3859                                 }
3860                         }
3861                 }
3862         }
3863         PMAP_UNLOCK(pmap);
3864         return (pa);
3865 }
3866
3867 /*
3868  *      Routine:        pmap_extract_and_hold
3869  *      Function:
3870  *              Atomically extract and hold the physical page
3871  *              with the given pmap and virtual address pair
3872  *              if that mapping permits the given protection.
3873  */
3874 vm_page_t
3875 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
3876 {
3877         pdp_entry_t pdpe, *pdpep;
3878         pd_entry_t pde, *pdep;
3879         pt_entry_t pte, PG_RW, PG_V;
3880         vm_page_t m;
3881
3882         m = NULL;
3883         PG_RW = pmap_rw_bit(pmap);
3884         PG_V = pmap_valid_bit(pmap);
3885         PMAP_LOCK(pmap);
3886
3887         pdpep = pmap_pdpe(pmap, va);
3888         if (pdpep == NULL || ((pdpe = *pdpep) & PG_V) == 0)
3889                 goto out;
3890         if ((pdpe & PG_PS) != 0) {
3891                 if ((pdpe & PG_RW) == 0 && (prot & VM_PROT_WRITE) != 0)
3892                         goto out;
3893                 m = PHYS_TO_VM_PAGE((pdpe & PG_PS_FRAME) | (va & PDPMASK));
3894                 goto check_page;
3895         }
3896
3897         pdep = pmap_pdpe_to_pde(pdpep, va);
3898         if (pdep == NULL || ((pde = *pdep) & PG_V) == 0)
3899                 goto out;
3900         if ((pde & PG_PS) != 0) {
3901                 if ((pde & PG_RW) == 0 && (prot & VM_PROT_WRITE) != 0)
3902                         goto out;
3903                 m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | (va & PDRMASK));
3904                 goto check_page;
3905         }
3906
3907         pte = *pmap_pde_to_pte(pdep, va);
3908         if ((pte & PG_V) == 0 ||
3909             ((pte & PG_RW) == 0 && (prot & VM_PROT_WRITE) != 0))
3910                 goto out;
3911         m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
3912
3913 check_page:
3914         if (m != NULL && !vm_page_wire_mapped(m))
3915                 m = NULL;
3916 out:
3917         PMAP_UNLOCK(pmap);
3918         return (m);
3919 }
3920
3921 vm_paddr_t
3922 pmap_kextract(vm_offset_t va)
3923 {
3924         pd_entry_t pde;
3925         vm_paddr_t pa;
3926
3927         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
3928                 pa = DMAP_TO_PHYS(va);
3929         } else if (PMAP_ADDRESS_IN_LARGEMAP(va)) {
3930                 pa = pmap_large_map_kextract(va);
3931         } else {
3932                 pde = *vtopde(va);
3933                 if (pde & PG_PS) {
3934                         pa = (pde & PG_PS_FRAME) | (va & PDRMASK);
3935                 } else {
3936                         /*
3937                          * Beware of a concurrent promotion that changes the
3938                          * PDE at this point!  For example, vtopte() must not
3939                          * be used to access the PTE because it would use the
3940                          * new PDE.  It is, however, safe to use the old PDE
3941                          * because the page table page is preserved by the
3942                          * promotion.
3943                          */
3944                         pa = *pmap_pde_to_pte(&pde, va);
3945                         pa = (pa & PG_FRAME) | (va & PAGE_MASK);
3946                 }
3947         }
3948         return (pa);
3949 }
3950
3951 /***************************************************
3952  * Low level mapping routines.....
3953  ***************************************************/
3954
3955 /*
3956  * Add a wired page to the kva.
3957  * Note: not SMP coherent.
3958  */
3959 PMAP_INLINE void 
3960 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
3961 {
3962         pt_entry_t *pte;
3963
3964         pte = vtopte(va);
3965         pte_store(pte, pa | pg_g | pg_nx | X86_PG_A | X86_PG_M |
3966             X86_PG_RW | X86_PG_V);
3967 }
3968
3969 static __inline void
3970 pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
3971 {
3972         pt_entry_t *pte;
3973         int cache_bits;
3974
3975         pte = vtopte(va);
3976         cache_bits = pmap_cache_bits(kernel_pmap, mode, 0);
3977         pte_store(pte, pa | pg_g | pg_nx | X86_PG_A | X86_PG_M |
3978             X86_PG_RW | X86_PG_V | cache_bits);
3979 }
3980
3981 /*
3982  * Remove a page from the kernel pagetables.
3983  * Note: not SMP coherent.
3984  */
3985 PMAP_INLINE void
3986 pmap_kremove(vm_offset_t va)
3987 {
3988         pt_entry_t *pte;
3989
3990         pte = vtopte(va);
3991         pte_clear(pte);
3992 }
3993
3994 /*
3995  *      Used to map a range of physical addresses into kernel
3996  *      virtual address space.
3997  *
3998  *      The value passed in '*virt' is a suggested virtual address for
3999  *      the mapping. Architectures which can support a direct-mapped
4000  *      physical to virtual region can return the appropriate address
4001  *      within that region, leaving '*virt' unchanged. Other
4002  *      architectures should map the pages starting at '*virt' and
4003  *      update '*virt' with the first usable address after the mapped
4004  *      region.
4005  */
4006 vm_offset_t
4007 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
4008 {
4009         return PHYS_TO_DMAP(start);
4010 }
4011
4012 /*
4013  * Add a list of wired pages to the kva
4014  * this routine is only used for temporary
4015  * kernel mappings that do not need to have
4016  * page modification or references recorded.
4017  * Note that old mappings are simply written
4018  * over.  The page *must* be wired.
4019  * Note: SMP coherent.  Uses a ranged shootdown IPI.
4020  */
4021 void
4022 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
4023 {
4024         pt_entry_t *endpte, oldpte, pa, *pte;
4025         vm_page_t m;
4026         int cache_bits;
4027
4028         oldpte = 0;
4029         pte = vtopte(sva);
4030         endpte = pte + count;
4031         while (pte < endpte) {
4032                 m = *ma++;
4033                 cache_bits = pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0);
4034                 pa = VM_PAGE_TO_PHYS(m) | cache_bits;
4035                 if ((*pte & (PG_FRAME | X86_PG_PTE_CACHE)) != pa) {
4036                         oldpte |= *pte;
4037                         pte_store(pte, pa | pg_g | pg_nx | X86_PG_A |
4038                             X86_PG_M | X86_PG_RW | X86_PG_V);
4039                 }
4040                 pte++;
4041         }
4042         if (__predict_false((oldpte & X86_PG_V) != 0))
4043                 pmap_invalidate_range(kernel_pmap, sva, sva + count *
4044                     PAGE_SIZE);
4045 }
4046
4047 /*
4048  * This routine tears out page mappings from the
4049  * kernel -- it is meant only for temporary mappings.
4050  * Note: SMP coherent.  Uses a ranged shootdown IPI.
4051  */
4052 void
4053 pmap_qremove(vm_offset_t sva, int count)
4054 {
4055         vm_offset_t va;
4056
4057         va = sva;
4058         while (count-- > 0) {
4059                 KASSERT(va >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", va));
4060                 pmap_kremove(va);
4061                 va += PAGE_SIZE;
4062         }
4063         pmap_invalidate_range(kernel_pmap, sva, va);
4064 }
4065
4066 /***************************************************
4067  * Page table page management routines.....
4068  ***************************************************/
4069 /*
4070  * Schedule the specified unused page table page to be freed.  Specifically,
4071  * add the page to the specified list of pages that will be released to the
4072  * physical memory manager after the TLB has been updated.
4073  */
4074 static __inline void
4075 pmap_add_delayed_free_list(vm_page_t m, struct spglist *free,
4076     boolean_t set_PG_ZERO)
4077 {
4078
4079         if (set_PG_ZERO)
4080                 m->flags |= PG_ZERO;
4081         else
4082                 m->flags &= ~PG_ZERO;
4083         SLIST_INSERT_HEAD(free, m, plinks.s.ss);
4084 }
4085
4086 /*
4087  * Inserts the specified page table page into the specified pmap's collection
4088  * of idle page table pages.  Each of a pmap's page table pages is responsible
4089  * for mapping a distinct range of virtual addresses.  The pmap's collection is
4090  * ordered by this virtual address range.
4091  *
4092  * If "promoted" is false, then the page table page "mpte" must be zero filled;
4093  * "mpte"'s valid field will be set to 0.
4094  *
4095  * If "promoted" is true and "allpte_PG_A_set" is false, then "mpte" must
4096  * contain valid mappings with identical attributes except for PG_A; "mpte"'s
4097  * valid field will be set to 1.
4098  *
4099  * If "promoted" and "allpte_PG_A_set" are both true, then "mpte" must contain
4100  * valid mappings with identical attributes including PG_A; "mpte"'s valid
4101  * field will be set to VM_PAGE_BITS_ALL.
4102  */
4103 static __inline int
4104 pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte, bool promoted,
4105     bool allpte_PG_A_set)
4106 {
4107
4108         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4109         KASSERT(promoted || !allpte_PG_A_set,
4110             ("a zero-filled PTP can't have PG_A set in every PTE"));
4111         mpte->valid = promoted ? (allpte_PG_A_set ? VM_PAGE_BITS_ALL : 1) : 0;
4112         return (vm_radix_insert(&pmap->pm_root, mpte));
4113 }
4114
4115 /*
4116  * Removes the page table page mapping the specified virtual address from the
4117  * specified pmap's collection of idle page table pages, and returns it.
4118  * Otherwise, returns NULL if there is no page table page corresponding to the
4119  * specified virtual address.
4120  */
4121 static __inline vm_page_t
4122 pmap_remove_pt_page(pmap_t pmap, vm_offset_t va)
4123 {
4124
4125         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4126         return (vm_radix_remove(&pmap->pm_root, pmap_pde_pindex(va)));
4127 }
4128
4129 /*
4130  * Decrements a page table page's reference count, which is used to record the
4131  * number of valid page table entries within the page.  If the reference count
4132  * drops to zero, then the page table page is unmapped.  Returns TRUE if the
4133  * page table page was unmapped and FALSE otherwise.
4134  */
4135 static inline boolean_t
4136 pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
4137 {
4138
4139         --m->ref_count;
4140         if (m->ref_count == 0) {
4141                 _pmap_unwire_ptp(pmap, va, m, free);
4142                 return (TRUE);
4143         } else
4144                 return (FALSE);
4145 }
4146
4147 static void
4148 _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
4149 {
4150         pml5_entry_t *pml5;
4151         pml4_entry_t *pml4;
4152         pdp_entry_t *pdp;
4153         pd_entry_t *pd;
4154         vm_page_t pdpg, pdppg, pml4pg;
4155
4156         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4157
4158         /*
4159          * unmap the page table page
4160          */
4161         if (m->pindex >= NUPDE + NUPDPE + NUPML4E) {
4162                 /* PML4 page */
4163                 MPASS(pmap_is_la57(pmap));
4164                 pml5 = pmap_pml5e(pmap, va);
4165                 *pml5 = 0;
4166                 if (pmap->pm_pmltopu != NULL && va <= VM_MAXUSER_ADDRESS) {
4167                         pml5 = pmap_pml5e_u(pmap, va);
4168                         *pml5 = 0;
4169                 }
4170         } else if (m->pindex >= NUPDE + NUPDPE) {
4171                 /* PDP page */
4172                 pml4 = pmap_pml4e(pmap, va);
4173                 *pml4 = 0;
4174                 if (!pmap_is_la57(pmap) && pmap->pm_pmltopu != NULL &&
4175                     va <= VM_MAXUSER_ADDRESS) {
4176                         pml4 = pmap_pml4e_u(pmap, va);
4177                         *pml4 = 0;
4178                 }
4179         } else if (m->pindex >= NUPDE) {
4180                 /* PD page */
4181                 pdp = pmap_pdpe(pmap, va);
4182                 *pdp = 0;
4183         } else {
4184                 /* PTE page */
4185                 pd = pmap_pde(pmap, va);
4186                 *pd = 0;
4187         }
4188         if (m->pindex < NUPDE) {
4189                 /* We just released a PT, unhold the matching PD */
4190                 pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME);
4191                 pmap_unwire_ptp(pmap, va, pdpg, free);
4192         } else if (m->pindex < NUPDE + NUPDPE) {
4193                 /* We just released a PD, unhold the matching PDP */
4194                 pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & PG_FRAME);
4195                 pmap_unwire_ptp(pmap, va, pdppg, free);
4196         } else if (m->pindex < NUPDE + NUPDPE + NUPML4E && pmap_is_la57(pmap)) {
4197                 /* We just released a PDP, unhold the matching PML4 */
4198                 pml4pg = PHYS_TO_VM_PAGE(*pmap_pml5e(pmap, va) & PG_FRAME);
4199                 pmap_unwire_ptp(pmap, va, pml4pg, free);
4200         }
4201
4202         pmap_pt_page_count_adj(pmap, -1);
4203
4204         /* 
4205          * Put page on a list so that it is released after
4206          * *ALL* TLB shootdown is done
4207          */
4208         pmap_add_delayed_free_list(m, free, TRUE);
4209 }
4210
4211 /*
4212  * After removing a page table entry, this routine is used to
4213  * conditionally free the page, and manage the reference count.
4214  */
4215 static int
4216 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde,
4217     struct spglist *free)
4218 {
4219         vm_page_t mpte;
4220
4221         if (va >= VM_MAXUSER_ADDRESS)
4222                 return (0);
4223         KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
4224         mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
4225         return (pmap_unwire_ptp(pmap, va, mpte, free));
4226 }
4227
4228 /*
4229  * Release a page table page reference after a failed attempt to create a
4230  * mapping.
4231  */
4232 static void
4233 pmap_abort_ptp(pmap_t pmap, vm_offset_t va, vm_page_t mpte)
4234 {
4235         struct spglist free;
4236
4237         SLIST_INIT(&free);
4238         if (pmap_unwire_ptp(pmap, va, mpte, &free)) {
4239                 /*
4240                  * Although "va" was never mapped, paging-structure caches
4241                  * could nonetheless have entries that refer to the freed
4242                  * page table pages.  Invalidate those entries.
4243                  */
4244                 pmap_invalidate_page(pmap, va);
4245                 vm_page_free_pages_toq(&free, true);
4246         }
4247 }
4248
4249 static void
4250 pmap_pinit_pcids(pmap_t pmap, uint32_t pcid, int gen)
4251 {
4252         struct pmap_pcid *pcidp;
4253         int i;
4254
4255         CPU_FOREACH(i) {
4256                 pcidp = zpcpu_get_cpu(pmap->pm_pcidp, i);
4257                 pcidp->pm_pcid = pcid;
4258                 pcidp->pm_gen = gen;
4259         }
4260 }
4261
4262 void
4263 pmap_pinit0(pmap_t pmap)
4264 {
4265         struct proc *p;
4266         struct thread *td;
4267
4268         PMAP_LOCK_INIT(pmap);
4269         pmap->pm_pmltop = kernel_pmap->pm_pmltop;
4270         pmap->pm_pmltopu = NULL;
4271         pmap->pm_cr3 = kernel_pmap->pm_cr3;
4272         /* hack to keep pmap_pti_pcid_invalidate() alive */
4273         pmap->pm_ucr3 = PMAP_NO_CR3;
4274         vm_radix_init(&pmap->pm_root);
4275         CPU_ZERO(&pmap->pm_active);
4276         TAILQ_INIT(&pmap->pm_pvchunk);
4277         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
4278         pmap->pm_flags = pmap_flags;
4279         pmap->pm_pcidp = uma_zalloc_pcpu(pcpu_zone_8, M_WAITOK);
4280         pmap_pinit_pcids(pmap, PMAP_PCID_KERN + 1, 1);
4281         pmap_activate_boot(pmap);
4282         td = curthread;
4283         if (pti) {
4284                 p = td->td_proc;
4285                 PROC_LOCK(p);
4286                 p->p_md.md_flags |= P_MD_KPTI;
4287                 PROC_UNLOCK(p);
4288         }
4289         pmap_thread_init_invl_gen(td);
4290
4291         if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
4292                 pmap_pkru_ranges_zone = uma_zcreate("pkru ranges",
4293                     sizeof(struct pmap_pkru_range), NULL, NULL, NULL, NULL,
4294                     UMA_ALIGN_PTR, 0);
4295         }
4296 }
4297
4298 void
4299 pmap_pinit_pml4(vm_page_t pml4pg)
4300 {
4301         pml4_entry_t *pm_pml4;
4302         int i;
4303
4304         pm_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4pg));
4305
4306         /* Wire in kernel global address entries. */
4307         for (i = 0; i < NKPML4E; i++) {
4308                 pm_pml4[KPML4BASE + i] = (KPDPphys + ptoa(i)) | X86_PG_RW |
4309                     X86_PG_V;
4310         }
4311 #ifdef KASAN
4312         for (i = 0; i < NKASANPML4E; i++) {
4313                 pm_pml4[KASANPML4I + i] = (KASANPDPphys + ptoa(i)) | X86_PG_RW |
4314                     X86_PG_V | pg_nx;
4315         }
4316 #endif
4317 #ifdef KMSAN
4318         for (i = 0; i < NKMSANSHADPML4E; i++) {
4319                 pm_pml4[KMSANSHADPML4I + i] = (KMSANSHADPDPphys + ptoa(i)) |
4320                     X86_PG_RW | X86_PG_V | pg_nx;
4321         }
4322         for (i = 0; i < NKMSANORIGPML4E; i++) {
4323                 pm_pml4[KMSANORIGPML4I + i] = (KMSANORIGPDPphys + ptoa(i)) |
4324                     X86_PG_RW | X86_PG_V | pg_nx;
4325         }
4326 #endif
4327         for (i = 0; i < ndmpdpphys; i++) {
4328                 pm_pml4[DMPML4I + i] = (DMPDPphys + ptoa(i)) | X86_PG_RW |
4329                     X86_PG_V;
4330         }
4331
4332         /* install self-referential address mapping entry(s) */
4333         pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | X86_PG_V | X86_PG_RW |
4334             X86_PG_A | X86_PG_M;
4335
4336         /* install large map entries if configured */
4337         for (i = 0; i < lm_ents; i++)
4338                 pm_pml4[LMSPML4I + i] = kernel_pmap->pm_pmltop[LMSPML4I + i];
4339 }
4340
4341 void
4342 pmap_pinit_pml5(vm_page_t pml5pg)
4343 {
4344         pml5_entry_t *pm_pml5;
4345
4346         pm_pml5 = (pml5_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml5pg));
4347
4348         /*
4349          * Add pml5 entry at top of KVA pointing to existing pml4 table,
4350          * entering all existing kernel mappings into level 5 table.
4351          */
4352         pm_pml5[pmap_pml5e_index(UPT_MAX_ADDRESS)] = KPML4phys | X86_PG_V |
4353             X86_PG_RW | X86_PG_A | X86_PG_M | pg_g |
4354             pmap_cache_bits(kernel_pmap, VM_MEMATTR_DEFAULT, FALSE);
4355
4356         /* 
4357          * Install self-referential address mapping entry.
4358          */
4359         pm_pml5[PML5PML5I] = VM_PAGE_TO_PHYS(pml5pg) |
4360             X86_PG_RW | X86_PG_V | X86_PG_M | X86_PG_A |
4361             pmap_cache_bits(kernel_pmap, VM_MEMATTR_DEFAULT, FALSE);
4362 }
4363
4364 static void
4365 pmap_pinit_pml4_pti(vm_page_t pml4pgu)
4366 {
4367         pml4_entry_t *pm_pml4u;
4368         int i;
4369
4370         pm_pml4u = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4pgu));
4371         for (i = 0; i < NPML4EPG; i++)
4372                 pm_pml4u[i] = pti_pml4[i];
4373 }
4374
4375 static void
4376 pmap_pinit_pml5_pti(vm_page_t pml5pgu)
4377 {
4378         pml5_entry_t *pm_pml5u;
4379
4380         pm_pml5u = (pml5_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml5pgu));
4381         pagezero(pm_pml5u);
4382
4383         /*
4384          * Add pml5 entry at top of KVA pointing to existing pml4 pti
4385          * table, entering all kernel mappings needed for usermode
4386          * into level 5 table.
4387          */
4388         pm_pml5u[pmap_pml5e_index(UPT_MAX_ADDRESS)] =
4389             pmap_kextract((vm_offset_t)pti_pml4) |
4390             X86_PG_V | X86_PG_RW | X86_PG_A | X86_PG_M | pg_g |
4391             pmap_cache_bits(kernel_pmap, VM_MEMATTR_DEFAULT, FALSE);
4392 }
4393
4394 /* Allocate a page table page and do related bookkeeping */
4395 static vm_page_t
4396 pmap_alloc_pt_page(pmap_t pmap, vm_pindex_t pindex, int flags)
4397 {
4398         vm_page_t m;
4399
4400         m = vm_page_alloc_noobj(flags);
4401         if (__predict_false(m == NULL))
4402                 return (NULL);
4403         m->pindex = pindex;
4404         pmap_pt_page_count_adj(pmap, 1);
4405         return (m);
4406 }
4407
4408 static void
4409 pmap_free_pt_page(pmap_t pmap, vm_page_t m, bool zerofilled)
4410 {
4411         /*
4412          * This function assumes the page will need to be unwired,
4413          * even though the counterpart allocation in pmap_alloc_pt_page()
4414          * doesn't enforce VM_ALLOC_WIRED.  However, all current uses
4415          * of pmap_free_pt_page() require unwiring.  The case in which
4416          * a PT page doesn't require unwiring because its ref_count has
4417          * naturally reached 0 is handled through _pmap_unwire_ptp().
4418          */
4419         vm_page_unwire_noq(m);
4420         if (zerofilled)
4421                 vm_page_free_zero(m);
4422         else
4423                 vm_page_free(m);
4424
4425         pmap_pt_page_count_adj(pmap, -1);
4426 }
4427
4428 _Static_assert(sizeof(struct pmap_pcid) == 8, "Fix pcpu zone for pm_pcidp");
4429
4430 /*
4431  * Initialize a preallocated and zeroed pmap structure,
4432  * such as one in a vmspace structure.
4433  */
4434 int
4435 pmap_pinit_type(pmap_t pmap, enum pmap_type pm_type, int flags)
4436 {
4437         vm_page_t pmltop_pg, pmltop_pgu;
4438         vm_paddr_t pmltop_phys;
4439
4440         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
4441
4442         /*
4443          * Allocate the page directory page.  Pass NULL instead of a
4444          * pointer to the pmap here to avoid calling
4445          * pmap_resident_count_adj() through pmap_pt_page_count_adj(),
4446          * since that requires pmap lock.  Instead do the accounting
4447          * manually.
4448          *
4449          * Note that final call to pmap_remove() optimization that
4450          * checks for zero resident_count is basically disabled by
4451          * accounting for top-level page.  But the optimization was
4452          * not effective since we started using non-managed mapping of
4453          * the shared page.
4454          */
4455         pmltop_pg = pmap_alloc_pt_page(NULL, 0, VM_ALLOC_WIRED | VM_ALLOC_ZERO |
4456             VM_ALLOC_WAITOK);
4457         pmap_pt_page_count_pinit(pmap, 1);
4458
4459         pmltop_phys = VM_PAGE_TO_PHYS(pmltop_pg);
4460         pmap->pm_pmltop = (pml5_entry_t *)PHYS_TO_DMAP(pmltop_phys);
4461
4462         if (pmap_pcid_enabled) {
4463                 if (pmap->pm_pcidp == NULL)
4464                         pmap->pm_pcidp = uma_zalloc_pcpu(pcpu_zone_8,
4465                             M_WAITOK);
4466                 pmap_pinit_pcids(pmap, PMAP_PCID_NONE, 0);
4467         }
4468         pmap->pm_cr3 = PMAP_NO_CR3;     /* initialize to an invalid value */
4469         pmap->pm_ucr3 = PMAP_NO_CR3;
4470         pmap->pm_pmltopu = NULL;
4471
4472         pmap->pm_type = pm_type;
4473
4474         /*
4475          * Do not install the host kernel mappings in the nested page
4476          * tables. These mappings are meaningless in the guest physical
4477          * address space.
4478          * Install minimal kernel mappings in PTI case.
4479          */
4480         switch (pm_type) {
4481         case PT_X86:
4482                 pmap->pm_cr3 = pmltop_phys;
4483                 if (pmap_is_la57(pmap))
4484                         pmap_pinit_pml5(pmltop_pg);
4485                 else
4486                         pmap_pinit_pml4(pmltop_pg);
4487                 if ((curproc->p_md.md_flags & P_MD_KPTI) != 0) {
4488                         /*
4489                          * As with pmltop_pg, pass NULL instead of a
4490                          * pointer to the pmap to ensure that the PTI
4491                          * page counted explicitly.
4492                          */
4493                         pmltop_pgu = pmap_alloc_pt_page(NULL, 0,
4494                             VM_ALLOC_WIRED | VM_ALLOC_WAITOK);
4495                         pmap_pt_page_count_pinit(pmap, 1);
4496                         pmap->pm_pmltopu = (pml4_entry_t *)PHYS_TO_DMAP(
4497                             VM_PAGE_TO_PHYS(pmltop_pgu));
4498                         if (pmap_is_la57(pmap))
4499                                 pmap_pinit_pml5_pti(pmltop_pgu);
4500                         else
4501                                 pmap_pinit_pml4_pti(pmltop_pgu);
4502                         pmap->pm_ucr3 = VM_PAGE_TO_PHYS(pmltop_pgu);
4503                 }
4504                 if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
4505                         rangeset_init(&pmap->pm_pkru, pkru_dup_range,
4506                             pkru_free_range, pmap, M_NOWAIT);
4507                 }
4508                 break;
4509         case PT_EPT:
4510         case PT_RVI:
4511                 pmap->pm_eptsmr = smr_create("pmap", 0, 0);
4512                 break;
4513         }
4514
4515         vm_radix_init(&pmap->pm_root);
4516         CPU_ZERO(&pmap->pm_active);
4517         TAILQ_INIT(&pmap->pm_pvchunk);
4518         pmap->pm_flags = flags;
4519         pmap->pm_eptgen = 0;
4520
4521         return (1);
4522 }
4523
4524 int
4525 pmap_pinit(pmap_t pmap)
4526 {
4527
4528         return (pmap_pinit_type(pmap, PT_X86, pmap_flags));
4529 }
4530
4531 static void
4532 pmap_allocpte_free_unref(pmap_t pmap, vm_offset_t va, pt_entry_t *pte)
4533 {
4534         vm_page_t mpg;
4535         struct spglist free;
4536
4537         mpg = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
4538         if (mpg->ref_count != 0)
4539                 return;
4540         SLIST_INIT(&free);
4541         _pmap_unwire_ptp(pmap, va, mpg, &free);
4542         pmap_invalidate_page(pmap, va);
4543         vm_page_free_pages_toq(&free, true);
4544 }
4545
4546 static pml4_entry_t *
4547 pmap_allocpte_getpml4(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,
4548     bool addref)
4549 {
4550         vm_pindex_t pml5index;
4551         pml5_entry_t *pml5;
4552         pml4_entry_t *pml4;
4553         vm_page_t pml4pg;
4554         pt_entry_t PG_V;
4555         bool allocated;
4556
4557         if (!pmap_is_la57(pmap))
4558                 return (&pmap->pm_pmltop[pmap_pml4e_index(va)]);
4559
4560         PG_V = pmap_valid_bit(pmap);
4561         pml5index = pmap_pml5e_index(va);
4562         pml5 = &pmap->pm_pmltop[pml5index];
4563         if ((*pml5 & PG_V) == 0) {
4564                 if (pmap_allocpte_nosleep(pmap, pmap_pml5e_pindex(va), lockp,
4565                     va) == NULL)
4566                         return (NULL);
4567                 allocated = true;
4568         } else {
4569                 allocated = false;
4570         }
4571         pml4 = (pml4_entry_t *)PHYS_TO_DMAP(*pml5 & PG_FRAME);
4572         pml4 = &pml4[pmap_pml4e_index(va)];
4573         if ((*pml4 & PG_V) == 0) {
4574                 pml4pg = PHYS_TO_VM_PAGE(*pml5 & PG_FRAME);
4575                 if (allocated && !addref)
4576                         pml4pg->ref_count--;
4577                 else if (!allocated && addref)
4578                         pml4pg->ref_count++;
4579         }
4580         return (pml4);
4581 }
4582
4583 static pdp_entry_t *
4584 pmap_allocpte_getpdp(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,
4585     bool addref)
4586 {
4587         vm_page_t pdppg;
4588         pml4_entry_t *pml4;
4589         pdp_entry_t *pdp;
4590         pt_entry_t PG_V;
4591         bool allocated;
4592
4593         PG_V = pmap_valid_bit(pmap);
4594
4595         pml4 = pmap_allocpte_getpml4(pmap, lockp, va, false);
4596         if (pml4 == NULL)
4597                 return (NULL);
4598
4599         if ((*pml4 & PG_V) == 0) {
4600                 /* Have to allocate a new pdp, recurse */
4601                 if (pmap_allocpte_nosleep(pmap, pmap_pml4e_pindex(va), lockp,
4602                     va) == NULL) {
4603                         if (pmap_is_la57(pmap))
4604                                 pmap_allocpte_free_unref(pmap, va,
4605                                     pmap_pml5e(pmap, va));
4606                         return (NULL);
4607                 }
4608                 allocated = true;
4609         } else {
4610                 allocated = false;
4611         }
4612         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
4613         pdp = &pdp[pmap_pdpe_index(va)];
4614         if ((*pdp & PG_V) == 0) {
4615                 pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME);
4616                 if (allocated && !addref)
4617                         pdppg->ref_count--;
4618                 else if (!allocated && addref)
4619                         pdppg->ref_count++;
4620         }
4621         return (pdp);
4622 }
4623
4624 /*
4625  * The ptepindexes, i.e. page indices, of the page table pages encountered
4626  * while translating virtual address va are defined as follows:
4627  * - for the page table page (last level),
4628  *      ptepindex = pmap_pde_pindex(va) = va >> PDRSHIFT,
4629  *   in other words, it is just the index of the PDE that maps the page
4630  *   table page.
4631  * - for the page directory page,
4632  *      ptepindex = NUPDE (number of userland PD entries) +
4633  *          (pmap_pde_index(va) >> NPDEPGSHIFT)
4634  *   i.e. index of PDPE is put after the last index of PDE,
4635  * - for the page directory pointer page,
4636  *      ptepindex = NUPDE + NUPDPE + (pmap_pde_index(va) >> (NPDEPGSHIFT +
4637  *          NPML4EPGSHIFT),
4638  *   i.e. index of pml4e is put after the last index of PDPE,
4639  * - for the PML4 page (if LA57 mode is enabled),
4640  *      ptepindex = NUPDE + NUPDPE + NUPML4E + (pmap_pde_index(va) >>
4641  *          (NPDEPGSHIFT + NPML4EPGSHIFT + NPML5EPGSHIFT),
4642  *   i.e. index of pml5e is put after the last index of PML4E.
4643  *
4644  * Define an order on the paging entries, where all entries of the
4645  * same height are put together, then heights are put from deepest to
4646  * root.  Then ptexpindex is the sequential number of the
4647  * corresponding paging entry in this order.
4648  *
4649  * The values of NUPDE, NUPDPE, and NUPML4E are determined by the size of
4650  * LA57 paging structures even in LA48 paging mode. Moreover, the
4651  * ptepindexes are calculated as if the paging structures were 5-level
4652  * regardless of the actual mode of operation.
4653  *
4654  * The root page at PML4/PML5 does not participate in this indexing scheme,
4655  * since it is statically allocated by pmap_pinit() and not by pmap_allocpte().
4656  */
4657 static vm_page_t
4658 pmap_allocpte_nosleep(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp,
4659     vm_offset_t va)
4660 {
4661         vm_pindex_t pml5index, pml4index;
4662         pml5_entry_t *pml5, *pml5u;
4663         pml4_entry_t *pml4, *pml4u;
4664         pdp_entry_t *pdp;
4665         pd_entry_t *pd;
4666         vm_page_t m, pdpg;
4667         pt_entry_t PG_A, PG_M, PG_RW, PG_V;
4668
4669         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4670
4671         PG_A = pmap_accessed_bit(pmap);
4672         PG_M = pmap_modified_bit(pmap);
4673         PG_V = pmap_valid_bit(pmap);
4674         PG_RW = pmap_rw_bit(pmap);
4675
4676         /*
4677          * Allocate a page table page.
4678          */
4679         m = pmap_alloc_pt_page(pmap, ptepindex,
4680             VM_ALLOC_WIRED | VM_ALLOC_ZERO);
4681         if (m == NULL)
4682                 return (NULL);
4683
4684         /*
4685          * Map the pagetable page into the process address space, if
4686          * it isn't already there.
4687          */
4688         if (ptepindex >= NUPDE + NUPDPE + NUPML4E) {
4689                 MPASS(pmap_is_la57(pmap));
4690
4691                 pml5index = pmap_pml5e_index(va);
4692                 pml5 = &pmap->pm_pmltop[pml5index];
4693                 KASSERT((*pml5 & PG_V) == 0,
4694                     ("pmap %p va %#lx pml5 %#lx", pmap, va, *pml5));
4695                 *pml5 = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4696
4697                 if (pmap->pm_pmltopu != NULL && pml5index < NUPML5E) {
4698                         if (pmap->pm_ucr3 != PMAP_NO_CR3)
4699                                 *pml5 |= pg_nx;
4700
4701                         pml5u = &pmap->pm_pmltopu[pml5index];
4702                         *pml5u = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V |
4703                             PG_A | PG_M;
4704                 }
4705         } else if (ptepindex >= NUPDE + NUPDPE) {
4706                 pml4index = pmap_pml4e_index(va);
4707                 /* Wire up a new PDPE page */
4708                 pml4 = pmap_allocpte_getpml4(pmap, lockp, va, true);
4709                 if (pml4 == NULL) {
4710                         pmap_free_pt_page(pmap, m, true);
4711                         return (NULL);
4712                 }
4713                 KASSERT((*pml4 & PG_V) == 0,
4714                     ("pmap %p va %#lx pml4 %#lx", pmap, va, *pml4));
4715                 *pml4 = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4716
4717                 if (!pmap_is_la57(pmap) && pmap->pm_pmltopu != NULL &&
4718                     pml4index < NUPML4E) {
4719                         /*
4720                          * PTI: Make all user-space mappings in the
4721                          * kernel-mode page table no-execute so that
4722                          * we detect any programming errors that leave
4723                          * the kernel-mode page table active on return
4724                          * to user space.
4725                          */
4726                         if (pmap->pm_ucr3 != PMAP_NO_CR3)
4727                                 *pml4 |= pg_nx;
4728
4729                         pml4u = &pmap->pm_pmltopu[pml4index];
4730                         *pml4u = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V |
4731                             PG_A | PG_M;
4732                 }
4733         } else if (ptepindex >= NUPDE) {
4734                 /* Wire up a new PDE page */
4735                 pdp = pmap_allocpte_getpdp(pmap, lockp, va, true);
4736                 if (pdp == NULL) {
4737                         pmap_free_pt_page(pmap, m, true);
4738                         return (NULL);
4739                 }
4740                 KASSERT((*pdp & PG_V) == 0,
4741                     ("pmap %p va %#lx pdp %#lx", pmap, va, *pdp));
4742                 *pdp = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4743         } else {
4744                 /* Wire up a new PTE page */
4745                 pdp = pmap_allocpte_getpdp(pmap, lockp, va, false);
4746                 if (pdp == NULL) {
4747                         pmap_free_pt_page(pmap, m, true);
4748                         return (NULL);
4749                 }
4750                 if ((*pdp & PG_V) == 0) {
4751                         /* Have to allocate a new pd, recurse */
4752                   if (pmap_allocpte_nosleep(pmap, pmap_pdpe_pindex(va),
4753                       lockp, va) == NULL) {
4754                                 pmap_allocpte_free_unref(pmap, va,
4755                                     pmap_pml4e(pmap, va));
4756                                 pmap_free_pt_page(pmap, m, true);
4757                                 return (NULL);
4758                         }
4759                 } else {
4760                         /* Add reference to the pd page */
4761                         pdpg = PHYS_TO_VM_PAGE(*pdp & PG_FRAME);
4762                         pdpg->ref_count++;
4763                 }
4764                 pd = (pd_entry_t *)PHYS_TO_DMAP(*pdp & PG_FRAME);
4765
4766                 /* Now we know where the page directory page is */
4767                 pd = &pd[pmap_pde_index(va)];
4768                 KASSERT((*pd & PG_V) == 0,
4769                     ("pmap %p va %#lx pd %#lx", pmap, va, *pd));
4770                 *pd = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4771         }
4772
4773         return (m);
4774 }
4775
4776 /*
4777  * This routine is called if the desired page table page does not exist.
4778  *
4779  * If page table page allocation fails, this routine may sleep before
4780  * returning NULL.  It sleeps only if a lock pointer was given.  Sleep
4781  * occurs right before returning to the caller. This way, we never
4782  * drop pmap lock to sleep while a page table page has ref_count == 0,
4783  * which prevents the page from being freed under us.
4784  */
4785 static vm_page_t
4786 pmap_allocpte_alloc(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp,
4787     vm_offset_t va)
4788 {
4789         vm_page_t m;
4790
4791         m = pmap_allocpte_nosleep(pmap, ptepindex, lockp, va);
4792         if (m == NULL && lockp != NULL) {
4793                 RELEASE_PV_LIST_LOCK(lockp);
4794                 PMAP_UNLOCK(pmap);
4795                 PMAP_ASSERT_NOT_IN_DI();
4796                 vm_wait(NULL);
4797                 PMAP_LOCK(pmap);
4798         }
4799         return (m);
4800 }
4801
4802 static pd_entry_t *
4803 pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp,
4804     struct rwlock **lockp)
4805 {
4806         pdp_entry_t *pdpe, PG_V;
4807         pd_entry_t *pde;
4808         vm_page_t pdpg;
4809         vm_pindex_t pdpindex;
4810
4811         PG_V = pmap_valid_bit(pmap);
4812
4813 retry:
4814         pdpe = pmap_pdpe(pmap, va);
4815         if (pdpe != NULL && (*pdpe & PG_V) != 0) {
4816                 pde = pmap_pdpe_to_pde(pdpe, va);
4817                 if (va < VM_MAXUSER_ADDRESS) {
4818                         /* Add a reference to the pd page. */
4819                         pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
4820                         pdpg->ref_count++;
4821                 } else
4822                         pdpg = NULL;
4823         } else if (va < VM_MAXUSER_ADDRESS) {
4824                 /* Allocate a pd page. */
4825                 pdpindex = pmap_pde_pindex(va) >> NPDPEPGSHIFT;
4826                 pdpg = pmap_allocpte_alloc(pmap, NUPDE + pdpindex, lockp, va);
4827                 if (pdpg == NULL) {
4828                         if (lockp != NULL)
4829                                 goto retry;
4830                         else
4831                                 return (NULL);
4832                 }
4833                 pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg));
4834                 pde = &pde[pmap_pde_index(va)];
4835         } else
4836                 panic("pmap_alloc_pde: missing page table page for va %#lx",
4837                     va);
4838         *pdpgp = pdpg;
4839         return (pde);
4840 }
4841
4842 static vm_page_t
4843 pmap_allocpte(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
4844 {
4845         vm_pindex_t ptepindex;
4846         pd_entry_t *pd, PG_V;
4847         vm_page_t m;
4848
4849         PG_V = pmap_valid_bit(pmap);
4850
4851         /*
4852          * Calculate pagetable page index
4853          */
4854         ptepindex = pmap_pde_pindex(va);
4855 retry:
4856         /*
4857          * Get the page directory entry
4858          */
4859         pd = pmap_pde(pmap, va);
4860
4861         /*
4862          * This supports switching from a 2MB page to a
4863          * normal 4K page.
4864          */
4865         if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
4866                 if (!pmap_demote_pde_locked(pmap, pd, va, lockp)) {
4867                         /*
4868                          * Invalidation of the 2MB page mapping may have caused
4869                          * the deallocation of the underlying PD page.
4870                          */
4871                         pd = NULL;
4872                 }
4873         }
4874
4875         /*
4876          * If the page table page is mapped, we just increment the
4877          * hold count, and activate it.
4878          */
4879         if (pd != NULL && (*pd & PG_V) != 0) {
4880                 m = PHYS_TO_VM_PAGE(*pd & PG_FRAME);
4881                 m->ref_count++;
4882         } else {
4883                 /*
4884                  * Here if the pte page isn't mapped, or if it has been
4885                  * deallocated.
4886                  */
4887                 m = pmap_allocpte_alloc(pmap, ptepindex, lockp, va);
4888                 if (m == NULL && lockp != NULL)
4889                         goto retry;
4890         }
4891         return (m);
4892 }
4893
4894 /***************************************************
4895  * Pmap allocation/deallocation routines.
4896  ***************************************************/
4897
4898 /*
4899  * Release any resources held by the given physical map.
4900  * Called when a pmap initialized by pmap_pinit is being released.
4901  * Should only be called if the map contains no valid mappings.
4902  */
4903 void
4904 pmap_release(pmap_t pmap)
4905 {
4906         vm_page_t m;
4907         int i;
4908
4909         KASSERT(vm_radix_is_empty(&pmap->pm_root),
4910             ("pmap_release: pmap %p has reserved page table page(s)",
4911             pmap));
4912         KASSERT(CPU_EMPTY(&pmap->pm_active),
4913             ("releasing active pmap %p", pmap));
4914
4915         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_pmltop));
4916
4917         if (pmap_is_la57(pmap)) {
4918                 pmap->pm_pmltop[pmap_pml5e_index(UPT_MAX_ADDRESS)] = 0;
4919                 pmap->pm_pmltop[PML5PML5I] = 0;
4920         } else {
4921                 for (i = 0; i < NKPML4E; i++)   /* KVA */
4922                         pmap->pm_pmltop[KPML4BASE + i] = 0;
4923 #ifdef KASAN
4924                 for (i = 0; i < NKASANPML4E; i++) /* KASAN shadow map */
4925                         pmap->pm_pmltop[KASANPML4I + i] = 0;
4926 #endif
4927 #ifdef KMSAN
4928                 for (i = 0; i < NKMSANSHADPML4E; i++) /* KMSAN shadow map */
4929                         pmap->pm_pmltop[KMSANSHADPML4I + i] = 0;
4930                 for (i = 0; i < NKMSANORIGPML4E; i++) /* KMSAN shadow map */
4931                         pmap->pm_pmltop[KMSANORIGPML4I + i] = 0;
4932 #endif
4933                 for (i = 0; i < ndmpdpphys; i++)/* Direct Map */
4934                         pmap->pm_pmltop[DMPML4I + i] = 0;
4935                 pmap->pm_pmltop[PML4PML4I] = 0; /* Recursive Mapping */
4936                 for (i = 0; i < lm_ents; i++)   /* Large Map */
4937                         pmap->pm_pmltop[LMSPML4I + i] = 0;
4938         }
4939
4940         pmap_free_pt_page(NULL, m, true);
4941         pmap_pt_page_count_pinit(pmap, -1);
4942
4943         if (pmap->pm_pmltopu != NULL) {
4944                 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->
4945                     pm_pmltopu));
4946                 pmap_free_pt_page(NULL, m, false);
4947                 pmap_pt_page_count_pinit(pmap, -1);
4948         }
4949         if (pmap->pm_type == PT_X86 &&
4950             (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0)
4951                 rangeset_fini(&pmap->pm_pkru);
4952
4953         KASSERT(pmap->pm_stats.resident_count == 0,
4954             ("pmap_release: pmap %p resident count %ld != 0",
4955             pmap, pmap->pm_stats.resident_count));
4956 }
4957
4958 static int
4959 kvm_size(SYSCTL_HANDLER_ARGS)
4960 {
4961         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS;
4962
4963         return sysctl_handle_long(oidp, &ksize, 0, req);
4964 }
4965 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
4966     0, 0, kvm_size, "LU",
4967     "Size of KVM");
4968
4969 static int
4970 kvm_free(SYSCTL_HANDLER_ARGS)
4971 {
4972         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
4973
4974         return sysctl_handle_long(oidp, &kfree, 0, req);
4975 }
4976 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
4977     0, 0, kvm_free, "LU",
4978     "Amount of KVM free");
4979
4980 #ifdef KMSAN
4981 static void
4982 pmap_kmsan_shadow_map_page_array(vm_paddr_t pdppa, vm_size_t size)
4983 {
4984         pdp_entry_t *pdpe;
4985         pd_entry_t *pde;
4986         pt_entry_t *pte;
4987         vm_paddr_t dummypa, dummypd, dummypt;
4988         int i, npde, npdpg;
4989
4990         npdpg = howmany(size, NBPDP);
4991         npde = size / NBPDR;
4992
4993         dummypa = vm_phys_early_alloc(-1, PAGE_SIZE);
4994         pagezero((void *)PHYS_TO_DMAP(dummypa));
4995
4996         dummypt = vm_phys_early_alloc(-1, PAGE_SIZE);
4997         pagezero((void *)PHYS_TO_DMAP(dummypt));
4998         dummypd = vm_phys_early_alloc(-1, PAGE_SIZE * npdpg);
4999         for (i = 0; i < npdpg; i++)
5000                 pagezero((void *)PHYS_TO_DMAP(dummypd + ptoa(i)));
5001
5002         pte = (pt_entry_t *)PHYS_TO_DMAP(dummypt);
5003         for (i = 0; i < NPTEPG; i++)
5004                 pte[i] = (pt_entry_t)(dummypa | X86_PG_V | X86_PG_RW |
5005                     X86_PG_A | X86_PG_M | pg_nx);
5006
5007         pde = (pd_entry_t *)PHYS_TO_DMAP(dummypd);
5008         for (i = 0; i < npde; i++)
5009                 pde[i] = (pd_entry_t)(dummypt | X86_PG_V | X86_PG_RW | pg_nx);
5010
5011         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(pdppa);
5012         for (i = 0; i < npdpg; i++)
5013                 pdpe[i] = (pdp_entry_t)(dummypd + ptoa(i) | X86_PG_V |
5014                     X86_PG_RW | pg_nx);
5015 }
5016
5017 static void
5018 pmap_kmsan_page_array_startup(vm_offset_t start, vm_offset_t end)
5019 {
5020         vm_size_t size;
5021
5022         KASSERT(start % NBPDP == 0, ("unaligned page array start address"));
5023
5024         /*
5025          * The end of the page array's KVA region is 2MB aligned, see
5026          * kmem_init().
5027          */
5028         size = round_2mpage(end) - start;
5029         pmap_kmsan_shadow_map_page_array(KMSANSHADPDPphys, size);
5030         pmap_kmsan_shadow_map_page_array(KMSANORIGPDPphys, size);
5031 }
5032 #endif
5033
5034 /*
5035  * Allocate physical memory for the vm_page array and map it into KVA,
5036  * attempting to back the vm_pages with domain-local memory.
5037  */
5038 void
5039 pmap_page_array_startup(long pages)
5040 {
5041         pdp_entry_t *pdpe;
5042         pd_entry_t *pde, newpdir;
5043         vm_offset_t va, start, end;
5044         vm_paddr_t pa;
5045         long pfn;
5046         int domain, i;
5047
5048         vm_page_array_size = pages;
5049
5050         start = VM_MIN_KERNEL_ADDRESS;
5051         end = start + pages * sizeof(struct vm_page);
5052         for (va = start; va < end; va += NBPDR) {
5053                 pfn = first_page + (va - start) / sizeof(struct vm_page);
5054                 domain = vm_phys_domain(ptoa(pfn));
5055                 pdpe = pmap_pdpe(kernel_pmap, va);
5056                 if ((*pdpe & X86_PG_V) == 0) {
5057                         pa = vm_phys_early_alloc(domain, PAGE_SIZE);
5058                         dump_add_page(pa);
5059                         pagezero((void *)PHYS_TO_DMAP(pa));
5060                         *pdpe = (pdp_entry_t)(pa | X86_PG_V | X86_PG_RW |
5061                             X86_PG_A | X86_PG_M);
5062                 }
5063                 pde = pmap_pdpe_to_pde(pdpe, va);
5064                 if ((*pde & X86_PG_V) != 0)
5065                         panic("Unexpected pde");
5066                 pa = vm_phys_early_alloc(domain, NBPDR);
5067                 for (i = 0; i < NPDEPG; i++)
5068                         dump_add_page(pa + i * PAGE_SIZE);
5069                 newpdir = (pd_entry_t)(pa | X86_PG_V | X86_PG_RW | X86_PG_A |
5070                     X86_PG_M | PG_PS | pg_g | pg_nx);
5071                 pde_store(pde, newpdir);
5072         }
5073         vm_page_array = (vm_page_t)start;
5074
5075 #ifdef KMSAN
5076         pmap_kmsan_page_array_startup(start, end);
5077 #endif
5078 }
5079
5080 /*
5081  * grow the number of kernel page table entries, if needed
5082  */
5083 void
5084 pmap_growkernel(vm_offset_t addr)
5085 {
5086         vm_paddr_t paddr;
5087         vm_page_t nkpg;
5088         pd_entry_t *pde, newpdir;
5089         pdp_entry_t *pdpe;
5090         vm_offset_t end;
5091
5092         TSENTER();
5093         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
5094
5095         /*
5096          * The kernel map covers two distinct regions of KVA: that used
5097          * for dynamic kernel memory allocations, and the uppermost 2GB
5098          * of the virtual address space.  The latter is used to map the
5099          * kernel and loadable kernel modules.  This scheme enables the
5100          * use of a special code generation model for kernel code which
5101          * takes advantage of compact addressing modes in machine code.
5102          *
5103          * Both regions grow upwards; to avoid wasting memory, the gap
5104          * in between is unmapped.  If "addr" is above "KERNBASE", the
5105          * kernel's region is grown, otherwise the kmem region is grown.
5106          *
5107          * The correctness of this action is based on the following
5108          * argument: vm_map_insert() allocates contiguous ranges of the
5109          * kernel virtual address space.  It calls this function if a range
5110          * ends after "kernel_vm_end".  If the kernel is mapped between
5111          * "kernel_vm_end" and "addr", then the range cannot begin at
5112          * "kernel_vm_end".  In fact, its beginning address cannot be less
5113          * than the kernel.  Thus, there is no immediate need to allocate
5114          * any new kernel page table pages between "kernel_vm_end" and
5115          * "KERNBASE".
5116          */
5117         if (KERNBASE < addr) {
5118                 end = KERNBASE + nkpt * NBPDR;
5119                 if (end == 0) {
5120                         TSEXIT();
5121                         return;
5122                 }
5123         } else {
5124                 end = kernel_vm_end;
5125         }
5126
5127         addr = roundup2(addr, NBPDR);
5128         if (addr - 1 >= vm_map_max(kernel_map))
5129                 addr = vm_map_max(kernel_map);
5130         if (addr <= end) {
5131                 /*
5132                  * The grown region is already mapped, so there is
5133                  * nothing to do.
5134                  */
5135                 TSEXIT();
5136                 return;
5137         }
5138
5139         kasan_shadow_map(end, addr - end);
5140         kmsan_shadow_map(end, addr - end);
5141         while (end < addr) {
5142                 pdpe = pmap_pdpe(kernel_pmap, end);
5143                 if ((*pdpe & X86_PG_V) == 0) {
5144                         nkpg = pmap_alloc_pt_page(kernel_pmap,
5145                             pmap_pdpe_pindex(end), VM_ALLOC_WIRED |
5146                             VM_ALLOC_INTERRUPT | VM_ALLOC_ZERO);
5147                         if (nkpg == NULL)
5148                                 panic("pmap_growkernel: no memory to grow kernel");
5149                         paddr = VM_PAGE_TO_PHYS(nkpg);
5150                         *pdpe = (pdp_entry_t)(paddr | X86_PG_V | X86_PG_RW |
5151                             X86_PG_A | X86_PG_M);
5152                         continue; /* try again */
5153                 }
5154                 pde = pmap_pdpe_to_pde(pdpe, end);
5155                 if ((*pde & X86_PG_V) != 0) {
5156                         end = (end + NBPDR) & ~PDRMASK;
5157                         if (end - 1 >= vm_map_max(kernel_map)) {
5158                                 end = vm_map_max(kernel_map);
5159                                 break;                       
5160                         }
5161                         continue;
5162                 }
5163
5164                 nkpg = pmap_alloc_pt_page(kernel_pmap, pmap_pde_pindex(end),
5165                     VM_ALLOC_WIRED | VM_ALLOC_INTERRUPT | VM_ALLOC_ZERO);
5166                 if (nkpg == NULL)
5167                         panic("pmap_growkernel: no memory to grow kernel");
5168                 paddr = VM_PAGE_TO_PHYS(nkpg);
5169                 newpdir = paddr | X86_PG_V | X86_PG_RW | X86_PG_A | X86_PG_M;
5170                 pde_store(pde, newpdir);
5171
5172                 end = (end + NBPDR) & ~PDRMASK;
5173                 if (end - 1 >= vm_map_max(kernel_map)) {
5174                         end = vm_map_max(kernel_map);
5175                         break;                       
5176                 }
5177         }
5178
5179         if (end <= KERNBASE)
5180                 kernel_vm_end = end;
5181         else
5182                 nkpt = howmany(end - KERNBASE, NBPDR);
5183         TSEXIT();
5184 }
5185
5186 /***************************************************
5187  * page management routines.
5188  ***************************************************/
5189
5190 static const uint64_t pc_freemask[_NPCM] = {
5191         [0 ... _NPCM - 2] = PC_FREEN,
5192         [_NPCM - 1] = PC_FREEL
5193 };
5194
5195 #ifdef PV_STATS
5196
5197 static COUNTER_U64_DEFINE_EARLY(pc_chunk_count);
5198 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD,
5199     &pc_chunk_count, "Current number of pv entry cnunks");
5200
5201 static COUNTER_U64_DEFINE_EARLY(pc_chunk_allocs);
5202 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD,
5203     &pc_chunk_allocs, "Total number of pv entry chunks allocated");
5204
5205 static COUNTER_U64_DEFINE_EARLY(pc_chunk_frees);
5206 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD,
5207     &pc_chunk_frees, "Total number of pv entry chunks freed");
5208
5209 static COUNTER_U64_DEFINE_EARLY(pc_chunk_tryfail);
5210 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD,
5211     &pc_chunk_tryfail,
5212     "Number of failed attempts to get a pv entry chunk page");
5213
5214 static COUNTER_U64_DEFINE_EARLY(pv_entry_frees);
5215 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD,
5216     &pv_entry_frees, "Total number of pv entries freed");
5217
5218 static COUNTER_U64_DEFINE_EARLY(pv_entry_allocs);
5219 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD,
5220     &pv_entry_allocs, "Total number of pv entries allocated");
5221
5222 static COUNTER_U64_DEFINE_EARLY(pv_entry_count);
5223 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD,
5224     &pv_entry_count, "Current number of pv entries");
5225
5226 static COUNTER_U64_DEFINE_EARLY(pv_entry_spare);
5227 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD,
5228     &pv_entry_spare, "Current number of spare pv entries");
5229 #endif
5230
5231 static void
5232 reclaim_pv_chunk_leave_pmap(pmap_t pmap, pmap_t locked_pmap, bool start_di)
5233 {
5234
5235         if (pmap == NULL)
5236                 return;
5237         pmap_invalidate_all(pmap);
5238         if (pmap != locked_pmap)
5239                 PMAP_UNLOCK(pmap);
5240         if (start_di)
5241                 pmap_delayed_invl_finish();
5242 }
5243
5244 /*
5245  * We are in a serious low memory condition.  Resort to
5246  * drastic measures to free some pages so we can allocate
5247  * another pv entry chunk.
5248  *
5249  * Returns NULL if PV entries were reclaimed from the specified pmap.
5250  *
5251  * We do not, however, unmap 2mpages because subsequent accesses will
5252  * allocate per-page pv entries until repromotion occurs, thereby
5253  * exacerbating the shortage of free pv entries.
5254  */
5255 static vm_page_t
5256 reclaim_pv_chunk_domain(pmap_t locked_pmap, struct rwlock **lockp, int domain)
5257 {
5258         struct pv_chunks_list *pvc;
5259         struct pv_chunk *pc, *pc_marker, *pc_marker_end;
5260         struct pv_chunk_header pc_marker_b, pc_marker_end_b;
5261         struct md_page *pvh;
5262         pd_entry_t *pde;
5263         pmap_t next_pmap, pmap;
5264         pt_entry_t *pte, tpte;
5265         pt_entry_t PG_G, PG_A, PG_M, PG_RW;
5266         pv_entry_t pv;
5267         vm_offset_t va;
5268         vm_page_t m, m_pc;
5269         struct spglist free;
5270         uint64_t inuse;
5271         int bit, field, freed;
5272         bool start_di, restart;
5273
5274         PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
5275         KASSERT(lockp != NULL, ("reclaim_pv_chunk: lockp is NULL"));
5276         pmap = NULL;
5277         m_pc = NULL;
5278         PG_G = PG_A = PG_M = PG_RW = 0;
5279         SLIST_INIT(&free);
5280         bzero(&pc_marker_b, sizeof(pc_marker_b));
5281         bzero(&pc_marker_end_b, sizeof(pc_marker_end_b));
5282         pc_marker = (struct pv_chunk *)&pc_marker_b;
5283         pc_marker_end = (struct pv_chunk *)&pc_marker_end_b;
5284
5285         /*
5286          * A delayed invalidation block should already be active if
5287          * pmap_advise() or pmap_remove() called this function by way
5288          * of pmap_demote_pde_locked().
5289          */
5290         start_di = pmap_not_in_di();
5291
5292         pvc = &pv_chunks[domain];
5293         mtx_lock(&pvc->pvc_lock);
5294         pvc->active_reclaims++;
5295         TAILQ_INSERT_HEAD(&pvc->pvc_list, pc_marker, pc_lru);
5296         TAILQ_INSERT_TAIL(&pvc->pvc_list, pc_marker_end, pc_lru);
5297         while ((pc = TAILQ_NEXT(pc_marker, pc_lru)) != pc_marker_end &&
5298             SLIST_EMPTY(&free)) {
5299                 next_pmap = pc->pc_pmap;
5300                 if (next_pmap == NULL) {
5301                         /*
5302                          * The next chunk is a marker.  However, it is
5303                          * not our marker, so active_reclaims must be
5304                          * > 1.  Consequently, the next_chunk code
5305                          * will not rotate the pv_chunks list.
5306                          */
5307                         goto next_chunk;
5308                 }
5309                 mtx_unlock(&pvc->pvc_lock);
5310
5311                 /*
5312                  * A pv_chunk can only be removed from the pc_lru list
5313                  * when both pc_chunks_mutex is owned and the
5314                  * corresponding pmap is locked.
5315                  */
5316                 if (pmap != next_pmap) {
5317                         restart = false;
5318                         reclaim_pv_chunk_leave_pmap(pmap, locked_pmap,
5319                             start_di);
5320                         pmap = next_pmap;
5321                         /* Avoid deadlock and lock recursion. */
5322                         if (pmap > locked_pmap) {
5323                                 RELEASE_PV_LIST_LOCK(lockp);
5324                                 PMAP_LOCK(pmap);
5325                                 if (start_di)
5326                                         pmap_delayed_invl_start();
5327                                 mtx_lock(&pvc->pvc_lock);
5328                                 restart = true;
5329                         } else if (pmap != locked_pmap) {
5330                                 if (PMAP_TRYLOCK(pmap)) {
5331                                         if (start_di)
5332                                                 pmap_delayed_invl_start();
5333                                         mtx_lock(&pvc->pvc_lock);
5334                                         restart = true;
5335                                 } else {
5336                                         pmap = NULL; /* pmap is not locked */
5337                                         mtx_lock(&pvc->pvc_lock);
5338                                         pc = TAILQ_NEXT(pc_marker, pc_lru);
5339                                         if (pc == NULL ||
5340                                             pc->pc_pmap != next_pmap)
5341                                                 continue;
5342                                         goto next_chunk;
5343                                 }
5344                         } else if (start_di)
5345                                 pmap_delayed_invl_start();
5346                         PG_G = pmap_global_bit(pmap);
5347                         PG_A = pmap_accessed_bit(pmap);
5348                         PG_M = pmap_modified_bit(pmap);
5349                         PG_RW = pmap_rw_bit(pmap);
5350                         if (restart)
5351                                 continue;
5352                 }
5353
5354                 /*
5355                  * Destroy every non-wired, 4 KB page mapping in the chunk.
5356                  */
5357                 freed = 0;
5358                 for (field = 0; field < _NPCM; field++) {
5359                         for (inuse = ~pc->pc_map[field] & pc_freemask[field];
5360                             inuse != 0; inuse &= ~(1UL << bit)) {
5361                                 bit = bsfq(inuse);
5362                                 pv = &pc->pc_pventry[field * 64 + bit];
5363                                 va = pv->pv_va;
5364                                 pde = pmap_pde(pmap, va);
5365                                 if ((*pde & PG_PS) != 0)
5366                                         continue;
5367                                 pte = pmap_pde_to_pte(pde, va);
5368                                 if ((*pte & PG_W) != 0)
5369                                         continue;
5370                                 tpte = pte_load_clear(pte);
5371                                 if ((tpte & PG_G) != 0)
5372                                         pmap_invalidate_page(pmap, va);
5373                                 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
5374                                 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
5375                                         vm_page_dirty(m);
5376                                 if ((tpte & PG_A) != 0)
5377                                         vm_page_aflag_set(m, PGA_REFERENCED);
5378                                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
5379                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
5380                                 m->md.pv_gen++;
5381                                 if (TAILQ_EMPTY(&m->md.pv_list) &&
5382                                     (m->flags & PG_FICTITIOUS) == 0) {
5383                                         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
5384                                         if (TAILQ_EMPTY(&pvh->pv_list)) {
5385                                                 vm_page_aflag_clear(m,
5386                                                     PGA_WRITEABLE);
5387                                         }
5388                                 }
5389                                 pmap_delayed_invl_page(m);
5390                                 pc->pc_map[field] |= 1UL << bit;
5391                                 pmap_unuse_pt(pmap, va, *pde, &free);
5392                                 freed++;
5393                         }
5394                 }
5395                 if (freed == 0) {
5396                         mtx_lock(&pvc->pvc_lock);
5397                         goto next_chunk;
5398                 }
5399                 /* Every freed mapping is for a 4 KB page. */
5400                 pmap_resident_count_adj(pmap, -freed);
5401                 PV_STAT(counter_u64_add(pv_entry_frees, freed));
5402                 PV_STAT(counter_u64_add(pv_entry_spare, freed));
5403                 PV_STAT(counter_u64_add(pv_entry_count, -freed));
5404                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5405                 if (pc_is_free(pc)) {
5406                         PV_STAT(counter_u64_add(pv_entry_spare, -_NPCPV));
5407                         PV_STAT(counter_u64_add(pc_chunk_count, -1));
5408                         PV_STAT(counter_u64_add(pc_chunk_frees, 1));
5409                         /* Entire chunk is free; return it. */
5410                         m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
5411                         dump_drop_page(m_pc->phys_addr);
5412                         mtx_lock(&pvc->pvc_lock);
5413                         TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5414                         break;
5415                 }
5416                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5417                 mtx_lock(&pvc->pvc_lock);
5418                 /* One freed pv entry in locked_pmap is sufficient. */
5419                 if (pmap == locked_pmap)
5420                         break;
5421 next_chunk:
5422                 TAILQ_REMOVE(&pvc->pvc_list, pc_marker, pc_lru);
5423                 TAILQ_INSERT_AFTER(&pvc->pvc_list, pc, pc_marker, pc_lru);
5424                 if (pvc->active_reclaims == 1 && pmap != NULL) {
5425                         /*
5426                          * Rotate the pv chunks list so that we do not
5427                          * scan the same pv chunks that could not be
5428                          * freed (because they contained a wired
5429                          * and/or superpage mapping) on every
5430                          * invocation of reclaim_pv_chunk().
5431                          */
5432                         while ((pc = TAILQ_FIRST(&pvc->pvc_list)) != pc_marker) {
5433                                 MPASS(pc->pc_pmap != NULL);
5434                                 TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5435                                 TAILQ_INSERT_TAIL(&pvc->pvc_list, pc, pc_lru);
5436                         }
5437                 }
5438         }
5439         TAILQ_REMOVE(&pvc->pvc_list, pc_marker, pc_lru);
5440         TAILQ_REMOVE(&pvc->pvc_list, pc_marker_end, pc_lru);
5441         pvc->active_reclaims--;
5442         mtx_unlock(&pvc->pvc_lock);
5443         reclaim_pv_chunk_leave_pmap(pmap, locked_pmap, start_di);
5444         if (m_pc == NULL && !SLIST_EMPTY(&free)) {
5445                 m_pc = SLIST_FIRST(&free);
5446                 SLIST_REMOVE_HEAD(&free, plinks.s.ss);
5447                 /* Recycle a freed page table page. */
5448                 m_pc->ref_count = 1;
5449         }
5450         vm_page_free_pages_toq(&free, true);
5451         return (m_pc);
5452 }
5453
5454 static vm_page_t
5455 reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
5456 {
5457         vm_page_t m;
5458         int i, domain;
5459
5460         domain = PCPU_GET(domain);
5461         for (i = 0; i < vm_ndomains; i++) {
5462                 m = reclaim_pv_chunk_domain(locked_pmap, lockp, domain);
5463                 if (m != NULL)
5464                         break;
5465                 domain = (domain + 1) % vm_ndomains;
5466         }
5467
5468         return (m);
5469 }
5470
5471 /*
5472  * free the pv_entry back to the free list
5473  */
5474 static void
5475 free_pv_entry(pmap_t pmap, pv_entry_t pv)
5476 {
5477         struct pv_chunk *pc;
5478         int idx, field, bit;
5479
5480         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5481         PV_STAT(counter_u64_add(pv_entry_frees, 1));
5482         PV_STAT(counter_u64_add(pv_entry_spare, 1));
5483         PV_STAT(counter_u64_add(pv_entry_count, -1));
5484         pc = pv_to_chunk(pv);
5485         idx = pv - &pc->pc_pventry[0];
5486         field = idx / 64;
5487         bit = idx % 64;
5488         pc->pc_map[field] |= 1ul << bit;
5489         if (!pc_is_free(pc)) {
5490                 /* 98% of the time, pc is already at the head of the list. */
5491                 if (__predict_false(pc != TAILQ_FIRST(&pmap->pm_pvchunk))) {
5492                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5493                         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5494                 }
5495                 return;
5496         }
5497         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5498         free_pv_chunk(pc);
5499 }
5500
5501 static void
5502 free_pv_chunk_dequeued(struct pv_chunk *pc)
5503 {
5504         vm_page_t m;
5505
5506         PV_STAT(counter_u64_add(pv_entry_spare, -_NPCPV));
5507         PV_STAT(counter_u64_add(pc_chunk_count, -1));
5508         PV_STAT(counter_u64_add(pc_chunk_frees, 1));
5509         counter_u64_add(pv_page_count, -1);
5510         /* entire chunk is free, return it */
5511         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
5512         dump_drop_page(m->phys_addr);
5513         vm_page_unwire_noq(m);
5514         vm_page_free(m);
5515 }
5516
5517 static void
5518 free_pv_chunk(struct pv_chunk *pc)
5519 {
5520         struct pv_chunks_list *pvc;
5521
5522         pvc = &pv_chunks[pc_to_domain(pc)];
5523         mtx_lock(&pvc->pvc_lock);
5524         TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5525         mtx_unlock(&pvc->pvc_lock);
5526         free_pv_chunk_dequeued(pc);
5527 }
5528
5529 static void
5530 free_pv_chunk_batch(struct pv_chunklist *batch)
5531 {
5532         struct pv_chunks_list *pvc;
5533         struct pv_chunk *pc, *npc;
5534         int i;
5535
5536         for (i = 0; i < vm_ndomains; i++) {
5537                 if (TAILQ_EMPTY(&batch[i]))
5538                         continue;
5539                 pvc = &pv_chunks[i];
5540                 mtx_lock(&pvc->pvc_lock);
5541                 TAILQ_FOREACH(pc, &batch[i], pc_list) {
5542                         TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5543                 }
5544                 mtx_unlock(&pvc->pvc_lock);
5545         }
5546
5547         for (i = 0; i < vm_ndomains; i++) {
5548                 TAILQ_FOREACH_SAFE(pc, &batch[i], pc_list, npc) {
5549                         free_pv_chunk_dequeued(pc);
5550                 }
5551         }
5552 }
5553
5554 /*
5555  * Returns a new PV entry, allocating a new PV chunk from the system when
5556  * needed.  If this PV chunk allocation fails and a PV list lock pointer was
5557  * given, a PV chunk is reclaimed from an arbitrary pmap.  Otherwise, NULL is
5558  * returned.
5559  *
5560  * The given PV list lock may be released.
5561  */
5562 static pv_entry_t
5563 get_pv_entry(pmap_t pmap, struct rwlock **lockp)
5564 {
5565         struct pv_chunks_list *pvc;
5566         int bit, field;
5567         pv_entry_t pv;
5568         struct pv_chunk *pc;
5569         vm_page_t m;
5570
5571         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5572         PV_STAT(counter_u64_add(pv_entry_allocs, 1));
5573 retry:
5574         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
5575         if (pc != NULL) {
5576                 for (field = 0; field < _NPCM; field++) {
5577                         if (pc->pc_map[field]) {
5578                                 bit = bsfq(pc->pc_map[field]);
5579                                 break;
5580                         }
5581                 }
5582                 if (field < _NPCM) {
5583                         pv = &pc->pc_pventry[field * 64 + bit];
5584                         pc->pc_map[field] &= ~(1ul << bit);
5585                         /* If this was the last item, move it to tail */
5586                         if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
5587                             pc->pc_map[2] == 0) {
5588                                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5589                                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc,
5590                                     pc_list);
5591                         }
5592                         PV_STAT(counter_u64_add(pv_entry_count, 1));
5593                         PV_STAT(counter_u64_add(pv_entry_spare, -1));
5594                         return (pv);
5595                 }
5596         }
5597         /* No free items, allocate another chunk */
5598         m = vm_page_alloc_noobj(VM_ALLOC_WIRED);
5599         if (m == NULL) {
5600                 if (lockp == NULL) {
5601                         PV_STAT(counter_u64_add(pc_chunk_tryfail, 1));
5602                         return (NULL);
5603                 }
5604                 m = reclaim_pv_chunk(pmap, lockp);
5605                 if (m == NULL)
5606                         goto retry;
5607         } else
5608                 counter_u64_add(pv_page_count, 1);
5609         PV_STAT(counter_u64_add(pc_chunk_count, 1));
5610         PV_STAT(counter_u64_add(pc_chunk_allocs, 1));
5611         dump_add_page(m->phys_addr);
5612         pc = (void *)PHYS_TO_DMAP(m->phys_addr);
5613         pc->pc_pmap = pmap;
5614         pc->pc_map[0] = PC_FREEN & ~1ul;        /* preallocated bit 0 */
5615         pc->pc_map[1] = PC_FREEN;
5616         pc->pc_map[2] = PC_FREEL;
5617         pvc = &pv_chunks[vm_page_domain(m)];
5618         mtx_lock(&pvc->pvc_lock);
5619         TAILQ_INSERT_TAIL(&pvc->pvc_list, pc, pc_lru);
5620         mtx_unlock(&pvc->pvc_lock);
5621         pv = &pc->pc_pventry[0];
5622         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5623         PV_STAT(counter_u64_add(pv_entry_count, 1));
5624         PV_STAT(counter_u64_add(pv_entry_spare, _NPCPV - 1));
5625         return (pv);
5626 }
5627
5628 /*
5629  * Returns the number of one bits within the given PV chunk map.
5630  *
5631  * The erratas for Intel processors state that "POPCNT Instruction May
5632  * Take Longer to Execute Than Expected".  It is believed that the
5633  * issue is the spurious dependency on the destination register.
5634  * Provide a hint to the register rename logic that the destination
5635  * value is overwritten, by clearing it, as suggested in the
5636  * optimization manual.  It should be cheap for unaffected processors
5637  * as well.
5638  *
5639  * Reference numbers for erratas are
5640  * 4th Gen Core: HSD146
5641  * 5th Gen Core: BDM85
5642  * 6th Gen Core: SKL029
5643  */
5644 static int
5645 popcnt_pc_map_pq(uint64_t *map)
5646 {
5647         u_long result, tmp;
5648
5649         __asm __volatile("xorl %k0,%k0;popcntq %2,%0;"
5650             "xorl %k1,%k1;popcntq %3,%1;addl %k1,%k0;"
5651             "xorl %k1,%k1;popcntq %4,%1;addl %k1,%k0"
5652             : "=&r" (result), "=&r" (tmp)
5653             : "m" (map[0]), "m" (map[1]), "m" (map[2]));
5654         return (result);
5655 }
5656
5657 /*
5658  * Ensure that the number of spare PV entries in the specified pmap meets or
5659  * exceeds the given count, "needed".
5660  *
5661  * The given PV list lock may be released.
5662  */
5663 static void
5664 reserve_pv_entries(pmap_t pmap, int needed, struct rwlock **lockp)
5665 {
5666         struct pv_chunks_list *pvc;
5667         struct pch new_tail[PMAP_MEMDOM];
5668         struct pv_chunk *pc;
5669         vm_page_t m;
5670         int avail, free, i;
5671         bool reclaimed;
5672
5673         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5674         KASSERT(lockp != NULL, ("reserve_pv_entries: lockp is NULL"));
5675
5676         /*
5677          * Newly allocated PV chunks must be stored in a private list until
5678          * the required number of PV chunks have been allocated.  Otherwise,
5679          * reclaim_pv_chunk() could recycle one of these chunks.  In
5680          * contrast, these chunks must be added to the pmap upon allocation.
5681          */
5682         for (i = 0; i < PMAP_MEMDOM; i++)
5683                 TAILQ_INIT(&new_tail[i]);
5684 retry:
5685         avail = 0;
5686         TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
5687 #ifndef __POPCNT__
5688                 if ((cpu_feature2 & CPUID2_POPCNT) == 0)
5689                         bit_count((bitstr_t *)pc->pc_map, 0,
5690                             sizeof(pc->pc_map) * NBBY, &free);
5691                 else
5692 #endif
5693                 free = popcnt_pc_map_pq(pc->pc_map);
5694                 if (free == 0)
5695                         break;
5696                 avail += free;
5697                 if (avail >= needed)
5698                         break;
5699         }
5700         for (reclaimed = false; avail < needed; avail += _NPCPV) {
5701                 m = vm_page_alloc_noobj(VM_ALLOC_WIRED);
5702                 if (m == NULL) {
5703                         m = reclaim_pv_chunk(pmap, lockp);
5704                         if (m == NULL)
5705                                 goto retry;
5706                         reclaimed = true;
5707                 } else
5708                         counter_u64_add(pv_page_count, 1);
5709                 PV_STAT(counter_u64_add(pc_chunk_count, 1));
5710                 PV_STAT(counter_u64_add(pc_chunk_allocs, 1));
5711                 dump_add_page(m->phys_addr);
5712                 pc = (void *)PHYS_TO_DMAP(m->phys_addr);
5713                 pc->pc_pmap = pmap;
5714                 pc->pc_map[0] = PC_FREEN;
5715                 pc->pc_map[1] = PC_FREEN;
5716                 pc->pc_map[2] = PC_FREEL;
5717                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5718                 TAILQ_INSERT_TAIL(&new_tail[vm_page_domain(m)], pc, pc_lru);
5719                 PV_STAT(counter_u64_add(pv_entry_spare, _NPCPV));
5720
5721                 /*
5722                  * The reclaim might have freed a chunk from the current pmap.
5723                  * If that chunk contained available entries, we need to
5724                  * re-count the number of available entries.
5725                  */
5726                 if (reclaimed)
5727                         goto retry;
5728         }
5729         for (i = 0; i < vm_ndomains; i++) {
5730                 if (TAILQ_EMPTY(&new_tail[i]))
5731                         continue;
5732                 pvc = &pv_chunks[i];
5733                 mtx_lock(&pvc->pvc_lock);
5734                 TAILQ_CONCAT(&pvc->pvc_list, &new_tail[i], pc_lru);
5735                 mtx_unlock(&pvc->pvc_lock);
5736         }
5737 }
5738
5739 /*
5740  * First find and then remove the pv entry for the specified pmap and virtual
5741  * address from the specified pv list.  Returns the pv entry if found and NULL
5742  * otherwise.  This operation can be performed on pv lists for either 4KB or
5743  * 2MB page mappings.
5744  */
5745 static __inline pv_entry_t
5746 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
5747 {
5748         pv_entry_t pv;
5749
5750         TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
5751                 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
5752                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
5753                         pvh->pv_gen++;
5754                         break;
5755                 }
5756         }
5757         return (pv);
5758 }
5759
5760 /*
5761  * After demotion from a 2MB page mapping to 512 4KB page mappings,
5762  * destroy the pv entry for the 2MB page mapping and reinstantiate the pv
5763  * entries for each of the 4KB page mappings.
5764  */
5765 static void
5766 pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
5767     struct rwlock **lockp)
5768 {
5769         struct md_page *pvh;
5770         struct pv_chunk *pc;
5771         pv_entry_t pv;
5772         vm_offset_t va_last;
5773         vm_page_t m;
5774         int bit, field;
5775
5776         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5777         KASSERT((pa & PDRMASK) == 0,
5778             ("pmap_pv_demote_pde: pa is not 2mpage aligned"));
5779         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
5780
5781         /*
5782          * Transfer the 2mpage's pv entry for this mapping to the first
5783          * page's pv list.  Once this transfer begins, the pv list lock
5784          * must not be released until the last pv entry is reinstantiated.
5785          */
5786         pvh = pa_to_pvh(pa);
5787         va = trunc_2mpage(va);
5788         pv = pmap_pvh_remove(pvh, pmap, va);
5789         KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found"));
5790         m = PHYS_TO_VM_PAGE(pa);
5791         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5792         m->md.pv_gen++;
5793         /* Instantiate the remaining NPTEPG - 1 pv entries. */
5794         PV_STAT(counter_u64_add(pv_entry_allocs, NPTEPG - 1));
5795         va_last = va + NBPDR - PAGE_SIZE;
5796         for (;;) {
5797                 pc = TAILQ_FIRST(&pmap->pm_pvchunk);
5798                 KASSERT(pc->pc_map[0] != 0 || pc->pc_map[1] != 0 ||
5799                     pc->pc_map[2] != 0, ("pmap_pv_demote_pde: missing spare"));
5800                 for (field = 0; field < _NPCM; field++) {
5801                         while (pc->pc_map[field]) {
5802                                 bit = bsfq(pc->pc_map[field]);
5803                                 pc->pc_map[field] &= ~(1ul << bit);
5804                                 pv = &pc->pc_pventry[field * 64 + bit];
5805                                 va += PAGE_SIZE;
5806                                 pv->pv_va = va;
5807                                 m++;
5808                                 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5809                             ("pmap_pv_demote_pde: page %p is not managed", m));
5810                                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5811                                 m->md.pv_gen++;
5812                                 if (va == va_last)
5813                                         goto out;
5814                         }
5815                 }
5816                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5817                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
5818         }
5819 out:
5820         if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 && pc->pc_map[2] == 0) {
5821                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5822                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
5823         }
5824         PV_STAT(counter_u64_add(pv_entry_count, NPTEPG - 1));
5825         PV_STAT(counter_u64_add(pv_entry_spare, -(NPTEPG - 1)));
5826 }
5827
5828 #if VM_NRESERVLEVEL > 0
5829 /*
5830  * After promotion from 512 4KB page mappings to a single 2MB page mapping,
5831  * replace the many pv entries for the 4KB page mappings by a single pv entry
5832  * for the 2MB page mapping.
5833  */
5834 static void
5835 pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
5836     struct rwlock **lockp)
5837 {
5838         struct md_page *pvh;
5839         pv_entry_t pv;
5840         vm_offset_t va_last;
5841         vm_page_t m;
5842
5843         KASSERT((pa & PDRMASK) == 0,
5844             ("pmap_pv_promote_pde: pa is not 2mpage aligned"));
5845         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
5846
5847         /*
5848          * Transfer the first page's pv entry for this mapping to the 2mpage's
5849          * pv list.  Aside from avoiding the cost of a call to get_pv_entry(),
5850          * a transfer avoids the possibility that get_pv_entry() calls
5851          * reclaim_pv_chunk() and that reclaim_pv_chunk() removes one of the
5852          * mappings that is being promoted.
5853          */
5854         m = PHYS_TO_VM_PAGE(pa);
5855         va = trunc_2mpage(va);
5856         pv = pmap_pvh_remove(&m->md, pmap, va);
5857         KASSERT(pv != NULL, ("pmap_pv_promote_pde: pv not found"));
5858         pvh = pa_to_pvh(pa);
5859         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
5860         pvh->pv_gen++;
5861         /* Free the remaining NPTEPG - 1 pv entries. */
5862         va_last = va + NBPDR - PAGE_SIZE;
5863         do {
5864                 m++;
5865                 va += PAGE_SIZE;
5866                 pmap_pvh_free(&m->md, pmap, va);
5867         } while (va < va_last);
5868 }
5869 #endif /* VM_NRESERVLEVEL > 0 */
5870
5871 /*
5872  * First find and then destroy the pv entry for the specified pmap and virtual
5873  * address.  This operation can be performed on pv lists for either 4KB or 2MB
5874  * page mappings.
5875  */
5876 static void
5877 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
5878 {
5879         pv_entry_t pv;
5880
5881         pv = pmap_pvh_remove(pvh, pmap, va);
5882         KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
5883         free_pv_entry(pmap, pv);
5884 }
5885
5886 /*
5887  * Conditionally create the PV entry for a 4KB page mapping if the required
5888  * memory can be allocated without resorting to reclamation.
5889  */
5890 static boolean_t
5891 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m,
5892     struct rwlock **lockp)
5893 {
5894         pv_entry_t pv;
5895
5896         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5897         /* Pass NULL instead of the lock pointer to disable reclamation. */
5898         if ((pv = get_pv_entry(pmap, NULL)) != NULL) {
5899                 pv->pv_va = va;
5900                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
5901                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5902                 m->md.pv_gen++;
5903                 return (TRUE);
5904         } else
5905                 return (FALSE);
5906 }
5907
5908 /*
5909  * Create the PV entry for a 2MB page mapping.  Always returns true unless the
5910  * flag PMAP_ENTER_NORECLAIM is specified.  If that flag is specified, returns
5911  * false if the PV entry cannot be allocated without resorting to reclamation.
5912  */
5913 static bool
5914 pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, pd_entry_t pde, u_int flags,
5915     struct rwlock **lockp)
5916 {
5917         struct md_page *pvh;
5918         pv_entry_t pv;
5919         vm_paddr_t pa;
5920
5921         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5922         /* Pass NULL instead of the lock pointer to disable reclamation. */
5923         if ((pv = get_pv_entry(pmap, (flags & PMAP_ENTER_NORECLAIM) != 0 ?
5924             NULL : lockp)) == NULL)
5925                 return (false);
5926         pv->pv_va = va;
5927         pa = pde & PG_PS_FRAME;
5928         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
5929         pvh = pa_to_pvh(pa);
5930         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
5931         pvh->pv_gen++;
5932         return (true);
5933 }
5934
5935 /*
5936  * Fills a page table page with mappings to consecutive physical pages.
5937  */
5938 static void
5939 pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte)
5940 {
5941         pt_entry_t *pte;
5942
5943         for (pte = firstpte; pte < firstpte + NPTEPG; pte++) {
5944                 *pte = newpte;
5945                 newpte += PAGE_SIZE;
5946         }
5947 }
5948
5949 /*
5950  * Tries to demote a 2MB page mapping.  If demotion fails, the 2MB page
5951  * mapping is invalidated.
5952  */
5953 static boolean_t
5954 pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
5955 {
5956         struct rwlock *lock;
5957         boolean_t rv;
5958
5959         lock = NULL;
5960         rv = pmap_demote_pde_locked(pmap, pde, va, &lock);
5961         if (lock != NULL)
5962                 rw_wunlock(lock);
5963         return (rv);
5964 }
5965
5966 static void
5967 pmap_demote_pde_check(pt_entry_t *firstpte __unused, pt_entry_t newpte __unused)
5968 {
5969 #ifdef INVARIANTS
5970 #ifdef DIAGNOSTIC
5971         pt_entry_t *xpte, *ypte;
5972
5973         for (xpte = firstpte; xpte < firstpte + NPTEPG;
5974             xpte++, newpte += PAGE_SIZE) {
5975                 if ((*xpte & PG_FRAME) != (newpte & PG_FRAME)) {
5976                         printf("pmap_demote_pde: xpte %zd and newpte map "
5977                             "different pages: found %#lx, expected %#lx\n",
5978                             xpte - firstpte, *xpte, newpte);
5979                         printf("page table dump\n");
5980                         for (ypte = firstpte; ypte < firstpte + NPTEPG; ypte++)
5981                                 printf("%zd %#lx\n", ypte - firstpte, *ypte);
5982                         panic("firstpte");
5983                 }
5984         }
5985 #else
5986         KASSERT((*firstpte & PG_FRAME) == (newpte & PG_FRAME),
5987             ("pmap_demote_pde: firstpte and newpte map different physical"
5988             " addresses"));
5989 #endif
5990 #endif
5991 }
5992
5993 static void
5994 pmap_demote_pde_abort(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
5995     pd_entry_t oldpde, struct rwlock **lockp)
5996 {
5997         struct spglist free;
5998         vm_offset_t sva;
5999
6000         SLIST_INIT(&free);
6001         sva = trunc_2mpage(va);
6002         pmap_remove_pde(pmap, pde, sva, &free, lockp);
6003         if ((oldpde & pmap_global_bit(pmap)) == 0)
6004                 pmap_invalidate_pde_page(pmap, sva, oldpde);
6005         vm_page_free_pages_toq(&free, true);
6006         CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx in pmap %p",
6007             va, pmap);
6008 }
6009
6010 static boolean_t
6011 pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
6012     struct rwlock **lockp)
6013 {
6014         pd_entry_t newpde, oldpde;
6015         pt_entry_t *firstpte, newpte;
6016         pt_entry_t PG_A, PG_G, PG_M, PG_PKU_MASK, PG_RW, PG_V;
6017         vm_paddr_t mptepa;
6018         vm_page_t mpte;
6019         int PG_PTE_CACHE;
6020         bool in_kernel;
6021
6022         PG_A = pmap_accessed_bit(pmap);
6023         PG_G = pmap_global_bit(pmap);
6024         PG_M = pmap_modified_bit(pmap);
6025         PG_RW = pmap_rw_bit(pmap);
6026         PG_V = pmap_valid_bit(pmap);
6027         PG_PTE_CACHE = pmap_cache_mask(pmap, 0);
6028         PG_PKU_MASK = pmap_pku_mask_bit(pmap);
6029
6030         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6031         in_kernel = va >= VM_MAXUSER_ADDRESS;
6032         oldpde = *pde;
6033         KASSERT((oldpde & (PG_PS | PG_V)) == (PG_PS | PG_V),
6034             ("pmap_demote_pde: oldpde is missing PG_PS and/or PG_V"));
6035
6036         /*
6037          * Invalidate the 2MB page mapping and return "failure" if the
6038          * mapping was never accessed.
6039          */
6040         if ((oldpde & PG_A) == 0) {
6041                 KASSERT((oldpde & PG_W) == 0,
6042                     ("pmap_demote_pde: a wired mapping is missing PG_A"));
6043                 pmap_demote_pde_abort(pmap, va, pde, oldpde, lockp);
6044                 return (FALSE);
6045         }
6046
6047         mpte = pmap_remove_pt_page(pmap, va);
6048         if (mpte == NULL) {
6049                 KASSERT((oldpde & PG_W) == 0,
6050                     ("pmap_demote_pde: page table page for a wired mapping"
6051                     " is missing"));
6052
6053                 /*
6054                  * If the page table page is missing and the mapping
6055                  * is for a kernel address, the mapping must belong to
6056                  * the direct map.  Page table pages are preallocated
6057                  * for every other part of the kernel address space,
6058                  * so the direct map region is the only part of the
6059                  * kernel address space that must be handled here.
6060                  */
6061                 KASSERT(!in_kernel || (va >= DMAP_MIN_ADDRESS &&
6062                     va < DMAP_MAX_ADDRESS),
6063                     ("pmap_demote_pde: No saved mpte for va %#lx", va));
6064
6065                 /*
6066                  * If the 2MB page mapping belongs to the direct map
6067                  * region of the kernel's address space, then the page
6068                  * allocation request specifies the highest possible
6069                  * priority (VM_ALLOC_INTERRUPT).  Otherwise, the
6070                  * priority is normal.
6071                  */
6072                 mpte = pmap_alloc_pt_page(pmap, pmap_pde_pindex(va),
6073                     (in_kernel ? VM_ALLOC_INTERRUPT : 0) | VM_ALLOC_WIRED);
6074
6075                 /*
6076                  * If the allocation of the new page table page fails,
6077                  * invalidate the 2MB page mapping and return "failure".
6078                  */
6079                 if (mpte == NULL) {
6080                         pmap_demote_pde_abort(pmap, va, pde, oldpde, lockp);
6081                         return (FALSE);
6082                 }
6083
6084                 if (!in_kernel)
6085                         mpte->ref_count = NPTEPG;
6086         }
6087         mptepa = VM_PAGE_TO_PHYS(mpte);
6088         firstpte = (pt_entry_t *)PHYS_TO_DMAP(mptepa);
6089         newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V;
6090         KASSERT((oldpde & (PG_M | PG_RW)) != PG_RW,
6091             ("pmap_demote_pde: oldpde is missing PG_M"));
6092         newpte = oldpde & ~PG_PS;
6093         newpte = pmap_swap_pat(pmap, newpte);
6094
6095         /*
6096          * If the PTP is not leftover from an earlier promotion or it does not
6097          * have PG_A set in every PTE, then fill it.  The new PTEs will all
6098          * have PG_A set.
6099          */
6100         if (!vm_page_all_valid(mpte))
6101                 pmap_fill_ptp(firstpte, newpte);
6102
6103         pmap_demote_pde_check(firstpte, newpte);
6104
6105         /*
6106          * If the mapping has changed attributes, update the PTEs.
6107          */
6108         if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE))
6109                 pmap_fill_ptp(firstpte, newpte);
6110
6111         /*
6112          * The spare PV entries must be reserved prior to demoting the
6113          * mapping, that is, prior to changing the PDE.  Otherwise, the state
6114          * of the PDE and the PV lists will be inconsistent, which can result
6115          * in reclaim_pv_chunk() attempting to remove a PV entry from the
6116          * wrong PV list and pmap_pv_demote_pde() failing to find the expected
6117          * PV entry for the 2MB page mapping that is being demoted.
6118          */
6119         if ((oldpde & PG_MANAGED) != 0)
6120                 reserve_pv_entries(pmap, NPTEPG - 1, lockp);
6121
6122         /*
6123          * Demote the mapping.  This pmap is locked.  The old PDE has
6124          * PG_A set.  If the old PDE has PG_RW set, it also has PG_M
6125          * set.  Thus, there is no danger of a race with another
6126          * processor changing the setting of PG_A and/or PG_M between
6127          * the read above and the store below. 
6128          */
6129         if (workaround_erratum383)
6130                 pmap_update_pde(pmap, va, pde, newpde);
6131         else
6132                 pde_store(pde, newpde);
6133
6134         /*
6135          * Invalidate a stale recursive mapping of the page table page.
6136          */
6137         if (in_kernel)
6138                 pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va));
6139
6140         /*
6141          * Demote the PV entry.
6142          */
6143         if ((oldpde & PG_MANAGED) != 0)
6144                 pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME, lockp);
6145
6146         counter_u64_add(pmap_pde_demotions, 1);
6147         CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx in pmap %p",
6148             va, pmap);
6149         return (TRUE);
6150 }
6151
6152 /*
6153  * pmap_remove_kernel_pde: Remove a kernel superpage mapping.
6154  */
6155 static void
6156 pmap_remove_kernel_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
6157 {
6158         pd_entry_t newpde;
6159         vm_paddr_t mptepa;
6160         vm_page_t mpte;
6161
6162         KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap));
6163         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6164         mpte = pmap_remove_pt_page(pmap, va);
6165         if (mpte == NULL)
6166                 panic("pmap_remove_kernel_pde: Missing pt page.");
6167
6168         mptepa = VM_PAGE_TO_PHYS(mpte);
6169         newpde = mptepa | X86_PG_M | X86_PG_A | X86_PG_RW | X86_PG_V;
6170
6171         /*
6172          * If this page table page was unmapped by a promotion, then it
6173          * contains valid mappings.  Zero it to invalidate those mappings.
6174          */
6175         if (vm_page_any_valid(mpte))
6176                 pagezero((void *)PHYS_TO_DMAP(mptepa));
6177
6178         /*
6179          * Demote the mapping.
6180          */
6181         if (workaround_erratum383)
6182                 pmap_update_pde(pmap, va, pde, newpde);
6183         else
6184                 pde_store(pde, newpde);
6185
6186         /*
6187          * Invalidate a stale recursive mapping of the page table page.
6188          */
6189         pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va));
6190 }
6191
6192 /*
6193  * pmap_remove_pde: do the things to unmap a superpage in a process
6194  */
6195 static int
6196 pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
6197     struct spglist *free, struct rwlock **lockp)
6198 {
6199         struct md_page *pvh;
6200         pd_entry_t oldpde;
6201         vm_offset_t eva, va;
6202         vm_page_t m, mpte;
6203         pt_entry_t PG_G, PG_A, PG_M, PG_RW;
6204
6205         PG_G = pmap_global_bit(pmap);
6206         PG_A = pmap_accessed_bit(pmap);
6207         PG_M = pmap_modified_bit(pmap);
6208         PG_RW = pmap_rw_bit(pmap);
6209
6210         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6211         KASSERT((sva & PDRMASK) == 0,
6212             ("pmap_remove_pde: sva is not 2mpage aligned"));
6213         oldpde = pte_load_clear(pdq);
6214         if (oldpde & PG_W)
6215                 pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE;
6216         if ((oldpde & PG_G) != 0)
6217                 pmap_invalidate_pde_page(kernel_pmap, sva, oldpde);
6218         pmap_resident_count_adj(pmap, -NBPDR / PAGE_SIZE);
6219         if (oldpde & PG_MANAGED) {
6220                 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, oldpde & PG_PS_FRAME);
6221                 pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
6222                 pmap_pvh_free(pvh, pmap, sva);
6223                 eva = sva + NBPDR;
6224                 for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
6225                     va < eva; va += PAGE_SIZE, m++) {
6226                         if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
6227                                 vm_page_dirty(m);
6228                         if (oldpde & PG_A)
6229                                 vm_page_aflag_set(m, PGA_REFERENCED);
6230                         if (TAILQ_EMPTY(&m->md.pv_list) &&
6231                             TAILQ_EMPTY(&pvh->pv_list))
6232                                 vm_page_aflag_clear(m, PGA_WRITEABLE);
6233                         pmap_delayed_invl_page(m);
6234                 }
6235         }
6236         if (pmap == kernel_pmap) {
6237                 pmap_remove_kernel_pde(pmap, pdq, sva);
6238         } else {
6239                 mpte = pmap_remove_pt_page(pmap, sva);
6240                 if (mpte != NULL) {
6241                         KASSERT(vm_page_any_valid(mpte),
6242                             ("pmap_remove_pde: pte page not promoted"));
6243                         pmap_pt_page_count_adj(pmap, -1);
6244                         KASSERT(mpte->ref_count == NPTEPG,
6245                             ("pmap_remove_pde: pte page ref count error"));
6246                         mpte->ref_count = 0;
6247                         pmap_add_delayed_free_list(mpte, free, FALSE);
6248                 }
6249         }
6250         return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free));
6251 }
6252
6253 /*
6254  * pmap_remove_pte: do the things to unmap a page in a process
6255  */
6256 static int
6257 pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, 
6258     pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp)
6259 {
6260         struct md_page *pvh;
6261         pt_entry_t oldpte, PG_A, PG_M, PG_RW;
6262         vm_page_t m;
6263
6264         PG_A = pmap_accessed_bit(pmap);
6265         PG_M = pmap_modified_bit(pmap);
6266         PG_RW = pmap_rw_bit(pmap);
6267
6268         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6269         oldpte = pte_load_clear(ptq);
6270         if (oldpte & PG_W)
6271                 pmap->pm_stats.wired_count -= 1;
6272         pmap_resident_count_adj(pmap, -1);
6273         if (oldpte & PG_MANAGED) {
6274                 m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
6275                 if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
6276                         vm_page_dirty(m);
6277                 if (oldpte & PG_A)
6278                         vm_page_aflag_set(m, PGA_REFERENCED);
6279                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
6280                 pmap_pvh_free(&m->md, pmap, va);
6281                 if (TAILQ_EMPTY(&m->md.pv_list) &&
6282                     (m->flags & PG_FICTITIOUS) == 0) {
6283                         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
6284                         if (TAILQ_EMPTY(&pvh->pv_list))
6285                                 vm_page_aflag_clear(m, PGA_WRITEABLE);
6286                 }
6287                 pmap_delayed_invl_page(m);
6288         }
6289         return (pmap_unuse_pt(pmap, va, ptepde, free));
6290 }
6291
6292 /*
6293  * Remove a single page from a process address space
6294  */
6295 static void
6296 pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
6297     struct spglist *free)
6298 {
6299         struct rwlock *lock;
6300         pt_entry_t *pte, PG_V;
6301
6302         PG_V = pmap_valid_bit(pmap);
6303         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6304         if ((*pde & PG_V) == 0)
6305                 return;
6306         pte = pmap_pde_to_pte(pde, va);
6307         if ((*pte & PG_V) == 0)
6308                 return;
6309         lock = NULL;
6310         pmap_remove_pte(pmap, pte, va, *pde, free, &lock);
6311         if (lock != NULL)
6312                 rw_wunlock(lock);
6313         pmap_invalidate_page(pmap, va);
6314 }
6315
6316 /*
6317  * Removes the specified range of addresses from the page table page.
6318  */
6319 static bool
6320 pmap_remove_ptes(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
6321     pd_entry_t *pde, struct spglist *free, struct rwlock **lockp)
6322 {
6323         pt_entry_t PG_G, *pte;
6324         vm_offset_t va;
6325         bool anyvalid;
6326
6327         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6328         PG_G = pmap_global_bit(pmap);
6329         anyvalid = false;
6330         va = eva;
6331         for (pte = pmap_pde_to_pte(pde, sva); sva != eva; pte++,
6332             sva += PAGE_SIZE) {
6333                 if (*pte == 0) {
6334                         if (va != eva) {
6335                                 pmap_invalidate_range(pmap, va, sva);
6336                                 va = eva;
6337                         }
6338                         continue;
6339                 }
6340                 if ((*pte & PG_G) == 0)
6341                         anyvalid = true;
6342                 else if (va == eva)
6343                         va = sva;
6344                 if (pmap_remove_pte(pmap, pte, sva, *pde, free, lockp)) {
6345                         sva += PAGE_SIZE;
6346                         break;
6347                 }
6348         }
6349         if (va != eva)
6350                 pmap_invalidate_range(pmap, va, sva);
6351         return (anyvalid);
6352 }
6353
6354 static void
6355 pmap_remove1(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, bool map_delete)
6356 {
6357         struct rwlock *lock;
6358         vm_page_t mt;
6359         vm_offset_t va_next;
6360         pml5_entry_t *pml5e;
6361         pml4_entry_t *pml4e;
6362         pdp_entry_t *pdpe;
6363         pd_entry_t ptpaddr, *pde;
6364         pt_entry_t PG_G, PG_V;
6365         struct spglist free;
6366         int anyvalid;
6367
6368         PG_G = pmap_global_bit(pmap);
6369         PG_V = pmap_valid_bit(pmap);
6370
6371         /*
6372          * If there are no resident pages besides the top level page
6373          * table page(s), there is nothing to do.  Kernel pmap always
6374          * accounts whole preloaded area as resident, which makes its
6375          * resident count > 2.
6376          * Perform an unsynchronized read.  This is, however, safe.
6377          */
6378         if (pmap->pm_stats.resident_count <= 1 + (pmap->pm_pmltopu != NULL ?
6379             1 : 0))
6380                 return;
6381
6382         anyvalid = 0;
6383         SLIST_INIT(&free);
6384
6385         pmap_delayed_invl_start();
6386         PMAP_LOCK(pmap);
6387         if (map_delete)
6388                 pmap_pkru_on_remove(pmap, sva, eva);
6389
6390         /*
6391          * special handling of removing one page.  a very
6392          * common operation and easy to short circuit some
6393          * code.
6394          */
6395         if (sva + PAGE_SIZE == eva) {
6396                 pde = pmap_pde(pmap, sva);
6397                 if (pde && (*pde & PG_PS) == 0) {
6398                         pmap_remove_page(pmap, sva, pde, &free);
6399                         goto out;
6400                 }
6401         }
6402
6403         lock = NULL;
6404         for (; sva < eva; sva = va_next) {
6405                 if (pmap->pm_stats.resident_count == 0)
6406                         break;
6407
6408                 if (pmap_is_la57(pmap)) {
6409                         pml5e = pmap_pml5e(pmap, sva);
6410                         if ((*pml5e & PG_V) == 0) {
6411                                 va_next = (sva + NBPML5) & ~PML5MASK;
6412                                 if (va_next < sva)
6413                                         va_next = eva;
6414                                 continue;
6415                         }
6416                         pml4e = pmap_pml5e_to_pml4e(pml5e, sva);
6417                 } else {
6418                         pml4e = pmap_pml4e(pmap, sva);
6419                 }
6420                 if ((*pml4e & PG_V) == 0) {
6421                         va_next = (sva + NBPML4) & ~PML4MASK;
6422                         if (va_next < sva)
6423                                 va_next = eva;
6424                         continue;
6425                 }
6426
6427                 va_next = (sva + NBPDP) & ~PDPMASK;
6428                 if (va_next < sva)
6429                         va_next = eva;
6430                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
6431                 if ((*pdpe & PG_V) == 0)
6432                         continue;
6433                 if ((*pdpe & PG_PS) != 0) {
6434                         KASSERT(va_next <= eva,
6435                             ("partial update of non-transparent 1G mapping "
6436                             "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
6437                             *pdpe, sva, eva, va_next));
6438                         MPASS(pmap != kernel_pmap); /* XXXKIB */
6439                         MPASS((*pdpe & (PG_MANAGED | PG_G)) == 0);
6440                         anyvalid = 1;
6441                         *pdpe = 0;
6442                         pmap_resident_count_adj(pmap, -NBPDP / PAGE_SIZE);
6443                         mt = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, sva) & PG_FRAME);
6444                         pmap_unwire_ptp(pmap, sva, mt, &free);
6445                         continue;
6446                 }
6447
6448                 /*
6449                  * Calculate index for next page table.
6450                  */
6451                 va_next = (sva + NBPDR) & ~PDRMASK;
6452                 if (va_next < sva)
6453                         va_next = eva;
6454
6455                 pde = pmap_pdpe_to_pde(pdpe, sva);
6456                 ptpaddr = *pde;
6457
6458                 /*
6459                  * Weed out invalid mappings.
6460                  */
6461                 if (ptpaddr == 0)
6462                         continue;
6463
6464                 /*
6465                  * Check for large page.
6466                  */
6467                 if ((ptpaddr & PG_PS) != 0) {
6468                         /*
6469                          * Are we removing the entire large page?  If not,
6470                          * demote the mapping and fall through.
6471                          */
6472                         if (sva + NBPDR == va_next && eva >= va_next) {
6473                                 /*
6474                                  * The TLB entry for a PG_G mapping is
6475                                  * invalidated by pmap_remove_pde().
6476                                  */
6477                                 if ((ptpaddr & PG_G) == 0)
6478                                         anyvalid = 1;
6479                                 pmap_remove_pde(pmap, pde, sva, &free, &lock);
6480                                 continue;
6481                         } else if (!pmap_demote_pde_locked(pmap, pde, sva,
6482                             &lock)) {
6483                                 /* The large page mapping was destroyed. */
6484                                 continue;
6485                         } else
6486                                 ptpaddr = *pde;
6487                 }
6488
6489                 /*
6490                  * Limit our scan to either the end of the va represented
6491                  * by the current page table page, or to the end of the
6492                  * range being removed.
6493                  */
6494                 if (va_next > eva)
6495                         va_next = eva;
6496
6497                 if (pmap_remove_ptes(pmap, sva, va_next, pde, &free, &lock))
6498                         anyvalid = 1;
6499         }
6500         if (lock != NULL)
6501                 rw_wunlock(lock);
6502 out:
6503         if (anyvalid)
6504                 pmap_invalidate_all(pmap);
6505         PMAP_UNLOCK(pmap);
6506         pmap_delayed_invl_finish();
6507         vm_page_free_pages_toq(&free, true);
6508 }
6509
6510 /*
6511  *      Remove the given range of addresses from the specified map.
6512  *
6513  *      It is assumed that the start and end are properly
6514  *      rounded to the page size.
6515  */
6516 void
6517 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
6518 {
6519         pmap_remove1(pmap, sva, eva, false);
6520 }
6521
6522 /*
6523  *      Remove the given range of addresses as part of a logical unmap
6524  *      operation. This has the effect of calling pmap_remove(), but
6525  *      also clears any metadata that should persist for the lifetime
6526  *      of a logical mapping.
6527  */
6528 void
6529 pmap_map_delete(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
6530 {
6531         pmap_remove1(pmap, sva, eva, true);
6532 }
6533
6534 /*
6535  *      Routine:        pmap_remove_all
6536  *      Function:
6537  *              Removes this physical page from
6538  *              all physical maps in which it resides.
6539  *              Reflects back modify bits to the pager.
6540  *
6541  *      Notes:
6542  *              Original versions of this routine were very
6543  *              inefficient because they iteratively called
6544  *              pmap_remove (slow...)
6545  */
6546
6547 void
6548 pmap_remove_all(vm_page_t m)
6549 {
6550         struct md_page *pvh;
6551         pv_entry_t pv;
6552         pmap_t pmap;
6553         struct rwlock *lock;
6554         pt_entry_t *pte, tpte, PG_A, PG_M, PG_RW;
6555         pd_entry_t *pde;
6556         vm_offset_t va;
6557         struct spglist free;
6558         int pvh_gen, md_gen;
6559
6560         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
6561             ("pmap_remove_all: page %p is not managed", m));
6562         SLIST_INIT(&free);
6563         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
6564         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
6565             pa_to_pvh(VM_PAGE_TO_PHYS(m));
6566         rw_wlock(lock);
6567 retry:
6568         while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
6569                 pmap = PV_PMAP(pv);
6570                 if (!PMAP_TRYLOCK(pmap)) {
6571                         pvh_gen = pvh->pv_gen;
6572                         rw_wunlock(lock);
6573                         PMAP_LOCK(pmap);
6574                         rw_wlock(lock);
6575                         if (pvh_gen != pvh->pv_gen) {
6576                                 PMAP_UNLOCK(pmap);
6577                                 goto retry;
6578                         }
6579                 }
6580                 va = pv->pv_va;
6581                 pde = pmap_pde(pmap, va);
6582                 (void)pmap_demote_pde_locked(pmap, pde, va, &lock);
6583                 PMAP_UNLOCK(pmap);
6584         }
6585         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
6586                 pmap = PV_PMAP(pv);
6587                 if (!PMAP_TRYLOCK(pmap)) {
6588                         pvh_gen = pvh->pv_gen;
6589                         md_gen = m->md.pv_gen;
6590                         rw_wunlock(lock);
6591                         PMAP_LOCK(pmap);
6592                         rw_wlock(lock);
6593                         if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
6594                                 PMAP_UNLOCK(pmap);
6595                                 goto retry;
6596                         }
6597                 }
6598                 PG_A = pmap_accessed_bit(pmap);
6599                 PG_M = pmap_modified_bit(pmap);
6600                 PG_RW = pmap_rw_bit(pmap);
6601                 pmap_resident_count_adj(pmap, -1);
6602                 pde = pmap_pde(pmap, pv->pv_va);
6603                 KASSERT((*pde & PG_PS) == 0, ("pmap_remove_all: found"
6604                     " a 2mpage in page %p's pv list", m));
6605                 pte = pmap_pde_to_pte(pde, pv->pv_va);
6606                 tpte = pte_load_clear(pte);
6607                 if (tpte & PG_W)
6608                         pmap->pm_stats.wired_count--;
6609                 if (tpte & PG_A)
6610                         vm_page_aflag_set(m, PGA_REFERENCED);
6611
6612                 /*
6613                  * Update the vm_page_t clean and reference bits.
6614                  */
6615                 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
6616                         vm_page_dirty(m);
6617                 pmap_unuse_pt(pmap, pv->pv_va, *pde, &free);
6618                 pmap_invalidate_page(pmap, pv->pv_va);
6619                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
6620                 m->md.pv_gen++;
6621                 free_pv_entry(pmap, pv);
6622                 PMAP_UNLOCK(pmap);
6623         }
6624         vm_page_aflag_clear(m, PGA_WRITEABLE);
6625         rw_wunlock(lock);
6626         pmap_delayed_invl_wait(m);
6627         vm_page_free_pages_toq(&free, true);
6628 }
6629
6630 /*
6631  * pmap_protect_pde: do the things to protect a 2mpage in a process
6632  */
6633 static boolean_t
6634 pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
6635 {
6636         pd_entry_t newpde, oldpde;
6637         vm_page_t m, mt;
6638         boolean_t anychanged;
6639         pt_entry_t PG_G, PG_M, PG_RW;
6640
6641         PG_G = pmap_global_bit(pmap);
6642         PG_M = pmap_modified_bit(pmap);
6643         PG_RW = pmap_rw_bit(pmap);
6644
6645         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6646         KASSERT((sva & PDRMASK) == 0,
6647             ("pmap_protect_pde: sva is not 2mpage aligned"));
6648         anychanged = FALSE;
6649 retry:
6650         oldpde = newpde = *pde;
6651         if ((prot & VM_PROT_WRITE) == 0) {
6652                 if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) ==
6653                     (PG_MANAGED | PG_M | PG_RW)) {
6654                         m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
6655                         for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
6656                                 vm_page_dirty(mt);
6657                 }
6658                 newpde &= ~(PG_RW | PG_M);
6659         }
6660         if ((prot & VM_PROT_EXECUTE) == 0)
6661                 newpde |= pg_nx;
6662         if (newpde != oldpde) {
6663                 /*
6664                  * As an optimization to future operations on this PDE, clear
6665                  * PG_PROMOTED.  The impending invalidation will remove any
6666                  * lingering 4KB page mappings from the TLB.
6667                  */
6668                 if (!atomic_cmpset_long(pde, oldpde, newpde & ~PG_PROMOTED))
6669                         goto retry;
6670                 if ((oldpde & PG_G) != 0)
6671                         pmap_invalidate_pde_page(kernel_pmap, sva, oldpde);
6672                 else
6673                         anychanged = TRUE;
6674         }
6675         return (anychanged);
6676 }
6677
6678 /*
6679  *      Set the physical protection on the
6680  *      specified range of this map as requested.
6681  */
6682 void
6683 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
6684 {
6685         vm_page_t m;
6686         vm_offset_t va_next;
6687         pml4_entry_t *pml4e;
6688         pdp_entry_t *pdpe;
6689         pd_entry_t ptpaddr, *pde;
6690         pt_entry_t *pte, PG_G, PG_M, PG_RW, PG_V;
6691         pt_entry_t obits, pbits;
6692         boolean_t anychanged;
6693
6694         KASSERT((prot & ~VM_PROT_ALL) == 0, ("invalid prot %x", prot));
6695         if (prot == VM_PROT_NONE) {
6696                 pmap_remove(pmap, sva, eva);
6697                 return;
6698         }
6699
6700         if ((prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) ==
6701             (VM_PROT_WRITE|VM_PROT_EXECUTE))
6702                 return;
6703
6704         PG_G = pmap_global_bit(pmap);
6705         PG_M = pmap_modified_bit(pmap);
6706         PG_V = pmap_valid_bit(pmap);
6707         PG_RW = pmap_rw_bit(pmap);
6708         anychanged = FALSE;
6709
6710         /*
6711          * Although this function delays and batches the invalidation
6712          * of stale TLB entries, it does not need to call
6713          * pmap_delayed_invl_start() and
6714          * pmap_delayed_invl_finish(), because it does not
6715          * ordinarily destroy mappings.  Stale TLB entries from
6716          * protection-only changes need only be invalidated before the
6717          * pmap lock is released, because protection-only changes do
6718          * not destroy PV entries.  Even operations that iterate over
6719          * a physical page's PV list of mappings, like
6720          * pmap_remove_write(), acquire the pmap lock for each
6721          * mapping.  Consequently, for protection-only changes, the
6722          * pmap lock suffices to synchronize both page table and TLB
6723          * updates.
6724          *
6725          * This function only destroys a mapping if pmap_demote_pde()
6726          * fails.  In that case, stale TLB entries are immediately
6727          * invalidated.
6728          */
6729
6730         PMAP_LOCK(pmap);
6731         for (; sva < eva; sva = va_next) {
6732                 pml4e = pmap_pml4e(pmap, sva);
6733                 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
6734                         va_next = (sva + NBPML4) & ~PML4MASK;
6735                         if (va_next < sva)
6736                                 va_next = eva;
6737                         continue;
6738                 }
6739
6740                 va_next = (sva + NBPDP) & ~PDPMASK;
6741                 if (va_next < sva)
6742                         va_next = eva;
6743                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
6744                 if ((*pdpe & PG_V) == 0)
6745                         continue;
6746                 if ((*pdpe & PG_PS) != 0) {
6747                         KASSERT(va_next <= eva,
6748                             ("partial update of non-transparent 1G mapping "
6749                             "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
6750                             *pdpe, sva, eva, va_next));
6751 retry_pdpe:
6752                         obits = pbits = *pdpe;
6753                         MPASS((pbits & (PG_MANAGED | PG_G)) == 0);
6754                         MPASS(pmap != kernel_pmap); /* XXXKIB */
6755                         if ((prot & VM_PROT_WRITE) == 0)
6756                                 pbits &= ~(PG_RW | PG_M);
6757                         if ((prot & VM_PROT_EXECUTE) == 0)
6758                                 pbits |= pg_nx;
6759
6760                         if (pbits != obits) {
6761                                 if (!atomic_cmpset_long(pdpe, obits, pbits))
6762                                         /* PG_PS cannot be cleared under us, */
6763                                         goto retry_pdpe;
6764                                 anychanged = TRUE;
6765                         }
6766                         continue;
6767                 }
6768
6769                 va_next = (sva + NBPDR) & ~PDRMASK;
6770                 if (va_next < sva)
6771                         va_next = eva;
6772
6773                 pde = pmap_pdpe_to_pde(pdpe, sva);
6774                 ptpaddr = *pde;
6775
6776                 /*
6777                  * Weed out invalid mappings.
6778                  */
6779                 if (ptpaddr == 0)
6780                         continue;
6781
6782                 /*
6783                  * Check for large page.
6784                  */
6785                 if ((ptpaddr & PG_PS) != 0) {
6786                         /*
6787                          * Are we protecting the entire large page?  If not,
6788                          * demote the mapping and fall through.
6789                          */
6790                         if (sva + NBPDR == va_next && eva >= va_next) {
6791                                 /*
6792                                  * The TLB entry for a PG_G mapping is
6793                                  * invalidated by pmap_protect_pde().
6794                                  */
6795                                 if (pmap_protect_pde(pmap, pde, sva, prot))
6796                                         anychanged = TRUE;
6797                                 continue;
6798                         } else if (!pmap_demote_pde(pmap, pde, sva)) {
6799                                 /*
6800                                  * The large page mapping was destroyed.
6801                                  */
6802                                 continue;
6803                         }
6804                 }
6805
6806                 if (va_next > eva)
6807                         va_next = eva;
6808
6809                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
6810                     sva += PAGE_SIZE) {
6811 retry:
6812                         obits = pbits = *pte;
6813                         if ((pbits & PG_V) == 0)
6814                                 continue;
6815
6816                         if ((prot & VM_PROT_WRITE) == 0) {
6817                                 if ((pbits & (PG_MANAGED | PG_M | PG_RW)) ==
6818                                     (PG_MANAGED | PG_M | PG_RW)) {
6819                                         m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
6820                                         vm_page_dirty(m);
6821                                 }
6822                                 pbits &= ~(PG_RW | PG_M);
6823                         }
6824                         if ((prot & VM_PROT_EXECUTE) == 0)
6825                                 pbits |= pg_nx;
6826
6827                         if (pbits != obits) {
6828                                 if (!atomic_cmpset_long(pte, obits, pbits))
6829                                         goto retry;
6830                                 if (obits & PG_G)
6831                                         pmap_invalidate_page(pmap, sva);
6832                                 else
6833                                         anychanged = TRUE;
6834                         }
6835                 }
6836         }
6837         if (anychanged)
6838                 pmap_invalidate_all(pmap);
6839         PMAP_UNLOCK(pmap);
6840 }
6841
6842 #if VM_NRESERVLEVEL > 0
6843 static bool
6844 pmap_pde_ept_executable(pmap_t pmap, pd_entry_t pde)
6845 {
6846
6847         if (pmap->pm_type != PT_EPT)
6848                 return (false);
6849         return ((pde & EPT_PG_EXECUTE) != 0);
6850 }
6851
6852 /*
6853  * Tries to promote the 512, contiguous 4KB page mappings that are within a
6854  * single page table page (PTP) to a single 2MB page mapping.  For promotion
6855  * to occur, two conditions must be met: (1) the 4KB page mappings must map
6856  * aligned, contiguous physical memory and (2) the 4KB page mappings must have
6857  * identical characteristics. 
6858  */
6859 static void
6860 pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, vm_page_t mpte,
6861     struct rwlock **lockp)
6862 {
6863         pd_entry_t newpde;
6864         pt_entry_t *firstpte, oldpte, pa, *pte;
6865         pt_entry_t allpte_PG_A, PG_A, PG_G, PG_M, PG_PKU_MASK, PG_RW, PG_V;
6866         int PG_PTE_CACHE;
6867
6868         PG_A = pmap_accessed_bit(pmap);
6869         PG_G = pmap_global_bit(pmap);
6870         PG_M = pmap_modified_bit(pmap);
6871         PG_V = pmap_valid_bit(pmap);
6872         PG_RW = pmap_rw_bit(pmap);
6873         PG_PKU_MASK = pmap_pku_mask_bit(pmap);
6874         PG_PTE_CACHE = pmap_cache_mask(pmap, 0);
6875
6876         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6877
6878         /*
6879          * Examine the first PTE in the specified PTP.  Abort if this PTE is
6880          * ineligible for promotion due to hardware errata, invalid, or does
6881          * not map the first 4KB physical page within a 2MB page.
6882          */
6883         firstpte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
6884         newpde = *firstpte;
6885         if (!pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap, newpde)))
6886                 return;
6887         if ((newpde & ((PG_FRAME & PDRMASK) | PG_V)) != PG_V) {
6888                 counter_u64_add(pmap_pde_p_failures, 1);
6889                 CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
6890                     " in pmap %p", va, pmap);
6891                 return;
6892         }
6893
6894         /*
6895          * Both here and in the below "for" loop, to allow for repromotion
6896          * after MADV_FREE, conditionally write protect a clean PTE before
6897          * possibly aborting the promotion due to other PTE attributes.  Why?
6898          * Suppose that MADV_FREE is applied to a part of a superpage, the
6899          * address range [S, E).  pmap_advise() will demote the superpage
6900          * mapping, destroy the 4KB page mapping at the end of [S, E), and
6901          * clear PG_M and PG_A in the PTEs for the rest of [S, E).  Later,
6902          * imagine that the memory in [S, E) is recycled, but the last 4KB
6903          * page in [S, E) is not the last to be rewritten, or simply accessed.
6904          * In other words, there is still a 4KB page in [S, E), call it P,
6905          * that is writeable but PG_M and PG_A are clear in P's PTE.  Unless
6906          * we write protect P before aborting the promotion, if and when P is
6907          * finally rewritten, there won't be a page fault to trigger
6908          * repromotion.
6909          */
6910 setpde:
6911         if ((newpde & (PG_M | PG_RW)) == PG_RW) {
6912                 /*
6913                  * When PG_M is already clear, PG_RW can be cleared without
6914                  * a TLB invalidation.
6915                  */
6916                 if (!atomic_fcmpset_long(firstpte, &newpde, newpde & ~PG_RW))
6917                         goto setpde;
6918                 newpde &= ~PG_RW;
6919                 CTR2(KTR_PMAP, "pmap_promote_pde: protect for va %#lx"
6920                     " in pmap %p", va & ~PDRMASK, pmap);
6921         }
6922
6923         /*
6924          * Examine each of the other PTEs in the specified PTP.  Abort if this
6925          * PTE maps an unexpected 4KB physical page or does not have identical
6926          * characteristics to the first PTE.
6927          */
6928         allpte_PG_A = newpde & PG_A;
6929         pa = (newpde & (PG_PS_FRAME | PG_V)) + NBPDR - PAGE_SIZE;
6930         for (pte = firstpte + NPTEPG - 1; pte > firstpte; pte--) {
6931                 oldpte = *pte;
6932                 if ((oldpte & (PG_FRAME | PG_V)) != pa) {
6933                         counter_u64_add(pmap_pde_p_failures, 1);
6934                         CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
6935                             " in pmap %p", va, pmap);
6936                         return;
6937                 }
6938 setpte:
6939                 if ((oldpte & (PG_M | PG_RW)) == PG_RW) {
6940                         /*
6941                          * When PG_M is already clear, PG_RW can be cleared
6942                          * without a TLB invalidation.
6943                          */
6944                         if (!atomic_fcmpset_long(pte, &oldpte, oldpte & ~PG_RW))
6945                                 goto setpte;
6946                         oldpte &= ~PG_RW;
6947                         CTR2(KTR_PMAP, "pmap_promote_pde: protect for va %#lx"
6948                             " in pmap %p", (oldpte & PG_FRAME & PDRMASK) |
6949                             (va & ~PDRMASK), pmap);
6950                 }
6951                 if ((oldpte & PG_PTE_PROMOTE) != (newpde & PG_PTE_PROMOTE)) {
6952                         counter_u64_add(pmap_pde_p_failures, 1);
6953                         CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
6954                             " in pmap %p", va, pmap);
6955                         return;
6956                 }
6957                 allpte_PG_A &= oldpte;
6958                 pa -= PAGE_SIZE;
6959         }
6960
6961         /*
6962          * Unless all PTEs have PG_A set, clear it from the superpage mapping,
6963          * so that promotions triggered by speculative mappings, such as
6964          * pmap_enter_quick(), don't automatically mark the underlying pages
6965          * as referenced.
6966          */
6967         newpde &= ~PG_A | allpte_PG_A;
6968
6969         /*
6970          * EPT PTEs with PG_M set and PG_A clear are not supported by early
6971          * MMUs supporting EPT.
6972          */
6973         KASSERT((newpde & PG_A) != 0 || safe_to_clear_referenced(pmap, newpde),
6974             ("unsupported EPT PTE"));
6975
6976         /*
6977          * Save the PTP in its current state until the PDE mapping the
6978          * superpage is demoted by pmap_demote_pde() or destroyed by
6979          * pmap_remove_pde().  If PG_A is not set in every PTE, then request
6980          * that the PTP be refilled on demotion.
6981          */
6982         if (mpte == NULL)
6983                 mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
6984         KASSERT(mpte >= vm_page_array &&
6985             mpte < &vm_page_array[vm_page_array_size],
6986             ("pmap_promote_pde: page table page is out of range"));
6987         KASSERT(mpte->pindex == pmap_pde_pindex(va),
6988             ("pmap_promote_pde: page table page's pindex is wrong "
6989             "mpte %p pidx %#lx va %#lx va pde pidx %#lx",
6990             mpte, mpte->pindex, va, pmap_pde_pindex(va)));
6991         if (pmap_insert_pt_page(pmap, mpte, true, allpte_PG_A != 0)) {
6992                 counter_u64_add(pmap_pde_p_failures, 1);
6993                 CTR2(KTR_PMAP,
6994                     "pmap_promote_pde: failure for va %#lx in pmap %p", va,
6995                     pmap);
6996                 return;
6997         }
6998
6999         /*
7000          * Promote the pv entries.
7001          */
7002         if ((newpde & PG_MANAGED) != 0)
7003                 pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME, lockp);
7004
7005         /*
7006          * Propagate the PAT index to its proper position.
7007          */
7008         newpde = pmap_swap_pat(pmap, newpde);
7009
7010         /*
7011          * Map the superpage.
7012          */
7013         if (workaround_erratum383)
7014                 pmap_update_pde(pmap, va, pde, PG_PS | newpde);
7015         else
7016                 pde_store(pde, PG_PROMOTED | PG_PS | newpde);
7017
7018         counter_u64_add(pmap_pde_promotions, 1);
7019         CTR2(KTR_PMAP, "pmap_promote_pde: success for va %#lx"
7020             " in pmap %p", va, pmap);
7021 }
7022 #endif /* VM_NRESERVLEVEL > 0 */
7023
7024 static int
7025 pmap_enter_largepage(pmap_t pmap, vm_offset_t va, pt_entry_t newpte, int flags,
7026     int psind)
7027 {
7028         vm_page_t mp;
7029         pt_entry_t origpte, *pml4e, *pdpe, *pde, pten, PG_V;
7030
7031         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7032         KASSERT(psind > 0 && psind < MAXPAGESIZES && pagesizes[psind] != 0,
7033             ("psind %d unexpected", psind));
7034         KASSERT(((newpte & PG_FRAME) & (pagesizes[psind] - 1)) == 0,
7035             ("unaligned phys address %#lx newpte %#lx psind %d",
7036             newpte & PG_FRAME, newpte, psind));
7037         KASSERT((va & (pagesizes[psind] - 1)) == 0,
7038             ("unaligned va %#lx psind %d", va, psind));
7039         KASSERT(va < VM_MAXUSER_ADDRESS,
7040             ("kernel mode non-transparent superpage")); /* XXXKIB */
7041         KASSERT(va + pagesizes[psind] < VM_MAXUSER_ADDRESS,
7042             ("overflowing user map va %#lx psind %d", va, psind)); /* XXXKIB */
7043
7044         PG_V = pmap_valid_bit(pmap);
7045
7046 restart:
7047         if (!pmap_pkru_same(pmap, va, va + pagesizes[psind]))
7048                 return (KERN_PROTECTION_FAILURE);
7049         pten = newpte;
7050         if (va < VM_MAXUSER_ADDRESS && pmap->pm_type == PT_X86)
7051                 pten |= pmap_pkru_get(pmap, va);
7052
7053         if (psind == 2) {       /* 1G */
7054                 pml4e = pmap_pml4e(pmap, va);
7055                 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
7056                         mp = pmap_allocpte_alloc(pmap, pmap_pml4e_pindex(va),
7057                             NULL, va);
7058                         if (mp == NULL)
7059                                 goto allocf;
7060                         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mp));
7061                         pdpe = &pdpe[pmap_pdpe_index(va)];
7062                         origpte = *pdpe;
7063                         MPASS(origpte == 0);
7064                 } else {
7065                         pdpe = pmap_pml4e_to_pdpe(pml4e, va);
7066                         KASSERT(pdpe != NULL, ("va %#lx lost pdpe", va));
7067                         origpte = *pdpe;
7068                         if ((origpte & PG_V) == 0) {
7069                                 mp = PHYS_TO_VM_PAGE(*pml4e & PG_FRAME);
7070                                 mp->ref_count++;
7071                         }
7072                 }
7073                 *pdpe = pten;
7074         } else /* (psind == 1) */ {     /* 2M */
7075                 pde = pmap_pde(pmap, va);
7076                 if (pde == NULL) {
7077                         mp = pmap_allocpte_alloc(pmap, pmap_pdpe_pindex(va),
7078                             NULL, va);
7079                         if (mp == NULL)
7080                                 goto allocf;
7081                         pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mp));
7082                         pde = &pde[pmap_pde_index(va)];
7083                         origpte = *pde;
7084                         MPASS(origpte == 0);
7085                 } else {
7086                         origpte = *pde;
7087                         if ((origpte & PG_V) == 0) {
7088                                 pdpe = pmap_pdpe(pmap, va);
7089                                 MPASS(pdpe != NULL && (*pdpe & PG_V) != 0);
7090                                 mp = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
7091                                 mp->ref_count++;
7092                         }
7093                 }
7094                 *pde = pten;
7095         }
7096         KASSERT((origpte & PG_V) == 0 || ((origpte & PG_PS) != 0 &&
7097             (origpte & PG_PS_FRAME) == (pten & PG_PS_FRAME)),
7098             ("va %#lx changing %s phys page origpte %#lx pten %#lx",
7099             va, psind == 2 ? "1G" : "2M", origpte, pten));
7100         if ((pten & PG_W) != 0 && (origpte & PG_W) == 0)
7101                 pmap->pm_stats.wired_count += pagesizes[psind] / PAGE_SIZE;
7102         else if ((pten & PG_W) == 0 && (origpte & PG_W) != 0)
7103                 pmap->pm_stats.wired_count -= pagesizes[psind] / PAGE_SIZE;
7104         if ((origpte & PG_V) == 0)
7105                 pmap_resident_count_adj(pmap, pagesizes[psind] / PAGE_SIZE);
7106
7107         return (KERN_SUCCESS);
7108
7109 allocf:
7110         if ((flags & PMAP_ENTER_NOSLEEP) != 0)
7111                 return (KERN_RESOURCE_SHORTAGE);
7112         PMAP_UNLOCK(pmap);
7113         vm_wait(NULL);
7114         PMAP_LOCK(pmap);
7115         goto restart;
7116 }
7117
7118 /*
7119  *      Insert the given physical page (p) at
7120  *      the specified virtual address (v) in the
7121  *      target physical map with the protection requested.
7122  *
7123  *      If specified, the page will be wired down, meaning
7124  *      that the related pte can not be reclaimed.
7125  *
7126  *      NB:  This is the only routine which MAY NOT lazy-evaluate
7127  *      or lose information.  That is, this routine must actually
7128  *      insert this page into the given map NOW.
7129  *
7130  *      When destroying both a page table and PV entry, this function
7131  *      performs the TLB invalidation before releasing the PV list
7132  *      lock, so we do not need pmap_delayed_invl_page() calls here.
7133  */
7134 int
7135 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
7136     u_int flags, int8_t psind)
7137 {
7138         struct rwlock *lock;
7139         pd_entry_t *pde;
7140         pt_entry_t *pte, PG_G, PG_A, PG_M, PG_RW, PG_V;
7141         pt_entry_t newpte, origpte;
7142         pv_entry_t pv;
7143         vm_paddr_t opa, pa;
7144         vm_page_t mpte, om;
7145         int rv;
7146         boolean_t nosleep;
7147
7148         PG_A = pmap_accessed_bit(pmap);
7149         PG_G = pmap_global_bit(pmap);
7150         PG_M = pmap_modified_bit(pmap);
7151         PG_V = pmap_valid_bit(pmap);
7152         PG_RW = pmap_rw_bit(pmap);
7153
7154         va = trunc_page(va);
7155         KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
7156         KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
7157             ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)",
7158             va));
7159         KASSERT((m->oflags & VPO_UNMANAGED) != 0 || !VA_IS_CLEANMAP(va),
7160             ("pmap_enter: managed mapping within the clean submap"));
7161         if ((m->oflags & VPO_UNMANAGED) == 0)
7162                 VM_PAGE_OBJECT_BUSY_ASSERT(m);
7163         KASSERT((flags & PMAP_ENTER_RESERVED) == 0,
7164             ("pmap_enter: flags %u has reserved bits set", flags));
7165         pa = VM_PAGE_TO_PHYS(m);
7166         newpte = (pt_entry_t)(pa | PG_A | PG_V);
7167         if ((flags & VM_PROT_WRITE) != 0)
7168                 newpte |= PG_M;
7169         if ((prot & VM_PROT_WRITE) != 0)
7170                 newpte |= PG_RW;
7171         KASSERT((newpte & (PG_M | PG_RW)) != PG_M,
7172             ("pmap_enter: flags includes VM_PROT_WRITE but prot doesn't"));
7173         if ((prot & VM_PROT_EXECUTE) == 0)
7174                 newpte |= pg_nx;
7175         if ((flags & PMAP_ENTER_WIRED) != 0)
7176                 newpte |= PG_W;
7177         if (va < VM_MAXUSER_ADDRESS)
7178                 newpte |= PG_U;
7179         if (pmap == kernel_pmap)
7180                 newpte |= PG_G;
7181         newpte |= pmap_cache_bits(pmap, m->md.pat_mode, psind > 0);
7182
7183         /*
7184          * Set modified bit gratuitously for writeable mappings if
7185          * the page is unmanaged. We do not want to take a fault
7186          * to do the dirty bit accounting for these mappings.
7187          */
7188         if ((m->oflags & VPO_UNMANAGED) != 0) {
7189                 if ((newpte & PG_RW) != 0)
7190                         newpte |= PG_M;
7191         } else
7192                 newpte |= PG_MANAGED;
7193
7194         lock = NULL;
7195         PMAP_LOCK(pmap);
7196         if ((flags & PMAP_ENTER_LARGEPAGE) != 0) {
7197                 KASSERT((m->oflags & VPO_UNMANAGED) != 0,
7198                     ("managed largepage va %#lx flags %#x", va, flags));
7199                 rv = pmap_enter_largepage(pmap, va, newpte | PG_PS, flags,
7200                     psind);
7201                 goto out;
7202         }
7203         if (psind == 1) {
7204                 /* Assert the required virtual and physical alignment. */ 
7205                 KASSERT((va & PDRMASK) == 0, ("pmap_enter: va unaligned"));
7206                 KASSERT(m->psind > 0, ("pmap_enter: m->psind < psind"));
7207                 rv = pmap_enter_pde(pmap, va, newpte | PG_PS, flags, m, &lock);
7208                 goto out;
7209         }
7210         mpte = NULL;
7211
7212         /*
7213          * In the case that a page table page is not
7214          * resident, we are creating it here.
7215          */
7216 retry:
7217         pde = pmap_pde(pmap, va);
7218         if (pde != NULL && (*pde & PG_V) != 0 && ((*pde & PG_PS) == 0 ||
7219             pmap_demote_pde_locked(pmap, pde, va, &lock))) {
7220                 pte = pmap_pde_to_pte(pde, va);
7221                 if (va < VM_MAXUSER_ADDRESS && mpte == NULL) {
7222                         mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7223                         mpte->ref_count++;
7224                 }
7225         } else if (va < VM_MAXUSER_ADDRESS) {
7226                 /*
7227                  * Here if the pte page isn't mapped, or if it has been
7228                  * deallocated.
7229                  */
7230                 nosleep = (flags & PMAP_ENTER_NOSLEEP) != 0;
7231                 mpte = pmap_allocpte_alloc(pmap, pmap_pde_pindex(va),
7232                     nosleep ? NULL : &lock, va);
7233                 if (mpte == NULL && nosleep) {
7234                         rv = KERN_RESOURCE_SHORTAGE;
7235                         goto out;
7236                 }
7237                 goto retry;
7238         } else
7239                 panic("pmap_enter: invalid page directory va=%#lx", va);
7240
7241         origpte = *pte;
7242         pv = NULL;
7243         if (va < VM_MAXUSER_ADDRESS && pmap->pm_type == PT_X86)
7244                 newpte |= pmap_pkru_get(pmap, va);
7245
7246         /*
7247          * Is the specified virtual address already mapped?
7248          */
7249         if ((origpte & PG_V) != 0) {
7250                 /*
7251                  * Wiring change, just update stats. We don't worry about
7252                  * wiring PT pages as they remain resident as long as there
7253                  * are valid mappings in them. Hence, if a user page is wired,
7254                  * the PT page will be also.
7255                  */
7256                 if ((newpte & PG_W) != 0 && (origpte & PG_W) == 0)
7257                         pmap->pm_stats.wired_count++;
7258                 else if ((newpte & PG_W) == 0 && (origpte & PG_W) != 0)
7259                         pmap->pm_stats.wired_count--;
7260
7261                 /*
7262                  * Remove the extra PT page reference.
7263                  */
7264                 if (mpte != NULL) {
7265                         mpte->ref_count--;
7266                         KASSERT(mpte->ref_count > 0,
7267                             ("pmap_enter: missing reference to page table page,"
7268                              " va: 0x%lx", va));
7269                 }
7270
7271                 /*
7272                  * Has the physical page changed?
7273                  */
7274                 opa = origpte & PG_FRAME;
7275                 if (opa == pa) {
7276                         /*
7277                          * No, might be a protection or wiring change.
7278                          */
7279                         if ((origpte & PG_MANAGED) != 0 &&
7280                             (newpte & PG_RW) != 0)
7281                                 vm_page_aflag_set(m, PGA_WRITEABLE);
7282                         if (((origpte ^ newpte) & ~(PG_M | PG_A)) == 0)
7283                                 goto unchanged;
7284                         goto validate;
7285                 }
7286
7287                 /*
7288                  * The physical page has changed.  Temporarily invalidate
7289                  * the mapping.  This ensures that all threads sharing the
7290                  * pmap keep a consistent view of the mapping, which is
7291                  * necessary for the correct handling of COW faults.  It
7292                  * also permits reuse of the old mapping's PV entry,
7293                  * avoiding an allocation.
7294                  *
7295                  * For consistency, handle unmanaged mappings the same way.
7296                  */
7297                 origpte = pte_load_clear(pte);
7298                 KASSERT((origpte & PG_FRAME) == opa,
7299                     ("pmap_enter: unexpected pa update for %#lx", va));
7300                 if ((origpte & PG_MANAGED) != 0) {
7301                         om = PHYS_TO_VM_PAGE(opa);
7302
7303                         /*
7304                          * The pmap lock is sufficient to synchronize with
7305                          * concurrent calls to pmap_page_test_mappings() and
7306                          * pmap_ts_referenced().
7307                          */
7308                         if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
7309                                 vm_page_dirty(om);
7310                         if ((origpte & PG_A) != 0) {
7311                                 pmap_invalidate_page(pmap, va);
7312                                 vm_page_aflag_set(om, PGA_REFERENCED);
7313                         }
7314                         CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
7315                         pv = pmap_pvh_remove(&om->md, pmap, va);
7316                         KASSERT(pv != NULL,
7317                             ("pmap_enter: no PV entry for %#lx", va));
7318                         if ((newpte & PG_MANAGED) == 0)
7319                                 free_pv_entry(pmap, pv);
7320                         if ((om->a.flags & PGA_WRITEABLE) != 0 &&
7321                             TAILQ_EMPTY(&om->md.pv_list) &&
7322                             ((om->flags & PG_FICTITIOUS) != 0 ||
7323                             TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)))
7324                                 vm_page_aflag_clear(om, PGA_WRITEABLE);
7325                 } else {
7326                         /*
7327                          * Since this mapping is unmanaged, assume that PG_A
7328                          * is set.
7329                          */
7330                         pmap_invalidate_page(pmap, va);
7331                 }
7332                 origpte = 0;
7333         } else {
7334                 /*
7335                  * Increment the counters.
7336                  */
7337                 if ((newpte & PG_W) != 0)
7338                         pmap->pm_stats.wired_count++;
7339                 pmap_resident_count_adj(pmap, 1);
7340         }
7341
7342         /*
7343          * Enter on the PV list if part of our managed memory.
7344          */
7345         if ((newpte & PG_MANAGED) != 0) {
7346                 if (pv == NULL) {
7347                         pv = get_pv_entry(pmap, &lock);
7348                         pv->pv_va = va;
7349                 }
7350                 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
7351                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
7352                 m->md.pv_gen++;
7353                 if ((newpte & PG_RW) != 0)
7354                         vm_page_aflag_set(m, PGA_WRITEABLE);
7355         }
7356
7357         /*
7358          * Update the PTE.
7359          */
7360         if ((origpte & PG_V) != 0) {
7361 validate:
7362                 origpte = pte_load_store(pte, newpte);
7363                 KASSERT((origpte & PG_FRAME) == pa,
7364                     ("pmap_enter: unexpected pa update for %#lx", va));
7365                 if ((newpte & PG_M) == 0 && (origpte & (PG_M | PG_RW)) ==
7366                     (PG_M | PG_RW)) {
7367                         if ((origpte & PG_MANAGED) != 0)
7368                                 vm_page_dirty(m);
7369
7370                         /*
7371                          * Although the PTE may still have PG_RW set, TLB
7372                          * invalidation may nonetheless be required because
7373                          * the PTE no longer has PG_M set.
7374                          */
7375                 } else if ((origpte & PG_NX) != 0 || (newpte & PG_NX) == 0) {
7376                         /*
7377                          * This PTE change does not require TLB invalidation.
7378                          */
7379                         goto unchanged;
7380                 }
7381                 if ((origpte & PG_A) != 0)
7382                         pmap_invalidate_page(pmap, va);
7383         } else
7384                 pte_store(pte, newpte);
7385
7386 unchanged:
7387
7388 #if VM_NRESERVLEVEL > 0
7389         /*
7390          * If both the page table page and the reservation are fully
7391          * populated, then attempt promotion.
7392          */
7393         if ((mpte == NULL || mpte->ref_count == NPTEPG) &&
7394             pmap_ps_enabled(pmap) &&
7395             (m->flags & PG_FICTITIOUS) == 0 &&
7396             vm_reserv_level_iffullpop(m) == 0)
7397                 pmap_promote_pde(pmap, pde, va, mpte, &lock);
7398 #endif
7399
7400         rv = KERN_SUCCESS;
7401 out:
7402         if (lock != NULL)
7403                 rw_wunlock(lock);
7404         PMAP_UNLOCK(pmap);
7405         return (rv);
7406 }
7407
7408 /*
7409  * Tries to create a read- and/or execute-only 2MB page mapping.  Returns
7410  * KERN_SUCCESS if the mapping was created.  Otherwise, returns an error
7411  * value.  See pmap_enter_pde() for the possible error values when "no sleep",
7412  * "no replace", and "no reclaim" are specified.
7413  */
7414 static int
7415 pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
7416     struct rwlock **lockp)
7417 {
7418         pd_entry_t newpde;
7419         pt_entry_t PG_V;
7420
7421         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7422         PG_V = pmap_valid_bit(pmap);
7423         newpde = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(pmap, m->md.pat_mode, 1) |
7424             PG_PS | PG_V;
7425         if ((m->oflags & VPO_UNMANAGED) == 0)
7426                 newpde |= PG_MANAGED;
7427         if ((prot & VM_PROT_EXECUTE) == 0)
7428                 newpde |= pg_nx;
7429         if (va < VM_MAXUSER_ADDRESS)
7430                 newpde |= PG_U;
7431         return (pmap_enter_pde(pmap, va, newpde, PMAP_ENTER_NOSLEEP |
7432             PMAP_ENTER_NOREPLACE | PMAP_ENTER_NORECLAIM, NULL, lockp));
7433 }
7434
7435 /*
7436  * Returns true if every page table entry in the specified page table page is
7437  * zero.
7438  */
7439 static bool
7440 pmap_every_pte_zero(vm_paddr_t pa)
7441 {
7442         pt_entry_t *pt_end, *pte;
7443
7444         KASSERT((pa & PAGE_MASK) == 0, ("pa is misaligned"));
7445         pte = (pt_entry_t *)PHYS_TO_DMAP(pa);
7446         for (pt_end = pte + NPTEPG; pte < pt_end; pte++) {
7447                 if (*pte != 0)
7448                         return (false);
7449         }
7450         return (true);
7451 }
7452
7453 /*
7454  * Tries to create the specified 2MB page mapping.  Returns KERN_SUCCESS if
7455  * the mapping was created, and one of KERN_FAILURE, KERN_NO_SPACE,
7456  * KERN_PROTECTION_FAILURE, or KERN_RESOURCE_SHORTAGE otherwise.  Returns
7457  * KERN_FAILURE if either (1) PMAP_ENTER_NOREPLACE was specified and a 4KB
7458  * page mapping already exists within the 2MB virtual address range starting
7459  * at the specified virtual address or (2) the requested 2MB page mapping is
7460  * not supported due to hardware errata.  Returns KERN_NO_SPACE if
7461  * PMAP_ENTER_NOREPLACE was specified and a 2MB page mapping already exists at
7462  * the specified virtual address.  Returns KERN_PROTECTION_FAILURE if the PKRU
7463  * settings are not the same across the 2MB virtual address range starting at
7464  * the specified virtual address.  Returns KERN_RESOURCE_SHORTAGE if either
7465  * (1) PMAP_ENTER_NOSLEEP was specified and a page table page allocation
7466  * failed or (2) PMAP_ENTER_NORECLAIM was specified and a PV entry allocation
7467  * failed.
7468  *
7469  * The parameter "m" is only used when creating a managed, writeable mapping.
7470  */
7471 static int
7472 pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags,
7473     vm_page_t m, struct rwlock **lockp)
7474 {
7475         struct spglist free;
7476         pd_entry_t oldpde, *pde;
7477         pt_entry_t PG_G, PG_RW, PG_V;
7478         vm_page_t mt, pdpg;
7479
7480         KASSERT(pmap == kernel_pmap || (newpde & PG_W) == 0,
7481             ("pmap_enter_pde: cannot create wired user mapping"));
7482         PG_G = pmap_global_bit(pmap);
7483         PG_RW = pmap_rw_bit(pmap);
7484         KASSERT((newpde & (pmap_modified_bit(pmap) | PG_RW)) != PG_RW,
7485             ("pmap_enter_pde: newpde is missing PG_M"));
7486         PG_V = pmap_valid_bit(pmap);
7487         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7488
7489         if (!pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
7490             newpde))) {
7491                 CTR2(KTR_PMAP, "pmap_enter_pde: 2m x blocked for va %#lx"
7492                     " in pmap %p", va, pmap);
7493                 return (KERN_FAILURE);
7494         }
7495         if ((pde = pmap_alloc_pde(pmap, va, &pdpg, (flags &
7496             PMAP_ENTER_NOSLEEP) != 0 ? NULL : lockp)) == NULL) {
7497                 CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
7498                     " in pmap %p", va, pmap);
7499                 return (KERN_RESOURCE_SHORTAGE);
7500         }
7501
7502         /*
7503          * If pkru is not same for the whole pde range, return failure
7504          * and let vm_fault() cope.  Check after pde allocation, since
7505          * it could sleep.
7506          */
7507         if (!pmap_pkru_same(pmap, va, va + NBPDR)) {
7508                 pmap_abort_ptp(pmap, va, pdpg);
7509                 return (KERN_PROTECTION_FAILURE);
7510         }
7511         if (va < VM_MAXUSER_ADDRESS && pmap->pm_type == PT_X86) {
7512                 newpde &= ~X86_PG_PKU_MASK;
7513                 newpde |= pmap_pkru_get(pmap, va);
7514         }
7515
7516         /*
7517          * If there are existing mappings, either abort or remove them.
7518          */
7519         oldpde = *pde;
7520         if ((oldpde & PG_V) != 0) {
7521                 KASSERT(pdpg == NULL || pdpg->ref_count > 1,
7522                     ("pmap_enter_pde: pdpg's reference count is too low"));
7523                 if ((flags & PMAP_ENTER_NOREPLACE) != 0) {
7524                         if ((oldpde & PG_PS) != 0) {
7525                                 if (pdpg != NULL)
7526                                         pdpg->ref_count--;
7527                                 CTR2(KTR_PMAP,
7528                                     "pmap_enter_pde: no space for va %#lx"
7529                                     " in pmap %p", va, pmap);
7530                                 return (KERN_NO_SPACE);
7531                         } else if (va < VM_MAXUSER_ADDRESS ||
7532                             !pmap_every_pte_zero(oldpde & PG_FRAME)) {
7533                                 if (pdpg != NULL)
7534                                         pdpg->ref_count--;
7535                                 CTR2(KTR_PMAP,
7536                                     "pmap_enter_pde: failure for va %#lx"
7537                                     " in pmap %p", va, pmap);
7538                                 return (KERN_FAILURE);
7539                         }
7540                 }
7541                 /* Break the existing mapping(s). */
7542                 SLIST_INIT(&free);
7543                 if ((oldpde & PG_PS) != 0) {
7544                         /*
7545                          * The reference to the PD page that was acquired by
7546                          * pmap_alloc_pde() ensures that it won't be freed.
7547                          * However, if the PDE resulted from a promotion, then
7548                          * a reserved PT page could be freed.
7549                          */
7550                         (void)pmap_remove_pde(pmap, pde, va, &free, lockp);
7551                         if ((oldpde & PG_G) == 0)
7552                                 pmap_invalidate_pde_page(pmap, va, oldpde);
7553                 } else {
7554                         pmap_delayed_invl_start();
7555                         if (pmap_remove_ptes(pmap, va, va + NBPDR, pde, &free,
7556                             lockp))
7557                                pmap_invalidate_all(pmap);
7558                         pmap_delayed_invl_finish();
7559                 }
7560                 if (va < VM_MAXUSER_ADDRESS) {
7561                         vm_page_free_pages_toq(&free, true);
7562                         KASSERT(*pde == 0, ("pmap_enter_pde: non-zero pde %p",
7563                             pde));
7564                 } else {
7565                         KASSERT(SLIST_EMPTY(&free),
7566                             ("pmap_enter_pde: freed kernel page table page"));
7567
7568                         /*
7569                          * Both pmap_remove_pde() and pmap_remove_ptes() will
7570                          * leave the kernel page table page zero filled.
7571                          */
7572                         mt = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7573                         if (pmap_insert_pt_page(pmap, mt, false, false))
7574                                 panic("pmap_enter_pde: trie insert failed");
7575                 }
7576         }
7577
7578         if ((newpde & PG_MANAGED) != 0) {
7579                 /*
7580                  * Abort this mapping if its PV entry could not be created.
7581                  */
7582                 if (!pmap_pv_insert_pde(pmap, va, newpde, flags, lockp)) {
7583                         if (pdpg != NULL)
7584                                 pmap_abort_ptp(pmap, va, pdpg);
7585                         CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
7586                             " in pmap %p", va, pmap);
7587                         return (KERN_RESOURCE_SHORTAGE);
7588                 }
7589                 if ((newpde & PG_RW) != 0) {
7590                         for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
7591                                 vm_page_aflag_set(mt, PGA_WRITEABLE);
7592                 }
7593         }
7594
7595         /*
7596          * Increment counters.
7597          */
7598         if ((newpde & PG_W) != 0)
7599                 pmap->pm_stats.wired_count += NBPDR / PAGE_SIZE;
7600         pmap_resident_count_adj(pmap, NBPDR / PAGE_SIZE);
7601
7602         /*
7603          * Map the superpage.  (This is not a promoted mapping; there will not
7604          * be any lingering 4KB page mappings in the TLB.)
7605          */
7606         pde_store(pde, newpde);
7607
7608         counter_u64_add(pmap_pde_mappings, 1);
7609         CTR2(KTR_PMAP, "pmap_enter_pde: success for va %#lx in pmap %p",
7610             va, pmap);
7611         return (KERN_SUCCESS);
7612 }
7613
7614 /*
7615  * Maps a sequence of resident pages belonging to the same object.
7616  * The sequence begins with the given page m_start.  This page is
7617  * mapped at the given virtual address start.  Each subsequent page is
7618  * mapped at a virtual address that is offset from start by the same
7619  * amount as the page is offset from m_start within the object.  The
7620  * last page in the sequence is the page with the largest offset from
7621  * m_start that can be mapped at a virtual address less than the given
7622  * virtual address end.  Not every virtual page between start and end
7623  * is mapped; only those for which a resident page exists with the
7624  * corresponding offset from m_start are mapped.
7625  */
7626 void
7627 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
7628     vm_page_t m_start, vm_prot_t prot)
7629 {
7630         struct rwlock *lock;
7631         vm_offset_t va;
7632         vm_page_t m, mpte;
7633         vm_pindex_t diff, psize;
7634         int rv;
7635
7636         VM_OBJECT_ASSERT_LOCKED(m_start->object);
7637
7638         psize = atop(end - start);
7639         mpte = NULL;
7640         m = m_start;
7641         lock = NULL;
7642         PMAP_LOCK(pmap);
7643         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
7644                 va = start + ptoa(diff);
7645                 if ((va & PDRMASK) == 0 && va + NBPDR <= end &&
7646                     m->psind == 1 && pmap_ps_enabled(pmap) &&
7647                     ((rv = pmap_enter_2mpage(pmap, va, m, prot, &lock)) ==
7648                     KERN_SUCCESS || rv == KERN_NO_SPACE))
7649                         m = &m[NBPDR / PAGE_SIZE - 1];
7650                 else
7651                         mpte = pmap_enter_quick_locked(pmap, va, m, prot,
7652                             mpte, &lock);
7653                 m = TAILQ_NEXT(m, listq);
7654         }
7655         if (lock != NULL)
7656                 rw_wunlock(lock);
7657         PMAP_UNLOCK(pmap);
7658 }
7659
7660 /*
7661  * this code makes some *MAJOR* assumptions:
7662  * 1. Current pmap & pmap exists.
7663  * 2. Not wired.
7664  * 3. Read access.
7665  * 4. No page table pages.
7666  * but is *MUCH* faster than pmap_enter...
7667  */
7668
7669 void
7670 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
7671 {
7672         struct rwlock *lock;
7673
7674         lock = NULL;
7675         PMAP_LOCK(pmap);
7676         (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock);
7677         if (lock != NULL)
7678                 rw_wunlock(lock);
7679         PMAP_UNLOCK(pmap);
7680 }
7681
7682 static vm_page_t
7683 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
7684     vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
7685 {
7686         pd_entry_t *pde;
7687         pt_entry_t newpte, *pte, PG_V;
7688
7689         KASSERT(!VA_IS_CLEANMAP(va) ||
7690             (m->oflags & VPO_UNMANAGED) != 0,
7691             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
7692         PG_V = pmap_valid_bit(pmap);
7693         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7694         pde = NULL;
7695
7696         /*
7697          * In the case that a page table page is not
7698          * resident, we are creating it here.
7699          */
7700         if (va < VM_MAXUSER_ADDRESS) {
7701                 pdp_entry_t *pdpe;
7702                 vm_pindex_t ptepindex;
7703
7704                 /*
7705                  * Calculate pagetable page index
7706                  */
7707                 ptepindex = pmap_pde_pindex(va);
7708                 if (mpte && (mpte->pindex == ptepindex)) {
7709                         mpte->ref_count++;
7710                 } else {
7711                         /*
7712                          * If the page table page is mapped, we just increment
7713                          * the hold count, and activate it.  Otherwise, we
7714                          * attempt to allocate a page table page, passing NULL
7715                          * instead of the PV list lock pointer because we don't
7716                          * intend to sleep.  If this attempt fails, we don't
7717                          * retry.  Instead, we give up.
7718                          */
7719                         pdpe = pmap_pdpe(pmap, va);
7720                         if (pdpe != NULL && (*pdpe & PG_V) != 0) {
7721                                 if ((*pdpe & PG_PS) != 0)
7722                                         return (NULL);
7723                                 pde = pmap_pdpe_to_pde(pdpe, va);
7724                                 if ((*pde & PG_V) != 0) {
7725                                         if ((*pde & PG_PS) != 0)
7726                                                 return (NULL);
7727                                         mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7728                                         mpte->ref_count++;
7729                                 } else {
7730                                         mpte = pmap_allocpte_alloc(pmap,
7731                                             ptepindex, NULL, va);
7732                                         if (mpte == NULL)
7733                                                 return (NULL);
7734                                 }
7735                         } else {
7736                                 mpte = pmap_allocpte_alloc(pmap, ptepindex,
7737                                     NULL, va);
7738                                 if (mpte == NULL)
7739                                         return (NULL);
7740                         }
7741                 }
7742                 pte = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mpte));
7743                 pte = &pte[pmap_pte_index(va)];
7744         } else {
7745                 mpte = NULL;
7746                 pte = vtopte(va);
7747         }
7748         if (*pte) {
7749                 if (mpte != NULL)
7750                         mpte->ref_count--;
7751                 return (NULL);
7752         }
7753
7754         /*
7755          * Enter on the PV list if part of our managed memory.
7756          */
7757         if ((m->oflags & VPO_UNMANAGED) == 0 &&
7758             !pmap_try_insert_pv_entry(pmap, va, m, lockp)) {
7759                 if (mpte != NULL)
7760                         pmap_abort_ptp(pmap, va, mpte);
7761                 return (NULL);
7762         }
7763
7764         /*
7765          * Increment counters
7766          */
7767         pmap_resident_count_adj(pmap, 1);
7768
7769         newpte = VM_PAGE_TO_PHYS(m) | PG_V |
7770             pmap_cache_bits(pmap, m->md.pat_mode, 0);
7771         if ((m->oflags & VPO_UNMANAGED) == 0)
7772                 newpte |= PG_MANAGED;
7773         if ((prot & VM_PROT_EXECUTE) == 0)
7774                 newpte |= pg_nx;
7775         if (va < VM_MAXUSER_ADDRESS)
7776                 newpte |= PG_U | pmap_pkru_get(pmap, va);
7777         pte_store(pte, newpte);
7778
7779 #if VM_NRESERVLEVEL > 0
7780         /*
7781          * If both the PTP and the reservation are fully populated, then
7782          * attempt promotion.
7783          */
7784         if ((mpte == NULL || mpte->ref_count == NPTEPG) &&
7785             pmap_ps_enabled(pmap) &&
7786             (m->flags & PG_FICTITIOUS) == 0 &&
7787             vm_reserv_level_iffullpop(m) == 0) {
7788                 if (pde == NULL)
7789                         pde = pmap_pde(pmap, va);
7790                 pmap_promote_pde(pmap, pde, va, mpte, lockp);
7791
7792                 /*
7793                  * If promotion succeeds, then the next call to this function
7794                  * should not be given the unmapped PTP as a hint.
7795                  */
7796                 mpte = NULL;
7797         }
7798 #endif
7799
7800         return (mpte);
7801 }
7802
7803 /*
7804  * Make a temporary mapping for a physical address.  This is only intended
7805  * to be used for panic dumps.
7806  */
7807 void *
7808 pmap_kenter_temporary(vm_paddr_t pa, int i)
7809 {
7810         vm_offset_t va;
7811
7812         va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
7813         pmap_kenter(va, pa);
7814         pmap_invlpg(kernel_pmap, va);
7815         return ((void *)crashdumpmap);
7816 }
7817
7818 /*
7819  * This code maps large physical mmap regions into the
7820  * processor address space.  Note that some shortcuts
7821  * are taken, but the code works.
7822  */
7823 void
7824 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
7825     vm_pindex_t pindex, vm_size_t size)
7826 {
7827         pd_entry_t *pde;
7828         pt_entry_t PG_A, PG_M, PG_RW, PG_V;
7829         vm_paddr_t pa, ptepa;
7830         vm_page_t p, pdpg;
7831         int pat_mode;
7832
7833         PG_A = pmap_accessed_bit(pmap);
7834         PG_M = pmap_modified_bit(pmap);
7835         PG_V = pmap_valid_bit(pmap);
7836         PG_RW = pmap_rw_bit(pmap);
7837
7838         VM_OBJECT_ASSERT_WLOCKED(object);
7839         KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
7840             ("pmap_object_init_pt: non-device object"));
7841         if ((addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) {
7842                 if (!pmap_ps_enabled(pmap))
7843                         return;
7844                 if (!vm_object_populate(object, pindex, pindex + atop(size)))
7845                         return;
7846                 p = vm_page_lookup(object, pindex);
7847                 KASSERT(vm_page_all_valid(p),
7848                     ("pmap_object_init_pt: invalid page %p", p));
7849                 pat_mode = p->md.pat_mode;
7850
7851                 /*
7852                  * Abort the mapping if the first page is not physically
7853                  * aligned to a 2MB page boundary.
7854                  */
7855                 ptepa = VM_PAGE_TO_PHYS(p);
7856                 if (ptepa & (NBPDR - 1))
7857                         return;
7858
7859                 /*
7860                  * Skip the first page.  Abort the mapping if the rest of
7861                  * the pages are not physically contiguous or have differing
7862                  * memory attributes.
7863                  */
7864                 p = TAILQ_NEXT(p, listq);
7865                 for (pa = ptepa + PAGE_SIZE; pa < ptepa + size;
7866                     pa += PAGE_SIZE) {
7867                         KASSERT(vm_page_all_valid(p),
7868                             ("pmap_object_init_pt: invalid page %p", p));
7869                         if (pa != VM_PAGE_TO_PHYS(p) ||
7870                             pat_mode != p->md.pat_mode)
7871                                 return;
7872                         p = TAILQ_NEXT(p, listq);
7873                 }
7874
7875                 /*
7876                  * Map using 2MB pages.  Since "ptepa" is 2M aligned and
7877                  * "size" is a multiple of 2M, adding the PAT setting to "pa"
7878                  * will not affect the termination of this loop.
7879                  */ 
7880                 PMAP_LOCK(pmap);
7881                 for (pa = ptepa | pmap_cache_bits(pmap, pat_mode, 1);
7882                     pa < ptepa + size; pa += NBPDR) {
7883                         pde = pmap_alloc_pde(pmap, addr, &pdpg, NULL);
7884                         if (pde == NULL) {
7885                                 /*
7886                                  * The creation of mappings below is only an
7887                                  * optimization.  If a page directory page
7888                                  * cannot be allocated without blocking,
7889                                  * continue on to the next mapping rather than
7890                                  * blocking.
7891                                  */
7892                                 addr += NBPDR;
7893                                 continue;
7894                         }
7895                         if ((*pde & PG_V) == 0) {
7896                                 pde_store(pde, pa | PG_PS | PG_M | PG_A |
7897                                     PG_U | PG_RW | PG_V);
7898                                 pmap_resident_count_adj(pmap, NBPDR / PAGE_SIZE);
7899                                 counter_u64_add(pmap_pde_mappings, 1);
7900                         } else {
7901                                 /* Continue on if the PDE is already valid. */
7902                                 pdpg->ref_count--;
7903                                 KASSERT(pdpg->ref_count > 0,
7904                                     ("pmap_object_init_pt: missing reference "
7905                                     "to page directory page, va: 0x%lx", addr));
7906                         }
7907                         addr += NBPDR;
7908                 }
7909                 PMAP_UNLOCK(pmap);
7910         }
7911 }
7912
7913 /*
7914  *      Clear the wired attribute from the mappings for the specified range of
7915  *      addresses in the given pmap.  Every valid mapping within that range
7916  *      must have the wired attribute set.  In contrast, invalid mappings
7917  *      cannot have the wired attribute set, so they are ignored.
7918  *
7919  *      The wired attribute of the page table entry is not a hardware
7920  *      feature, so there is no need to invalidate any TLB entries.
7921  *      Since pmap_demote_pde() for the wired entry must never fail,
7922  *      pmap_delayed_invl_start()/finish() calls around the
7923  *      function are not needed.
7924  */
7925 void
7926 pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
7927 {
7928         vm_offset_t va_next;
7929         pml4_entry_t *pml4e;
7930         pdp_entry_t *pdpe;
7931         pd_entry_t *pde;
7932         pt_entry_t *pte, PG_V, PG_G __diagused;
7933
7934         PG_V = pmap_valid_bit(pmap);
7935         PG_G = pmap_global_bit(pmap);
7936         PMAP_LOCK(pmap);
7937         for (; sva < eva; sva = va_next) {
7938                 pml4e = pmap_pml4e(pmap, sva);
7939                 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
7940                         va_next = (sva + NBPML4) & ~PML4MASK;
7941                         if (va_next < sva)
7942                                 va_next = eva;
7943                         continue;
7944                 }
7945
7946                 va_next = (sva + NBPDP) & ~PDPMASK;
7947                 if (va_next < sva)
7948                         va_next = eva;
7949                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
7950                 if ((*pdpe & PG_V) == 0)
7951                         continue;
7952                 if ((*pdpe & PG_PS) != 0) {
7953                         KASSERT(va_next <= eva,
7954                             ("partial update of non-transparent 1G mapping "
7955                             "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
7956                             *pdpe, sva, eva, va_next));
7957                         MPASS(pmap != kernel_pmap); /* XXXKIB */
7958                         MPASS((*pdpe & (PG_MANAGED | PG_G)) == 0);
7959                         atomic_clear_long(pdpe, PG_W);
7960                         pmap->pm_stats.wired_count -= NBPDP / PAGE_SIZE;
7961                         continue;
7962                 }
7963
7964                 va_next = (sva + NBPDR) & ~PDRMASK;
7965                 if (va_next < sva)
7966                         va_next = eva;
7967                 pde = pmap_pdpe_to_pde(pdpe, sva);
7968                 if ((*pde & PG_V) == 0)
7969                         continue;
7970                 if ((*pde & PG_PS) != 0) {
7971                         if ((*pde & PG_W) == 0)
7972                                 panic("pmap_unwire: pde %#jx is missing PG_W",
7973                                     (uintmax_t)*pde);
7974
7975                         /*
7976                          * Are we unwiring the entire large page?  If not,
7977                          * demote the mapping and fall through.
7978                          */
7979                         if (sva + NBPDR == va_next && eva >= va_next) {
7980                                 atomic_clear_long(pde, PG_W);
7981                                 pmap->pm_stats.wired_count -= NBPDR /
7982                                     PAGE_SIZE;
7983                                 continue;
7984                         } else if (!pmap_demote_pde(pmap, pde, sva))
7985                                 panic("pmap_unwire: demotion failed");
7986                 }
7987                 if (va_next > eva)
7988                         va_next = eva;
7989                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
7990                     sva += PAGE_SIZE) {
7991                         if ((*pte & PG_V) == 0)
7992                                 continue;
7993                         if ((*pte & PG_W) == 0)
7994                                 panic("pmap_unwire: pte %#jx is missing PG_W",
7995                                     (uintmax_t)*pte);
7996
7997                         /*
7998                          * PG_W must be cleared atomically.  Although the pmap
7999                          * lock synchronizes access to PG_W, another processor
8000                          * could be setting PG_M and/or PG_A concurrently.
8001                          */
8002                         atomic_clear_long(pte, PG_W);
8003                         pmap->pm_stats.wired_count--;
8004                 }
8005         }
8006         PMAP_UNLOCK(pmap);
8007 }
8008
8009 /*
8010  *      Copy the range specified by src_addr/len
8011  *      from the source map to the range dst_addr/len
8012  *      in the destination map.
8013  *
8014  *      This routine is only advisory and need not do anything.
8015  */
8016 void
8017 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
8018     vm_offset_t src_addr)
8019 {
8020         struct rwlock *lock;
8021         pml4_entry_t *pml4e;
8022         pdp_entry_t *pdpe;
8023         pd_entry_t *pde, srcptepaddr;
8024         pt_entry_t *dst_pte, PG_A, PG_M, PG_V, ptetemp, *src_pte;
8025         vm_offset_t addr, end_addr, va_next;
8026         vm_page_t dst_pdpg, dstmpte, srcmpte;
8027
8028         if (dst_addr != src_addr)
8029                 return;
8030
8031         if (dst_pmap->pm_type != src_pmap->pm_type)
8032                 return;
8033
8034         /*
8035          * EPT page table entries that require emulation of A/D bits are
8036          * sensitive to clearing the PG_A bit (aka EPT_PG_READ). Although
8037          * we clear PG_M (aka EPT_PG_WRITE) concomitantly, the PG_U bit
8038          * (aka EPT_PG_EXECUTE) could still be set. Since some EPT
8039          * implementations flag an EPT misconfiguration for exec-only
8040          * mappings we skip this function entirely for emulated pmaps.
8041          */
8042         if (pmap_emulate_ad_bits(dst_pmap))
8043                 return;
8044
8045         end_addr = src_addr + len;
8046         lock = NULL;
8047         if (dst_pmap < src_pmap) {
8048                 PMAP_LOCK(dst_pmap);
8049                 PMAP_LOCK(src_pmap);
8050         } else {
8051                 PMAP_LOCK(src_pmap);
8052                 PMAP_LOCK(dst_pmap);
8053         }
8054
8055         PG_A = pmap_accessed_bit(dst_pmap);
8056         PG_M = pmap_modified_bit(dst_pmap);
8057         PG_V = pmap_valid_bit(dst_pmap);
8058
8059         for (addr = src_addr; addr < end_addr; addr = va_next) {
8060                 KASSERT(addr < UPT_MIN_ADDRESS,
8061                     ("pmap_copy: invalid to pmap_copy page tables"));
8062
8063                 pml4e = pmap_pml4e(src_pmap, addr);
8064                 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
8065                         va_next = (addr + NBPML4) & ~PML4MASK;
8066                         if (va_next < addr)
8067                                 va_next = end_addr;
8068                         continue;
8069                 }
8070
8071                 va_next = (addr + NBPDP) & ~PDPMASK;
8072                 if (va_next < addr)
8073                         va_next = end_addr;
8074                 pdpe = pmap_pml4e_to_pdpe(pml4e, addr);
8075                 if ((*pdpe & PG_V) == 0)
8076                         continue;
8077                 if ((*pdpe & PG_PS) != 0) {
8078                         KASSERT(va_next <= end_addr,
8079                             ("partial update of non-transparent 1G mapping "
8080                             "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
8081                             *pdpe, addr, end_addr, va_next));
8082                         MPASS((addr & PDPMASK) == 0);
8083                         MPASS((*pdpe & PG_MANAGED) == 0);
8084                         srcptepaddr = *pdpe;
8085                         pdpe = pmap_pdpe(dst_pmap, addr);
8086                         if (pdpe == NULL) {
8087                                 if (pmap_allocpte_alloc(dst_pmap,
8088                                     pmap_pml4e_pindex(addr), NULL, addr) ==
8089                                     NULL)
8090                                         break;
8091                                 pdpe = pmap_pdpe(dst_pmap, addr);
8092                         } else {
8093                                 pml4e = pmap_pml4e(dst_pmap, addr);
8094                                 dst_pdpg = PHYS_TO_VM_PAGE(*pml4e & PG_FRAME);
8095                                 dst_pdpg->ref_count++;
8096                         }
8097                         KASSERT(*pdpe == 0,
8098                             ("1G mapping present in dst pmap "
8099                             "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
8100                             *pdpe, addr, end_addr, va_next));
8101                         *pdpe = srcptepaddr & ~PG_W;
8102                         pmap_resident_count_adj(dst_pmap, NBPDP / PAGE_SIZE);
8103                         continue;
8104                 }
8105
8106                 va_next = (addr + NBPDR) & ~PDRMASK;
8107                 if (va_next < addr)
8108                         va_next = end_addr;
8109
8110                 pde = pmap_pdpe_to_pde(pdpe, addr);
8111                 srcptepaddr = *pde;
8112                 if (srcptepaddr == 0)
8113                         continue;
8114                         
8115                 if (srcptepaddr & PG_PS) {
8116                         /*
8117                          * We can only virtual copy whole superpages.
8118                          */
8119                         if ((addr & PDRMASK) != 0 || addr + NBPDR > end_addr)
8120                                 continue;
8121                         pde = pmap_alloc_pde(dst_pmap, addr, &dst_pdpg, NULL);
8122                         if (pde == NULL)
8123                                 break;
8124                         if (*pde == 0 && ((srcptepaddr & PG_MANAGED) == 0 ||
8125                             pmap_pv_insert_pde(dst_pmap, addr, srcptepaddr,
8126                             PMAP_ENTER_NORECLAIM, &lock))) {
8127                                 /*
8128                                  * We leave the dirty bit unchanged because
8129                                  * managed read/write superpage mappings are
8130                                  * required to be dirty.  However, managed
8131                                  * superpage mappings are not required to
8132                                  * have their accessed bit set, so we clear
8133                                  * it because we don't know if this mapping
8134                                  * will be used.
8135                                  */
8136                                 srcptepaddr &= ~PG_W;
8137                                 if ((srcptepaddr & PG_MANAGED) != 0)
8138                                         srcptepaddr &= ~PG_A;
8139                                 *pde = srcptepaddr;
8140                                 pmap_resident_count_adj(dst_pmap, NBPDR /
8141                                     PAGE_SIZE);
8142                                 counter_u64_add(pmap_pde_mappings, 1);
8143                         } else
8144                                 pmap_abort_ptp(dst_pmap, addr, dst_pdpg);
8145                         continue;
8146                 }
8147
8148                 srcptepaddr &= PG_FRAME;
8149                 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr);
8150                 KASSERT(srcmpte->ref_count > 0,
8151                     ("pmap_copy: source page table page is unused"));
8152
8153                 if (va_next > end_addr)
8154                         va_next = end_addr;
8155
8156                 src_pte = (pt_entry_t *)PHYS_TO_DMAP(srcptepaddr);
8157                 src_pte = &src_pte[pmap_pte_index(addr)];
8158                 dstmpte = NULL;
8159                 for (; addr < va_next; addr += PAGE_SIZE, src_pte++) {
8160                         ptetemp = *src_pte;
8161
8162                         /*
8163                          * We only virtual copy managed pages.
8164                          */
8165                         if ((ptetemp & PG_MANAGED) == 0)
8166                                 continue;
8167
8168                         if (dstmpte != NULL) {
8169                                 KASSERT(dstmpte->pindex ==
8170                                     pmap_pde_pindex(addr),
8171                                     ("dstmpte pindex/addr mismatch"));
8172                                 dstmpte->ref_count++;
8173                         } else if ((dstmpte = pmap_allocpte(dst_pmap, addr,
8174                             NULL)) == NULL)
8175                                 goto out;
8176                         dst_pte = (pt_entry_t *)
8177                             PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpte));
8178                         dst_pte = &dst_pte[pmap_pte_index(addr)];
8179                         if (*dst_pte == 0 &&
8180                             pmap_try_insert_pv_entry(dst_pmap, addr,
8181                             PHYS_TO_VM_PAGE(ptetemp & PG_FRAME), &lock)) {
8182                                 /*
8183                                  * Clear the wired, modified, and accessed
8184                                  * (referenced) bits during the copy.
8185                                  */
8186                                 *dst_pte = ptetemp & ~(PG_W | PG_M | PG_A);
8187                                 pmap_resident_count_adj(dst_pmap, 1);
8188                         } else {
8189                                 pmap_abort_ptp(dst_pmap, addr, dstmpte);
8190                                 goto out;
8191                         }
8192                         /* Have we copied all of the valid mappings? */ 
8193                         if (dstmpte->ref_count >= srcmpte->ref_count)
8194                                 break;
8195                 }
8196         }
8197 out:
8198         if (lock != NULL)
8199                 rw_wunlock(lock);
8200         PMAP_UNLOCK(src_pmap);
8201         PMAP_UNLOCK(dst_pmap);
8202 }
8203
8204 int
8205 pmap_vmspace_copy(pmap_t dst_pmap, pmap_t src_pmap)
8206 {
8207         int error;
8208
8209         if (dst_pmap->pm_type != src_pmap->pm_type ||
8210             dst_pmap->pm_type != PT_X86 ||
8211             (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0)
8212                 return (0);
8213         for (;;) {
8214                 if (dst_pmap < src_pmap) {
8215                         PMAP_LOCK(dst_pmap);
8216                         PMAP_LOCK(src_pmap);
8217                 } else {
8218                         PMAP_LOCK(src_pmap);
8219                         PMAP_LOCK(dst_pmap);
8220                 }
8221                 error = pmap_pkru_copy(dst_pmap, src_pmap);
8222                 /* Clean up partial copy on failure due to no memory. */
8223                 if (error == ENOMEM)
8224                         pmap_pkru_deassign_all(dst_pmap);
8225                 PMAP_UNLOCK(src_pmap);
8226                 PMAP_UNLOCK(dst_pmap);
8227                 if (error != ENOMEM)
8228                         break;
8229                 vm_wait(NULL);
8230         }
8231         return (error);
8232 }
8233
8234 /*
8235  * Zero the specified hardware page.
8236  */
8237 void
8238 pmap_zero_page(vm_page_t m)
8239 {
8240         vm_offset_t va;
8241
8242 #ifdef TSLOG_PAGEZERO
8243         TSENTER();
8244 #endif
8245         va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
8246         pagezero((void *)va);
8247 #ifdef TSLOG_PAGEZERO
8248         TSEXIT();
8249 #endif
8250 }
8251
8252 /*
8253  * Zero an area within a single hardware page.  off and size must not
8254  * cover an area beyond a single hardware page.
8255  */
8256 void
8257 pmap_zero_page_area(vm_page_t m, int off, int size)
8258 {
8259         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
8260
8261         if (off == 0 && size == PAGE_SIZE)
8262                 pagezero((void *)va);
8263         else
8264                 bzero((char *)va + off, size);
8265 }
8266
8267 /*
8268  * Copy 1 specified hardware page to another.
8269  */
8270 void
8271 pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
8272 {
8273         vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
8274         vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
8275
8276         pagecopy((void *)src, (void *)dst);
8277 }
8278
8279 int unmapped_buf_allowed = 1;
8280
8281 void
8282 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
8283     vm_offset_t b_offset, int xfersize)
8284 {
8285         void *a_cp, *b_cp;
8286         vm_page_t pages[2];
8287         vm_offset_t vaddr[2], a_pg_offset, b_pg_offset;
8288         int cnt;
8289         boolean_t mapped;
8290
8291         while (xfersize > 0) {
8292                 a_pg_offset = a_offset & PAGE_MASK;
8293                 pages[0] = ma[a_offset >> PAGE_SHIFT];
8294                 b_pg_offset = b_offset & PAGE_MASK;
8295                 pages[1] = mb[b_offset >> PAGE_SHIFT];
8296                 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
8297                 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
8298                 mapped = pmap_map_io_transient(pages, vaddr, 2, FALSE);
8299                 a_cp = (char *)vaddr[0] + a_pg_offset;
8300                 b_cp = (char *)vaddr[1] + b_pg_offset;
8301                 bcopy(a_cp, b_cp, cnt);
8302                 if (__predict_false(mapped))
8303                         pmap_unmap_io_transient(pages, vaddr, 2, FALSE);
8304                 a_offset += cnt;
8305                 b_offset += cnt;
8306                 xfersize -= cnt;
8307         }
8308 }
8309
8310 /*
8311  * Returns true if the pmap's pv is one of the first
8312  * 16 pvs linked to from this page.  This count may
8313  * be changed upwards or downwards in the future; it
8314  * is only necessary that true be returned for a small
8315  * subset of pmaps for proper page aging.
8316  */
8317 boolean_t
8318 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
8319 {
8320         struct md_page *pvh;
8321         struct rwlock *lock;
8322         pv_entry_t pv;
8323         int loops = 0;
8324         boolean_t rv;
8325
8326         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8327             ("pmap_page_exists_quick: page %p is not managed", m));
8328         rv = FALSE;
8329         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8330         rw_rlock(lock);
8331         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8332                 if (PV_PMAP(pv) == pmap) {
8333                         rv = TRUE;
8334                         break;
8335                 }
8336                 loops++;
8337                 if (loops >= 16)
8338                         break;
8339         }
8340         if (!rv && loops < 16 && (m->flags & PG_FICTITIOUS) == 0) {
8341                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8342                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
8343                         if (PV_PMAP(pv) == pmap) {
8344                                 rv = TRUE;
8345                                 break;
8346                         }
8347                         loops++;
8348                         if (loops >= 16)
8349                                 break;
8350                 }
8351         }
8352         rw_runlock(lock);
8353         return (rv);
8354 }
8355
8356 /*
8357  *      pmap_page_wired_mappings:
8358  *
8359  *      Return the number of managed mappings to the given physical page
8360  *      that are wired.
8361  */
8362 int
8363 pmap_page_wired_mappings(vm_page_t m)
8364 {
8365         struct rwlock *lock;
8366         struct md_page *pvh;
8367         pmap_t pmap;
8368         pt_entry_t *pte;
8369         pv_entry_t pv;
8370         int count, md_gen, pvh_gen;
8371
8372         if ((m->oflags & VPO_UNMANAGED) != 0)
8373                 return (0);
8374         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8375         rw_rlock(lock);
8376 restart:
8377         count = 0;
8378         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8379                 pmap = PV_PMAP(pv);
8380                 if (!PMAP_TRYLOCK(pmap)) {
8381                         md_gen = m->md.pv_gen;
8382                         rw_runlock(lock);
8383                         PMAP_LOCK(pmap);
8384                         rw_rlock(lock);
8385                         if (md_gen != m->md.pv_gen) {
8386                                 PMAP_UNLOCK(pmap);
8387                                 goto restart;
8388                         }
8389                 }
8390                 pte = pmap_pte(pmap, pv->pv_va);
8391                 if ((*pte & PG_W) != 0)
8392                         count++;
8393                 PMAP_UNLOCK(pmap);
8394         }
8395         if ((m->flags & PG_FICTITIOUS) == 0) {
8396                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8397                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
8398                         pmap = PV_PMAP(pv);
8399                         if (!PMAP_TRYLOCK(pmap)) {
8400                                 md_gen = m->md.pv_gen;
8401                                 pvh_gen = pvh->pv_gen;
8402                                 rw_runlock(lock);
8403                                 PMAP_LOCK(pmap);
8404                                 rw_rlock(lock);
8405                                 if (md_gen != m->md.pv_gen ||
8406                                     pvh_gen != pvh->pv_gen) {
8407                                         PMAP_UNLOCK(pmap);
8408                                         goto restart;
8409                                 }
8410                         }
8411                         pte = pmap_pde(pmap, pv->pv_va);
8412                         if ((*pte & PG_W) != 0)
8413                                 count++;
8414                         PMAP_UNLOCK(pmap);
8415                 }
8416         }
8417         rw_runlock(lock);
8418         return (count);
8419 }
8420
8421 /*
8422  * Returns TRUE if the given page is mapped individually or as part of
8423  * a 2mpage.  Otherwise, returns FALSE.
8424  */
8425 boolean_t
8426 pmap_page_is_mapped(vm_page_t m)
8427 {
8428         struct rwlock *lock;
8429         boolean_t rv;
8430
8431         if ((m->oflags & VPO_UNMANAGED) != 0)
8432                 return (FALSE);
8433         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8434         rw_rlock(lock);
8435         rv = !TAILQ_EMPTY(&m->md.pv_list) ||
8436             ((m->flags & PG_FICTITIOUS) == 0 &&
8437             !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list));
8438         rw_runlock(lock);
8439         return (rv);
8440 }
8441
8442 /*
8443  * Destroy all managed, non-wired mappings in the given user-space
8444  * pmap.  This pmap cannot be active on any processor besides the
8445  * caller.
8446  *
8447  * This function cannot be applied to the kernel pmap.  Moreover, it
8448  * is not intended for general use.  It is only to be used during
8449  * process termination.  Consequently, it can be implemented in ways
8450  * that make it faster than pmap_remove().  First, it can more quickly
8451  * destroy mappings by iterating over the pmap's collection of PV
8452  * entries, rather than searching the page table.  Second, it doesn't
8453  * have to test and clear the page table entries atomically, because
8454  * no processor is currently accessing the user address space.  In
8455  * particular, a page table entry's dirty bit won't change state once
8456  * this function starts.
8457  *
8458  * Although this function destroys all of the pmap's managed,
8459  * non-wired mappings, it can delay and batch the invalidation of TLB
8460  * entries without calling pmap_delayed_invl_start() and
8461  * pmap_delayed_invl_finish().  Because the pmap is not active on
8462  * any other processor, none of these TLB entries will ever be used
8463  * before their eventual invalidation.  Consequently, there is no need
8464  * for either pmap_remove_all() or pmap_remove_write() to wait for
8465  * that eventual TLB invalidation.
8466  */
8467 void
8468 pmap_remove_pages(pmap_t pmap)
8469 {
8470         pd_entry_t ptepde;
8471         pt_entry_t *pte, tpte;
8472         pt_entry_t PG_M, PG_RW, PG_V;
8473         struct spglist free;
8474         struct pv_chunklist free_chunks[PMAP_MEMDOM];
8475         vm_page_t m, mpte, mt;
8476         pv_entry_t pv;
8477         struct md_page *pvh;
8478         struct pv_chunk *pc, *npc;
8479         struct rwlock *lock;
8480         int64_t bit;
8481         uint64_t inuse, bitmask;
8482         int allfree, field, i, idx;
8483 #ifdef PV_STATS
8484         int freed;
8485 #endif
8486         boolean_t superpage;
8487         vm_paddr_t pa;
8488
8489         /*
8490          * Assert that the given pmap is only active on the current
8491          * CPU.  Unfortunately, we cannot block another CPU from
8492          * activating the pmap while this function is executing.
8493          */
8494         KASSERT(pmap == PCPU_GET(curpmap), ("non-current pmap %p", pmap));
8495 #ifdef INVARIANTS
8496         {
8497                 cpuset_t other_cpus;
8498
8499                 other_cpus = all_cpus;
8500                 critical_enter();
8501                 CPU_CLR(PCPU_GET(cpuid), &other_cpus);
8502                 CPU_AND(&other_cpus, &other_cpus, &pmap->pm_active);
8503                 critical_exit();
8504                 KASSERT(CPU_EMPTY(&other_cpus), ("pmap active %p", pmap));
8505         }
8506 #endif
8507
8508         lock = NULL;
8509         PG_M = pmap_modified_bit(pmap);
8510         PG_V = pmap_valid_bit(pmap);
8511         PG_RW = pmap_rw_bit(pmap);
8512
8513         for (i = 0; i < PMAP_MEMDOM; i++)
8514                 TAILQ_INIT(&free_chunks[i]);
8515         SLIST_INIT(&free);
8516         PMAP_LOCK(pmap);
8517         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
8518                 allfree = 1;
8519 #ifdef PV_STATS
8520                 freed = 0;
8521 #endif
8522                 for (field = 0; field < _NPCM; field++) {
8523                         inuse = ~pc->pc_map[field] & pc_freemask[field];
8524                         while (inuse != 0) {
8525                                 bit = bsfq(inuse);
8526                                 bitmask = 1UL << bit;
8527                                 idx = field * 64 + bit;
8528                                 pv = &pc->pc_pventry[idx];
8529                                 inuse &= ~bitmask;
8530
8531                                 pte = pmap_pdpe(pmap, pv->pv_va);
8532                                 ptepde = *pte;
8533                                 pte = pmap_pdpe_to_pde(pte, pv->pv_va);
8534                                 tpte = *pte;
8535                                 if ((tpte & (PG_PS | PG_V)) == PG_V) {
8536                                         superpage = FALSE;
8537                                         ptepde = tpte;
8538                                         pte = (pt_entry_t *)PHYS_TO_DMAP(tpte &
8539                                             PG_FRAME);
8540                                         pte = &pte[pmap_pte_index(pv->pv_va)];
8541                                         tpte = *pte;
8542                                 } else {
8543                                         /*
8544                                          * Keep track whether 'tpte' is a
8545                                          * superpage explicitly instead of
8546                                          * relying on PG_PS being set.
8547                                          *
8548                                          * This is because PG_PS is numerically
8549                                          * identical to PG_PTE_PAT and thus a
8550                                          * regular page could be mistaken for
8551                                          * a superpage.
8552                                          */
8553                                         superpage = TRUE;
8554                                 }
8555
8556                                 if ((tpte & PG_V) == 0) {
8557                                         panic("bad pte va %lx pte %lx",
8558                                             pv->pv_va, tpte);
8559                                 }
8560
8561 /*
8562  * We cannot remove wired pages from a process' mapping at this time
8563  */
8564                                 if (tpte & PG_W) {
8565                                         allfree = 0;
8566                                         continue;
8567                                 }
8568
8569                                 /* Mark free */
8570                                 pc->pc_map[field] |= bitmask;
8571
8572                                 /*
8573                                  * Because this pmap is not active on other
8574                                  * processors, the dirty bit cannot have
8575                                  * changed state since we last loaded pte.
8576                                  */
8577                                 pte_clear(pte);
8578
8579                                 if (superpage)
8580                                         pa = tpte & PG_PS_FRAME;
8581                                 else
8582                                         pa = tpte & PG_FRAME;
8583
8584                                 m = PHYS_TO_VM_PAGE(pa);
8585                                 KASSERT(m->phys_addr == pa,
8586                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
8587                                     m, (uintmax_t)m->phys_addr,
8588                                     (uintmax_t)tpte));
8589
8590                                 KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
8591                                     m < &vm_page_array[vm_page_array_size],
8592                                     ("pmap_remove_pages: bad tpte %#jx",
8593                                     (uintmax_t)tpte));
8594
8595                                 /*
8596                                  * Update the vm_page_t clean/reference bits.
8597                                  */
8598                                 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
8599                                         if (superpage) {
8600                                                 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
8601                                                         vm_page_dirty(mt);
8602                                         } else
8603                                                 vm_page_dirty(m);
8604                                 }
8605
8606                                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
8607
8608                                 if (superpage) {
8609                                         pmap_resident_count_adj(pmap, -NBPDR / PAGE_SIZE);
8610                                         pvh = pa_to_pvh(tpte & PG_PS_FRAME);
8611                                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
8612                                         pvh->pv_gen++;
8613                                         if (TAILQ_EMPTY(&pvh->pv_list)) {
8614                                                 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
8615                                                         if ((mt->a.flags & PGA_WRITEABLE) != 0 &&
8616                                                             TAILQ_EMPTY(&mt->md.pv_list))
8617                                                                 vm_page_aflag_clear(mt, PGA_WRITEABLE);
8618                                         }
8619                                         mpte = pmap_remove_pt_page(pmap, pv->pv_va);
8620                                         if (mpte != NULL) {
8621                                                 KASSERT(vm_page_any_valid(mpte),
8622                                                     ("pmap_remove_pages: pte page not promoted"));
8623                                                 pmap_pt_page_count_adj(pmap, -1);
8624                                                 KASSERT(mpte->ref_count == NPTEPG,
8625                                                     ("pmap_remove_pages: pte page reference count error"));
8626                                                 mpte->ref_count = 0;
8627                                                 pmap_add_delayed_free_list(mpte, &free, FALSE);
8628                                         }
8629                                 } else {
8630                                         pmap_resident_count_adj(pmap, -1);
8631                                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
8632                                         m->md.pv_gen++;
8633                                         if ((m->a.flags & PGA_WRITEABLE) != 0 &&
8634                                             TAILQ_EMPTY(&m->md.pv_list) &&
8635                                             (m->flags & PG_FICTITIOUS) == 0) {
8636                                                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8637                                                 if (TAILQ_EMPTY(&pvh->pv_list))
8638                                                         vm_page_aflag_clear(m, PGA_WRITEABLE);
8639                                         }
8640                                 }
8641                                 pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free);
8642 #ifdef PV_STATS
8643                                 freed++;
8644 #endif
8645                         }
8646                 }
8647                 PV_STAT(counter_u64_add(pv_entry_frees, freed));
8648                 PV_STAT(counter_u64_add(pv_entry_spare, freed));
8649                 PV_STAT(counter_u64_add(pv_entry_count, -freed));
8650                 if (allfree) {
8651                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
8652                         TAILQ_INSERT_TAIL(&free_chunks[pc_to_domain(pc)], pc, pc_list);
8653                 }
8654         }
8655         if (lock != NULL)
8656                 rw_wunlock(lock);
8657         pmap_invalidate_all(pmap);
8658         pmap_pkru_deassign_all(pmap);
8659         free_pv_chunk_batch((struct pv_chunklist *)&free_chunks);
8660         PMAP_UNLOCK(pmap);
8661         vm_page_free_pages_toq(&free, true);
8662 }
8663
8664 static boolean_t
8665 pmap_page_test_mappings(vm_page_t m, boolean_t accessed, boolean_t modified)
8666 {
8667         struct rwlock *lock;
8668         pv_entry_t pv;
8669         struct md_page *pvh;
8670         pt_entry_t *pte, mask;
8671         pt_entry_t PG_A, PG_M, PG_RW, PG_V;
8672         pmap_t pmap;
8673         int md_gen, pvh_gen;
8674         boolean_t rv;
8675
8676         rv = FALSE;
8677         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8678         rw_rlock(lock);
8679 restart:
8680         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8681                 pmap = PV_PMAP(pv);
8682                 if (!PMAP_TRYLOCK(pmap)) {
8683                         md_gen = m->md.pv_gen;
8684                         rw_runlock(lock);
8685                         PMAP_LOCK(pmap);
8686                         rw_rlock(lock);
8687                         if (md_gen != m->md.pv_gen) {
8688                                 PMAP_UNLOCK(pmap);
8689                                 goto restart;
8690                         }
8691                 }
8692                 pte = pmap_pte(pmap, pv->pv_va);
8693                 mask = 0;
8694                 if (modified) {
8695                         PG_M = pmap_modified_bit(pmap);
8696                         PG_RW = pmap_rw_bit(pmap);
8697                         mask |= PG_RW | PG_M;
8698                 }
8699                 if (accessed) {
8700                         PG_A = pmap_accessed_bit(pmap);
8701                         PG_V = pmap_valid_bit(pmap);
8702                         mask |= PG_V | PG_A;
8703                 }
8704                 rv = (*pte & mask) == mask;
8705                 PMAP_UNLOCK(pmap);
8706                 if (rv)
8707                         goto out;
8708         }
8709         if ((m->flags & PG_FICTITIOUS) == 0) {
8710                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8711                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
8712                         pmap = PV_PMAP(pv);
8713                         if (!PMAP_TRYLOCK(pmap)) {
8714                                 md_gen = m->md.pv_gen;
8715                                 pvh_gen = pvh->pv_gen;
8716                                 rw_runlock(lock);
8717                                 PMAP_LOCK(pmap);
8718                                 rw_rlock(lock);
8719                                 if (md_gen != m->md.pv_gen ||
8720                                     pvh_gen != pvh->pv_gen) {
8721                                         PMAP_UNLOCK(pmap);
8722                                         goto restart;
8723                                 }
8724                         }
8725                         pte = pmap_pde(pmap, pv->pv_va);
8726                         mask = 0;
8727                         if (modified) {
8728                                 PG_M = pmap_modified_bit(pmap);
8729                                 PG_RW = pmap_rw_bit(pmap);
8730                                 mask |= PG_RW | PG_M;
8731                         }
8732                         if (accessed) {
8733                                 PG_A = pmap_accessed_bit(pmap);
8734                                 PG_V = pmap_valid_bit(pmap);
8735                                 mask |= PG_V | PG_A;
8736                         }
8737                         rv = (*pte & mask) == mask;
8738                         PMAP_UNLOCK(pmap);
8739                         if (rv)
8740                                 goto out;
8741                 }
8742         }
8743 out:
8744         rw_runlock(lock);
8745         return (rv);
8746 }
8747
8748 /*
8749  *      pmap_is_modified:
8750  *
8751  *      Return whether or not the specified physical page was modified
8752  *      in any physical maps.
8753  */
8754 boolean_t
8755 pmap_is_modified(vm_page_t m)
8756 {
8757
8758         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8759             ("pmap_is_modified: page %p is not managed", m));
8760
8761         /*
8762          * If the page is not busied then this check is racy.
8763          */
8764         if (!pmap_page_is_write_mapped(m))
8765                 return (FALSE);
8766         return (pmap_page_test_mappings(m, FALSE, TRUE));
8767 }
8768
8769 /*
8770  *      pmap_is_prefaultable:
8771  *
8772  *      Return whether or not the specified virtual address is eligible
8773  *      for prefault.
8774  */
8775 boolean_t
8776 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
8777 {
8778         pd_entry_t *pde;
8779         pt_entry_t *pte, PG_V;
8780         boolean_t rv;
8781
8782         PG_V = pmap_valid_bit(pmap);
8783
8784         /*
8785          * Return TRUE if and only if the PTE for the specified virtual
8786          * address is allocated but invalid.
8787          */
8788         rv = FALSE;
8789         PMAP_LOCK(pmap);
8790         pde = pmap_pde(pmap, addr);
8791         if (pde != NULL && (*pde & (PG_PS | PG_V)) == PG_V) {
8792                 pte = pmap_pde_to_pte(pde, addr);
8793                 rv = (*pte & PG_V) == 0;
8794         }
8795         PMAP_UNLOCK(pmap);
8796         return (rv);
8797 }
8798
8799 /*
8800  *      pmap_is_referenced:
8801  *
8802  *      Return whether or not the specified physical page was referenced
8803  *      in any physical maps.
8804  */
8805 boolean_t
8806 pmap_is_referenced(vm_page_t m)
8807 {
8808
8809         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8810             ("pmap_is_referenced: page %p is not managed", m));
8811         return (pmap_page_test_mappings(m, TRUE, FALSE));
8812 }
8813
8814 /*
8815  * Clear the write and modified bits in each of the given page's mappings.
8816  */
8817 void
8818 pmap_remove_write(vm_page_t m)
8819 {
8820         struct md_page *pvh;
8821         pmap_t pmap;
8822         struct rwlock *lock;
8823         pv_entry_t next_pv, pv;
8824         pd_entry_t *pde;
8825         pt_entry_t oldpte, *pte, PG_M, PG_RW;
8826         vm_offset_t va;
8827         int pvh_gen, md_gen;
8828
8829         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8830             ("pmap_remove_write: page %p is not managed", m));
8831
8832         vm_page_assert_busied(m);
8833         if (!pmap_page_is_write_mapped(m))
8834                 return;
8835
8836         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8837         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
8838             pa_to_pvh(VM_PAGE_TO_PHYS(m));
8839         rw_wlock(lock);
8840 retry:
8841         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
8842                 pmap = PV_PMAP(pv);
8843                 if (!PMAP_TRYLOCK(pmap)) {
8844                         pvh_gen = pvh->pv_gen;
8845                         rw_wunlock(lock);
8846                         PMAP_LOCK(pmap);
8847                         rw_wlock(lock);
8848                         if (pvh_gen != pvh->pv_gen) {
8849                                 PMAP_UNLOCK(pmap);
8850                                 goto retry;
8851                         }
8852                 }
8853                 PG_RW = pmap_rw_bit(pmap);
8854                 va = pv->pv_va;
8855                 pde = pmap_pde(pmap, va);
8856                 if ((*pde & PG_RW) != 0)
8857                         (void)pmap_demote_pde_locked(pmap, pde, va, &lock);
8858                 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
8859                     ("inconsistent pv lock %p %p for page %p",
8860                     lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
8861                 PMAP_UNLOCK(pmap);
8862         }
8863         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8864                 pmap = PV_PMAP(pv);
8865                 if (!PMAP_TRYLOCK(pmap)) {
8866                         pvh_gen = pvh->pv_gen;
8867                         md_gen = m->md.pv_gen;
8868                         rw_wunlock(lock);
8869                         PMAP_LOCK(pmap);
8870                         rw_wlock(lock);
8871                         if (pvh_gen != pvh->pv_gen ||
8872                             md_gen != m->md.pv_gen) {
8873                                 PMAP_UNLOCK(pmap);
8874                                 goto retry;
8875                         }
8876                 }
8877                 PG_M = pmap_modified_bit(pmap);
8878                 PG_RW = pmap_rw_bit(pmap);
8879                 pde = pmap_pde(pmap, pv->pv_va);
8880                 KASSERT((*pde & PG_PS) == 0,
8881                     ("pmap_remove_write: found a 2mpage in page %p's pv list",
8882                     m));
8883                 pte = pmap_pde_to_pte(pde, pv->pv_va);
8884                 oldpte = *pte;
8885                 if (oldpte & PG_RW) {
8886                         while (!atomic_fcmpset_long(pte, &oldpte, oldpte &
8887                             ~(PG_RW | PG_M)))
8888                                 cpu_spinwait();
8889                         if ((oldpte & PG_M) != 0)
8890                                 vm_page_dirty(m);
8891                         pmap_invalidate_page(pmap, pv->pv_va);
8892                 }
8893                 PMAP_UNLOCK(pmap);
8894         }
8895         rw_wunlock(lock);
8896         vm_page_aflag_clear(m, PGA_WRITEABLE);
8897         pmap_delayed_invl_wait(m);
8898 }
8899
8900 /*
8901  *      pmap_ts_referenced:
8902  *
8903  *      Return a count of reference bits for a page, clearing those bits.
8904  *      It is not necessary for every reference bit to be cleared, but it
8905  *      is necessary that 0 only be returned when there are truly no
8906  *      reference bits set.
8907  *
8908  *      As an optimization, update the page's dirty field if a modified bit is
8909  *      found while counting reference bits.  This opportunistic update can be
8910  *      performed at low cost and can eliminate the need for some future calls
8911  *      to pmap_is_modified().  However, since this function stops after
8912  *      finding PMAP_TS_REFERENCED_MAX reference bits, it may not detect some
8913  *      dirty pages.  Those dirty pages will only be detected by a future call
8914  *      to pmap_is_modified().
8915  *
8916  *      A DI block is not needed within this function, because
8917  *      invalidations are performed before the PV list lock is
8918  *      released.
8919  */
8920 int
8921 pmap_ts_referenced(vm_page_t m)
8922 {
8923         struct md_page *pvh;
8924         pv_entry_t pv, pvf;
8925         pmap_t pmap;
8926         struct rwlock *lock;
8927         pd_entry_t oldpde, *pde;
8928         pt_entry_t *pte, PG_A, PG_M, PG_RW;
8929         vm_offset_t va;
8930         vm_paddr_t pa;
8931         int cleared, md_gen, not_cleared, pvh_gen;
8932         struct spglist free;
8933         boolean_t demoted;
8934
8935         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8936             ("pmap_ts_referenced: page %p is not managed", m));
8937         SLIST_INIT(&free);
8938         cleared = 0;
8939         pa = VM_PAGE_TO_PHYS(m);
8940         lock = PHYS_TO_PV_LIST_LOCK(pa);
8941         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : pa_to_pvh(pa);
8942         rw_wlock(lock);
8943 retry:
8944         not_cleared = 0;
8945         if ((pvf = TAILQ_FIRST(&pvh->pv_list)) == NULL)
8946                 goto small_mappings;
8947         pv = pvf;
8948         do {
8949                 if (pvf == NULL)
8950                         pvf = pv;
8951                 pmap = PV_PMAP(pv);
8952                 if (!PMAP_TRYLOCK(pmap)) {
8953                         pvh_gen = pvh->pv_gen;
8954                         rw_wunlock(lock);
8955                         PMAP_LOCK(pmap);
8956                         rw_wlock(lock);
8957                         if (pvh_gen != pvh->pv_gen) {
8958                                 PMAP_UNLOCK(pmap);
8959                                 goto retry;
8960                         }
8961                 }
8962                 PG_A = pmap_accessed_bit(pmap);
8963                 PG_M = pmap_modified_bit(pmap);
8964                 PG_RW = pmap_rw_bit(pmap);
8965                 va = pv->pv_va;
8966                 pde = pmap_pde(pmap, pv->pv_va);
8967                 oldpde = *pde;
8968                 if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
8969                         /*
8970                          * Although "oldpde" is mapping a 2MB page, because
8971                          * this function is called at a 4KB page granularity,
8972                          * we only update the 4KB page under test.
8973                          */
8974                         vm_page_dirty(m);
8975                 }
8976                 if ((oldpde & PG_A) != 0) {
8977                         /*
8978                          * Since this reference bit is shared by 512 4KB
8979                          * pages, it should not be cleared every time it is
8980                          * tested.  Apply a simple "hash" function on the
8981                          * physical page number, the virtual superpage number,
8982                          * and the pmap address to select one 4KB page out of
8983                          * the 512 on which testing the reference bit will
8984                          * result in clearing that reference bit.  This
8985                          * function is designed to avoid the selection of the
8986                          * same 4KB page for every 2MB page mapping.
8987                          *
8988                          * On demotion, a mapping that hasn't been referenced
8989                          * is simply destroyed.  To avoid the possibility of a
8990                          * subsequent page fault on a demoted wired mapping,
8991                          * always leave its reference bit set.  Moreover,
8992                          * since the superpage is wired, the current state of
8993                          * its reference bit won't affect page replacement.
8994                          */
8995                         if ((((pa >> PAGE_SHIFT) ^ (pv->pv_va >> PDRSHIFT) ^
8996                             (uintptr_t)pmap) & (NPTEPG - 1)) == 0 &&
8997                             (oldpde & PG_W) == 0) {
8998                                 if (safe_to_clear_referenced(pmap, oldpde)) {
8999                                         atomic_clear_long(pde, PG_A);
9000                                         pmap_invalidate_page(pmap, pv->pv_va);
9001                                         demoted = FALSE;
9002                                 } else if (pmap_demote_pde_locked(pmap, pde,
9003                                     pv->pv_va, &lock)) {
9004                                         /*
9005                                          * Remove the mapping to a single page
9006                                          * so that a subsequent access may
9007                                          * repromote.  Since the underlying
9008                                          * page table page is fully populated,
9009                                          * this removal never frees a page
9010                                          * table page.
9011                                          */
9012                                         demoted = TRUE;
9013                                         va += VM_PAGE_TO_PHYS(m) - (oldpde &
9014                                             PG_PS_FRAME);
9015                                         pte = pmap_pde_to_pte(pde, va);
9016                                         pmap_remove_pte(pmap, pte, va, *pde,
9017                                             NULL, &lock);
9018                                         pmap_invalidate_page(pmap, va);
9019                                 } else
9020                                         demoted = TRUE;
9021
9022                                 if (demoted) {
9023                                         /*
9024                                          * The superpage mapping was removed
9025                                          * entirely and therefore 'pv' is no
9026                                          * longer valid.
9027                                          */
9028                                         if (pvf == pv)
9029                                                 pvf = NULL;
9030                                         pv = NULL;
9031                                 }
9032                                 cleared++;
9033                                 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
9034                                     ("inconsistent pv lock %p %p for page %p",
9035                                     lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
9036                         } else
9037                                 not_cleared++;
9038                 }
9039                 PMAP_UNLOCK(pmap);
9040                 /* Rotate the PV list if it has more than one entry. */
9041                 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
9042                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
9043                         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
9044                         pvh->pv_gen++;
9045                 }
9046                 if (cleared + not_cleared >= PMAP_TS_REFERENCED_MAX)
9047                         goto out;
9048         } while ((pv = TAILQ_FIRST(&pvh->pv_list)) != pvf);
9049 small_mappings:
9050         if ((pvf = TAILQ_FIRST(&m->md.pv_list)) == NULL)
9051                 goto out;
9052         pv = pvf;
9053         do {
9054                 if (pvf == NULL)
9055                         pvf = pv;
9056                 pmap = PV_PMAP(pv);
9057                 if (!PMAP_TRYLOCK(pmap)) {
9058                         pvh_gen = pvh->pv_gen;
9059                         md_gen = m->md.pv_gen;
9060                         rw_wunlock(lock);
9061                         PMAP_LOCK(pmap);
9062                         rw_wlock(lock);
9063                         if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
9064                                 PMAP_UNLOCK(pmap);
9065                                 goto retry;
9066                         }
9067                 }
9068                 PG_A = pmap_accessed_bit(pmap);
9069                 PG_M = pmap_modified_bit(pmap);
9070                 PG_RW = pmap_rw_bit(pmap);
9071                 pde = pmap_pde(pmap, pv->pv_va);
9072                 KASSERT((*pde & PG_PS) == 0,
9073                     ("pmap_ts_referenced: found a 2mpage in page %p's pv list",
9074                     m));
9075                 pte = pmap_pde_to_pte(pde, pv->pv_va);
9076                 if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW))
9077                         vm_page_dirty(m);
9078                 if ((*pte & PG_A) != 0) {
9079                         if (safe_to_clear_referenced(pmap, *pte)) {
9080                                 atomic_clear_long(pte, PG_A);
9081                                 pmap_invalidate_page(pmap, pv->pv_va);
9082                                 cleared++;
9083                         } else if ((*pte & PG_W) == 0) {
9084                                 /*
9085                                  * Wired pages cannot be paged out so
9086                                  * doing accessed bit emulation for
9087                                  * them is wasted effort. We do the
9088                                  * hard work for unwired pages only.
9089                                  */
9090                                 pmap_remove_pte(pmap, pte, pv->pv_va,
9091                                     *pde, &free, &lock);
9092                                 pmap_invalidate_page(pmap, pv->pv_va);
9093                                 cleared++;
9094                                 if (pvf == pv)
9095                                         pvf = NULL;
9096                                 pv = NULL;
9097                                 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
9098                                     ("inconsistent pv lock %p %p for page %p",
9099                                     lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
9100                         } else
9101                                 not_cleared++;
9102                 }
9103                 PMAP_UNLOCK(pmap);
9104                 /* Rotate the PV list if it has more than one entry. */
9105                 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
9106                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
9107                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
9108                         m->md.pv_gen++;
9109                 }
9110         } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != pvf && cleared +
9111             not_cleared < PMAP_TS_REFERENCED_MAX);
9112 out:
9113         rw_wunlock(lock);
9114         vm_page_free_pages_toq(&free, true);
9115         return (cleared + not_cleared);
9116 }
9117
9118 /*
9119  *      Apply the given advice to the specified range of addresses within the
9120  *      given pmap.  Depending on the advice, clear the referenced and/or
9121  *      modified flags in each mapping and set the mapped page's dirty field.
9122  */
9123 void
9124 pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
9125 {
9126         struct rwlock *lock;
9127         pml4_entry_t *pml4e;
9128         pdp_entry_t *pdpe;
9129         pd_entry_t oldpde, *pde;
9130         pt_entry_t *pte, PG_A, PG_G, PG_M, PG_RW, PG_V;
9131         vm_offset_t va, va_next;
9132         vm_page_t m;
9133         bool anychanged;
9134
9135         if (advice != MADV_DONTNEED && advice != MADV_FREE)
9136                 return;
9137
9138         /*
9139          * A/D bit emulation requires an alternate code path when clearing
9140          * the modified and accessed bits below. Since this function is
9141          * advisory in nature we skip it entirely for pmaps that require
9142          * A/D bit emulation.
9143          */
9144         if (pmap_emulate_ad_bits(pmap))
9145                 return;
9146
9147         PG_A = pmap_accessed_bit(pmap);
9148         PG_G = pmap_global_bit(pmap);
9149         PG_M = pmap_modified_bit(pmap);
9150         PG_V = pmap_valid_bit(pmap);
9151         PG_RW = pmap_rw_bit(pmap);
9152         anychanged = false;
9153         pmap_delayed_invl_start();
9154         PMAP_LOCK(pmap);
9155         for (; sva < eva; sva = va_next) {
9156                 pml4e = pmap_pml4e(pmap, sva);
9157                 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
9158                         va_next = (sva + NBPML4) & ~PML4MASK;
9159                         if (va_next < sva)
9160                                 va_next = eva;
9161                         continue;
9162                 }
9163
9164                 va_next = (sva + NBPDP) & ~PDPMASK;
9165                 if (va_next < sva)
9166                         va_next = eva;
9167                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
9168                 if ((*pdpe & PG_V) == 0)
9169                         continue;
9170                 if ((*pdpe & PG_PS) != 0)
9171                         continue;
9172
9173                 va_next = (sva + NBPDR) & ~PDRMASK;
9174                 if (va_next < sva)
9175                         va_next = eva;
9176                 pde = pmap_pdpe_to_pde(pdpe, sva);
9177                 oldpde = *pde;
9178                 if ((oldpde & PG_V) == 0)
9179                         continue;
9180                 else if ((oldpde & PG_PS) != 0) {
9181                         if ((oldpde & PG_MANAGED) == 0)
9182                                 continue;
9183                         lock = NULL;
9184                         if (!pmap_demote_pde_locked(pmap, pde, sva, &lock)) {
9185                                 if (lock != NULL)
9186                                         rw_wunlock(lock);
9187
9188                                 /*
9189                                  * The large page mapping was destroyed.
9190                                  */
9191                                 continue;
9192                         }
9193
9194                         /*
9195                          * Unless the page mappings are wired, remove the
9196                          * mapping to a single page so that a subsequent
9197                          * access may repromote.  Choosing the last page
9198                          * within the address range [sva, min(va_next, eva))
9199                          * generally results in more repromotions.  Since the
9200                          * underlying page table page is fully populated, this
9201                          * removal never frees a page table page.
9202                          */
9203                         if ((oldpde & PG_W) == 0) {
9204                                 va = eva;
9205                                 if (va > va_next)
9206                                         va = va_next;
9207                                 va -= PAGE_SIZE;
9208                                 KASSERT(va >= sva,
9209                                     ("pmap_advise: no address gap"));
9210                                 pte = pmap_pde_to_pte(pde, va);
9211                                 KASSERT((*pte & PG_V) != 0,
9212                                     ("pmap_advise: invalid PTE"));
9213                                 pmap_remove_pte(pmap, pte, va, *pde, NULL,
9214                                     &lock);
9215                                 anychanged = true;
9216                         }
9217                         if (lock != NULL)
9218                                 rw_wunlock(lock);
9219                 }
9220                 if (va_next > eva)
9221                         va_next = eva;
9222                 va = va_next;
9223                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
9224                     sva += PAGE_SIZE) {
9225                         if ((*pte & (PG_MANAGED | PG_V)) != (PG_MANAGED | PG_V))
9226                                 goto maybe_invlrng;
9227                         else if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
9228                                 if (advice == MADV_DONTNEED) {
9229                                         /*
9230                                          * Future calls to pmap_is_modified()
9231                                          * can be avoided by making the page
9232                                          * dirty now.
9233                                          */
9234                                         m = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
9235                                         vm_page_dirty(m);
9236                                 }
9237                                 atomic_clear_long(pte, PG_M | PG_A);
9238                         } else if ((*pte & PG_A) != 0)
9239                                 atomic_clear_long(pte, PG_A);
9240                         else
9241                                 goto maybe_invlrng;
9242
9243                         if ((*pte & PG_G) != 0) {
9244                                 if (va == va_next)
9245                                         va = sva;
9246                         } else
9247                                 anychanged = true;
9248                         continue;
9249 maybe_invlrng:
9250                         if (va != va_next) {
9251                                 pmap_invalidate_range(pmap, va, sva);
9252                                 va = va_next;
9253                         }
9254                 }
9255                 if (va != va_next)
9256                         pmap_invalidate_range(pmap, va, sva);
9257         }
9258         if (anychanged)
9259                 pmap_invalidate_all(pmap);
9260         PMAP_UNLOCK(pmap);
9261         pmap_delayed_invl_finish();
9262 }
9263
9264 /*
9265  *      Clear the modify bits on the specified physical page.
9266  */
9267 void
9268 pmap_clear_modify(vm_page_t m)
9269 {
9270         struct md_page *pvh;
9271         pmap_t pmap;
9272         pv_entry_t next_pv, pv;
9273         pd_entry_t oldpde, *pde;
9274         pt_entry_t *pte, PG_M, PG_RW;
9275         struct rwlock *lock;
9276         vm_offset_t va;
9277         int md_gen, pvh_gen;
9278
9279         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
9280             ("pmap_clear_modify: page %p is not managed", m));
9281         vm_page_assert_busied(m);
9282
9283         if (!pmap_page_is_write_mapped(m))
9284                 return;
9285         pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
9286             pa_to_pvh(VM_PAGE_TO_PHYS(m));
9287         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
9288         rw_wlock(lock);
9289 restart:
9290         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
9291                 pmap = PV_PMAP(pv);
9292                 if (!PMAP_TRYLOCK(pmap)) {
9293                         pvh_gen = pvh->pv_gen;
9294                         rw_wunlock(lock);
9295                         PMAP_LOCK(pmap);
9296                         rw_wlock(lock);
9297                         if (pvh_gen != pvh->pv_gen) {
9298                                 PMAP_UNLOCK(pmap);
9299                                 goto restart;
9300                         }
9301                 }
9302                 PG_M = pmap_modified_bit(pmap);
9303                 PG_RW = pmap_rw_bit(pmap);
9304                 va = pv->pv_va;
9305                 pde = pmap_pde(pmap, va);
9306                 oldpde = *pde;
9307                 /* If oldpde has PG_RW set, then it also has PG_M set. */
9308                 if ((oldpde & PG_RW) != 0 &&
9309                     pmap_demote_pde_locked(pmap, pde, va, &lock) &&
9310                     (oldpde & PG_W) == 0) {
9311                         /*
9312                          * Write protect the mapping to a single page so that
9313                          * a subsequent write access may repromote.
9314                          */
9315                         va += VM_PAGE_TO_PHYS(m) - (oldpde & PG_PS_FRAME);
9316                         pte = pmap_pde_to_pte(pde, va);
9317                         atomic_clear_long(pte, PG_M | PG_RW);
9318                         vm_page_dirty(m);
9319                         pmap_invalidate_page(pmap, va);
9320                 }
9321                 PMAP_UNLOCK(pmap);
9322         }
9323         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
9324                 pmap = PV_PMAP(pv);
9325                 if (!PMAP_TRYLOCK(pmap)) {
9326                         md_gen = m->md.pv_gen;
9327                         pvh_gen = pvh->pv_gen;
9328                         rw_wunlock(lock);
9329                         PMAP_LOCK(pmap);
9330                         rw_wlock(lock);
9331                         if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
9332                                 PMAP_UNLOCK(pmap);
9333                                 goto restart;
9334                         }
9335                 }
9336                 PG_M = pmap_modified_bit(pmap);
9337                 PG_RW = pmap_rw_bit(pmap);
9338                 pde = pmap_pde(pmap, pv->pv_va);
9339                 KASSERT((*pde & PG_PS) == 0, ("pmap_clear_modify: found"
9340                     " a 2mpage in page %p's pv list", m));
9341                 pte = pmap_pde_to_pte(pde, pv->pv_va);
9342                 if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
9343                         atomic_clear_long(pte, PG_M);
9344                         pmap_invalidate_page(pmap, pv->pv_va);
9345                 }
9346                 PMAP_UNLOCK(pmap);
9347         }
9348         rw_wunlock(lock);
9349 }
9350
9351 /*
9352  * Miscellaneous support routines follow
9353  */
9354
9355 /* Adjust the properties for a leaf page table entry. */
9356 static __inline void
9357 pmap_pte_props(pt_entry_t *pte, u_long bits, u_long mask)
9358 {
9359         u_long opte, npte;
9360
9361         opte = *(u_long *)pte;
9362         do {
9363                 npte = opte & ~mask;
9364                 npte |= bits;
9365         } while (npte != opte && !atomic_fcmpset_long((u_long *)pte, &opte,
9366             npte));
9367 }
9368
9369 /*
9370  * Map a set of physical memory pages into the kernel virtual
9371  * address space. Return a pointer to where it is mapped. This
9372  * routine is intended to be used for mapping device memory,
9373  * NOT real memory.
9374  */
9375 static void *
9376 pmap_mapdev_internal(vm_paddr_t pa, vm_size_t size, int mode, int flags)
9377 {
9378         struct pmap_preinit_mapping *ppim;
9379         vm_offset_t va, offset;
9380         vm_size_t tmpsize;
9381         int i;
9382
9383         offset = pa & PAGE_MASK;
9384         size = round_page(offset + size);
9385         pa = trunc_page(pa);
9386
9387         if (!pmap_initialized) {
9388                 va = 0;
9389                 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
9390                         ppim = pmap_preinit_mapping + i;
9391                         if (ppim->va == 0) {
9392                                 ppim->pa = pa;
9393                                 ppim->sz = size;
9394                                 ppim->mode = mode;
9395                                 ppim->va = virtual_avail;
9396                                 virtual_avail += size;
9397                                 va = ppim->va;
9398                                 break;
9399                         }
9400                 }
9401                 if (va == 0)
9402                         panic("%s: too many preinit mappings", __func__);
9403         } else {
9404                 /*
9405                  * If we have a preinit mapping, re-use it.
9406                  */
9407                 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
9408                         ppim = pmap_preinit_mapping + i;
9409                         if (ppim->pa == pa && ppim->sz == size &&
9410                             (ppim->mode == mode ||
9411                             (flags & MAPDEV_SETATTR) == 0))
9412                                 return ((void *)(ppim->va + offset));
9413                 }
9414                 /*
9415                  * If the specified range of physical addresses fits within
9416                  * the direct map window, use the direct map.
9417                  */
9418                 if (pa < dmaplimit && pa + size <= dmaplimit) {
9419                         va = PHYS_TO_DMAP(pa);
9420                         if ((flags & MAPDEV_SETATTR) != 0) {
9421                                 PMAP_LOCK(kernel_pmap);
9422                                 i = pmap_change_props_locked(va, size,
9423                                     PROT_NONE, mode, flags);
9424                                 PMAP_UNLOCK(kernel_pmap);
9425                         } else
9426                                 i = 0;
9427                         if (!i)
9428                                 return ((void *)(va + offset));
9429                 }
9430                 va = kva_alloc(size);
9431                 if (va == 0)
9432                         panic("%s: Couldn't allocate KVA", __func__);
9433         }
9434         for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
9435                 pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode);
9436         pmap_invalidate_range(kernel_pmap, va, va + tmpsize);
9437         if ((flags & MAPDEV_FLUSHCACHE) != 0)
9438                 pmap_invalidate_cache_range(va, va + tmpsize);
9439         return ((void *)(va + offset));
9440 }
9441
9442 void *
9443 pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode)
9444 {
9445
9446         return (pmap_mapdev_internal(pa, size, mode, MAPDEV_FLUSHCACHE |
9447             MAPDEV_SETATTR));
9448 }
9449
9450 void *
9451 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
9452 {
9453
9454         return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE));
9455 }
9456
9457 void *
9458 pmap_mapdev_pciecfg(vm_paddr_t pa, vm_size_t size)
9459 {
9460
9461         return (pmap_mapdev_internal(pa, size, PAT_UNCACHEABLE,
9462             MAPDEV_SETATTR));
9463 }
9464
9465 void *
9466 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
9467 {
9468
9469         return (pmap_mapdev_internal(pa, size, PAT_WRITE_BACK,
9470             MAPDEV_FLUSHCACHE));
9471 }
9472
9473 void
9474 pmap_unmapdev(void *p, vm_size_t size)
9475 {
9476         struct pmap_preinit_mapping *ppim;
9477         vm_offset_t offset, va;
9478         int i;
9479
9480         va = (vm_offset_t)p;
9481
9482         /* If we gave a direct map region in pmap_mapdev, do nothing */
9483         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS)
9484                 return;
9485         offset = va & PAGE_MASK;
9486         size = round_page(offset + size);
9487         va = trunc_page(va);
9488         for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
9489                 ppim = pmap_preinit_mapping + i;
9490                 if (ppim->va == va && ppim->sz == size) {
9491                         if (pmap_initialized)
9492                                 return;
9493                         ppim->pa = 0;
9494                         ppim->va = 0;
9495                         ppim->sz = 0;
9496                         ppim->mode = 0;
9497                         if (va + size == virtual_avail)
9498                                 virtual_avail = va;
9499                         return;
9500                 }
9501         }
9502         if (pmap_initialized) {
9503                 pmap_qremove(va, atop(size));
9504                 kva_free(va, size);
9505         }
9506 }
9507
9508 /*
9509  * Tries to demote a 1GB page mapping.
9510  */
9511 static boolean_t
9512 pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va)
9513 {
9514         pdp_entry_t newpdpe, oldpdpe;
9515         pd_entry_t *firstpde, newpde, *pde;
9516         pt_entry_t PG_A, PG_M, PG_RW, PG_V;
9517         vm_paddr_t pdpgpa;
9518         vm_page_t pdpg;
9519
9520         PG_A = pmap_accessed_bit(pmap);
9521         PG_M = pmap_modified_bit(pmap);
9522         PG_V = pmap_valid_bit(pmap);
9523         PG_RW = pmap_rw_bit(pmap);
9524
9525         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
9526         oldpdpe = *pdpe;
9527         KASSERT((oldpdpe & (PG_PS | PG_V)) == (PG_PS | PG_V),
9528             ("pmap_demote_pdpe: oldpdpe is missing PG_PS and/or PG_V"));
9529         pdpg = pmap_alloc_pt_page(pmap, va >> PDPSHIFT,
9530             VM_ALLOC_WIRED | VM_ALLOC_INTERRUPT);
9531         if (pdpg  == NULL) {
9532                 CTR2(KTR_PMAP, "pmap_demote_pdpe: failure for va %#lx"
9533                     " in pmap %p", va, pmap);
9534                 return (FALSE);
9535         }
9536         pdpgpa = VM_PAGE_TO_PHYS(pdpg);
9537         firstpde = (pd_entry_t *)PHYS_TO_DMAP(pdpgpa);
9538         newpdpe = pdpgpa | PG_M | PG_A | (oldpdpe & PG_U) | PG_RW | PG_V;
9539         KASSERT((oldpdpe & PG_A) != 0,
9540             ("pmap_demote_pdpe: oldpdpe is missing PG_A"));
9541         KASSERT((oldpdpe & (PG_M | PG_RW)) != PG_RW,
9542             ("pmap_demote_pdpe: oldpdpe is missing PG_M"));
9543         newpde = oldpdpe;
9544
9545         /*
9546          * Initialize the page directory page.
9547          */
9548         for (pde = firstpde; pde < firstpde + NPDEPG; pde++) {
9549                 *pde = newpde;
9550                 newpde += NBPDR;
9551         }
9552
9553         /*
9554          * Demote the mapping.
9555          */
9556         *pdpe = newpdpe;
9557
9558         /*
9559          * Invalidate a stale recursive mapping of the page directory page.
9560          */
9561         pmap_invalidate_page(pmap, (vm_offset_t)vtopde(va));
9562
9563         counter_u64_add(pmap_pdpe_demotions, 1);
9564         CTR2(KTR_PMAP, "pmap_demote_pdpe: success for va %#lx"
9565             " in pmap %p", va, pmap);
9566         return (TRUE);
9567 }
9568
9569 /*
9570  * Sets the memory attribute for the specified page.
9571  */
9572 void
9573 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
9574 {
9575
9576         m->md.pat_mode = ma;
9577
9578         /*
9579          * If "m" is a normal page, update its direct mapping.  This update
9580          * can be relied upon to perform any cache operations that are
9581          * required for data coherence.
9582          */
9583         if ((m->flags & PG_FICTITIOUS) == 0 &&
9584             pmap_change_attr(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)), PAGE_SIZE,
9585             m->md.pat_mode))
9586                 panic("memory attribute change on the direct map failed");
9587 }
9588
9589 void
9590 pmap_page_set_memattr_noflush(vm_page_t m, vm_memattr_t ma)
9591 {
9592         int error;
9593
9594         m->md.pat_mode = ma;
9595
9596         if ((m->flags & PG_FICTITIOUS) != 0)
9597                 return;
9598         PMAP_LOCK(kernel_pmap);
9599         error = pmap_change_props_locked(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)),
9600             PAGE_SIZE, PROT_NONE, m->md.pat_mode, 0);
9601         PMAP_UNLOCK(kernel_pmap);
9602         if (error != 0)
9603                 panic("memory attribute change on the direct map failed");
9604 }
9605
9606 /*
9607  * Changes the specified virtual address range's memory type to that given by
9608  * the parameter "mode".  The specified virtual address range must be
9609  * completely contained within either the direct map or the kernel map.  If
9610  * the virtual address range is contained within the kernel map, then the
9611  * memory type for each of the corresponding ranges of the direct map is also
9612  * changed.  (The corresponding ranges of the direct map are those ranges that
9613  * map the same physical pages as the specified virtual address range.)  These
9614  * changes to the direct map are necessary because Intel describes the
9615  * behavior of their processors as "undefined" if two or more mappings to the
9616  * same physical page have different memory types.
9617  *
9618  * Returns zero if the change completed successfully, and either EINVAL or
9619  * ENOMEM if the change failed.  Specifically, EINVAL is returned if some part
9620  * of the virtual address range was not mapped, and ENOMEM is returned if
9621  * there was insufficient memory available to complete the change.  In the
9622  * latter case, the memory type may have been changed on some part of the
9623  * virtual address range or the direct map.
9624  */
9625 int
9626 pmap_change_attr(vm_offset_t va, vm_size_t size, int mode)
9627 {
9628         int error;
9629
9630         PMAP_LOCK(kernel_pmap);
9631         error = pmap_change_props_locked(va, size, PROT_NONE, mode,
9632             MAPDEV_FLUSHCACHE);
9633         PMAP_UNLOCK(kernel_pmap);
9634         return (error);
9635 }
9636
9637 /*
9638  * Changes the specified virtual address range's protections to those
9639  * specified by "prot".  Like pmap_change_attr(), protections for aliases
9640  * in the direct map are updated as well.  Protections on aliasing mappings may
9641  * be a subset of the requested protections; for example, mappings in the direct
9642  * map are never executable.
9643  */
9644 int
9645 pmap_change_prot(vm_offset_t va, vm_size_t size, vm_prot_t prot)
9646 {
9647         int error;
9648
9649         /* Only supported within the kernel map. */
9650         if (va < VM_MIN_KERNEL_ADDRESS)
9651                 return (EINVAL);
9652
9653         PMAP_LOCK(kernel_pmap);
9654         error = pmap_change_props_locked(va, size, prot, -1,
9655             MAPDEV_ASSERTVALID);
9656         PMAP_UNLOCK(kernel_pmap);
9657         return (error);
9658 }
9659
9660 static int
9661 pmap_change_props_locked(vm_offset_t va, vm_size_t size, vm_prot_t prot,
9662     int mode, int flags)
9663 {
9664         vm_offset_t base, offset, tmpva;
9665         vm_paddr_t pa_start, pa_end, pa_end1;
9666         pdp_entry_t *pdpe;
9667         pd_entry_t *pde, pde_bits, pde_mask;
9668         pt_entry_t *pte, pte_bits, pte_mask;
9669         int error;
9670         bool changed;
9671
9672         PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED);
9673         base = trunc_page(va);
9674         offset = va & PAGE_MASK;
9675         size = round_page(offset + size);
9676
9677         /*
9678          * Only supported on kernel virtual addresses, including the direct
9679          * map but excluding the recursive map.
9680          */
9681         if (base < DMAP_MIN_ADDRESS)
9682                 return (EINVAL);
9683
9684         /*
9685          * Construct our flag sets and masks.  "bits" is the subset of
9686          * "mask" that will be set in each modified PTE.
9687          *
9688          * Mappings in the direct map are never allowed to be executable.
9689          */
9690         pde_bits = pte_bits = 0;
9691         pde_mask = pte_mask = 0;
9692         if (mode != -1) {
9693                 pde_bits |= pmap_cache_bits(kernel_pmap, mode, true);
9694                 pde_mask |= X86_PG_PDE_CACHE;
9695                 pte_bits |= pmap_cache_bits(kernel_pmap, mode, false);
9696                 pte_mask |= X86_PG_PTE_CACHE;
9697         }
9698         if (prot != VM_PROT_NONE) {
9699                 if ((prot & VM_PROT_WRITE) != 0) {
9700                         pde_bits |= X86_PG_RW;
9701                         pte_bits |= X86_PG_RW;
9702                 }
9703                 if ((prot & VM_PROT_EXECUTE) == 0 ||
9704                     va < VM_MIN_KERNEL_ADDRESS) {
9705                         pde_bits |= pg_nx;
9706                         pte_bits |= pg_nx;
9707                 }
9708                 pde_mask |= X86_PG_RW | pg_nx;
9709                 pte_mask |= X86_PG_RW | pg_nx;
9710         }
9711
9712         /*
9713          * Pages that aren't mapped aren't supported.  Also break down 2MB pages
9714          * into 4KB pages if required.
9715          */
9716         for (tmpva = base; tmpva < base + size; ) {
9717                 pdpe = pmap_pdpe(kernel_pmap, tmpva);
9718                 if (pdpe == NULL || *pdpe == 0) {
9719                         KASSERT((flags & MAPDEV_ASSERTVALID) == 0,
9720                             ("%s: addr %#lx is not mapped", __func__, tmpva));
9721                         return (EINVAL);
9722                 }
9723                 if (*pdpe & PG_PS) {
9724                         /*
9725                          * If the current 1GB page already has the required
9726                          * properties, then we need not demote this page.  Just
9727                          * increment tmpva to the next 1GB page frame.
9728                          */
9729                         if ((*pdpe & pde_mask) == pde_bits) {
9730                                 tmpva = trunc_1gpage(tmpva) + NBPDP;
9731                                 continue;
9732                         }
9733
9734                         /*
9735                          * If the current offset aligns with a 1GB page frame
9736                          * and there is at least 1GB left within the range, then
9737                          * we need not break down this page into 2MB pages.
9738                          */
9739                         if ((tmpva & PDPMASK) == 0 &&
9740                             tmpva + PDPMASK < base + size) {
9741                                 tmpva += NBPDP;
9742                                 continue;
9743                         }
9744                         if (!pmap_demote_pdpe(kernel_pmap, pdpe, tmpva))
9745                                 return (ENOMEM);
9746                 }
9747                 pde = pmap_pdpe_to_pde(pdpe, tmpva);
9748                 if (*pde == 0) {
9749                         KASSERT((flags & MAPDEV_ASSERTVALID) == 0,
9750                             ("%s: addr %#lx is not mapped", __func__, tmpva));
9751                         return (EINVAL);
9752                 }
9753                 if (*pde & PG_PS) {
9754                         /*
9755                          * If the current 2MB page already has the required
9756                          * properties, then we need not demote this page.  Just
9757                          * increment tmpva to the next 2MB page frame.
9758                          */
9759                         if ((*pde & pde_mask) == pde_bits) {
9760                                 tmpva = trunc_2mpage(tmpva) + NBPDR;
9761                                 continue;
9762                         }
9763
9764                         /*
9765                          * If the current offset aligns with a 2MB page frame
9766                          * and there is at least 2MB left within the range, then
9767                          * we need not break down this page into 4KB pages.
9768                          */
9769                         if ((tmpva & PDRMASK) == 0 &&
9770                             tmpva + PDRMASK < base + size) {
9771                                 tmpva += NBPDR;
9772                                 continue;
9773                         }
9774                         if (!pmap_demote_pde(kernel_pmap, pde, tmpva))
9775                                 return (ENOMEM);
9776                 }
9777                 pte = pmap_pde_to_pte(pde, tmpva);
9778                 if (*pte == 0) {
9779                         KASSERT((flags & MAPDEV_ASSERTVALID) == 0,
9780                             ("%s: addr %#lx is not mapped", __func__, tmpva));
9781                         return (EINVAL);
9782                 }
9783                 tmpva += PAGE_SIZE;
9784         }
9785         error = 0;
9786
9787         /*
9788          * Ok, all the pages exist, so run through them updating their
9789          * properties if required.
9790          */
9791         changed = false;
9792         pa_start = pa_end = 0;
9793         for (tmpva = base; tmpva < base + size; ) {
9794                 pdpe = pmap_pdpe(kernel_pmap, tmpva);
9795                 if (*pdpe & PG_PS) {
9796                         if ((*pdpe & pde_mask) != pde_bits) {
9797                                 pmap_pte_props(pdpe, pde_bits, pde_mask);
9798                                 changed = true;
9799                         }
9800                         if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
9801                             (*pdpe & PG_PS_FRAME) < dmaplimit) {
9802                                 if (pa_start == pa_end) {
9803                                         /* Start physical address run. */
9804                                         pa_start = *pdpe & PG_PS_FRAME;
9805                                         pa_end = pa_start + NBPDP;
9806                                 } else if (pa_end == (*pdpe & PG_PS_FRAME))
9807                                         pa_end += NBPDP;
9808                                 else {
9809                                         /* Run ended, update direct map. */
9810                                         error = pmap_change_props_locked(
9811                                             PHYS_TO_DMAP(pa_start),
9812                                             pa_end - pa_start, prot, mode,
9813                                             flags);
9814                                         if (error != 0)
9815                                                 break;
9816                                         /* Start physical address run. */
9817                                         pa_start = *pdpe & PG_PS_FRAME;
9818                                         pa_end = pa_start + NBPDP;
9819                                 }
9820                         }
9821                         tmpva = trunc_1gpage(tmpva) + NBPDP;
9822                         continue;
9823                 }
9824                 pde = pmap_pdpe_to_pde(pdpe, tmpva);
9825                 if (*pde & PG_PS) {
9826                         if ((*pde & pde_mask) != pde_bits) {
9827                                 pmap_pte_props(pde, pde_bits, pde_mask);
9828                                 changed = true;
9829                         }
9830                         if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
9831                             (*pde & PG_PS_FRAME) < dmaplimit) {
9832                                 if (pa_start == pa_end) {
9833                                         /* Start physical address run. */
9834                                         pa_start = *pde & PG_PS_FRAME;
9835                                         pa_end = pa_start + NBPDR;
9836                                 } else if (pa_end == (*pde & PG_PS_FRAME))
9837                                         pa_end += NBPDR;
9838                                 else {
9839                                         /* Run ended, update direct map. */
9840                                         error = pmap_change_props_locked(
9841                                             PHYS_TO_DMAP(pa_start),
9842                                             pa_end - pa_start, prot, mode,
9843                                             flags);
9844                                         if (error != 0)
9845                                                 break;
9846                                         /* Start physical address run. */
9847                                         pa_start = *pde & PG_PS_FRAME;
9848                                         pa_end = pa_start + NBPDR;
9849                                 }
9850                         }
9851                         tmpva = trunc_2mpage(tmpva) + NBPDR;
9852                 } else {
9853                         pte = pmap_pde_to_pte(pde, tmpva);
9854                         if ((*pte & pte_mask) != pte_bits) {
9855                                 pmap_pte_props(pte, pte_bits, pte_mask);
9856                                 changed = true;
9857                         }
9858                         if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
9859                             (*pte & PG_FRAME) < dmaplimit) {
9860                                 if (pa_start == pa_end) {
9861                                         /* Start physical address run. */
9862                                         pa_start = *pte & PG_FRAME;
9863                                         pa_end = pa_start + PAGE_SIZE;
9864                                 } else if (pa_end == (*pte & PG_FRAME))
9865                                         pa_end += PAGE_SIZE;
9866                                 else {
9867                                         /* Run ended, update direct map. */
9868                                         error = pmap_change_props_locked(
9869                                             PHYS_TO_DMAP(pa_start),
9870                                             pa_end - pa_start, prot, mode,
9871                                             flags);
9872                                         if (error != 0)
9873                                                 break;
9874                                         /* Start physical address run. */
9875                                         pa_start = *pte & PG_FRAME;
9876                                         pa_end = pa_start + PAGE_SIZE;
9877                                 }
9878                         }
9879                         tmpva += PAGE_SIZE;
9880                 }
9881         }
9882         if (error == 0 && pa_start != pa_end && pa_start < dmaplimit) {
9883                 pa_end1 = MIN(pa_end, dmaplimit);
9884                 if (pa_start != pa_end1)
9885                         error = pmap_change_props_locked(PHYS_TO_DMAP(pa_start),
9886                             pa_end1 - pa_start, prot, mode, flags);
9887         }
9888
9889         /*
9890          * Flush CPU caches if required to make sure any data isn't cached that
9891          * shouldn't be, etc.
9892          */
9893         if (changed) {
9894                 pmap_invalidate_range(kernel_pmap, base, tmpva);
9895                 if ((flags & MAPDEV_FLUSHCACHE) != 0)
9896                         pmap_invalidate_cache_range(base, tmpva);
9897         }
9898         return (error);
9899 }
9900
9901 /*
9902  * Demotes any mapping within the direct map region that covers more than the
9903  * specified range of physical addresses.  This range's size must be a power
9904  * of two and its starting address must be a multiple of its size.  Since the
9905  * demotion does not change any attributes of the mapping, a TLB invalidation
9906  * is not mandatory.  The caller may, however, request a TLB invalidation.
9907  */
9908 void
9909 pmap_demote_DMAP(vm_paddr_t base, vm_size_t len, boolean_t invalidate)
9910 {
9911         pdp_entry_t *pdpe;
9912         pd_entry_t *pde;
9913         vm_offset_t va;
9914         boolean_t changed;
9915
9916         if (len == 0)
9917                 return;
9918         KASSERT(powerof2(len), ("pmap_demote_DMAP: len is not a power of 2"));
9919         KASSERT((base & (len - 1)) == 0,
9920             ("pmap_demote_DMAP: base is not a multiple of len"));
9921         if (len < NBPDP && base < dmaplimit) {
9922                 va = PHYS_TO_DMAP(base);
9923                 changed = FALSE;
9924                 PMAP_LOCK(kernel_pmap);
9925                 pdpe = pmap_pdpe(kernel_pmap, va);
9926                 if ((*pdpe & X86_PG_V) == 0)
9927                         panic("pmap_demote_DMAP: invalid PDPE");
9928                 if ((*pdpe & PG_PS) != 0) {
9929                         if (!pmap_demote_pdpe(kernel_pmap, pdpe, va))
9930                                 panic("pmap_demote_DMAP: PDPE failed");
9931                         changed = TRUE;
9932                 }
9933                 if (len < NBPDR) {
9934                         pde = pmap_pdpe_to_pde(pdpe, va);
9935                         if ((*pde & X86_PG_V) == 0)
9936                                 panic("pmap_demote_DMAP: invalid PDE");
9937                         if ((*pde & PG_PS) != 0) {
9938                                 if (!pmap_demote_pde(kernel_pmap, pde, va))
9939                                         panic("pmap_demote_DMAP: PDE failed");
9940                                 changed = TRUE;
9941                         }
9942                 }
9943                 if (changed && invalidate)
9944                         pmap_invalidate_page(kernel_pmap, va);
9945                 PMAP_UNLOCK(kernel_pmap);
9946         }
9947 }
9948
9949 /*
9950  * Perform the pmap work for mincore(2).  If the page is not both referenced and
9951  * modified by this pmap, returns its physical address so that the caller can
9952  * find other mappings.
9953  */
9954 int
9955 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
9956 {
9957         pdp_entry_t *pdpe;
9958         pd_entry_t *pdep;
9959         pt_entry_t pte, PG_A, PG_M, PG_RW, PG_V;
9960         vm_paddr_t pa;
9961         int val;
9962
9963         PG_A = pmap_accessed_bit(pmap);
9964         PG_M = pmap_modified_bit(pmap);
9965         PG_V = pmap_valid_bit(pmap);
9966         PG_RW = pmap_rw_bit(pmap);
9967
9968         PMAP_LOCK(pmap);
9969         pte = 0;
9970         pa = 0;
9971         val = 0;
9972         pdpe = pmap_pdpe(pmap, addr);
9973         if (pdpe == NULL)
9974                 goto out;
9975         if ((*pdpe & PG_V) != 0) {
9976                 if ((*pdpe & PG_PS) != 0) {
9977                         pte = *pdpe;
9978                         pa = ((pte & PG_PS_PDP_FRAME) | (addr & PDPMASK)) &
9979                             PG_FRAME;
9980                         val = MINCORE_PSIND(2);
9981                 } else {
9982                         pdep = pmap_pde(pmap, addr);
9983                         if (pdep != NULL && (*pdep & PG_V) != 0) {
9984                                 if ((*pdep & PG_PS) != 0) {
9985                                         pte = *pdep;
9986                         /* Compute the physical address of the 4KB page. */
9987                                         pa = ((pte & PG_PS_FRAME) | (addr &
9988                                             PDRMASK)) & PG_FRAME;
9989                                         val = MINCORE_PSIND(1);
9990                                 } else {
9991                                         pte = *pmap_pde_to_pte(pdep, addr);
9992                                         pa = pte & PG_FRAME;
9993                                         val = 0;
9994                                 }
9995                         }
9996                 }
9997         }
9998         if ((pte & PG_V) != 0) {
9999                 val |= MINCORE_INCORE;
10000                 if ((pte & (PG_M | PG_RW)) == (PG_M | PG_RW))
10001                         val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
10002                 if ((pte & PG_A) != 0)
10003                         val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
10004         }
10005         if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
10006             (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) &&
10007             (pte & (PG_MANAGED | PG_V)) == (PG_MANAGED | PG_V)) {
10008                 *pap = pa;
10009         }
10010 out:
10011         PMAP_UNLOCK(pmap);
10012         return (val);
10013 }
10014
10015 static uint64_t
10016 pmap_pcid_alloc(pmap_t pmap, struct pmap_pcid *pcidp)
10017 {
10018         uint32_t gen, new_gen, pcid_next;
10019
10020         CRITICAL_ASSERT(curthread);
10021         gen = PCPU_GET(pcid_gen);
10022         if (pcidp->pm_pcid == PMAP_PCID_KERN)
10023                 return (pti ? 0 : CR3_PCID_SAVE);
10024         if (pcidp->pm_gen == gen)
10025                 return (CR3_PCID_SAVE);
10026         pcid_next = PCPU_GET(pcid_next);
10027         KASSERT((!pti && pcid_next <= PMAP_PCID_OVERMAX) ||
10028             (pti && pcid_next <= PMAP_PCID_OVERMAX_KERN),
10029             ("cpu %d pcid_next %#x", PCPU_GET(cpuid), pcid_next));
10030         if ((!pti && pcid_next == PMAP_PCID_OVERMAX) ||
10031             (pti && pcid_next == PMAP_PCID_OVERMAX_KERN)) {
10032                 new_gen = gen + 1;
10033                 if (new_gen == 0)
10034                         new_gen = 1;
10035                 PCPU_SET(pcid_gen, new_gen);
10036                 pcid_next = PMAP_PCID_KERN + 1;
10037         } else {
10038                 new_gen = gen;
10039         }
10040         pcidp->pm_pcid = pcid_next;
10041         pcidp->pm_gen = new_gen;
10042         PCPU_SET(pcid_next, pcid_next + 1);
10043         return (0);
10044 }
10045
10046 static uint64_t
10047 pmap_pcid_alloc_checked(pmap_t pmap, struct pmap_pcid *pcidp)
10048 {
10049         uint64_t cached;
10050
10051         cached = pmap_pcid_alloc(pmap, pcidp);
10052         KASSERT(pcidp->pm_pcid < PMAP_PCID_OVERMAX,
10053             ("pmap %p cpu %d pcid %#x", pmap, PCPU_GET(cpuid), pcidp->pm_pcid));
10054         KASSERT(pcidp->pm_pcid != PMAP_PCID_KERN || pmap == kernel_pmap,
10055             ("non-kernel pmap pmap %p cpu %d pcid %#x",
10056             pmap, PCPU_GET(cpuid), pcidp->pm_pcid));
10057         return (cached);
10058 }
10059
10060 static void
10061 pmap_activate_sw_pti_post(struct thread *td, pmap_t pmap)
10062 {
10063
10064         PCPU_GET(tssp)->tss_rsp0 = pmap->pm_ucr3 != PMAP_NO_CR3 ?
10065             PCPU_GET(pti_rsp0) : (uintptr_t)td->td_md.md_stack_base;
10066 }
10067
10068 static void
10069 pmap_activate_sw_pcid_pti(struct thread *td, pmap_t pmap, u_int cpuid)
10070 {
10071         pmap_t old_pmap;
10072         struct pmap_pcid *pcidp, *old_pcidp;
10073         uint64_t cached, cr3, kcr3, ucr3;
10074
10075         KASSERT((read_rflags() & PSL_I) == 0,
10076             ("PCID needs interrupts disabled in pmap_activate_sw()"));
10077
10078         /* See the comment in pmap_invalidate_page_pcid(). */
10079         if (PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK) {
10080                 PCPU_SET(ucr3_load_mask, PMAP_UCR3_NOMASK);
10081                 old_pmap = PCPU_GET(curpmap);
10082                 MPASS(old_pmap->pm_ucr3 != PMAP_NO_CR3);
10083                 old_pcidp = zpcpu_get_cpu(old_pmap->pm_pcidp, cpuid);
10084                 old_pcidp->pm_gen = 0;
10085         }
10086
10087         pcidp = zpcpu_get_cpu(pmap->pm_pcidp, cpuid);
10088         cached = pmap_pcid_alloc_checked(pmap, pcidp);
10089         cr3 = rcr3();
10090         if ((cr3 & ~CR3_PCID_MASK) != pmap->pm_cr3)
10091                 load_cr3(pmap->pm_cr3 | pcidp->pm_pcid);
10092         PCPU_SET(curpmap, pmap);
10093         kcr3 = pmap->pm_cr3 | pcidp->pm_pcid;
10094         ucr3 = pmap->pm_ucr3 | pcidp->pm_pcid | PMAP_PCID_USER_PT;
10095
10096         if (!cached && pmap->pm_ucr3 != PMAP_NO_CR3)
10097                 PCPU_SET(ucr3_load_mask, ~CR3_PCID_SAVE);
10098
10099         PCPU_SET(kcr3, kcr3 | CR3_PCID_SAVE);
10100         PCPU_SET(ucr3, ucr3 | CR3_PCID_SAVE);
10101         if (cached)
10102                 counter_u64_add(pcid_save_cnt, 1);
10103
10104         pmap_activate_sw_pti_post(td, pmap);
10105 }
10106
10107 static void
10108 pmap_activate_sw_pcid_nopti(struct thread *td __unused, pmap_t pmap,
10109     u_int cpuid)
10110 {
10111         struct pmap_pcid *pcidp;
10112         uint64_t cached, cr3;
10113
10114         KASSERT((read_rflags() & PSL_I) == 0,
10115             ("PCID needs interrupts disabled in pmap_activate_sw()"));
10116
10117         pcidp = zpcpu_get_cpu(pmap->pm_pcidp, cpuid);
10118         cached = pmap_pcid_alloc_checked(pmap, pcidp);
10119         cr3 = rcr3();
10120         if (!cached || (cr3 & ~CR3_PCID_MASK) != pmap->pm_cr3)
10121                 load_cr3(pmap->pm_cr3 | pcidp->pm_pcid | cached);
10122         PCPU_SET(curpmap, pmap);
10123         if (cached)
10124                 counter_u64_add(pcid_save_cnt, 1);
10125 }
10126
10127 static void
10128 pmap_activate_sw_nopcid_nopti(struct thread *td __unused, pmap_t pmap,
10129     u_int cpuid __unused)
10130 {
10131
10132         load_cr3(pmap->pm_cr3);
10133         PCPU_SET(curpmap, pmap);
10134 }
10135
10136 static void
10137 pmap_activate_sw_nopcid_pti(struct thread *td, pmap_t pmap,
10138     u_int cpuid __unused)
10139 {
10140
10141         pmap_activate_sw_nopcid_nopti(td, pmap, cpuid);
10142         PCPU_SET(kcr3, pmap->pm_cr3);
10143         PCPU_SET(ucr3, pmap->pm_ucr3);
10144         pmap_activate_sw_pti_post(td, pmap);
10145 }
10146
10147 DEFINE_IFUNC(static, void, pmap_activate_sw_mode, (struct thread *, pmap_t,
10148     u_int))
10149 {
10150
10151         if (pmap_pcid_enabled && pti)
10152                 return (pmap_activate_sw_pcid_pti);
10153         else if (pmap_pcid_enabled && !pti)
10154                 return (pmap_activate_sw_pcid_nopti);
10155         else if (!pmap_pcid_enabled && pti)
10156                 return (pmap_activate_sw_nopcid_pti);
10157         else /* if (!pmap_pcid_enabled && !pti) */
10158                 return (pmap_activate_sw_nopcid_nopti);
10159 }
10160
10161 void
10162 pmap_activate_sw(struct thread *td)
10163 {
10164         pmap_t oldpmap, pmap;
10165         u_int cpuid;
10166
10167         oldpmap = PCPU_GET(curpmap);
10168         pmap = vmspace_pmap(td->td_proc->p_vmspace);
10169         if (oldpmap == pmap) {
10170                 if (cpu_vendor_id != CPU_VENDOR_INTEL)
10171                         mfence();
10172                 return;
10173         }
10174         cpuid = PCPU_GET(cpuid);
10175 #ifdef SMP
10176         CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
10177 #else
10178         CPU_SET(cpuid, &pmap->pm_active);
10179 #endif
10180         pmap_activate_sw_mode(td, pmap, cpuid);
10181 #ifdef SMP
10182         CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
10183 #else
10184         CPU_CLR(cpuid, &oldpmap->pm_active);
10185 #endif
10186 }
10187
10188 void
10189 pmap_activate(struct thread *td)
10190 {
10191         /*
10192          * invltlb_{invpcid,}_pcid_handler() is used to handle an
10193          * invalidate_all IPI, which checks for curpmap ==
10194          * smp_tlb_pmap.  The below sequence of operations has a
10195          * window where %CR3 is loaded with the new pmap's PML4
10196          * address, but the curpmap value has not yet been updated.
10197          * This causes the invltlb IPI handler, which is called
10198          * between the updates, to execute as a NOP, which leaves
10199          * stale TLB entries.
10200          *
10201          * Note that the most common use of pmap_activate_sw(), from
10202          * a context switch, is immune to this race, because
10203          * interrupts are disabled (while the thread lock is owned),
10204          * so the IPI is delayed until after curpmap is updated.  Protect
10205          * other callers in a similar way, by disabling interrupts
10206          * around the %cr3 register reload and curpmap assignment.
10207          */
10208         spinlock_enter();
10209         pmap_activate_sw(td);
10210         spinlock_exit();
10211 }
10212
10213 void
10214 pmap_activate_boot(pmap_t pmap)
10215 {
10216         uint64_t kcr3;
10217         u_int cpuid;
10218
10219         /*
10220          * kernel_pmap must be never deactivated, and we ensure that
10221          * by never activating it at all.
10222          */
10223         MPASS(pmap != kernel_pmap);
10224
10225         cpuid = PCPU_GET(cpuid);
10226 #ifdef SMP
10227         CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
10228 #else
10229         CPU_SET(cpuid, &pmap->pm_active);
10230 #endif
10231         PCPU_SET(curpmap, pmap);
10232         if (pti) {
10233                 kcr3 = pmap->pm_cr3;
10234                 if (pmap_pcid_enabled)
10235                         kcr3 |= pmap_get_pcid(pmap) | CR3_PCID_SAVE;
10236         } else {
10237                 kcr3 = PMAP_NO_CR3;
10238         }
10239         PCPU_SET(kcr3, kcr3);
10240         PCPU_SET(ucr3, PMAP_NO_CR3);
10241 }
10242
10243 void
10244 pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
10245 {
10246 }
10247
10248 /*
10249  *      Increase the starting virtual address of the given mapping if a
10250  *      different alignment might result in more superpage mappings.
10251  */
10252 void
10253 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
10254     vm_offset_t *addr, vm_size_t size)
10255 {
10256         vm_offset_t superpage_offset;
10257
10258         if (size < NBPDR)
10259                 return;
10260         if (object != NULL && (object->flags & OBJ_COLORED) != 0)
10261                 offset += ptoa(object->pg_color);
10262         superpage_offset = offset & PDRMASK;
10263         if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR ||
10264             (*addr & PDRMASK) == superpage_offset)
10265                 return;
10266         if ((*addr & PDRMASK) < superpage_offset)
10267                 *addr = (*addr & ~PDRMASK) + superpage_offset;
10268         else
10269                 *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
10270 }
10271
10272 #ifdef INVARIANTS
10273 static unsigned long num_dirty_emulations;
10274 SYSCTL_ULONG(_vm_pmap, OID_AUTO, num_dirty_emulations, CTLFLAG_RW,
10275              &num_dirty_emulations, 0, NULL);
10276
10277 static unsigned long num_accessed_emulations;
10278 SYSCTL_ULONG(_vm_pmap, OID_AUTO, num_accessed_emulations, CTLFLAG_RW,
10279              &num_accessed_emulations, 0, NULL);
10280
10281 static unsigned long num_superpage_accessed_emulations;
10282 SYSCTL_ULONG(_vm_pmap, OID_AUTO, num_superpage_accessed_emulations, CTLFLAG_RW,
10283              &num_superpage_accessed_emulations, 0, NULL);
10284
10285 static unsigned long ad_emulation_superpage_promotions;
10286 SYSCTL_ULONG(_vm_pmap, OID_AUTO, ad_emulation_superpage_promotions, CTLFLAG_RW,
10287              &ad_emulation_superpage_promotions, 0, NULL);
10288 #endif  /* INVARIANTS */
10289
10290 int
10291 pmap_emulate_accessed_dirty(pmap_t pmap, vm_offset_t va, int ftype)
10292 {
10293         int rv;
10294         struct rwlock *lock;
10295 #if VM_NRESERVLEVEL > 0
10296         vm_page_t m, mpte;
10297 #endif
10298         pd_entry_t *pde;
10299         pt_entry_t *pte, PG_A, PG_M, PG_RW, PG_V;
10300
10301         KASSERT(ftype == VM_PROT_READ || ftype == VM_PROT_WRITE,
10302             ("pmap_emulate_accessed_dirty: invalid fault type %d", ftype));
10303
10304         if (!pmap_emulate_ad_bits(pmap))
10305                 return (-1);
10306
10307         PG_A = pmap_accessed_bit(pmap);
10308         PG_M = pmap_modified_bit(pmap);
10309         PG_V = pmap_valid_bit(pmap);
10310         PG_RW = pmap_rw_bit(pmap);
10311
10312         rv = -1;
10313         lock = NULL;
10314         PMAP_LOCK(pmap);
10315
10316         pde = pmap_pde(pmap, va);
10317         if (pde == NULL || (*pde & PG_V) == 0)
10318                 goto done;
10319
10320         if ((*pde & PG_PS) != 0) {
10321                 if (ftype == VM_PROT_READ) {
10322 #ifdef INVARIANTS
10323                         atomic_add_long(&num_superpage_accessed_emulations, 1);
10324 #endif
10325                         *pde |= PG_A;
10326                         rv = 0;
10327                 }
10328                 goto done;
10329         }
10330
10331         pte = pmap_pde_to_pte(pde, va);
10332         if ((*pte & PG_V) == 0)
10333                 goto done;
10334
10335         if (ftype == VM_PROT_WRITE) {
10336                 if ((*pte & PG_RW) == 0)
10337                         goto done;
10338                 /*
10339                  * Set the modified and accessed bits simultaneously.
10340                  *
10341                  * Intel EPT PTEs that do software emulation of A/D bits map
10342                  * PG_A and PG_M to EPT_PG_READ and EPT_PG_WRITE respectively.
10343                  * An EPT misconfiguration is triggered if the PTE is writable
10344                  * but not readable (WR=10). This is avoided by setting PG_A
10345                  * and PG_M simultaneously.
10346                  */
10347                 *pte |= PG_M | PG_A;
10348         } else {
10349                 *pte |= PG_A;
10350         }
10351
10352 #if VM_NRESERVLEVEL > 0
10353         /* try to promote the mapping */
10354         if (va < VM_MAXUSER_ADDRESS)
10355                 mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
10356         else
10357                 mpte = NULL;
10358
10359         m = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
10360
10361         if ((mpte == NULL || mpte->ref_count == NPTEPG) &&
10362             pmap_ps_enabled(pmap) &&
10363             (m->flags & PG_FICTITIOUS) == 0 &&
10364             vm_reserv_level_iffullpop(m) == 0) {
10365                 pmap_promote_pde(pmap, pde, va, mpte, &lock);
10366 #ifdef INVARIANTS
10367                 atomic_add_long(&ad_emulation_superpage_promotions, 1);
10368 #endif
10369         }
10370 #endif
10371
10372 #ifdef INVARIANTS
10373         if (ftype == VM_PROT_WRITE)
10374                 atomic_add_long(&num_dirty_emulations, 1);
10375         else
10376                 atomic_add_long(&num_accessed_emulations, 1);
10377 #endif
10378         rv = 0;         /* success */
10379 done:
10380         if (lock != NULL)
10381                 rw_wunlock(lock);
10382         PMAP_UNLOCK(pmap);
10383         return (rv);
10384 }
10385
10386 void
10387 pmap_get_mapping(pmap_t pmap, vm_offset_t va, uint64_t *ptr, int *num)
10388 {
10389         pml4_entry_t *pml4;
10390         pdp_entry_t *pdp;
10391         pd_entry_t *pde;
10392         pt_entry_t *pte, PG_V;
10393         int idx;
10394
10395         idx = 0;
10396         PG_V = pmap_valid_bit(pmap);
10397         PMAP_LOCK(pmap);
10398
10399         pml4 = pmap_pml4e(pmap, va);
10400         if (pml4 == NULL)
10401                 goto done;
10402         ptr[idx++] = *pml4;
10403         if ((*pml4 & PG_V) == 0)
10404                 goto done;
10405
10406         pdp = pmap_pml4e_to_pdpe(pml4, va);
10407         ptr[idx++] = *pdp;
10408         if ((*pdp & PG_V) == 0 || (*pdp & PG_PS) != 0)
10409                 goto done;
10410
10411         pde = pmap_pdpe_to_pde(pdp, va);
10412         ptr[idx++] = *pde;
10413         if ((*pde & PG_V) == 0 || (*pde & PG_PS) != 0)
10414                 goto done;
10415
10416         pte = pmap_pde_to_pte(pde, va);
10417         ptr[idx++] = *pte;
10418
10419 done:
10420         PMAP_UNLOCK(pmap);
10421         *num = idx;
10422 }
10423
10424 /**
10425  * Get the kernel virtual address of a set of physical pages. If there are
10426  * physical addresses not covered by the DMAP perform a transient mapping
10427  * that will be removed when calling pmap_unmap_io_transient.
10428  *
10429  * \param page        The pages the caller wishes to obtain the virtual
10430  *                    address on the kernel memory map.
10431  * \param vaddr       On return contains the kernel virtual memory address
10432  *                    of the pages passed in the page parameter.
10433  * \param count       Number of pages passed in.
10434  * \param can_fault   true if the thread using the mapped pages can take
10435  *                    page faults, false otherwise.
10436  *
10437  * \returns true if the caller must call pmap_unmap_io_transient when
10438  *          finished or false otherwise.
10439  *
10440  */
10441 bool
10442 pmap_map_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
10443     bool can_fault)
10444 {
10445         vm_paddr_t paddr;
10446         bool needs_mapping;
10447         pt_entry_t *pte;
10448         int cache_bits, error __unused, i;
10449
10450         /*
10451          * Allocate any KVA space that we need, this is done in a separate
10452          * loop to prevent calling vmem_alloc while pinned.
10453          */
10454         needs_mapping = false;
10455         for (i = 0; i < count; i++) {
10456                 paddr = VM_PAGE_TO_PHYS(page[i]);
10457                 if (__predict_false(paddr >= dmaplimit)) {
10458                         error = vmem_alloc(kernel_arena, PAGE_SIZE,
10459                             M_BESTFIT | M_WAITOK, &vaddr[i]);
10460                         KASSERT(error == 0, ("vmem_alloc failed: %d", error));
10461                         needs_mapping = true;
10462                 } else {
10463                         vaddr[i] = PHYS_TO_DMAP(paddr);
10464                 }
10465         }
10466
10467         /* Exit early if everything is covered by the DMAP */
10468         if (!needs_mapping)
10469                 return (false);
10470
10471         /*
10472          * NB:  The sequence of updating a page table followed by accesses
10473          * to the corresponding pages used in the !DMAP case is subject to
10474          * the situation described in the "AMD64 Architecture Programmer's
10475          * Manual Volume 2: System Programming" rev. 3.23, "7.3.1 Special
10476          * Coherency Considerations".  Therefore, issuing the INVLPG right
10477          * after modifying the PTE bits is crucial.
10478          */
10479         if (!can_fault)
10480                 sched_pin();
10481         for (i = 0; i < count; i++) {
10482                 paddr = VM_PAGE_TO_PHYS(page[i]);
10483                 if (paddr >= dmaplimit) {
10484                         if (can_fault) {
10485                                 /*
10486                                  * Slow path, since we can get page faults
10487                                  * while mappings are active don't pin the
10488                                  * thread to the CPU and instead add a global
10489                                  * mapping visible to all CPUs.
10490                                  */
10491                                 pmap_qenter(vaddr[i], &page[i], 1);
10492                         } else {
10493                                 pte = vtopte(vaddr[i]);
10494                                 cache_bits = pmap_cache_bits(kernel_pmap,
10495                                     page[i]->md.pat_mode, false);
10496                                 pte_store(pte, paddr | X86_PG_RW | X86_PG_V |
10497                                     cache_bits);
10498                                 pmap_invlpg(kernel_pmap, vaddr[i]);
10499                         }
10500                 }
10501         }
10502
10503         return (needs_mapping);
10504 }
10505
10506 void
10507 pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
10508     bool can_fault)
10509 {
10510         vm_paddr_t paddr;
10511         int i;
10512
10513         if (!can_fault)
10514                 sched_unpin();
10515         for (i = 0; i < count; i++) {
10516                 paddr = VM_PAGE_TO_PHYS(page[i]);
10517                 if (paddr >= dmaplimit) {
10518                         if (can_fault)
10519                                 pmap_qremove(vaddr[i], 1);
10520                         vmem_free(kernel_arena, vaddr[i], PAGE_SIZE);
10521                 }
10522         }
10523 }
10524
10525 vm_offset_t
10526 pmap_quick_enter_page(vm_page_t m)
10527 {
10528         vm_paddr_t paddr;
10529
10530         paddr = VM_PAGE_TO_PHYS(m);
10531         if (paddr < dmaplimit)
10532                 return (PHYS_TO_DMAP(paddr));
10533         mtx_lock_spin(&qframe_mtx);
10534         KASSERT(*vtopte(qframe) == 0, ("qframe busy"));
10535
10536         /*
10537          * Since qframe is exclusively mapped by us, and we do not set
10538          * PG_G, we can use INVLPG here.
10539          */
10540         invlpg(qframe);
10541
10542         pte_store(vtopte(qframe), paddr | X86_PG_RW | X86_PG_V | X86_PG_A |
10543             X86_PG_M | pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0));
10544         return (qframe);
10545 }
10546
10547 void
10548 pmap_quick_remove_page(vm_offset_t addr)
10549 {
10550
10551         if (addr != qframe)
10552                 return;
10553         pte_store(vtopte(qframe), 0);
10554         mtx_unlock_spin(&qframe_mtx);
10555 }
10556
10557 /*
10558  * Pdp pages from the large map are managed differently from either
10559  * kernel or user page table pages.  They are permanently allocated at
10560  * initialization time, and their reference count is permanently set to
10561  * zero.  The pml4 entries pointing to those pages are copied into
10562  * each allocated pmap.
10563  *
10564  * In contrast, pd and pt pages are managed like user page table
10565  * pages.  They are dynamically allocated, and their reference count
10566  * represents the number of valid entries within the page.
10567  */
10568 static vm_page_t
10569 pmap_large_map_getptp_unlocked(void)
10570 {
10571         return (pmap_alloc_pt_page(kernel_pmap, 0, VM_ALLOC_ZERO));
10572 }
10573
10574 static vm_page_t
10575 pmap_large_map_getptp(void)
10576 {
10577         vm_page_t m;
10578
10579         PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED);
10580         m = pmap_large_map_getptp_unlocked();
10581         if (m == NULL) {
10582                 PMAP_UNLOCK(kernel_pmap);
10583                 vm_wait(NULL);
10584                 PMAP_LOCK(kernel_pmap);
10585                 /* Callers retry. */
10586         }
10587         return (m);
10588 }
10589
10590 static pdp_entry_t *
10591 pmap_large_map_pdpe(vm_offset_t va)
10592 {
10593         vm_pindex_t pml4_idx;
10594         vm_paddr_t mphys;
10595
10596         pml4_idx = pmap_pml4e_index(va);
10597         KASSERT(LMSPML4I <= pml4_idx && pml4_idx < LMSPML4I + lm_ents,
10598             ("pmap_large_map_pdpe: va %#jx out of range idx %#jx LMSPML4I "
10599             "%#jx lm_ents %d",
10600             (uintmax_t)va, (uintmax_t)pml4_idx, LMSPML4I, lm_ents));
10601         KASSERT((kernel_pml4[pml4_idx] & X86_PG_V) != 0,
10602             ("pmap_large_map_pdpe: invalid pml4 for va %#jx idx %#jx "
10603             "LMSPML4I %#jx lm_ents %d",
10604             (uintmax_t)va, (uintmax_t)pml4_idx, LMSPML4I, lm_ents));
10605         mphys = kernel_pml4[pml4_idx] & PG_FRAME;
10606         return ((pdp_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pdpe_index(va));
10607 }
10608
10609 static pd_entry_t *
10610 pmap_large_map_pde(vm_offset_t va)
10611 {
10612         pdp_entry_t *pdpe;
10613         vm_page_t m;
10614         vm_paddr_t mphys;
10615
10616 retry:
10617         pdpe = pmap_large_map_pdpe(va);
10618         if (*pdpe == 0) {
10619                 m = pmap_large_map_getptp();
10620                 if (m == NULL)
10621                         goto retry;
10622                 mphys = VM_PAGE_TO_PHYS(m);
10623                 *pdpe = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx;
10624         } else {
10625                 MPASS((*pdpe & X86_PG_PS) == 0);
10626                 mphys = *pdpe & PG_FRAME;
10627         }
10628         return ((pd_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pde_index(va));
10629 }
10630
10631 static pt_entry_t *
10632 pmap_large_map_pte(vm_offset_t va)
10633 {
10634         pd_entry_t *pde;
10635         vm_page_t m;
10636         vm_paddr_t mphys;
10637
10638 retry:
10639         pde = pmap_large_map_pde(va);
10640         if (*pde == 0) {
10641                 m = pmap_large_map_getptp();
10642                 if (m == NULL)
10643                         goto retry;
10644                 mphys = VM_PAGE_TO_PHYS(m);
10645                 *pde = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx;
10646                 PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->ref_count++;
10647         } else {
10648                 MPASS((*pde & X86_PG_PS) == 0);
10649                 mphys = *pde & PG_FRAME;
10650         }
10651         return ((pt_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pte_index(va));
10652 }
10653
10654 static vm_paddr_t
10655 pmap_large_map_kextract(vm_offset_t va)
10656 {
10657         pdp_entry_t *pdpe, pdp;
10658         pd_entry_t *pde, pd;
10659         pt_entry_t *pte, pt;
10660
10661         KASSERT(PMAP_ADDRESS_IN_LARGEMAP(va),
10662             ("not largemap range %#lx", (u_long)va));
10663         pdpe = pmap_large_map_pdpe(va);
10664         pdp = *pdpe;
10665         KASSERT((pdp & X86_PG_V) != 0,
10666             ("invalid pdp va %#lx pdpe %#lx pdp %#lx", va,
10667             (u_long)pdpe, pdp));
10668         if ((pdp & X86_PG_PS) != 0) {
10669                 KASSERT((amd_feature & AMDID_PAGE1GB) != 0,
10670                     ("no 1G pages, va %#lx pdpe %#lx pdp %#lx", va,
10671                     (u_long)pdpe, pdp));
10672                 return ((pdp & PG_PS_PDP_FRAME) | (va & PDPMASK));
10673         }
10674         pde = pmap_pdpe_to_pde(pdpe, va);
10675         pd = *pde;
10676         KASSERT((pd & X86_PG_V) != 0,
10677             ("invalid pd va %#lx pde %#lx pd %#lx", va, (u_long)pde, pd));
10678         if ((pd & X86_PG_PS) != 0)
10679                 return ((pd & PG_PS_FRAME) | (va & PDRMASK));
10680         pte = pmap_pde_to_pte(pde, va);
10681         pt = *pte;
10682         KASSERT((pt & X86_PG_V) != 0,
10683             ("invalid pte va %#lx pte %#lx pt %#lx", va, (u_long)pte, pt));
10684         return ((pt & PG_FRAME) | (va & PAGE_MASK));
10685 }
10686
10687 static int
10688 pmap_large_map_getva(vm_size_t len, vm_offset_t align, vm_offset_t phase,
10689     vmem_addr_t *vmem_res)
10690 {
10691
10692         /*
10693          * Large mappings are all but static.  Consequently, there
10694          * is no point in waiting for an earlier allocation to be
10695          * freed.
10696          */
10697         return (vmem_xalloc(large_vmem, len, align, phase, 0, VMEM_ADDR_MIN,
10698             VMEM_ADDR_MAX, M_NOWAIT | M_BESTFIT, vmem_res));
10699 }
10700
10701 int
10702 pmap_large_map(vm_paddr_t spa, vm_size_t len, void **addr,
10703     vm_memattr_t mattr)
10704 {
10705         pdp_entry_t *pdpe;
10706         pd_entry_t *pde;
10707         pt_entry_t *pte;
10708         vm_offset_t va, inc;
10709         vmem_addr_t vmem_res;
10710         vm_paddr_t pa;
10711         int error;
10712
10713         if (len == 0 || spa + len < spa)
10714                 return (EINVAL);
10715
10716         /* See if DMAP can serve. */
10717         if (spa + len <= dmaplimit) {
10718                 va = PHYS_TO_DMAP(spa);
10719                 *addr = (void *)va;
10720                 return (pmap_change_attr(va, len, mattr));
10721         }
10722
10723         /*
10724          * No, allocate KVA.  Fit the address with best possible
10725          * alignment for superpages.  Fall back to worse align if
10726          * failed.
10727          */
10728         error = ENOMEM;
10729         if ((amd_feature & AMDID_PAGE1GB) != 0 && rounddown2(spa + len,
10730             NBPDP) >= roundup2(spa, NBPDP) + NBPDP)
10731                 error = pmap_large_map_getva(len, NBPDP, spa & PDPMASK,
10732                     &vmem_res);
10733         if (error != 0 && rounddown2(spa + len, NBPDR) >= roundup2(spa,
10734             NBPDR) + NBPDR)
10735                 error = pmap_large_map_getva(len, NBPDR, spa & PDRMASK,
10736                     &vmem_res);
10737         if (error != 0)
10738                 error = pmap_large_map_getva(len, PAGE_SIZE, 0, &vmem_res);
10739         if (error != 0)
10740                 return (error);
10741
10742         /*
10743          * Fill pagetable.  PG_M is not pre-set, we scan modified bits
10744          * in the pagetable to minimize flushing.  No need to
10745          * invalidate TLB, since we only update invalid entries.
10746          */
10747         PMAP_LOCK(kernel_pmap);
10748         for (pa = spa, va = vmem_res; len > 0; pa += inc, va += inc,
10749             len -= inc) {
10750                 if ((amd_feature & AMDID_PAGE1GB) != 0 && len >= NBPDP &&
10751                     (pa & PDPMASK) == 0 && (va & PDPMASK) == 0) {
10752                         pdpe = pmap_large_map_pdpe(va);
10753                         MPASS(*pdpe == 0);
10754                         *pdpe = pa | pg_g | X86_PG_PS | X86_PG_RW |
10755                             X86_PG_V | X86_PG_A | pg_nx |
10756                             pmap_cache_bits(kernel_pmap, mattr, TRUE);
10757                         inc = NBPDP;
10758                 } else if (len >= NBPDR && (pa & PDRMASK) == 0 &&
10759                     (va & PDRMASK) == 0) {
10760                         pde = pmap_large_map_pde(va);
10761                         MPASS(*pde == 0);
10762                         *pde = pa | pg_g | X86_PG_PS | X86_PG_RW |
10763                             X86_PG_V | X86_PG_A | pg_nx |
10764                             pmap_cache_bits(kernel_pmap, mattr, TRUE);
10765                         PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->
10766                             ref_count++;
10767                         inc = NBPDR;
10768                 } else {
10769                         pte = pmap_large_map_pte(va);
10770                         MPASS(*pte == 0);
10771                         *pte = pa | pg_g | X86_PG_RW | X86_PG_V |
10772                             X86_PG_A | pg_nx | pmap_cache_bits(kernel_pmap,
10773                             mattr, FALSE);
10774                         PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte))->
10775                             ref_count++;
10776                         inc = PAGE_SIZE;
10777                 }
10778         }
10779         PMAP_UNLOCK(kernel_pmap);
10780         MPASS(len == 0);
10781
10782         *addr = (void *)vmem_res;
10783         return (0);
10784 }
10785
10786 void
10787 pmap_large_unmap(void *svaa, vm_size_t len)
10788 {
10789         vm_offset_t sva, va;
10790         vm_size_t inc;
10791         pdp_entry_t *pdpe, pdp;
10792         pd_entry_t *pde, pd;
10793         pt_entry_t *pte;
10794         vm_page_t m;
10795         struct spglist spgf;
10796
10797         sva = (vm_offset_t)svaa;
10798         if (len == 0 || sva + len < sva || (sva >= DMAP_MIN_ADDRESS &&
10799             sva + len <= DMAP_MIN_ADDRESS + dmaplimit))
10800                 return;
10801
10802         SLIST_INIT(&spgf);
10803         KASSERT(PMAP_ADDRESS_IN_LARGEMAP(sva) &&
10804             PMAP_ADDRESS_IN_LARGEMAP(sva + len - 1),
10805             ("not largemap range %#lx %#lx", (u_long)svaa, (u_long)svaa + len));
10806         PMAP_LOCK(kernel_pmap);
10807         for (va = sva; va < sva + len; va += inc) {
10808                 pdpe = pmap_large_map_pdpe(va);
10809                 pdp = *pdpe;
10810                 KASSERT((pdp & X86_PG_V) != 0,
10811                     ("invalid pdp va %#lx pdpe %#lx pdp %#lx", va,
10812                     (u_long)pdpe, pdp));
10813                 if ((pdp & X86_PG_PS) != 0) {
10814                         KASSERT((amd_feature & AMDID_PAGE1GB) != 0,
10815                             ("no 1G pages, va %#lx pdpe %#lx pdp %#lx", va,
10816                             (u_long)pdpe, pdp));
10817                         KASSERT((va & PDPMASK) == 0,
10818                             ("PDPMASK bit set, va %#lx pdpe %#lx pdp %#lx", va,
10819                             (u_long)pdpe, pdp));
10820                         KASSERT(va + NBPDP <= sva + len,
10821                             ("unmap covers partial 1GB page, sva %#lx va %#lx "
10822                             "pdpe %#lx pdp %#lx len %#lx", sva, va,
10823                             (u_long)pdpe, pdp, len));
10824                         *pdpe = 0;
10825                         inc = NBPDP;
10826                         continue;
10827                 }
10828                 pde = pmap_pdpe_to_pde(pdpe, va);
10829                 pd = *pde;
10830                 KASSERT((pd & X86_PG_V) != 0,
10831                     ("invalid pd va %#lx pde %#lx pd %#lx", va,
10832                     (u_long)pde, pd));
10833                 if ((pd & X86_PG_PS) != 0) {
10834                         KASSERT((va & PDRMASK) == 0,
10835                             ("PDRMASK bit set, va %#lx pde %#lx pd %#lx", va,
10836                             (u_long)pde, pd));
10837                         KASSERT(va + NBPDR <= sva + len,
10838                             ("unmap covers partial 2MB page, sva %#lx va %#lx "
10839                             "pde %#lx pd %#lx len %#lx", sva, va, (u_long)pde,
10840                             pd, len));
10841                         pde_store(pde, 0);
10842                         inc = NBPDR;
10843                         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));
10844                         m->ref_count--;
10845                         if (m->ref_count == 0) {
10846                                 *pdpe = 0;
10847                                 SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
10848                         }
10849                         continue;
10850                 }
10851                 pte = pmap_pde_to_pte(pde, va);
10852                 KASSERT((*pte & X86_PG_V) != 0,
10853                     ("invalid pte va %#lx pte %#lx pt %#lx", va,
10854                     (u_long)pte, *pte));
10855                 pte_clear(pte);
10856                 inc = PAGE_SIZE;
10857                 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pte));
10858                 m->ref_count--;
10859                 if (m->ref_count == 0) {
10860                         *pde = 0;
10861                         SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
10862                         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));
10863                         m->ref_count--;
10864                         if (m->ref_count == 0) {
10865                                 *pdpe = 0;
10866                                 SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
10867                         }
10868                 }
10869         }
10870         pmap_invalidate_range(kernel_pmap, sva, sva + len);
10871         PMAP_UNLOCK(kernel_pmap);
10872         vm_page_free_pages_toq(&spgf, false);
10873         vmem_free(large_vmem, sva, len);
10874 }
10875
10876 static void
10877 pmap_large_map_wb_fence_mfence(void)
10878 {
10879
10880         mfence();
10881 }
10882
10883 static void
10884 pmap_large_map_wb_fence_atomic(void)
10885 {
10886
10887         atomic_thread_fence_seq_cst();
10888 }
10889
10890 static void
10891 pmap_large_map_wb_fence_nop(void)
10892 {
10893 }
10894
10895 DEFINE_IFUNC(static, void, pmap_large_map_wb_fence, (void))
10896 {
10897
10898         if (cpu_vendor_id != CPU_VENDOR_INTEL)
10899                 return (pmap_large_map_wb_fence_mfence);
10900         else if ((cpu_stdext_feature & (CPUID_STDEXT_CLWB |
10901             CPUID_STDEXT_CLFLUSHOPT)) == 0)
10902                 return (pmap_large_map_wb_fence_atomic);
10903         else
10904                 /* clflush is strongly enough ordered */
10905                 return (pmap_large_map_wb_fence_nop);
10906 }
10907
10908 static void
10909 pmap_large_map_flush_range_clwb(vm_offset_t va, vm_size_t len)
10910 {
10911
10912         for (; len > 0; len -= cpu_clflush_line_size,
10913             va += cpu_clflush_line_size)
10914                 clwb(va);
10915 }
10916
10917 static void
10918 pmap_large_map_flush_range_clflushopt(vm_offset_t va, vm_size_t len)
10919 {
10920
10921         for (; len > 0; len -= cpu_clflush_line_size,
10922             va += cpu_clflush_line_size)
10923                 clflushopt(va);
10924 }
10925
10926 static void
10927 pmap_large_map_flush_range_clflush(vm_offset_t va, vm_size_t len)
10928 {
10929
10930         for (; len > 0; len -= cpu_clflush_line_size,
10931             va += cpu_clflush_line_size)
10932                 clflush(va);
10933 }
10934
10935 static void
10936 pmap_large_map_flush_range_nop(vm_offset_t sva __unused, vm_size_t len __unused)
10937 {
10938 }
10939
10940 DEFINE_IFUNC(static, void, pmap_large_map_flush_range, (vm_offset_t, vm_size_t))
10941 {
10942
10943         if ((cpu_stdext_feature & CPUID_STDEXT_CLWB) != 0)
10944                 return (pmap_large_map_flush_range_clwb);
10945         else if ((cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0)
10946                 return (pmap_large_map_flush_range_clflushopt);
10947         else if ((cpu_feature & CPUID_CLFSH) != 0)
10948                 return (pmap_large_map_flush_range_clflush);
10949         else
10950                 return (pmap_large_map_flush_range_nop);
10951 }
10952
10953 static void
10954 pmap_large_map_wb_large(vm_offset_t sva, vm_offset_t eva)
10955 {
10956         volatile u_long *pe;
10957         u_long p;
10958         vm_offset_t va;
10959         vm_size_t inc;
10960         bool seen_other;
10961
10962         for (va = sva; va < eva; va += inc) {
10963                 inc = 0;
10964                 if ((amd_feature & AMDID_PAGE1GB) != 0) {
10965                         pe = (volatile u_long *)pmap_large_map_pdpe(va);
10966                         p = *pe;
10967                         if ((p & X86_PG_PS) != 0)
10968                                 inc = NBPDP;
10969                 }
10970                 if (inc == 0) {
10971                         pe = (volatile u_long *)pmap_large_map_pde(va);
10972                         p = *pe;
10973                         if ((p & X86_PG_PS) != 0)
10974                                 inc = NBPDR;
10975                 }
10976                 if (inc == 0) {
10977                         pe = (volatile u_long *)pmap_large_map_pte(va);
10978                         p = *pe;
10979                         inc = PAGE_SIZE;
10980                 }
10981                 seen_other = false;
10982                 for (;;) {
10983                         if ((p & X86_PG_AVAIL1) != 0) {
10984                                 /*
10985                                  * Spin-wait for the end of a parallel
10986                                  * write-back.
10987                                  */
10988                                 cpu_spinwait();
10989                                 p = *pe;
10990
10991                                 /*
10992                                  * If we saw other write-back
10993                                  * occuring, we cannot rely on PG_M to
10994                                  * indicate state of the cache.  The
10995                                  * PG_M bit is cleared before the
10996                                  * flush to avoid ignoring new writes,
10997                                  * and writes which are relevant for
10998                                  * us might happen after.
10999                                  */
11000                                 seen_other = true;
11001                                 continue;
11002                         }
11003
11004                         if ((p & X86_PG_M) != 0 || seen_other) {
11005                                 if (!atomic_fcmpset_long(pe, &p,
11006                                     (p & ~X86_PG_M) | X86_PG_AVAIL1))
11007                                         /*
11008                                          * If we saw PG_M without
11009                                          * PG_AVAIL1, and then on the
11010                                          * next attempt we do not
11011                                          * observe either PG_M or
11012                                          * PG_AVAIL1, the other
11013                                          * write-back started after us
11014                                          * and finished before us.  We
11015                                          * can rely on it doing our
11016                                          * work.
11017                                          */
11018                                         continue;
11019                                 pmap_large_map_flush_range(va, inc);
11020                                 atomic_clear_long(pe, X86_PG_AVAIL1);
11021                         }
11022                         break;
11023                 }
11024                 maybe_yield();
11025         }
11026 }
11027
11028 /*
11029  * Write-back cache lines for the given address range.
11030  *
11031  * Must be called only on the range or sub-range returned from
11032  * pmap_large_map().  Must not be called on the coalesced ranges.
11033  *
11034  * Does nothing on CPUs without CLWB, CLFLUSHOPT, or CLFLUSH
11035  * instructions support.
11036  */
11037 void
11038 pmap_large_map_wb(void *svap, vm_size_t len)
11039 {
11040         vm_offset_t eva, sva;
11041
11042         sva = (vm_offset_t)svap;
11043         eva = sva + len;
11044         pmap_large_map_wb_fence();
11045         if (sva >= DMAP_MIN_ADDRESS && eva <= DMAP_MIN_ADDRESS + dmaplimit) {
11046                 pmap_large_map_flush_range(sva, len);
11047         } else {
11048                 KASSERT(sva >= LARGEMAP_MIN_ADDRESS &&
11049                     eva <= LARGEMAP_MIN_ADDRESS + lm_ents * NBPML4,
11050                     ("pmap_large_map_wb: not largemap %#lx %#lx", sva, len));
11051                 pmap_large_map_wb_large(sva, eva);
11052         }
11053         pmap_large_map_wb_fence();
11054 }
11055
11056 static vm_page_t
11057 pmap_pti_alloc_page(void)
11058 {
11059         vm_page_t m;
11060
11061         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11062         m = vm_page_grab(pti_obj, pti_pg_idx++, VM_ALLOC_WIRED | VM_ALLOC_ZERO);
11063         return (m);
11064 }
11065
11066 static bool
11067 pmap_pti_free_page(vm_page_t m)
11068 {
11069         if (!vm_page_unwire_noq(m))
11070                 return (false);
11071         vm_page_xbusy_claim(m);
11072         vm_page_free_zero(m);
11073         return (true);
11074 }
11075
11076 static void
11077 pmap_pti_init(void)
11078 {
11079         vm_page_t pml4_pg;
11080         pdp_entry_t *pdpe;
11081         vm_offset_t va;
11082         int i;
11083
11084         if (!pti)
11085                 return;
11086         pti_obj = vm_pager_allocate(OBJT_PHYS, NULL, 0, VM_PROT_ALL, 0, NULL);
11087         VM_OBJECT_WLOCK(pti_obj);
11088         pml4_pg = pmap_pti_alloc_page();
11089         pti_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4_pg));
11090         for (va = VM_MIN_KERNEL_ADDRESS; va <= VM_MAX_KERNEL_ADDRESS &&
11091             va >= VM_MIN_KERNEL_ADDRESS && va > NBPML4; va += NBPML4) {
11092                 pdpe = pmap_pti_pdpe(va);
11093                 pmap_pti_wire_pte(pdpe);
11094         }
11095         pmap_pti_add_kva_locked((vm_offset_t)&__pcpu[0],
11096             (vm_offset_t)&__pcpu[0] + sizeof(__pcpu[0]) * MAXCPU, false);
11097         pmap_pti_add_kva_locked((vm_offset_t)idt, (vm_offset_t)idt +
11098             sizeof(struct gate_descriptor) * NIDT, false);
11099         CPU_FOREACH(i) {
11100                 /* Doublefault stack IST 1 */
11101                 va = __pcpu[i].pc_common_tss.tss_ist1 + sizeof(struct nmi_pcpu);
11102                 pmap_pti_add_kva_locked(va - DBLFAULT_STACK_SIZE, va, false);
11103                 /* NMI stack IST 2 */
11104                 va = __pcpu[i].pc_common_tss.tss_ist2 + sizeof(struct nmi_pcpu);
11105                 pmap_pti_add_kva_locked(va - NMI_STACK_SIZE, va, false);
11106                 /* MC# stack IST 3 */
11107                 va = __pcpu[i].pc_common_tss.tss_ist3 +
11108                     sizeof(struct nmi_pcpu);
11109                 pmap_pti_add_kva_locked(va - MCE_STACK_SIZE, va, false);
11110                 /* DB# stack IST 4 */
11111                 va = __pcpu[i].pc_common_tss.tss_ist4 + sizeof(struct nmi_pcpu);
11112                 pmap_pti_add_kva_locked(va - DBG_STACK_SIZE, va, false);
11113         }
11114         pmap_pti_add_kva_locked((vm_offset_t)KERNSTART, (vm_offset_t)etext,
11115             true);
11116         pti_finalized = true;
11117         VM_OBJECT_WUNLOCK(pti_obj);
11118 }
11119
11120 static void
11121 pmap_cpu_init(void *arg __unused)
11122 {
11123         CPU_COPY(&all_cpus, &kernel_pmap->pm_active);
11124         pmap_pti_init();
11125 }
11126 SYSINIT(pmap_cpu, SI_SUB_CPU + 1, SI_ORDER_ANY, pmap_cpu_init, NULL);
11127
11128 static pdp_entry_t *
11129 pmap_pti_pdpe(vm_offset_t va)
11130 {
11131         pml4_entry_t *pml4e;
11132         pdp_entry_t *pdpe;
11133         vm_page_t m;
11134         vm_pindex_t pml4_idx;
11135         vm_paddr_t mphys;
11136
11137         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11138
11139         pml4_idx = pmap_pml4e_index(va);
11140         pml4e = &pti_pml4[pml4_idx];
11141         m = NULL;
11142         if (*pml4e == 0) {
11143                 if (pti_finalized)
11144                         panic("pml4 alloc after finalization\n");
11145                 m = pmap_pti_alloc_page();
11146                 if (*pml4e != 0) {
11147                         pmap_pti_free_page(m);
11148                         mphys = *pml4e & ~PAGE_MASK;
11149                 } else {
11150                         mphys = VM_PAGE_TO_PHYS(m);
11151                         *pml4e = mphys | X86_PG_RW | X86_PG_V;
11152                 }
11153         } else {
11154                 mphys = *pml4e & ~PAGE_MASK;
11155         }
11156         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pdpe_index(va);
11157         return (pdpe);
11158 }
11159
11160 static void
11161 pmap_pti_wire_pte(void *pte)
11162 {
11163         vm_page_t m;
11164
11165         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11166         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte));
11167         m->ref_count++;
11168 }
11169
11170 static void
11171 pmap_pti_unwire_pde(void *pde, bool only_ref)
11172 {
11173         vm_page_t m;
11174
11175         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11176         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde));
11177         MPASS(only_ref || m->ref_count > 1);
11178         pmap_pti_free_page(m);
11179 }
11180
11181 static void
11182 pmap_pti_unwire_pte(void *pte, vm_offset_t va)
11183 {
11184         vm_page_t m;
11185         pd_entry_t *pde;
11186
11187         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11188         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte));
11189         if (pmap_pti_free_page(m)) {
11190                 pde = pmap_pti_pde(va);
11191                 MPASS((*pde & (X86_PG_PS | X86_PG_V)) == X86_PG_V);
11192                 *pde = 0;
11193                 pmap_pti_unwire_pde(pde, false);
11194         }
11195 }
11196
11197 static pd_entry_t *
11198 pmap_pti_pde(vm_offset_t va)
11199 {
11200         pdp_entry_t *pdpe;
11201         pd_entry_t *pde;
11202         vm_page_t m;
11203         vm_pindex_t pd_idx;
11204         vm_paddr_t mphys;
11205
11206         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11207
11208         pdpe = pmap_pti_pdpe(va);
11209         if (*pdpe == 0) {
11210                 m = pmap_pti_alloc_page();
11211                 if (*pdpe != 0) {
11212                         pmap_pti_free_page(m);
11213                         MPASS((*pdpe & X86_PG_PS) == 0);
11214                         mphys = *pdpe & ~PAGE_MASK;
11215                 } else {
11216                         mphys =  VM_PAGE_TO_PHYS(m);
11217                         *pdpe = mphys | X86_PG_RW | X86_PG_V;
11218                 }
11219         } else {
11220                 MPASS((*pdpe & X86_PG_PS) == 0);
11221                 mphys = *pdpe & ~PAGE_MASK;
11222         }
11223
11224         pde = (pd_entry_t *)PHYS_TO_DMAP(mphys);
11225         pd_idx = pmap_pde_index(va);
11226         pde += pd_idx;
11227         return (pde);
11228 }
11229
11230 static pt_entry_t *
11231 pmap_pti_pte(vm_offset_t va, bool *unwire_pde)
11232 {
11233         pd_entry_t *pde;
11234         pt_entry_t *pte;
11235         vm_page_t m;
11236         vm_paddr_t mphys;
11237
11238         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11239
11240         pde = pmap_pti_pde(va);
11241         if (unwire_pde != NULL) {
11242                 *unwire_pde = true;
11243                 pmap_pti_wire_pte(pde);
11244         }
11245         if (*pde == 0) {
11246                 m = pmap_pti_alloc_page();
11247                 if (*pde != 0) {
11248                         pmap_pti_free_page(m);
11249                         MPASS((*pde & X86_PG_PS) == 0);
11250                         mphys = *pde & ~(PAGE_MASK | pg_nx);
11251                 } else {
11252                         mphys = VM_PAGE_TO_PHYS(m);
11253                         *pde = mphys | X86_PG_RW | X86_PG_V;
11254                         if (unwire_pde != NULL)
11255                                 *unwire_pde = false;
11256                 }
11257         } else {
11258                 MPASS((*pde & X86_PG_PS) == 0);
11259                 mphys = *pde & ~(PAGE_MASK | pg_nx);
11260         }
11261
11262         pte = (pt_entry_t *)PHYS_TO_DMAP(mphys);
11263         pte += pmap_pte_index(va);
11264
11265         return (pte);
11266 }
11267
11268 static void
11269 pmap_pti_add_kva_locked(vm_offset_t sva, vm_offset_t eva, bool exec)
11270 {
11271         vm_paddr_t pa;
11272         pd_entry_t *pde;
11273         pt_entry_t *pte, ptev;
11274         bool unwire_pde;
11275
11276         VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11277
11278         sva = trunc_page(sva);
11279         MPASS(sva > VM_MAXUSER_ADDRESS);
11280         eva = round_page(eva);
11281         MPASS(sva < eva);
11282         for (; sva < eva; sva += PAGE_SIZE) {
11283                 pte = pmap_pti_pte(sva, &unwire_pde);
11284                 pa = pmap_kextract(sva);
11285                 ptev = pa | X86_PG_RW | X86_PG_V | X86_PG_A | X86_PG_G |
11286                     (exec ? 0 : pg_nx) | pmap_cache_bits(kernel_pmap,
11287                     VM_MEMATTR_DEFAULT, FALSE);
11288                 if (*pte == 0) {
11289                         pte_store(pte, ptev);
11290                         pmap_pti_wire_pte(pte);
11291                 } else {
11292                         KASSERT(!pti_finalized,
11293                             ("pti overlap after fin %#lx %#lx %#lx",
11294                             sva, *pte, ptev));
11295                         KASSERT(*pte == ptev,
11296                             ("pti non-identical pte after fin %#lx %#lx %#lx",
11297                             sva, *pte, ptev));
11298                 }
11299                 if (unwire_pde) {
11300                         pde = pmap_pti_pde(sva);
11301                         pmap_pti_unwire_pde(pde, true);
11302                 }
11303         }
11304 }
11305
11306 void
11307 pmap_pti_add_kva(vm_offset_t sva, vm_offset_t eva, bool exec)
11308 {
11309
11310         if (!pti)
11311                 return;
11312         VM_OBJECT_WLOCK(pti_obj);
11313         pmap_pti_add_kva_locked(sva, eva, exec);
11314         VM_OBJECT_WUNLOCK(pti_obj);
11315 }
11316
11317 void
11318 pmap_pti_remove_kva(vm_offset_t sva, vm_offset_t eva)
11319 {
11320         pt_entry_t *pte;
11321         vm_offset_t va;
11322
11323         if (!pti)
11324                 return;
11325         sva = rounddown2(sva, PAGE_SIZE);
11326         MPASS(sva > VM_MAXUSER_ADDRESS);
11327         eva = roundup2(eva, PAGE_SIZE);
11328         MPASS(sva < eva);
11329         VM_OBJECT_WLOCK(pti_obj);
11330         for (va = sva; va < eva; va += PAGE_SIZE) {
11331                 pte = pmap_pti_pte(va, NULL);
11332                 KASSERT((*pte & X86_PG_V) != 0,
11333                     ("invalid pte va %#lx pte %#lx pt %#lx", va,
11334                     (u_long)pte, *pte));
11335                 pte_clear(pte);
11336                 pmap_pti_unwire_pte(pte, va);
11337         }
11338         pmap_invalidate_range(kernel_pmap, sva, eva);
11339         VM_OBJECT_WUNLOCK(pti_obj);
11340 }
11341
11342 static void *
11343 pkru_dup_range(void *ctx __unused, void *data)
11344 {
11345         struct pmap_pkru_range *node, *new_node;
11346
11347         new_node = uma_zalloc(pmap_pkru_ranges_zone, M_NOWAIT);
11348         if (new_node == NULL)
11349                 return (NULL);
11350         node = data;
11351         memcpy(new_node, node, sizeof(*node));
11352         return (new_node);
11353 }
11354
11355 static void
11356 pkru_free_range(void *ctx __unused, void *node)
11357 {
11358
11359         uma_zfree(pmap_pkru_ranges_zone, node);
11360 }
11361
11362 static int
11363 pmap_pkru_assign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, u_int keyidx,
11364     int flags)
11365 {
11366         struct pmap_pkru_range *ppr;
11367         int error;
11368
11369         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11370         MPASS(pmap->pm_type == PT_X86);
11371         MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0);
11372         if ((flags & AMD64_PKRU_EXCL) != 0 &&
11373             !rangeset_check_empty(&pmap->pm_pkru, sva, eva))
11374                 return (EBUSY);
11375         ppr = uma_zalloc(pmap_pkru_ranges_zone, M_NOWAIT);
11376         if (ppr == NULL)
11377                 return (ENOMEM);
11378         ppr->pkru_keyidx = keyidx;
11379         ppr->pkru_flags = flags & AMD64_PKRU_PERSIST;
11380         error = rangeset_insert(&pmap->pm_pkru, sva, eva, ppr);
11381         if (error != 0)
11382                 uma_zfree(pmap_pkru_ranges_zone, ppr);
11383         return (error);
11384 }
11385
11386 static int
11387 pmap_pkru_deassign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11388 {
11389
11390         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11391         MPASS(pmap->pm_type == PT_X86);
11392         MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0);
11393         return (rangeset_remove(&pmap->pm_pkru, sva, eva));
11394 }
11395
11396 static void
11397 pmap_pkru_deassign_all(pmap_t pmap)
11398 {
11399
11400         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11401         if (pmap->pm_type == PT_X86 &&
11402             (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0)
11403                 rangeset_remove_all(&pmap->pm_pkru);
11404 }
11405
11406 static bool
11407 pmap_pkru_same(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11408 {
11409         struct pmap_pkru_range *ppr, *prev_ppr;
11410         vm_offset_t va;
11411
11412         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11413         if (pmap->pm_type != PT_X86 ||
11414             (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0 ||
11415             sva >= VM_MAXUSER_ADDRESS)
11416                 return (true);
11417         MPASS(eva <= VM_MAXUSER_ADDRESS);
11418         for (va = sva; va < eva; prev_ppr = ppr) {
11419                 ppr = rangeset_lookup(&pmap->pm_pkru, va);
11420                 if (va == sva)
11421                         prev_ppr = ppr;
11422                 else if ((ppr == NULL) ^ (prev_ppr == NULL))
11423                         return (false);
11424                 if (ppr == NULL) {
11425                         va += PAGE_SIZE;
11426                         continue;
11427                 }
11428                 if (prev_ppr->pkru_keyidx != ppr->pkru_keyidx)
11429                         return (false);
11430                 va = ppr->pkru_rs_el.re_end;
11431         }
11432         return (true);
11433 }
11434
11435 static pt_entry_t
11436 pmap_pkru_get(pmap_t pmap, vm_offset_t va)
11437 {
11438         struct pmap_pkru_range *ppr;
11439
11440         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11441         if (pmap->pm_type != PT_X86 ||
11442             (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0 ||
11443             va >= VM_MAXUSER_ADDRESS)
11444                 return (0);
11445         ppr = rangeset_lookup(&pmap->pm_pkru, va);
11446         if (ppr != NULL)
11447                 return (X86_PG_PKU(ppr->pkru_keyidx));
11448         return (0);
11449 }
11450
11451 static bool
11452 pred_pkru_on_remove(void *ctx __unused, void *r)
11453 {
11454         struct pmap_pkru_range *ppr;
11455
11456         ppr = r;
11457         return ((ppr->pkru_flags & AMD64_PKRU_PERSIST) == 0);
11458 }
11459
11460 static void
11461 pmap_pkru_on_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11462 {
11463
11464         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11465         if (pmap->pm_type == PT_X86 &&
11466             (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
11467                 rangeset_remove_pred(&pmap->pm_pkru, sva, eva,
11468                     pred_pkru_on_remove);
11469         }
11470 }
11471
11472 static int
11473 pmap_pkru_copy(pmap_t dst_pmap, pmap_t src_pmap)
11474 {
11475
11476         PMAP_LOCK_ASSERT(dst_pmap, MA_OWNED);
11477         PMAP_LOCK_ASSERT(src_pmap, MA_OWNED);
11478         MPASS(dst_pmap->pm_type == PT_X86);
11479         MPASS(src_pmap->pm_type == PT_X86);
11480         MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0);
11481         if (src_pmap->pm_pkru.rs_data_ctx == NULL)
11482                 return (0);
11483         return (rangeset_copy(&dst_pmap->pm_pkru, &src_pmap->pm_pkru));
11484 }
11485
11486 static void
11487 pmap_pkru_update_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
11488     u_int keyidx)
11489 {
11490         pml4_entry_t *pml4e;
11491         pdp_entry_t *pdpe;
11492         pd_entry_t newpde, ptpaddr, *pde;
11493         pt_entry_t newpte, *ptep, pte;
11494         vm_offset_t va, va_next;
11495         bool changed;
11496
11497         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11498         MPASS(pmap->pm_type == PT_X86);
11499         MPASS(keyidx <= PMAP_MAX_PKRU_IDX);
11500
11501         for (changed = false, va = sva; va < eva; va = va_next) {
11502                 pml4e = pmap_pml4e(pmap, va);
11503                 if (pml4e == NULL || (*pml4e & X86_PG_V) == 0) {
11504                         va_next = (va + NBPML4) & ~PML4MASK;
11505                         if (va_next < va)
11506                                 va_next = eva;
11507                         continue;
11508                 }
11509
11510                 pdpe = pmap_pml4e_to_pdpe(pml4e, va);
11511                 if ((*pdpe & X86_PG_V) == 0) {
11512                         va_next = (va + NBPDP) & ~PDPMASK;
11513                         if (va_next < va)
11514                                 va_next = eva;
11515                         continue;
11516                 }
11517
11518                 va_next = (va + NBPDR) & ~PDRMASK;
11519                 if (va_next < va)
11520                         va_next = eva;
11521
11522                 pde = pmap_pdpe_to_pde(pdpe, va);
11523                 ptpaddr = *pde;
11524                 if (ptpaddr == 0)
11525                         continue;
11526
11527                 MPASS((ptpaddr & X86_PG_V) != 0);
11528                 if ((ptpaddr & PG_PS) != 0) {
11529                         if (va + NBPDR == va_next && eva >= va_next) {
11530                                 newpde = (ptpaddr & ~X86_PG_PKU_MASK) |
11531                                     X86_PG_PKU(keyidx);
11532                                 if (newpde != ptpaddr) {
11533                                         *pde = newpde;
11534                                         changed = true;
11535                                 }
11536                                 continue;
11537                         } else if (!pmap_demote_pde(pmap, pde, va)) {
11538                                 continue;
11539                         }
11540                 }
11541
11542                 if (va_next > eva)
11543                         va_next = eva;
11544
11545                 for (ptep = pmap_pde_to_pte(pde, va); va != va_next;
11546                     ptep++, va += PAGE_SIZE) {
11547                         pte = *ptep;
11548                         if ((pte & X86_PG_V) == 0)
11549                                 continue;
11550                         newpte = (pte & ~X86_PG_PKU_MASK) | X86_PG_PKU(keyidx);
11551                         if (newpte != pte) {
11552                                 *ptep = newpte;
11553                                 changed = true;
11554                         }
11555                 }
11556         }
11557         if (changed)
11558                 pmap_invalidate_range(pmap, sva, eva);
11559 }
11560
11561 static int
11562 pmap_pkru_check_uargs(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
11563     u_int keyidx, int flags)
11564 {
11565
11566         if (pmap->pm_type != PT_X86 || keyidx > PMAP_MAX_PKRU_IDX ||
11567             (flags & ~(AMD64_PKRU_PERSIST | AMD64_PKRU_EXCL)) != 0)
11568                 return (EINVAL);
11569         if (eva <= sva || eva > VM_MAXUSER_ADDRESS)
11570                 return (EFAULT);
11571         if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0)
11572                 return (ENOTSUP);
11573         return (0);
11574 }
11575
11576 int
11577 pmap_pkru_set(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, u_int keyidx,
11578     int flags)
11579 {
11580         int error;
11581
11582         sva = trunc_page(sva);
11583         eva = round_page(eva);
11584         error = pmap_pkru_check_uargs(pmap, sva, eva, keyidx, flags);
11585         if (error != 0)
11586                 return (error);
11587         for (;;) {
11588                 PMAP_LOCK(pmap);
11589                 error = pmap_pkru_assign(pmap, sva, eva, keyidx, flags);
11590                 if (error == 0)
11591                         pmap_pkru_update_range(pmap, sva, eva, keyidx);
11592                 PMAP_UNLOCK(pmap);
11593                 if (error != ENOMEM)
11594                         break;
11595                 vm_wait(NULL);
11596         }
11597         return (error);
11598 }
11599
11600 int
11601 pmap_pkru_clear(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11602 {
11603         int error;
11604
11605         sva = trunc_page(sva);
11606         eva = round_page(eva);
11607         error = pmap_pkru_check_uargs(pmap, sva, eva, 0, 0);
11608         if (error != 0)
11609                 return (error);
11610         for (;;) {
11611                 PMAP_LOCK(pmap);
11612                 error = pmap_pkru_deassign(pmap, sva, eva);
11613                 if (error == 0)
11614                         pmap_pkru_update_range(pmap, sva, eva, 0);
11615                 PMAP_UNLOCK(pmap);
11616                 if (error != ENOMEM)
11617                         break;
11618                 vm_wait(NULL);
11619         }
11620         return (error);
11621 }
11622
11623 #if defined(KASAN) || defined(KMSAN)
11624
11625 /*
11626  * Reserve enough memory to:
11627  * 1) allocate PDP pages for the shadow map(s),
11628  * 2) shadow one page of memory, so one PD page, one PT page, and one shadow
11629  *    page per shadow map.
11630  */
11631 #ifdef KASAN
11632 #define SAN_EARLY_PAGES (NKASANPML4E + 3)
11633 #else
11634 #define SAN_EARLY_PAGES (NKMSANSHADPML4E + NKMSANORIGPML4E + 2 * 3)
11635 #endif
11636
11637 static uint64_t __nosanitizeaddress __nosanitizememory
11638 pmap_san_enter_early_alloc_4k(uint64_t pabase)
11639 {
11640         static uint8_t data[PAGE_SIZE * SAN_EARLY_PAGES] __aligned(PAGE_SIZE);
11641         static size_t offset = 0;
11642         uint64_t pa;
11643
11644         if (offset == sizeof(data)) {
11645                 panic("%s: ran out of memory for the bootstrap shadow map",
11646                     __func__);
11647         }
11648
11649         pa = pabase + ((vm_offset_t)&data[offset] - KERNSTART);
11650         offset += PAGE_SIZE;
11651         return (pa);
11652 }
11653
11654 /*
11655  * Map a shadow page, before the kernel has bootstrapped its page tables.  This
11656  * is currently only used to shadow the temporary boot stack set up by locore.
11657  */
11658 static void __nosanitizeaddress __nosanitizememory
11659 pmap_san_enter_early(vm_offset_t va)
11660 {
11661         static bool first = true;
11662         pml4_entry_t *pml4e;
11663         pdp_entry_t *pdpe;
11664         pd_entry_t *pde;
11665         pt_entry_t *pte;
11666         uint64_t cr3, pa, base;
11667         int i;
11668
11669         base = amd64_loadaddr();
11670         cr3 = rcr3();
11671
11672         if (first) {
11673                 /*
11674                  * If this the first call, we need to allocate new PML4Es for
11675                  * the bootstrap shadow map(s).  We don't know how the PML4 page
11676                  * was initialized by the boot loader, so we can't simply test
11677                  * whether the shadow map's PML4Es are zero.
11678                  */
11679                 first = false;
11680 #ifdef KASAN
11681                 for (i = 0; i < NKASANPML4E; i++) {
11682                         pa = pmap_san_enter_early_alloc_4k(base);
11683
11684                         pml4e = (pml4_entry_t *)cr3 +
11685                             pmap_pml4e_index(KASAN_MIN_ADDRESS + i * NBPML4);
11686                         *pml4e = (pml4_entry_t)(pa | X86_PG_RW | X86_PG_V);
11687                 }
11688 #else
11689                 for (i = 0; i < NKMSANORIGPML4E; i++) {
11690                         pa = pmap_san_enter_early_alloc_4k(base);
11691
11692                         pml4e = (pml4_entry_t *)cr3 +
11693                             pmap_pml4e_index(KMSAN_ORIG_MIN_ADDRESS +
11694                             i * NBPML4);
11695                         *pml4e = (pml4_entry_t)(pa | X86_PG_RW | X86_PG_V);
11696                 }
11697                 for (i = 0; i < NKMSANSHADPML4E; i++) {
11698                         pa = pmap_san_enter_early_alloc_4k(base);
11699
11700                         pml4e = (pml4_entry_t *)cr3 +
11701                             pmap_pml4e_index(KMSAN_SHAD_MIN_ADDRESS +
11702                             i * NBPML4);
11703                         *pml4e = (pml4_entry_t)(pa | X86_PG_RW | X86_PG_V);
11704                 }
11705 #endif
11706         }
11707         pml4e = (pml4_entry_t *)cr3 + pmap_pml4e_index(va);
11708         pdpe = (pdp_entry_t *)(*pml4e & PG_FRAME) + pmap_pdpe_index(va);
11709         if (*pdpe == 0) {
11710                 pa = pmap_san_enter_early_alloc_4k(base);
11711                 *pdpe = (pdp_entry_t)(pa | X86_PG_RW | X86_PG_V);
11712         }
11713         pde = (pd_entry_t *)(*pdpe & PG_FRAME) + pmap_pde_index(va);
11714         if (*pde == 0) {
11715                 pa = pmap_san_enter_early_alloc_4k(base);
11716                 *pde = (pd_entry_t)(pa | X86_PG_RW | X86_PG_V);
11717         }
11718         pte = (pt_entry_t *)(*pde & PG_FRAME) + pmap_pte_index(va);
11719         if (*pte != 0)
11720                 panic("%s: PTE for %#lx is already initialized", __func__, va);
11721         pa = pmap_san_enter_early_alloc_4k(base);
11722         *pte = (pt_entry_t)(pa | X86_PG_A | X86_PG_M | X86_PG_RW | X86_PG_V);
11723 }
11724
11725 static vm_page_t
11726 pmap_san_enter_alloc_4k(void)
11727 {
11728         vm_page_t m;
11729
11730         m = vm_page_alloc_noobj(VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED |
11731             VM_ALLOC_ZERO);
11732         if (m == NULL)
11733                 panic("%s: no memory to grow shadow map", __func__);
11734         return (m);
11735 }
11736
11737 static vm_page_t
11738 pmap_san_enter_alloc_2m(void)
11739 {
11740         return (vm_page_alloc_noobj_contig(VM_ALLOC_WIRED | VM_ALLOC_ZERO,
11741             NPTEPG, 0, ~0ul, NBPDR, 0, VM_MEMATTR_DEFAULT));
11742 }
11743
11744 /*
11745  * Grow a shadow map by at least one 4KB page at the specified address.  Use 2MB
11746  * pages when possible.
11747  */
11748 void __nosanitizeaddress __nosanitizememory
11749 pmap_san_enter(vm_offset_t va)
11750 {
11751         pdp_entry_t *pdpe;
11752         pd_entry_t *pde;
11753         pt_entry_t *pte;
11754         vm_page_t m;
11755
11756         if (kernphys == 0) {
11757                 /*
11758                  * We're creating a temporary shadow map for the boot stack.
11759                  */
11760                 pmap_san_enter_early(va);
11761                 return;
11762         }
11763
11764         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
11765
11766         pdpe = pmap_pdpe(kernel_pmap, va);
11767         if ((*pdpe & X86_PG_V) == 0) {
11768                 m = pmap_san_enter_alloc_4k();
11769                 *pdpe = (pdp_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW |
11770                     X86_PG_V | pg_nx);
11771         }
11772         pde = pmap_pdpe_to_pde(pdpe, va);
11773         if ((*pde & X86_PG_V) == 0) {
11774                 m = pmap_san_enter_alloc_2m();
11775                 if (m != NULL) {
11776                         *pde = (pd_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW |
11777                             X86_PG_PS | X86_PG_V | X86_PG_A | X86_PG_M | pg_nx);
11778                 } else {
11779                         m = pmap_san_enter_alloc_4k();
11780                         *pde = (pd_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW |
11781                             X86_PG_V | pg_nx);
11782                 }
11783         }
11784         if ((*pde & X86_PG_PS) != 0)
11785                 return;
11786         pte = pmap_pde_to_pte(pde, va);
11787         if ((*pte & X86_PG_V) != 0)
11788                 return;
11789         m = pmap_san_enter_alloc_4k();
11790         *pte = (pt_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW | X86_PG_V |
11791             X86_PG_M | X86_PG_A | pg_nx);
11792 }
11793 #endif
11794
11795 /*
11796  * Track a range of the kernel's virtual address space that is contiguous
11797  * in various mapping attributes.
11798  */
11799 struct pmap_kernel_map_range {
11800         vm_offset_t sva;
11801         pt_entry_t attrs;
11802         int ptes;
11803         int pdes;
11804         int pdpes;
11805 };
11806
11807 static void
11808 sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_map_range *range,
11809     vm_offset_t eva)
11810 {
11811         const char *mode;
11812         int i, pat_idx;
11813
11814         if (eva <= range->sva)
11815                 return;
11816
11817         pat_idx = pmap_pat_index(kernel_pmap, range->attrs, true);
11818         for (i = 0; i < PAT_INDEX_SIZE; i++)
11819                 if (pat_index[i] == pat_idx)
11820                         break;
11821
11822         switch (i) {
11823         case PAT_WRITE_BACK:
11824                 mode = "WB";
11825                 break;
11826         case PAT_WRITE_THROUGH:
11827                 mode = "WT";
11828                 break;
11829         case PAT_UNCACHEABLE:
11830                 mode = "UC";
11831                 break;
11832         case PAT_UNCACHED:
11833                 mode = "U-";
11834                 break;
11835         case PAT_WRITE_PROTECTED:
11836                 mode = "WP";
11837                 break;
11838         case PAT_WRITE_COMBINING:
11839                 mode = "WC";
11840                 break;
11841         default:
11842                 printf("%s: unknown PAT mode %#x for range 0x%016lx-0x%016lx\n",
11843                     __func__, pat_idx, range->sva, eva);
11844                 mode = "??";
11845                 break;
11846         }
11847
11848         sbuf_printf(sb, "0x%016lx-0x%016lx r%c%c%c%c %s %d %d %d\n",
11849             range->sva, eva,
11850             (range->attrs & X86_PG_RW) != 0 ? 'w' : '-',
11851             (range->attrs & pg_nx) != 0 ? '-' : 'x',
11852             (range->attrs & X86_PG_U) != 0 ? 'u' : 's',
11853             (range->attrs & X86_PG_G) != 0 ? 'g' : '-',
11854             mode, range->pdpes, range->pdes, range->ptes);
11855
11856         /* Reset to sentinel value. */
11857         range->sva = la57 ? KV5ADDR(NPML5EPG - 1, NPML4EPG - 1, NPDPEPG - 1,
11858             NPDEPG - 1, NPTEPG - 1) : KV4ADDR(NPML4EPG - 1, NPDPEPG - 1,
11859             NPDEPG - 1, NPTEPG - 1);
11860 }
11861
11862 /*
11863  * Determine whether the attributes specified by a page table entry match those
11864  * being tracked by the current range.  This is not quite as simple as a direct
11865  * flag comparison since some PAT modes have multiple representations.
11866  */
11867 static bool
11868 sysctl_kmaps_match(struct pmap_kernel_map_range *range, pt_entry_t attrs)
11869 {
11870         pt_entry_t diff, mask;
11871
11872         mask = X86_PG_G | X86_PG_RW | X86_PG_U | X86_PG_PDE_CACHE | pg_nx;
11873         diff = (range->attrs ^ attrs) & mask;
11874         if (diff == 0)
11875                 return (true);
11876         if ((diff & ~X86_PG_PDE_PAT) == 0 &&
11877             pmap_pat_index(kernel_pmap, range->attrs, true) ==
11878             pmap_pat_index(kernel_pmap, attrs, true))
11879                 return (true);
11880         return (false);
11881 }
11882
11883 static void
11884 sysctl_kmaps_reinit(struct pmap_kernel_map_range *range, vm_offset_t va,
11885     pt_entry_t attrs)
11886 {
11887
11888         memset(range, 0, sizeof(*range));
11889         range->sva = va;
11890         range->attrs = attrs;
11891 }
11892
11893 /*
11894  * Given a leaf PTE, derive the mapping's attributes.  If they do not match
11895  * those of the current run, dump the address range and its attributes, and
11896  * begin a new run.
11897  */
11898 static void
11899 sysctl_kmaps_check(struct sbuf *sb, struct pmap_kernel_map_range *range,
11900     vm_offset_t va, pml4_entry_t pml4e, pdp_entry_t pdpe, pd_entry_t pde,
11901     pt_entry_t pte)
11902 {
11903         pt_entry_t attrs;
11904
11905         attrs = pml4e & (X86_PG_RW | X86_PG_U | pg_nx);
11906
11907         attrs |= pdpe & pg_nx;
11908         attrs &= pg_nx | (pdpe & (X86_PG_RW | X86_PG_U));
11909         if ((pdpe & PG_PS) != 0) {
11910                 attrs |= pdpe & (X86_PG_G | X86_PG_PDE_CACHE);
11911         } else if (pde != 0) {
11912                 attrs |= pde & pg_nx;
11913                 attrs &= pg_nx | (pde & (X86_PG_RW | X86_PG_U));
11914         }
11915         if ((pde & PG_PS) != 0) {
11916                 attrs |= pde & (X86_PG_G | X86_PG_PDE_CACHE);
11917         } else if (pte != 0) {
11918                 attrs |= pte & pg_nx;
11919                 attrs &= pg_nx | (pte & (X86_PG_RW | X86_PG_U));
11920                 attrs |= pte & (X86_PG_G | X86_PG_PTE_CACHE);
11921
11922                 /* Canonicalize by always using the PDE PAT bit. */
11923                 if ((attrs & X86_PG_PTE_PAT) != 0)
11924                         attrs ^= X86_PG_PDE_PAT | X86_PG_PTE_PAT;
11925         }
11926
11927         if (range->sva > va || !sysctl_kmaps_match(range, attrs)) {
11928                 sysctl_kmaps_dump(sb, range, va);
11929                 sysctl_kmaps_reinit(range, va, attrs);
11930         }
11931 }
11932
11933 static int
11934 sysctl_kmaps(SYSCTL_HANDLER_ARGS)
11935 {
11936         struct pmap_kernel_map_range range;
11937         struct sbuf sbuf, *sb;
11938         pml4_entry_t pml4e;
11939         pdp_entry_t *pdp, pdpe;
11940         pd_entry_t *pd, pde;
11941         pt_entry_t *pt, pte;
11942         vm_offset_t sva;
11943         vm_paddr_t pa;
11944         int error, i, j, k, l;
11945
11946         error = sysctl_wire_old_buffer(req, 0);
11947         if (error != 0)
11948                 return (error);
11949         sb = &sbuf;
11950         sbuf_new_for_sysctl(sb, NULL, PAGE_SIZE, req);
11951
11952         /* Sentinel value. */
11953         range.sva = la57 ? KV5ADDR(NPML5EPG - 1, NPML4EPG - 1, NPDPEPG - 1,
11954             NPDEPG - 1, NPTEPG - 1) : KV4ADDR(NPML4EPG - 1, NPDPEPG - 1,
11955             NPDEPG - 1, NPTEPG - 1);
11956
11957         /*
11958          * Iterate over the kernel page tables without holding the kernel pmap
11959          * lock.  Outside of the large map, kernel page table pages are never
11960          * freed, so at worst we will observe inconsistencies in the output.
11961          * Within the large map, ensure that PDP and PD page addresses are
11962          * valid before descending.
11963          */
11964         for (sva = 0, i = pmap_pml4e_index(sva); i < NPML4EPG; i++) {
11965                 switch (i) {
11966                 case PML4PML4I:
11967                         sbuf_printf(sb, "\nRecursive map:\n");
11968                         break;
11969                 case DMPML4I:
11970                         sbuf_printf(sb, "\nDirect map:\n");
11971                         break;
11972 #ifdef KASAN
11973                 case KASANPML4I:
11974                         sbuf_printf(sb, "\nKASAN shadow map:\n");
11975                         break;
11976 #endif
11977 #ifdef KMSAN
11978                 case KMSANSHADPML4I:
11979                         sbuf_printf(sb, "\nKMSAN shadow map:\n");
11980                         break;
11981                 case KMSANORIGPML4I:
11982                         sbuf_printf(sb, "\nKMSAN origin map:\n");
11983                         break;
11984 #endif
11985                 case KPML4BASE:
11986                         sbuf_printf(sb, "\nKernel map:\n");
11987                         break;
11988                 case LMSPML4I:
11989                         sbuf_printf(sb, "\nLarge map:\n");
11990                         break;
11991                 }
11992
11993                 /* Convert to canonical form. */
11994                 if (sva == 1ul << 47)
11995                         sva |= -1ul << 48;
11996
11997 restart:
11998                 pml4e = kernel_pml4[i];
11999                 if ((pml4e & X86_PG_V) == 0) {
12000                         sva = rounddown2(sva, NBPML4);
12001                         sysctl_kmaps_dump(sb, &range, sva);
12002                         sva += NBPML4;
12003                         continue;
12004                 }
12005                 pa = pml4e & PG_FRAME;
12006                 pdp = (pdp_entry_t *)PHYS_TO_DMAP(pa);
12007
12008                 for (j = pmap_pdpe_index(sva); j < NPDPEPG; j++) {
12009                         pdpe = pdp[j];
12010                         if ((pdpe & X86_PG_V) == 0) {
12011                                 sva = rounddown2(sva, NBPDP);
12012                                 sysctl_kmaps_dump(sb, &range, sva);
12013                                 sva += NBPDP;
12014                                 continue;
12015                         }
12016                         pa = pdpe & PG_FRAME;
12017                         if ((pdpe & PG_PS) != 0) {
12018                                 sva = rounddown2(sva, NBPDP);
12019                                 sysctl_kmaps_check(sb, &range, sva, pml4e, pdpe,
12020                                     0, 0);
12021                                 range.pdpes++;
12022                                 sva += NBPDP;
12023                                 continue;
12024                         }
12025                         if (PMAP_ADDRESS_IN_LARGEMAP(sva) &&
12026                             vm_phys_paddr_to_vm_page(pa) == NULL) {
12027                                 /*
12028                                  * Page table pages for the large map may be
12029                                  * freed.  Validate the next-level address
12030                                  * before descending.
12031                                  */
12032                                 goto restart;
12033                         }
12034                         pd = (pd_entry_t *)PHYS_TO_DMAP(pa);
12035
12036                         for (k = pmap_pde_index(sva); k < NPDEPG; k++) {
12037                                 pde = pd[k];
12038                                 if ((pde & X86_PG_V) == 0) {
12039                                         sva = rounddown2(sva, NBPDR);
12040                                         sysctl_kmaps_dump(sb, &range, sva);
12041                                         sva += NBPDR;
12042                                         continue;
12043                                 }
12044                                 pa = pde & PG_FRAME;
12045                                 if ((pde & PG_PS) != 0) {
12046                                         sva = rounddown2(sva, NBPDR);
12047                                         sysctl_kmaps_check(sb, &range, sva,
12048                                             pml4e, pdpe, pde, 0);
12049                                         range.pdes++;
12050                                         sva += NBPDR;
12051                                         continue;
12052                                 }
12053                                 if (PMAP_ADDRESS_IN_LARGEMAP(sva) &&
12054                                     vm_phys_paddr_to_vm_page(pa) == NULL) {
12055                                         /*
12056                                          * Page table pages for the large map
12057                                          * may be freed.  Validate the
12058                                          * next-level address before descending.
12059                                          */
12060                                         goto restart;
12061                                 }
12062                                 pt = (pt_entry_t *)PHYS_TO_DMAP(pa);
12063
12064                                 for (l = pmap_pte_index(sva); l < NPTEPG; l++,
12065                                     sva += PAGE_SIZE) {
12066                                         pte = pt[l];
12067                                         if ((pte & X86_PG_V) == 0) {
12068                                                 sysctl_kmaps_dump(sb, &range,
12069                                                     sva);
12070                                                 continue;
12071                                         }
12072                                         sysctl_kmaps_check(sb, &range, sva,
12073                                             pml4e, pdpe, pde, pte);
12074                                         range.ptes++;
12075                                 }
12076                         }
12077                 }
12078         }
12079
12080         error = sbuf_finish(sb);
12081         sbuf_delete(sb);
12082         return (error);
12083 }
12084 SYSCTL_OID(_vm_pmap, OID_AUTO, kernel_maps,
12085     CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_SKIP,
12086     NULL, 0, sysctl_kmaps, "A",
12087     "Dump kernel address layout");
12088
12089 #ifdef DDB
12090 DB_SHOW_COMMAND(pte, pmap_print_pte)
12091 {
12092         pmap_t pmap;
12093         pml5_entry_t *pml5;
12094         pml4_entry_t *pml4;
12095         pdp_entry_t *pdp;
12096         pd_entry_t *pde;
12097         pt_entry_t *pte, PG_V;
12098         vm_offset_t va;
12099
12100         if (!have_addr) {
12101                 db_printf("show pte addr\n");
12102                 return;
12103         }
12104         va = (vm_offset_t)addr;
12105
12106         if (kdb_thread != NULL)
12107                 pmap = vmspace_pmap(kdb_thread->td_proc->p_vmspace);
12108         else
12109                 pmap = PCPU_GET(curpmap);
12110
12111         PG_V = pmap_valid_bit(pmap);
12112         db_printf("VA 0x%016lx", va);
12113
12114         if (pmap_is_la57(pmap)) {
12115                 pml5 = pmap_pml5e(pmap, va);
12116                 db_printf(" pml5e 0x%016lx", *pml5);
12117                 if ((*pml5 & PG_V) == 0) {
12118                         db_printf("\n");
12119                         return;
12120                 }
12121                 pml4 = pmap_pml5e_to_pml4e(pml5, va);
12122         } else {
12123                 pml4 = pmap_pml4e(pmap, va);
12124         }
12125         db_printf(" pml4e 0x%016lx", *pml4);
12126         if ((*pml4 & PG_V) == 0) {
12127                 db_printf("\n");
12128                 return;
12129         }
12130         pdp = pmap_pml4e_to_pdpe(pml4, va);
12131         db_printf(" pdpe 0x%016lx", *pdp);
12132         if ((*pdp & PG_V) == 0 || (*pdp & PG_PS) != 0) {
12133                 db_printf("\n");
12134                 return;
12135         }
12136         pde = pmap_pdpe_to_pde(pdp, va);
12137         db_printf(" pde 0x%016lx", *pde);
12138         if ((*pde & PG_V) == 0 || (*pde & PG_PS) != 0) {
12139                 db_printf("\n");
12140                 return;
12141         }
12142         pte = pmap_pde_to_pte(pde, va);
12143         db_printf(" pte 0x%016lx\n", *pte);
12144 }
12145
12146 DB_SHOW_COMMAND(phys2dmap, pmap_phys2dmap)
12147 {
12148         vm_paddr_t a;
12149
12150         if (have_addr) {
12151                 a = (vm_paddr_t)addr;
12152                 db_printf("0x%jx\n", (uintmax_t)PHYS_TO_DMAP(a));
12153         } else {
12154                 db_printf("show phys2dmap addr\n");
12155         }
12156 }
12157
12158 static void
12159 ptpages_show_page(int level, int idx, vm_page_t pg)
12160 {
12161         db_printf("l %d i %d pg %p phys %#lx ref %x\n",
12162             level, idx, pg, VM_PAGE_TO_PHYS(pg), pg->ref_count);
12163 }
12164
12165 static void
12166 ptpages_show_complain(int level, int idx, uint64_t pte)
12167 {
12168         db_printf("l %d i %d pte %#lx\n", level, idx, pte);
12169 }
12170
12171 static void
12172 ptpages_show_pml4(vm_page_t pg4, int num_entries, uint64_t PG_V)
12173 {
12174         vm_page_t pg3, pg2, pg1;
12175         pml4_entry_t *pml4;
12176         pdp_entry_t *pdp;
12177         pd_entry_t *pd;
12178         int i4, i3, i2;
12179
12180         pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pg4));
12181         for (i4 = 0; i4 < num_entries; i4++) {
12182                 if ((pml4[i4] & PG_V) == 0)
12183                         continue;
12184                 pg3 = PHYS_TO_VM_PAGE(pml4[i4] & PG_FRAME);
12185                 if (pg3 == NULL) {
12186                         ptpages_show_complain(3, i4, pml4[i4]);
12187                         continue;
12188                 }
12189                 ptpages_show_page(3, i4, pg3);
12190                 pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pg3));
12191                 for (i3 = 0; i3 < NPDPEPG; i3++) {
12192                         if ((pdp[i3] & PG_V) == 0)
12193                                 continue;
12194                         pg2 = PHYS_TO_VM_PAGE(pdp[i3] & PG_FRAME);
12195                         if (pg3 == NULL) {
12196                                 ptpages_show_complain(2, i3, pdp[i3]);
12197                                 continue;
12198                         }
12199                         ptpages_show_page(2, i3, pg2);
12200                         pd = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pg2));
12201                         for (i2 = 0; i2 < NPDEPG; i2++) {
12202                                 if ((pd[i2] & PG_V) == 0)
12203                                         continue;
12204                                 pg1 = PHYS_TO_VM_PAGE(pd[i2] & PG_FRAME);
12205                                 if (pg1 == NULL) {
12206                                         ptpages_show_complain(1, i2, pd[i2]);
12207                                         continue;
12208                                 }
12209                                 ptpages_show_page(1, i2, pg1);
12210                         }
12211                 }
12212         }
12213 }
12214
12215 DB_SHOW_COMMAND(ptpages, pmap_ptpages)
12216 {
12217         pmap_t pmap;
12218         vm_page_t pg;
12219         pml5_entry_t *pml5;
12220         uint64_t PG_V;
12221         int i5;
12222
12223         if (have_addr)
12224                 pmap = (pmap_t)addr;
12225         else
12226                 pmap = PCPU_GET(curpmap);
12227
12228         PG_V = pmap_valid_bit(pmap);
12229
12230         if (pmap_is_la57(pmap)) {
12231                 pml5 = pmap->pm_pmltop;
12232                 for (i5 = 0; i5 < NUPML5E; i5++) {
12233                         if ((pml5[i5] & PG_V) == 0)
12234                                 continue;
12235                         pg = PHYS_TO_VM_PAGE(pml5[i5] & PG_FRAME);
12236                         if (pg == NULL) {
12237                                 ptpages_show_complain(4, i5, pml5[i5]);
12238                                 continue;
12239                         }
12240                         ptpages_show_page(4, i5, pg);
12241                         ptpages_show_pml4(pg, NPML4EPG, PG_V);
12242                 }
12243         } else {
12244                 ptpages_show_pml4(PHYS_TO_VM_PAGE(DMAP_TO_PHYS(
12245                     (vm_offset_t)pmap->pm_pmltop)), NUP4ML4E, PG_V);
12246         }
12247 }
12248 #endif