Some general code cleanup.

This commit is contained in:
mycroft 1993-12-14 13:02:52 +00:00
parent fccc819b20
commit 13552373e2

View File

@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.9 1993/12/14 05:31:25 mycroft Exp $
* $Id: pmap.c,v 1.10 1993/12/14 13:02:52 mycroft Exp $
*/
/*
@ -97,7 +97,7 @@
* Allocate various and sundry SYSMAPs used in the days of old VM
* and not yet converted. XXX.
*/
#define BSDVM_COMPAT 1
#define BSDVM_COMPAT 1
#ifdef DEBUG
struct {
@ -126,20 +126,20 @@ struct {
int debugmap = 0;
int pmapdebug = 0 /* 0xffff */;
#define PDB_FOLLOW 0x0001
#define PDB_INIT 0x0002
#define PDB_ENTER 0x0004
#define PDB_REMOVE 0x0008
#define PDB_CREATE 0x0010
#define PDB_PTPAGE 0x0020
#define PDB_CACHE 0x0040
#define PDB_BITS 0x0080
#define PDB_COLLECT 0x0100
#define PDB_PROTECT 0x0200
#define PDB_PDRTAB 0x0400
#define PDB_PARANOIA 0x2000
#define PDB_WIRING 0x4000
#define PDB_PVDUMP 0x8000
#define PDB_FOLLOW 0x0001
#define PDB_INIT 0x0002
#define PDB_ENTER 0x0004
#define PDB_REMOVE 0x0008
#define PDB_CREATE 0x0010
#define PDB_PTPAGE 0x0020
#define PDB_CACHE 0x0040
#define PDB_BITS 0x0080
#define PDB_COLLECT 0x0100
#define PDB_PROTECT 0x0200
#define PDB_PDRTAB 0x0400
#define PDB_PARANOIA 0x2000
#define PDB_WIRING 0x4000
#define PDB_PVDUMP 0x8000
int pmapvacflush = 0;
#define PVF_ENTER 0x01
@ -153,21 +153,21 @@ int pmapvacflush = 0;
*/
#define pmap_pde(m, v) (&((m)->pm_pdir[((vm_offset_t)(v) >> PDSHIFT)&1023]))
#define pmap_pte_pa(pte) (*(int *)(pte) & PG_FRAME)
#define pmap_pte_pa(pte) (*(int *)(pte) & PG_FRAME)
#define pmap_pde_v(pte) ((pte)->pd_v)
#define pmap_pte_w(pte) ((pte)->pg_w)
#define pmap_pte_m(pte) ((pte)->pg_m)
#define pmap_pte_u(pte) ((pte)->pg_u)
#define pmap_pte_v(pte) ((pte)->pg_v)
#define pmap_pte_set_w(pte, v) ((pte)->pg_w = (v))
#define pmap_pte_set_prot(pte, v) ((pte)->pg_prot = (v) >> 1)
#define pmap_pde_v(pte) ((pte)->pd_v)
#define pmap_pte_w(pte) ((pte)->pg_w)
#define pmap_pte_m(pte) ((pte)->pg_m)
#define pmap_pte_u(pte) ((pte)->pg_u)
#define pmap_pte_v(pte) ((pte)->pg_v)
#define pmap_pte_set_w(pte, v) ((pte)->pg_w = (v))
#define pmap_pte_set_prot(pte, v) ((pte)->pg_prot = (v) >> 1)
/*
* Given a map and a machine independent protection code,
* convert to a vax protection code.
*/
#define pte_prot(m, p) (protection_codes[p])
#define pte_prot(m, p) (protection_codes[p])
int protection_codes[8];
struct pmap kernel_pmap_store;
@ -184,6 +184,7 @@ boolean_t pmap_testbit __P((vm_offset_t, int));
void pmap_changebit __P((vm_offset_t, int, int));
/* XXX should be in a .h file somewhere */
#define PMAP_COPY_ON_WRITE(pa) pmap_changebit(pa, PG_RO, ~PG_RW)
#define PMAP_CLEAR_MODIFY(pa) pmap_changebit(pa, 0, ~PG_M)
#define PMAP_CLEAR_REFERENCE(pa) pmap_changebit(pa, 0, ~PG_U)
#define PMAP_IS_REFERENCED(pa) pmap_testbit(pa, PG_U)
@ -192,7 +193,7 @@ void pmap_changebit __P((vm_offset_t, int, int));
#define pmap_valid_page(pa) (pmap_initialized && pmap_page_index(pa) >= 0)
#if BSDVM_COMPAT
#include "msgbuf.h"
#include <sys/msgbuf.h>
/*
* All those kernel PT submaps that BSD is so fond of
@ -210,8 +211,8 @@ struct pte *msgbufmap;
* 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
* (physical) address starting relative to 0]
* from the linked base (virtual) address to the actual (physical)
* address starting relative to 0]
*/
struct pte *pmap_pte();
@ -252,13 +253,13 @@ pmap_bootstrap(virtual_start)
* Create Kernel page directory table and page maps.
* [ currently done in locore. i have wild and crazy ideas -wfj ]
*/
bzero(firstaddr, 4*NBPG);
bzero(firstaddr, (1+NKPDE)*NBPG);
kernel_pmap->pm_pdir = firstaddr + VM_MIN_KERNEL_ADDRESS;
kernel_pmap->pm_ptab = firstaddr + VM_MIN_KERNEL_ADDRESS + NBPG;
firstaddr += NBPG;
for (x = i386_btod(VM_MIN_KERNEL_ADDRESS);
x < i386_btod(VM_MIN_KERNEL_ADDRESS)+3; x++) {
x < i386_btod(VM_MIN_KERNEL_ADDRESS)+NKPDE; x++) {
struct pde *pde;
pde = kernel_pmap->pm_pdir + x;
*(int *)pde = firstaddr + x*NBPG | PG_V | PG_KW;
@ -302,13 +303,14 @@ pmap_bootstrap(virtual_start)
isaphysmem = pmap_steal_memory(DMA_BOUNCE * NBPG);
#endif
/* undo temporary double mapping */
*(int *)PTD = 0;
tlbflush();
}
void pmap_virtual_space(startp, endp)
vm_offset_t *startp;
vm_offset_t *endp;
vm_offset_t *startp;
vm_offset_t *endp;
{
*startp = virtual_avail;
@ -323,9 +325,9 @@ void pmap_virtual_space(startp, endp)
void
pmap_init()
{
vm_offset_t addr, addr2;
vm_size_t npg, s;
int rv;
vm_offset_t addr, addr2;
vm_size_t npg, s;
int rv;
extern int KPTphys;
if (PAGE_SIZE != NBPG)
@ -359,23 +361,21 @@ pmap_init()
* specified memory.
*/
vm_offset_t
pmap_map(virt, start, end, prot)
vm_offset_t virt;
vm_offset_t start;
vm_offset_t end;
int prot;
pmap_map(va, spa, epa, prot)
vm_offset_t va, spa, epa;
int prot;
{
#ifdef DEBUG
if (pmapdebug & PDB_FOLLOW)
printf("pmap_map(%x, %x, %x, %x)\n", virt, start, end, prot);
printf("pmap_map(%x, %x, %x, %x)\n", va, spa, epa, prot);
#endif
while (start < end) {
pmap_enter(kernel_pmap, virt, start, prot, FALSE);
virt += NBPG;
start += NBPG;
while (spa < epa) {
pmap_enter(kernel_pmap, va, spa, prot, FALSE);
va += NBPG;
spa += NBPG;
}
return virt;
return va;
}
/*
@ -395,7 +395,7 @@ pmap_map(virt, start, end, prot)
*/
pmap_t
pmap_create(size)
vm_size_t size;
vm_size_t size;
{
register pmap_t pmap;
@ -442,10 +442,10 @@ pmap_pinit(pmap)
pmap->pm_pdir = (pd_entry_t *) kmem_alloc(kernel_map, NBPG);
/* wire in kernel global address entries */
bcopy(PTD+KPTDI, pmap->pm_pdir+KPTDI, NKPDE*4);
bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, NKPDE * sizeof(pd_entry_t));
/* install self-referential address mapping entry */
*(int *)(pmap->pm_pdir+PTDPTDI) =
*(int *)(pmap->pm_pdir + PTDPTDI) =
(int)pmap_extract(kernel_pmap, pmap->pm_pdir) | PG_V | PG_KW;
pmap->pm_count = 1;
@ -495,8 +495,8 @@ pmap_release(pmap)
pg("pmap_release(%x)\n", pmap);
#endif
/* sometimes 1, sometimes 0; could rearrange pmap_destroy */
#ifdef DIAGNOSTICx
/* sometimes 1, sometimes 0; could rearrange pmap_destroy */
if (pmap->pm_count != 1)
panic("pmap_release count");
#endif
@ -509,19 +509,20 @@ pmap_release(pmap)
*/
void
pmap_reference(pmap)
pmap_t pmap;
pmap_t pmap;
{
if (pmap == NULL)
return;
#ifdef DEBUG
if (pmapdebug & PDB_FOLLOW)
printf("pmap_reference(%x)", pmap);
#endif
if (pmap != NULL) {
simple_lock(&pmap->pm_lock);
pmap->pm_count++;
simple_unlock(&pmap->pm_lock);
}
simple_lock(&pmap->pm_lock);
pmap->pm_count++;
simple_unlock(&pmap->pm_lock);
}
/*
@ -575,8 +576,6 @@ pmap_remove(pmap, sva, eva)
continue;
pa = pmap_pte_pa(pte);
if (!pmap_valid_page(pa))
continue;
#ifdef DEBUG
remove_stats.removes++;
@ -606,6 +605,9 @@ pmap_remove(pmap, sva, eva)
reduce wiring count on page table pages as references drop
#endif
if (!pmap_valid_page(pa))
continue;
/*
* Remove from the PV table (raise IPL since we
* may be called at interrupt time).
@ -699,33 +701,15 @@ pmap_remove_all(pa)
splx(s);
}
/*
* Routine: pmap_copy_on_write
* Function:
* Remove write privileges from all
* physical maps for this physical page.
*/
void
pmap_copy_on_write(pa)
vm_offset_t pa;
{
#ifdef DEBUG
if (pmapdebug & (PDB_FOLLOW|PDB_PROTECT))
printf("pmap_copy_on_write(%x)", pa);
#endif
pmap_changebit(pa, PG_RO, ~PG_RW);
}
/*
* Set the physical protection on the
* specified range of this map as requested.
*/
void
pmap_protect(pmap, sva, eva, prot)
register pmap_t pmap;
vm_offset_t sva, eva;
vm_prot_t prot;
register pmap_t pmap;
vm_offset_t sva, eva;
vm_prot_t prot;
{
register pt_entry_t *pte;
register int i386prot;
@ -735,9 +719,6 @@ pmap_protect(pmap, sva, eva, prot)
printf("pmap_protect(%x, %x, %x, %x)", pmap, sva, eva, prot);
#endif
if (pmap == NULL)
return;
if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
pmap_remove(pmap, sva, eva);
return;
@ -1009,7 +990,7 @@ pmap_page_protect(phys, prot)
switch (prot) {
case VM_PROT_READ:
case VM_PROT_READ|VM_PROT_EXECUTE:
pmap_copy_on_write(phys);
PMAP_COPY_ON_WRITE(phys);
break;
case VM_PROT_ALL:
break;
@ -1028,9 +1009,9 @@ pmap_page_protect(phys, prot)
*/
void
pmap_change_wiring(pmap, va, wired)
register pmap_t pmap;
vm_offset_t va;
boolean_t wired;
register pmap_t pmap;
vm_offset_t va;
boolean_t wired;
{
register pt_entry_t *pte;
@ -1077,7 +1058,7 @@ pmap_change_wiring(pmap, va, wired)
*/
struct pte *
pmap_pte(pmap, va)
register pmap_t pmap;
register pmap_t pmap;
vm_offset_t va;
{
struct pte *ptp;
@ -1114,7 +1095,7 @@ pmap_pte(pmap, va)
*/
vm_offset_t
pmap_extract(pmap, va)
register pmap_t pmap;
register pmap_t pmap;
vm_offset_t va;
{
register struct pte *pte;
@ -1146,12 +1127,11 @@ pmap_extract(pmap, va)
*
* This routine is only advisory and need not do anything.
*/
void pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr)
pmap_t dst_pmap;
pmap_t src_pmap;
vm_offset_t dst_addr;
vm_size_t len;
vm_offset_t src_addr;
void
pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr)
pmap_t dst_pmap, src_pmap;
vm_offset_t dst_addr, src_addr;
vm_size_t len;
{
#ifdef DEBUG
@ -1169,7 +1149,8 @@ void pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr)
* Generally used to insure that a thread about
* to run will see a semantically correct world.
*/
void pmap_update()
void
pmap_update()
{
#ifdef DEBUG
@ -1193,7 +1174,7 @@ void pmap_update()
*/
void
pmap_collect(pmap)
pmap_t pmap;
pmap_t pmap;
{
register vm_offset_t pa;
register pv_entry_t pv;
@ -1202,10 +1183,9 @@ pmap_collect(pmap)
int s;
#ifdef DEBUG
int *pde;
int opmapdebug;
printf("pmap_collect(%x) ", pmap);
#endif
if (pmap != kernel_pmap)
return;
@ -1277,7 +1257,6 @@ pmap_copy_page(src, dst)
bcopy(CADDR1, CADDR2, NBPG);
}
/*
* Routine: pmap_pageable
* Function:
@ -1294,9 +1273,9 @@ pmap_copy_page(src, dst)
*/
void
pmap_pageable(pmap, sva, eva, pageable)
pmap_t pmap;
vm_offset_t sva, eva;
boolean_t pageable;
pmap_t pmap;
vm_offset_t sva, eva;
boolean_t pageable;
{
#ifdef DEBUG
@ -1333,10 +1312,10 @@ pmap_pageable(pmap, sva, eva, pageable)
pa = pmap_pte_pa(pte);
#ifdef DEBUG
if (!pmap_valid_page(pa))
return;
#ifdef DEBUG
pv = pa_to_pvh(pa);
if (pv->pv_va != sva || pv->pv_next) {
pg("pmap_pageable: bad PT page va %x next %x\n",
@ -1360,13 +1339,26 @@ pmap_pageable(pmap, sva, eva, pageable)
}
}
/*
* Routine: pmap_copy_on_write
* Function:
* Remove write privileges from all
* physical maps for this physical page.
*/
void
pmap_copy_on_write(pa)
vm_offset_t pa;
{
PMAP_COPY_ON_WRITE(pa);
}
/*
* Clear the modify bits on the specified physical page.
*/
void
pmap_clear_modify(pa)
vm_offset_t pa;
vm_offset_t pa;
{
PMAP_CLEAR_MODIFY(pa);
@ -1377,9 +1369,9 @@ pmap_clear_modify(pa)
*
* Clear the reference bit on the specified physical page.
*/
void pmap_clear_reference(pa)
vm_offset_t pa;
void
pmap_clear_reference(pa)
vm_offset_t pa;
{
PMAP_CLEAR_REFERENCE(pa);
@ -1391,10 +1383,9 @@ void pmap_clear_reference(pa)
* Return whether or not the specified physical page is referenced
* by any physical maps.
*/
boolean_t
pmap_is_referenced(pa)
vm_offset_t pa;
vm_offset_t pa;
{
return PMAP_IS_REFERENCED(pa);
@ -1406,10 +1397,9 @@ pmap_is_referenced(pa)
* Return whether or not the specified physical page is modified
* by any physical maps.
*/
boolean_t
pmap_is_modified(pa)
vm_offset_t pa;
vm_offset_t pa;
{
return PMAP_IS_MODIFIED(pa);
@ -1431,13 +1421,13 @@ i386_protection_init()
{
protection_codes[VM_PROT_NONE | VM_PROT_NONE | VM_PROT_NONE] = 0;
protection_codes[VM_PROT_READ | VM_PROT_NONE | VM_PROT_NONE] =
protection_codes[VM_PROT_READ | VM_PROT_NONE | VM_PROT_EXECUTE] =
protection_codes[VM_PROT_NONE | VM_PROT_NONE | VM_PROT_EXECUTE] = PG_RO;
protection_codes[VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_NONE] =
protection_codes[VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_EXECUTE] =
protection_codes[VM_PROT_READ | VM_PROT_WRITE | VM_PROT_NONE] =
protection_codes[VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE] = PG_RW;
protection_codes[VM_PROT_NONE | VM_PROT_NONE | VM_PROT_EXECUTE] =
protection_codes[VM_PROT_NONE | VM_PROT_READ | VM_PROT_NONE] =
protection_codes[VM_PROT_NONE | VM_PROT_READ | VM_PROT_EXECUTE] = PG_RO;
protection_codes[VM_PROT_WRITE | VM_PROT_NONE | VM_PROT_NONE] =
protection_codes[VM_PROT_WRITE | VM_PROT_NONE | VM_PROT_EXECUTE] =
protection_codes[VM_PROT_WRITE | VM_PROT_READ | VM_PROT_NONE] =
protection_codes[VM_PROT_WRITE | VM_PROT_READ | VM_PROT_EXECUTE] = PG_RW;
}
boolean_t