Merge from vendor branch LIBARCHIVE:
[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.80 2007/06/29 21:54:10 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
928         if (m->hold_count == 0) {
929                 /*
930                  * unmap the page table page
931                  */
932                 pmap_inval_add(info, pmap, -1);
933                 pmap->pm_pdir[m->pindex] = 0;
934                 --pmap->pm_stats.resident_count;
935
936                 if (pmap->pm_ptphint == m)
937                         pmap->pm_ptphint = NULL;
938
939                 /*
940                  * If the page is finally unwired, simply free it.
941                  */
942                 --m->wire_count;
943                 if (m->wire_count == 0) {
944                         vm_page_flash(m);
945                         vm_page_busy(m);
946                         vm_page_free_zero(m);
947                         --vmstats.v_wire_count;
948                 }
949                 return 1;
950         }
951         return 0;
952 }
953
954 static PMAP_INLINE int
955 pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, pmap_inval_info_t info)
956 {
957         vm_page_unhold(m);
958         if (m->hold_count == 0)
959                 return _pmap_unwire_pte_hold(pmap, m, info);
960         else
961                 return 0;
962 }
963
964 /*
965  * After removing a page table entry, this routine is used to
966  * conditionally free the page, and manage the hold/wire counts.
967  */
968 static int
969 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t mpte,
970                 pmap_inval_info_t info)
971 {
972         unsigned ptepindex;
973         if (va >= UPT_MIN_ADDRESS)
974                 return 0;
975
976         if (mpte == NULL) {
977                 ptepindex = (va >> PDRSHIFT);
978                 if (pmap->pm_ptphint &&
979                         (pmap->pm_ptphint->pindex == ptepindex)) {
980                         mpte = pmap->pm_ptphint;
981                 } else {
982                         pmap_inval_flush(info);
983                         mpte = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
984                         pmap->pm_ptphint = mpte;
985                 }
986         }
987
988         return pmap_unwire_pte_hold(pmap, mpte, info);
989 }
990
991 /*
992  * Initialize pmap0/vmspace0.  This pmap is not added to pmap_list because
993  * it, and IdlePTD, represents the template used to update all other pmaps.
994  *
995  * On architectures where the kernel pmap is not integrated into the user
996  * process pmap, this pmap represents the process pmap, not the kernel pmap.
997  * kernel_pmap should be used to directly access the kernel_pmap.
998  */
999 void
1000 pmap_pinit0(struct pmap *pmap)
1001 {
1002         pmap->pm_pdir =
1003                 (pd_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
1004         pmap_kenter((vm_offset_t)pmap->pm_pdir, (vm_offset_t) IdlePTD);
1005         pmap->pm_count = 1;
1006         pmap->pm_active = 0;
1007         pmap->pm_ptphint = NULL;
1008         TAILQ_INIT(&pmap->pm_pvlist);
1009         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1010 }
1011
1012 /*
1013  * Initialize a preallocated and zeroed pmap structure,
1014  * such as one in a vmspace structure.
1015  */
1016 void
1017 pmap_pinit(struct pmap *pmap)
1018 {
1019         vm_page_t ptdpg;
1020
1021         /*
1022          * No need to allocate page table space yet but we do need a valid
1023          * page directory table.
1024          */
1025         if (pmap->pm_pdir == NULL) {
1026                 pmap->pm_pdir =
1027                     (pd_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
1028         }
1029
1030         /*
1031          * Allocate an object for the ptes
1032          */
1033         if (pmap->pm_pteobj == NULL)
1034                 pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, PTDPTDI + 1);
1035
1036         /*
1037          * Allocate the page directory page, unless we already have
1038          * one cached.  If we used the cached page the wire_count will
1039          * already be set appropriately.
1040          */
1041         if ((ptdpg = pmap->pm_pdirm) == NULL) {
1042                 ptdpg = vm_page_grab(pmap->pm_pteobj, PTDPTDI,
1043                                      VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
1044                 pmap->pm_pdirm = ptdpg;
1045                 vm_page_flag_clear(ptdpg, PG_MAPPED | PG_BUSY);
1046                 ptdpg->valid = VM_PAGE_BITS_ALL;
1047                 ptdpg->wire_count = 1;
1048                 ++vmstats.v_wire_count;
1049                 pmap_kenter((vm_offset_t)pmap->pm_pdir, VM_PAGE_TO_PHYS(ptdpg));
1050         }
1051         if ((ptdpg->flags & PG_ZERO) == 0)
1052                 bzero(pmap->pm_pdir, PAGE_SIZE);
1053
1054         pmap->pm_pdir[MPPTDI] = PTD[MPPTDI];
1055
1056         /* install self-referential address mapping entry */
1057         *(unsigned *) (pmap->pm_pdir + PTDPTDI) =
1058                 VM_PAGE_TO_PHYS(ptdpg) | PG_V | PG_RW | PG_A | PG_M;
1059
1060         pmap->pm_count = 1;
1061         pmap->pm_active = 0;
1062         pmap->pm_ptphint = NULL;
1063         TAILQ_INIT(&pmap->pm_pvlist);
1064         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1065 }
1066
1067 /*
1068  * Clean up a pmap structure so it can be physically freed.  This routine
1069  * is called by the vmspace dtor function.  A great deal of pmap data is
1070  * left passively mapped to improve vmspace management so we have a bit
1071  * of cleanup work to do here.
1072  */
1073 void
1074 pmap_puninit(pmap_t pmap)
1075 {
1076         vm_page_t p;
1077
1078         KKASSERT(pmap->pm_active == 0);
1079         if ((p = pmap->pm_pdirm) != NULL) {
1080                 KKASSERT(pmap->pm_pdir != NULL);
1081                 pmap_kremove((vm_offset_t)pmap->pm_pdir);
1082                 p->wire_count--;
1083                 vmstats.v_wire_count--;
1084                 KKASSERT((p->flags & PG_BUSY) == 0);
1085                 vm_page_busy(p);
1086                 vm_page_free_zero(p);
1087                 pmap->pm_pdirm = NULL;
1088         }
1089         if (pmap->pm_pdir) {
1090                 kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pdir, PAGE_SIZE);
1091                 pmap->pm_pdir = NULL;
1092         }
1093         if (pmap->pm_pteobj) {
1094                 vm_object_deallocate(pmap->pm_pteobj);
1095                 pmap->pm_pteobj = NULL;
1096         }
1097 }
1098
1099 /*
1100  * Wire in kernel global address entries.  To avoid a race condition
1101  * between pmap initialization and pmap_growkernel, this procedure
1102  * adds the pmap to the master list (which growkernel scans to update),
1103  * then copies the template.
1104  */
1105 void
1106 pmap_pinit2(struct pmap *pmap)
1107 {
1108         crit_enter();
1109         TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
1110         /* XXX copies current process, does not fill in MPPTDI */
1111         bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * PTESIZE);
1112         crit_exit();
1113 }
1114
1115 /*
1116  * Attempt to release and free and vm_page in a pmap.  Returns 1 on success,
1117  * 0 on failure (if the procedure had to sleep).
1118  *
1119  * When asked to remove the page directory page itself, we actually just
1120  * leave it cached so we do not have to incur the SMP inval overhead of
1121  * removing the kernel mapping.  pmap_puninit() will take care of it.
1122  */
1123 static int
1124 pmap_release_free_page(struct pmap *pmap, vm_page_t p)
1125 {
1126         unsigned *pde = (unsigned *) pmap->pm_pdir;
1127         /*
1128          * This code optimizes the case of freeing non-busy
1129          * page-table pages.  Those pages are zero now, and
1130          * might as well be placed directly into the zero queue.
1131          */
1132         if (vm_page_sleep_busy(p, FALSE, "pmaprl"))
1133                 return 0;
1134
1135         vm_page_busy(p);
1136
1137         /*
1138          * Remove the page table page from the processes address space.
1139          */
1140         pde[p->pindex] = 0;
1141         pmap->pm_stats.resident_count--;
1142
1143         if (p->hold_count)  {
1144                 panic("pmap_release: freeing held page table page");
1145         }
1146         if (pmap->pm_ptphint && (pmap->pm_ptphint->pindex == p->pindex))
1147                 pmap->pm_ptphint = NULL;
1148
1149         /*
1150          * We leave the page directory page cached, wired, and mapped in
1151          * the pmap until the dtor function (pmap_puninit()) gets called.
1152          * However, still clean it up so we can set PG_ZERO.
1153          */
1154         if (p->pindex == PTDPTDI) {
1155                 bzero(pde + KPTDI, nkpt * PTESIZE);
1156                 pde[MPPTDI] = 0;
1157                 pde[APTDPTDI] = 0;
1158                 vm_page_flag_set(p, PG_ZERO);
1159                 vm_page_wakeup(p);
1160         } else {
1161                 p->wire_count--;
1162                 vmstats.v_wire_count--;
1163                 vm_page_free_zero(p);
1164         }
1165         return 1;
1166 }
1167
1168 /*
1169  * this routine is called if the page table page is not
1170  * mapped correctly.
1171  */
1172 static vm_page_t
1173 _pmap_allocpte(pmap_t pmap, unsigned ptepindex)
1174 {
1175         vm_offset_t pteva, ptepa;
1176         vm_page_t m;
1177
1178         /*
1179          * Find or fabricate a new pagetable page
1180          */
1181         m = vm_page_grab(pmap->pm_pteobj, ptepindex,
1182                         VM_ALLOC_NORMAL | VM_ALLOC_ZERO | VM_ALLOC_RETRY);
1183
1184         KASSERT(m->queue == PQ_NONE,
1185                 ("_pmap_allocpte: %p->queue != PQ_NONE", m));
1186
1187         if (m->wire_count == 0)
1188                 vmstats.v_wire_count++;
1189         m->wire_count++;
1190
1191         /*
1192          * Increment the hold count for the page table page
1193          * (denoting a new mapping.)
1194          */
1195         m->hold_count++;
1196
1197         /*
1198          * Map the pagetable page into the process address space, if
1199          * it isn't already there.
1200          */
1201
1202         pmap->pm_stats.resident_count++;
1203
1204         ptepa = VM_PAGE_TO_PHYS(m);
1205         pmap->pm_pdir[ptepindex] =
1206                 (pd_entry_t) (ptepa | PG_U | PG_RW | PG_V | PG_A | PG_M);
1207
1208         /*
1209          * Set the page table hint
1210          */
1211         pmap->pm_ptphint = m;
1212
1213         /*
1214          * Try to use the new mapping, but if we cannot, then
1215          * do it with the routine that maps the page explicitly.
1216          */
1217         if ((m->flags & PG_ZERO) == 0) {
1218                 if ((((unsigned)pmap->pm_pdir[PTDPTDI]) & PG_FRAME) ==
1219                         (((unsigned) PTDpde) & PG_FRAME)) {
1220                         pteva = UPT_MIN_ADDRESS + i386_ptob(ptepindex);
1221                         bzero((caddr_t) pteva, PAGE_SIZE);
1222                 } else {
1223                         pmap_zero_page(ptepa);
1224                 }
1225         }
1226
1227         m->valid = VM_PAGE_BITS_ALL;
1228         vm_page_flag_clear(m, PG_ZERO);
1229         vm_page_flag_set(m, PG_MAPPED);
1230         vm_page_wakeup(m);
1231
1232         return m;
1233 }
1234
1235 static vm_page_t
1236 pmap_allocpte(pmap_t pmap, vm_offset_t va)
1237 {
1238         unsigned ptepindex;
1239         vm_offset_t ptepa;
1240         vm_page_t m;
1241
1242         /*
1243          * Calculate pagetable page index
1244          */
1245         ptepindex = va >> PDRSHIFT;
1246
1247         /*
1248          * Get the page directory entry
1249          */
1250         ptepa = (vm_offset_t) pmap->pm_pdir[ptepindex];
1251
1252         /*
1253          * This supports switching from a 4MB page to a
1254          * normal 4K page.
1255          */
1256         if (ptepa & PG_PS) {
1257                 pmap->pm_pdir[ptepindex] = 0;
1258                 ptepa = 0;
1259                 cpu_invltlb();
1260                 smp_invltlb();
1261         }
1262
1263         /*
1264          * If the page table page is mapped, we just increment the
1265          * hold count, and activate it.
1266          */
1267         if (ptepa) {
1268                 /*
1269                  * In order to get the page table page, try the
1270                  * hint first.
1271                  */
1272                 if (pmap->pm_ptphint &&
1273                         (pmap->pm_ptphint->pindex == ptepindex)) {
1274                         m = pmap->pm_ptphint;
1275                 } else {
1276                         m = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
1277                         pmap->pm_ptphint = m;
1278                 }
1279                 m->hold_count++;
1280                 return m;
1281         }
1282         /*
1283          * Here if the pte page isn't mapped, or if it has been deallocated.
1284          */
1285         return _pmap_allocpte(pmap, ptepindex);
1286 }
1287
1288
1289 /***************************************************
1290  * Pmap allocation/deallocation routines.
1291  ***************************************************/
1292
1293 /*
1294  * Release any resources held by the given physical map.
1295  * Called when a pmap initialized by pmap_pinit is being released.
1296  * Should only be called if the map contains no valid mappings.
1297  */
1298 static int pmap_release_callback(struct vm_page *p, void *data);
1299
1300 void
1301 pmap_release(struct pmap *pmap)
1302 {
1303         vm_object_t object = pmap->pm_pteobj;
1304         struct rb_vm_page_scan_info info;
1305
1306         KASSERT(pmap->pm_active == 0, ("pmap still active! %08x", pmap->pm_active));
1307 #if defined(DIAGNOSTIC)
1308         if (object->ref_count != 1)
1309                 panic("pmap_release: pteobj reference count != 1");
1310 #endif
1311         
1312         info.pmap = pmap;
1313         info.object = object;
1314         crit_enter();
1315         TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
1316         crit_exit();
1317
1318         do {
1319                 crit_enter();
1320                 info.error = 0;
1321                 info.mpte = NULL;
1322                 info.limit = object->generation;
1323
1324                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, NULL, 
1325                                         pmap_release_callback, &info);
1326                 if (info.error == 0 && info.mpte) {
1327                         if (!pmap_release_free_page(pmap, info.mpte))
1328                                 info.error = 1;
1329                 }
1330                 crit_exit();
1331         } while (info.error);
1332 }
1333
1334 static int
1335 pmap_release_callback(struct vm_page *p, void *data)
1336 {
1337         struct rb_vm_page_scan_info *info = data;
1338
1339         if (p->pindex == PTDPTDI) {
1340                 info->mpte = p;
1341                 return(0);
1342         }
1343         if (!pmap_release_free_page(info->pmap, p)) {
1344                 info->error = 1;
1345                 return(-1);
1346         }
1347         if (info->object->generation != info->limit) {
1348                 info->error = 1;
1349                 return(-1);
1350         }
1351         return(0);
1352 }
1353
1354 /*
1355  * Grow the number of kernel page table entries, if needed.
1356  */
1357
1358 void
1359 pmap_growkernel(vm_offset_t addr)
1360 {
1361         struct pmap *pmap;
1362         vm_offset_t ptppaddr;
1363         vm_page_t nkpg;
1364         pd_entry_t newpdir;
1365
1366         crit_enter();
1367         if (kernel_vm_end == 0) {
1368                 kernel_vm_end = KERNBASE;
1369                 nkpt = 0;
1370                 while (pdir_pde(PTD, kernel_vm_end)) {
1371                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1372                         nkpt++;
1373                 }
1374         }
1375         addr = (addr + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1376         while (kernel_vm_end < addr) {
1377                 if (pdir_pde(PTD, kernel_vm_end)) {
1378                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1379                         continue;
1380                 }
1381
1382                 /*
1383                  * This index is bogus, but out of the way
1384                  */
1385                 nkpg = vm_page_alloc(kptobj, nkpt, 
1386                         VM_ALLOC_NORMAL | VM_ALLOC_SYSTEM | VM_ALLOC_INTERRUPT);
1387                 if (nkpg == NULL)
1388                         panic("pmap_growkernel: no memory to grow kernel");
1389
1390                 vm_page_wire(nkpg);
1391                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
1392                 pmap_zero_page(ptppaddr);
1393                 newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
1394                 pdir_pde(PTD, kernel_vm_end) = newpdir;
1395                 *pmap_pde(&kernel_pmap, kernel_vm_end) = newpdir;
1396                 nkpt++;
1397
1398                 /*
1399                  * This update must be interlocked with pmap_pinit2.
1400                  */
1401                 TAILQ_FOREACH(pmap, &pmap_list, pm_pmnode) {
1402                         *pmap_pde(pmap, kernel_vm_end) = newpdir;
1403                 }
1404                 kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) &
1405                                 ~(PAGE_SIZE * NPTEPG - 1);
1406         }
1407         crit_exit();
1408 }
1409
1410 /*
1411  *      Retire the given physical map from service.
1412  *      Should only be called if the map contains
1413  *      no valid mappings.
1414  */
1415 void
1416 pmap_destroy(pmap_t pmap)
1417 {
1418         int count;
1419
1420         if (pmap == NULL)
1421                 return;
1422
1423         count = --pmap->pm_count;
1424         if (count == 0) {
1425                 pmap_release(pmap);
1426                 panic("destroying a pmap is not yet implemented");
1427         }
1428 }
1429
1430 /*
1431  *      Add a reference to the specified pmap.
1432  */
1433 void
1434 pmap_reference(pmap_t pmap)
1435 {
1436         if (pmap != NULL) {
1437                 pmap->pm_count++;
1438         }
1439 }
1440
1441 /***************************************************
1442 * page management routines.
1443  ***************************************************/
1444
1445 /*
1446  * free the pv_entry back to the free list.  This function may be
1447  * called from an interrupt.
1448  */
1449 static PMAP_INLINE void
1450 free_pv_entry(pv_entry_t pv)
1451 {
1452         pv_entry_count--;
1453         zfree(pvzone, pv);
1454 }
1455
1456 /*
1457  * get a new pv_entry, allocating a block from the system
1458  * when needed.  This function may be called from an interrupt.
1459  */
1460 static pv_entry_t
1461 get_pv_entry(void)
1462 {
1463         pv_entry_count++;
1464         if (pv_entry_high_water &&
1465                 (pv_entry_count > pv_entry_high_water) &&
1466                 (pmap_pagedaemon_waken == 0)) {
1467                 pmap_pagedaemon_waken = 1;
1468                 wakeup (&vm_pages_needed);
1469         }
1470         return zalloc(pvzone);
1471 }
1472
1473 /*
1474  * This routine is very drastic, but can save the system
1475  * in a pinch.
1476  */
1477 void
1478 pmap_collect(void)
1479 {
1480         int i;
1481         vm_page_t m;
1482         static int warningdone=0;
1483
1484         if (pmap_pagedaemon_waken == 0)
1485                 return;
1486
1487         if (warningdone < 5) {
1488                 kprintf("pmap_collect: collecting pv entries -- suggest increasing PMAP_SHPGPERPROC\n");
1489                 warningdone++;
1490         }
1491
1492         for(i = 0; i < vm_page_array_size; i++) {
1493                 m = &vm_page_array[i];
1494                 if (m->wire_count || m->hold_count || m->busy ||
1495                     (m->flags & PG_BUSY))
1496                         continue;
1497                 pmap_remove_all(m);
1498         }
1499         pmap_pagedaemon_waken = 0;
1500 }
1501         
1502
1503 /*
1504  * If it is the first entry on the list, it is actually
1505  * in the header and we must copy the following entry up
1506  * to the header.  Otherwise we must search the list for
1507  * the entry.  In either case we free the now unused entry.
1508  */
1509 static int
1510 pmap_remove_entry(struct pmap *pmap, vm_page_t m, 
1511                         vm_offset_t va, pmap_inval_info_t info)
1512 {
1513         pv_entry_t pv;
1514         int rtval;
1515
1516         crit_enter();
1517         if (m->md.pv_list_count < pmap->pm_stats.resident_count) {
1518                 TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
1519                         if (pmap == pv->pv_pmap && va == pv->pv_va) 
1520                                 break;
1521                 }
1522         } else {
1523                 TAILQ_FOREACH(pv, &pmap->pm_pvlist, pv_plist) {
1524                         if (va == pv->pv_va) 
1525                                 break;
1526                 }
1527         }
1528
1529         rtval = 0;
1530         if (pv) {
1531                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1532                 m->md.pv_list_count--;
1533                 if (TAILQ_FIRST(&m->md.pv_list) == NULL)
1534                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1535                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
1536                 ++pmap->pm_generation;
1537                 rtval = pmap_unuse_pt(pmap, va, pv->pv_ptem, info);
1538                 free_pv_entry(pv);
1539         }
1540         crit_exit();
1541         return rtval;
1542 }
1543
1544 /*
1545  * Create a pv entry for page at pa for
1546  * (pmap, va).
1547  */
1548 static void
1549 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m)
1550 {
1551         pv_entry_t pv;
1552
1553         crit_enter();
1554         pv = get_pv_entry();
1555         pv->pv_va = va;
1556         pv->pv_pmap = pmap;
1557         pv->pv_ptem = mpte;
1558
1559         TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
1560         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1561         m->md.pv_list_count++;
1562
1563         crit_exit();
1564 }
1565
1566 /*
1567  * pmap_remove_pte: do the things to unmap a page in a process
1568  */
1569 static int
1570 pmap_remove_pte(struct pmap *pmap, unsigned *ptq, vm_offset_t va,
1571         pmap_inval_info_t info)
1572 {
1573         unsigned oldpte;
1574         vm_page_t m;
1575
1576         pmap_inval_add(info, pmap, va);
1577         oldpte = loadandclear(ptq);
1578         if (oldpte & PG_W)
1579                 pmap->pm_stats.wired_count -= 1;
1580         /*
1581          * Machines that don't support invlpg, also don't support
1582          * PG_G.  XXX PG_G is disabled for SMP so don't worry about
1583          * the SMP case.
1584          */
1585         if (oldpte & PG_G)
1586                 cpu_invlpg((void *)va);
1587         pmap->pm_stats.resident_count -= 1;
1588         if (oldpte & PG_MANAGED) {
1589                 m = PHYS_TO_VM_PAGE(oldpte);
1590                 if (oldpte & PG_M) {
1591 #if defined(PMAP_DIAGNOSTIC)
1592                         if (pmap_nw_modified((pt_entry_t) oldpte)) {
1593                                 kprintf(
1594         "pmap_remove: modified page not writable: va: 0x%x, pte: 0x%x\n",
1595                                     va, oldpte);
1596                         }
1597 #endif
1598                         if (pmap_track_modified(va))
1599                                 vm_page_dirty(m);
1600                 }
1601                 if (oldpte & PG_A)
1602                         vm_page_flag_set(m, PG_REFERENCED);
1603                 return pmap_remove_entry(pmap, m, va, info);
1604         } else {
1605                 return pmap_unuse_pt(pmap, va, NULL, info);
1606         }
1607
1608         return 0;
1609 }
1610
1611 /*
1612  * pmap_remove_page:
1613  *
1614  *      Remove a single page from a process address space.
1615  *
1616  *      This function may not be called from an interrupt if the pmap is
1617  *      not kernel_pmap.
1618  */
1619 static void
1620 pmap_remove_page(struct pmap *pmap, vm_offset_t va, pmap_inval_info_t info)
1621 {
1622         unsigned *ptq;
1623
1624         /*
1625          * if there is no pte for this address, just skip it!!!  Otherwise
1626          * get a local va for mappings for this pmap and remove the entry.
1627          */
1628         if (*pmap_pde(pmap, va) != 0) {
1629                 ptq = get_ptbase(pmap) + i386_btop(va);
1630                 if (*ptq) {
1631                         pmap_remove_pte(pmap, ptq, va, info);
1632                 }
1633         }
1634 }
1635
1636 /*
1637  * pmap_remove:
1638  *
1639  *      Remove the given range of addresses from the specified map.
1640  *
1641  *      It is assumed that the start and end are properly
1642  *      rounded to the page size.
1643  *
1644  *      This function may not be called from an interrupt if the pmap is
1645  *      not kernel_pmap.
1646  */
1647 void
1648 pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
1649 {
1650         unsigned *ptbase;
1651         vm_offset_t pdnxt;
1652         vm_offset_t ptpaddr;
1653         vm_offset_t sindex, eindex;
1654         struct pmap_inval_info info;
1655
1656         if (pmap == NULL)
1657                 return;
1658
1659         if (pmap->pm_stats.resident_count == 0)
1660                 return;
1661
1662         pmap_inval_init(&info);
1663
1664         /*
1665          * special handling of removing one page.  a very
1666          * common operation and easy to short circuit some
1667          * code.
1668          */
1669         if (((sva + PAGE_SIZE) == eva) && 
1670                 (((unsigned) pmap->pm_pdir[(sva >> PDRSHIFT)] & PG_PS) == 0)) {
1671                 pmap_remove_page(pmap, sva, &info);
1672                 pmap_inval_flush(&info);
1673                 return;
1674         }
1675
1676         /*
1677          * Get a local virtual address for the mappings that are being
1678          * worked with.
1679          */
1680         sindex = i386_btop(sva);
1681         eindex = i386_btop(eva);
1682
1683         for (; sindex < eindex; sindex = pdnxt) {
1684                 unsigned pdirindex;
1685
1686                 /*
1687                  * Calculate index for next page table.
1688                  */
1689                 pdnxt = ((sindex + NPTEPG) & ~(NPTEPG - 1));
1690                 if (pmap->pm_stats.resident_count == 0)
1691                         break;
1692
1693                 pdirindex = sindex / NPDEPG;
1694                 if (((ptpaddr = (unsigned) pmap->pm_pdir[pdirindex]) & PG_PS) != 0) {
1695                         pmap_inval_add(&info, pmap, -1);
1696                         pmap->pm_pdir[pdirindex] = 0;
1697                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1698                         continue;
1699                 }
1700
1701                 /*
1702                  * Weed out invalid mappings. Note: we assume that the page
1703                  * directory table is always allocated, and in kernel virtual.
1704                  */
1705                 if (ptpaddr == 0)
1706                         continue;
1707
1708                 /*
1709                  * Limit our scan to either the end of the va represented
1710                  * by the current page table page, or to the end of the
1711                  * range being removed.
1712                  */
1713                 if (pdnxt > eindex) {
1714                         pdnxt = eindex;
1715                 }
1716
1717                 /*
1718                  * NOTE: pmap_remove_pte() can block.
1719                  */
1720                 for (; sindex != pdnxt; sindex++) {
1721                         vm_offset_t va;
1722
1723                         ptbase = get_ptbase(pmap);
1724                         if (ptbase[sindex] == 0)
1725                                 continue;
1726                         va = i386_ptob(sindex);
1727                         if (pmap_remove_pte(pmap, ptbase + sindex, va, &info))
1728                                 break;
1729                 }
1730         }
1731         pmap_inval_flush(&info);
1732 }
1733
1734 /*
1735  * pmap_remove_all:
1736  *
1737  *      Removes this physical page from all physical maps in which it resides.
1738  *      Reflects back modify bits to the pager.
1739  *
1740  *      This routine may not be called from an interrupt.
1741  */
1742
1743 static void
1744 pmap_remove_all(vm_page_t m)
1745 {
1746         struct pmap_inval_info info;
1747         unsigned *pte, tpte;
1748         pv_entry_t pv;
1749
1750 #if defined(PMAP_DIAGNOSTIC)
1751         /*
1752          * XXX this makes pmap_page_protect(NONE) illegal for non-managed
1753          * pages!
1754          */
1755         if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) {
1756                 panic("pmap_page_protect: illegal for unmanaged page, va: 0x%08llx", (long long)VM_PAGE_TO_PHYS(m));
1757         }
1758 #endif
1759
1760         pmap_inval_init(&info);
1761         crit_enter();
1762         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
1763                 pv->pv_pmap->pm_stats.resident_count--;
1764
1765                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
1766                 pmap_inval_add(&info, pv->pv_pmap, pv->pv_va);
1767
1768                 tpte = loadandclear(pte);
1769                 if (tpte & PG_W)
1770                         pv->pv_pmap->pm_stats.wired_count--;
1771
1772                 if (tpte & PG_A)
1773                         vm_page_flag_set(m, PG_REFERENCED);
1774
1775                 /*
1776                  * Update the vm_page_t clean and reference bits.
1777                  */
1778                 if (tpte & PG_M) {
1779 #if defined(PMAP_DIAGNOSTIC)
1780                         if (pmap_nw_modified((pt_entry_t) tpte)) {
1781                                 kprintf(
1782         "pmap_remove_all: modified page not writable: va: 0x%x, pte: 0x%x\n",
1783                                     pv->pv_va, tpte);
1784                         }
1785 #endif
1786                         if (pmap_track_modified(pv->pv_va))
1787                                 vm_page_dirty(m);
1788                 }
1789                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1790                 TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
1791                 ++pv->pv_pmap->pm_generation;
1792                 m->md.pv_list_count--;
1793                 pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem, &info);
1794                 free_pv_entry(pv);
1795         }
1796
1797         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1798         crit_exit();
1799         pmap_inval_flush(&info);
1800 }
1801
1802 /*
1803  * pmap_protect:
1804  *
1805  *      Set the physical protection on the specified range of this map
1806  *      as requested.
1807  *
1808  *      This function may not be called from an interrupt if the map is
1809  *      not the kernel_pmap.
1810  */
1811 void
1812 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
1813 {
1814         unsigned *ptbase;
1815         vm_offset_t pdnxt, ptpaddr;
1816         vm_pindex_t sindex, eindex;
1817         pmap_inval_info info;
1818
1819         if (pmap == NULL)
1820                 return;
1821
1822         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
1823                 pmap_remove(pmap, sva, eva);
1824                 return;
1825         }
1826
1827         if (prot & VM_PROT_WRITE)
1828                 return;
1829
1830         pmap_inval_init(&info);
1831
1832         ptbase = get_ptbase(pmap);
1833
1834         sindex = i386_btop(sva);
1835         eindex = i386_btop(eva);
1836
1837         for (; sindex < eindex; sindex = pdnxt) {
1838
1839                 unsigned pdirindex;
1840
1841                 pdnxt = ((sindex + NPTEPG) & ~(NPTEPG - 1));
1842
1843                 pdirindex = sindex / NPDEPG;
1844                 if (((ptpaddr = (unsigned) pmap->pm_pdir[pdirindex]) & PG_PS) != 0) {
1845                         pmap_inval_add(&info, pmap, -1);
1846                         pmap->pm_pdir[pdirindex] &= ~(PG_M|PG_RW);
1847                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1848                         continue;
1849                 }
1850
1851                 /*
1852                  * Weed out invalid mappings. Note: we assume that the page
1853                  * directory table is always allocated, and in kernel virtual.
1854                  */
1855                 if (ptpaddr == 0)
1856                         continue;
1857
1858                 if (pdnxt > eindex) {
1859                         pdnxt = eindex;
1860                 }
1861
1862                 for (; sindex != pdnxt; sindex++) {
1863
1864                         unsigned pbits;
1865                         vm_page_t m;
1866
1867                         /* XXX this isn't optimal */
1868                         pmap_inval_add(&info, pmap, i386_ptob(sindex));
1869                         pbits = ptbase[sindex];
1870
1871                         if (pbits & PG_MANAGED) {
1872                                 m = NULL;
1873                                 if (pbits & PG_A) {
1874                                         m = PHYS_TO_VM_PAGE(pbits);
1875                                         vm_page_flag_set(m, PG_REFERENCED);
1876                                         pbits &= ~PG_A;
1877                                 }
1878                                 if (pbits & PG_M) {
1879                                         if (pmap_track_modified(i386_ptob(sindex))) {
1880                                                 if (m == NULL)
1881                                                         m = PHYS_TO_VM_PAGE(pbits);
1882                                                 vm_page_dirty(m);
1883                                                 pbits &= ~PG_M;
1884                                         }
1885                                 }
1886                         }
1887
1888                         pbits &= ~PG_RW;
1889
1890                         if (pbits != ptbase[sindex]) {
1891                                 ptbase[sindex] = pbits;
1892                         }
1893                 }
1894         }
1895         pmap_inval_flush(&info);
1896 }
1897
1898 /*
1899  *      Insert the given physical page (p) at
1900  *      the specified virtual address (v) in the
1901  *      target physical map with the protection requested.
1902  *
1903  *      If specified, the page will be wired down, meaning
1904  *      that the related pte can not be reclaimed.
1905  *
1906  *      NB:  This is the only routine which MAY NOT lazy-evaluate
1907  *      or lose information.  That is, this routine must actually
1908  *      insert this page into the given map NOW.
1909  */
1910 void
1911 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
1912            boolean_t wired)
1913 {
1914         vm_paddr_t pa;
1915         unsigned *pte;
1916         vm_paddr_t opa;
1917         vm_offset_t origpte, newpte;
1918         vm_page_t mpte;
1919         pmap_inval_info info;
1920
1921         if (pmap == NULL)
1922                 return;
1923
1924         va &= PG_FRAME;
1925 #ifdef PMAP_DIAGNOSTIC
1926         if (va >= KvaEnd)
1927                 panic("pmap_enter: toobig");
1928         if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS))
1929                 panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va);
1930 #endif
1931         if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
1932                 kprintf("Warning: pmap_enter called on UVA with kernel_pmap\n");
1933 #ifdef DDB
1934                 db_print_backtrace();
1935 #endif
1936         }
1937         if (va >= UPT_MAX_ADDRESS && pmap != &kernel_pmap) {
1938                 kprintf("Warning: pmap_enter called on KVA without kernel_pmap\n");
1939 #ifdef DDB
1940                 db_print_backtrace();
1941 #endif
1942         }
1943
1944         mpte = NULL;
1945         /*
1946          * In the case that a page table page is not
1947          * resident, we are creating it here.
1948          */
1949         if (va < UPT_MIN_ADDRESS) {
1950                 mpte = pmap_allocpte(pmap, va);
1951         }
1952
1953         pmap_inval_init(&info);
1954         pte = pmap_pte(pmap, va);
1955
1956         /*
1957          * Page Directory table entry not valid, we need a new PT page
1958          */
1959         if (pte == NULL) {
1960                 panic("pmap_enter: invalid page directory pdir=%x, va=0x%x\n",
1961                      (unsigned) pmap->pm_pdir[PTDPTDI], va);
1962         }
1963
1964         pa = VM_PAGE_TO_PHYS(m) & PG_FRAME;
1965         pmap_inval_add(&info, pmap, va); /* XXX non-optimal */
1966         origpte = *(vm_offset_t *)pte;
1967         opa = origpte & PG_FRAME;
1968
1969         if (origpte & PG_PS)
1970                 panic("pmap_enter: attempted pmap_enter on 4MB page");
1971
1972         /*
1973          * Mapping has not changed, must be protection or wiring change.
1974          */
1975         if (origpte && (opa == pa)) {
1976                 /*
1977                  * Wiring change, just update stats. We don't worry about
1978                  * wiring PT pages as they remain resident as long as there
1979                  * are valid mappings in them. Hence, if a user page is wired,
1980                  * the PT page will be also.
1981                  */
1982                 if (wired && ((origpte & PG_W) == 0))
1983                         pmap->pm_stats.wired_count++;
1984                 else if (!wired && (origpte & PG_W))
1985                         pmap->pm_stats.wired_count--;
1986
1987 #if defined(PMAP_DIAGNOSTIC)
1988                 if (pmap_nw_modified((pt_entry_t) origpte)) {
1989                         kprintf(
1990         "pmap_enter: modified page not writable: va: 0x%x, pte: 0x%x\n",
1991                             va, origpte);
1992                 }
1993 #endif
1994
1995                 /*
1996                  * Remove the extra pte reference.  Note that we cannot
1997                  * optimize the RO->RW case because we have adjusted the
1998                  * wiring count above and may need to adjust the wiring
1999                  * bits below.
2000                  */
2001                 if (mpte)
2002                         mpte->hold_count--;
2003
2004                 /*
2005                  * We might be turning off write access to the page,
2006                  * so we go ahead and sense modify status.
2007                  */
2008                 if (origpte & PG_MANAGED) {
2009                         if ((origpte & PG_M) && pmap_track_modified(va)) {
2010                                 vm_page_t om;
2011                                 om = PHYS_TO_VM_PAGE(opa);
2012                                 vm_page_dirty(om);
2013                         }
2014                         pa |= PG_MANAGED;
2015                 }
2016                 goto validate;
2017         } 
2018         /*
2019          * Mapping has changed, invalidate old range and fall through to
2020          * handle validating new mapping.
2021          */
2022         if (opa) {
2023                 int err;
2024                 err = pmap_remove_pte(pmap, pte, va, &info);
2025                 if (err)
2026                         panic("pmap_enter: pte vanished, va: 0x%x", va);
2027         }
2028
2029         /*
2030          * Enter on the PV list if part of our managed memory. Note that we
2031          * raise IPL while manipulating pv_table since pmap_enter can be
2032          * called at interrupt time.
2033          */
2034         if (pmap_initialized && 
2035             (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
2036                 pmap_insert_entry(pmap, va, mpte, m);
2037                 pa |= PG_MANAGED;
2038         }
2039
2040         /*
2041          * Increment counters
2042          */
2043         pmap->pm_stats.resident_count++;
2044         if (wired)
2045                 pmap->pm_stats.wired_count++;
2046
2047 validate:
2048         /*
2049          * Now validate mapping with desired protection/wiring.
2050          */
2051         newpte = (vm_offset_t) (pa | pte_prot(pmap, prot) | PG_V);
2052
2053         if (wired)
2054                 newpte |= PG_W;
2055         if (va < UPT_MIN_ADDRESS)
2056                 newpte |= PG_U;
2057         if (pmap == &kernel_pmap)
2058                 newpte |= pgeflag;
2059
2060         /*
2061          * if the mapping or permission bits are different, we need
2062          * to update the pte.
2063          */
2064         if ((origpte & ~(PG_M|PG_A)) != newpte) {
2065                 *pte = newpte | PG_A;
2066         }
2067         pmap_inval_flush(&info);
2068 }
2069
2070 /*
2071  * this code makes some *MAJOR* assumptions:
2072  * 1. Current pmap & pmap exists.
2073  * 2. Not wired.
2074  * 3. Read access.
2075  * 4. No page table pages.
2076  * 5. Tlbflush is deferred to calling procedure.
2077  * 6. Page IS managed.
2078  * but is *MUCH* faster than pmap_enter...
2079  */
2080
2081 static vm_page_t
2082 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
2083 {
2084         unsigned *pte;
2085         vm_paddr_t pa;
2086         pmap_inval_info info;
2087
2088         pmap_inval_init(&info);
2089
2090         if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
2091                 kprintf("Warning: pmap_enter_quick called on UVA with kernel_pmap\n");
2092 #ifdef DDB
2093                 db_print_backtrace();
2094 #endif
2095         }
2096         if (va >= UPT_MAX_ADDRESS && pmap != &kernel_pmap) {
2097                 kprintf("Warning: pmap_enter_quick called on KVA without kernel_pmap\n");
2098 #ifdef DDB
2099                 db_print_backtrace();
2100 #endif
2101         }
2102
2103         /*
2104          * In the case that a page table page is not
2105          * resident, we are creating it here.
2106          */
2107         if (va < UPT_MIN_ADDRESS) {
2108                 unsigned ptepindex;
2109                 vm_offset_t ptepa;
2110
2111                 /*
2112                  * Calculate pagetable page index
2113                  */
2114                 ptepindex = va >> PDRSHIFT;
2115                 if (mpte && (mpte->pindex == ptepindex)) {
2116                         mpte->hold_count++;
2117                 } else {
2118 retry:
2119                         /*
2120                          * Get the page directory entry
2121                          */
2122                         ptepa = (vm_offset_t) pmap->pm_pdir[ptepindex];
2123
2124                         /*
2125                          * If the page table page is mapped, we just increment
2126                          * the hold count, and activate it.
2127                          */
2128                         if (ptepa) {
2129                                 if (ptepa & PG_PS)
2130                                         panic("pmap_enter_quick: unexpected mapping into 4MB page");
2131                                 if (pmap->pm_ptphint &&
2132                                         (pmap->pm_ptphint->pindex == ptepindex)) {
2133                                         mpte = pmap->pm_ptphint;
2134                                 } else {
2135                                         mpte = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
2136                                         pmap->pm_ptphint = mpte;
2137                                 }
2138                                 if (mpte == NULL)
2139                                         goto retry;
2140                                 mpte->hold_count++;
2141                         } else {
2142                                 mpte = _pmap_allocpte(pmap, ptepindex);
2143                         }
2144                 }
2145         } else {
2146                 mpte = NULL;
2147         }
2148
2149         /*
2150          * This call to vtopte makes the assumption that we are
2151          * entering the page into the current pmap.  In order to support
2152          * quick entry into any pmap, one would likely use pmap_pte_quick.
2153          * But that isn't as quick as vtopte.
2154          */
2155         pte = (unsigned *)vtopte(va);
2156         if (*pte) {
2157                 if (mpte)
2158                         pmap_unwire_pte_hold(pmap, mpte, &info);
2159                 return 0;
2160         }
2161
2162         /*
2163          * Enter on the PV list if part of our managed memory. Note that we
2164          * raise IPL while manipulating pv_table since pmap_enter can be
2165          * called at interrupt time.
2166          */
2167         if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0)
2168                 pmap_insert_entry(pmap, va, mpte, m);
2169
2170         /*
2171          * Increment counters
2172          */
2173         pmap->pm_stats.resident_count++;
2174
2175         pa = VM_PAGE_TO_PHYS(m);
2176
2177         /*
2178          * Now validate mapping with RO protection
2179          */
2180         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
2181                 *pte = pa | PG_V | PG_U;
2182         else
2183                 *pte = pa | PG_V | PG_U | PG_MANAGED;
2184
2185         return mpte;
2186 }
2187
2188 /*
2189  * Make a temporary mapping for a physical address.  This is only intended
2190  * to be used for panic dumps.
2191  */
2192 void *
2193 pmap_kenter_temporary(vm_paddr_t pa, int i)
2194 {
2195         pmap_kenter((vm_offset_t)crashdumpmap + (i * PAGE_SIZE), pa);
2196         return ((void *)crashdumpmap);
2197 }
2198
2199 #define MAX_INIT_PT (96)
2200
2201 /*
2202  * This routine preloads the ptes for a given object into the specified pmap.
2203  * This eliminates the blast of soft faults on process startup and
2204  * immediately after an mmap.
2205  */
2206 static int pmap_object_init_pt_callback(vm_page_t p, void *data);
2207
2208 void
2209 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
2210                     vm_object_t object, vm_pindex_t pindex, 
2211                     vm_size_t size, int limit)
2212 {
2213         struct rb_vm_page_scan_info info;
2214         struct lwp *lp;
2215         int psize;
2216
2217         /*
2218          * We can't preinit if read access isn't set or there is no pmap
2219          * or object.
2220          */
2221         if ((prot & VM_PROT_READ) == 0 || pmap == NULL || object == NULL)
2222                 return;
2223
2224         /*
2225          * We can't preinit if the pmap is not the current pmap
2226          */
2227         lp = curthread->td_lwp;
2228         if (lp == NULL || pmap != vmspace_pmap(lp->lwp_vmspace))
2229                 return;
2230
2231         psize = i386_btop(size);
2232
2233         if ((object->type != OBJT_VNODE) ||
2234                 ((limit & MAP_PREFAULT_PARTIAL) && (psize > MAX_INIT_PT) &&
2235                         (object->resident_page_count > MAX_INIT_PT))) {
2236                 return;
2237         }
2238
2239         if (psize + pindex > object->size) {
2240                 if (object->size < pindex)
2241                         return;           
2242                 psize = object->size - pindex;
2243         }
2244
2245         if (psize == 0)
2246                 return;
2247
2248         /*
2249          * Use a red-black scan to traverse the requested range and load
2250          * any valid pages found into the pmap.
2251          *
2252          * We cannot safely scan the object's memq unless we are in a
2253          * critical section since interrupts can remove pages from objects.
2254          */
2255         info.start_pindex = pindex;
2256         info.end_pindex = pindex + psize - 1;
2257         info.limit = limit;
2258         info.mpte = NULL;
2259         info.addr = addr;
2260         info.pmap = pmap;
2261
2262         crit_enter();
2263         vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
2264                                 pmap_object_init_pt_callback, &info);
2265         crit_exit();
2266 }
2267
2268 static
2269 int
2270 pmap_object_init_pt_callback(vm_page_t p, void *data)
2271 {
2272         struct rb_vm_page_scan_info *info = data;
2273         vm_pindex_t rel_index;
2274         /*
2275          * don't allow an madvise to blow away our really
2276          * free pages allocating pv entries.
2277          */
2278         if ((info->limit & MAP_PREFAULT_MADVISE) &&
2279                 vmstats.v_free_count < vmstats.v_free_reserved) {
2280                     return(-1);
2281         }
2282         if (((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
2283             (p->busy == 0) && (p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
2284                 if ((p->queue - p->pc) == PQ_CACHE)
2285                         vm_page_deactivate(p);
2286                 vm_page_busy(p);
2287                 rel_index = p->pindex - info->start_pindex;
2288                 info->mpte = pmap_enter_quick(info->pmap,
2289                                               info->addr + i386_ptob(rel_index),
2290                                               p, info->mpte);
2291                 vm_page_flag_set(p, PG_MAPPED);
2292                 vm_page_wakeup(p);
2293         }
2294         return(0);
2295 }
2296
2297 /*
2298  * pmap_prefault provides a quick way of clustering pagefaults into a
2299  * processes address space.  It is a "cousin" of pmap_object_init_pt, 
2300  * except it runs at page fault time instead of mmap time.
2301  */
2302 #define PFBAK 4
2303 #define PFFOR 4
2304 #define PAGEORDER_SIZE (PFBAK+PFFOR)
2305
2306 static int pmap_prefault_pageorder[] = {
2307         -PAGE_SIZE, PAGE_SIZE,
2308         -2 * PAGE_SIZE, 2 * PAGE_SIZE,
2309         -3 * PAGE_SIZE, 3 * PAGE_SIZE,
2310         -4 * PAGE_SIZE, 4 * PAGE_SIZE
2311 };
2312
2313 void
2314 pmap_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry)
2315 {
2316         int i;
2317         vm_offset_t starta;
2318         vm_offset_t addr;
2319         vm_pindex_t pindex;
2320         vm_page_t m, mpte;
2321         vm_object_t object;
2322         struct lwp *lp;
2323
2324         /*
2325          * We do not currently prefault mappings that use virtual page
2326          * tables.  We do not prefault foreign pmaps.
2327          */
2328         if (entry->maptype == VM_MAPTYPE_VPAGETABLE)
2329                 return;
2330         lp = curthread->td_lwp;
2331         if (lp == NULL || (pmap != vmspace_pmap(lp->lwp_vmspace)))
2332                 return;
2333
2334         object = entry->object.vm_object;
2335
2336         starta = addra - PFBAK * PAGE_SIZE;
2337         if (starta < entry->start)
2338                 starta = entry->start;
2339         else if (starta > addra)
2340                 starta = 0;
2341
2342         /*
2343          * critical section protection is required to maintain the 
2344          * page/object association, interrupts can free pages and remove 
2345          * them from their objects.
2346          */
2347         mpte = NULL;
2348         crit_enter();
2349         for (i = 0; i < PAGEORDER_SIZE; i++) {
2350                 vm_object_t lobject;
2351                 unsigned *pte;
2352
2353                 addr = addra + pmap_prefault_pageorder[i];
2354                 if (addr > addra + (PFFOR * PAGE_SIZE))
2355                         addr = 0;
2356
2357                 if (addr < starta || addr >= entry->end)
2358                         continue;
2359
2360                 if ((*pmap_pde(pmap, addr)) == NULL) 
2361                         continue;
2362
2363                 pte = (unsigned *) vtopte(addr);
2364                 if (*pte)
2365                         continue;
2366
2367                 pindex = ((addr - entry->start) + entry->offset) >> PAGE_SHIFT;
2368                 lobject = object;
2369
2370                 for (m = vm_page_lookup(lobject, pindex);
2371                     (!m && (lobject->type == OBJT_DEFAULT) &&
2372                      (lobject->backing_object));
2373                     lobject = lobject->backing_object
2374                 ) {
2375                         if (lobject->backing_object_offset & PAGE_MASK)
2376                                 break;
2377                         pindex += (lobject->backing_object_offset >> PAGE_SHIFT);
2378                         m = vm_page_lookup(lobject->backing_object, pindex);
2379                 }
2380
2381                 /*
2382                  * give-up when a page is not in memory
2383                  */
2384                 if (m == NULL)
2385                         break;
2386
2387                 if (((m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
2388                         (m->busy == 0) &&
2389                     (m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
2390
2391                         if ((m->queue - m->pc) == PQ_CACHE) {
2392                                 vm_page_deactivate(m);
2393                         }
2394                         vm_page_busy(m);
2395                         mpte = pmap_enter_quick(pmap, addr, m, mpte);
2396                         vm_page_flag_set(m, PG_MAPPED);
2397                         vm_page_wakeup(m);
2398                 }
2399         }
2400         crit_exit();
2401 }
2402
2403 /*
2404  *      Routine:        pmap_change_wiring
2405  *      Function:       Change the wiring attribute for a map/virtual-address
2406  *                      pair.
2407  *      In/out conditions:
2408  *                      The mapping must already exist in the pmap.
2409  */
2410 void
2411 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
2412 {
2413         unsigned *pte;
2414
2415         if (pmap == NULL)
2416                 return;
2417
2418         pte = pmap_pte(pmap, va);
2419
2420         if (wired && !pmap_pte_w(pte))
2421                 pmap->pm_stats.wired_count++;
2422         else if (!wired && pmap_pte_w(pte))
2423                 pmap->pm_stats.wired_count--;
2424
2425         /*
2426          * Wiring is not a hardware characteristic so there is no need to
2427          * invalidate TLB.  However, in an SMP environment we must use
2428          * a locked bus cycle to update the pte (if we are not using 
2429          * the pmap_inval_*() API that is)... it's ok to do this for simple
2430          * wiring changes.
2431          */
2432 #ifdef SMP
2433         if (wired)
2434                 atomic_set_int(pte, PG_W);
2435         else
2436                 atomic_clear_int(pte, PG_W);
2437 #else
2438         if (wired)
2439                 atomic_set_int_nonlocked(pte, PG_W);
2440         else
2441                 atomic_clear_int_nonlocked(pte, PG_W);
2442 #endif
2443 }
2444
2445
2446
2447 /*
2448  *      Copy the range specified by src_addr/len
2449  *      from the source map to the range dst_addr/len
2450  *      in the destination map.
2451  *
2452  *      This routine is only advisory and need not do anything.
2453  */
2454 void
2455 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, 
2456         vm_size_t len, vm_offset_t src_addr)
2457 {
2458         pmap_inval_info info;
2459         vm_offset_t addr;
2460         vm_offset_t end_addr = src_addr + len;
2461         vm_offset_t pdnxt;
2462         unsigned src_frame, dst_frame;
2463         vm_page_t m;
2464
2465         if (dst_addr != src_addr)
2466                 return;
2467
2468         src_frame = ((unsigned) src_pmap->pm_pdir[PTDPTDI]) & PG_FRAME;
2469         if (src_frame != (((unsigned) PTDpde) & PG_FRAME)) {
2470                 return;
2471         }
2472
2473         dst_frame = ((unsigned) dst_pmap->pm_pdir[PTDPTDI]) & PG_FRAME;
2474         if (dst_frame != (((unsigned) APTDpde) & PG_FRAME)) {
2475                 APTDpde = (pd_entry_t) (dst_frame | PG_RW | PG_V);
2476                 /* The page directory is not shared between CPUs */
2477                 cpu_invltlb();
2478         }
2479         pmap_inval_init(&info);
2480         pmap_inval_add(&info, dst_pmap, -1);
2481         pmap_inval_add(&info, src_pmap, -1);
2482
2483         /*
2484          * critical section protection is required to maintain the page/object
2485          * association, interrupts can free pages and remove them from 
2486          * their objects.
2487          */
2488         crit_enter();
2489         for (addr = src_addr; addr < end_addr; addr = pdnxt) {
2490                 unsigned *src_pte, *dst_pte;
2491                 vm_page_t dstmpte, srcmpte;
2492                 vm_offset_t srcptepaddr;
2493                 unsigned ptepindex;
2494
2495                 if (addr >= UPT_MIN_ADDRESS)
2496                         panic("pmap_copy: invalid to pmap_copy page tables\n");
2497
2498                 /*
2499                  * Don't let optional prefaulting of pages make us go
2500                  * way below the low water mark of free pages or way
2501                  * above high water mark of used pv entries.
2502                  */
2503                 if (vmstats.v_free_count < vmstats.v_free_reserved ||
2504                     pv_entry_count > pv_entry_high_water)
2505                         break;
2506                 
2507                 pdnxt = ((addr + PAGE_SIZE*NPTEPG) & ~(PAGE_SIZE*NPTEPG - 1));
2508                 ptepindex = addr >> PDRSHIFT;
2509
2510                 srcptepaddr = (vm_offset_t) src_pmap->pm_pdir[ptepindex];
2511                 if (srcptepaddr == 0)
2512                         continue;
2513                         
2514                 if (srcptepaddr & PG_PS) {
2515                         if (dst_pmap->pm_pdir[ptepindex] == 0) {
2516                                 dst_pmap->pm_pdir[ptepindex] = (pd_entry_t) srcptepaddr;
2517                                 dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE;
2518                         }
2519                         continue;
2520                 }
2521
2522                 srcmpte = vm_page_lookup(src_pmap->pm_pteobj, ptepindex);
2523                 if ((srcmpte == NULL) ||
2524                         (srcmpte->hold_count == 0) || (srcmpte->flags & PG_BUSY))
2525                         continue;
2526
2527                 if (pdnxt > end_addr)
2528                         pdnxt = end_addr;
2529
2530                 src_pte = (unsigned *) vtopte(addr);
2531                 dst_pte = (unsigned *) avtopte(addr);
2532                 while (addr < pdnxt) {
2533                         unsigned ptetemp;
2534
2535                         ptetemp = *src_pte;
2536                         /*
2537                          * we only virtual copy managed pages
2538                          */
2539                         if ((ptetemp & PG_MANAGED) != 0) {
2540                                 /*
2541                                  * We have to check after allocpte for the
2542                                  * pte still being around...  allocpte can
2543                                  * block.
2544                                  */
2545                                 dstmpte = pmap_allocpte(dst_pmap, addr);
2546                                 if ((*dst_pte == 0) && (ptetemp = *src_pte)) {
2547                                         /*
2548                                          * Clear the modified and
2549                                          * accessed (referenced) bits
2550                                          * during the copy.
2551                                          */
2552                                         m = PHYS_TO_VM_PAGE(ptetemp);
2553                                         *dst_pte = ptetemp & ~(PG_M | PG_A);
2554                                         dst_pmap->pm_stats.resident_count++;
2555                                         pmap_insert_entry(dst_pmap, addr,
2556                                                 dstmpte, m);
2557                                 } else {
2558                                         pmap_unwire_pte_hold(dst_pmap, dstmpte, &info);
2559                                 }
2560                                 if (dstmpte->hold_count >= srcmpte->hold_count)
2561                                         break;
2562                         }
2563                         addr += PAGE_SIZE;
2564                         src_pte++;
2565                         dst_pte++;
2566                 }
2567         }
2568         crit_exit();
2569         pmap_inval_flush(&info);
2570 }       
2571
2572 /*
2573  * pmap_zero_page:
2574  *
2575  *      Zero the specified PA by mapping the page into KVM and clearing its
2576  *      contents.
2577  *
2578  *      This function may be called from an interrupt and no locking is
2579  *      required.
2580  */
2581 void
2582 pmap_zero_page(vm_paddr_t phys)
2583 {
2584         struct mdglobaldata *gd = mdcpu;
2585
2586         crit_enter();
2587         if (*(int *)gd->gd_CMAP3)
2588                 panic("pmap_zero_page: CMAP3 busy");
2589         *(int *)gd->gd_CMAP3 =
2590                     PG_V | PG_RW | (phys & PG_FRAME) | PG_A | PG_M;
2591         cpu_invlpg(gd->gd_CADDR3);
2592
2593 #if defined(I686_CPU)
2594         if (cpu_class == CPUCLASS_686)
2595                 i686_pagezero(gd->gd_CADDR3);
2596         else
2597 #endif
2598                 bzero(gd->gd_CADDR3, PAGE_SIZE);
2599         *(int *) gd->gd_CMAP3 = 0;
2600         crit_exit();
2601 }
2602
2603 /*
2604  * pmap_page_assertzero:
2605  *
2606  *      Assert that a page is empty, panic if it isn't.
2607  */
2608 void
2609 pmap_page_assertzero(vm_paddr_t phys)
2610 {
2611         struct mdglobaldata *gd = mdcpu;
2612         int i;
2613
2614         crit_enter();
2615         if (*(int *)gd->gd_CMAP3)
2616                 panic("pmap_zero_page: CMAP3 busy");
2617         *(int *)gd->gd_CMAP3 =
2618                     PG_V | PG_RW | (phys & PG_FRAME) | PG_A | PG_M;
2619         cpu_invlpg(gd->gd_CADDR3);
2620         for (i = 0; i < PAGE_SIZE; i += 4) {
2621             if (*(int *)((char *)gd->gd_CADDR3 + i) != 0) {
2622                 panic("pmap_page_assertzero() @ %p not zero!\n",
2623                     (void *)gd->gd_CADDR3);
2624             }
2625         }
2626         *(int *) gd->gd_CMAP3 = 0;
2627         crit_exit();
2628 }
2629
2630 /*
2631  * pmap_zero_page:
2632  *
2633  *      Zero part of a physical page by mapping it into memory and clearing
2634  *      its contents with bzero.
2635  *
2636  *      off and size may not cover an area beyond a single hardware page.
2637  */
2638 void
2639 pmap_zero_page_area(vm_paddr_t phys, int off, int size)
2640 {
2641         struct mdglobaldata *gd = mdcpu;
2642
2643         crit_enter();
2644         if (*(int *) gd->gd_CMAP3)
2645                 panic("pmap_zero_page: CMAP3 busy");
2646         *(int *) gd->gd_CMAP3 = PG_V | PG_RW | (phys & PG_FRAME) | PG_A | PG_M;
2647         cpu_invlpg(gd->gd_CADDR3);
2648
2649 #if defined(I686_CPU)
2650         if (cpu_class == CPUCLASS_686 && off == 0 && size == PAGE_SIZE)
2651                 i686_pagezero(gd->gd_CADDR3);
2652         else
2653 #endif
2654                 bzero((char *)gd->gd_CADDR3 + off, size);
2655         *(int *) gd->gd_CMAP3 = 0;
2656         crit_exit();
2657 }
2658
2659 /*
2660  * pmap_copy_page:
2661  *
2662  *      Copy the physical page from the source PA to the target PA.
2663  *      This function may be called from an interrupt.  No locking
2664  *      is required.
2665  */
2666 void
2667 pmap_copy_page(vm_paddr_t src, vm_paddr_t dst)
2668 {
2669         struct mdglobaldata *gd = mdcpu;
2670
2671         crit_enter();
2672         if (*(int *) gd->gd_CMAP1)
2673                 panic("pmap_copy_page: CMAP1 busy");
2674         if (*(int *) gd->gd_CMAP2)
2675                 panic("pmap_copy_page: CMAP2 busy");
2676
2677         *(int *) gd->gd_CMAP1 = PG_V | (src & PG_FRAME) | PG_A;
2678         *(int *) gd->gd_CMAP2 = PG_V | PG_RW | (dst & PG_FRAME) | PG_A | PG_M;
2679
2680         cpu_invlpg(gd->gd_CADDR1);
2681         cpu_invlpg(gd->gd_CADDR2);
2682
2683         bcopy(gd->gd_CADDR1, gd->gd_CADDR2, PAGE_SIZE);
2684
2685         *(int *) gd->gd_CMAP1 = 0;
2686         *(int *) gd->gd_CMAP2 = 0;
2687         crit_exit();
2688 }
2689
2690 /*
2691  * pmap_copy_page_frag:
2692  *
2693  *      Copy the physical page from the source PA to the target PA.
2694  *      This function may be called from an interrupt.  No locking
2695  *      is required.
2696  */
2697 void
2698 pmap_copy_page_frag(vm_paddr_t src, vm_paddr_t dst, size_t bytes)
2699 {
2700         struct mdglobaldata *gd = mdcpu;
2701
2702         crit_enter();
2703         if (*(int *) gd->gd_CMAP1)
2704                 panic("pmap_copy_page: CMAP1 busy");
2705         if (*(int *) gd->gd_CMAP2)
2706                 panic("pmap_copy_page: CMAP2 busy");
2707
2708         *(int *) gd->gd_CMAP1 = PG_V | (src & PG_FRAME) | PG_A;
2709         *(int *) gd->gd_CMAP2 = PG_V | PG_RW | (dst & PG_FRAME) | PG_A | PG_M;
2710
2711         cpu_invlpg(gd->gd_CADDR1);
2712         cpu_invlpg(gd->gd_CADDR2);
2713
2714         bcopy((char *)gd->gd_CADDR1 + (src & PAGE_MASK),
2715               (char *)gd->gd_CADDR2 + (dst & PAGE_MASK),
2716               bytes);
2717
2718         *(int *) gd->gd_CMAP1 = 0;
2719         *(int *) gd->gd_CMAP2 = 0;
2720         crit_exit();
2721 }
2722
2723 /*
2724  * Returns true if the pmap's pv is one of the first
2725  * 16 pvs linked to from this page.  This count may
2726  * be changed upwards or downwards in the future; it
2727  * is only necessary that true be returned for a small
2728  * subset of pmaps for proper page aging.
2729  */
2730 boolean_t
2731 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
2732 {
2733         pv_entry_t pv;
2734         int loops = 0;
2735
2736         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2737                 return FALSE;
2738
2739         crit_enter();
2740
2741         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2742                 if (pv->pv_pmap == pmap) {
2743                         crit_exit();
2744                         return TRUE;
2745                 }
2746                 loops++;
2747                 if (loops >= 16)
2748                         break;
2749         }
2750         crit_exit();
2751         return (FALSE);
2752 }
2753
2754 /*
2755  * Remove all pages from specified address space
2756  * this aids process exit speeds.  Also, this code
2757  * is special cased for current process only, but
2758  * can have the more generic (and slightly slower)
2759  * mode enabled.  This is much faster than pmap_remove
2760  * in the case of running down an entire address space.
2761  */
2762 void
2763 pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2764 {
2765         struct lwp *lp;
2766         unsigned *pte, tpte;
2767         pv_entry_t pv, npv;
2768         vm_page_t m;
2769         pmap_inval_info info;
2770         int iscurrentpmap;
2771         int32_t save_generation;
2772
2773         lp = curthread->td_lwp;
2774         if (lp && pmap == vmspace_pmap(lp->lwp_vmspace))
2775                 iscurrentpmap = 1;
2776         else
2777                 iscurrentpmap = 0;
2778
2779         pmap_inval_init(&info);
2780         crit_enter();
2781         for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
2782                 if (pv->pv_va >= eva || pv->pv_va < sva) {
2783                         npv = TAILQ_NEXT(pv, pv_plist);
2784                         continue;
2785                 }
2786
2787                 KKASSERT(pmap == pv->pv_pmap);
2788
2789                 if (iscurrentpmap)
2790                         pte = (unsigned *)vtopte(pv->pv_va);
2791                 else
2792                         pte = pmap_pte_quick(pmap, pv->pv_va);
2793                 if (pmap->pm_active)
2794                         pmap_inval_add(&info, pmap, pv->pv_va);
2795                 tpte = *pte;
2796
2797                 /*
2798                  * We cannot remove wired pages from a process' mapping
2799                  * at this time
2800                  */
2801                 if (tpte & PG_W) {
2802                         npv = TAILQ_NEXT(pv, pv_plist);
2803                         continue;
2804                 }
2805                 *pte = 0;
2806
2807                 m = PHYS_TO_VM_PAGE(tpte);
2808
2809                 KASSERT(m < &vm_page_array[vm_page_array_size],
2810                         ("pmap_remove_pages: bad tpte %x", tpte));
2811
2812                 pmap->pm_stats.resident_count--;
2813
2814                 /*
2815                  * Update the vm_page_t clean and reference bits.
2816                  */
2817                 if (tpte & PG_M) {
2818                         vm_page_dirty(m);
2819                 }
2820
2821                 npv = TAILQ_NEXT(pv, pv_plist);
2822                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
2823                 save_generation = ++pmap->pm_generation;
2824
2825                 m->md.pv_list_count--;
2826                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2827                 if (TAILQ_FIRST(&m->md.pv_list) == NULL) {
2828                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
2829                 }
2830
2831                 pmap_unuse_pt(pmap, pv->pv_va, pv->pv_ptem, &info);
2832                 free_pv_entry(pv);
2833
2834                 /*
2835                  * Restart the scan if we blocked during the unuse or free
2836                  * calls and other removals were made.
2837                  */
2838                 if (save_generation != pmap->pm_generation) {
2839                         kprintf("Warning: pmap_remove_pages race-A avoided\n");
2840                         pv = TAILQ_FIRST(&pmap->pm_pvlist);
2841                 }
2842         }
2843         pmap_inval_flush(&info);
2844         crit_exit();
2845 }
2846
2847 /*
2848  * pmap_testbit tests bits in pte's
2849  * note that the testbit/clearbit routines are inline,
2850  * and a lot of things compile-time evaluate.
2851  */
2852 static boolean_t
2853 pmap_testbit(vm_page_t m, int bit)
2854 {
2855         pv_entry_t pv;
2856         unsigned *pte;
2857
2858         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2859                 return FALSE;
2860
2861         if (TAILQ_FIRST(&m->md.pv_list) == NULL)
2862                 return FALSE;
2863
2864         crit_enter();
2865
2866         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2867                 /*
2868                  * if the bit being tested is the modified bit, then
2869                  * mark clean_map and ptes as never
2870                  * modified.
2871                  */
2872                 if (bit & (PG_A|PG_M)) {
2873                         if (!pmap_track_modified(pv->pv_va))
2874                                 continue;
2875                 }
2876
2877 #if defined(PMAP_DIAGNOSTIC)
2878                 if (!pv->pv_pmap) {
2879                         kprintf("Null pmap (tb) at va: 0x%x\n", pv->pv_va);
2880                         continue;
2881                 }
2882 #endif
2883                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
2884                 if (*pte & bit) {
2885                         crit_exit();
2886                         return TRUE;
2887                 }
2888         }
2889         crit_exit();
2890         return (FALSE);
2891 }
2892
2893 /*
2894  * this routine is used to modify bits in ptes
2895  */
2896 static __inline void
2897 pmap_clearbit(vm_page_t m, int bit)
2898 {
2899         struct pmap_inval_info info;
2900         pv_entry_t pv;
2901         unsigned *pte;
2902         unsigned pbits;
2903
2904         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2905                 return;
2906
2907         pmap_inval_init(&info);
2908         crit_enter();
2909
2910         /*
2911          * Loop over all current mappings setting/clearing as appropos If
2912          * setting RO do we need to clear the VAC?
2913          */
2914         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2915                 /*
2916                  * don't write protect pager mappings
2917                  */
2918                 if (bit == PG_RW) {
2919                         if (!pmap_track_modified(pv->pv_va))
2920                                 continue;
2921                 }
2922
2923 #if defined(PMAP_DIAGNOSTIC)
2924                 if (!pv->pv_pmap) {
2925                         kprintf("Null pmap (cb) at va: 0x%x\n", pv->pv_va);
2926                         continue;
2927                 }
2928 #endif
2929
2930                 /*
2931                  * Careful here.  We can use a locked bus instruction to
2932                  * clear PG_A or PG_M safely but we need to synchronize
2933                  * with the target cpus when we mess with PG_RW.
2934                  *
2935                  * We do not have to force synchronization when clearing
2936                  * PG_M even for PTEs generated via virtual memory maps,
2937                  * because the virtual kernel will invalidate the pmap
2938                  * entry when/if it needs to resynchronize the Modify bit.
2939                  */
2940                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
2941                 if (bit & PG_RW)
2942                         pmap_inval_add(&info, pv->pv_pmap, pv->pv_va);
2943
2944                 pbits = *pte;
2945                 if (pbits & bit) {
2946                         if (bit == PG_RW) {
2947                                 if (pbits & PG_M)
2948                                         vm_page_dirty(m);
2949                                 atomic_clear_int(pte, PG_M|PG_RW);
2950                         } else if (bit == PG_M) {
2951                                 /*
2952                                  * We could also clear PG_RW here to force
2953                                  * a fault on write to redetect PG_M for
2954                                  * virtual kernels, but it isn't necessary
2955                                  * since virtual kernels invalidate the pte 
2956                                  * when they clear the VPTE_M bit in their
2957                                  * virtual page tables.
2958                                  */
2959                                 atomic_clear_int(pte, PG_M);
2960                         } else {
2961                                 atomic_clear_int(pte, bit);
2962                         }
2963                 }
2964         }
2965         pmap_inval_flush(&info);
2966         crit_exit();
2967 }
2968
2969 /*
2970  *      pmap_page_protect:
2971  *
2972  *      Lower the permission for all mappings to a given page.
2973  */
2974 void
2975 pmap_page_protect(vm_page_t m, vm_prot_t prot)
2976 {
2977         if ((prot & VM_PROT_WRITE) == 0) {
2978                 if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
2979                         pmap_clearbit(m, PG_RW);
2980                 } else {
2981                         pmap_remove_all(m);
2982                 }
2983         }
2984 }
2985
2986 vm_paddr_t
2987 pmap_phys_address(int ppn)
2988 {
2989         return (i386_ptob(ppn));
2990 }
2991
2992 /*
2993  *      pmap_ts_referenced:
2994  *
2995  *      Return a count of reference bits for a page, clearing those bits.
2996  *      It is not necessary for every reference bit to be cleared, but it
2997  *      is necessary that 0 only be returned when there are truly no
2998  *      reference bits set.
2999  *
3000  *      XXX: The exact number of bits to check and clear is a matter that
3001  *      should be tested and standardized at some point in the future for
3002  *      optimal aging of shared pages.
3003  */
3004 int
3005 pmap_ts_referenced(vm_page_t m)
3006 {
3007         pv_entry_t pv, pvf, pvn;
3008         unsigned *pte;
3009         int rtval = 0;
3010
3011         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3012                 return (rtval);
3013
3014         crit_enter();
3015
3016         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3017
3018                 pvf = pv;
3019
3020                 do {
3021                         pvn = TAILQ_NEXT(pv, pv_list);
3022
3023                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3024
3025                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3026
3027                         if (!pmap_track_modified(pv->pv_va))
3028                                 continue;
3029
3030                         pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
3031
3032                         if (pte && (*pte & PG_A)) {
3033 #ifdef SMP
3034                                 atomic_clear_int(pte, PG_A);
3035 #else
3036                                 atomic_clear_int_nonlocked(pte, PG_A);
3037 #endif
3038                                 rtval++;
3039                                 if (rtval > 4) {
3040                                         break;
3041                                 }
3042                         }
3043                 } while ((pv = pvn) != NULL && pv != pvf);
3044         }
3045         crit_exit();
3046
3047         return (rtval);
3048 }
3049
3050 /*
3051  *      pmap_is_modified:
3052  *
3053  *      Return whether or not the specified physical page was modified
3054  *      in any physical maps.
3055  */
3056 boolean_t
3057 pmap_is_modified(vm_page_t m)
3058 {
3059         return pmap_testbit(m, PG_M);
3060 }
3061
3062 /*
3063  *      Clear the modify bits on the specified physical page.
3064  */
3065 void
3066 pmap_clear_modify(vm_page_t m)
3067 {
3068         pmap_clearbit(m, PG_M);
3069 }
3070
3071 /*
3072  *      pmap_clear_reference:
3073  *
3074  *      Clear the reference bit on the specified physical page.
3075  */
3076 void
3077 pmap_clear_reference(vm_page_t m)
3078 {
3079         pmap_clearbit(m, PG_A);
3080 }
3081
3082 /*
3083  * Miscellaneous support routines follow
3084  */
3085
3086 static void
3087 i386_protection_init(void)
3088 {
3089         int *kp, prot;
3090
3091         kp = protection_codes;
3092         for (prot = 0; prot < 8; prot++) {
3093                 switch (prot) {
3094                 case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_NONE:
3095                         /*
3096                          * Read access is also 0. There isn't any execute bit,
3097                          * so just make it readable.
3098                          */
3099                 case VM_PROT_READ | VM_PROT_NONE | VM_PROT_NONE:
3100                 case VM_PROT_READ | VM_PROT_NONE | VM_PROT_EXECUTE:
3101                 case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_EXECUTE:
3102                         *kp++ = 0;
3103                         break;
3104                 case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_NONE:
3105                 case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_EXECUTE:
3106                 case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_NONE:
3107                 case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE:
3108                         *kp++ = PG_RW;
3109                         break;
3110                 }
3111         }
3112 }
3113
3114 /*
3115  * Map a set of physical memory pages into the kernel virtual
3116  * address space. Return a pointer to where it is mapped. This
3117  * routine is intended to be used for mapping device memory,
3118  * NOT real memory.
3119  *
3120  * NOTE: we can't use pgeflag unless we invalidate the pages one at
3121  * a time.
3122  */
3123 void *
3124 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
3125 {
3126         vm_offset_t va, tmpva, offset;
3127         unsigned *pte;
3128
3129         offset = pa & PAGE_MASK;
3130         size = roundup(offset + size, PAGE_SIZE);
3131
3132         va = kmem_alloc_nofault(&kernel_map, size);
3133         if (!va)
3134                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3135
3136         pa = pa & PG_FRAME;
3137         for (tmpva = va; size > 0;) {
3138                 pte = (unsigned *)vtopte(tmpva);
3139                 *pte = pa | PG_RW | PG_V; /* | pgeflag; */
3140                 size -= PAGE_SIZE;
3141                 tmpva += PAGE_SIZE;
3142                 pa += PAGE_SIZE;
3143         }
3144         cpu_invltlb();
3145         smp_invltlb();
3146
3147         return ((void *)(va + offset));
3148 }
3149
3150 void
3151 pmap_unmapdev(vm_offset_t va, vm_size_t size)
3152 {
3153         vm_offset_t base, offset;
3154
3155         base = va & PG_FRAME;
3156         offset = va & PAGE_MASK;
3157         size = roundup(offset + size, PAGE_SIZE);
3158         pmap_qremove(va, size >> PAGE_SHIFT);
3159         kmem_free(&kernel_map, base, size);
3160 }
3161
3162 /*
3163  * perform the pmap work for mincore
3164  */
3165 int
3166 pmap_mincore(pmap_t pmap, vm_offset_t addr)
3167 {
3168         unsigned *ptep, pte;
3169         vm_page_t m;
3170         int val = 0;
3171         
3172         ptep = pmap_pte(pmap, addr);
3173         if (ptep == 0) {
3174                 return 0;
3175         }
3176
3177         if ((pte = *ptep) != 0) {
3178                 vm_offset_t pa;
3179
3180                 val = MINCORE_INCORE;
3181                 if ((pte & PG_MANAGED) == 0)
3182                         return val;
3183
3184                 pa = pte & PG_FRAME;
3185
3186                 m = PHYS_TO_VM_PAGE(pa);
3187
3188                 /*
3189                  * Modified by us
3190                  */
3191                 if (pte & PG_M)
3192                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
3193                 /*
3194                  * Modified by someone
3195                  */
3196                 else if (m->dirty || pmap_is_modified(m))
3197                         val |= MINCORE_MODIFIED_OTHER;
3198                 /*
3199                  * Referenced by us
3200                  */
3201                 if (pte & PG_A)
3202                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
3203
3204                 /*
3205                  * Referenced by someone
3206                  */
3207                 else if ((m->flags & PG_REFERENCED) || pmap_ts_referenced(m)) {
3208                         val |= MINCORE_REFERENCED_OTHER;
3209                         vm_page_flag_set(m, PG_REFERENCED);
3210                 }
3211         } 
3212         return val;
3213 }
3214
3215 /*
3216  * Replace p->p_vmspace with a new one.  If adjrefs is non-zero the new
3217  * vmspace will be ref'd and the old one will be deref'd.
3218  *
3219  * The vmspace for all lwps associated with the process will be adjusted
3220  * and cr3 will be reloaded if any lwp is the current lwp.
3221  */
3222 void
3223 pmap_replacevm(struct proc *p, struct vmspace *newvm, int adjrefs)
3224 {
3225         struct vmspace *oldvm;
3226         struct lwp *lp;
3227
3228         crit_enter();
3229         oldvm = p->p_vmspace;
3230         if (oldvm != newvm) {
3231                 p->p_vmspace = newvm;
3232                 KKASSERT(p->p_nthreads == 1);
3233                 lp = LIST_FIRST(&p->p_lwps);
3234                 pmap_setlwpvm(lp, newvm);
3235                 if (adjrefs) {
3236                         sysref_get(&newvm->vm_sysref);
3237                         sysref_put(&oldvm->vm_sysref);
3238                 }
3239         }
3240         crit_exit();
3241 }
3242
3243 /*
3244  * Set the vmspace for a LWP.  The vmspace is almost universally set the
3245  * same as the process vmspace, but virtual kernels need to swap out contexts
3246  * on a per-lwp basis.
3247  */
3248 void
3249 pmap_setlwpvm(struct lwp *lp, struct vmspace *newvm)
3250 {
3251         struct vmspace *oldvm;
3252         struct pmap *pmap;
3253
3254         crit_enter();
3255         oldvm = lp->lwp_vmspace;
3256
3257         if (oldvm != newvm) {
3258                 lp->lwp_vmspace = newvm;
3259                 if (curthread->td_lwp == lp) {
3260                         pmap = vmspace_pmap(newvm);
3261 #if defined(SMP)
3262                         atomic_set_int(&pmap->pm_active, 1 << mycpu->gd_cpuid);
3263 #else
3264                         pmap->pm_active |= 1;
3265 #endif
3266 #if defined(SWTCH_OPTIM_STATS)
3267                         tlb_flush_count++;
3268 #endif
3269                         curthread->td_pcb->pcb_cr3 = vtophys(pmap->pm_pdir);
3270                         load_cr3(curthread->td_pcb->pcb_cr3);
3271                         pmap = vmspace_pmap(oldvm);
3272 #if defined(SMP)
3273                         atomic_clear_int(&pmap->pm_active,
3274                                           1 << mycpu->gd_cpuid);
3275 #else
3276                         pmap->pm_active &= ~1;
3277 #endif
3278                 }
3279         }
3280         crit_exit();
3281 }
3282
3283 vm_offset_t
3284 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
3285 {
3286
3287         if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
3288                 return addr;
3289         }
3290
3291         addr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
3292         return addr;
3293 }
3294
3295
3296 #if defined(DEBUG)
3297
3298 static void     pads (pmap_t pm);
3299 void            pmap_pvdump (vm_paddr_t pa);
3300
3301 /* print address space of pmap*/
3302 static void
3303 pads(pmap_t pm)
3304 {
3305         unsigned va, i, j;
3306         unsigned *ptep;
3307
3308         if (pm == &kernel_pmap)
3309                 return;
3310         for (i = 0; i < 1024; i++)
3311                 if (pm->pm_pdir[i])
3312                         for (j = 0; j < 1024; j++) {
3313                                 va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
3314                                 if (pm == &kernel_pmap && va < KERNBASE)
3315                                         continue;
3316                                 if (pm != &kernel_pmap && va > UPT_MAX_ADDRESS)
3317                                         continue;
3318                                 ptep = pmap_pte_quick(pm, va);
3319                                 if (pmap_pte_v(ptep))
3320                                         kprintf("%x:%x ", va, *(int *) ptep);
3321                         };
3322
3323 }
3324
3325 void
3326 pmap_pvdump(vm_paddr_t pa)
3327 {
3328         pv_entry_t pv;
3329         vm_page_t m;
3330
3331         kprintf("pa %08llx", (long long)pa);
3332         m = PHYS_TO_VM_PAGE(pa);
3333         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3334 #ifdef used_to_be
3335                 kprintf(" -> pmap %p, va %x, flags %x",
3336                     (void *)pv->pv_pmap, pv->pv_va, pv->pv_flags);
3337 #endif
3338                 kprintf(" -> pmap %p, va %x", (void *)pv->pv_pmap, pv->pv_va);
3339                 pads(pv->pv_pmap);
3340         }
3341         kprintf(" ");
3342 }
3343 #endif