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