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