This commit was manufactured by cvs2svn to create tag 'FreeBSD-release/1.0'.
[unix-history] / sys / i386 / i386 / pmap.c
index 66c7fec..f35dd0f 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     @(#)pmap.c      7.7 (Berkeley)  5/12/91
- *
- * PATCHES MAGIC                LEVEL   PATCH THAT GOT US HERE
- * --------------------         -----   ----------------------
- * CURRENT PATCH LEVEL:         1       00063
- * --------------------         -----   ----------------------
- *
- * 28 Nov 1991 Poul-Henning Kamp       Speedup processing.
+ *     from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
+ *     $Id: pmap.c,v 1.6 1993/10/12 15:09:37 rgrimes Exp $
  */
  */
-static char rcsid[] = "$Header: /usr/src/sys.386bsd/i386/i386/RCS/pmap.c,v 1.3 92/01/21 14:26:44 william Exp Locker: root $";
 
 /*
  * Derived from hp300 version by Mike Hibler, this version by William
 
 /*
  * Derived from hp300 version by Mike Hibler, this version by William
@@ -185,7 +178,7 @@ vm_offset_t virtual_avail;  /* VA of first avail page (after kernel bss)*/
 vm_offset_t    virtual_end;    /* VA of last avail page (end of kernel AS) */
 vm_offset_t    vm_first_phys;  /* PA of first managed page */
 vm_offset_t    vm_last_phys;   /* PA just past last managed page */
 vm_offset_t    virtual_end;    /* VA of last avail page (end of kernel AS) */
 vm_offset_t    vm_first_phys;  /* PA of first managed page */
 vm_offset_t    vm_last_phys;   /* PA just past last managed page */
-int            i386pagesperpage;       /* PAGE_SIZE / I386_PAGE_SIZE */
+int            i386pagesperpage;       /* PAGE_SIZE / NBPG */
 boolean_t      pmap_initialized = FALSE;       /* Has pmap_init completed? */
 char           *pmap_attributes;       /* reference and modify bits */
 
 boolean_t      pmap_initialized = FALSE;       /* Has pmap_init completed? */
 char           *pmap_attributes;       /* reference and modify bits */
 
@@ -212,7 +205,7 @@ struct msgbuf       *msgbufp;
  *     and just syncs the pmap module with what has already been done.
  *     [We can't call it easily with mapping off since the kernel is not
  *     mapped with PA == VA, hence we would have to relocate every address
  *     and just syncs the pmap module with what has already been done.
  *     [We can't call it easily with mapping off since the kernel is not
  *     mapped with PA == VA, hence we would have to relocate every address
- *     from the linked base (virtual) address 0xFE000000 to the actual
+ *     from the linked base (virtual) address KERNBASE to the actual
  *     (physical) address starting relative to 0]
  */
 struct pte *pmap_pte();
  *     (physical) address starting relative to 0]
  */
 struct pte *pmap_pte();
@@ -229,7 +222,7 @@ pmap_bootstrap(firstaddr, loadaddr)
        extern vm_offset_t maxmem, physmem;
 extern int IdlePTD;
 
        extern vm_offset_t maxmem, physmem;
 extern int IdlePTD;
 
-       avail_start = firstaddr;
+       avail_start = firstaddr + 8 * NBPG;
        avail_end = maxmem << PG_SHIFT;
 
        /* XXX: allow for msgbuf */
        avail_end = maxmem << PG_SHIFT;
 
        /* XXX: allow for msgbuf */
@@ -238,7 +231,7 @@ extern int IdlePTD;
        mem_size = physmem << PG_SHIFT;
        virtual_avail = (vm_offset_t)atdevbase + 0x100000 - 0xa0000 + 10*NBPG;
        virtual_end = VM_MAX_KERNEL_ADDRESS;
        mem_size = physmem << PG_SHIFT;
        virtual_avail = (vm_offset_t)atdevbase + 0x100000 - 0xa0000 + 10*NBPG;
        virtual_end = VM_MAX_KERNEL_ADDRESS;
-       i386pagesperpage = PAGE_SIZE / I386_PAGE_SIZE;
+       i386pagesperpage = PAGE_SIZE / NBPG;
 
        /*
         * Initialize protection array.
 
        /*
         * Initialize protection array.
@@ -256,6 +249,8 @@ extern int IdlePTD;
        /*
         * Create Kernel page directory table and page maps.
         * [ currently done in locore. i have wild and crazy ideas -wfj ]
        /*
         * Create Kernel page directory table and page maps.
         * [ currently done in locore. i have wild and crazy ideas -wfj ]
+        * XXX IF THIS IS EVER USED, IT MUST BE MOVED TO THE TOP
+        *      OF THIS ROUTINE -- cgd
         */
        bzero(firstaddr, 4*NBPG);
        kernel_pmap->pm_pdir = firstaddr + VM_MIN_KERNEL_ADDRESS;
         */
        bzero(firstaddr, 4*NBPG);
        kernel_pmap->pm_pdir = firstaddr + VM_MIN_KERNEL_ADDRESS;
@@ -269,7 +264,7 @@ extern int IdlePTD;
                *(int *)pde = firstaddr + x*NBPG | PG_V | PG_KW;
        }
 #else
                *(int *)pde = firstaddr + x*NBPG | PG_V | PG_KW;
        }
 #else
-       kernel_pmap->pm_pdir = (pd_entry_t *)(0xfe000000 + IdlePTD);
+       kernel_pmap->pm_pdir = (pd_entry_t *)(KERNBASE + IdlePTD);
 #endif
 
 
 #endif
 
 
@@ -281,7 +276,7 @@ extern int IdlePTD;
         * Allocate all the submaps we need
         */
 #define        SYSMAP(c, p, v, n)      \
         * Allocate all the submaps we need
         */
 #define        SYSMAP(c, p, v, n)      \
-       v = (c)va; va += ((n)*I386_PAGE_SIZE); p = pte; pte += (n);
+       v = (c)va; va += ((n)*NBPG); p = pte; pte += (n);
 
        va = virtual_avail;
        pte = pmap_pte(kernel_pmap, va);
 
        va = virtual_avail;
        pte = pmap_pte(kernel_pmap, va);
@@ -294,15 +289,16 @@ extern int IdlePTD;
 #endif
        /*
         * reserve special hunk of memory for use by bus dma as a bounce
 #endif
        /*
         * reserve special hunk of memory for use by bus dma as a bounce
-        * buffer (contiguous virtual *and* physical memory). for now,
-        * assume vm does not use memory beneath hole, and we know that
-        * the bootstrap uses top 32k of base memory. -wfj
+        * buffer (contiguous virtual *and* physical memory).
+        * do it from firstaddr -> firstaddr+8 pages.  note that
+        * avail_start was bumped up 8 pages, above, to accomodate this.
         */
        {
                extern vm_offset_t isaphysmem;
         */
        {
                extern vm_offset_t isaphysmem;
-       isaphysmem = va;
 
 
-       virtual_avail = pmap_map(va, 0xa0000 - 32*1024, 0xa0000, VM_PROT_ALL);
+               isaphysmem = va;
+               virtual_avail = pmap_map(va, firstaddr, firstaddr + 8*NBPG,
+                   VM_PROT_ALL);
        }
 
        *(int *)PTD = 0;
        }
 
        *(int *)PTD = 0;
@@ -336,7 +332,7 @@ pmap_init(phys_start, phys_end)
        (void) vm_map_find(kernel_map, NULL, (vm_offset_t) 0,
                           &addr, (0x100000-0xa0000), FALSE);
 
        (void) vm_map_find(kernel_map, NULL, (vm_offset_t) 0,
                           &addr, (0x100000-0xa0000), FALSE);
 
-       addr = (vm_offset_t) 0xfe000000+KPTphys/* *NBPG */;
+       addr = (vm_offset_t) KERNBASE + KPTphys/* *NBPG */;
        vm_object_reference(kernel_object);
        (void) vm_map_find(kernel_map, kernel_object, addr,
                           &addr, 2*NBPG, FALSE);
        vm_object_reference(kernel_object);
        (void) vm_map_find(kernel_map, kernel_object, addr,
                           &addr, 2*NBPG, FALSE);
@@ -456,12 +452,11 @@ pmap_pinit(pmap)
        pmap->pm_pdir = (pd_entry_t *) kmem_alloc(kernel_map, NBPG);
 
        /* wire in kernel global address entries */
        pmap->pm_pdir = (pd_entry_t *) kmem_alloc(kernel_map, NBPG);
 
        /* wire in kernel global address entries */
-       bcopy(PTD+KPTDI_FIRST, pmap->pm_pdir+KPTDI_FIRST,
-               (KPTDI_LAST-KPTDI_FIRST+1)*4);
+       bcopy(PTD+KPTDI, pmap->pm_pdir+KPTDI, NKPDE*4);
 
        /* install self-referential address mapping entry */
        *(int *)(pmap->pm_pdir+PTDPTDI) =
 
        /* install self-referential address mapping entry */
        *(int *)(pmap->pm_pdir+PTDPTDI) =
-               (int)pmap_extract(kernel_pmap, pmap->pm_pdir) | PG_V | PG_URKW;
+               (int)pmap_extract(kernel_pmap, pmap->pm_pdir) | PG_V | PG_KW;
 
        pmap->pm_count = 1;
        simple_lock_init(&pmap->pm_lock);
 
        pmap->pm_count = 1;
        simple_lock_init(&pmap->pm_lock);
@@ -643,7 +638,7 @@ pmap_remove(pmap, sva, eva)
                do {
                        bits |= *(int *)pte & (PG_U|PG_M);
                        *(int *)pte++ = 0;
                do {
                        bits |= *(int *)pte & (PG_U|PG_M);
                        *(int *)pte++ = 0;
-                       /*TBIS(va + ix * I386_PAGE_SIZE);*/
+                       /*TBIS(va + ix * NBPG);*/
                } while (++ix != i386pagesperpage);
                if (curproc && pmap == &curproc->p_vmspace->vm_pmap)
                        pmap_activate(pmap, (struct pcb *)curproc->p_addr);
                } while (++ix != i386pagesperpage);
                if (curproc && pmap == &curproc->p_vmspace->vm_pmap)
                        pmap_activate(pmap, (struct pcb *)curproc->p_addr);
@@ -846,7 +841,7 @@ pmap_protect(pmap, sva, eva, prot)
                do {
                        /* clear VAC here if PG_RO? */
                        pmap_pte_set_prot(pte++, i386prot);
                do {
                        /* clear VAC here if PG_RO? */
                        pmap_pte_set_prot(pte++, i386prot);
-                       /*TBIS(va + ix * I386_PAGE_SIZE);*/
+                       /*TBIS(va + ix * NBPG);*/
                } while (++ix != i386pagesperpage);
        }
        if (curproc && pmap == &curproc->p_vmspace->vm_pmap)
                } while (++ix != i386pagesperpage);
        }
        if (curproc && pmap == &curproc->p_vmspace->vm_pmap)
@@ -901,7 +896,8 @@ pmap_enter(pmap, va, pa, prot, wired)
         * Page Directory table entry not valid, we need a new PT page
         */
        if (!pmap_pde_v(pmap_pde(pmap, va))) {
         * Page Directory table entry not valid, we need a new PT page
         */
        if (!pmap_pde_v(pmap_pde(pmap, va))) {
-               pg("ptdi %x", pmap->pm_pdir[PTDPTDI]);
+               printf("ptdi %x\n", pmap->pm_pdir[PTDPTDI]);
+               panic("Page Table Directory Invalid (ptdi)");
        }
 
        pte = pmap_pte(pmap, va);
        }
 
        pte = pmap_pte(pmap, va);
@@ -1050,13 +1046,10 @@ validate:
        do {
                *(int *)pte++ = npte;
                /*TBIS(va);*/
        do {
                *(int *)pte++ = npte;
                /*TBIS(va);*/
-               npte += I386_PAGE_SIZE;
-               va += I386_PAGE_SIZE;
+               npte += NBPG;
+               va += NBPG;
        } while (++ix != i386pagesperpage);
        pte--;
        } while (++ix != i386pagesperpage);
        pte--;
-#ifdef DEBUGx
-cache, tlb flushes
-#endif
 /*pads(pmap);*/
        /*load_cr3(((struct pcb *)curproc->p_addr)->pcb_ptd);*/
        tlbflush();
 /*pads(pmap);*/
        /*load_cr3(((struct pcb *)curproc->p_addr)->pcb_ptd);*/
        tlbflush();
@@ -1162,6 +1155,7 @@ struct pte *pmap_pte(pmap, va)
        if (pmapdebug & PDB_FOLLOW)
                printf("pmap_pte(%x, %x) ->\n", pmap, va);
 #endif
        if (pmapdebug & PDB_FOLLOW)
                printf("pmap_pte(%x, %x) ->\n", pmap, va);
 #endif
+
        if (pmap && pmap_pde_v(pmap_pde(pmap, va))) {
 
                /* are we current address space or kernel? */
        if (pmap && pmap_pde_v(pmap_pde(pmap, va))) {
 
                /* are we current address space or kernel? */
@@ -1642,7 +1636,7 @@ pmap_changebit(pa, bit, setem)
                                        *pte = npte;
                                        /*TBIS(va);*/
                                }
                                        *pte = npte;
                                        /*TBIS(va);*/
                                }
-                               va += I386_PAGE_SIZE;
+                               va += NBPG;
                                pte++;
                        } while (++ix != i386pagesperpage);
 
                                pte++;
                        } while (++ix != i386pagesperpage);
 
@@ -1714,8 +1708,8 @@ pads(pm) pmap_t pm; {
        for (i = 0; i < 1024; i++) 
                if(pm->pm_pdir[i].pd_v)
                        for (j = 0; j < 1024 ; j++) {
        for (i = 0; i < 1024; i++) 
                if(pm->pm_pdir[i].pd_v)
                        for (j = 0; j < 1024 ; j++) {
-                               va = (i<<22)+(j<<12);
-                               if (pm == kernel_pmap && va < 0xfe000000)
+                               va = (i<<PD_SHIFT)+(j<<PG_SHIFT);
+                               if (pm == kernel_pmap && va < KERNBASE)
                                                continue;
                                if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
                                                continue;
                                                continue;
                                if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
                                                continue;