Fix some pmap races in pc32 and vkernel, and other vkernel issues.
[dragonfly.git] / sys / platform / pc32 / 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  *
9  * This code is derived from software contributed to Berkeley by
10  * the Systems Programming Group of the University of Utah Computer
11  * Science Department and William Jolitz of UUNET Technologies Inc.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  * 3. All advertising materials mentioning features or use of this software
22  *    must display the following acknowledgement:
23  *      This product includes software developed by the University of
24  *      California, Berkeley and its contributors.
25  * 4. Neither the name of the University nor the names of its contributors
26  *    may be used to endorse or promote products derived from this software
27  *    without specific prior written permission.
28  *
29  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39  * SUCH DAMAGE.
40  *
41  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
42  * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $
43  * $DragonFly: src/sys/platform/pc32/i386/pmap.c,v 1.83 2008/04/28 07:05:06 dillon Exp $
44  */
45
46 /*
47  *      Manages physical address maps.
48  *
49  *      In addition to hardware address maps, this
50  *      module is called upon to provide software-use-only
51  *      maps which may or may not be stored in the same
52  *      form as hardware maps.  These pseudo-maps are
53  *      used to store intermediate results from copy
54  *      operations to and from address spaces.
55  *
56  *      Since the information managed by this module is
57  *      also stored by the logical address mapping module,
58  *      this module may throw away valid virtual-to-physical
59  *      mappings at almost any time.  However, invalidations
60  *      of virtual-to-physical mappings must be done as
61  *      requested.
62  *
63  *      In order to cope with hardware architectures which
64  *      make virtual-to-physical map invalidates expensive,
65  *      this module may delay invalidate or reduced protection
66  *      operations until such time as they are actually
67  *      necessary.  This module is given full information as
68  *      to which processors are currently using which maps,
69  *      and to when physical maps must be made correct.
70  */
71
72 #include "opt_disable_pse.h"
73 #include "opt_pmap.h"
74 #include "opt_msgbuf.h"
75
76 #include <sys/param.h>
77 #include <sys/systm.h>
78 #include <sys/kernel.h>
79 #include <sys/proc.h>
80 #include <sys/msgbuf.h>
81 #include <sys/vmmeter.h>
82 #include <sys/mman.h>
83
84 #include <vm/vm.h>
85 #include <vm/vm_param.h>
86 #include <sys/sysctl.h>
87 #include <sys/lock.h>
88 #include <vm/vm_kern.h>
89 #include <vm/vm_page.h>
90 #include <vm/vm_map.h>
91 #include <vm/vm_object.h>
92 #include <vm/vm_extern.h>
93 #include <vm/vm_pageout.h>
94 #include <vm/vm_pager.h>
95 #include <vm/vm_zone.h>
96
97 #include <sys/user.h>
98 #include <sys/thread2.h>
99 #include <sys/sysref2.h>
100
101 #include <machine/cputypes.h>
102 #include <machine/md_var.h>
103 #include <machine/specialreg.h>
104 #include <machine/smp.h>
105 #include <machine_base/apic/apicreg.h>
106 #include <machine/globaldata.h>
107 #include <machine/pmap.h>
108 #include <machine/pmap_inval.h>
109
110 #include <ddb/ddb.h>
111
112 #define PMAP_KEEP_PDIRS
113 #ifndef PMAP_SHPGPERPROC
114 #define PMAP_SHPGPERPROC 200
115 #endif
116
117 #if defined(DIAGNOSTIC)
118 #define PMAP_DIAGNOSTIC
119 #endif
120
121 #define MINPV 2048
122
123 #if !defined(PMAP_DIAGNOSTIC)
124 #define PMAP_INLINE __inline
125 #else
126 #define PMAP_INLINE
127 #endif
128
129 /*
130  * Get PDEs and PTEs for user/kernel address space
131  */
132 #define pmap_pde(m, v)  (&((m)->pm_pdir[(vm_offset_t)(v) >> PDRSHIFT]))
133 #define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
134
135 #define pmap_pde_v(pte)         ((*(int *)pte & PG_V) != 0)
136 #define pmap_pte_w(pte)         ((*(int *)pte & PG_W) != 0)
137 #define pmap_pte_m(pte)         ((*(int *)pte & PG_M) != 0)
138 #define pmap_pte_u(pte)         ((*(int *)pte & PG_A) != 0)
139 #define pmap_pte_v(pte)         ((*(int *)pte & PG_V) != 0)
140
141
142 /*
143  * Given a map and a machine independent protection code,
144  * convert to a vax protection code.
145  */
146 #define pte_prot(m, p)          \
147         (protection_codes[p & (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)])
148 static int protection_codes[8];
149
150 struct pmap kernel_pmap;
151 static TAILQ_HEAD(,pmap)        pmap_list = TAILQ_HEAD_INITIALIZER(pmap_list);
152
153 vm_paddr_t avail_start;         /* PA of first available physical page */
154 vm_paddr_t avail_end;           /* PA of last available physical page */
155 vm_offset_t virtual_start;      /* VA of first avail page (after kernel bss) */
156 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
157 vm_offset_t KvaStart;           /* VA start of KVA space */
158 vm_offset_t KvaEnd;             /* VA end of KVA space (non-inclusive) */
159 vm_offset_t KvaSize;            /* max size of kernel virtual address space */
160 static boolean_t pmap_initialized = FALSE;      /* Has pmap_init completed? */
161 static int pgeflag;             /* PG_G or-in */
162 static int pseflag;             /* PG_PS or-in */
163
164 static vm_object_t kptobj;
165
166 static int nkpt;
167 vm_offset_t kernel_vm_end;
168
169 /*
170  * Data for the pv entry allocation mechanism
171  */
172 static vm_zone_t pvzone;
173 static struct vm_zone pvzone_store;
174 static struct vm_object pvzone_obj;
175 static int pv_entry_count=0, pv_entry_max=0, pv_entry_high_water=0;
176 static int pmap_pagedaemon_waken = 0;
177 static struct pv_entry *pvinit;
178
179 /*
180  * All those kernel PT submaps that BSD is so fond of
181  */
182 pt_entry_t *CMAP1 = 0, *ptmmap;
183 caddr_t CADDR1 = 0, ptvmmap = 0;
184 static pt_entry_t *msgbufmap;
185 struct msgbuf *msgbufp=0;
186
187 /*
188  * Crashdump maps.
189  */
190 static pt_entry_t *pt_crashdumpmap;
191 static caddr_t crashdumpmap;
192
193 extern pt_entry_t *SMPpt;
194
195 static PMAP_INLINE void free_pv_entry (pv_entry_t pv);
196 static unsigned * get_ptbase (pmap_t pmap);
197 static pv_entry_t get_pv_entry (void);
198 static void     i386_protection_init (void);
199 static __inline void    pmap_clearbit (vm_page_t m, int bit);
200
201 static void     pmap_remove_all (vm_page_t m);
202 static vm_page_t pmap_enter_quick (pmap_t pmap, vm_offset_t va,
203                                       vm_page_t m, vm_page_t mpte);
204 static int pmap_remove_pte (struct pmap *pmap, unsigned *ptq, 
205                                 vm_offset_t sva, pmap_inval_info_t info);
206 static void pmap_remove_page (struct pmap *pmap, 
207                                 vm_offset_t va, pmap_inval_info_t info);
208 static int pmap_remove_entry (struct pmap *pmap, vm_page_t m,
209                                 vm_offset_t va, pmap_inval_info_t info);
210 static boolean_t pmap_testbit (vm_page_t m, int bit);
211 static void pmap_insert_entry (pmap_t pmap, vm_offset_t va,
212                 vm_page_t mpte, vm_page_t m);
213
214 static vm_page_t pmap_allocpte (pmap_t pmap, vm_offset_t va);
215
216 static int pmap_release_free_page (pmap_t pmap, vm_page_t p);
217 static vm_page_t _pmap_allocpte (pmap_t pmap, unsigned ptepindex);
218 static unsigned * pmap_pte_quick (pmap_t pmap, vm_offset_t va);
219 static vm_page_t pmap_page_lookup (vm_object_t object, vm_pindex_t pindex);
220 static int pmap_unuse_pt (pmap_t, vm_offset_t, vm_page_t, pmap_inval_info_t);
221 static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
222
223 static unsigned pdir4mb;
224
225 /*
226  * Move the kernel virtual free pointer to the next
227  * 4MB.  This is used to help improve performance
228  * by using a large (4MB) page for much of the kernel
229  * (.text, .data, .bss)
230  */
231 static vm_offset_t
232 pmap_kmem_choose(vm_offset_t addr)
233 {
234         vm_offset_t newaddr = addr;
235 #ifndef DISABLE_PSE
236         if (cpu_feature & CPUID_PSE) {
237                 newaddr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
238         }
239 #endif
240         return newaddr;
241 }
242
243 /*
244  * pmap_pte:
245  *
246  *      Extract the page table entry associated with the given map/virtual
247  *      pair.
248  *
249  *      This function may NOT be called from an interrupt.
250  */
251 PMAP_INLINE unsigned *
252 pmap_pte(pmap_t pmap, vm_offset_t va)
253 {
254         unsigned *pdeaddr;
255
256         if (pmap) {
257                 pdeaddr = (unsigned *) pmap_pde(pmap, va);
258                 if (*pdeaddr & PG_PS)
259                         return pdeaddr;
260                 if (*pdeaddr) {
261                         return get_ptbase(pmap) + i386_btop(va);
262                 }
263         }
264         return (0);
265 }
266
267 /*
268  * pmap_pte_quick:
269  *
270  *      Super fast pmap_pte routine best used when scanning the pv lists.
271  *      This eliminates many course-grained invltlb calls.  Note that many of
272  *      the pv list scans are across different pmaps and it is very wasteful
273  *      to do an entire invltlb when checking a single mapping.
274  *
275  *      Should only be called while in a critical section.
276  */
277 static unsigned * 
278 pmap_pte_quick(pmap_t pmap, vm_offset_t va)
279 {
280         struct mdglobaldata *gd = mdcpu;
281         unsigned pde, newpf;
282
283         if ((pde = (unsigned) pmap->pm_pdir[va >> PDRSHIFT]) != 0) {
284                 unsigned frame = (unsigned) pmap->pm_pdir[PTDPTDI] & PG_FRAME;
285                 unsigned index = i386_btop(va);
286                 /* are we current address space or kernel? */
287                 if ((pmap == &kernel_pmap) ||
288                         (frame == (((unsigned) PTDpde) & PG_FRAME))) {
289                         return (unsigned *) PTmap + index;
290                 }
291                 newpf = pde & PG_FRAME;
292                 if ( ((* (unsigned *) gd->gd_PMAP1) & PG_FRAME) != newpf) {
293                         * (unsigned *) gd->gd_PMAP1 = newpf | PG_RW | PG_V;
294                         cpu_invlpg(gd->gd_PADDR1);
295                 }
296                 return gd->gd_PADDR1 + ((unsigned) index & (NPTEPG - 1));
297         }
298         return (0);
299 }
300
301
302 /*
303  *      Bootstrap the system enough to run with virtual memory.
304  *
305  *      On the i386 this is called after mapping has already been enabled
306  *      and just syncs the pmap module with what has already been done.
307  *      [We can't call it easily with mapping off since the kernel is not
308  *      mapped with PA == VA, hence we would have to relocate every address
309  *      from the linked base (virtual) address "KERNBASE" to the actual
310  *      (physical) address starting relative to 0]
311  */
312 void
313 pmap_bootstrap(vm_paddr_t firstaddr, vm_paddr_t loadaddr)
314 {
315         vm_offset_t va;
316         pt_entry_t *pte;
317         struct mdglobaldata *gd;
318         int i;
319         int pg;
320
321         KvaStart = (vm_offset_t)VADDR(PTDPTDI, 0);
322         KvaSize = (vm_offset_t)VADDR(APTDPTDI, 0) - KvaStart;
323         KvaEnd  = KvaStart + KvaSize;
324
325         avail_start = firstaddr;
326
327         /*
328          * XXX The calculation of virtual_start is wrong. It's NKPT*PAGE_SIZE
329          * too large. It should instead be correctly calculated in locore.s and
330          * not based on 'first' (which is a physical address, not a virtual
331          * address, for the start of unused physical memory). The kernel
332          * page tables are NOT double mapped and thus should not be included
333          * in this calculation.
334          */
335         virtual_start = (vm_offset_t) KERNBASE + firstaddr;
336         virtual_start = pmap_kmem_choose(virtual_start);
337         virtual_end = VADDR(KPTDI+NKPDE-1, NPTEPG-1);
338
339         /*
340          * Initialize protection array.
341          */
342         i386_protection_init();
343
344         /*
345          * The kernel's pmap is statically allocated so we don't have to use
346          * pmap_create, which is unlikely to work correctly at this part of
347          * the boot sequence (XXX and which no longer exists).
348          */
349         kernel_pmap.pm_pdir = (pd_entry_t *)(KERNBASE + (u_int)IdlePTD);
350         kernel_pmap.pm_count = 1;
351         kernel_pmap.pm_active = (cpumask_t)-1;  /* don't allow deactivation */
352         TAILQ_INIT(&kernel_pmap.pm_pvlist);
353         nkpt = NKPT;
354
355         /*
356          * Reserve some special page table entries/VA space for temporary
357          * mapping of pages.
358          */
359 #define SYSMAP(c, p, v, n)      \
360         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
361
362         va = virtual_start;
363         pte = (pt_entry_t *) pmap_pte(&kernel_pmap, va);
364
365         /*
366          * CMAP1/CMAP2 are used for zeroing and copying pages.
367          */
368         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
369
370         /*
371          * Crashdump maps.
372          */
373         SYSMAP(caddr_t, pt_crashdumpmap, crashdumpmap, MAXDUMPPGS);
374
375         /*
376          * ptvmmap is used for reading arbitrary physical pages via
377          * /dev/mem.
378          */
379         SYSMAP(caddr_t, ptmmap, ptvmmap, 1)
380
381         /*
382          * msgbufp is used to map the system message buffer.
383          * XXX msgbufmap is not used.
384          */
385         SYSMAP(struct msgbuf *, msgbufmap, msgbufp,
386                atop(round_page(MSGBUF_SIZE)))
387
388         virtual_start = va;
389
390         *(int *) CMAP1 = 0;
391         for (i = 0; i < NKPT; i++)
392                 PTD[i] = 0;
393
394         /*
395          * PG_G is terribly broken on SMP because we IPI invltlb's in some
396          * cases rather then invl1pg.  Actually, I don't even know why it
397          * works under UP because self-referential page table mappings
398          */
399 #ifdef SMP
400         pgeflag = 0;
401 #else
402         if (cpu_feature & CPUID_PGE)
403                 pgeflag = PG_G;
404 #endif
405         
406 /*
407  * Initialize the 4MB page size flag
408  */
409         pseflag = 0;
410 /*
411  * The 4MB page version of the initial
412  * kernel page mapping.
413  */
414         pdir4mb = 0;
415
416 #if !defined(DISABLE_PSE)
417         if (cpu_feature & CPUID_PSE) {
418                 unsigned ptditmp;
419                 /*
420                  * Note that we have enabled PSE mode
421                  */
422                 pseflag = PG_PS;
423                 ptditmp = *((unsigned *)PTmap + i386_btop(KERNBASE));
424                 ptditmp &= ~(NBPDR - 1);
425                 ptditmp |= PG_V | PG_RW | PG_PS | PG_U | pgeflag;
426                 pdir4mb = ptditmp;
427
428 #ifndef SMP
429                 /*
430                  * Enable the PSE mode.  If we are SMP we can't do this
431                  * now because the APs will not be able to use it when
432                  * they boot up.
433                  */
434                 load_cr4(rcr4() | CR4_PSE);
435
436                 /*
437                  * We can do the mapping here for the single processor
438                  * case.  We simply ignore the old page table page from
439                  * now on.
440                  */
441                 /*
442                  * For SMP, we still need 4K pages to bootstrap APs,
443                  * PSE will be enabled as soon as all APs are up.
444                  */
445                 PTD[KPTDI] = (pd_entry_t)ptditmp;
446                 kernel_pmap.pm_pdir[KPTDI] = (pd_entry_t)ptditmp;
447                 cpu_invltlb();
448 #endif
449         }
450 #endif
451 #ifdef SMP
452         if (cpu_apic_address == 0)
453                 panic("pmap_bootstrap: no local apic!");
454
455         /* local apic is mapped on last page */
456         SMPpt[NPTEPG - 1] = (pt_entry_t)(PG_V | PG_RW | PG_N | pgeflag |
457             (cpu_apic_address & PG_FRAME));
458 #endif
459
460         /*
461          * We need to finish setting up the globaldata page for the BSP.
462          * locore has already populated the page table for the mdglobaldata
463          * portion.
464          */
465         pg = MDGLOBALDATA_BASEALLOC_PAGES;
466         gd = &CPU_prvspace[0].mdglobaldata;
467         gd->gd_CMAP1 = &SMPpt[pg + 0];
468         gd->gd_CMAP2 = &SMPpt[pg + 1];
469         gd->gd_CMAP3 = &SMPpt[pg + 2];
470         gd->gd_PMAP1 = &SMPpt[pg + 3];
471         gd->gd_CADDR1 = CPU_prvspace[0].CPAGE1;
472         gd->gd_CADDR2 = CPU_prvspace[0].CPAGE2;
473         gd->gd_CADDR3 = CPU_prvspace[0].CPAGE3;
474         gd->gd_PADDR1 = (unsigned *)CPU_prvspace[0].PPAGE1;
475
476         cpu_invltlb();
477 }
478
479 #ifdef SMP
480 /*
481  * Set 4mb pdir for mp startup
482  */
483 void
484 pmap_set_opt(void)
485 {
486         if (pseflag && (cpu_feature & CPUID_PSE)) {
487                 load_cr4(rcr4() | CR4_PSE);
488                 if (pdir4mb && mycpu->gd_cpuid == 0) {  /* only on BSP */
489                         kernel_pmap.pm_pdir[KPTDI] =
490                             PTD[KPTDI] = (pd_entry_t)pdir4mb;
491                         cpu_invltlb();
492                 }
493         }
494 }
495 #endif
496
497 /*
498  *      Initialize the pmap module.
499  *      Called by vm_init, to initialize any structures that the pmap
500  *      system needs to map virtual memory.
501  *      pmap_init has been enhanced to support in a fairly consistant
502  *      way, discontiguous physical memory.
503  */
504 void
505 pmap_init(void)
506 {
507         int i;
508         int initial_pvs;
509
510         /*
511          * object for kernel page table pages
512          */
513         kptobj = vm_object_allocate(OBJT_DEFAULT, NKPDE);
514
515         /*
516          * Allocate memory for random pmap data structures.  Includes the
517          * pv_head_table.
518          */
519
520         for(i = 0; i < vm_page_array_size; i++) {
521                 vm_page_t m;
522
523                 m = &vm_page_array[i];
524                 TAILQ_INIT(&m->md.pv_list);
525                 m->md.pv_list_count = 0;
526         }
527
528         /*
529          * init the pv free list
530          */
531         initial_pvs = vm_page_array_size;
532         if (initial_pvs < MINPV)
533                 initial_pvs = MINPV;
534         pvzone = &pvzone_store;
535         pvinit = (struct pv_entry *) kmem_alloc(&kernel_map,
536                 initial_pvs * sizeof (struct pv_entry));
537         zbootinit(pvzone, "PV ENTRY", sizeof (struct pv_entry), pvinit,
538                 initial_pvs);
539
540         /*
541          * Now it is safe to enable pv_table recording.
542          */
543         pmap_initialized = TRUE;
544 }
545
546 /*
547  * Initialize the address space (zone) for the pv_entries.  Set a
548  * high water mark so that the system can recover from excessive
549  * numbers of pv entries.
550  */
551 void
552 pmap_init2(void)
553 {
554         int shpgperproc = PMAP_SHPGPERPROC;
555
556         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
557         pv_entry_max = shpgperproc * maxproc + vm_page_array_size;
558         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
559         pv_entry_high_water = 9 * (pv_entry_max / 10);
560         zinitna(pvzone, &pvzone_obj, NULL, 0, pv_entry_max, ZONE_INTERRUPT, 1);
561 }
562
563
564 /***************************************************
565  * Low level helper routines.....
566  ***************************************************/
567
568 #if defined(PMAP_DIAGNOSTIC)
569
570 /*
571  * This code checks for non-writeable/modified pages.
572  * This should be an invalid condition.
573  */
574 static int
575 pmap_nw_modified(pt_entry_t ptea)
576 {
577         int pte;
578
579         pte = (int) ptea;
580
581         if ((pte & (PG_M|PG_RW)) == PG_M)
582                 return 1;
583         else
584                 return 0;
585 }
586 #endif
587
588
589 /*
590  * this routine defines the region(s) of memory that should
591  * not be tested for the modified bit.
592  */
593 static PMAP_INLINE int
594 pmap_track_modified(vm_offset_t va)
595 {
596         if ((va < clean_sva) || (va >= clean_eva)) 
597                 return 1;
598         else
599                 return 0;
600 }
601
602 static unsigned *
603 get_ptbase(pmap_t pmap)
604 {
605         unsigned frame = (unsigned) pmap->pm_pdir[PTDPTDI] & PG_FRAME;
606         struct globaldata *gd = mycpu;
607
608         /* are we current address space or kernel? */
609         if (pmap == &kernel_pmap || frame == (((unsigned) PTDpde) & PG_FRAME)) {
610                 return (unsigned *) PTmap;
611         }
612
613         /* otherwise, we are alternate address space */
614         KKASSERT(gd->gd_intr_nesting_level == 0 &&
615                  (gd->gd_curthread->td_flags & TDF_INTTHREAD) == 0);
616
617         if (frame != (((unsigned) APTDpde) & PG_FRAME)) {
618                 APTDpde = (pd_entry_t)(frame | PG_RW | PG_V);
619                 /* The page directory is not shared between CPUs */
620                 cpu_invltlb();
621         }
622         return (unsigned *) APTmap;
623 }
624
625 /*
626  * pmap_extract:
627  *
628  *      Extract the physical page address associated with the map/VA pair.
629  *
630  *      This function may not be called from an interrupt if the pmap is
631  *      not kernel_pmap.
632  */
633 vm_paddr_t 
634 pmap_extract(pmap_t pmap, vm_offset_t va)
635 {
636         vm_offset_t rtval;
637         vm_offset_t pdirindex;
638
639         pdirindex = va >> PDRSHIFT;
640         if (pmap && (rtval = (unsigned) pmap->pm_pdir[pdirindex])) {
641                 unsigned *pte;
642                 if ((rtval & PG_PS) != 0) {
643                         rtval &= ~(NBPDR - 1);
644                         rtval |= va & (NBPDR - 1);
645                         return rtval;
646                 }
647                 pte = get_ptbase(pmap) + i386_btop(va);
648                 rtval = ((*pte & PG_FRAME) | (va & PAGE_MASK));
649                 return rtval;
650         }
651         return 0;
652 }
653
654 /***************************************************
655  * Low level mapping routines.....
656  ***************************************************/
657
658 /*
659  * Routine: pmap_kenter
660  * Function:
661  *      Add a wired page to the KVA
662  *      NOTE! note that in order for the mapping to take effect -- you
663  *      should do an invltlb after doing the pmap_kenter().
664  */
665 void 
666 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
667 {
668         unsigned *pte;
669         unsigned npte;
670         pmap_inval_info info;
671
672         pmap_inval_init(&info);
673         pmap_inval_add(&info, &kernel_pmap, va);
674         npte = pa | PG_RW | PG_V | pgeflag;
675         pte = (unsigned *)vtopte(va);
676         *pte = npte;
677         pmap_inval_flush(&info);
678 }
679
680 /*
681  * Routine: pmap_kenter_quick
682  * Function:
683  *      Similar to pmap_kenter(), except we only invalidate the
684  *      mapping on the current CPU.
685  */
686 void
687 pmap_kenter_quick(vm_offset_t va, vm_paddr_t pa)
688 {
689         unsigned *pte;
690         unsigned npte;
691
692         npte = pa | PG_RW | PG_V | pgeflag;
693         pte = (unsigned *)vtopte(va);
694         *pte = npte;
695         cpu_invlpg((void *)va);
696 }
697
698 void
699 pmap_kenter_sync(vm_offset_t va)
700 {
701         pmap_inval_info info;
702
703         pmap_inval_init(&info);
704         pmap_inval_add(&info, &kernel_pmap, va);
705         pmap_inval_flush(&info);
706 }
707
708 void
709 pmap_kenter_sync_quick(vm_offset_t va)
710 {
711         cpu_invlpg((void *)va);
712 }
713
714 /*
715  * remove a page from the kernel pagetables
716  */
717 void
718 pmap_kremove(vm_offset_t va)
719 {
720         unsigned *pte;
721         pmap_inval_info info;
722
723         pmap_inval_init(&info);
724         pmap_inval_add(&info, &kernel_pmap, va);
725         pte = (unsigned *)vtopte(va);
726         *pte = 0;
727         pmap_inval_flush(&info);
728 }
729
730 void
731 pmap_kremove_quick(vm_offset_t va)
732 {
733         unsigned *pte;
734         pte = (unsigned *)vtopte(va);
735         *pte = 0;
736         cpu_invlpg((void *)va);
737 }
738
739 /*
740  * XXX these need to be recoded.  They are not used in any critical path.
741  */
742 void
743 pmap_kmodify_rw(vm_offset_t va)
744 {
745         *vtopte(va) |= PG_RW;
746         cpu_invlpg((void *)va);
747 }
748
749 void
750 pmap_kmodify_nc(vm_offset_t va)
751 {
752         *vtopte(va) |= PG_N;
753         cpu_invlpg((void *)va);
754 }
755
756 /*
757  *      Used to map a range of physical addresses into kernel
758  *      virtual address space.
759  *
760  *      For now, VM is already on, we only need to map the
761  *      specified memory.
762  */
763 vm_offset_t
764 pmap_map(vm_offset_t virt, vm_paddr_t start, vm_paddr_t end, int prot)
765 {
766         while (start < end) {
767                 pmap_kenter(virt, start);
768                 virt += PAGE_SIZE;
769                 start += PAGE_SIZE;
770         }
771         return (virt);
772 }
773
774
775 /*
776  * Add a list of wired pages to the kva
777  * this routine is only used for temporary
778  * kernel mappings that do not need to have
779  * page modification or references recorded.
780  * Note that old mappings are simply written
781  * over.  The page *must* be wired.
782  */
783 void
784 pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
785 {
786         vm_offset_t end_va;
787
788         end_va = va + count * PAGE_SIZE;
789                 
790         while (va < end_va) {
791                 unsigned *pte;
792
793                 pte = (unsigned *)vtopte(va);
794                 *pte = VM_PAGE_TO_PHYS(*m) | PG_RW | PG_V | pgeflag;
795                 cpu_invlpg((void *)va);
796                 va += PAGE_SIZE;
797                 m++;
798         }
799 #ifdef SMP
800         smp_invltlb();  /* XXX */
801 #endif
802 }
803
804 void
805 pmap_qenter2(vm_offset_t va, vm_page_t *m, int count, cpumask_t *mask)
806 {
807         vm_offset_t end_va;
808         cpumask_t cmask = mycpu->gd_cpumask;
809
810         end_va = va + count * PAGE_SIZE;
811
812         while (va < end_va) {
813                 unsigned *pte;
814                 unsigned pteval;
815
816                 /*
817                  * Install the new PTE.  If the pte changed from the prior
818                  * mapping we must reset the cpu mask and invalidate the page.
819                  * If the pte is the same but we have not seen it on the
820                  * current cpu, invlpg the existing mapping.  Otherwise the
821                  * entry is optimal and no invalidation is required.
822                  */
823                 pte = (unsigned *)vtopte(va);
824                 pteval = VM_PAGE_TO_PHYS(*m) | PG_A | PG_RW | PG_V | pgeflag;
825                 if (*pte != pteval) {
826                         *mask = 0;
827                         *pte = pteval;
828                         cpu_invlpg((void *)va);
829                 } else if ((*mask & cmask) == 0) {
830                         cpu_invlpg((void *)va);
831                 }
832                 va += PAGE_SIZE;
833                 m++;
834         }
835         *mask |= cmask;
836 }
837
838 /*
839  * this routine jerks page mappings from the
840  * kernel -- it is meant only for temporary mappings.
841  */
842 void
843 pmap_qremove(vm_offset_t va, int count)
844 {
845         vm_offset_t end_va;
846
847         end_va = va + count*PAGE_SIZE;
848
849         while (va < end_va) {
850                 unsigned *pte;
851
852                 pte = (unsigned *)vtopte(va);
853                 *pte = 0;
854                 cpu_invlpg((void *)va);
855                 va += PAGE_SIZE;
856         }
857 #ifdef SMP
858         smp_invltlb();
859 #endif
860 }
861
862 /*
863  * This routine works like vm_page_lookup() but also blocks as long as the
864  * page is busy.  This routine does not busy the page it returns.
865  *
866  * Unless the caller is managing objects whos pages are in a known state,
867  * the call should be made with a critical section held so the page's object
868  * association remains valid on return.
869  */
870 static vm_page_t
871 pmap_page_lookup(vm_object_t object, vm_pindex_t pindex)
872 {
873         vm_page_t m;
874
875 retry:
876         m = vm_page_lookup(object, pindex);
877         if (m && vm_page_sleep_busy(m, FALSE, "pplookp"))
878                 goto retry;
879         return(m);
880 }
881
882 /*
883  * Create a new thread and optionally associate it with a (new) process.
884  * NOTE! the new thread's cpu may not equal the current cpu.
885  */
886 void
887 pmap_init_thread(thread_t td)
888 {
889         /* enforce pcb placement */
890         td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_size) - 1;
891         td->td_savefpu = &td->td_pcb->pcb_save;
892         td->td_sp = (char *)td->td_pcb - 16;
893 }
894
895 /*
896  * This routine directly affects the fork perf for a process.
897  */
898 void
899 pmap_init_proc(struct proc *p)
900 {
901 }
902
903 /*
904  * Dispose the UPAGES for a process that has exited.
905  * This routine directly impacts the exit perf of a process.
906  */
907 void
908 pmap_dispose_proc(struct proc *p)
909 {
910         KASSERT(p->p_lock == 0, ("attempt to dispose referenced proc! %p", p));
911 }
912
913 /***************************************************
914  * Page table page management routines.....
915  ***************************************************/
916
917 /*
918  * This routine unholds page table pages, and if the hold count
919  * drops to zero, then it decrements the wire count.
920  */
921 static int 
922 _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, pmap_inval_info_t info) 
923 {
924         pmap_inval_flush(info);
925         while (vm_page_sleep_busy(m, FALSE, "pmuwpt"))
926                 ;
927         KASSERT(m->queue == PQ_NONE,
928                 ("_pmap_unwire_pte_hold: %p->queue != PQ_NONE", m));
929
930         if (m->hold_count == 1) {
931                 /*
932                  * Unmap the page table page
933                  */
934                 vm_page_busy(m);
935                 pmap_inval_add(info, pmap, -1);
936                 pmap->pm_pdir[m->pindex] = 0;
937
938                 KKASSERT(pmap->pm_stats.resident_count > 0);
939                 --pmap->pm_stats.resident_count;
940
941                 if (pmap->pm_ptphint == m)
942                         pmap->pm_ptphint = NULL;
943
944                 /*
945                  * This was our last hold, the page had better be unwired
946                  * after we decrement wire_count.
947                  * 
948                  * FUTURE NOTE: shared page directory page could result in
949                  * multiple wire counts.
950                  */
951                 vm_page_unhold(m);
952                 --m->wire_count;
953                 KKASSERT(m->wire_count == 0);
954                 --vmstats.v_wire_count;
955                 vm_page_flash(m);
956                 vm_page_free_zero(m);
957                 return 1;
958         }
959         return 0;
960 }
961
962 static PMAP_INLINE int
963 pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, pmap_inval_info_t info)
964 {
965         KKASSERT(m->hold_count > 0);
966         if (m->hold_count > 1) {
967                 vm_page_unhold(m);
968                 return 0;
969         } else {
970                 return _pmap_unwire_pte_hold(pmap, m, info);
971         }
972 }
973
974 /*
975  * After removing a page table entry, this routine is used to
976  * conditionally free the page, and manage the hold/wire counts.
977  */
978 static int
979 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t mpte,
980                 pmap_inval_info_t info)
981 {
982         unsigned ptepindex;
983         if (va >= UPT_MIN_ADDRESS)
984                 return 0;
985
986         if (mpte == NULL) {
987                 ptepindex = (va >> PDRSHIFT);
988                 if (pmap->pm_ptphint &&
989                         (pmap->pm_ptphint->pindex == ptepindex)) {
990                         mpte = pmap->pm_ptphint;
991                 } else {
992                         pmap_inval_flush(info);
993                         mpte = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
994                         pmap->pm_ptphint = mpte;
995                 }
996         }
997
998         return pmap_unwire_pte_hold(pmap, mpte, info);
999 }
1000
1001 /*
1002  * Initialize pmap0/vmspace0.  This pmap is not added to pmap_list because
1003  * it, and IdlePTD, represents the template used to update all other pmaps.
1004  *
1005  * On architectures where the kernel pmap is not integrated into the user
1006  * process pmap, this pmap represents the process pmap, not the kernel pmap.
1007  * kernel_pmap should be used to directly access the kernel_pmap.
1008  */
1009 void
1010 pmap_pinit0(struct pmap *pmap)
1011 {
1012         pmap->pm_pdir =
1013                 (pd_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
1014         pmap_kenter((vm_offset_t)pmap->pm_pdir, (vm_offset_t) IdlePTD);
1015         pmap->pm_count = 1;
1016         pmap->pm_active = 0;
1017         pmap->pm_ptphint = NULL;
1018         TAILQ_INIT(&pmap->pm_pvlist);
1019         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1020 }
1021
1022 /*
1023  * Initialize a preallocated and zeroed pmap structure,
1024  * such as one in a vmspace structure.
1025  */
1026 void
1027 pmap_pinit(struct pmap *pmap)
1028 {
1029         vm_page_t ptdpg;
1030
1031         /*
1032          * No need to allocate page table space yet but we do need a valid
1033          * page directory table.
1034          */
1035         if (pmap->pm_pdir == NULL) {
1036                 pmap->pm_pdir =
1037                     (pd_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
1038         }
1039
1040         /*
1041          * Allocate an object for the ptes
1042          */
1043         if (pmap->pm_pteobj == NULL)
1044                 pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, PTDPTDI + 1);
1045
1046         /*
1047          * Allocate the page directory page, unless we already have
1048          * one cached.  If we used the cached page the wire_count will
1049          * already be set appropriately.
1050          */
1051         if ((ptdpg = pmap->pm_pdirm) == NULL) {
1052                 ptdpg = vm_page_grab(pmap->pm_pteobj, PTDPTDI,
1053                                      VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
1054                 pmap->pm_pdirm = ptdpg;
1055                 vm_page_flag_clear(ptdpg, PG_MAPPED | PG_BUSY);
1056                 ptdpg->valid = VM_PAGE_BITS_ALL;
1057                 ptdpg->wire_count = 1;
1058                 ++vmstats.v_wire_count;
1059                 pmap_kenter((vm_offset_t)pmap->pm_pdir, VM_PAGE_TO_PHYS(ptdpg));
1060         }
1061         if ((ptdpg->flags & PG_ZERO) == 0)
1062                 bzero(pmap->pm_pdir, PAGE_SIZE);
1063
1064         pmap->pm_pdir[MPPTDI] = PTD[MPPTDI];
1065
1066         /* install self-referential address mapping entry */
1067         *(unsigned *) (pmap->pm_pdir + PTDPTDI) =
1068                 VM_PAGE_TO_PHYS(ptdpg) | PG_V | PG_RW | PG_A | PG_M;
1069
1070         pmap->pm_count = 1;
1071         pmap->pm_active = 0;
1072         pmap->pm_ptphint = NULL;
1073         TAILQ_INIT(&pmap->pm_pvlist);
1074         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1075         pmap->pm_stats.resident_count = 1;
1076 }
1077
1078 /*
1079  * Clean up a pmap structure so it can be physically freed.  This routine
1080  * is called by the vmspace dtor function.  A great deal of pmap data is
1081  * left passively mapped to improve vmspace management so we have a bit
1082  * of cleanup work to do here.
1083  */
1084 void
1085 pmap_puninit(pmap_t pmap)
1086 {
1087         vm_page_t p;
1088
1089         KKASSERT(pmap->pm_active == 0);
1090         if ((p = pmap->pm_pdirm) != NULL) {
1091                 KKASSERT(pmap->pm_pdir != NULL);
1092                 pmap_kremove((vm_offset_t)pmap->pm_pdir);
1093                 p->wire_count--;
1094                 vmstats.v_wire_count--;
1095                 KKASSERT((p->flags & PG_BUSY) == 0);
1096                 vm_page_busy(p);
1097                 vm_page_free_zero(p);
1098                 pmap->pm_pdirm = NULL;
1099         }
1100         if (pmap->pm_pdir) {
1101                 kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pdir, PAGE_SIZE);
1102                 pmap->pm_pdir = NULL;
1103         }
1104         if (pmap->pm_pteobj) {
1105                 vm_object_deallocate(pmap->pm_pteobj);
1106                 pmap->pm_pteobj = NULL;
1107         }
1108 }
1109
1110 /*
1111  * Wire in kernel global address entries.  To avoid a race condition
1112  * between pmap initialization and pmap_growkernel, this procedure
1113  * adds the pmap to the master list (which growkernel scans to update),
1114  * then copies the template.
1115  */
1116 void
1117 pmap_pinit2(struct pmap *pmap)
1118 {
1119         crit_enter();
1120         TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
1121         /* XXX copies current process, does not fill in MPPTDI */
1122         bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * PTESIZE);
1123         crit_exit();
1124 }
1125
1126 /*
1127  * Attempt to release and free a vm_page in a pmap.  Returns 1 on success,
1128  * 0 on failure (if the procedure had to sleep).
1129  *
1130  * When asked to remove the page directory page itself, we actually just
1131  * leave it cached so we do not have to incur the SMP inval overhead of
1132  * removing the kernel mapping.  pmap_puninit() will take care of it.
1133  */
1134 static int
1135 pmap_release_free_page(struct pmap *pmap, vm_page_t p)
1136 {
1137         unsigned *pde = (unsigned *) pmap->pm_pdir;
1138         /*
1139          * This code optimizes the case of freeing non-busy
1140          * page-table pages.  Those pages are zero now, and
1141          * might as well be placed directly into the zero queue.
1142          */
1143         if (vm_page_sleep_busy(p, FALSE, "pmaprl"))
1144                 return 0;
1145
1146         vm_page_busy(p);
1147
1148         /*
1149          * Remove the page table page from the processes address space.
1150          */
1151         pde[p->pindex] = 0;
1152         KKASSERT(pmap->pm_stats.resident_count > 0);
1153         --pmap->pm_stats.resident_count;
1154
1155         if (p->hold_count)  {
1156                 panic("pmap_release: freeing held page table page");
1157         }
1158         if (pmap->pm_ptphint && (pmap->pm_ptphint->pindex == p->pindex))
1159                 pmap->pm_ptphint = NULL;
1160
1161         /*
1162          * We leave the page directory page cached, wired, and mapped in
1163          * the pmap until the dtor function (pmap_puninit()) gets called.
1164          * However, still clean it up so we can set PG_ZERO.
1165          */
1166         if (p->pindex == PTDPTDI) {
1167                 bzero(pde + KPTDI, nkpt * PTESIZE);
1168                 pde[MPPTDI] = 0;
1169                 pde[APTDPTDI] = 0;
1170                 vm_page_flag_set(p, PG_ZERO);
1171                 vm_page_wakeup(p);
1172         } else {
1173                 p->wire_count--;
1174                 vmstats.v_wire_count--;
1175                 vm_page_free_zero(p);
1176         }
1177         return 1;
1178 }
1179
1180 /*
1181  * this routine is called if the page table page is not
1182  * mapped correctly.
1183  */
1184 static vm_page_t
1185 _pmap_allocpte(pmap_t pmap, unsigned ptepindex)
1186 {
1187         vm_offset_t pteva, ptepa;
1188         vm_page_t m;
1189
1190         /*
1191          * Find or fabricate a new pagetable page
1192          */
1193         m = vm_page_grab(pmap->pm_pteobj, ptepindex,
1194                         VM_ALLOC_NORMAL | VM_ALLOC_ZERO | VM_ALLOC_RETRY);
1195
1196         KASSERT(m->queue == PQ_NONE,
1197                 ("_pmap_allocpte: %p->queue != PQ_NONE", m));
1198
1199         /*
1200          * Increment the hold count for the page we will be returning to
1201          * the caller.
1202          */
1203         m->hold_count++;
1204
1205         /*
1206          * It is possible that someone else got in and mapped by the page
1207          * directory page while we were blocked, if so just unbusy and
1208          * return the held page.
1209          */
1210         if ((ptepa = pmap->pm_pdir[ptepindex]) != 0) {
1211                 KKASSERT((ptepa & PG_FRAME) == VM_PAGE_TO_PHYS(m));
1212                 vm_page_wakeup(m);
1213                 return(m);
1214         }
1215
1216         if (m->wire_count == 0)
1217                 vmstats.v_wire_count++;
1218         m->wire_count++;
1219
1220
1221         /*
1222          * Map the pagetable page into the process address space, if
1223          * it isn't already there.
1224          */
1225
1226         ++pmap->pm_stats.resident_count;
1227
1228         ptepa = VM_PAGE_TO_PHYS(m);
1229         pmap->pm_pdir[ptepindex] =
1230                 (pd_entry_t) (ptepa | PG_U | PG_RW | PG_V | PG_A | PG_M);
1231
1232         /*
1233          * Set the page table hint
1234          */
1235         pmap->pm_ptphint = m;
1236
1237         /*
1238          * Try to use the new mapping, but if we cannot, then
1239          * do it with the routine that maps the page explicitly.
1240          */
1241         if ((m->flags & PG_ZERO) == 0) {
1242                 if ((((unsigned)pmap->pm_pdir[PTDPTDI]) & PG_FRAME) ==
1243                         (((unsigned) PTDpde) & PG_FRAME)) {
1244                         pteva = UPT_MIN_ADDRESS + i386_ptob(ptepindex);
1245                         bzero((caddr_t) pteva, PAGE_SIZE);
1246                 } else {
1247                         pmap_zero_page(ptepa);
1248                 }
1249         }
1250
1251         m->valid = VM_PAGE_BITS_ALL;
1252         vm_page_flag_clear(m, PG_ZERO);
1253         vm_page_flag_set(m, PG_MAPPED);
1254         vm_page_wakeup(m);
1255
1256         return m;
1257 }
1258
1259 static vm_page_t
1260 pmap_allocpte(pmap_t pmap, vm_offset_t va)
1261 {
1262         unsigned ptepindex;
1263         vm_offset_t ptepa;
1264         vm_page_t m;
1265
1266         /*
1267          * Calculate pagetable page index
1268          */
1269         ptepindex = va >> PDRSHIFT;
1270
1271         /*
1272          * Get the page directory entry
1273          */
1274         ptepa = (vm_offset_t) pmap->pm_pdir[ptepindex];
1275
1276         /*
1277          * This supports switching from a 4MB page to a
1278          * normal 4K page.
1279          */
1280         if (ptepa & PG_PS) {
1281                 pmap->pm_pdir[ptepindex] = 0;
1282                 ptepa = 0;
1283                 cpu_invltlb();
1284                 smp_invltlb();
1285         }
1286
1287         /*
1288          * If the page table page is mapped, we just increment the
1289          * hold count, and activate it.
1290          */
1291         if (ptepa) {
1292                 /*
1293                  * In order to get the page table page, try the
1294                  * hint first.
1295                  */
1296                 if (pmap->pm_ptphint &&
1297                         (pmap->pm_ptphint->pindex == ptepindex)) {
1298                         m = pmap->pm_ptphint;
1299                 } else {
1300                         m = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
1301                         pmap->pm_ptphint = m;
1302                 }
1303                 m->hold_count++;
1304                 return m;
1305         }
1306         /*
1307          * Here if the pte page isn't mapped, or if it has been deallocated.
1308          */
1309         return _pmap_allocpte(pmap, ptepindex);
1310 }
1311
1312
1313 /***************************************************
1314  * Pmap allocation/deallocation routines.
1315  ***************************************************/
1316
1317 /*
1318  * Release any resources held by the given physical map.
1319  * Called when a pmap initialized by pmap_pinit is being released.
1320  * Should only be called if the map contains no valid mappings.
1321  */
1322 static int pmap_release_callback(struct vm_page *p, void *data);
1323
1324 void
1325 pmap_release(struct pmap *pmap)
1326 {
1327         vm_object_t object = pmap->pm_pteobj;
1328         struct rb_vm_page_scan_info info;
1329
1330         KASSERT(pmap->pm_active == 0, ("pmap still active! %08x", pmap->pm_active));
1331 #if defined(DIAGNOSTIC)
1332         if (object->ref_count != 1)
1333                 panic("pmap_release: pteobj reference count != 1");
1334 #endif
1335         
1336         info.pmap = pmap;
1337         info.object = object;
1338         crit_enter();
1339         TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
1340         crit_exit();
1341
1342         do {
1343                 crit_enter();
1344                 info.error = 0;
1345                 info.mpte = NULL;
1346                 info.limit = object->generation;
1347
1348                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, NULL, 
1349                                         pmap_release_callback, &info);
1350                 if (info.error == 0 && info.mpte) {
1351                         if (!pmap_release_free_page(pmap, info.mpte))
1352                                 info.error = 1;
1353                 }
1354                 crit_exit();
1355         } while (info.error);
1356 }
1357
1358 static int
1359 pmap_release_callback(struct vm_page *p, void *data)
1360 {
1361         struct rb_vm_page_scan_info *info = data;
1362
1363         if (p->pindex == PTDPTDI) {
1364                 info->mpte = p;
1365                 return(0);
1366         }
1367         if (!pmap_release_free_page(info->pmap, p)) {
1368                 info->error = 1;
1369                 return(-1);
1370         }
1371         if (info->object->generation != info->limit) {
1372                 info->error = 1;
1373                 return(-1);
1374         }
1375         return(0);
1376 }
1377
1378 /*
1379  * Grow the number of kernel page table entries, if needed.
1380  */
1381
1382 void
1383 pmap_growkernel(vm_offset_t addr)
1384 {
1385         struct pmap *pmap;
1386         vm_offset_t ptppaddr;
1387         vm_page_t nkpg;
1388         pd_entry_t newpdir;
1389
1390         crit_enter();
1391         if (kernel_vm_end == 0) {
1392                 kernel_vm_end = KERNBASE;
1393                 nkpt = 0;
1394                 while (pdir_pde(PTD, kernel_vm_end)) {
1395                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1396                         nkpt++;
1397                 }
1398         }
1399         addr = (addr + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1400         while (kernel_vm_end < addr) {
1401                 if (pdir_pde(PTD, kernel_vm_end)) {
1402                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1403                         continue;
1404                 }
1405
1406                 /*
1407                  * This index is bogus, but out of the way
1408                  */
1409                 nkpg = vm_page_alloc(kptobj, nkpt, 
1410                         VM_ALLOC_NORMAL | VM_ALLOC_SYSTEM | VM_ALLOC_INTERRUPT);
1411                 if (nkpg == NULL)
1412                         panic("pmap_growkernel: no memory to grow kernel");
1413
1414                 vm_page_wire(nkpg);
1415                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
1416                 pmap_zero_page(ptppaddr);
1417                 newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
1418                 pdir_pde(PTD, kernel_vm_end) = newpdir;
1419                 *pmap_pde(&kernel_pmap, kernel_vm_end) = newpdir;
1420                 nkpt++;
1421
1422                 /*
1423                  * This update must be interlocked with pmap_pinit2.
1424                  */
1425                 TAILQ_FOREACH(pmap, &pmap_list, pm_pmnode) {
1426                         *pmap_pde(pmap, kernel_vm_end) = newpdir;
1427                 }
1428                 kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) &
1429                                 ~(PAGE_SIZE * NPTEPG - 1);
1430         }
1431         crit_exit();
1432 }
1433
1434 /*
1435  *      Retire the given physical map from service.
1436  *      Should only be called if the map contains
1437  *      no valid mappings.
1438  */
1439 void
1440 pmap_destroy(pmap_t pmap)
1441 {
1442         int count;
1443
1444         if (pmap == NULL)
1445                 return;
1446
1447         count = --pmap->pm_count;
1448         if (count == 0) {
1449                 pmap_release(pmap);
1450                 panic("destroying a pmap is not yet implemented");
1451         }
1452 }
1453
1454 /*
1455  *      Add a reference to the specified pmap.
1456  */
1457 void
1458 pmap_reference(pmap_t pmap)
1459 {
1460         if (pmap != NULL) {
1461                 pmap->pm_count++;
1462         }
1463 }
1464
1465 /***************************************************
1466 * page management routines.
1467  ***************************************************/
1468
1469 /*
1470  * free the pv_entry back to the free list.  This function may be
1471  * called from an interrupt.
1472  */
1473 static PMAP_INLINE void
1474 free_pv_entry(pv_entry_t pv)
1475 {
1476         pv_entry_count--;
1477         zfree(pvzone, pv);
1478 }
1479
1480 /*
1481  * get a new pv_entry, allocating a block from the system
1482  * when needed.  This function may be called from an interrupt.
1483  */
1484 static pv_entry_t
1485 get_pv_entry(void)
1486 {
1487         pv_entry_count++;
1488         if (pv_entry_high_water &&
1489                 (pv_entry_count > pv_entry_high_water) &&
1490                 (pmap_pagedaemon_waken == 0)) {
1491                 pmap_pagedaemon_waken = 1;
1492                 wakeup (&vm_pages_needed);
1493         }
1494         return zalloc(pvzone);
1495 }
1496
1497 /*
1498  * This routine is very drastic, but can save the system
1499  * in a pinch.
1500  */
1501 void
1502 pmap_collect(void)
1503 {
1504         int i;
1505         vm_page_t m;
1506         static int warningdone=0;
1507
1508         if (pmap_pagedaemon_waken == 0)
1509                 return;
1510
1511         if (warningdone < 5) {
1512                 kprintf("pmap_collect: collecting pv entries -- suggest increasing PMAP_SHPGPERPROC\n");
1513                 warningdone++;
1514         }
1515
1516         for(i = 0; i < vm_page_array_size; i++) {
1517                 m = &vm_page_array[i];
1518                 if (m->wire_count || m->hold_count || m->busy ||
1519                     (m->flags & PG_BUSY))
1520                         continue;
1521                 pmap_remove_all(m);
1522         }
1523         pmap_pagedaemon_waken = 0;
1524 }
1525         
1526
1527 /*
1528  * If it is the first entry on the list, it is actually
1529  * in the header and we must copy the following entry up
1530  * to the header.  Otherwise we must search the list for
1531  * the entry.  In either case we free the now unused entry.
1532  */
1533 static int
1534 pmap_remove_entry(struct pmap *pmap, vm_page_t m, 
1535                         vm_offset_t va, pmap_inval_info_t info)
1536 {
1537         pv_entry_t pv;
1538         int rtval;
1539
1540         crit_enter();
1541         if (m->md.pv_list_count < pmap->pm_stats.resident_count) {
1542                 TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
1543                         if (pmap == pv->pv_pmap && va == pv->pv_va) 
1544                                 break;
1545                 }
1546         } else {
1547                 TAILQ_FOREACH(pv, &pmap->pm_pvlist, pv_plist) {
1548                         if (va == pv->pv_va) 
1549                                 break;
1550                 }
1551         }
1552
1553         rtval = 0;
1554         if (pv) {
1555                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1556                 m->md.pv_list_count--;
1557                 if (TAILQ_FIRST(&m->md.pv_list) == NULL)
1558                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1559                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
1560                 ++pmap->pm_generation;
1561                 rtval = pmap_unuse_pt(pmap, va, pv->pv_ptem, info);
1562                 free_pv_entry(pv);
1563         }
1564         crit_exit();
1565         return rtval;
1566 }
1567
1568 /*
1569  * Create a pv entry for page at pa for
1570  * (pmap, va).
1571  */
1572 static void
1573 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m)
1574 {
1575         pv_entry_t pv;
1576
1577         crit_enter();
1578         pv = get_pv_entry();
1579         pv->pv_va = va;
1580         pv->pv_pmap = pmap;
1581         pv->pv_ptem = mpte;
1582
1583         TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
1584         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1585         m->md.pv_list_count++;
1586
1587         crit_exit();
1588 }
1589
1590 /*
1591  * pmap_remove_pte: do the things to unmap a page in a process
1592  */
1593 static int
1594 pmap_remove_pte(struct pmap *pmap, unsigned *ptq, vm_offset_t va,
1595         pmap_inval_info_t info)
1596 {
1597         unsigned oldpte;
1598         vm_page_t m;
1599
1600         pmap_inval_add(info, pmap, va);
1601         oldpte = loadandclear(ptq);
1602         if (oldpte & PG_W)
1603                 pmap->pm_stats.wired_count -= 1;
1604         /*
1605          * Machines that don't support invlpg, also don't support
1606          * PG_G.  XXX PG_G is disabled for SMP so don't worry about
1607          * the SMP case.
1608          */
1609         if (oldpte & PG_G)
1610                 cpu_invlpg((void *)va);
1611         KKASSERT(pmap->pm_stats.resident_count > 0);
1612         --pmap->pm_stats.resident_count;
1613         if (oldpte & PG_MANAGED) {
1614                 m = PHYS_TO_VM_PAGE(oldpte);
1615                 if (oldpte & PG_M) {
1616 #if defined(PMAP_DIAGNOSTIC)
1617                         if (pmap_nw_modified((pt_entry_t) oldpte)) {
1618                                 kprintf(
1619         "pmap_remove: modified page not writable: va: 0x%x, pte: 0x%x\n",
1620                                     va, oldpte);
1621                         }
1622 #endif
1623                         if (pmap_track_modified(va))
1624                                 vm_page_dirty(m);
1625                 }
1626                 if (oldpte & PG_A)
1627                         vm_page_flag_set(m, PG_REFERENCED);
1628                 return pmap_remove_entry(pmap, m, va, info);
1629         } else {
1630                 return pmap_unuse_pt(pmap, va, NULL, info);
1631         }
1632
1633         return 0;
1634 }
1635
1636 /*
1637  * pmap_remove_page:
1638  *
1639  *      Remove a single page from a process address space.
1640  *
1641  *      This function may not be called from an interrupt if the pmap is
1642  *      not kernel_pmap.
1643  */
1644 static void
1645 pmap_remove_page(struct pmap *pmap, vm_offset_t va, pmap_inval_info_t info)
1646 {
1647         unsigned *ptq;
1648
1649         /*
1650          * if there is no pte for this address, just skip it!!!  Otherwise
1651          * get a local va for mappings for this pmap and remove the entry.
1652          */
1653         if (*pmap_pde(pmap, va) != 0) {
1654                 ptq = get_ptbase(pmap) + i386_btop(va);
1655                 if (*ptq) {
1656                         pmap_remove_pte(pmap, ptq, va, info);
1657                 }
1658         }
1659 }
1660
1661 /*
1662  * pmap_remove:
1663  *
1664  *      Remove the given range of addresses from the specified map.
1665  *
1666  *      It is assumed that the start and end are properly
1667  *      rounded to the page size.
1668  *
1669  *      This function may not be called from an interrupt if the pmap is
1670  *      not kernel_pmap.
1671  */
1672 void
1673 pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
1674 {
1675         unsigned *ptbase;
1676         vm_offset_t pdnxt;
1677         vm_offset_t ptpaddr;
1678         vm_offset_t sindex, eindex;
1679         struct pmap_inval_info info;
1680
1681         if (pmap == NULL)
1682                 return;
1683
1684         if (pmap->pm_stats.resident_count == 0)
1685                 return;
1686
1687         pmap_inval_init(&info);
1688
1689         /*
1690          * special handling of removing one page.  a very
1691          * common operation and easy to short circuit some
1692          * code.
1693          */
1694         if (((sva + PAGE_SIZE) == eva) && 
1695                 (((unsigned) pmap->pm_pdir[(sva >> PDRSHIFT)] & PG_PS) == 0)) {
1696                 pmap_remove_page(pmap, sva, &info);
1697                 pmap_inval_flush(&info);
1698                 return;
1699         }
1700
1701         /*
1702          * Get a local virtual address for the mappings that are being
1703          * worked with.
1704          */
1705         sindex = i386_btop(sva);
1706         eindex = i386_btop(eva);
1707
1708         for (; sindex < eindex; sindex = pdnxt) {
1709                 unsigned pdirindex;
1710
1711                 /*
1712                  * Calculate index for next page table.
1713                  */
1714                 pdnxt = ((sindex + NPTEPG) & ~(NPTEPG - 1));
1715                 if (pmap->pm_stats.resident_count == 0)
1716                         break;
1717
1718                 pdirindex = sindex / NPDEPG;
1719                 if (((ptpaddr = (unsigned) pmap->pm_pdir[pdirindex]) & PG_PS) != 0) {
1720                         pmap_inval_add(&info, pmap, -1);
1721                         pmap->pm_pdir[pdirindex] = 0;
1722                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1723                         continue;
1724                 }
1725
1726                 /*
1727                  * Weed out invalid mappings. Note: we assume that the page
1728                  * directory table is always allocated, and in kernel virtual.
1729                  */
1730                 if (ptpaddr == 0)
1731                         continue;
1732
1733                 /*
1734                  * Limit our scan to either the end of the va represented
1735                  * by the current page table page, or to the end of the
1736                  * range being removed.
1737                  */
1738                 if (pdnxt > eindex) {
1739                         pdnxt = eindex;
1740                 }
1741
1742                 /*
1743                  * NOTE: pmap_remove_pte() can block.
1744                  */
1745                 for (; sindex != pdnxt; sindex++) {
1746                         vm_offset_t va;
1747
1748                         ptbase = get_ptbase(pmap);
1749                         if (ptbase[sindex] == 0)
1750                                 continue;
1751                         va = i386_ptob(sindex);
1752                         if (pmap_remove_pte(pmap, ptbase + sindex, va, &info))
1753                                 break;
1754                 }
1755         }
1756         pmap_inval_flush(&info);
1757 }
1758
1759 /*
1760  * pmap_remove_all:
1761  *
1762  *      Removes this physical page from all physical maps in which it resides.
1763  *      Reflects back modify bits to the pager.
1764  *
1765  *      This routine may not be called from an interrupt.
1766  */
1767
1768 static void
1769 pmap_remove_all(vm_page_t m)
1770 {
1771         struct pmap_inval_info info;
1772         unsigned *pte, tpte;
1773         pv_entry_t pv;
1774
1775         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
1776                 return;
1777
1778         pmap_inval_init(&info);
1779         crit_enter();
1780         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
1781                 KKASSERT(pv->pv_pmap->pm_stats.resident_count > 0);
1782                 --pv->pv_pmap->pm_stats.resident_count;
1783
1784                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
1785                 pmap_inval_add(&info, pv->pv_pmap, pv->pv_va);
1786
1787                 tpte = loadandclear(pte);
1788                 if (tpte & PG_W)
1789                         pv->pv_pmap->pm_stats.wired_count--;
1790
1791                 if (tpte & PG_A)
1792                         vm_page_flag_set(m, PG_REFERENCED);
1793
1794                 /*
1795                  * Update the vm_page_t clean and reference bits.
1796                  */
1797                 if (tpte & PG_M) {
1798 #if defined(PMAP_DIAGNOSTIC)
1799                         if (pmap_nw_modified((pt_entry_t) tpte)) {
1800                                 kprintf(
1801         "pmap_remove_all: modified page not writable: va: 0x%x, pte: 0x%x\n",
1802                                     pv->pv_va, tpte);
1803                         }
1804 #endif
1805                         if (pmap_track_modified(pv->pv_va))
1806                                 vm_page_dirty(m);
1807                 }
1808                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1809                 TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
1810                 ++pv->pv_pmap->pm_generation;
1811                 m->md.pv_list_count--;
1812                 pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem, &info);
1813                 free_pv_entry(pv);
1814         }
1815
1816         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1817         crit_exit();
1818         pmap_inval_flush(&info);
1819 }
1820
1821 /*
1822  * pmap_protect:
1823  *
1824  *      Set the physical protection on the specified range of this map
1825  *      as requested.
1826  *
1827  *      This function may not be called from an interrupt if the map is
1828  *      not the kernel_pmap.
1829  */
1830 void
1831 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
1832 {
1833         unsigned *ptbase;
1834         vm_offset_t pdnxt, ptpaddr;
1835         vm_pindex_t sindex, eindex;
1836         pmap_inval_info info;
1837
1838         if (pmap == NULL)
1839                 return;
1840
1841         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
1842                 pmap_remove(pmap, sva, eva);
1843                 return;
1844         }
1845
1846         if (prot & VM_PROT_WRITE)
1847                 return;
1848
1849         pmap_inval_init(&info);
1850
1851         ptbase = get_ptbase(pmap);
1852
1853         sindex = i386_btop(sva);
1854         eindex = i386_btop(eva);
1855
1856         for (; sindex < eindex; sindex = pdnxt) {
1857
1858                 unsigned pdirindex;
1859
1860                 pdnxt = ((sindex + NPTEPG) & ~(NPTEPG - 1));
1861
1862                 pdirindex = sindex / NPDEPG;
1863                 if (((ptpaddr = (unsigned) pmap->pm_pdir[pdirindex]) & PG_PS) != 0) {
1864                         pmap_inval_add(&info, pmap, -1);
1865                         pmap->pm_pdir[pdirindex] &= ~(PG_M|PG_RW);
1866                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1867                         continue;
1868                 }
1869
1870                 /*
1871                  * Weed out invalid mappings. Note: we assume that the page
1872                  * directory table is always allocated, and in kernel virtual.
1873                  */
1874                 if (ptpaddr == 0)
1875                         continue;
1876
1877                 if (pdnxt > eindex) {
1878                         pdnxt = eindex;
1879                 }
1880
1881                 for (; sindex != pdnxt; sindex++) {
1882
1883                         unsigned pbits;
1884                         vm_page_t m;
1885
1886                         /* XXX this isn't optimal */
1887                         pmap_inval_add(&info, pmap, i386_ptob(sindex));
1888                         pbits = ptbase[sindex];
1889
1890                         if (pbits & PG_MANAGED) {
1891                                 m = NULL;
1892                                 if (pbits & PG_A) {
1893                                         m = PHYS_TO_VM_PAGE(pbits);
1894                                         vm_page_flag_set(m, PG_REFERENCED);
1895                                         pbits &= ~PG_A;
1896                                 }
1897                                 if (pbits & PG_M) {
1898                                         if (pmap_track_modified(i386_ptob(sindex))) {
1899                                                 if (m == NULL)
1900                                                         m = PHYS_TO_VM_PAGE(pbits);
1901                                                 vm_page_dirty(m);
1902                                                 pbits &= ~PG_M;
1903                                         }
1904                                 }
1905                         }
1906
1907                         pbits &= ~PG_RW;
1908
1909                         if (pbits != ptbase[sindex]) {
1910                                 ptbase[sindex] = pbits;
1911                         }
1912                 }
1913         }
1914         pmap_inval_flush(&info);
1915 }
1916
1917 /*
1918  *      Insert the given physical page (p) at
1919  *      the specified virtual address (v) in the
1920  *      target physical map with the protection requested.
1921  *
1922  *      If specified, the page will be wired down, meaning
1923  *      that the related pte can not be reclaimed.
1924  *
1925  *      NB:  This is the only routine which MAY NOT lazy-evaluate
1926  *      or lose information.  That is, this routine must actually
1927  *      insert this page into the given map NOW.
1928  */
1929 void
1930 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
1931            boolean_t wired)
1932 {
1933         vm_paddr_t pa;
1934         unsigned *pte;
1935         vm_paddr_t opa;
1936         vm_offset_t origpte, newpte;
1937         vm_page_t mpte;
1938         pmap_inval_info info;
1939
1940         if (pmap == NULL)
1941                 return;
1942
1943         va &= PG_FRAME;
1944 #ifdef PMAP_DIAGNOSTIC
1945         if (va >= KvaEnd)
1946                 panic("pmap_enter: toobig");
1947         if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS))
1948                 panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va);
1949 #endif
1950         if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
1951                 kprintf("Warning: pmap_enter called on UVA with kernel_pmap\n");
1952 #ifdef DDB
1953                 db_print_backtrace();
1954 #endif
1955         }
1956         if (va >= UPT_MAX_ADDRESS && pmap != &kernel_pmap) {
1957                 kprintf("Warning: pmap_enter called on KVA without kernel_pmap\n");
1958 #ifdef DDB
1959                 db_print_backtrace();
1960 #endif
1961         }
1962
1963         mpte = NULL;
1964         /*
1965          * In the case that a page table page is not
1966          * resident, we are creating it here.
1967          */
1968         if (va < UPT_MIN_ADDRESS) {
1969                 mpte = pmap_allocpte(pmap, va);
1970         }
1971
1972         pmap_inval_init(&info);
1973         pte = pmap_pte(pmap, va);
1974
1975         /*
1976          * Page Directory table entry not valid, we need a new PT page
1977          */
1978         if (pte == NULL) {
1979                 panic("pmap_enter: invalid page directory pdir=%x, va=0x%x\n",
1980                      (unsigned) pmap->pm_pdir[PTDPTDI], va);
1981         }
1982
1983         pa = VM_PAGE_TO_PHYS(m) & PG_FRAME;
1984         pmap_inval_add(&info, pmap, va); /* XXX non-optimal */
1985         origpte = *(vm_offset_t *)pte;
1986         opa = origpte & PG_FRAME;
1987
1988         if (origpte & PG_PS)
1989                 panic("pmap_enter: attempted pmap_enter on 4MB page");
1990
1991         /*
1992          * Mapping has not changed, must be protection or wiring change.
1993          */
1994         if (origpte && (opa == pa)) {
1995                 /*
1996                  * Wiring change, just update stats. We don't worry about
1997                  * wiring PT pages as they remain resident as long as there
1998                  * are valid mappings in them. Hence, if a user page is wired,
1999                  * the PT page will be also.
2000                  */
2001                 if (wired && ((origpte & PG_W) == 0))
2002                         pmap->pm_stats.wired_count++;
2003                 else if (!wired && (origpte & PG_W))
2004                         pmap->pm_stats.wired_count--;
2005
2006 #if defined(PMAP_DIAGNOSTIC)
2007                 if (pmap_nw_modified((pt_entry_t) origpte)) {
2008                         kprintf(
2009         "pmap_enter: modified page not writable: va: 0x%x, pte: 0x%x\n",
2010                             va, origpte);
2011                 }
2012 #endif
2013
2014                 /*
2015                  * Remove the extra pte reference.  Note that we cannot
2016                  * optimize the RO->RW case because we have adjusted the
2017                  * wiring count above and may need to adjust the wiring
2018                  * bits below.
2019                  */
2020                 if (mpte)
2021                         mpte->hold_count--;
2022
2023                 /*
2024                  * We might be turning off write access to the page,
2025                  * so we go ahead and sense modify status.
2026                  */
2027                 if (origpte & PG_MANAGED) {
2028                         if ((origpte & PG_M) && pmap_track_modified(va)) {
2029                                 vm_page_t om;
2030                                 om = PHYS_TO_VM_PAGE(opa);
2031                                 vm_page_dirty(om);
2032                         }
2033                         pa |= PG_MANAGED;
2034                 }
2035                 goto validate;
2036         } 
2037         /*
2038          * Mapping has changed, invalidate old range and fall through to
2039          * handle validating new mapping.
2040          */
2041         if (opa) {
2042                 int err;
2043                 err = pmap_remove_pte(pmap, pte, va, &info);
2044                 if (err)
2045                         panic("pmap_enter: pte vanished, va: 0x%x", va);
2046         }
2047
2048         /*
2049          * Enter on the PV list if part of our managed memory. Note that we
2050          * raise IPL while manipulating pv_table since pmap_enter can be
2051          * called at interrupt time.
2052          */
2053         if (pmap_initialized && 
2054             (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
2055                 pmap_insert_entry(pmap, va, mpte, m);
2056                 pa |= PG_MANAGED;
2057         }
2058
2059         /*
2060          * Increment counters
2061          */
2062         ++pmap->pm_stats.resident_count;
2063         if (wired)
2064                 pmap->pm_stats.wired_count++;
2065
2066 validate:
2067         /*
2068          * Now validate mapping with desired protection/wiring.
2069          */
2070         newpte = (vm_offset_t) (pa | pte_prot(pmap, prot) | PG_V);
2071
2072         if (wired)
2073                 newpte |= PG_W;
2074         if (va < UPT_MIN_ADDRESS)
2075                 newpte |= PG_U;
2076         if (pmap == &kernel_pmap)
2077                 newpte |= pgeflag;
2078
2079         /*
2080          * if the mapping or permission bits are different, we need
2081          * to update the pte.
2082          */
2083         if ((origpte & ~(PG_M|PG_A)) != newpte) {
2084                 *pte = newpte | PG_A;
2085         }
2086         pmap_inval_flush(&info);
2087 }
2088
2089 /*
2090  * this code makes some *MAJOR* assumptions:
2091  * 1. Current pmap & pmap exists.
2092  * 2. Not wired.
2093  * 3. Read access.
2094  * 4. No page table pages.
2095  * 5. Tlbflush is deferred to calling procedure.
2096  * 6. Page IS managed.
2097  * but is *MUCH* faster than pmap_enter...
2098  */
2099
2100 static vm_page_t
2101 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
2102 {
2103         unsigned *pte;
2104         vm_paddr_t pa;
2105         pmap_inval_info info;
2106
2107         pmap_inval_init(&info);
2108
2109         if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
2110                 kprintf("Warning: pmap_enter_quick called on UVA with kernel_pmap\n");
2111 #ifdef DDB
2112                 db_print_backtrace();
2113 #endif
2114         }
2115         if (va >= UPT_MAX_ADDRESS && pmap != &kernel_pmap) {
2116                 kprintf("Warning: pmap_enter_quick called on KVA without kernel_pmap\n");
2117 #ifdef DDB
2118                 db_print_backtrace();
2119 #endif
2120         }
2121
2122         /*
2123          * In the case that a page table page is not
2124          * resident, we are creating it here.
2125          */
2126         if (va < UPT_MIN_ADDRESS) {
2127                 unsigned ptepindex;
2128                 vm_offset_t ptepa;
2129
2130                 /*
2131                  * Calculate pagetable page index
2132                  */
2133                 ptepindex = va >> PDRSHIFT;
2134                 if (mpte && (mpte->pindex == ptepindex)) {
2135                         mpte->hold_count++;
2136                 } else {
2137 retry:
2138                         /*
2139                          * Get the page directory entry
2140                          */
2141                         ptepa = (vm_offset_t) pmap->pm_pdir[ptepindex];
2142
2143                         /*
2144                          * If the page table page is mapped, we just increment
2145                          * the hold count, and activate it.
2146                          */
2147                         if (ptepa) {
2148                                 if (ptepa & PG_PS)
2149                                         panic("pmap_enter_quick: unexpected mapping into 4MB page");
2150                                 if (pmap->pm_ptphint &&
2151                                         (pmap->pm_ptphint->pindex == ptepindex)) {
2152                                         mpte = pmap->pm_ptphint;
2153                                 } else {
2154                                         mpte = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
2155                                         pmap->pm_ptphint = mpte;
2156                                 }
2157                                 if (mpte == NULL)
2158                                         goto retry;
2159                                 mpte->hold_count++;
2160                         } else {
2161                                 mpte = _pmap_allocpte(pmap, ptepindex);
2162                         }
2163                 }
2164         } else {
2165                 mpte = NULL;
2166         }
2167
2168         /*
2169          * This call to vtopte makes the assumption that we are
2170          * entering the page into the current pmap.  In order to support
2171          * quick entry into any pmap, one would likely use pmap_pte_quick.
2172          * But that isn't as quick as vtopte.
2173          */
2174         pte = (unsigned *)vtopte(va);
2175         if (*pte) {
2176                 if (mpte)
2177                         pmap_unwire_pte_hold(pmap, mpte, &info);
2178                 return 0;
2179         }
2180
2181         /*
2182          * Enter on the PV list if part of our managed memory. Note that we
2183          * raise IPL while manipulating pv_table since pmap_enter can be
2184          * called at interrupt time.
2185          */
2186         if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0)
2187                 pmap_insert_entry(pmap, va, mpte, m);
2188
2189         /*
2190          * Increment counters
2191          */
2192         ++pmap->pm_stats.resident_count;
2193
2194         pa = VM_PAGE_TO_PHYS(m);
2195
2196         /*
2197          * Now validate mapping with RO protection
2198          */
2199         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
2200                 *pte = pa | PG_V | PG_U;
2201         else
2202                 *pte = pa | PG_V | PG_U | PG_MANAGED;
2203
2204         return mpte;
2205 }
2206
2207 /*
2208  * Make a temporary mapping for a physical address.  This is only intended
2209  * to be used for panic dumps.
2210  */
2211 void *
2212 pmap_kenter_temporary(vm_paddr_t pa, int i)
2213 {
2214         pmap_kenter((vm_offset_t)crashdumpmap + (i * PAGE_SIZE), pa);
2215         return ((void *)crashdumpmap);
2216 }
2217
2218 #define MAX_INIT_PT (96)
2219
2220 /*
2221  * This routine preloads the ptes for a given object into the specified pmap.
2222  * This eliminates the blast of soft faults on process startup and
2223  * immediately after an mmap.
2224  */
2225 static int pmap_object_init_pt_callback(vm_page_t p, void *data);
2226
2227 void
2228 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
2229                     vm_object_t object, vm_pindex_t pindex, 
2230                     vm_size_t size, int limit)
2231 {
2232         struct rb_vm_page_scan_info info;
2233         struct lwp *lp;
2234         int psize;
2235
2236         /*
2237          * We can't preinit if read access isn't set or there is no pmap
2238          * or object.
2239          */
2240         if ((prot & VM_PROT_READ) == 0 || pmap == NULL || object == NULL)
2241                 return;
2242
2243         /*
2244          * We can't preinit if the pmap is not the current pmap
2245          */
2246         lp = curthread->td_lwp;
2247         if (lp == NULL || pmap != vmspace_pmap(lp->lwp_vmspace))
2248                 return;
2249
2250         psize = i386_btop(size);
2251
2252         if ((object->type != OBJT_VNODE) ||
2253                 ((limit & MAP_PREFAULT_PARTIAL) && (psize > MAX_INIT_PT) &&
2254                         (object->resident_page_count > MAX_INIT_PT))) {
2255                 return;
2256         }
2257
2258         if (psize + pindex > object->size) {
2259                 if (object->size < pindex)
2260                         return;           
2261                 psize = object->size - pindex;
2262         }
2263
2264         if (psize == 0)
2265                 return;
2266
2267         /*
2268          * Use a red-black scan to traverse the requested range and load
2269          * any valid pages found into the pmap.
2270          *
2271          * We cannot safely scan the object's memq unless we are in a
2272          * critical section since interrupts can remove pages from objects.
2273          */
2274         info.start_pindex = pindex;
2275         info.end_pindex = pindex + psize - 1;
2276         info.limit = limit;
2277         info.mpte = NULL;
2278         info.addr = addr;
2279         info.pmap = pmap;
2280
2281         crit_enter();
2282         vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
2283                                 pmap_object_init_pt_callback, &info);
2284         crit_exit();
2285 }
2286
2287 static
2288 int
2289 pmap_object_init_pt_callback(vm_page_t p, void *data)
2290 {
2291         struct rb_vm_page_scan_info *info = data;
2292         vm_pindex_t rel_index;
2293         /*
2294          * don't allow an madvise to blow away our really
2295          * free pages allocating pv entries.
2296          */
2297         if ((info->limit & MAP_PREFAULT_MADVISE) &&
2298                 vmstats.v_free_count < vmstats.v_free_reserved) {
2299                     return(-1);
2300         }
2301         if (((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
2302             (p->busy == 0) && (p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
2303                 if ((p->queue - p->pc) == PQ_CACHE)
2304                         vm_page_deactivate(p);
2305                 vm_page_busy(p);
2306                 rel_index = p->pindex - info->start_pindex;
2307                 info->mpte = pmap_enter_quick(info->pmap,
2308                                               info->addr + i386_ptob(rel_index),
2309                                               p, info->mpte);
2310                 vm_page_flag_set(p, PG_MAPPED);
2311                 vm_page_wakeup(p);
2312         }
2313         return(0);
2314 }
2315
2316 /*
2317  * pmap_prefault provides a quick way of clustering pagefaults into a
2318  * processes address space.  It is a "cousin" of pmap_object_init_pt, 
2319  * except it runs at page fault time instead of mmap time.
2320  */
2321 #define PFBAK 4
2322 #define PFFOR 4
2323 #define PAGEORDER_SIZE (PFBAK+PFFOR)
2324
2325 static int pmap_prefault_pageorder[] = {
2326         -PAGE_SIZE, PAGE_SIZE,
2327         -2 * PAGE_SIZE, 2 * PAGE_SIZE,
2328         -3 * PAGE_SIZE, 3 * PAGE_SIZE,
2329         -4 * PAGE_SIZE, 4 * PAGE_SIZE
2330 };
2331
2332 void
2333 pmap_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry)
2334 {
2335         int i;
2336         vm_offset_t starta;
2337         vm_offset_t addr;
2338         vm_pindex_t pindex;
2339         vm_page_t m, mpte;
2340         vm_object_t object;
2341         struct lwp *lp;
2342
2343         /*
2344          * We do not currently prefault mappings that use virtual page
2345          * tables.  We do not prefault foreign pmaps.
2346          */
2347         if (entry->maptype == VM_MAPTYPE_VPAGETABLE)
2348                 return;
2349         lp = curthread->td_lwp;
2350         if (lp == NULL || (pmap != vmspace_pmap(lp->lwp_vmspace)))
2351                 return;
2352
2353         object = entry->object.vm_object;
2354
2355         starta = addra - PFBAK * PAGE_SIZE;
2356         if (starta < entry->start)
2357                 starta = entry->start;
2358         else if (starta > addra)
2359                 starta = 0;
2360
2361         /*
2362          * critical section protection is required to maintain the 
2363          * page/object association, interrupts can free pages and remove 
2364          * them from their objects.
2365          */
2366         mpte = NULL;
2367         crit_enter();
2368         for (i = 0; i < PAGEORDER_SIZE; i++) {
2369                 vm_object_t lobject;
2370                 unsigned *pte;
2371
2372                 addr = addra + pmap_prefault_pageorder[i];
2373                 if (addr > addra + (PFFOR * PAGE_SIZE))
2374                         addr = 0;
2375
2376                 if (addr < starta || addr >= entry->end)
2377                         continue;
2378
2379                 if ((*pmap_pde(pmap, addr)) == NULL) 
2380                         continue;
2381
2382                 pte = (unsigned *) vtopte(addr);
2383                 if (*pte)
2384                         continue;
2385
2386                 pindex = ((addr - entry->start) + entry->offset) >> PAGE_SHIFT;
2387                 lobject = object;
2388
2389                 for (m = vm_page_lookup(lobject, pindex);
2390                     (!m && (lobject->type == OBJT_DEFAULT) &&
2391                      (lobject->backing_object));
2392                     lobject = lobject->backing_object
2393                 ) {
2394                         if (lobject->backing_object_offset & PAGE_MASK)
2395                                 break;
2396                         pindex += (lobject->backing_object_offset >> PAGE_SHIFT);
2397                         m = vm_page_lookup(lobject->backing_object, pindex);
2398                 }
2399
2400                 /*
2401                  * give-up when a page is not in memory
2402                  */
2403                 if (m == NULL)
2404                         break;
2405
2406                 if (((m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
2407                         (m->busy == 0) &&
2408                     (m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
2409
2410                         if ((m->queue - m->pc) == PQ_CACHE) {
2411                                 vm_page_deactivate(m);
2412                         }
2413                         vm_page_busy(m);
2414                         mpte = pmap_enter_quick(pmap, addr, m, mpte);
2415                         vm_page_flag_set(m, PG_MAPPED);
2416                         vm_page_wakeup(m);
2417                 }
2418         }
2419         crit_exit();
2420 }
2421
2422 /*
2423  *      Routine:        pmap_change_wiring
2424  *      Function:       Change the wiring attribute for a map/virtual-address
2425  *                      pair.
2426  *      In/out conditions:
2427  *                      The mapping must already exist in the pmap.
2428  */
2429 void
2430 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
2431 {
2432         unsigned *pte;
2433
2434         if (pmap == NULL)
2435                 return;
2436
2437         pte = pmap_pte(pmap, va);
2438
2439         if (wired && !pmap_pte_w(pte))
2440                 pmap->pm_stats.wired_count++;
2441         else if (!wired && pmap_pte_w(pte))
2442                 pmap->pm_stats.wired_count--;
2443
2444         /*
2445          * Wiring is not a hardware characteristic so there is no need to
2446          * invalidate TLB.  However, in an SMP environment we must use
2447          * a locked bus cycle to update the pte (if we are not using 
2448          * the pmap_inval_*() API that is)... it's ok to do this for simple
2449          * wiring changes.
2450          */
2451 #ifdef SMP
2452         if (wired)
2453                 atomic_set_int(pte, PG_W);
2454         else
2455                 atomic_clear_int(pte, PG_W);
2456 #else
2457         if (wired)
2458                 atomic_set_int_nonlocked(pte, PG_W);
2459         else
2460                 atomic_clear_int_nonlocked(pte, PG_W);
2461 #endif
2462 }
2463
2464
2465
2466 /*
2467  *      Copy the range specified by src_addr/len
2468  *      from the source map to the range dst_addr/len
2469  *      in the destination map.
2470  *
2471  *      This routine is only advisory and need not do anything.
2472  */
2473 void
2474 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, 
2475         vm_size_t len, vm_offset_t src_addr)
2476 {
2477         pmap_inval_info info;
2478         vm_offset_t addr;
2479         vm_offset_t end_addr = src_addr + len;
2480         vm_offset_t pdnxt;
2481         unsigned src_frame, dst_frame;
2482         vm_page_t m;
2483
2484         if (dst_addr != src_addr)
2485                 return;
2486
2487         src_frame = ((unsigned) src_pmap->pm_pdir[PTDPTDI]) & PG_FRAME;
2488         if (src_frame != (((unsigned) PTDpde) & PG_FRAME)) {
2489                 return;
2490         }
2491
2492         dst_frame = ((unsigned) dst_pmap->pm_pdir[PTDPTDI]) & PG_FRAME;
2493         if (dst_frame != (((unsigned) APTDpde) & PG_FRAME)) {
2494                 APTDpde = (pd_entry_t) (dst_frame | PG_RW | PG_V);
2495                 /* The page directory is not shared between CPUs */
2496                 cpu_invltlb();
2497         }
2498         pmap_inval_init(&info);
2499         pmap_inval_add(&info, dst_pmap, -1);
2500         pmap_inval_add(&info, src_pmap, -1);
2501
2502         /*
2503          * critical section protection is required to maintain the page/object
2504          * association, interrupts can free pages and remove them from 
2505          * their objects.
2506          */
2507         crit_enter();
2508         for (addr = src_addr; addr < end_addr; addr = pdnxt) {
2509                 unsigned *src_pte, *dst_pte;
2510                 vm_page_t dstmpte, srcmpte;
2511                 vm_offset_t srcptepaddr;
2512                 unsigned ptepindex;
2513
2514                 if (addr >= UPT_MIN_ADDRESS)
2515                         panic("pmap_copy: invalid to pmap_copy page tables\n");
2516
2517                 /*
2518                  * Don't let optional prefaulting of pages make us go
2519                  * way below the low water mark of free pages or way
2520                  * above high water mark of used pv entries.
2521                  */
2522                 if (vmstats.v_free_count < vmstats.v_free_reserved ||
2523                     pv_entry_count > pv_entry_high_water)
2524                         break;
2525                 
2526                 pdnxt = ((addr + PAGE_SIZE*NPTEPG) & ~(PAGE_SIZE*NPTEPG - 1));
2527                 ptepindex = addr >> PDRSHIFT;
2528
2529                 srcptepaddr = (vm_offset_t) src_pmap->pm_pdir[ptepindex];
2530                 if (srcptepaddr == 0)
2531                         continue;
2532                         
2533                 if (srcptepaddr & PG_PS) {
2534                         if (dst_pmap->pm_pdir[ptepindex] == 0) {
2535                                 dst_pmap->pm_pdir[ptepindex] = (pd_entry_t) srcptepaddr;
2536                                 dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE;
2537                         }
2538                         continue;
2539                 }
2540
2541                 srcmpte = vm_page_lookup(src_pmap->pm_pteobj, ptepindex);
2542                 if ((srcmpte == NULL) ||
2543                         (srcmpte->hold_count == 0) || (srcmpte->flags & PG_BUSY))
2544                         continue;
2545
2546                 if (pdnxt > end_addr)
2547                         pdnxt = end_addr;
2548
2549                 src_pte = (unsigned *) vtopte(addr);
2550                 dst_pte = (unsigned *) avtopte(addr);
2551                 while (addr < pdnxt) {
2552                         unsigned ptetemp;
2553
2554                         ptetemp = *src_pte;
2555                         /*
2556                          * we only virtual copy managed pages
2557                          */
2558                         if ((ptetemp & PG_MANAGED) != 0) {
2559                                 /*
2560                                  * We have to check after allocpte for the
2561                                  * pte still being around...  allocpte can
2562                                  * block.
2563                                  *
2564                                  * pmap_allocpte() can block.  If we lose
2565                                  * our page directory mappings we stop.
2566                                  */
2567                                 dstmpte = pmap_allocpte(dst_pmap, addr);
2568
2569                                 if (src_frame != (((unsigned) PTDpde) & PG_FRAME) ||
2570                                     dst_frame != (((unsigned) APTDpde) & PG_FRAME)
2571                                 ) {
2572                                         kprintf("WARNING: pmap_copy: detected and corrected race\n");
2573                                         pmap_unwire_pte_hold(dst_pmap, dstmpte, &info);
2574                                         goto failed;
2575                                 } else if ((*dst_pte == 0) && (ptetemp = *src_pte)) {
2576                                         /*
2577                                          * Clear the modified and
2578                                          * accessed (referenced) bits
2579                                          * during the copy.
2580                                          */
2581                                         m = PHYS_TO_VM_PAGE(ptetemp);
2582                                         *dst_pte = ptetemp & ~(PG_M | PG_A);
2583                                         ++dst_pmap->pm_stats.resident_count;
2584                                         pmap_insert_entry(dst_pmap, addr,
2585                                                 dstmpte, m);
2586                                 } else {
2587                                         pmap_unwire_pte_hold(dst_pmap, dstmpte, &info);
2588                                 }
2589                                 if (dstmpte->hold_count >= srcmpte->hold_count)
2590                                         break;
2591                         }
2592                         addr += PAGE_SIZE;
2593                         src_pte++;
2594                         dst_pte++;
2595                 }
2596         }
2597 failed:
2598         crit_exit();
2599         pmap_inval_flush(&info);
2600 }       
2601
2602 /*
2603  * pmap_zero_page:
2604  *
2605  *      Zero the specified PA by mapping the page into KVM and clearing its
2606  *      contents.
2607  *
2608  *      This function may be called from an interrupt and no locking is
2609  *      required.
2610  */
2611 void
2612 pmap_zero_page(vm_paddr_t phys)
2613 {
2614         struct mdglobaldata *gd = mdcpu;
2615
2616         crit_enter();
2617         if (*(int *)gd->gd_CMAP3)
2618                 panic("pmap_zero_page: CMAP3 busy");
2619         *(int *)gd->gd_CMAP3 =
2620                     PG_V | PG_RW | (phys & PG_FRAME) | PG_A | PG_M;
2621         cpu_invlpg(gd->gd_CADDR3);
2622
2623 #if defined(I686_CPU)
2624         if (cpu_class == CPUCLASS_686)
2625                 i686_pagezero(gd->gd_CADDR3);
2626         else
2627 #endif
2628                 bzero(gd->gd_CADDR3, PAGE_SIZE);
2629         *(int *) gd->gd_CMAP3 = 0;
2630         crit_exit();
2631 }
2632
2633 /*
2634  * pmap_page_assertzero:
2635  *
2636  *      Assert that a page is empty, panic if it isn't.
2637  */
2638 void
2639 pmap_page_assertzero(vm_paddr_t phys)
2640 {
2641         struct mdglobaldata *gd = mdcpu;
2642         int i;
2643
2644         crit_enter();
2645         if (*(int *)gd->gd_CMAP3)
2646                 panic("pmap_zero_page: CMAP3 busy");
2647         *(int *)gd->gd_CMAP3 =
2648                     PG_V | PG_RW | (phys & PG_FRAME) | PG_A | PG_M;
2649         cpu_invlpg(gd->gd_CADDR3);
2650         for (i = 0; i < PAGE_SIZE; i += 4) {
2651             if (*(int *)((char *)gd->gd_CADDR3 + i) != 0) {
2652                 panic("pmap_page_assertzero() @ %p not zero!\n",
2653                     (void *)gd->gd_CADDR3);
2654             }
2655         }
2656         *(int *) gd->gd_CMAP3 = 0;
2657         crit_exit();
2658 }
2659
2660 /*
2661  * pmap_zero_page:
2662  *
2663  *      Zero part of a physical page by mapping it into memory and clearing
2664  *      its contents with bzero.
2665  *
2666  *      off and size may not cover an area beyond a single hardware page.
2667  */
2668 void
2669 pmap_zero_page_area(vm_paddr_t phys, int off, int size)
2670 {
2671         struct mdglobaldata *gd = mdcpu;
2672
2673         crit_enter();
2674         if (*(int *) gd->gd_CMAP3)
2675                 panic("pmap_zero_page: CMAP3 busy");
2676         *(int *) gd->gd_CMAP3 = PG_V | PG_RW | (phys & PG_FRAME) | PG_A | PG_M;
2677         cpu_invlpg(gd->gd_CADDR3);
2678
2679 #if defined(I686_CPU)
2680         if (cpu_class == CPUCLASS_686 && off == 0 && size == PAGE_SIZE)
2681                 i686_pagezero(gd->gd_CADDR3);
2682         else
2683 #endif
2684                 bzero((char *)gd->gd_CADDR3 + off, size);
2685         *(int *) gd->gd_CMAP3 = 0;
2686         crit_exit();
2687 }
2688
2689 /*
2690  * pmap_copy_page:
2691  *
2692  *      Copy the physical page from the source PA to the target PA.
2693  *      This function may be called from an interrupt.  No locking
2694  *      is required.
2695  */
2696 void
2697 pmap_copy_page(vm_paddr_t src, vm_paddr_t dst)
2698 {
2699         struct mdglobaldata *gd = mdcpu;
2700
2701         crit_enter();
2702         if (*(int *) gd->gd_CMAP1)
2703                 panic("pmap_copy_page: CMAP1 busy");
2704         if (*(int *) gd->gd_CMAP2)
2705                 panic("pmap_copy_page: CMAP2 busy");
2706
2707         *(int *) gd->gd_CMAP1 = PG_V | (src & PG_FRAME) | PG_A;
2708         *(int *) gd->gd_CMAP2 = PG_V | PG_RW | (dst & PG_FRAME) | PG_A | PG_M;
2709
2710         cpu_invlpg(gd->gd_CADDR1);
2711         cpu_invlpg(gd->gd_CADDR2);
2712
2713         bcopy(gd->gd_CADDR1, gd->gd_CADDR2, PAGE_SIZE);
2714
2715         *(int *) gd->gd_CMAP1 = 0;
2716         *(int *) gd->gd_CMAP2 = 0;
2717         crit_exit();
2718 }
2719
2720 /*
2721  * pmap_copy_page_frag:
2722  *
2723  *      Copy the physical page from the source PA to the target PA.
2724  *      This function may be called from an interrupt.  No locking
2725  *      is required.
2726  */
2727 void
2728 pmap_copy_page_frag(vm_paddr_t src, vm_paddr_t dst, size_t bytes)
2729 {
2730         struct mdglobaldata *gd = mdcpu;
2731
2732         crit_enter();
2733         if (*(int *) gd->gd_CMAP1)
2734                 panic("pmap_copy_page: CMAP1 busy");
2735         if (*(int *) gd->gd_CMAP2)
2736                 panic("pmap_copy_page: CMAP2 busy");
2737
2738         *(int *) gd->gd_CMAP1 = PG_V | (src & PG_FRAME) | PG_A;
2739         *(int *) gd->gd_CMAP2 = PG_V | PG_RW | (dst & PG_FRAME) | PG_A | PG_M;
2740
2741         cpu_invlpg(gd->gd_CADDR1);
2742         cpu_invlpg(gd->gd_CADDR2);
2743
2744         bcopy((char *)gd->gd_CADDR1 + (src & PAGE_MASK),
2745               (char *)gd->gd_CADDR2 + (dst & PAGE_MASK),
2746               bytes);
2747
2748         *(int *) gd->gd_CMAP1 = 0;
2749         *(int *) gd->gd_CMAP2 = 0;
2750         crit_exit();
2751 }
2752
2753 /*
2754  * Returns true if the pmap's pv is one of the first
2755  * 16 pvs linked to from this page.  This count may
2756  * be changed upwards or downwards in the future; it
2757  * is only necessary that true be returned for a small
2758  * subset of pmaps for proper page aging.
2759  */
2760 boolean_t
2761 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
2762 {
2763         pv_entry_t pv;
2764         int loops = 0;
2765
2766         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2767                 return FALSE;
2768
2769         crit_enter();
2770
2771         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2772                 if (pv->pv_pmap == pmap) {
2773                         crit_exit();
2774                         return TRUE;
2775                 }
2776                 loops++;
2777                 if (loops >= 16)
2778                         break;
2779         }
2780         crit_exit();
2781         return (FALSE);
2782 }
2783
2784 /*
2785  * Remove all pages from specified address space
2786  * this aids process exit speeds.  Also, this code
2787  * is special cased for current process only, but
2788  * can have the more generic (and slightly slower)
2789  * mode enabled.  This is much faster than pmap_remove
2790  * in the case of running down an entire address space.
2791  */
2792 void
2793 pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2794 {
2795         struct lwp *lp;
2796         unsigned *pte, tpte;
2797         pv_entry_t pv, npv;
2798         vm_page_t m;
2799         pmap_inval_info info;
2800         int iscurrentpmap;
2801         int32_t save_generation;
2802
2803         lp = curthread->td_lwp;
2804         if (lp && pmap == vmspace_pmap(lp->lwp_vmspace))
2805                 iscurrentpmap = 1;
2806         else
2807                 iscurrentpmap = 0;
2808
2809         pmap_inval_init(&info);
2810         crit_enter();
2811         for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
2812                 if (pv->pv_va >= eva || pv->pv_va < sva) {
2813                         npv = TAILQ_NEXT(pv, pv_plist);
2814                         continue;
2815                 }
2816
2817                 KKASSERT(pmap == pv->pv_pmap);
2818
2819                 if (iscurrentpmap)
2820                         pte = (unsigned *)vtopte(pv->pv_va);
2821                 else
2822                         pte = pmap_pte_quick(pmap, pv->pv_va);
2823                 if (pmap->pm_active)
2824                         pmap_inval_add(&info, pmap, pv->pv_va);
2825                 tpte = *pte;
2826
2827                 /*
2828                  * We cannot remove wired pages from a process' mapping
2829                  * at this time
2830                  */
2831                 if (tpte & PG_W) {
2832                         npv = TAILQ_NEXT(pv, pv_plist);
2833                         continue;
2834                 }
2835                 *pte = 0;
2836
2837                 m = PHYS_TO_VM_PAGE(tpte);
2838
2839                 KASSERT(m < &vm_page_array[vm_page_array_size],
2840                         ("pmap_remove_pages: bad tpte %x", tpte));
2841
2842                 KKASSERT(pmap->pm_stats.resident_count > 0);
2843                 --pmap->pm_stats.resident_count;
2844
2845                 /*
2846                  * Update the vm_page_t clean and reference bits.
2847                  */
2848                 if (tpte & PG_M) {
2849                         vm_page_dirty(m);
2850                 }
2851
2852                 npv = TAILQ_NEXT(pv, pv_plist);
2853                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
2854                 save_generation = ++pmap->pm_generation;
2855
2856                 m->md.pv_list_count--;
2857                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2858                 if (TAILQ_FIRST(&m->md.pv_list) == NULL) {
2859                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
2860                 }
2861
2862                 pmap_unuse_pt(pmap, pv->pv_va, pv->pv_ptem, &info);
2863                 free_pv_entry(pv);
2864
2865                 /*
2866                  * Restart the scan if we blocked during the unuse or free
2867                  * calls and other removals were made.
2868                  */
2869                 if (save_generation != pmap->pm_generation) {
2870                         kprintf("Warning: pmap_remove_pages race-A avoided\n");
2871                         pv = TAILQ_FIRST(&pmap->pm_pvlist);
2872                 }
2873         }
2874         pmap_inval_flush(&info);
2875         crit_exit();
2876 }
2877
2878 /*
2879  * pmap_testbit tests bits in pte's
2880  * note that the testbit/clearbit routines are inline,
2881  * and a lot of things compile-time evaluate.
2882  */
2883 static boolean_t
2884 pmap_testbit(vm_page_t m, int bit)
2885 {
2886         pv_entry_t pv;
2887         unsigned *pte;
2888
2889         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2890                 return FALSE;
2891
2892         if (TAILQ_FIRST(&m->md.pv_list) == NULL)
2893                 return FALSE;
2894
2895         crit_enter();
2896
2897         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2898                 /*
2899                  * if the bit being tested is the modified bit, then
2900                  * mark clean_map and ptes as never
2901                  * modified.
2902                  */
2903                 if (bit & (PG_A|PG_M)) {
2904                         if (!pmap_track_modified(pv->pv_va))
2905                                 continue;
2906                 }
2907
2908 #if defined(PMAP_DIAGNOSTIC)
2909                 if (!pv->pv_pmap) {
2910                         kprintf("Null pmap (tb) at va: 0x%x\n", pv->pv_va);
2911                         continue;
2912                 }
2913 #endif
2914                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
2915                 if (*pte & bit) {
2916                         crit_exit();
2917                         return TRUE;
2918                 }
2919         }
2920         crit_exit();
2921         return (FALSE);
2922 }
2923
2924 /*
2925  * this routine is used to modify bits in ptes
2926  */
2927 static __inline void
2928 pmap_clearbit(vm_page_t m, int bit)
2929 {
2930         struct pmap_inval_info info;
2931         pv_entry_t pv;
2932         unsigned *pte;
2933         unsigned pbits;
2934
2935         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2936                 return;
2937
2938         pmap_inval_init(&info);
2939         crit_enter();
2940
2941         /*
2942          * Loop over all current mappings setting/clearing as appropos If
2943          * setting RO do we need to clear the VAC?
2944          */
2945         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2946                 /*
2947                  * don't write protect pager mappings
2948                  */
2949                 if (bit == PG_RW) {
2950                         if (!pmap_track_modified(pv->pv_va))
2951                                 continue;
2952                 }
2953
2954 #if defined(PMAP_DIAGNOSTIC)
2955                 if (!pv->pv_pmap) {
2956                         kprintf("Null pmap (cb) at va: 0x%x\n", pv->pv_va);
2957                         continue;
2958                 }
2959 #endif
2960
2961                 /*
2962                  * Careful here.  We can use a locked bus instruction to
2963                  * clear PG_A or PG_M safely but we need to synchronize
2964                  * with the target cpus when we mess with PG_RW.
2965                  *
2966                  * We do not have to force synchronization when clearing
2967                  * PG_M even for PTEs generated via virtual memory maps,
2968                  * because the virtual kernel will invalidate the pmap
2969                  * entry when/if it needs to resynchronize the Modify bit.
2970                  */
2971                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
2972                 if (bit & PG_RW)
2973                         pmap_inval_add(&info, pv->pv_pmap, pv->pv_va);
2974
2975                 pbits = *pte;
2976                 if (pbits & bit) {
2977                         if (bit == PG_RW) {
2978                                 if (pbits & PG_M)
2979                                         vm_page_dirty(m);
2980                                 atomic_clear_int(pte, PG_M|PG_RW);
2981                         } else if (bit == PG_M) {
2982                                 /*
2983                                  * We could also clear PG_RW here to force
2984                                  * a fault on write to redetect PG_M for
2985                                  * virtual kernels, but it isn't necessary
2986                                  * since virtual kernels invalidate the pte 
2987                                  * when they clear the VPTE_M bit in their
2988                                  * virtual page tables.
2989                                  */
2990                                 atomic_clear_int(pte, PG_M);
2991                         } else {
2992                                 atomic_clear_int(pte, bit);
2993                         }
2994                 }
2995         }
2996         pmap_inval_flush(&info);
2997         crit_exit();
2998 }
2999
3000 /*
3001  *      pmap_page_protect:
3002  *
3003  *      Lower the permission for all mappings to a given page.
3004  */
3005 void
3006 pmap_page_protect(vm_page_t m, vm_prot_t prot)
3007 {
3008         if ((prot & VM_PROT_WRITE) == 0) {
3009                 if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
3010                         pmap_clearbit(m, PG_RW);
3011                 } else {
3012                         pmap_remove_all(m);
3013                 }
3014         }
3015 }
3016
3017 vm_paddr_t
3018 pmap_phys_address(int ppn)
3019 {
3020         return (i386_ptob(ppn));
3021 }
3022
3023 /*
3024  *      pmap_ts_referenced:
3025  *
3026  *      Return a count of reference bits for a page, clearing those bits.
3027  *      It is not necessary for every reference bit to be cleared, but it
3028  *      is necessary that 0 only be returned when there are truly no
3029  *      reference bits set.
3030  *
3031  *      XXX: The exact number of bits to check and clear is a matter that
3032  *      should be tested and standardized at some point in the future for
3033  *      optimal aging of shared pages.
3034  */
3035 int
3036 pmap_ts_referenced(vm_page_t m)
3037 {
3038         pv_entry_t pv, pvf, pvn;
3039         unsigned *pte;
3040         int rtval = 0;
3041
3042         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3043                 return (rtval);
3044
3045         crit_enter();
3046
3047         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3048
3049                 pvf = pv;
3050
3051                 do {
3052                         pvn = TAILQ_NEXT(pv, pv_list);
3053
3054                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3055
3056                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3057
3058                         if (!pmap_track_modified(pv->pv_va))
3059                                 continue;
3060
3061                         pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
3062
3063                         if (pte && (*pte & PG_A)) {
3064 #ifdef SMP
3065                                 atomic_clear_int(pte, PG_A);
3066 #else
3067                                 atomic_clear_int_nonlocked(pte, PG_A);
3068 #endif
3069                                 rtval++;
3070                                 if (rtval > 4) {
3071                                         break;
3072                                 }
3073                         }
3074                 } while ((pv = pvn) != NULL && pv != pvf);
3075         }
3076         crit_exit();
3077
3078         return (rtval);
3079 }
3080
3081 /*
3082  *      pmap_is_modified:
3083  *
3084  *      Return whether or not the specified physical page was modified
3085  *      in any physical maps.
3086  */
3087 boolean_t
3088 pmap_is_modified(vm_page_t m)
3089 {
3090         return pmap_testbit(m, PG_M);
3091 }
3092
3093 /*
3094  *      Clear the modify bits on the specified physical page.
3095  */
3096 void
3097 pmap_clear_modify(vm_page_t m)
3098 {
3099         pmap_clearbit(m, PG_M);
3100 }
3101
3102 /*
3103  *      pmap_clear_reference:
3104  *
3105  *      Clear the reference bit on the specified physical page.
3106  */
3107 void
3108 pmap_clear_reference(vm_page_t m)
3109 {
3110         pmap_clearbit(m, PG_A);
3111 }
3112
3113 /*
3114  * Miscellaneous support routines follow
3115  */
3116
3117 static void
3118 i386_protection_init(void)
3119 {
3120         int *kp, prot;
3121
3122         kp = protection_codes;
3123         for (prot = 0; prot < 8; prot++) {
3124                 switch (prot) {
3125                 case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_NONE:
3126                         /*
3127                          * Read access is also 0. There isn't any execute bit,
3128                          * so just make it readable.
3129                          */
3130                 case VM_PROT_READ | VM_PROT_NONE | VM_PROT_NONE:
3131                 case VM_PROT_READ | VM_PROT_NONE | VM_PROT_EXECUTE:
3132                 case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_EXECUTE:
3133                         *kp++ = 0;
3134                         break;
3135                 case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_NONE:
3136                 case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_EXECUTE:
3137                 case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_NONE:
3138                 case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE:
3139                         *kp++ = PG_RW;
3140                         break;
3141                 }
3142         }
3143 }
3144
3145 /*
3146  * Map a set of physical memory pages into the kernel virtual
3147  * address space. Return a pointer to where it is mapped. This
3148  * routine is intended to be used for mapping device memory,
3149  * NOT real memory.
3150  *
3151  * NOTE: we can't use pgeflag unless we invalidate the pages one at
3152  * a time.
3153  */
3154 void *
3155 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
3156 {
3157         vm_offset_t va, tmpva, offset;
3158         unsigned *pte;
3159
3160         offset = pa & PAGE_MASK;
3161         size = roundup(offset + size, PAGE_SIZE);
3162
3163         va = kmem_alloc_nofault(&kernel_map, size);
3164         if (!va)
3165                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3166
3167         pa = pa & PG_FRAME;
3168         for (tmpva = va; size > 0;) {
3169                 pte = (unsigned *)vtopte(tmpva);
3170                 *pte = pa | PG_RW | PG_V; /* | pgeflag; */
3171                 size -= PAGE_SIZE;
3172                 tmpva += PAGE_SIZE;
3173                 pa += PAGE_SIZE;
3174         }
3175         cpu_invltlb();
3176         smp_invltlb();
3177
3178         return ((void *)(va + offset));
3179 }
3180
3181 void
3182 pmap_unmapdev(vm_offset_t va, vm_size_t size)
3183 {
3184         vm_offset_t base, offset;
3185
3186         base = va & PG_FRAME;
3187         offset = va & PAGE_MASK;
3188         size = roundup(offset + size, PAGE_SIZE);
3189         pmap_qremove(va, size >> PAGE_SHIFT);
3190         kmem_free(&kernel_map, base, size);
3191 }
3192
3193 /*
3194  * perform the pmap work for mincore
3195  */
3196 int
3197 pmap_mincore(pmap_t pmap, vm_offset_t addr)
3198 {
3199         unsigned *ptep, pte;
3200         vm_page_t m;
3201         int val = 0;
3202         
3203         ptep = pmap_pte(pmap, addr);
3204         if (ptep == 0) {
3205                 return 0;
3206         }
3207
3208         if ((pte = *ptep) != 0) {
3209                 vm_offset_t pa;
3210
3211                 val = MINCORE_INCORE;
3212                 if ((pte & PG_MANAGED) == 0)
3213                         return val;
3214
3215                 pa = pte & PG_FRAME;
3216
3217                 m = PHYS_TO_VM_PAGE(pa);
3218
3219                 /*
3220                  * Modified by us
3221                  */
3222                 if (pte & PG_M)
3223                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
3224                 /*
3225                  * Modified by someone
3226                  */
3227                 else if (m->dirty || pmap_is_modified(m))
3228                         val |= MINCORE_MODIFIED_OTHER;
3229                 /*
3230                  * Referenced by us
3231                  */
3232                 if (pte & PG_A)
3233                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
3234
3235                 /*
3236                  * Referenced by someone
3237                  */
3238                 else if ((m->flags & PG_REFERENCED) || pmap_ts_referenced(m)) {
3239                         val |= MINCORE_REFERENCED_OTHER;
3240                         vm_page_flag_set(m, PG_REFERENCED);
3241                 }
3242         } 
3243         return val;
3244 }
3245
3246 /*
3247  * Replace p->p_vmspace with a new one.  If adjrefs is non-zero the new
3248  * vmspace will be ref'd and the old one will be deref'd.
3249  *
3250  * The vmspace for all lwps associated with the process will be adjusted
3251  * and cr3 will be reloaded if any lwp is the current lwp.
3252  */
3253 void
3254 pmap_replacevm(struct proc *p, struct vmspace *newvm, int adjrefs)
3255 {
3256         struct vmspace *oldvm;
3257         struct lwp *lp;
3258
3259         crit_enter();
3260         oldvm = p->p_vmspace;
3261         if (oldvm != newvm) {
3262                 p->p_vmspace = newvm;
3263                 KKASSERT(p->p_nthreads == 1);
3264                 lp = RB_ROOT(&p->p_lwp_tree);
3265                 pmap_setlwpvm(lp, newvm);
3266                 if (adjrefs) {
3267                         sysref_get(&newvm->vm_sysref);
3268                         sysref_put(&oldvm->vm_sysref);
3269                 }
3270         }
3271         crit_exit();
3272 }
3273
3274 /*
3275  * Set the vmspace for a LWP.  The vmspace is almost universally set the
3276  * same as the process vmspace, but virtual kernels need to swap out contexts
3277  * on a per-lwp basis.
3278  */
3279 void
3280 pmap_setlwpvm(struct lwp *lp, struct vmspace *newvm)
3281 {
3282         struct vmspace *oldvm;
3283         struct pmap *pmap;
3284
3285         crit_enter();
3286         oldvm = lp->lwp_vmspace;
3287
3288         if (oldvm != newvm) {
3289                 lp->lwp_vmspace = newvm;
3290                 if (curthread->td_lwp == lp) {
3291                         pmap = vmspace_pmap(newvm);
3292 #if defined(SMP)
3293                         atomic_set_int(&pmap->pm_active, 1 << mycpu->gd_cpuid);
3294 #else
3295                         pmap->pm_active |= 1;
3296 #endif
3297 #if defined(SWTCH_OPTIM_STATS)
3298                         tlb_flush_count++;
3299 #endif
3300                         curthread->td_pcb->pcb_cr3 = vtophys(pmap->pm_pdir);
3301                         load_cr3(curthread->td_pcb->pcb_cr3);
3302                         pmap = vmspace_pmap(oldvm);
3303 #if defined(SMP)
3304                         atomic_clear_int(&pmap->pm_active,
3305                                           1 << mycpu->gd_cpuid);
3306 #else
3307                         pmap->pm_active &= ~1;
3308 #endif
3309                 }
3310         }
3311         crit_exit();
3312 }
3313
3314 vm_offset_t
3315 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
3316 {
3317
3318         if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
3319                 return addr;
3320         }
3321
3322         addr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
3323         return addr;
3324 }
3325
3326
3327 #if defined(DEBUG)
3328
3329 static void     pads (pmap_t pm);
3330 void            pmap_pvdump (vm_paddr_t pa);
3331
3332 /* print address space of pmap*/
3333 static void
3334 pads(pmap_t pm)
3335 {
3336         unsigned va, i, j;
3337         unsigned *ptep;
3338
3339         if (pm == &kernel_pmap)
3340                 return;
3341         crit_enter();
3342         for (i = 0; i < 1024; i++) {
3343                 if (pm->pm_pdir[i]) {
3344                         for (j = 0; j < 1024; j++) {
3345                                 va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
3346                                 if (pm == &kernel_pmap && va < KERNBASE)
3347                                         continue;
3348                                 if (pm != &kernel_pmap && va > UPT_MAX_ADDRESS)
3349                                         continue;
3350                                 ptep = pmap_pte_quick(pm, va);
3351                                 if (pmap_pte_v(ptep))
3352                                         kprintf("%x:%x ", va, *(int *) ptep);
3353                         };
3354                 }
3355         }
3356         crit_exit();
3357
3358 }
3359
3360 void
3361 pmap_pvdump(vm_paddr_t pa)
3362 {
3363         pv_entry_t pv;
3364         vm_page_t m;
3365
3366         kprintf("pa %08llx", (long long)pa);
3367         m = PHYS_TO_VM_PAGE(pa);
3368         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3369 #ifdef used_to_be
3370                 kprintf(" -> pmap %p, va %x, flags %x",
3371                     (void *)pv->pv_pmap, pv->pv_va, pv->pv_flags);
3372 #endif
3373                 kprintf(" -> pmap %p, va %x", (void *)pv->pv_pmap, pv->pv_va);
3374                 pads(pv->pv_pmap);
3375         }
3376         kprintf(" ");
3377 }
3378 #endif