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