summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1996-05-02 22:25:18 +0000
committerphk <phk@FreeBSD.org>1996-05-02 22:25:18 +0000
commit7dad665664d82142d979dc0c80aa4d54a7bc2b56 (patch)
tree699aa9f5061281c3bb4f96ad209c3682bbf615aa
parenta65c6cdecd5f9ae488d0af2af11ab84f0d6c2d37 (diff)
downloadFreeBSD-src-7dad665664d82142d979dc0c80aa4d54a7bc2b56.zip
FreeBSD-src-7dad665664d82142d979dc0c80aa4d54a7bc2b56.tar.gz
Move atdevbase out of locore.s and into machdep.c
Macroize locore.s' page table setup even more, now it's almost readable. Rename PG_U to PG_A (so that I can...) Rename PG_u to PG_U. "PG_u" was just too ugly... Remove some unused vars in pmap.c Remove PG_KR and PG_KW Remove SSIZE Remove SINCR Remove BTOPKERNBASE This concludes my spring cleaning, modulus any bug fixes for messes I have made on the way. (Funny to be back here in pmap.c, that's where my first significant contribution to 386BSD was... :-)
-rw-r--r--sys/amd64/amd64/genassym.c3
-rw-r--r--sys/amd64/amd64/locore.S130
-rw-r--r--sys/amd64/amd64/locore.s130
-rw-r--r--sys/amd64/amd64/machdep.c7
-rw-r--r--sys/amd64/amd64/pmap.c39
-rw-r--r--sys/amd64/include/pmap.h58
-rw-r--r--sys/i386/i386/genassym.c3
-rw-r--r--sys/i386/i386/locore.s130
-rw-r--r--sys/i386/i386/machdep.c7
-rw-r--r--sys/i386/i386/pmap.c39
-rw-r--r--sys/i386/include/param.h23
-rw-r--r--sys/i386/include/pmap.h58
12 files changed, 284 insertions, 343 deletions
diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c
index 7f98c17..e9cda30 100644
--- a/sys/amd64/amd64/genassym.c
+++ b/sys/amd64/amd64/genassym.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
- * $Id: genassym.c,v 1.34 1996/04/13 11:22:57 bde Exp $
+ * $Id: genassym.c,v 1.35 1996/05/02 14:19:40 phk Exp $
*/
#include <stdio.h>
@@ -111,6 +111,7 @@ main()
printf("#define\tNKPDE %d\n", NKPDE);
printf("#define\tNKPT %d\n", NKPT);
printf("#define\tPAGE_SHIFT %d\n", PAGE_SHIFT);
+ printf("#define\tPAGE_MASK %d\n", PAGE_MASK);
printf("#define\tPDRSHIFT %d\n", PDRSHIFT);
printf("#define\tUSRSTACK 0x%lx\n", USRSTACK);
printf("#define\tVM_MAXUSER_ADDRESS 0x%lx\n", VM_MAXUSER_ADDRESS);
diff --git a/sys/amd64/amd64/locore.S b/sys/amd64/amd64/locore.S
index 0ea4875..de52777 100644
--- a/sys/amd64/amd64/locore.S
+++ b/sys/amd64/amd64/locore.S
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $Id: locore.s,v 1.68 1996/04/30 11:58:56 phk Exp $
+ * $Id: locore.s,v 1.69 1996/05/02 14:19:43 phk Exp $
*
* originally from: locore.s, by William F. Jolitz
*
@@ -104,7 +104,7 @@ tmpstk:
.globl _boothowto,_bootdev
- .globl _cpu,_atdevbase,_cpu_vendor,_cpu_id,_bootinfo
+ .globl _cpu,_cpu_vendor,_cpu_id,_bootinfo
.globl _cpu_high, _cpu_feature
_cpu: .long 0 /* are we 386, 386sx, or 486 */
@@ -113,7 +113,6 @@ _cpu_high: .long 0 /* highest arg to CPUID */
_cpu_feature: .long 0 /* features */
_cpu_vendor: .space 20 /* CPU origin code */
_bootinfo: .space BOOTINFO_SIZE /* bootinfo that we can handle */
-_atdevbase: .long 0 /* location of start of iomem in virtual */
_KERNend: .long 0 /* phys addr end of kernel (just after bss) */
physfree: .long 0 /* phys addr of next free page */
@@ -156,16 +155,32 @@ _bdb_exists: .long 0
/*
* fillkpt
- * eax = (page frame address | control | status) == pte
- * ebx = address of page table
+ * eax = page frame address
+ * ebx = index into page table
* ecx = how many pages to map
+ * base = base address of page dir/table
+ * prot = protection bits
*/
-#define fillkpt \
-1: movl %eax,(%ebx) ; \
- addl $PAGE_SIZE,%eax ; /* increment physical address */ \
- addl $4,%ebx ; /* next pte */ \
+#define fillkpt(base, prot) \
+ shll $2, %ebx ; \
+ addl base, %ebx ; \
+ orl $PG_V+prot, %eax ; \
+1: movl %eax,(%ebx) ; \
+ addl $PAGE_SIZE,%eax ; /* increment physical address */ \
+ addl $4,%ebx ; /* next pte */ \
loop 1b
+/*
+ * fillkptphys(prot)
+ * eax = physical address
+ * ecx = how many pages to map
+ * prot = protection bits
+ */
+#define fillkptphys(prot) \
+ movl %eax, %ebx ; \
+ shrl $PAGE_SHIFT, %ebx ; \
+ fillkpt(R(_KPTphys), prot)
+
.text
/**********************************************************************
*
@@ -688,8 +703,8 @@ create_pagetables:
over_symalloc:
#endif
- addl $PAGE_SIZE-1,%esi
- andl $~(PAGE_SIZE-1),%esi
+ addl $PAGE_MASK,%esi
+ andl $~PAGE_MASK,%esi
movl %esi,R(_KERNend) /* save end of kernel */
movl %esi,R(physfree) /* next free page is at end of kernel */
@@ -712,105 +727,74 @@ over_symalloc:
movl %esi,R(p0upt)
/* Map read-only from zero to the end of the kernel text section */
- movl R(_KPTphys), %esi
- movl $R(_etext),%ecx
- addl $PAGE_SIZE-1,%ecx
- shrl $PAGE_SHIFT,%ecx
- movl $PG_V|PG_KR,%eax
- movl %esi, %ebx
+ xorl %eax, %eax
#ifdef BDE_DEBUGGER
/* If the debugger is present, actually map everything read-write. */
cmpl $0,R(_bdb_exists)
jne map_read_write
#endif
- fillkpt
+ movl $R(_etext),%ecx
+ addl $PAGE_MASK,%ecx
+ shrl $PAGE_SHIFT,%ecx
+ fillkptphys(0)
/* Map read-write, data, bss and symbols */
+ movl $R(_etext),%eax
map_read_write:
- andl $PG_FRAME,%eax
movl R(_KERNend),%ecx
subl %eax,%ecx
shrl $PAGE_SHIFT,%ecx
- orl $PG_V|PG_KW,%eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map page directory. */
movl R(_IdlePTD), %eax
movl $1, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map proc0's page table for the UPAGES the physical way. */
movl R(p0upt), %eax
movl $1, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map proc0s UPAGES the physical way */
movl R(upa), %eax
movl $UPAGES, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
+
+/* Map ISA hole */
+ movl $ISA_HOLE_START, %eax
+ movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx
+ fillkptphys(PG_RW|PG_N)
-/* ... and in the special page table for this purpose. */
+/* Map proc0s UPAGES in the special page table for this purpose. */
movl R(upa), %eax
+ movl $KSTKPTEOFF, %ebx
movl $UPAGES, %ecx
- orl $PG_V|PG_KW, %eax
- movl R(p0upt), %ebx
- addl $(KSTKPTEOFF * PTESIZE), %ebx
- fillkpt
+ fillkpt(R(p0upt), PG_RW)
/* and put the page table in the pde. */
movl R(p0upt), %eax
- movl R(_IdlePTD), %esi
- orl $PG_V|PG_KW,%eax
- movl %eax,KSTKPTDI*PDESIZE(%esi)
-
-/* Map ISA hole */
-#define ISA_HOLE_START 0xa0000
-#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START)
- movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx
- movl $ISA_HOLE_START, %eax
- movl %eax, %ebx
-/* XXX 2 is magic for log2(PTESIZE). */
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
-/* XXX could load %eax directly with $ISA_HOLE_START|PG_V|PG_KW_PG_N. */
- orl $PG_V|PG_KW|PG_N, %eax
- fillkpt
-/* XXX could load %eax directly with $ISA_HOLE_START+KERNBASE. */
- movl $ISA_HOLE_START, %eax
- addl $KERNBASE, %eax
- movl %eax, R(_atdevbase)
+ movl $KSTKPTDI, %ebx
+ movl $1, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install a pde for temporary double map of bottom of VA */
- movl R(_IdlePTD), %esi
movl R(_KPTphys), %eax
- orl $PG_V|PG_KW, %eax
- movl %eax, (%esi)
+ xorl %ebx, %ebx
+ movl $1, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install pde's for pt's */
- movl R(_IdlePTD), %esi
movl R(_KPTphys), %eax
- orl $PG_V|PG_KW, %eax
- movl $(NKPT), %ecx
- lea (KPTDI*PDESIZE)(%esi), %ebx
- fillkpt
+ movl $KPTDI, %ebx
+ movl $NKPT, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install a pde recursively mapping page directory as a page table */
- movl R(_IdlePTD), %esi
- movl %esi,%eax
- orl $PG_V|PG_KW,%eax
- movl %eax,PTDPTDI*PDESIZE(%esi)
+ movl R(_IdlePTD), %eax
+ movl $PTDPTDI, %ebx
+ movl $1,%ecx
+ fillkpt(R(_IdlePTD), PG_RW)
ret
diff --git a/sys/amd64/amd64/locore.s b/sys/amd64/amd64/locore.s
index 0ea4875..de52777 100644
--- a/sys/amd64/amd64/locore.s
+++ b/sys/amd64/amd64/locore.s
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $Id: locore.s,v 1.68 1996/04/30 11:58:56 phk Exp $
+ * $Id: locore.s,v 1.69 1996/05/02 14:19:43 phk Exp $
*
* originally from: locore.s, by William F. Jolitz
*
@@ -104,7 +104,7 @@ tmpstk:
.globl _boothowto,_bootdev
- .globl _cpu,_atdevbase,_cpu_vendor,_cpu_id,_bootinfo
+ .globl _cpu,_cpu_vendor,_cpu_id,_bootinfo
.globl _cpu_high, _cpu_feature
_cpu: .long 0 /* are we 386, 386sx, or 486 */
@@ -113,7 +113,6 @@ _cpu_high: .long 0 /* highest arg to CPUID */
_cpu_feature: .long 0 /* features */
_cpu_vendor: .space 20 /* CPU origin code */
_bootinfo: .space BOOTINFO_SIZE /* bootinfo that we can handle */
-_atdevbase: .long 0 /* location of start of iomem in virtual */
_KERNend: .long 0 /* phys addr end of kernel (just after bss) */
physfree: .long 0 /* phys addr of next free page */
@@ -156,16 +155,32 @@ _bdb_exists: .long 0
/*
* fillkpt
- * eax = (page frame address | control | status) == pte
- * ebx = address of page table
+ * eax = page frame address
+ * ebx = index into page table
* ecx = how many pages to map
+ * base = base address of page dir/table
+ * prot = protection bits
*/
-#define fillkpt \
-1: movl %eax,(%ebx) ; \
- addl $PAGE_SIZE,%eax ; /* increment physical address */ \
- addl $4,%ebx ; /* next pte */ \
+#define fillkpt(base, prot) \
+ shll $2, %ebx ; \
+ addl base, %ebx ; \
+ orl $PG_V+prot, %eax ; \
+1: movl %eax,(%ebx) ; \
+ addl $PAGE_SIZE,%eax ; /* increment physical address */ \
+ addl $4,%ebx ; /* next pte */ \
loop 1b
+/*
+ * fillkptphys(prot)
+ * eax = physical address
+ * ecx = how many pages to map
+ * prot = protection bits
+ */
+#define fillkptphys(prot) \
+ movl %eax, %ebx ; \
+ shrl $PAGE_SHIFT, %ebx ; \
+ fillkpt(R(_KPTphys), prot)
+
.text
/**********************************************************************
*
@@ -688,8 +703,8 @@ create_pagetables:
over_symalloc:
#endif
- addl $PAGE_SIZE-1,%esi
- andl $~(PAGE_SIZE-1),%esi
+ addl $PAGE_MASK,%esi
+ andl $~PAGE_MASK,%esi
movl %esi,R(_KERNend) /* save end of kernel */
movl %esi,R(physfree) /* next free page is at end of kernel */
@@ -712,105 +727,74 @@ over_symalloc:
movl %esi,R(p0upt)
/* Map read-only from zero to the end of the kernel text section */
- movl R(_KPTphys), %esi
- movl $R(_etext),%ecx
- addl $PAGE_SIZE-1,%ecx
- shrl $PAGE_SHIFT,%ecx
- movl $PG_V|PG_KR,%eax
- movl %esi, %ebx
+ xorl %eax, %eax
#ifdef BDE_DEBUGGER
/* If the debugger is present, actually map everything read-write. */
cmpl $0,R(_bdb_exists)
jne map_read_write
#endif
- fillkpt
+ movl $R(_etext),%ecx
+ addl $PAGE_MASK,%ecx
+ shrl $PAGE_SHIFT,%ecx
+ fillkptphys(0)
/* Map read-write, data, bss and symbols */
+ movl $R(_etext),%eax
map_read_write:
- andl $PG_FRAME,%eax
movl R(_KERNend),%ecx
subl %eax,%ecx
shrl $PAGE_SHIFT,%ecx
- orl $PG_V|PG_KW,%eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map page directory. */
movl R(_IdlePTD), %eax
movl $1, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map proc0's page table for the UPAGES the physical way. */
movl R(p0upt), %eax
movl $1, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map proc0s UPAGES the physical way */
movl R(upa), %eax
movl $UPAGES, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
+
+/* Map ISA hole */
+ movl $ISA_HOLE_START, %eax
+ movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx
+ fillkptphys(PG_RW|PG_N)
-/* ... and in the special page table for this purpose. */
+/* Map proc0s UPAGES in the special page table for this purpose. */
movl R(upa), %eax
+ movl $KSTKPTEOFF, %ebx
movl $UPAGES, %ecx
- orl $PG_V|PG_KW, %eax
- movl R(p0upt), %ebx
- addl $(KSTKPTEOFF * PTESIZE), %ebx
- fillkpt
+ fillkpt(R(p0upt), PG_RW)
/* and put the page table in the pde. */
movl R(p0upt), %eax
- movl R(_IdlePTD), %esi
- orl $PG_V|PG_KW,%eax
- movl %eax,KSTKPTDI*PDESIZE(%esi)
-
-/* Map ISA hole */
-#define ISA_HOLE_START 0xa0000
-#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START)
- movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx
- movl $ISA_HOLE_START, %eax
- movl %eax, %ebx
-/* XXX 2 is magic for log2(PTESIZE). */
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
-/* XXX could load %eax directly with $ISA_HOLE_START|PG_V|PG_KW_PG_N. */
- orl $PG_V|PG_KW|PG_N, %eax
- fillkpt
-/* XXX could load %eax directly with $ISA_HOLE_START+KERNBASE. */
- movl $ISA_HOLE_START, %eax
- addl $KERNBASE, %eax
- movl %eax, R(_atdevbase)
+ movl $KSTKPTDI, %ebx
+ movl $1, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install a pde for temporary double map of bottom of VA */
- movl R(_IdlePTD), %esi
movl R(_KPTphys), %eax
- orl $PG_V|PG_KW, %eax
- movl %eax, (%esi)
+ xorl %ebx, %ebx
+ movl $1, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install pde's for pt's */
- movl R(_IdlePTD), %esi
movl R(_KPTphys), %eax
- orl $PG_V|PG_KW, %eax
- movl $(NKPT), %ecx
- lea (KPTDI*PDESIZE)(%esi), %ebx
- fillkpt
+ movl $KPTDI, %ebx
+ movl $NKPT, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install a pde recursively mapping page directory as a page table */
- movl R(_IdlePTD), %esi
- movl %esi,%eax
- orl $PG_V|PG_KW,%eax
- movl %eax,PTDPTDI*PDESIZE(%esi)
+ movl R(_IdlePTD), %eax
+ movl $PTDPTDI, %ebx
+ movl $1,%ecx
+ fillkpt(R(_IdlePTD), PG_RW)
ret
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 5298dc2..bb2698f 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
- * $Id: machdep.c,v 1.186 1996/05/01 08:38:36 bde Exp $
+ * $Id: machdep.c,v 1.187 1996/05/02 14:19:47 phk Exp $
*/
#include "npx.h"
@@ -168,6 +168,7 @@ int bouncepages = 0;
extern int freebufspace;
int msgbufmapped = 0; /* set when safe to use msgbuf */
int _udatasel, _ucodesel;
+u_int atdevbase;
int physmem = 0;
@@ -1313,6 +1314,8 @@ init386(first)
proc0.p_addr = proc0paddr;
+ atdevbase = ISA_HOLE_START + KERNBASE;
+
/*
* Initialize the console before we print anything out.
*/
@@ -1498,7 +1501,7 @@ init386(first)
/*
* map page into kernel: valid, read/write, non-cacheable
*/
- *(int *)CMAP1 = PG_V | PG_KW | PG_N | target_page;
+ *(int *)CMAP1 = PG_V | PG_RW | PG_N | target_page;
pmap_update();
tmp = *(int *)CADDR1;
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index a82269c..a7d6f6b 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.86 1996/04/22 05:23:08 dyson Exp $
+ * $Id: pmap.c,v 1.87 1996/05/02 14:19:52 phk Exp $
*/
/*
@@ -121,7 +121,7 @@ static void init_pv_entries __P((int));
#define pmap_pde_v(pte) ((*(int *)pte & PG_V) != 0)
#define pmap_pte_w(pte) ((*(int *)pte & PG_W) != 0)
#define pmap_pte_m(pte) ((*(int *)pte & PG_M) != 0)
-#define pmap_pte_u(pte) ((*(int *)pte & PG_U) != 0)
+#define pmap_pte_u(pte) ((*(int *)pte & PG_A) != 0)
#define pmap_pte_v(pte) ((*(int *)pte & PG_V) != 0)
#define pmap_pte_set_w(pte, v) ((v)?(*(int *)pte |= PG_W):(*(int *)pte &= ~PG_W))
@@ -177,8 +177,6 @@ static __inline void pmap_remove_entry __P((struct pmap *pmap, pv_entry_t pv,
vm_offset_t va));
static void pmap_remove_pte __P((struct pmap *pmap, pt_entry_t *ptq,
vm_offset_t sva));
-static vm_page_t
- pmap_pte_vm_page __P((pmap_t pmap, vm_offset_t pt));
static boolean_t
pmap_testbit __P((vm_offset_t pa, int bit));
static void * pmap_getpdir __P((void));
@@ -608,7 +606,7 @@ pmap_pinit(pmap)
/* install self-referential address mapping entry */
*(int *) (pmap->pm_pdir + PTDPTDI) =
- ((int) pmap_kextract((vm_offset_t) pmap->pm_pdir)) | PG_V | PG_KW;
+ ((int) pmap_kextract((vm_offset_t) pmap->pm_pdir)) | PG_V | PG_RW;
pmap->pm_count = 1;
}
@@ -651,7 +649,7 @@ pmap_growkernel(vm_offset_t addr)
vm_page_remove(nkpg);
pmap_zero_page(VM_PAGE_TO_PHYS(nkpg));
}
- pdir_pde(PTD, kernel_vm_end) = (pd_entry_t) (VM_PAGE_TO_PHYS(nkpg) | PG_V | PG_KW);
+ pdir_pde(PTD, kernel_vm_end) = (pd_entry_t) (VM_PAGE_TO_PHYS(nkpg) | PG_V | PG_RW);
nkpg = NULL;
for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) {
@@ -986,7 +984,6 @@ pmap_remove(pmap, sva, eva)
register vm_offset_t eva;
{
register pt_entry_t *ptbase;
- vm_offset_t va;
vm_offset_t pdnxt;
vm_offset_t ptpaddr;
vm_offset_t sindex, eindex;
@@ -1161,7 +1158,6 @@ pmap_protect(pmap, sva, eva, prot)
vm_prot_t prot;
{
register pt_entry_t *pte;
- register vm_offset_t va;
register pt_entry_t *ptbase;
vm_offset_t pdnxt;
vm_offset_t ptpaddr;
@@ -1188,7 +1184,6 @@ pmap_protect(pmap, sva, eva, prot)
eindex = i386_btop(eva);
for (; sindex < eindex; sindex = pdnxt) {
- int pprot;
int pbits;
pdnxt = ((sindex + NPTEPG) & ~(NPTEPG - 1));
@@ -1254,7 +1249,6 @@ pmap_enter(pmap, va, pa, prot, wired)
register pt_entry_t *pte;
vm_offset_t opa;
register pv_entry_t pv, npv;
- int ptevalid;
vm_offset_t origpte, newpte;
if (pmap == NULL)
@@ -1389,15 +1383,15 @@ validate:
if (wired)
newpte |= PG_W;
if (va < UPT_MIN_ADDRESS)
- newpte |= PG_u;
+ newpte |= PG_U;
else if (va < UPT_MAX_ADDRESS)
- newpte |= PG_u | PG_RW;
+ newpte |= PG_U | PG_RW;
/*
* if the mapping or permission bits are different, we need
* to update the pte.
*/
- if ((origpte & ~(PG_M|PG_U)) != newpte) {
+ if ((origpte & ~(PG_M|PG_A)) != newpte) {
*pte = (pt_entry_t) newpte;
if (origpte)
pmap_update_1pg(va);
@@ -1426,7 +1420,6 @@ pmap_qenter(va, m, count)
int count;
{
int i;
- int anyvalid = 0;
register pt_entry_t *pte;
for (i = 0; i < count; i++) {
@@ -1559,7 +1552,7 @@ pmap_enter_quick(pmap, va, pa)
/*
* Now validate mapping with RO protection
*/
- *pte = (pt_entry_t) ((int) (pa | PG_V | PG_u));
+ *pte = (pt_entry_t) ((int) (pa | PG_V | PG_U));
return;
}
@@ -1678,7 +1671,6 @@ pmap_prefault(pmap, addra, entry, object)
vm_offset_t addr;
vm_pindex_t pindex;
vm_page_t m;
- int pageorder_index;
if (entry->object.vm_object != object)
return;
@@ -1815,7 +1807,7 @@ pmap_zero_page(phys)
if (*(int *) CMAP2)
panic("pmap_zero_page: CMAP busy");
- *(int *) CMAP2 = PG_V | PG_KW | (phys & PG_FRAME);
+ *(int *) CMAP2 = PG_V | PG_RW | (phys & PG_FRAME);
bzero(CADDR2, PAGE_SIZE);
*(int *) CMAP2 = 0;
@@ -1836,8 +1828,8 @@ pmap_copy_page(src, dst)
if (*(int *) CMAP1 || *(int *) CMAP2)
panic("pmap_copy_page: CMAP busy");
- *(int *) CMAP1 = PG_V | PG_KW | (src & PG_FRAME);
- *(int *) CMAP2 = PG_V | PG_KW | (dst & PG_FRAME);
+ *(int *) CMAP1 = PG_V | PG_RW | (src & PG_FRAME);
+ *(int *) CMAP2 = PG_V | PG_RW | (dst & PG_FRAME);
#if __GNUC__ > 1
memcpy(CADDR2, CADDR1, PAGE_SIZE);
@@ -1935,7 +1927,7 @@ pmap_testbit(pa, bit)
* mark UPAGES as always modified, and ptes as never
* modified.
*/
- if (bit & (PG_U|PG_M)) {
+ if (bit & (PG_A|PG_M)) {
if ((pv->pv_va >= clean_sva) && (pv->pv_va < clean_eva)) {
continue;
}
@@ -1967,9 +1959,8 @@ pmap_changebit(pa, bit, setem)
boolean_t setem;
{
register pv_entry_t pv;
- register pt_entry_t *pte, npte;
+ register pt_entry_t *pte;
vm_offset_t va;
- int changed;
int s;
if (!pmap_is_managed(pa))
@@ -2057,7 +2048,7 @@ pmap_phys_address(ppn)
boolean_t
pmap_is_referenced(vm_offset_t pa)
{
- return pmap_testbit((pa), PG_U);
+ return pmap_testbit((pa), PG_A);
}
/*
@@ -2089,7 +2080,7 @@ pmap_clear_modify(vm_offset_t pa)
void
pmap_clear_reference(vm_offset_t pa)
{
- pmap_changebit((pa), PG_U, FALSE);
+ pmap_changebit((pa), PG_A, FALSE);
}
/*
diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h
index 73798ad..a843fbf 100644
--- a/sys/amd64/include/pmap.h
+++ b/sys/amd64/include/pmap.h
@@ -42,28 +42,36 @@
*
* from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
* from: @(#)pmap.h 7.4 (Berkeley) 5/12/91
- * $Id: pmap.h,v 1.36 1996/04/30 12:02:11 phk Exp $
+ * $Id: pmap.h,v 1.37 1996/05/02 14:20:04 phk Exp $
*/
#ifndef _MACHINE_PMAP_H_
#define _MACHINE_PMAP_H_
-#define PG_V 0x00000001
-#define PG_RW 0x00000002
-#define PG_u 0x00000004
-#define PG_PROT 0x00000006 /* all protection bits . */
-#define PG_NC_PWT 0x00000008 /* page cache write through */
-#define PG_NC_PCD 0x00000010 /* page cache disable */
-#define PG_N 0x00000018 /* Non-cacheable */
-#define PG_U 0x00000020 /* page was accessed */
-#define PG_M 0x00000040 /* page was modified */
-#define PG_PS 0x00000080 /* page is big size */
-#define PG_G 0x00000100 /* page is global */
-#define PG_W 0x00000200 /* "Wired" pseudoflag */
-#define PG_FRAME 0xfffff000
-
-#define PG_KR 0x00000000
-#define PG_KW 0x00000002
+/*
+ * Page-directory and page-table entires follow this format, with a few
+ * of the fields not present here and there, depending on a lot of things.
+ */
+ /* ---- Intel Nomenclature ---- */
+#define PG_V 0x001 /* P Valid */
+#define PG_RW 0x002 /* R/W Read/Write */
+#define PG_U 0x004 /* U/S User/Supervisor */
+#define PG_NC_PWT 0x008 /* PWT Write through */
+#define PG_NC_PCD 0x010 /* PCD Cache disable */
+#define PG_A 0x020 /* A Accessed */
+#define PG_M 0x040 /* D Dirty */
+#define PG_PS 0x080 /* PS Page size (0=4k,1=4M) */
+#define PG_G 0x100 /* G Global */
+#define PG_AVAIL1 0x200 /* / Available for system */
+#define PG_AVAIL2 0x400 /* < programmers use */
+#define PG_AVAIL3 0x800 /* \ */
+
+
+/* Our various interpretations of the above */
+#define PG_W PG_AVAIL1 /* "Wired" pseudoflag */
+#define PG_FRAME (~PAGE_MASK)
+#define PG_PROT (PG_RW|PG_U) /* all protection bits . */
+#define PG_N (PG_NC_PWT|PG_NC_PCD) /* Non-cacheable */
/*
* Page Protection Exception bits
@@ -78,14 +86,6 @@
*/
#define VADDR(pdi, pti) ((vm_offset_t)(((pdi)<<PDRSHIFT)|((pti)<<PAGE_SHIFT)))
-/*
- * NKPDE controls the virtual space of the kernel, what ever is left, minus
- * the alternate page table area is given to the user (NUPDE)
- */
-/*
- * NKPDE controls the virtual space of the kernel, what ever is left is
- * given to the user (NUPDE)
- */
#ifndef NKPT
#if 0
#define NKPT 26 /* actual number of kernel page tables */
@@ -109,6 +109,12 @@
#define KSTKPTDI (PTDPTDI-1) /* ptd entry for u./kernel&user stack */
#define KSTKPTEOFF (NPTEPG-UPAGES) /* pte entry for kernel stack */
+/*
+ * XXX doesn't really belong here I guess...
+ */
+#define ISA_HOLE_START 0xa0000
+#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START)
+
#ifndef LOCORE
typedef unsigned int *pd_entry_t;
typedef unsigned int *pt_entry_t;
@@ -151,7 +157,7 @@ static __inline vm_offset_t
pmap_kextract(vm_offset_t va)
{
vm_offset_t pa = *(int *)vtopte(va);
- pa = (pa & PG_FRAME) | (va & ~PG_FRAME);
+ pa = (pa & PG_FRAME) | (va & PAGE_MASK);
return pa;
}
#endif
diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c
index 7f98c17..e9cda30 100644
--- a/sys/i386/i386/genassym.c
+++ b/sys/i386/i386/genassym.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
- * $Id: genassym.c,v 1.34 1996/04/13 11:22:57 bde Exp $
+ * $Id: genassym.c,v 1.35 1996/05/02 14:19:40 phk Exp $
*/
#include <stdio.h>
@@ -111,6 +111,7 @@ main()
printf("#define\tNKPDE %d\n", NKPDE);
printf("#define\tNKPT %d\n", NKPT);
printf("#define\tPAGE_SHIFT %d\n", PAGE_SHIFT);
+ printf("#define\tPAGE_MASK %d\n", PAGE_MASK);
printf("#define\tPDRSHIFT %d\n", PDRSHIFT);
printf("#define\tUSRSTACK 0x%lx\n", USRSTACK);
printf("#define\tVM_MAXUSER_ADDRESS 0x%lx\n", VM_MAXUSER_ADDRESS);
diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s
index 0ea4875..de52777 100644
--- a/sys/i386/i386/locore.s
+++ b/sys/i386/i386/locore.s
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $Id: locore.s,v 1.68 1996/04/30 11:58:56 phk Exp $
+ * $Id: locore.s,v 1.69 1996/05/02 14:19:43 phk Exp $
*
* originally from: locore.s, by William F. Jolitz
*
@@ -104,7 +104,7 @@ tmpstk:
.globl _boothowto,_bootdev
- .globl _cpu,_atdevbase,_cpu_vendor,_cpu_id,_bootinfo
+ .globl _cpu,_cpu_vendor,_cpu_id,_bootinfo
.globl _cpu_high, _cpu_feature
_cpu: .long 0 /* are we 386, 386sx, or 486 */
@@ -113,7 +113,6 @@ _cpu_high: .long 0 /* highest arg to CPUID */
_cpu_feature: .long 0 /* features */
_cpu_vendor: .space 20 /* CPU origin code */
_bootinfo: .space BOOTINFO_SIZE /* bootinfo that we can handle */
-_atdevbase: .long 0 /* location of start of iomem in virtual */
_KERNend: .long 0 /* phys addr end of kernel (just after bss) */
physfree: .long 0 /* phys addr of next free page */
@@ -156,16 +155,32 @@ _bdb_exists: .long 0
/*
* fillkpt
- * eax = (page frame address | control | status) == pte
- * ebx = address of page table
+ * eax = page frame address
+ * ebx = index into page table
* ecx = how many pages to map
+ * base = base address of page dir/table
+ * prot = protection bits
*/
-#define fillkpt \
-1: movl %eax,(%ebx) ; \
- addl $PAGE_SIZE,%eax ; /* increment physical address */ \
- addl $4,%ebx ; /* next pte */ \
+#define fillkpt(base, prot) \
+ shll $2, %ebx ; \
+ addl base, %ebx ; \
+ orl $PG_V+prot, %eax ; \
+1: movl %eax,(%ebx) ; \
+ addl $PAGE_SIZE,%eax ; /* increment physical address */ \
+ addl $4,%ebx ; /* next pte */ \
loop 1b
+/*
+ * fillkptphys(prot)
+ * eax = physical address
+ * ecx = how many pages to map
+ * prot = protection bits
+ */
+#define fillkptphys(prot) \
+ movl %eax, %ebx ; \
+ shrl $PAGE_SHIFT, %ebx ; \
+ fillkpt(R(_KPTphys), prot)
+
.text
/**********************************************************************
*
@@ -688,8 +703,8 @@ create_pagetables:
over_symalloc:
#endif
- addl $PAGE_SIZE-1,%esi
- andl $~(PAGE_SIZE-1),%esi
+ addl $PAGE_MASK,%esi
+ andl $~PAGE_MASK,%esi
movl %esi,R(_KERNend) /* save end of kernel */
movl %esi,R(physfree) /* next free page is at end of kernel */
@@ -712,105 +727,74 @@ over_symalloc:
movl %esi,R(p0upt)
/* Map read-only from zero to the end of the kernel text section */
- movl R(_KPTphys), %esi
- movl $R(_etext),%ecx
- addl $PAGE_SIZE-1,%ecx
- shrl $PAGE_SHIFT,%ecx
- movl $PG_V|PG_KR,%eax
- movl %esi, %ebx
+ xorl %eax, %eax
#ifdef BDE_DEBUGGER
/* If the debugger is present, actually map everything read-write. */
cmpl $0,R(_bdb_exists)
jne map_read_write
#endif
- fillkpt
+ movl $R(_etext),%ecx
+ addl $PAGE_MASK,%ecx
+ shrl $PAGE_SHIFT,%ecx
+ fillkptphys(0)
/* Map read-write, data, bss and symbols */
+ movl $R(_etext),%eax
map_read_write:
- andl $PG_FRAME,%eax
movl R(_KERNend),%ecx
subl %eax,%ecx
shrl $PAGE_SHIFT,%ecx
- orl $PG_V|PG_KW,%eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map page directory. */
movl R(_IdlePTD), %eax
movl $1, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map proc0's page table for the UPAGES the physical way. */
movl R(p0upt), %eax
movl $1, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
/* Map proc0s UPAGES the physical way */
movl R(upa), %eax
movl $UPAGES, %ecx
- movl %eax, %ebx
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
- orl $PG_V|PG_KW, %eax
- fillkpt
+ fillkptphys(PG_RW)
+
+/* Map ISA hole */
+ movl $ISA_HOLE_START, %eax
+ movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx
+ fillkptphys(PG_RW|PG_N)
-/* ... and in the special page table for this purpose. */
+/* Map proc0s UPAGES in the special page table for this purpose. */
movl R(upa), %eax
+ movl $KSTKPTEOFF, %ebx
movl $UPAGES, %ecx
- orl $PG_V|PG_KW, %eax
- movl R(p0upt), %ebx
- addl $(KSTKPTEOFF * PTESIZE), %ebx
- fillkpt
+ fillkpt(R(p0upt), PG_RW)
/* and put the page table in the pde. */
movl R(p0upt), %eax
- movl R(_IdlePTD), %esi
- orl $PG_V|PG_KW,%eax
- movl %eax,KSTKPTDI*PDESIZE(%esi)
-
-/* Map ISA hole */
-#define ISA_HOLE_START 0xa0000
-#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START)
- movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx
- movl $ISA_HOLE_START, %eax
- movl %eax, %ebx
-/* XXX 2 is magic for log2(PTESIZE). */
- shrl $PAGE_SHIFT-2, %ebx
- addl R(_KPTphys), %ebx
-/* XXX could load %eax directly with $ISA_HOLE_START|PG_V|PG_KW_PG_N. */
- orl $PG_V|PG_KW|PG_N, %eax
- fillkpt
-/* XXX could load %eax directly with $ISA_HOLE_START+KERNBASE. */
- movl $ISA_HOLE_START, %eax
- addl $KERNBASE, %eax
- movl %eax, R(_atdevbase)
+ movl $KSTKPTDI, %ebx
+ movl $1, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install a pde for temporary double map of bottom of VA */
- movl R(_IdlePTD), %esi
movl R(_KPTphys), %eax
- orl $PG_V|PG_KW, %eax
- movl %eax, (%esi)
+ xorl %ebx, %ebx
+ movl $1, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install pde's for pt's */
- movl R(_IdlePTD), %esi
movl R(_KPTphys), %eax
- orl $PG_V|PG_KW, %eax
- movl $(NKPT), %ecx
- lea (KPTDI*PDESIZE)(%esi), %ebx
- fillkpt
+ movl $KPTDI, %ebx
+ movl $NKPT, %ecx
+ fillkpt(R(_IdlePTD), PG_RW)
/* install a pde recursively mapping page directory as a page table */
- movl R(_IdlePTD), %esi
- movl %esi,%eax
- orl $PG_V|PG_KW,%eax
- movl %eax,PTDPTDI*PDESIZE(%esi)
+ movl R(_IdlePTD), %eax
+ movl $PTDPTDI, %ebx
+ movl $1,%ecx
+ fillkpt(R(_IdlePTD), PG_RW)
ret
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 5298dc2..bb2698f 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
- * $Id: machdep.c,v 1.186 1996/05/01 08:38:36 bde Exp $
+ * $Id: machdep.c,v 1.187 1996/05/02 14:19:47 phk Exp $
*/
#include "npx.h"
@@ -168,6 +168,7 @@ int bouncepages = 0;
extern int freebufspace;
int msgbufmapped = 0; /* set when safe to use msgbuf */
int _udatasel, _ucodesel;
+u_int atdevbase;
int physmem = 0;
@@ -1313,6 +1314,8 @@ init386(first)
proc0.p_addr = proc0paddr;
+ atdevbase = ISA_HOLE_START + KERNBASE;
+
/*
* Initialize the console before we print anything out.
*/
@@ -1498,7 +1501,7 @@ init386(first)
/*
* map page into kernel: valid, read/write, non-cacheable
*/
- *(int *)CMAP1 = PG_V | PG_KW | PG_N | target_page;
+ *(int *)CMAP1 = PG_V | PG_RW | PG_N | target_page;
pmap_update();
tmp = *(int *)CADDR1;
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index a82269c..a7d6f6b 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.86 1996/04/22 05:23:08 dyson Exp $
+ * $Id: pmap.c,v 1.87 1996/05/02 14:19:52 phk Exp $
*/
/*
@@ -121,7 +121,7 @@ static void init_pv_entries __P((int));
#define pmap_pde_v(pte) ((*(int *)pte & PG_V) != 0)
#define pmap_pte_w(pte) ((*(int *)pte & PG_W) != 0)
#define pmap_pte_m(pte) ((*(int *)pte & PG_M) != 0)
-#define pmap_pte_u(pte) ((*(int *)pte & PG_U) != 0)
+#define pmap_pte_u(pte) ((*(int *)pte & PG_A) != 0)
#define pmap_pte_v(pte) ((*(int *)pte & PG_V) != 0)
#define pmap_pte_set_w(pte, v) ((v)?(*(int *)pte |= PG_W):(*(int *)pte &= ~PG_W))
@@ -177,8 +177,6 @@ static __inline void pmap_remove_entry __P((struct pmap *pmap, pv_entry_t pv,
vm_offset_t va));
static void pmap_remove_pte __P((struct pmap *pmap, pt_entry_t *ptq,
vm_offset_t sva));
-static vm_page_t
- pmap_pte_vm_page __P((pmap_t pmap, vm_offset_t pt));
static boolean_t
pmap_testbit __P((vm_offset_t pa, int bit));
static void * pmap_getpdir __P((void));
@@ -608,7 +606,7 @@ pmap_pinit(pmap)
/* install self-referential address mapping entry */
*(int *) (pmap->pm_pdir + PTDPTDI) =
- ((int) pmap_kextract((vm_offset_t) pmap->pm_pdir)) | PG_V | PG_KW;
+ ((int) pmap_kextract((vm_offset_t) pmap->pm_pdir)) | PG_V | PG_RW;
pmap->pm_count = 1;
}
@@ -651,7 +649,7 @@ pmap_growkernel(vm_offset_t addr)
vm_page_remove(nkpg);
pmap_zero_page(VM_PAGE_TO_PHYS(nkpg));
}
- pdir_pde(PTD, kernel_vm_end) = (pd_entry_t) (VM_PAGE_TO_PHYS(nkpg) | PG_V | PG_KW);
+ pdir_pde(PTD, kernel_vm_end) = (pd_entry_t) (VM_PAGE_TO_PHYS(nkpg) | PG_V | PG_RW);
nkpg = NULL;
for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) {
@@ -986,7 +984,6 @@ pmap_remove(pmap, sva, eva)
register vm_offset_t eva;
{
register pt_entry_t *ptbase;
- vm_offset_t va;
vm_offset_t pdnxt;
vm_offset_t ptpaddr;
vm_offset_t sindex, eindex;
@@ -1161,7 +1158,6 @@ pmap_protect(pmap, sva, eva, prot)
vm_prot_t prot;
{
register pt_entry_t *pte;
- register vm_offset_t va;
register pt_entry_t *ptbase;
vm_offset_t pdnxt;
vm_offset_t ptpaddr;
@@ -1188,7 +1184,6 @@ pmap_protect(pmap, sva, eva, prot)
eindex = i386_btop(eva);
for (; sindex < eindex; sindex = pdnxt) {
- int pprot;
int pbits;
pdnxt = ((sindex + NPTEPG) & ~(NPTEPG - 1));
@@ -1254,7 +1249,6 @@ pmap_enter(pmap, va, pa, prot, wired)
register pt_entry_t *pte;
vm_offset_t opa;
register pv_entry_t pv, npv;
- int ptevalid;
vm_offset_t origpte, newpte;
if (pmap == NULL)
@@ -1389,15 +1383,15 @@ validate:
if (wired)
newpte |= PG_W;
if (va < UPT_MIN_ADDRESS)
- newpte |= PG_u;
+ newpte |= PG_U;
else if (va < UPT_MAX_ADDRESS)
- newpte |= PG_u | PG_RW;
+ newpte |= PG_U | PG_RW;
/*
* if the mapping or permission bits are different, we need
* to update the pte.
*/
- if ((origpte & ~(PG_M|PG_U)) != newpte) {
+ if ((origpte & ~(PG_M|PG_A)) != newpte) {
*pte = (pt_entry_t) newpte;
if (origpte)
pmap_update_1pg(va);
@@ -1426,7 +1420,6 @@ pmap_qenter(va, m, count)
int count;
{
int i;
- int anyvalid = 0;
register pt_entry_t *pte;
for (i = 0; i < count; i++) {
@@ -1559,7 +1552,7 @@ pmap_enter_quick(pmap, va, pa)
/*
* Now validate mapping with RO protection
*/
- *pte = (pt_entry_t) ((int) (pa | PG_V | PG_u));
+ *pte = (pt_entry_t) ((int) (pa | PG_V | PG_U));
return;
}
@@ -1678,7 +1671,6 @@ pmap_prefault(pmap, addra, entry, object)
vm_offset_t addr;
vm_pindex_t pindex;
vm_page_t m;
- int pageorder_index;
if (entry->object.vm_object != object)
return;
@@ -1815,7 +1807,7 @@ pmap_zero_page(phys)
if (*(int *) CMAP2)
panic("pmap_zero_page: CMAP busy");
- *(int *) CMAP2 = PG_V | PG_KW | (phys & PG_FRAME);
+ *(int *) CMAP2 = PG_V | PG_RW | (phys & PG_FRAME);
bzero(CADDR2, PAGE_SIZE);
*(int *) CMAP2 = 0;
@@ -1836,8 +1828,8 @@ pmap_copy_page(src, dst)
if (*(int *) CMAP1 || *(int *) CMAP2)
panic("pmap_copy_page: CMAP busy");
- *(int *) CMAP1 = PG_V | PG_KW | (src & PG_FRAME);
- *(int *) CMAP2 = PG_V | PG_KW | (dst & PG_FRAME);
+ *(int *) CMAP1 = PG_V | PG_RW | (src & PG_FRAME);
+ *(int *) CMAP2 = PG_V | PG_RW | (dst & PG_FRAME);
#if __GNUC__ > 1
memcpy(CADDR2, CADDR1, PAGE_SIZE);
@@ -1935,7 +1927,7 @@ pmap_testbit(pa, bit)
* mark UPAGES as always modified, and ptes as never
* modified.
*/
- if (bit & (PG_U|PG_M)) {
+ if (bit & (PG_A|PG_M)) {
if ((pv->pv_va >= clean_sva) && (pv->pv_va < clean_eva)) {
continue;
}
@@ -1967,9 +1959,8 @@ pmap_changebit(pa, bit, setem)
boolean_t setem;
{
register pv_entry_t pv;
- register pt_entry_t *pte, npte;
+ register pt_entry_t *pte;
vm_offset_t va;
- int changed;
int s;
if (!pmap_is_managed(pa))
@@ -2057,7 +2048,7 @@ pmap_phys_address(ppn)
boolean_t
pmap_is_referenced(vm_offset_t pa)
{
- return pmap_testbit((pa), PG_U);
+ return pmap_testbit((pa), PG_A);
}
/*
@@ -2089,7 +2080,7 @@ pmap_clear_modify(vm_offset_t pa)
void
pmap_clear_reference(vm_offset_t pa)
{
- pmap_changebit((pa), PG_U, FALSE);
+ pmap_changebit((pa), PG_A, FALSE);
}
/*
diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h
index 1296e1b..485b710 100644
--- a/sys/i386/include/param.h
+++ b/sys/i386/include/param.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)param.h 5.8 (Berkeley) 6/28/91
- * $Id: param.h,v 1.19 1995/05/25 07:41:27 davidg Exp $
+ * $Id: param.h,v 1.20 1996/05/02 14:20:02 phk Exp $
*/
#ifndef _MACHINE_PARAM_H_
@@ -56,33 +56,20 @@
#define ALIGN(p) (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES)
#define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */
-#define PAGE_SIZE (1 << PAGE_SHIFT) /* bytes/page */
+#define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */
#define PAGE_MASK (PAGE_SIZE-1)
#define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t)))
-#define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t)))
-/* XXX PDRSHIFT and PD_SHIFT are two names for the same thing */
+#define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t)))
#define PDRSHIFT 22 /* LOG2(NBPDR) */
-#define NBPDR (1 << PDRSHIFT) /* bytes/page dir */
-#define PDROFSET (NBPDR-1) /* byte offset into page dir */
-
-/*
- * XXX This should really be KPTDPTDI << PDRSHIFT, but since KPTDPTDI is
- * defined in pmap.h which is included after this we can't do that
- * (YET!)
- */
-#define BTOPKERNBASE (KERNBASE >> PAGE_SHIFT)
+#define NBPDR (1<<PDRSHIFT) /* bytes/page dir */
#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */
-#define DEV_BSIZE (1 << DEV_BSHIFT)
+#define DEV_BSIZE (1<<DEV_BSHIFT)
#define BLKDEV_IOSIZE 2048
#define MAXPHYS (64 * 1024) /* max raw I/O transfer size */
-/* NOTE: SSIZE, SINCR and UPAGES must be multiples of CLSIZE */
-#define SSIZE 1 /* initial stack size/PAGE_SIZE */
-#define SINCR 1 /* increment of stack/PAGE_SIZE */
-
#define UPAGES 2 /* pages of u-area */
/*
diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h
index 73798ad..a843fbf 100644
--- a/sys/i386/include/pmap.h
+++ b/sys/i386/include/pmap.h
@@ -42,28 +42,36 @@
*
* from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
* from: @(#)pmap.h 7.4 (Berkeley) 5/12/91
- * $Id: pmap.h,v 1.36 1996/04/30 12:02:11 phk Exp $
+ * $Id: pmap.h,v 1.37 1996/05/02 14:20:04 phk Exp $
*/
#ifndef _MACHINE_PMAP_H_
#define _MACHINE_PMAP_H_
-#define PG_V 0x00000001
-#define PG_RW 0x00000002
-#define PG_u 0x00000004
-#define PG_PROT 0x00000006 /* all protection bits . */
-#define PG_NC_PWT 0x00000008 /* page cache write through */
-#define PG_NC_PCD 0x00000010 /* page cache disable */
-#define PG_N 0x00000018 /* Non-cacheable */
-#define PG_U 0x00000020 /* page was accessed */
-#define PG_M 0x00000040 /* page was modified */
-#define PG_PS 0x00000080 /* page is big size */
-#define PG_G 0x00000100 /* page is global */
-#define PG_W 0x00000200 /* "Wired" pseudoflag */
-#define PG_FRAME 0xfffff000
-
-#define PG_KR 0x00000000
-#define PG_KW 0x00000002
+/*
+ * Page-directory and page-table entires follow this format, with a few
+ * of the fields not present here and there, depending on a lot of things.
+ */
+ /* ---- Intel Nomenclature ---- */
+#define PG_V 0x001 /* P Valid */
+#define PG_RW 0x002 /* R/W Read/Write */
+#define PG_U 0x004 /* U/S User/Supervisor */
+#define PG_NC_PWT 0x008 /* PWT Write through */
+#define PG_NC_PCD 0x010 /* PCD Cache disable */
+#define PG_A 0x020 /* A Accessed */
+#define PG_M 0x040 /* D Dirty */
+#define PG_PS 0x080 /* PS Page size (0=4k,1=4M) */
+#define PG_G 0x100 /* G Global */
+#define PG_AVAIL1 0x200 /* / Available for system */
+#define PG_AVAIL2 0x400 /* < programmers use */
+#define PG_AVAIL3 0x800 /* \ */
+
+
+/* Our various interpretations of the above */
+#define PG_W PG_AVAIL1 /* "Wired" pseudoflag */
+#define PG_FRAME (~PAGE_MASK)
+#define PG_PROT (PG_RW|PG_U) /* all protection bits . */
+#define PG_N (PG_NC_PWT|PG_NC_PCD) /* Non-cacheable */
/*
* Page Protection Exception bits
@@ -78,14 +86,6 @@
*/
#define VADDR(pdi, pti) ((vm_offset_t)(((pdi)<<PDRSHIFT)|((pti)<<PAGE_SHIFT)))
-/*
- * NKPDE controls the virtual space of the kernel, what ever is left, minus
- * the alternate page table area is given to the user (NUPDE)
- */
-/*
- * NKPDE controls the virtual space of the kernel, what ever is left is
- * given to the user (NUPDE)
- */
#ifndef NKPT
#if 0
#define NKPT 26 /* actual number of kernel page tables */
@@ -109,6 +109,12 @@
#define KSTKPTDI (PTDPTDI-1) /* ptd entry for u./kernel&user stack */
#define KSTKPTEOFF (NPTEPG-UPAGES) /* pte entry for kernel stack */
+/*
+ * XXX doesn't really belong here I guess...
+ */
+#define ISA_HOLE_START 0xa0000
+#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START)
+
#ifndef LOCORE
typedef unsigned int *pd_entry_t;
typedef unsigned int *pt_entry_t;
@@ -151,7 +157,7 @@ static __inline vm_offset_t
pmap_kextract(vm_offset_t va)
{
vm_offset_t pa = *(int *)vtopte(va);
- pa = (pa & PG_FRAME) | (va & ~PG_FRAME);
+ pa = (pa & PG_FRAME) | (va & PAGE_MASK);
return pa;
}
#endif
OpenPOWER on IntegriCloud