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