]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/amd64/pmap.c
Don't invalidate the TLB in pmap_qenter() unless the old mapping was valid.
[FreeBSD/FreeBSD.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 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 #include <sys/cdefs.h>
80 __FBSDID("$FreeBSD$");
81
82 /*
83  *      Manages physical address maps.
84  *
85  *      In addition to hardware address maps, this
86  *      module is called upon to provide software-use-only
87  *      maps which may or may not be stored in the same
88  *      form as hardware maps.  These pseudo-maps are
89  *      used to store intermediate results from copy
90  *      operations to and from address spaces.
91  *
92  *      Since the information managed by this module is
93  *      also stored by the logical address mapping module,
94  *      this module may throw away valid virtual-to-physical
95  *      mappings at almost any time.  However, invalidations
96  *      of virtual-to-physical mappings must be done as
97  *      requested.
98  *
99  *      In order to cope with hardware architectures which
100  *      make virtual-to-physical map invalidates expensive,
101  *      this module may delay invalidate or reduced protection
102  *      operations until such time as they are actually
103  *      necessary.  This module is given full information as
104  *      to which processors are currently using which maps,
105  *      and to when physical maps must be made correct.
106  */
107
108 #include "opt_msgbuf.h"
109 #include "opt_pmap.h"
110
111 #include <sys/param.h>
112 #include <sys/systm.h>
113 #include <sys/kernel.h>
114 #include <sys/lock.h>
115 #include <sys/malloc.h>
116 #include <sys/mman.h>
117 #include <sys/msgbuf.h>
118 #include <sys/mutex.h>
119 #include <sys/proc.h>
120 #include <sys/sx.h>
121 #include <sys/vmmeter.h>
122 #include <sys/sched.h>
123 #include <sys/sysctl.h>
124 #ifdef SMP
125 #include <sys/smp.h>
126 #endif
127
128 #include <vm/vm.h>
129 #include <vm/vm_param.h>
130 #include <vm/vm_kern.h>
131 #include <vm/vm_page.h>
132 #include <vm/vm_map.h>
133 #include <vm/vm_object.h>
134 #include <vm/vm_extern.h>
135 #include <vm/vm_pageout.h>
136 #include <vm/vm_pager.h>
137 #include <vm/uma.h>
138
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 #ifndef PMAP_SHPGPERPROC
149 #define PMAP_SHPGPERPROC 200
150 #endif
151
152 #if defined(DIAGNOSTIC)
153 #define PMAP_DIAGNOSTIC
154 #endif
155
156 #if !defined(PMAP_DIAGNOSTIC)
157 #define PMAP_INLINE __inline
158 #else
159 #define PMAP_INLINE
160 #endif
161
162 #define PV_STATS
163 #ifdef PV_STATS
164 #define PV_STAT(x)      do { x ; } while (0)
165 #else
166 #define PV_STAT(x)      do { } while (0)
167 #endif
168
169 struct pmap kernel_pmap_store;
170
171 vm_paddr_t avail_start;         /* PA of first available physical page */
172 vm_paddr_t avail_end;           /* PA of last available physical page */
173 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
174 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
175
176 static int nkpt;
177 static int ndmpdp;
178 static vm_paddr_t dmaplimit;
179 vm_offset_t kernel_vm_end;
180 pt_entry_t pg_nx;
181
182 static u_int64_t        KPTphys;        /* phys addr of kernel level 1 */
183 static u_int64_t        KPDphys;        /* phys addr of kernel level 2 */
184 u_int64_t               KPDPphys;       /* phys addr of kernel level 3 */
185 u_int64_t               KPML4phys;      /* phys addr of kernel level 4 */
186
187 static u_int64_t        DMPDphys;       /* phys addr of direct mapped level 2 */
188 static u_int64_t        DMPDPphys;      /* phys addr of direct mapped level 3 */
189
190 /*
191  * Data for the pv entry allocation mechanism
192  */
193 static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
194 static int shpgperproc = PMAP_SHPGPERPROC;
195
196 /*
197  * All those kernel PT submaps that BSD is so fond of
198  */
199 pt_entry_t *CMAP1 = 0;
200 caddr_t CADDR1 = 0;
201 struct msgbuf *msgbufp = 0;
202
203 /*
204  * Crashdump maps.
205  */
206 static caddr_t crashdumpmap;
207
208 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
209 static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
210 static void     pmap_clear_ptes(vm_page_t m, long bit);
211
212 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
213     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
214 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq,
215                 vm_offset_t sva, pd_entry_t ptepde);
216 static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde);
217 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
218                 vm_offset_t va);
219 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
220 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
221     vm_page_t m);
222
223 static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags);
224 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
225
226 static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags);
227 static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m);
228 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t);
229 static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
230
231 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
232 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
233
234 /*
235  * Move the kernel virtual free pointer to the next
236  * 2MB.  This is used to help improve performance
237  * by using a large (2MB) page for much of the kernel
238  * (.text, .data, .bss)
239  */
240 static vm_offset_t
241 pmap_kmem_choose(vm_offset_t addr)
242 {
243         vm_offset_t newaddr = addr;
244
245         newaddr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
246         return newaddr;
247 }
248
249 /********************/
250 /* Inline functions */
251 /********************/
252
253 /* Return a non-clipped PD index for a given VA */
254 static __inline vm_pindex_t
255 pmap_pde_pindex(vm_offset_t va)
256 {
257         return va >> PDRSHIFT;
258 }
259
260
261 /* Return various clipped indexes for a given VA */
262 static __inline vm_pindex_t
263 pmap_pte_index(vm_offset_t va)
264 {
265
266         return ((va >> PAGE_SHIFT) & ((1ul << NPTEPGSHIFT) - 1));
267 }
268
269 static __inline vm_pindex_t
270 pmap_pde_index(vm_offset_t va)
271 {
272
273         return ((va >> PDRSHIFT) & ((1ul << NPDEPGSHIFT) - 1));
274 }
275
276 static __inline vm_pindex_t
277 pmap_pdpe_index(vm_offset_t va)
278 {
279
280         return ((va >> PDPSHIFT) & ((1ul << NPDPEPGSHIFT) - 1));
281 }
282
283 static __inline vm_pindex_t
284 pmap_pml4e_index(vm_offset_t va)
285 {
286
287         return ((va >> PML4SHIFT) & ((1ul << NPML4EPGSHIFT) - 1));
288 }
289
290 /* Return a pointer to the PML4 slot that corresponds to a VA */
291 static __inline pml4_entry_t *
292 pmap_pml4e(pmap_t pmap, vm_offset_t va)
293 {
294
295         if (!pmap)
296                 return NULL;
297         return (&pmap->pm_pml4[pmap_pml4e_index(va)]);
298 }
299
300 /* Return a pointer to the PDP slot that corresponds to a VA */
301 static __inline pdp_entry_t *
302 pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va)
303 {
304         pdp_entry_t *pdpe;
305
306         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME);
307         return (&pdpe[pmap_pdpe_index(va)]);
308 }
309
310 /* Return a pointer to the PDP slot that corresponds to a VA */
311 static __inline pdp_entry_t *
312 pmap_pdpe(pmap_t pmap, vm_offset_t va)
313 {
314         pml4_entry_t *pml4e;
315
316         pml4e = pmap_pml4e(pmap, va);
317         if (pml4e == NULL || (*pml4e & PG_V) == 0)
318                 return NULL;
319         return (pmap_pml4e_to_pdpe(pml4e, va));
320 }
321
322 /* Return a pointer to the PD slot that corresponds to a VA */
323 static __inline pd_entry_t *
324 pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
325 {
326         pd_entry_t *pde;
327
328         pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
329         return (&pde[pmap_pde_index(va)]);
330 }
331
332 /* Return a pointer to the PD slot that corresponds to a VA */
333 static __inline pd_entry_t *
334 pmap_pde(pmap_t pmap, vm_offset_t va)
335 {
336         pdp_entry_t *pdpe;
337
338         pdpe = pmap_pdpe(pmap, va);
339         if (pdpe == NULL || (*pdpe & PG_V) == 0)
340                  return NULL;
341         return (pmap_pdpe_to_pde(pdpe, va));
342 }
343
344 /* Return a pointer to the PT slot that corresponds to a VA */
345 static __inline pt_entry_t *
346 pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
347 {
348         pt_entry_t *pte;
349
350         pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
351         return (&pte[pmap_pte_index(va)]);
352 }
353
354 /* Return a pointer to the PT slot that corresponds to a VA */
355 static __inline pt_entry_t *
356 pmap_pte(pmap_t pmap, vm_offset_t va)
357 {
358         pd_entry_t *pde;
359
360         pde = pmap_pde(pmap, va);
361         if (pde == NULL || (*pde & PG_V) == 0)
362                 return NULL;
363         if ((*pde & PG_PS) != 0)        /* compat with i386 pmap_pte() */
364                 return ((pt_entry_t *)pde);
365         return (pmap_pde_to_pte(pde, va));
366 }
367
368
369 static __inline pt_entry_t *
370 pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde)
371 {
372         pd_entry_t *pde;
373
374         pde = pmap_pde(pmap, va);
375         if (pde == NULL || (*pde & PG_V) == 0)
376                 return NULL;
377         *ptepde = *pde;
378         if ((*pde & PG_PS) != 0)        /* compat with i386 pmap_pte() */
379                 return ((pt_entry_t *)pde);
380         return (pmap_pde_to_pte(pde, va));
381 }
382
383
384 PMAP_INLINE pt_entry_t *
385 vtopte(vm_offset_t va)
386 {
387         u_int64_t mask = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
388
389         return (PTmap + ((va >> PAGE_SHIFT) & mask));
390 }
391
392 static __inline pd_entry_t *
393 vtopde(vm_offset_t va)
394 {
395         u_int64_t mask = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
396
397         return (PDmap + ((va >> PDRSHIFT) & mask));
398 }
399
400 static u_int64_t
401 allocpages(int n)
402 {
403         u_int64_t ret;
404
405         ret = avail_start;
406         bzero((void *)ret, n * PAGE_SIZE);
407         avail_start += n * PAGE_SIZE;
408         return (ret);
409 }
410
411 static void
412 create_pagetables(void)
413 {
414         int i;
415
416         /* Allocate pages */
417         KPTphys = allocpages(NKPT);
418         KPML4phys = allocpages(1);
419         KPDPphys = allocpages(NKPML4E);
420         KPDphys = allocpages(NKPDPE);
421
422         ndmpdp = (ptoa(Maxmem) + NBPDP - 1) >> PDPSHIFT;
423         if (ndmpdp < 4)         /* Minimum 4GB of dirmap */
424                 ndmpdp = 4;
425         DMPDPphys = allocpages(NDMPML4E);
426         DMPDphys = allocpages(ndmpdp);
427         dmaplimit = (vm_paddr_t)ndmpdp << PDPSHIFT;
428
429         /* Fill in the underlying page table pages */
430         /* Read-only from zero to physfree */
431         /* XXX not fully used, underneath 2M pages */
432         for (i = 0; (i << PAGE_SHIFT) < avail_start; i++) {
433                 ((pt_entry_t *)KPTphys)[i] = i << PAGE_SHIFT;
434                 ((pt_entry_t *)KPTphys)[i] |= PG_RW | PG_V | PG_G;
435         }
436
437         /* Now map the page tables at their location within PTmap */
438         for (i = 0; i < NKPT; i++) {
439                 ((pd_entry_t *)KPDphys)[i] = KPTphys + (i << PAGE_SHIFT);
440                 ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V;
441         }
442
443         /* Map from zero to end of allocations under 2M pages */
444         /* This replaces some of the KPTphys entries above */
445         for (i = 0; (i << PDRSHIFT) < avail_start; i++) {
446                 ((pd_entry_t *)KPDphys)[i] = i << PDRSHIFT;
447                 ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V | PG_PS | PG_G;
448         }
449
450         /* And connect up the PD to the PDP */
451         for (i = 0; i < NKPDPE; i++) {
452                 ((pdp_entry_t *)KPDPphys)[i + KPDPI] = KPDphys + (i << PAGE_SHIFT);
453                 ((pdp_entry_t *)KPDPphys)[i + KPDPI] |= PG_RW | PG_V | PG_U;
454         }
455
456
457         /* Now set up the direct map space using 2MB pages */
458         for (i = 0; i < NPDEPG * ndmpdp; i++) {
459                 ((pd_entry_t *)DMPDphys)[i] = (vm_paddr_t)i << PDRSHIFT;
460                 ((pd_entry_t *)DMPDphys)[i] |= PG_RW | PG_V | PG_PS | PG_G;
461         }
462
463         /* And the direct map space's PDP */
464         for (i = 0; i < ndmpdp; i++) {
465                 ((pdp_entry_t *)DMPDPphys)[i] = DMPDphys + (i << PAGE_SHIFT);
466                 ((pdp_entry_t *)DMPDPphys)[i] |= PG_RW | PG_V | PG_U;
467         }
468
469         /* And recursively map PML4 to itself in order to get PTmap */
470         ((pdp_entry_t *)KPML4phys)[PML4PML4I] = KPML4phys;
471         ((pdp_entry_t *)KPML4phys)[PML4PML4I] |= PG_RW | PG_V | PG_U;
472
473         /* Connect the Direct Map slot up to the PML4 */
474         ((pdp_entry_t *)KPML4phys)[DMPML4I] = DMPDPphys;
475         ((pdp_entry_t *)KPML4phys)[DMPML4I] |= PG_RW | PG_V | PG_U;
476
477         /* Connect the KVA slot up to the PML4 */
478         ((pdp_entry_t *)KPML4phys)[KPML4I] = KPDPphys;
479         ((pdp_entry_t *)KPML4phys)[KPML4I] |= PG_RW | PG_V | PG_U;
480 }
481
482 /*
483  *      Bootstrap the system enough to run with virtual memory.
484  *
485  *      On amd64 this is called after mapping has already been enabled
486  *      and just syncs the pmap module with what has already been done.
487  *      [We can't call it easily with mapping off since the kernel is not
488  *      mapped with PA == VA, hence we would have to relocate every address
489  *      from the linked base (virtual) address "KERNBASE" to the actual
490  *      (physical) address starting relative to 0]
491  */
492 void
493 pmap_bootstrap(firstaddr)
494         vm_paddr_t *firstaddr;
495 {
496         vm_offset_t va;
497         pt_entry_t *pte, *unused;
498
499         avail_start = *firstaddr;
500
501         /*
502          * Create an initial set of page tables to run the kernel in.
503          */
504         create_pagetables();
505         *firstaddr = avail_start;
506
507         virtual_avail = (vm_offset_t) KERNBASE + avail_start;
508         virtual_avail = pmap_kmem_choose(virtual_avail);
509
510         virtual_end = VM_MAX_KERNEL_ADDRESS;
511
512
513         /* XXX do %cr0 as well */
514         load_cr4(rcr4() | CR4_PGE | CR4_PSE);
515         load_cr3(KPML4phys);
516
517         /*
518          * Initialize the kernel pmap (which is statically allocated).
519          */
520         PMAP_LOCK_INIT(kernel_pmap);
521         kernel_pmap->pm_pml4 = (pdp_entry_t *) (KERNBASE + KPML4phys);
522         kernel_pmap->pm_active = -1;    /* don't allow deactivation */
523         TAILQ_INIT(&kernel_pmap->pm_pvchunk);
524         nkpt = NKPT;
525
526         /*
527          * Reserve some special page table entries/VA space for temporary
528          * mapping of pages.
529          */
530 #define SYSMAP(c, p, v, n)      \
531         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
532
533         va = virtual_avail;
534         pte = vtopte(va);
535
536         /*
537          * CMAP1 is only used for the memory test.
538          */
539         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
540
541         /*
542          * Crashdump maps.
543          */
544         SYSMAP(caddr_t, unused, crashdumpmap, MAXDUMPPGS)
545
546         /*
547          * msgbufp is used to map the system message buffer.
548          */
549         SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(MSGBUF_SIZE)))
550
551         virtual_avail = va;
552
553         *CMAP1 = 0;
554
555         invltlb();
556
557         /* Initialize the PAT MSR. */
558         pmap_init_pat();
559 }
560
561 /*
562  * Setup the PAT MSR.
563  */
564 void
565 pmap_init_pat(void)
566 {
567         uint64_t pat_msr;
568
569         /* Bail if this CPU doesn't implement PAT. */
570         if (!(cpu_feature & CPUID_PAT))
571                 panic("no PAT??");
572
573 #ifdef PAT_WORKS
574         /*
575          * Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
576          * Program 4 and 5 as WP and WC.
577          * Leave 6 and 7 as UC and UC-.
578          */
579         pat_msr = rdmsr(MSR_PAT);
580         pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
581         pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
582             PAT_VALUE(5, PAT_WRITE_COMBINING);
583 #else
584         /*
585          * Due to some Intel errata, we can only safely use the lower 4
586          * PAT entries.  Thus, just replace PAT Index 2 with WC instead
587          * of UC-.
588          *
589          *   Intel Pentium III Processor Specification Update
590          * Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
591          * or Mode C Paging)
592          *
593          *   Intel Pentium IV  Processor Specification Update
594          * Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
595          */
596         pat_msr = rdmsr(MSR_PAT);
597         pat_msr &= ~PAT_MASK(2);
598         pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
599 #endif
600         wrmsr(MSR_PAT, pat_msr);
601 }
602
603 /*
604  *      Initialize a vm_page's machine-dependent fields.
605  */
606 void
607 pmap_page_init(vm_page_t m)
608 {
609
610         TAILQ_INIT(&m->md.pv_list);
611         m->md.pv_list_count = 0;
612 }
613
614 /*
615  *      Initialize the pmap module.
616  *      Called by vm_init, to initialize any structures that the pmap
617  *      system needs to map virtual memory.
618  */
619 void
620 pmap_init(void)
621 {
622
623         /*
624          * Initialize the address space (zone) for the pv entries.  Set a
625          * high water mark so that the system can recover from excessive
626          * numbers of pv entries.
627          */
628         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
629         pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
630         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
631         pv_entry_high_water = 9 * (pv_entry_max / 10);
632 }
633
634 SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
635 static int
636 pmap_pventry_proc(SYSCTL_HANDLER_ARGS)
637 {
638         int error;
639
640         error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req);
641         if (error == 0 && req->newptr) {
642                 shpgperproc = (pv_entry_max - cnt.v_page_count) / maxproc;
643                 pv_entry_high_water = 9 * (pv_entry_max / 10);
644         }
645         return (error);
646 }
647 SYSCTL_PROC(_vm_pmap, OID_AUTO, pv_entry_max, CTLTYPE_INT|CTLFLAG_RW, 
648     &pv_entry_max, 0, pmap_pventry_proc, "IU", "Max number of PV entries");
649
650 static int
651 pmap_shpgperproc_proc(SYSCTL_HANDLER_ARGS)
652 {
653         int error;
654
655         error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req);
656         if (error == 0 && req->newptr) {
657                 pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
658                 pv_entry_high_water = 9 * (pv_entry_max / 10);
659         }
660         return (error);
661 }
662 SYSCTL_PROC(_vm_pmap, OID_AUTO, shpgperproc, CTLTYPE_INT|CTLFLAG_RW, 
663     &shpgperproc, 0, pmap_shpgperproc_proc, "IU", "Page share factor per proc");
664
665
666 /***************************************************
667  * Low level helper routines.....
668  ***************************************************/
669
670 #ifdef SMP
671 /*
672  * For SMP, these functions have to use the IPI mechanism for coherence.
673  */
674 void
675 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
676 {
677         u_int cpumask;
678         u_int other_cpus;
679
680         if (smp_started) {
681                 if (!(read_rflags() & PSL_I))
682                         panic("%s: interrupts disabled", __func__);
683                 mtx_lock_spin(&smp_ipi_mtx);
684         } else
685                 critical_enter();
686         /*
687          * We need to disable interrupt preemption but MUST NOT have
688          * interrupts disabled here.
689          * XXX we may need to hold schedlock to get a coherent pm_active
690          * XXX critical sections disable interrupts again
691          */
692         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
693                 invlpg(va);
694                 smp_invlpg(va);
695         } else {
696                 cpumask = PCPU_GET(cpumask);
697                 other_cpus = PCPU_GET(other_cpus);
698                 if (pmap->pm_active & cpumask)
699                         invlpg(va);
700                 if (pmap->pm_active & other_cpus)
701                         smp_masked_invlpg(pmap->pm_active & other_cpus, va);
702         }
703         if (smp_started)
704                 mtx_unlock_spin(&smp_ipi_mtx);
705         else
706                 critical_exit();
707 }
708
709 void
710 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
711 {
712         u_int cpumask;
713         u_int other_cpus;
714         vm_offset_t addr;
715
716         if (smp_started) {
717                 if (!(read_rflags() & PSL_I))
718                         panic("%s: interrupts disabled", __func__);
719                 mtx_lock_spin(&smp_ipi_mtx);
720         } else
721                 critical_enter();
722         /*
723          * We need to disable interrupt preemption but MUST NOT have
724          * interrupts disabled here.
725          * XXX we may need to hold schedlock to get a coherent pm_active
726          * XXX critical sections disable interrupts again
727          */
728         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
729                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
730                         invlpg(addr);
731                 smp_invlpg_range(sva, eva);
732         } else {
733                 cpumask = PCPU_GET(cpumask);
734                 other_cpus = PCPU_GET(other_cpus);
735                 if (pmap->pm_active & cpumask)
736                         for (addr = sva; addr < eva; addr += PAGE_SIZE)
737                                 invlpg(addr);
738                 if (pmap->pm_active & other_cpus)
739                         smp_masked_invlpg_range(pmap->pm_active & other_cpus,
740                             sva, eva);
741         }
742         if (smp_started)
743                 mtx_unlock_spin(&smp_ipi_mtx);
744         else
745                 critical_exit();
746 }
747
748 void
749 pmap_invalidate_all(pmap_t pmap)
750 {
751         u_int cpumask;
752         u_int other_cpus;
753
754         if (smp_started) {
755                 if (!(read_rflags() & PSL_I))
756                         panic("%s: interrupts disabled", __func__);
757                 mtx_lock_spin(&smp_ipi_mtx);
758         } else
759                 critical_enter();
760         /*
761          * We need to disable interrupt preemption but MUST NOT have
762          * interrupts disabled here.
763          * XXX we may need to hold schedlock to get a coherent pm_active
764          * XXX critical sections disable interrupts again
765          */
766         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
767                 invltlb();
768                 smp_invltlb();
769         } else {
770                 cpumask = PCPU_GET(cpumask);
771                 other_cpus = PCPU_GET(other_cpus);
772                 if (pmap->pm_active & cpumask)
773                         invltlb();
774                 if (pmap->pm_active & other_cpus)
775                         smp_masked_invltlb(pmap->pm_active & other_cpus);
776         }
777         if (smp_started)
778                 mtx_unlock_spin(&smp_ipi_mtx);
779         else
780                 critical_exit();
781 }
782
783 void
784 pmap_invalidate_cache(void)
785 {
786
787         if (smp_started) {
788                 if (!(read_rflags() & PSL_I))
789                         panic("%s: interrupts disabled", __func__);
790                 mtx_lock_spin(&smp_ipi_mtx);
791         } else
792                 critical_enter();
793         /*
794          * We need to disable interrupt preemption but MUST NOT have
795          * interrupts disabled here.
796          * XXX we may need to hold schedlock to get a coherent pm_active
797          * XXX critical sections disable interrupts again
798          */
799         wbinvd();
800         smp_cache_flush();
801         if (smp_started)
802                 mtx_unlock_spin(&smp_ipi_mtx);
803         else
804                 critical_exit();
805 }
806 #else /* !SMP */
807 /*
808  * Normal, non-SMP, invalidation functions.
809  * We inline these within pmap.c for speed.
810  */
811 PMAP_INLINE void
812 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
813 {
814
815         if (pmap == kernel_pmap || pmap->pm_active)
816                 invlpg(va);
817 }
818
819 PMAP_INLINE void
820 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
821 {
822         vm_offset_t addr;
823
824         if (pmap == kernel_pmap || pmap->pm_active)
825                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
826                         invlpg(addr);
827 }
828
829 PMAP_INLINE void
830 pmap_invalidate_all(pmap_t pmap)
831 {
832
833         if (pmap == kernel_pmap || pmap->pm_active)
834                 invltlb();
835 }
836
837 PMAP_INLINE void
838 pmap_invalidate_cache(void)
839 {
840
841         wbinvd();
842 }
843 #endif /* !SMP */
844
845 /*
846  * Are we current address space or kernel?
847  */
848 static __inline int
849 pmap_is_current(pmap_t pmap)
850 {
851         return (pmap == kernel_pmap ||
852             (pmap->pm_pml4[PML4PML4I] & PG_FRAME) == (PML4pml4e[0] & PG_FRAME));
853 }
854
855 /*
856  *      Routine:        pmap_extract
857  *      Function:
858  *              Extract the physical page address associated
859  *              with the given map/virtual_address pair.
860  */
861 vm_paddr_t 
862 pmap_extract(pmap_t pmap, vm_offset_t va)
863 {
864         vm_paddr_t rtval;
865         pt_entry_t *pte;
866         pd_entry_t pde, *pdep;
867
868         rtval = 0;
869         PMAP_LOCK(pmap);
870         pdep = pmap_pde(pmap, va);
871         if (pdep != NULL) {
872                 pde = *pdep;
873                 if (pde) {
874                         if ((pde & PG_PS) != 0) {
875                                 KASSERT((pde & PG_FRAME & PDRMASK) == 0,
876                                     ("pmap_extract: bad pde"));
877                                 rtval = (pde & PG_FRAME) | (va & PDRMASK);
878                                 PMAP_UNLOCK(pmap);
879                                 return rtval;
880                         }
881                         pte = pmap_pde_to_pte(pdep, va);
882                         rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
883                 }
884         }
885         PMAP_UNLOCK(pmap);
886         return (rtval);
887 }
888
889 /*
890  *      Routine:        pmap_extract_and_hold
891  *      Function:
892  *              Atomically extract and hold the physical page
893  *              with the given pmap and virtual address pair
894  *              if that mapping permits the given protection.
895  */
896 vm_page_t
897 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
898 {
899         pd_entry_t pde, *pdep;
900         pt_entry_t pte;
901         vm_page_t m;
902
903         m = NULL;
904         vm_page_lock_queues();
905         PMAP_LOCK(pmap);
906         pdep = pmap_pde(pmap, va);
907         if (pdep != NULL && (pde = *pdep)) {
908                 if (pde & PG_PS) {
909                         if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
910                                 KASSERT((pde & PG_FRAME & PDRMASK) == 0,
911                                     ("pmap_extract_and_hold: bad pde"));
912                                 m = PHYS_TO_VM_PAGE((pde & PG_FRAME) |
913                                     (va & PDRMASK));
914                                 vm_page_hold(m);
915                         }
916                 } else {
917                         pte = *pmap_pde_to_pte(pdep, va);
918                         if ((pte & PG_V) &&
919                             ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
920                                 m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
921                                 vm_page_hold(m);
922                         }
923                 }
924         }
925         vm_page_unlock_queues();
926         PMAP_UNLOCK(pmap);
927         return (m);
928 }
929
930 vm_paddr_t
931 pmap_kextract(vm_offset_t va)
932 {
933         pd_entry_t *pde;
934         vm_paddr_t pa;
935
936         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
937                 pa = DMAP_TO_PHYS(va);
938         } else {
939                 pde = vtopde(va);
940                 if (*pde & PG_PS) {
941                         pa = (*pde & ~(NBPDR - 1)) | (va & (NBPDR - 1));
942                 } else {
943                         pa = *vtopte(va);
944                         pa = (pa & PG_FRAME) | (va & PAGE_MASK);
945                 }
946         }
947         return pa;
948 }
949
950 /***************************************************
951  * Low level mapping routines.....
952  ***************************************************/
953
954 /*
955  * Add a wired page to the kva.
956  * Note: not SMP coherent.
957  */
958 PMAP_INLINE void 
959 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
960 {
961         pt_entry_t *pte;
962
963         pte = vtopte(va);
964         pte_store(pte, pa | PG_RW | PG_V | PG_G);
965 }
966
967 /*
968  * Remove a page from the kernel pagetables.
969  * Note: not SMP coherent.
970  */
971 PMAP_INLINE void
972 pmap_kremove(vm_offset_t va)
973 {
974         pt_entry_t *pte;
975
976         pte = vtopte(va);
977         pte_clear(pte);
978 }
979
980 /*
981  *      Used to map a range of physical addresses into kernel
982  *      virtual address space.
983  *
984  *      The value passed in '*virt' is a suggested virtual address for
985  *      the mapping. Architectures which can support a direct-mapped
986  *      physical to virtual region can return the appropriate address
987  *      within that region, leaving '*virt' unchanged. Other
988  *      architectures should map the pages starting at '*virt' and
989  *      update '*virt' with the first usable address after the mapped
990  *      region.
991  */
992 vm_offset_t
993 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
994 {
995         return PHYS_TO_DMAP(start);
996 }
997
998
999 /*
1000  * Add a list of wired pages to the kva
1001  * this routine is only used for temporary
1002  * kernel mappings that do not need to have
1003  * page modification or references recorded.
1004  * Note that old mappings are simply written
1005  * over.  The page *must* be wired.
1006  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1007  */
1008 void
1009 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
1010 {
1011         pt_entry_t *endpte, oldpte, *pte;
1012
1013         oldpte = 0;
1014         pte = vtopte(sva);
1015         endpte = pte + count;
1016         while (pte < endpte) {
1017                 oldpte |= *pte;
1018                 pte_store(pte, VM_PAGE_TO_PHYS(*ma) | PG_G | PG_RW | PG_V);
1019                 pte++;
1020                 ma++;
1021         }
1022         if ((oldpte & PG_V) != 0)
1023                 pmap_invalidate_range(kernel_pmap, sva, sva + count *
1024                     PAGE_SIZE);
1025 }
1026
1027 /*
1028  * This routine tears out page mappings from the
1029  * kernel -- it is meant only for temporary mappings.
1030  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1031  */
1032 void
1033 pmap_qremove(vm_offset_t sva, int count)
1034 {
1035         vm_offset_t va;
1036
1037         va = sva;
1038         while (count-- > 0) {
1039                 pmap_kremove(va);
1040                 va += PAGE_SIZE;
1041         }
1042         pmap_invalidate_range(kernel_pmap, sva, va);
1043 }
1044
1045 /***************************************************
1046  * Page table page management routines.....
1047  ***************************************************/
1048
1049 /*
1050  * This routine unholds page table pages, and if the hold count
1051  * drops to zero, then it decrements the wire count.
1052  */
1053 static PMAP_INLINE int
1054 pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m)
1055 {
1056
1057         --m->wire_count;
1058         if (m->wire_count == 0)
1059                 return _pmap_unwire_pte_hold(pmap, va, m);
1060         else
1061                 return 0;
1062 }
1063
1064 static int 
1065 _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m)
1066 {
1067         vm_offset_t pteva;
1068
1069         /*
1070          * unmap the page table page
1071          */
1072         if (m->pindex >= (NUPDE + NUPDPE)) {
1073                 /* PDP page */
1074                 pml4_entry_t *pml4;
1075                 pml4 = pmap_pml4e(pmap, va);
1076                 pteva = (vm_offset_t) PDPmap + amd64_ptob(m->pindex - (NUPDE + NUPDPE));
1077                 *pml4 = 0;
1078         } else if (m->pindex >= NUPDE) {
1079                 /* PD page */
1080                 pdp_entry_t *pdp;
1081                 pdp = pmap_pdpe(pmap, va);
1082                 pteva = (vm_offset_t) PDmap + amd64_ptob(m->pindex - NUPDE);
1083                 *pdp = 0;
1084         } else {
1085                 /* PTE page */
1086                 pd_entry_t *pd;
1087                 pd = pmap_pde(pmap, va);
1088                 pteva = (vm_offset_t) PTmap + amd64_ptob(m->pindex);
1089                 *pd = 0;
1090         }
1091         --pmap->pm_stats.resident_count;
1092         if (m->pindex < NUPDE) {
1093                 /* We just released a PT, unhold the matching PD */
1094                 vm_page_t pdpg;
1095
1096                 pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME);
1097                 pmap_unwire_pte_hold(pmap, va, pdpg);
1098         }
1099         if (m->pindex >= NUPDE && m->pindex < (NUPDE + NUPDPE)) {
1100                 /* We just released a PD, unhold the matching PDP */
1101                 vm_page_t pdppg;
1102
1103                 pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & PG_FRAME);
1104                 pmap_unwire_pte_hold(pmap, va, pdppg);
1105         }
1106
1107         /*
1108          * Do an invltlb to make the invalidated mapping
1109          * take effect immediately.
1110          */
1111         pmap_invalidate_page(pmap, pteva);
1112
1113         vm_page_free_zero(m);
1114         atomic_subtract_int(&cnt.v_wire_count, 1);
1115         return 1;
1116 }
1117
1118 /*
1119  * After removing a page table entry, this routine is used to
1120  * conditionally free the page, and manage the hold/wire counts.
1121  */
1122 static int
1123 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde)
1124 {
1125         vm_page_t mpte;
1126
1127         if (va >= VM_MAXUSER_ADDRESS)
1128                 return 0;
1129         KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
1130         mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
1131         return pmap_unwire_pte_hold(pmap, va, mpte);
1132 }
1133
1134 void
1135 pmap_pinit0(pmap)
1136         struct pmap *pmap;
1137 {
1138
1139         PMAP_LOCK_INIT(pmap);
1140         pmap->pm_pml4 = (pml4_entry_t *)(KERNBASE + KPML4phys);
1141         pmap->pm_active = 0;
1142         TAILQ_INIT(&pmap->pm_pvchunk);
1143         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1144 }
1145
1146 /*
1147  * Initialize a preallocated and zeroed pmap structure,
1148  * such as one in a vmspace structure.
1149  */
1150 void
1151 pmap_pinit(pmap)
1152         register struct pmap *pmap;
1153 {
1154         vm_page_t pml4pg;
1155         static vm_pindex_t color;
1156
1157         PMAP_LOCK_INIT(pmap);
1158
1159         /*
1160          * allocate the page directory page
1161          */
1162         while ((pml4pg = vm_page_alloc(NULL, color++, VM_ALLOC_NOOBJ |
1163             VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL)
1164                 VM_WAIT;
1165
1166         pmap->pm_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4pg));
1167
1168         if ((pml4pg->flags & PG_ZERO) == 0)
1169                 pagezero(pmap->pm_pml4);
1170
1171         /* Wire in kernel global address entries. */
1172         pmap->pm_pml4[KPML4I] = KPDPphys | PG_RW | PG_V | PG_U;
1173         pmap->pm_pml4[DMPML4I] = DMPDPphys | PG_RW | PG_V | PG_U;
1174
1175         /* install self-referential address mapping entry(s) */
1176         pmap->pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | PG_V | PG_RW | PG_A | PG_M;
1177
1178         pmap->pm_active = 0;
1179         TAILQ_INIT(&pmap->pm_pvchunk);
1180         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1181 }
1182
1183 /*
1184  * this routine is called if the page table page is not
1185  * mapped correctly.
1186  *
1187  * Note: If a page allocation fails at page table level two or three,
1188  * one or two pages may be held during the wait, only to be released
1189  * afterwards.  This conservative approach is easily argued to avoid
1190  * race conditions.
1191  */
1192 static vm_page_t
1193 _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags)
1194 {
1195         vm_page_t m, pdppg, pdpg;
1196
1197         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1198             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1199             ("_pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1200
1201         /*
1202          * Allocate a page table page.
1203          */
1204         if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
1205             VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
1206                 if (flags & M_WAITOK) {
1207                         PMAP_UNLOCK(pmap);
1208                         vm_page_unlock_queues();
1209                         VM_WAIT;
1210                         vm_page_lock_queues();
1211                         PMAP_LOCK(pmap);
1212                 }
1213
1214                 /*
1215                  * Indicate the need to retry.  While waiting, the page table
1216                  * page may have been allocated.
1217                  */
1218                 return (NULL);
1219         }
1220         if ((m->flags & PG_ZERO) == 0)
1221                 pmap_zero_page(m);
1222
1223         /*
1224          * Map the pagetable page into the process address space, if
1225          * it isn't already there.
1226          */
1227
1228         pmap->pm_stats.resident_count++;
1229
1230         if (ptepindex >= (NUPDE + NUPDPE)) {
1231                 pml4_entry_t *pml4;
1232                 vm_pindex_t pml4index;
1233
1234                 /* Wire up a new PDPE page */
1235                 pml4index = ptepindex - (NUPDE + NUPDPE);
1236                 pml4 = &pmap->pm_pml4[pml4index];
1237                 *pml4 = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
1238
1239         } else if (ptepindex >= NUPDE) {
1240                 vm_pindex_t pml4index;
1241                 vm_pindex_t pdpindex;
1242                 pml4_entry_t *pml4;
1243                 pdp_entry_t *pdp;
1244
1245                 /* Wire up a new PDE page */
1246                 pdpindex = ptepindex - NUPDE;
1247                 pml4index = pdpindex >> NPML4EPGSHIFT;
1248
1249                 pml4 = &pmap->pm_pml4[pml4index];
1250                 if ((*pml4 & PG_V) == 0) {
1251                         /* Have to allocate a new pdp, recurse */
1252                         if (_pmap_allocpte(pmap, NUPDE + NUPDPE + pml4index,
1253                             flags) == NULL) {
1254                                 --m->wire_count;
1255                                 vm_page_free(m);
1256                                 return (NULL);
1257                         }
1258                 } else {
1259                         /* Add reference to pdp page */
1260                         pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME);
1261                         pdppg->wire_count++;
1262                 }
1263                 pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
1264
1265                 /* Now find the pdp page */
1266                 pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1267                 *pdp = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
1268
1269         } else {
1270                 vm_pindex_t pml4index;
1271                 vm_pindex_t pdpindex;
1272                 pml4_entry_t *pml4;
1273                 pdp_entry_t *pdp;
1274                 pd_entry_t *pd;
1275
1276                 /* Wire up a new PTE page */
1277                 pdpindex = ptepindex >> NPDPEPGSHIFT;
1278                 pml4index = pdpindex >> NPML4EPGSHIFT;
1279
1280                 /* First, find the pdp and check that its valid. */
1281                 pml4 = &pmap->pm_pml4[pml4index];
1282                 if ((*pml4 & PG_V) == 0) {
1283                         /* Have to allocate a new pd, recurse */
1284                         if (_pmap_allocpte(pmap, NUPDE + pdpindex,
1285                             flags) == NULL) {
1286                                 --m->wire_count;
1287                                 vm_page_free(m);
1288                                 return (NULL);
1289                         }
1290                         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
1291                         pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1292                 } else {
1293                         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
1294                         pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1295                         if ((*pdp & PG_V) == 0) {
1296                                 /* Have to allocate a new pd, recurse */
1297                                 if (_pmap_allocpte(pmap, NUPDE + pdpindex,
1298                                     flags) == NULL) {
1299                                         --m->wire_count;
1300                                         vm_page_free(m);
1301                                         return (NULL);
1302                                 }
1303                         } else {
1304                                 /* Add reference to the pd page */
1305                                 pdpg = PHYS_TO_VM_PAGE(*pdp & PG_FRAME);
1306                                 pdpg->wire_count++;
1307                         }
1308                 }
1309                 pd = (pd_entry_t *)PHYS_TO_DMAP(*pdp & PG_FRAME);
1310
1311                 /* Now we know where the page directory page is */
1312                 pd = &pd[ptepindex & ((1ul << NPDEPGSHIFT) - 1)];
1313                 *pd = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
1314         }
1315
1316         return m;
1317 }
1318
1319 static vm_page_t
1320 pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags)
1321 {
1322         vm_pindex_t pdpindex, ptepindex;
1323         pdp_entry_t *pdpe;
1324         vm_page_t pdpg;
1325
1326         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1327             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1328             ("pmap_allocpde: flags is neither M_NOWAIT nor M_WAITOK"));
1329 retry:
1330         pdpe = pmap_pdpe(pmap, va);
1331         if (pdpe != NULL && (*pdpe & PG_V) != 0) {
1332                 /* Add a reference to the pd page. */
1333                 pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
1334                 pdpg->wire_count++;
1335         } else {
1336                 /* Allocate a pd page. */
1337                 ptepindex = pmap_pde_pindex(va);
1338                 pdpindex = ptepindex >> NPDPEPGSHIFT;
1339                 pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, flags);
1340                 if (pdpg == NULL && (flags & M_WAITOK))
1341                         goto retry;
1342         }
1343         return (pdpg);
1344 }
1345
1346 static vm_page_t
1347 pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags)
1348 {
1349         vm_pindex_t ptepindex;
1350         pd_entry_t *pd;
1351         vm_page_t m;
1352
1353         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1354             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1355             ("pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1356
1357         /*
1358          * Calculate pagetable page index
1359          */
1360         ptepindex = pmap_pde_pindex(va);
1361 retry:
1362         /*
1363          * Get the page directory entry
1364          */
1365         pd = pmap_pde(pmap, va);
1366
1367         /*
1368          * This supports switching from a 2MB page to a
1369          * normal 4K page.
1370          */
1371         if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
1372                 *pd = 0;
1373                 pd = 0;
1374                 pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1375                 pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va));
1376                 pmap_invalidate_all(kernel_pmap);
1377         }
1378
1379         /*
1380          * If the page table page is mapped, we just increment the
1381          * hold count, and activate it.
1382          */
1383         if (pd != 0 && (*pd & PG_V) != 0) {
1384                 m = PHYS_TO_VM_PAGE(*pd & PG_FRAME);
1385                 m->wire_count++;
1386         } else {
1387                 /*
1388                  * Here if the pte page isn't mapped, or if it has been
1389                  * deallocated.
1390                  */
1391                 m = _pmap_allocpte(pmap, ptepindex, flags);
1392                 if (m == NULL && (flags & M_WAITOK))
1393                         goto retry;
1394         }
1395         return (m);
1396 }
1397
1398
1399 /***************************************************
1400  * Pmap allocation/deallocation routines.
1401  ***************************************************/
1402
1403 /*
1404  * Release any resources held by the given physical map.
1405  * Called when a pmap initialized by pmap_pinit is being released.
1406  * Should only be called if the map contains no valid mappings.
1407  */
1408 void
1409 pmap_release(pmap_t pmap)
1410 {
1411         vm_page_t m;
1412
1413         KASSERT(pmap->pm_stats.resident_count == 0,
1414             ("pmap_release: pmap resident count %ld != 0",
1415             pmap->pm_stats.resident_count));
1416
1417         m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I] & PG_FRAME);
1418
1419         pmap->pm_pml4[KPML4I] = 0;      /* KVA */
1420         pmap->pm_pml4[DMPML4I] = 0;     /* Direct Map */
1421         pmap->pm_pml4[PML4PML4I] = 0;   /* Recursive Mapping */
1422
1423         vm_page_lock_queues();
1424         m->wire_count--;
1425         atomic_subtract_int(&cnt.v_wire_count, 1);
1426         vm_page_free_zero(m);
1427         vm_page_unlock_queues();
1428         PMAP_LOCK_DESTROY(pmap);
1429 }
1430 \f
1431 static int
1432 kvm_size(SYSCTL_HANDLER_ARGS)
1433 {
1434         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE;
1435
1436         return sysctl_handle_long(oidp, &ksize, 0, req);
1437 }
1438 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD, 
1439     0, 0, kvm_size, "LU", "Size of KVM");
1440
1441 static int
1442 kvm_free(SYSCTL_HANDLER_ARGS)
1443 {
1444         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
1445
1446         return sysctl_handle_long(oidp, &kfree, 0, req);
1447 }
1448 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD, 
1449     0, 0, kvm_free, "LU", "Amount of KVM free");
1450
1451 /*
1452  * grow the number of kernel page table entries, if needed
1453  */
1454 void
1455 pmap_growkernel(vm_offset_t addr)
1456 {
1457         vm_paddr_t paddr;
1458         vm_page_t nkpg;
1459         pd_entry_t *pde, newpdir;
1460         pdp_entry_t newpdp;
1461
1462         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
1463         if (kernel_vm_end == 0) {
1464                 kernel_vm_end = KERNBASE;
1465                 nkpt = 0;
1466                 while ((*pmap_pde(kernel_pmap, kernel_vm_end) & PG_V) != 0) {
1467                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1468                         nkpt++;
1469                 }
1470         }
1471         addr = roundup2(addr, PAGE_SIZE * NPTEPG);
1472         while (kernel_vm_end < addr) {
1473                 pde = pmap_pde(kernel_pmap, kernel_vm_end);
1474                 if (pde == NULL) {
1475                         /* We need a new PDP entry */
1476                         nkpg = vm_page_alloc(NULL, nkpt,
1477                             VM_ALLOC_NOOBJ | VM_ALLOC_SYSTEM | VM_ALLOC_WIRED);
1478                         if (!nkpg)
1479                                 panic("pmap_growkernel: no memory to grow kernel");
1480                         pmap_zero_page(nkpg);
1481                         paddr = VM_PAGE_TO_PHYS(nkpg);
1482                         newpdp = (pdp_entry_t)
1483                                 (paddr | PG_V | PG_RW | PG_A | PG_M);
1484                         *pmap_pdpe(kernel_pmap, kernel_vm_end) = newpdp;
1485                         continue; /* try again */
1486                 }
1487                 if ((*pde & PG_V) != 0) {
1488                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1489                         continue;
1490                 }
1491
1492                 /*
1493                  * This index is bogus, but out of the way
1494                  */
1495                 nkpg = vm_page_alloc(NULL, nkpt,
1496                     VM_ALLOC_NOOBJ | VM_ALLOC_SYSTEM | VM_ALLOC_WIRED);
1497                 if (!nkpg)
1498                         panic("pmap_growkernel: no memory to grow kernel");
1499
1500                 nkpt++;
1501
1502                 pmap_zero_page(nkpg);
1503                 paddr = VM_PAGE_TO_PHYS(nkpg);
1504                 newpdir = (pd_entry_t) (paddr | PG_V | PG_RW | PG_A | PG_M);
1505                 *pmap_pde(kernel_pmap, kernel_vm_end) = newpdir;
1506
1507                 kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1508         }
1509 }
1510
1511
1512 /***************************************************
1513  * page management routines.
1514  ***************************************************/
1515
1516 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
1517 CTASSERT(_NPCM == 3);
1518 CTASSERT(_NPCPV == 168);
1519
1520 static __inline struct pv_chunk *
1521 pv_to_chunk(pv_entry_t pv)
1522 {
1523
1524         return (struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK);
1525 }
1526
1527 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
1528
1529 #define PC_FREE0        0xfffffffffffffffful
1530 #define PC_FREE1        0xfffffffffffffffful
1531 #define PC_FREE2        0x000000fffffffffful
1532
1533 static uint64_t pc_freemask[3] = { PC_FREE0, PC_FREE1, PC_FREE2 };
1534
1535 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
1536         "Current number of pv entries");
1537
1538 #ifdef PV_STATS
1539 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
1540
1541 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
1542         "Current number of pv entry chunks");
1543 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
1544         "Current number of pv entry chunks allocated");
1545 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
1546         "Current number of pv entry chunks frees");
1547 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
1548         "Number of times tried to get a chunk page but failed.");
1549
1550 static long pv_entry_frees, pv_entry_allocs;
1551 static int pv_entry_spare;
1552
1553 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
1554         "Current number of pv entry frees");
1555 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
1556         "Current number of pv entry allocs");
1557 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
1558         "Current number of spare pv entries");
1559
1560 static int pmap_collect_inactive, pmap_collect_active;
1561
1562 SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0,
1563         "Current number times pmap_collect called on inactive queue");
1564 SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0,
1565         "Current number times pmap_collect called on active queue");
1566 #endif
1567
1568 /*
1569  * We are in a serious low memory condition.  Resort to
1570  * drastic measures to free some pages so we can allocate
1571  * another pv entry chunk.  This is normally called to
1572  * unmap inactive pages, and if necessary, active pages.
1573  */
1574 static void
1575 pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
1576 {
1577         pd_entry_t ptepde;
1578         pmap_t pmap;
1579         pt_entry_t *pte, tpte;
1580         pv_entry_t next_pv, pv;
1581         vm_offset_t va;
1582         vm_page_t m;
1583
1584         TAILQ_FOREACH(m, &vpq->pl, pageq) {
1585                 if (m->hold_count || m->busy || (m->flags & PG_BUSY))
1586                         continue;
1587                 TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
1588                         va = pv->pv_va;
1589                         pmap = PV_PMAP(pv);
1590                         /* Avoid deadlock and lock recursion. */
1591                         if (pmap > locked_pmap)
1592                                 PMAP_LOCK(pmap);
1593                         else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
1594                                 continue;
1595                         pmap->pm_stats.resident_count--;
1596                         pte = pmap_pte_pde(pmap, va, &ptepde);
1597                         tpte = pte_load_clear(pte);
1598                         KASSERT((tpte & PG_W) == 0,
1599                             ("pmap_collect: wired pte %#lx", tpte));
1600                         if (tpte & PG_A)
1601                                 vm_page_flag_set(m, PG_REFERENCED);
1602                         if (tpte & PG_M) {
1603                                 KASSERT((tpte & PG_RW),
1604         ("pmap_collect: modified page not writable: va: %#lx, pte: %#lx",
1605                                     va, tpte));
1606                                 vm_page_dirty(m);
1607                         }
1608                         pmap_invalidate_page(pmap, va);
1609                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1610                         if (TAILQ_EMPTY(&m->md.pv_list))
1611                                 vm_page_flag_clear(m, PG_WRITEABLE);
1612                         m->md.pv_list_count--;
1613                         pmap_unuse_pt(pmap, va, ptepde);
1614                         if (pmap != locked_pmap)
1615                                 PMAP_UNLOCK(pmap);
1616                         free_pv_entry(locked_pmap, pv);
1617                 }
1618         }
1619 }
1620
1621
1622 /*
1623  * free the pv_entry back to the free list
1624  */
1625 static void
1626 free_pv_entry(pmap_t pmap, pv_entry_t pv)
1627 {
1628         vm_page_t m;
1629         struct pv_chunk *pc;
1630         int idx, field, bit;
1631
1632         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1633         PV_STAT(pv_entry_frees++);
1634         PV_STAT(pv_entry_spare++);
1635         pv_entry_count--;
1636         pc = pv_to_chunk(pv);
1637         idx = pv - &pc->pc_pventry[0];
1638         field = idx / 64;
1639         bit = idx % 64;
1640         pc->pc_map[field] |= 1ul << bit;
1641         /* move to head of list */
1642         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1643         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1644         if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
1645             pc->pc_map[2] != PC_FREE2)
1646                 return;
1647         PV_STAT(pv_entry_spare -= _NPCPV);
1648         PV_STAT(pc_chunk_count--);
1649         PV_STAT(pc_chunk_frees++);
1650         /* entire chunk is free, return it */
1651         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1652         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
1653         dump_drop_page(m->phys_addr);
1654         vm_page_free(m);
1655 }
1656
1657 /*
1658  * get a new pv_entry, allocating a block from the system
1659  * when needed.
1660  */
1661 static pv_entry_t
1662 get_pv_entry(pmap_t pmap, int try)
1663 {
1664         static const struct timeval printinterval = { 60, 0 };
1665         static struct timeval lastprint;
1666         static vm_pindex_t colour;
1667         int bit, field;
1668         pv_entry_t pv;
1669         struct pv_chunk *pc;
1670         vm_page_t m;
1671
1672         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1673         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1674         PV_STAT(pv_entry_allocs++);
1675         pv_entry_count++;
1676         if (pv_entry_count > pv_entry_high_water)
1677                 pagedaemon_wakeup();
1678         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
1679         if (pc != NULL) {
1680                 for (field = 0; field < _NPCM; field++) {
1681                         if (pc->pc_map[field]) {
1682                                 bit = bsfq(pc->pc_map[field]);
1683                                 break;
1684                         }
1685                 }
1686                 if (field < _NPCM) {
1687                         pv = &pc->pc_pventry[field * 64 + bit];
1688                         pc->pc_map[field] &= ~(1ul << bit);
1689                         /* If this was the last item, move it to tail */
1690                         if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
1691                             pc->pc_map[2] == 0) {
1692                                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1693                                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
1694                         }
1695                         PV_STAT(pv_entry_spare--);
1696                         return (pv);
1697                 }
1698         }
1699         /* No free items, allocate another chunk */
1700         m = vm_page_alloc(NULL, colour, VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
1701         if (m == NULL) {
1702                 if (try) {
1703                         pv_entry_count--;
1704                         PV_STAT(pc_chunk_tryfail++);
1705                         return (NULL);
1706                 }
1707                 /*
1708                  * Reclaim pv entries: At first, destroy mappings to inactive
1709                  * pages.  After that, if a pv chunk entry is still needed,
1710                  * destroy mappings to active pages.
1711                  */
1712                 if (ratecheck(&lastprint, &printinterval))
1713                         printf("Approaching the limit on PV entries, consider "
1714                             "increasing sysctl vm.pmap.shpgperproc or "
1715                             "vm.pmap.pv_entry_max\n");
1716                 PV_STAT(pmap_collect_inactive++);
1717                 pmap_collect(pmap, &vm_page_queues[PQ_INACTIVE]);
1718                 m = vm_page_alloc(NULL, colour,
1719                     VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
1720                 if (m == NULL) {
1721                         PV_STAT(pmap_collect_active++);
1722                         pmap_collect(pmap, &vm_page_queues[PQ_ACTIVE]);
1723                         m = vm_page_alloc(NULL, colour,
1724                             VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
1725                         if (m == NULL)
1726                                 panic("get_pv_entry: increase vm.pmap.shpgperproc");
1727                 }
1728         }
1729         PV_STAT(pc_chunk_count++);
1730         PV_STAT(pc_chunk_allocs++);
1731         colour++;
1732         dump_add_page(m->phys_addr);
1733         pc = (void *)PHYS_TO_DMAP(m->phys_addr);
1734         pc->pc_pmap = pmap;
1735         pc->pc_map[0] = PC_FREE0 & ~1ul;        /* preallocated bit 0 */
1736         pc->pc_map[1] = PC_FREE1;
1737         pc->pc_map[2] = PC_FREE2;
1738         pv = &pc->pc_pventry[0];
1739         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1740         PV_STAT(pv_entry_spare += _NPCPV - 1);
1741         return (pv);
1742 }
1743
1744 static void
1745 pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
1746 {
1747         pv_entry_t pv;
1748
1749         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1750         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1751         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
1752                 if (pmap == PV_PMAP(pv) && va == pv->pv_va) 
1753                         break;
1754         }
1755         KASSERT(pv != NULL, ("pmap_remove_entry: pv not found"));
1756         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1757         m->md.pv_list_count--;
1758         if (TAILQ_EMPTY(&m->md.pv_list))
1759                 vm_page_flag_clear(m, PG_WRITEABLE);
1760         free_pv_entry(pmap, pv);
1761 }
1762
1763 /*
1764  * Create a pv entry for page at pa for
1765  * (pmap, va).
1766  */
1767 static void
1768 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
1769 {
1770         pv_entry_t pv;
1771
1772         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1773         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1774         pv = get_pv_entry(pmap, FALSE);
1775         pv->pv_va = va;
1776         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1777         m->md.pv_list_count++;
1778 }
1779
1780 /*
1781  * Conditionally create a pv entry.
1782  */
1783 static boolean_t
1784 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
1785 {
1786         pv_entry_t pv;
1787
1788         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1789         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1790         if (pv_entry_count < pv_entry_high_water && 
1791             (pv = get_pv_entry(pmap, TRUE)) != NULL) {
1792                 pv->pv_va = va;
1793                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1794                 m->md.pv_list_count++;
1795                 return (TRUE);
1796         } else
1797                 return (FALSE);
1798 }
1799
1800 /*
1801  * pmap_remove_pte: do the things to unmap a page in a process
1802  */
1803 static int
1804 pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, pd_entry_t ptepde)
1805 {
1806         pt_entry_t oldpte;
1807         vm_page_t m;
1808
1809         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1810         oldpte = pte_load_clear(ptq);
1811         if (oldpte & PG_W)
1812                 pmap->pm_stats.wired_count -= 1;
1813         /*
1814          * Machines that don't support invlpg, also don't support
1815          * PG_G.
1816          */
1817         if (oldpte & PG_G)
1818                 pmap_invalidate_page(kernel_pmap, va);
1819         pmap->pm_stats.resident_count -= 1;
1820         if (oldpte & PG_MANAGED) {
1821                 m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
1822                 if (oldpte & PG_M) {
1823                         KASSERT((oldpte & PG_RW),
1824         ("pmap_remove_pte: modified page not writable: va: %#lx, pte: %#lx",
1825                             va, oldpte));
1826                         vm_page_dirty(m);
1827                 }
1828                 if (oldpte & PG_A)
1829                         vm_page_flag_set(m, PG_REFERENCED);
1830                 pmap_remove_entry(pmap, m, va);
1831         }
1832         return (pmap_unuse_pt(pmap, va, ptepde));
1833 }
1834
1835 /*
1836  * Remove a single page from a process address space
1837  */
1838 static void
1839 pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde)
1840 {
1841         pt_entry_t *pte;
1842
1843         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1844         if ((*pde & PG_V) == 0)
1845                 return;
1846         pte = pmap_pde_to_pte(pde, va);
1847         if ((*pte & PG_V) == 0)
1848                 return;
1849         pmap_remove_pte(pmap, pte, va, *pde);
1850         pmap_invalidate_page(pmap, va);
1851 }
1852
1853 /*
1854  *      Remove the given range of addresses from the specified map.
1855  *
1856  *      It is assumed that the start and end are properly
1857  *      rounded to the page size.
1858  */
1859 void
1860 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
1861 {
1862         vm_offset_t va_next;
1863         pml4_entry_t *pml4e;
1864         pdp_entry_t *pdpe;
1865         pd_entry_t ptpaddr, *pde;
1866         pt_entry_t *pte;
1867         int anyvalid;
1868
1869         /*
1870          * Perform an unsynchronized read.  This is, however, safe.
1871          */
1872         if (pmap->pm_stats.resident_count == 0)
1873                 return;
1874
1875         anyvalid = 0;
1876
1877         vm_page_lock_queues();
1878         PMAP_LOCK(pmap);
1879
1880         /*
1881          * special handling of removing one page.  a very
1882          * common operation and easy to short circuit some
1883          * code.
1884          */
1885         if (sva + PAGE_SIZE == eva) {
1886                 pde = pmap_pde(pmap, sva);
1887                 if (pde && (*pde & PG_PS) == 0) {
1888                         pmap_remove_page(pmap, sva, pde);
1889                         goto out;
1890                 }
1891         }
1892
1893         for (; sva < eva; sva = va_next) {
1894
1895                 if (pmap->pm_stats.resident_count == 0)
1896                         break;
1897
1898                 pml4e = pmap_pml4e(pmap, sva);
1899                 if ((*pml4e & PG_V) == 0) {
1900                         va_next = (sva + NBPML4) & ~PML4MASK;
1901                         continue;
1902                 }
1903
1904                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
1905                 if ((*pdpe & PG_V) == 0) {
1906                         va_next = (sva + NBPDP) & ~PDPMASK;
1907                         continue;
1908                 }
1909
1910                 /*
1911                  * Calculate index for next page table.
1912                  */
1913                 va_next = (sva + NBPDR) & ~PDRMASK;
1914
1915                 pde = pmap_pdpe_to_pde(pdpe, sva);
1916                 ptpaddr = *pde;
1917
1918                 /*
1919                  * Weed out invalid mappings.
1920                  */
1921                 if (ptpaddr == 0)
1922                         continue;
1923
1924                 /*
1925                  * Check for large page.
1926                  */
1927                 if ((ptpaddr & PG_PS) != 0) {
1928                         *pde = 0;
1929                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1930                         pmap_unuse_pt(pmap, sva, *pdpe);
1931                         anyvalid = 1;
1932                         continue;
1933                 }
1934
1935                 /*
1936                  * Limit our scan to either the end of the va represented
1937                  * by the current page table page, or to the end of the
1938                  * range being removed.
1939                  */
1940                 if (va_next > eva)
1941                         va_next = eva;
1942
1943                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
1944                     sva += PAGE_SIZE) {
1945                         if (*pte == 0)
1946                                 continue;
1947
1948                         /*
1949                          * The TLB entry for a PG_G mapping is invalidated
1950                          * by pmap_remove_pte().
1951                          */
1952                         if ((*pte & PG_G) == 0)
1953                                 anyvalid = 1;
1954                         if (pmap_remove_pte(pmap, pte, sva, ptpaddr))
1955                                 break;
1956                 }
1957         }
1958 out:
1959         vm_page_unlock_queues();
1960         if (anyvalid)
1961                 pmap_invalidate_all(pmap);
1962         PMAP_UNLOCK(pmap);
1963 }
1964
1965 /*
1966  *      Routine:        pmap_remove_all
1967  *      Function:
1968  *              Removes this physical page from
1969  *              all physical maps in which it resides.
1970  *              Reflects back modify bits to the pager.
1971  *
1972  *      Notes:
1973  *              Original versions of this routine were very
1974  *              inefficient because they iteratively called
1975  *              pmap_remove (slow...)
1976  */
1977
1978 void
1979 pmap_remove_all(vm_page_t m)
1980 {
1981         register pv_entry_t pv;
1982         pmap_t pmap;
1983         pt_entry_t *pte, tpte;
1984         pd_entry_t ptepde;
1985
1986 #if defined(PMAP_DIAGNOSTIC)
1987         /*
1988          * XXX This makes pmap_remove_all() illegal for non-managed pages!
1989          */
1990         if (m->flags & PG_FICTITIOUS) {
1991                 panic("pmap_remove_all: illegal for unmanaged page, va: 0x%lx",
1992                     VM_PAGE_TO_PHYS(m));
1993         }
1994 #endif
1995         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1996         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
1997                 pmap = PV_PMAP(pv);
1998                 PMAP_LOCK(pmap);
1999                 pmap->pm_stats.resident_count--;
2000                 pte = pmap_pte_pde(pmap, pv->pv_va, &ptepde);
2001                 tpte = pte_load_clear(pte);
2002                 if (tpte & PG_W)
2003                         pmap->pm_stats.wired_count--;
2004                 if (tpte & PG_A)
2005                         vm_page_flag_set(m, PG_REFERENCED);
2006
2007                 /*
2008                  * Update the vm_page_t clean and reference bits.
2009                  */
2010                 if (tpte & PG_M) {
2011                         KASSERT((tpte & PG_RW),
2012         ("pmap_remove_all: modified page not writable: va: %#lx, pte: %#lx",
2013                             pv->pv_va, tpte));
2014                         vm_page_dirty(m);
2015                 }
2016                 pmap_invalidate_page(pmap, pv->pv_va);
2017                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2018                 m->md.pv_list_count--;
2019                 pmap_unuse_pt(pmap, pv->pv_va, ptepde);
2020                 PMAP_UNLOCK(pmap);
2021                 free_pv_entry(pmap, pv);
2022         }
2023         vm_page_flag_clear(m, PG_WRITEABLE);
2024 }
2025
2026 /*
2027  *      Set the physical protection on the
2028  *      specified range of this map as requested.
2029  */
2030 void
2031 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2032 {
2033         vm_offset_t va_next;
2034         pml4_entry_t *pml4e;
2035         pdp_entry_t *pdpe;
2036         pd_entry_t ptpaddr, *pde;
2037         pt_entry_t *pte;
2038         int anychanged;
2039
2040         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2041                 pmap_remove(pmap, sva, eva);
2042                 return;
2043         }
2044
2045         if (prot & VM_PROT_WRITE)
2046                 return;
2047
2048         anychanged = 0;
2049
2050         vm_page_lock_queues();
2051         PMAP_LOCK(pmap);
2052         for (; sva < eva; sva = va_next) {
2053
2054                 pml4e = pmap_pml4e(pmap, sva);
2055                 if ((*pml4e & PG_V) == 0) {
2056                         va_next = (sva + NBPML4) & ~PML4MASK;
2057                         continue;
2058                 }
2059
2060                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
2061                 if ((*pdpe & PG_V) == 0) {
2062                         va_next = (sva + NBPDP) & ~PDPMASK;
2063                         continue;
2064                 }
2065
2066                 va_next = (sva + NBPDR) & ~PDRMASK;
2067
2068                 pde = pmap_pdpe_to_pde(pdpe, sva);
2069                 ptpaddr = *pde;
2070
2071                 /*
2072                  * Weed out invalid mappings.
2073                  */
2074                 if (ptpaddr == 0)
2075                         continue;
2076
2077                 /*
2078                  * Check for large page.
2079                  */
2080                 if ((ptpaddr & PG_PS) != 0) {
2081                         *pde &= ~(PG_M|PG_RW);
2082                         anychanged = 1;
2083                         continue;
2084                 }
2085
2086                 if (va_next > eva)
2087                         va_next = eva;
2088
2089                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
2090                     sva += PAGE_SIZE) {
2091                         pt_entry_t obits, pbits;
2092                         vm_page_t m;
2093
2094 retry:
2095                         obits = pbits = *pte;
2096                         if (pbits & PG_MANAGED) {
2097                                 m = NULL;
2098                                 if (pbits & PG_A) {
2099                                         m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
2100                                         vm_page_flag_set(m, PG_REFERENCED);
2101                                         pbits &= ~PG_A;
2102                                 }
2103                                 if ((pbits & PG_M) != 0) {
2104                                         if (m == NULL)
2105                                                 m = PHYS_TO_VM_PAGE(pbits &
2106                                                     PG_FRAME);
2107                                         vm_page_dirty(m);
2108                                 }
2109                         }
2110
2111                         pbits &= ~(PG_RW | PG_M);
2112
2113                         if (pbits != obits) {
2114                                 if (!atomic_cmpset_long(pte, obits, pbits))
2115                                         goto retry;
2116                                 if (obits & PG_G)
2117                                         pmap_invalidate_page(pmap, sva);
2118                                 else
2119                                         anychanged = 1;
2120                         }
2121                 }
2122         }
2123         vm_page_unlock_queues();
2124         if (anychanged)
2125                 pmap_invalidate_all(pmap);
2126         PMAP_UNLOCK(pmap);
2127 }
2128
2129 /*
2130  *      Insert the given physical page (p) at
2131  *      the specified virtual address (v) in the
2132  *      target physical map with the protection requested.
2133  *
2134  *      If specified, the page will be wired down, meaning
2135  *      that the related pte can not be reclaimed.
2136  *
2137  *      NB:  This is the only routine which MAY NOT lazy-evaluate
2138  *      or lose information.  That is, this routine must actually
2139  *      insert this page into the given map NOW.
2140  */
2141 void
2142 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2143            boolean_t wired)
2144 {
2145         vm_paddr_t pa;
2146         pd_entry_t *pde;
2147         register pt_entry_t *pte;
2148         vm_paddr_t opa;
2149         pt_entry_t origpte, newpte;
2150         vm_page_t mpte, om;
2151         boolean_t invlva;
2152
2153         va = trunc_page(va);
2154 #ifdef PMAP_DIAGNOSTIC
2155         if (va > VM_MAX_KERNEL_ADDRESS)
2156                 panic("pmap_enter: toobig");
2157         if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS))
2158                 panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", va);
2159 #endif
2160
2161         mpte = NULL;
2162
2163         vm_page_lock_queues();
2164         PMAP_LOCK(pmap);
2165
2166         /*
2167          * In the case that a page table page is not
2168          * resident, we are creating it here.
2169          */
2170         if (va < VM_MAXUSER_ADDRESS) {
2171                 mpte = pmap_allocpte(pmap, va, M_WAITOK);
2172         }
2173 #if 0 && defined(PMAP_DIAGNOSTIC)
2174         else {
2175                 pd_entry_t *pdeaddr = pmap_pde(pmap, va);
2176                 origpte = *pdeaddr;
2177                 if ((origpte & PG_V) == 0) { 
2178                         panic("pmap_enter: invalid kernel page table page, pde=%p, va=%p\n",
2179                                 origpte, va);
2180                 }
2181         }
2182 #endif
2183
2184         pde = pmap_pde(pmap, va);
2185         if (pde != NULL) {
2186                 if ((*pde & PG_PS) != 0)
2187                         panic("pmap_enter: attempted pmap_enter on 2MB page");
2188                 pte = pmap_pde_to_pte(pde, va);
2189         } else
2190                 pte = NULL;
2191
2192         /*
2193          * Page Directory table entry not valid, we need a new PT page
2194          */
2195         if (pte == NULL)
2196                 panic("pmap_enter: invalid page directory va=%#lx\n", va);
2197
2198         pa = VM_PAGE_TO_PHYS(m);
2199         om = NULL;
2200         origpte = *pte;
2201         opa = origpte & PG_FRAME;
2202
2203         /*
2204          * Mapping has not changed, must be protection or wiring change.
2205          */
2206         if (origpte && (opa == pa)) {
2207                 /*
2208                  * Wiring change, just update stats. We don't worry about
2209                  * wiring PT pages as they remain resident as long as there
2210                  * are valid mappings in them. Hence, if a user page is wired,
2211                  * the PT page will be also.
2212                  */
2213                 if (wired && ((origpte & PG_W) == 0))
2214                         pmap->pm_stats.wired_count++;
2215                 else if (!wired && (origpte & PG_W))
2216                         pmap->pm_stats.wired_count--;
2217
2218                 /*
2219                  * Remove extra pte reference
2220                  */
2221                 if (mpte)
2222                         mpte->wire_count--;
2223
2224                 /*
2225                  * We might be turning off write access to the page,
2226                  * so we go ahead and sense modify status.
2227                  */
2228                 if (origpte & PG_MANAGED) {
2229                         om = m;
2230                         pa |= PG_MANAGED;
2231                 }
2232                 goto validate;
2233         } 
2234         /*
2235          * Mapping has changed, invalidate old range and fall through to
2236          * handle validating new mapping.
2237          */
2238         if (opa) {
2239                 if (origpte & PG_W)
2240                         pmap->pm_stats.wired_count--;
2241                 if (origpte & PG_MANAGED) {
2242                         om = PHYS_TO_VM_PAGE(opa);
2243                         pmap_remove_entry(pmap, om, va);
2244                 }
2245                 if (mpte != NULL) {
2246                         mpte->wire_count--;
2247                         KASSERT(mpte->wire_count > 0,
2248                             ("pmap_enter: missing reference to page table page,"
2249                              " va: 0x%lx", va));
2250                 }
2251         } else
2252                 pmap->pm_stats.resident_count++;
2253
2254         /*
2255          * Enter on the PV list if part of our managed memory.
2256          */
2257         if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
2258                 KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
2259                     ("pmap_enter: managed mapping within the clean submap"));
2260                 pmap_insert_entry(pmap, va, m);
2261                 pa |= PG_MANAGED;
2262         }
2263
2264         /*
2265          * Increment counters
2266          */
2267         if (wired)
2268                 pmap->pm_stats.wired_count++;
2269
2270 validate:
2271         /*
2272          * Now validate mapping with desired protection/wiring.
2273          */
2274         newpte = (pt_entry_t)(pa | PG_V);
2275         if ((prot & VM_PROT_WRITE) != 0)
2276                 newpte |= PG_RW;
2277         if ((prot & VM_PROT_EXECUTE) == 0)
2278                 newpte |= pg_nx;
2279         if (wired)
2280                 newpte |= PG_W;
2281         if (va < VM_MAXUSER_ADDRESS)
2282                 newpte |= PG_U;
2283         if (pmap == kernel_pmap)
2284                 newpte |= PG_G;
2285
2286         /*
2287          * if the mapping or permission bits are different, we need
2288          * to update the pte.
2289          */
2290         if ((origpte & ~(PG_M|PG_A)) != newpte) {
2291                 if (origpte & PG_V) {
2292                         invlva = FALSE;
2293                         origpte = pte_load_store(pte, newpte | PG_A);
2294                         if (origpte & PG_A) {
2295                                 if (origpte & PG_MANAGED)
2296                                         vm_page_flag_set(om, PG_REFERENCED);
2297                                 if (opa != VM_PAGE_TO_PHYS(m) || ((origpte &
2298                                     PG_NX) == 0 && (newpte & PG_NX)))
2299                                         invlva = TRUE;
2300                         }
2301                         if (origpte & PG_M) {
2302                                 KASSERT((origpte & PG_RW),
2303         ("pmap_enter: modified page not writable: va: %#lx, pte: %#lx",
2304                                     va, origpte));
2305                                 if ((origpte & PG_MANAGED) != 0)
2306                                         vm_page_dirty(om);
2307                                 if ((newpte & PG_RW) == 0)
2308                                         invlva = TRUE;
2309                         }
2310                         if (invlva)
2311                                 pmap_invalidate_page(pmap, va);
2312                 } else
2313                         pte_store(pte, newpte | PG_A);
2314         }
2315         vm_page_unlock_queues();
2316         PMAP_UNLOCK(pmap);
2317 }
2318
2319 /*
2320  * Maps a sequence of resident pages belonging to the same object.
2321  * The sequence begins with the given page m_start.  This page is
2322  * mapped at the given virtual address start.  Each subsequent page is
2323  * mapped at a virtual address that is offset from start by the same
2324  * amount as the page is offset from m_start within the object.  The
2325  * last page in the sequence is the page with the largest offset from
2326  * m_start that can be mapped at a virtual address less than the given
2327  * virtual address end.  Not every virtual page between start and end
2328  * is mapped; only those for which a resident page exists with the
2329  * corresponding offset from m_start are mapped.
2330  */
2331 void
2332 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
2333     vm_page_t m_start, vm_prot_t prot)
2334 {
2335         vm_page_t m, mpte;
2336         vm_pindex_t diff, psize;
2337
2338         psize = atop(end - start);
2339         mpte = NULL;
2340         m = m_start;
2341         PMAP_LOCK(pmap);
2342         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
2343                 mpte = pmap_enter_quick_locked(pmap, start + ptoa(diff), m,
2344                     prot, mpte);
2345                 m = TAILQ_NEXT(m, listq);
2346         }
2347         PMAP_UNLOCK(pmap);
2348 }
2349
2350 /*
2351  * this code makes some *MAJOR* assumptions:
2352  * 1. Current pmap & pmap exists.
2353  * 2. Not wired.
2354  * 3. Read access.
2355  * 4. No page table pages.
2356  * but is *MUCH* faster than pmap_enter...
2357  */
2358
2359 vm_page_t
2360 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2361     vm_page_t mpte)
2362 {
2363
2364         PMAP_LOCK(pmap);
2365         mpte = pmap_enter_quick_locked(pmap, va, m, prot, mpte);
2366         PMAP_UNLOCK(pmap);
2367         return (mpte);
2368 }
2369
2370 static vm_page_t
2371 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
2372     vm_prot_t prot, vm_page_t mpte)
2373 {
2374         pt_entry_t *pte;
2375         vm_paddr_t pa;
2376
2377         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
2378             (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0,
2379             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
2380         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2381         VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
2382         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2383
2384         /*
2385          * In the case that a page table page is not
2386          * resident, we are creating it here.
2387          */
2388         if (va < VM_MAXUSER_ADDRESS) {
2389                 vm_pindex_t ptepindex;
2390                 pd_entry_t *ptepa;
2391
2392                 /*
2393                  * Calculate pagetable page index
2394                  */
2395                 ptepindex = pmap_pde_pindex(va);
2396                 if (mpte && (mpte->pindex == ptepindex)) {
2397                         mpte->wire_count++;
2398                 } else {
2399         retry:
2400                         /*
2401                          * Get the page directory entry
2402                          */
2403                         ptepa = pmap_pde(pmap, va);
2404
2405                         /*
2406                          * If the page table page is mapped, we just increment
2407                          * the hold count, and activate it.
2408                          */
2409                         if (ptepa && (*ptepa & PG_V) != 0) {
2410                                 if (*ptepa & PG_PS)
2411                                         panic("pmap_enter_quick: unexpected mapping into 2MB page");
2412                                 mpte = PHYS_TO_VM_PAGE(*ptepa & PG_FRAME);
2413                                 mpte->wire_count++;
2414                         } else {
2415                                 mpte = _pmap_allocpte(pmap, ptepindex,
2416                                     M_NOWAIT);
2417                                 if (mpte == NULL) {
2418                                         PMAP_UNLOCK(pmap);
2419                                         vm_page_busy(m);
2420                                         vm_page_unlock_queues();
2421                                         VM_OBJECT_UNLOCK(m->object);
2422                                         VM_WAIT;
2423                                         VM_OBJECT_LOCK(m->object);
2424                                         vm_page_lock_queues();
2425                                         vm_page_wakeup(m);
2426                                         PMAP_LOCK(pmap);
2427                                         goto retry;
2428                                 }
2429                         }
2430                 }
2431         } else {
2432                 mpte = NULL;
2433         }
2434
2435         /*
2436          * This call to vtopte makes the assumption that we are
2437          * entering the page into the current pmap.  In order to support
2438          * quick entry into any pmap, one would likely use pmap_pte.
2439          * But that isn't as quick as vtopte.
2440          */
2441         pte = vtopte(va);
2442         if (*pte) {
2443                 if (mpte != NULL) {
2444                         pmap_unwire_pte_hold(pmap, va, mpte);
2445                         mpte = NULL;
2446                 }
2447                 return (mpte);
2448         }
2449
2450         /*
2451          * Enter on the PV list if part of our managed memory. Note that we
2452          * raise IPL while manipulating pv_table since pmap_enter can be
2453          * called at interrupt time.
2454          */
2455         if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0)
2456                 pmap_insert_entry(pmap, va, m);
2457
2458         /*
2459          * Increment counters
2460          */
2461         pmap->pm_stats.resident_count++;
2462
2463         pa = VM_PAGE_TO_PHYS(m);
2464         if ((prot & VM_PROT_EXECUTE) == 0)
2465                 pa |= pg_nx;
2466
2467         /*
2468          * Now validate mapping with RO protection
2469          */
2470         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
2471                 pte_store(pte, pa | PG_V | PG_U);
2472         else
2473                 pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
2474         return mpte;
2475 }
2476
2477 /*
2478  * Make a temporary mapping for a physical address.  This is only intended
2479  * to be used for panic dumps.
2480  */
2481 void *
2482 pmap_kenter_temporary(vm_paddr_t pa, int i)
2483 {
2484         vm_offset_t va;
2485
2486         va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
2487         pmap_kenter(va, pa);
2488         invlpg(va);
2489         return ((void *)crashdumpmap);
2490 }
2491
2492 /*
2493  * This code maps large physical mmap regions into the
2494  * processor address space.  Note that some shortcuts
2495  * are taken, but the code works.
2496  */
2497 void
2498 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
2499                     vm_object_t object, vm_pindex_t pindex,
2500                     vm_size_t size)
2501 {
2502         vm_offset_t va;
2503         vm_page_t p, pdpg;
2504
2505         VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
2506         KASSERT(object->type == OBJT_DEVICE,
2507             ("pmap_object_init_pt: non-device object"));
2508         if (((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) {
2509                 vm_page_t m[1];
2510                 pd_entry_t ptepa, *pde;
2511
2512                 PMAP_LOCK(pmap);
2513                 pde = pmap_pde(pmap, addr);
2514                 if (pde != 0 && (*pde & PG_V) != 0)
2515                         goto out;
2516                 PMAP_UNLOCK(pmap);
2517 retry:
2518                 p = vm_page_lookup(object, pindex);
2519                 if (p != NULL) {
2520                         vm_page_lock_queues();
2521                         if (vm_page_sleep_if_busy(p, FALSE, "init4p"))
2522                                 goto retry;
2523                 } else {
2524                         p = vm_page_alloc(object, pindex, VM_ALLOC_NORMAL);
2525                         if (p == NULL)
2526                                 return;
2527                         m[0] = p;
2528
2529                         if (vm_pager_get_pages(object, m, 1, 0) != VM_PAGER_OK) {
2530                                 vm_page_lock_queues();
2531                                 vm_page_free(p);
2532                                 vm_page_unlock_queues();
2533                                 return;
2534                         }
2535
2536                         p = vm_page_lookup(object, pindex);
2537                         vm_page_lock_queues();
2538                         vm_page_wakeup(p);
2539                 }
2540                 vm_page_unlock_queues();
2541
2542                 ptepa = VM_PAGE_TO_PHYS(p);
2543                 if (ptepa & (NBPDR - 1))
2544                         return;
2545
2546                 p->valid = VM_PAGE_BITS_ALL;
2547
2548                 PMAP_LOCK(pmap);
2549                 for (va = addr; va < addr + size; va += NBPDR) {
2550                         while ((pdpg =
2551                             pmap_allocpde(pmap, va, M_NOWAIT)) == NULL) {
2552                                 PMAP_UNLOCK(pmap);
2553                                 vm_page_lock_queues();
2554                                 vm_page_busy(p);
2555                                 vm_page_unlock_queues();
2556                                 VM_OBJECT_UNLOCK(object);
2557                                 VM_WAIT;
2558                                 VM_OBJECT_LOCK(object);
2559                                 vm_page_lock_queues();
2560                                 vm_page_wakeup(p);
2561                                 vm_page_unlock_queues();
2562                                 PMAP_LOCK(pmap);
2563                         }
2564                         pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg));
2565                         pde = &pde[pmap_pde_index(va)];
2566                         if ((*pde & PG_V) == 0) {
2567                                 pde_store(pde, ptepa | PG_PS | PG_M | PG_A |
2568                                     PG_U | PG_RW | PG_V);
2569                                 pmap->pm_stats.resident_count +=
2570                                     NBPDR / PAGE_SIZE;
2571                         } else {
2572                                 pdpg->wire_count--;
2573                                 KASSERT(pdpg->wire_count > 0,
2574                                     ("pmap_object_init_pt: missing reference "
2575                                      "to page directory page, va: 0x%lx", va));
2576                         }
2577                         ptepa += NBPDR;
2578                 }
2579                 pmap_invalidate_all(pmap);
2580 out:
2581                 PMAP_UNLOCK(pmap);
2582         }
2583 }
2584
2585 /*
2586  *      Routine:        pmap_change_wiring
2587  *      Function:       Change the wiring attribute for a map/virtual-address
2588  *                      pair.
2589  *      In/out conditions:
2590  *                      The mapping must already exist in the pmap.
2591  */
2592 void
2593 pmap_change_wiring(pmap, va, wired)
2594         register pmap_t pmap;
2595         vm_offset_t va;
2596         boolean_t wired;
2597 {
2598         register pt_entry_t *pte;
2599
2600         /*
2601          * Wiring is not a hardware characteristic so there is no need to
2602          * invalidate TLB.
2603          */
2604         PMAP_LOCK(pmap);
2605         pte = pmap_pte(pmap, va);
2606         if (wired && (*pte & PG_W) == 0) {
2607                 pmap->pm_stats.wired_count++;
2608                 atomic_set_long(pte, PG_W);
2609         } else if (!wired && (*pte & PG_W) != 0) {
2610                 pmap->pm_stats.wired_count--;
2611                 atomic_clear_long(pte, PG_W);
2612         }
2613         PMAP_UNLOCK(pmap);
2614 }
2615
2616
2617
2618 /*
2619  *      Copy the range specified by src_addr/len
2620  *      from the source map to the range dst_addr/len
2621  *      in the destination map.
2622  *
2623  *      This routine is only advisory and need not do anything.
2624  */
2625
2626 void
2627 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
2628           vm_offset_t src_addr)
2629 {
2630         vm_offset_t addr;
2631         vm_offset_t end_addr = src_addr + len;
2632         vm_offset_t va_next;
2633
2634         if (dst_addr != src_addr)
2635                 return;
2636
2637         if (!pmap_is_current(src_pmap))
2638                 return;
2639
2640         vm_page_lock_queues();
2641         if (dst_pmap < src_pmap) {
2642                 PMAP_LOCK(dst_pmap);
2643                 PMAP_LOCK(src_pmap);
2644         } else {
2645                 PMAP_LOCK(src_pmap);
2646                 PMAP_LOCK(dst_pmap);
2647         }
2648         for (addr = src_addr; addr < end_addr; addr = va_next) {
2649                 pt_entry_t *src_pte, *dst_pte;
2650                 vm_page_t dstmpde, dstmpte, srcmpte;
2651                 pml4_entry_t *pml4e;
2652                 pdp_entry_t *pdpe;
2653                 pd_entry_t srcptepaddr, *pde;
2654
2655                 if (addr >= UPT_MIN_ADDRESS)
2656                         panic("pmap_copy: invalid to pmap_copy page tables");
2657
2658                 pml4e = pmap_pml4e(src_pmap, addr);
2659                 if ((*pml4e & PG_V) == 0) {
2660                         va_next = (addr + NBPML4) & ~PML4MASK;
2661                         continue;
2662                 }
2663
2664                 pdpe = pmap_pml4e_to_pdpe(pml4e, addr);
2665                 if ((*pdpe & PG_V) == 0) {
2666                         va_next = (addr + NBPDP) & ~PDPMASK;
2667                         continue;
2668                 }
2669
2670                 va_next = (addr + NBPDR) & ~PDRMASK;
2671
2672                 pde = pmap_pdpe_to_pde(pdpe, addr);
2673                 srcptepaddr = *pde;
2674                 if (srcptepaddr == 0)
2675                         continue;
2676                         
2677                 if (srcptepaddr & PG_PS) {
2678                         dstmpde = pmap_allocpde(dst_pmap, addr, M_NOWAIT);
2679                         if (dstmpde == NULL)
2680                                 break;
2681                         pde = (pd_entry_t *)
2682                             PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde));
2683                         pde = &pde[pmap_pde_index(addr)];
2684                         if (*pde == 0) {
2685                                 *pde = srcptepaddr;
2686                                 dst_pmap->pm_stats.resident_count +=
2687                                     NBPDR / PAGE_SIZE;
2688                         } else
2689                                 pmap_unwire_pte_hold(dst_pmap, addr, dstmpde);
2690                         continue;
2691                 }
2692
2693                 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr & PG_FRAME);
2694                 if (srcmpte->wire_count == 0)
2695                         panic("pmap_copy: source page table page is unused");
2696
2697                 if (va_next > end_addr)
2698                         va_next = end_addr;
2699
2700                 src_pte = vtopte(addr);
2701                 while (addr < va_next) {
2702                         pt_entry_t ptetemp;
2703                         ptetemp = *src_pte;
2704                         /*
2705                          * we only virtual copy managed pages
2706                          */
2707                         if ((ptetemp & PG_MANAGED) != 0) {
2708                                 /*
2709                                  * We have to check after allocpte for the
2710                                  * pte still being around...  allocpte can
2711                                  * block.
2712                                  */
2713                                 dstmpte = pmap_allocpte(dst_pmap, addr,
2714                                     M_NOWAIT);
2715                                 if (dstmpte == NULL)
2716                                         break;
2717                                 dst_pte = (pt_entry_t *)
2718                                     PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpte));
2719                                 dst_pte = &dst_pte[pmap_pte_index(addr)];
2720                                 if (*dst_pte == 0 &&
2721                                     pmap_try_insert_pv_entry(dst_pmap, addr,
2722                                     PHYS_TO_VM_PAGE(ptetemp & PG_FRAME))) {
2723                                         /*
2724                                          * Clear the modified and
2725                                          * accessed (referenced) bits
2726                                          * during the copy.
2727                                          */
2728                                         *dst_pte = ptetemp & ~(PG_M | PG_A);
2729                                         dst_pmap->pm_stats.resident_count++;
2730                                 } else
2731                                         pmap_unwire_pte_hold(dst_pmap, addr, dstmpte);
2732                                 if (dstmpte->wire_count >= srcmpte->wire_count)
2733                                         break;
2734                         }
2735                         addr += PAGE_SIZE;
2736                         src_pte++;
2737                 }
2738         }
2739         vm_page_unlock_queues();
2740         PMAP_UNLOCK(src_pmap);
2741         PMAP_UNLOCK(dst_pmap);
2742 }       
2743
2744 /*
2745  *      pmap_zero_page zeros the specified hardware page by mapping 
2746  *      the page into KVM and using bzero to clear its contents.
2747  */
2748 void
2749 pmap_zero_page(vm_page_t m)
2750 {
2751         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
2752
2753         pagezero((void *)va);
2754 }
2755
2756 /*
2757  *      pmap_zero_page_area zeros the specified hardware page by mapping 
2758  *      the page into KVM and using bzero to clear its contents.
2759  *
2760  *      off and size may not cover an area beyond a single hardware page.
2761  */
2762 void
2763 pmap_zero_page_area(vm_page_t m, int off, int size)
2764 {
2765         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
2766
2767         if (off == 0 && size == PAGE_SIZE)
2768                 pagezero((void *)va);
2769         else
2770                 bzero((char *)va + off, size);
2771 }
2772
2773 /*
2774  *      pmap_zero_page_idle zeros the specified hardware page by mapping 
2775  *      the page into KVM and using bzero to clear its contents.  This
2776  *      is intended to be called from the vm_pagezero process only and
2777  *      outside of Giant.
2778  */
2779 void
2780 pmap_zero_page_idle(vm_page_t m)
2781 {
2782         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
2783
2784         pagezero((void *)va);
2785 }
2786
2787 /*
2788  *      pmap_copy_page copies the specified (machine independent)
2789  *      page by mapping the page into virtual memory and using
2790  *      bcopy to copy the page, one machine dependent page at a
2791  *      time.
2792  */
2793 void
2794 pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
2795 {
2796         vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
2797         vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
2798
2799         pagecopy((void *)src, (void *)dst);
2800 }
2801
2802 /*
2803  * Returns true if the pmap's pv is one of the first
2804  * 16 pvs linked to from this page.  This count may
2805  * be changed upwards or downwards in the future; it
2806  * is only necessary that true be returned for a small
2807  * subset of pmaps for proper page aging.
2808  */
2809 boolean_t
2810 pmap_page_exists_quick(pmap, m)
2811         pmap_t pmap;
2812         vm_page_t m;
2813 {
2814         pv_entry_t pv;
2815         int loops = 0;
2816
2817         if (m->flags & PG_FICTITIOUS)
2818                 return FALSE;
2819
2820         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2821         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2822                 if (PV_PMAP(pv) == pmap) {
2823                         return TRUE;
2824                 }
2825                 loops++;
2826                 if (loops >= 16)
2827                         break;
2828         }
2829         return (FALSE);
2830 }
2831
2832 /*
2833  * Remove all pages from specified address space
2834  * this aids process exit speeds.  Also, this code
2835  * is special cased for current process only, but
2836  * can have the more generic (and slightly slower)
2837  * mode enabled.  This is much faster than pmap_remove
2838  * in the case of running down an entire address space.
2839  */
2840 void
2841 pmap_remove_pages(pmap_t pmap)
2842 {
2843         pt_entry_t *pte, tpte;
2844         vm_page_t m;
2845         pv_entry_t pv;
2846         struct pv_chunk *pc, *npc;
2847         int field, idx;
2848         int64_t bit;
2849         uint64_t inuse, bitmask;
2850         int allfree;
2851
2852         if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) {
2853                 printf("warning: pmap_remove_pages called with non-current pmap\n");
2854                 return;
2855         }
2856         vm_page_lock_queues();
2857         PMAP_LOCK(pmap);
2858         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
2859                 allfree = 1;
2860                 for (field = 0; field < _NPCM; field++) {
2861                         inuse = (~(pc->pc_map[field])) & pc_freemask[field];
2862                         while (inuse != 0) {
2863                                 bit = bsfq(inuse);
2864                                 bitmask = 1UL << bit;
2865                                 idx = field * 64 + bit;
2866                                 pv = &pc->pc_pventry[idx];
2867                                 inuse &= ~bitmask;
2868
2869                                 pte = vtopte(pv->pv_va);
2870                                 tpte = *pte;
2871
2872                                 if (tpte == 0) {
2873                                         printf(
2874                                             "TPTE at %p  IS ZERO @ VA %08lx\n",
2875                                             pte, pv->pv_va);
2876                                         panic("bad pte");
2877                                 }
2878
2879 /*
2880  * We cannot remove wired pages from a process' mapping at this time
2881  */
2882                                 if (tpte & PG_W) {
2883                                         allfree = 0;
2884                                         continue;
2885                                 }
2886
2887                                 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
2888                                 KASSERT(m->phys_addr == (tpte & PG_FRAME),
2889                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
2890                                     m, (uintmax_t)m->phys_addr,
2891                                     (uintmax_t)tpte));
2892
2893                                 KASSERT(m < &vm_page_array[vm_page_array_size],
2894                                         ("pmap_remove_pages: bad tpte %#jx",
2895                                         (uintmax_t)tpte));
2896
2897                                 pmap->pm_stats.resident_count--;
2898
2899                                 pte_clear(pte);
2900
2901                                 /*
2902                                  * Update the vm_page_t clean/reference bits.
2903                                  */
2904                                 if (tpte & PG_M)
2905                                         vm_page_dirty(m);
2906
2907                                 /* Mark free */
2908                                 PV_STAT(pv_entry_frees++);
2909                                 PV_STAT(pv_entry_spare++);
2910                                 pv_entry_count--;
2911                                 pc->pc_map[field] |= bitmask;
2912                                 m->md.pv_list_count--;
2913                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2914                                 if (TAILQ_EMPTY(&m->md.pv_list))
2915                                         vm_page_flag_clear(m, PG_WRITEABLE);
2916                                 pmap_unuse_pt(pmap, pv->pv_va,
2917                                     *vtopde(pv->pv_va));
2918                         }
2919                 }
2920                 if (allfree) {
2921                         PV_STAT(pv_entry_spare -= _NPCPV);
2922                         PV_STAT(pc_chunk_count--);
2923                         PV_STAT(pc_chunk_frees++);
2924                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2925                         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
2926                         dump_drop_page(m->phys_addr);
2927                         vm_page_free(m);
2928                 }
2929         }
2930         vm_page_unlock_queues();
2931         pmap_invalidate_all(pmap);
2932         PMAP_UNLOCK(pmap);
2933 }
2934
2935 /*
2936  *      pmap_is_modified:
2937  *
2938  *      Return whether or not the specified physical page was modified
2939  *      in any physical maps.
2940  */
2941 boolean_t
2942 pmap_is_modified(vm_page_t m)
2943 {
2944         pv_entry_t pv;
2945         pt_entry_t *pte;
2946         pmap_t pmap;
2947         boolean_t rv;
2948
2949         rv = FALSE;
2950         if (m->flags & PG_FICTITIOUS)
2951                 return (rv);
2952
2953         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2954         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2955                 pmap = PV_PMAP(pv);
2956                 PMAP_LOCK(pmap);
2957                 pte = pmap_pte(pmap, pv->pv_va);
2958                 rv = (*pte & PG_M) != 0;
2959                 PMAP_UNLOCK(pmap);
2960                 if (rv)
2961                         break;
2962         }
2963         return (rv);
2964 }
2965
2966 /*
2967  *      pmap_is_prefaultable:
2968  *
2969  *      Return whether or not the specified virtual address is elgible
2970  *      for prefault.
2971  */
2972 boolean_t
2973 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
2974 {
2975         pd_entry_t *pde;
2976         pt_entry_t *pte;
2977         boolean_t rv;
2978
2979         rv = FALSE;
2980         PMAP_LOCK(pmap);
2981         pde = pmap_pde(pmap, addr);
2982         if (pde != NULL && (*pde & PG_V)) {
2983                 pte = vtopte(addr);
2984                 rv = (*pte & PG_V) == 0;
2985         }
2986         PMAP_UNLOCK(pmap);
2987         return (rv);
2988 }
2989
2990 /*
2991  *      Clear the given bit in each of the given page's ptes.
2992  */
2993 static __inline void
2994 pmap_clear_ptes(vm_page_t m, long bit)
2995 {
2996         register pv_entry_t pv;
2997         pmap_t pmap;
2998         pt_entry_t pbits, *pte;
2999
3000         if ((m->flags & PG_FICTITIOUS) ||
3001             (bit == PG_RW && (m->flags & PG_WRITEABLE) == 0))
3002                 return;
3003
3004         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3005         /*
3006          * Loop over all current mappings setting/clearing as appropos If
3007          * setting RO do we need to clear the VAC?
3008          */
3009         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3010                 pmap = PV_PMAP(pv);
3011                 PMAP_LOCK(pmap);
3012                 pte = pmap_pte(pmap, pv->pv_va);
3013 retry:
3014                 pbits = *pte;
3015                 if (pbits & bit) {
3016                         if (bit == PG_RW) {
3017                                 if (!atomic_cmpset_long(pte, pbits,
3018                                     pbits & ~(PG_RW | PG_M)))
3019                                         goto retry;
3020                                 if (pbits & PG_M) {
3021                                         vm_page_dirty(m);
3022                                 }
3023                         } else {
3024                                 atomic_clear_long(pte, bit);
3025                         }
3026                         pmap_invalidate_page(pmap, pv->pv_va);
3027                 }
3028                 PMAP_UNLOCK(pmap);
3029         }
3030         if (bit == PG_RW)
3031                 vm_page_flag_clear(m, PG_WRITEABLE);
3032 }
3033
3034 /*
3035  *      pmap_page_protect:
3036  *
3037  *      Lower the permission for all mappings to a given page.
3038  */
3039 void
3040 pmap_page_protect(vm_page_t m, vm_prot_t prot)
3041 {
3042         if ((prot & VM_PROT_WRITE) == 0) {
3043                 if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
3044                         pmap_clear_ptes(m, PG_RW);
3045                 } else {
3046                         pmap_remove_all(m);
3047                 }
3048         }
3049 }
3050
3051 /*
3052  *      pmap_ts_referenced:
3053  *
3054  *      Return a count of reference bits for a page, clearing those bits.
3055  *      It is not necessary for every reference bit to be cleared, but it
3056  *      is necessary that 0 only be returned when there are truly no
3057  *      reference bits set.
3058  *
3059  *      XXX: The exact number of bits to check and clear is a matter that
3060  *      should be tested and standardized at some point in the future for
3061  *      optimal aging of shared pages.
3062  */
3063 int
3064 pmap_ts_referenced(vm_page_t m)
3065 {
3066         register pv_entry_t pv, pvf, pvn;
3067         pmap_t pmap;
3068         pt_entry_t *pte;
3069         pt_entry_t v;
3070         int rtval = 0;
3071
3072         if (m->flags & PG_FICTITIOUS)
3073                 return (rtval);
3074
3075         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3076         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3077
3078                 pvf = pv;
3079
3080                 do {
3081                         pvn = TAILQ_NEXT(pv, pv_list);
3082
3083                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3084
3085                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3086
3087                         pmap = PV_PMAP(pv);
3088                         PMAP_LOCK(pmap);
3089                         pte = pmap_pte(pmap, pv->pv_va);
3090
3091                         if (pte && ((v = pte_load(pte)) & PG_A) != 0) {
3092                                 atomic_clear_long(pte, PG_A);
3093                                 pmap_invalidate_page(pmap, pv->pv_va);
3094
3095                                 rtval++;
3096                                 if (rtval > 4) {
3097                                         PMAP_UNLOCK(pmap);
3098                                         break;
3099                                 }
3100                         }
3101                         PMAP_UNLOCK(pmap);
3102                 } while ((pv = pvn) != NULL && pv != pvf);
3103         }
3104
3105         return (rtval);
3106 }
3107
3108 /*
3109  *      Clear the modify bits on the specified physical page.
3110  */
3111 void
3112 pmap_clear_modify(vm_page_t m)
3113 {
3114         pmap_clear_ptes(m, PG_M);
3115 }
3116
3117 /*
3118  *      pmap_clear_reference:
3119  *
3120  *      Clear the reference bit on the specified physical page.
3121  */
3122 void
3123 pmap_clear_reference(vm_page_t m)
3124 {
3125         pmap_clear_ptes(m, PG_A);
3126 }
3127
3128 /*
3129  * Miscellaneous support routines follow
3130  */
3131
3132 /*
3133  * Map a set of physical memory pages into the kernel virtual
3134  * address space. Return a pointer to where it is mapped. This
3135  * routine is intended to be used for mapping device memory,
3136  * NOT real memory.
3137  */
3138 void *
3139 pmap_mapdev(pa, size)
3140         vm_paddr_t pa;
3141         vm_size_t size;
3142 {
3143         vm_offset_t va, tmpva, offset;
3144
3145         /* If this fits within the direct map window, use it */
3146         if (pa < dmaplimit && (pa + size) < dmaplimit)
3147                 return ((void *)PHYS_TO_DMAP(pa));
3148         offset = pa & PAGE_MASK;
3149         size = roundup(offset + size, PAGE_SIZE);
3150         va = kmem_alloc_nofault(kernel_map, size);
3151         if (!va)
3152                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3153         pa = trunc_page(pa);
3154         for (tmpva = va; size > 0; ) {
3155                 pmap_kenter(tmpva, pa);
3156                 size -= PAGE_SIZE;
3157                 tmpva += PAGE_SIZE;
3158                 pa += PAGE_SIZE;
3159         }
3160         pmap_invalidate_range(kernel_pmap, va, tmpva);
3161         return ((void *)(va + offset));
3162 }
3163
3164 void
3165 pmap_unmapdev(va, size)
3166         vm_offset_t va;
3167         vm_size_t size;
3168 {
3169         vm_offset_t base, offset, tmpva;
3170
3171         /* If we gave a direct map region in pmap_mapdev, do nothing */
3172         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS)
3173                 return;
3174         base = trunc_page(va);
3175         offset = va & PAGE_MASK;
3176         size = roundup(offset + size, PAGE_SIZE);
3177         for (tmpva = base; tmpva < (base + size); tmpva += PAGE_SIZE)
3178                 pmap_kremove(tmpva);
3179         pmap_invalidate_range(kernel_pmap, va, tmpva);
3180         kmem_free(kernel_map, base, size);
3181 }
3182
3183 /*
3184  * perform the pmap work for mincore
3185  */
3186 int
3187 pmap_mincore(pmap, addr)
3188         pmap_t pmap;
3189         vm_offset_t addr;
3190 {
3191         pt_entry_t *ptep, pte;
3192         vm_page_t m;
3193         int val = 0;
3194         
3195         PMAP_LOCK(pmap);
3196         ptep = pmap_pte(pmap, addr);
3197         pte = (ptep != NULL) ? *ptep : 0;
3198         PMAP_UNLOCK(pmap);
3199
3200         if (pte != 0) {
3201                 vm_paddr_t pa;
3202
3203                 val = MINCORE_INCORE;
3204                 if ((pte & PG_MANAGED) == 0)
3205                         return val;
3206
3207                 pa = pte & PG_FRAME;
3208
3209                 m = PHYS_TO_VM_PAGE(pa);
3210
3211                 /*
3212                  * Modified by us
3213                  */
3214                 if (pte & PG_M)
3215                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
3216                 else {
3217                         /*
3218                          * Modified by someone else
3219                          */
3220                         vm_page_lock_queues();
3221                         if (m->dirty || pmap_is_modified(m))
3222                                 val |= MINCORE_MODIFIED_OTHER;
3223                         vm_page_unlock_queues();
3224                 }
3225                 /*
3226                  * Referenced by us
3227                  */
3228                 if (pte & PG_A)
3229                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
3230                 else {
3231                         /*
3232                          * Referenced by someone else
3233                          */
3234                         vm_page_lock_queues();
3235                         if ((m->flags & PG_REFERENCED) ||
3236                             pmap_ts_referenced(m)) {
3237                                 val |= MINCORE_REFERENCED_OTHER;
3238                                 vm_page_flag_set(m, PG_REFERENCED);
3239                         }
3240                         vm_page_unlock_queues();
3241                 }
3242         } 
3243         return val;
3244 }
3245
3246 void
3247 pmap_activate(struct thread *td)
3248 {
3249         pmap_t  pmap, oldpmap;
3250         u_int64_t  cr3;
3251
3252         critical_enter();
3253         pmap = vmspace_pmap(td->td_proc->p_vmspace);
3254         oldpmap = PCPU_GET(curpmap);
3255 #ifdef SMP
3256 if (oldpmap)    /* XXX FIXME */
3257         atomic_clear_int(&oldpmap->pm_active, PCPU_GET(cpumask));
3258         atomic_set_int(&pmap->pm_active, PCPU_GET(cpumask));
3259 #else
3260 if (oldpmap)    /* XXX FIXME */
3261         oldpmap->pm_active &= ~PCPU_GET(cpumask);
3262         pmap->pm_active |= PCPU_GET(cpumask);
3263 #endif
3264         cr3 = vtophys(pmap->pm_pml4);
3265         td->td_pcb->pcb_cr3 = cr3;
3266         load_cr3(cr3);
3267         critical_exit();
3268 }
3269
3270 vm_offset_t
3271 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
3272 {
3273
3274         if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
3275                 return addr;
3276         }
3277
3278         addr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
3279         return addr;
3280 }