summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--i386/i386/i386asm.sym2
-rw-r--r--i386/i386/locore.S6
-rw-r--r--i386/intel/pmap.c8
4 files changed, 12 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 6cb1052..98d2db1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,9 +2,10 @@
[task #8135 --- ``PAE for GNU Mach']
* i386/configfrag.ac: Add --enable-pae option, which defines PAE.
- * i386/i386/i386asm.sym (PDPSHIFT, PDEMASK): New assembly macros.
+ * i386/i386/i386asm.sym (PDPSHIFT, PDEMASK, PTE_SIZE): New assembly
+ macros.
* i386/i386/locore.S [PAE] (copyout_retry): Use page directory pointer
- bits.
+ bits, take PTE_SIZE into account.
* i386/i386at/model_dep.c [PAE] (i386at_init): Set second initial 2MB
page. Enable PAE bit. Set cr3 to page directory pointer table instead
of page directory.
diff --git a/i386/i386/i386asm.sym b/i386/i386/i386asm.sym
index f31341e..45f210e 100644
--- a/i386/i386/i386asm.sym
+++ b/i386/i386/i386asm.sym
@@ -99,6 +99,8 @@ expr PDEMASK
expr PTESHIFT
expr PTEMASK
+expr sizeof(pt_entry_t) PTE_SIZE
+
expr INTEL_PTE_PFN PTE_PFN
expr INTEL_PTE_VALID PTE_V
expr INTEL_PTE_WRITE PTE_W
diff --git a/i386/i386/locore.S b/i386/i386/locore.S
index 2228482..9561a82 100644
--- a/i386/i386/locore.S
+++ b/i386/i386/locore.S
@@ -1270,7 +1270,7 @@ copyout_retry:
#if PAE
movl %edi,%eax /* get page directory pointer bits */
shrl $(PDPSHIFT),%eax /* from user address */
- movl KERNELBASE(%ecx,%eax,4),%ecx
+ movl KERNELBASE(%ecx,%eax,PTE_SIZE),%ecx
/* get page directory pointer */
andl $(PTE_PFN),%ecx /* isolate page frame address */
#endif /* PAE */
@@ -1279,7 +1279,7 @@ copyout_retry:
#if PAE
andl $(PDEMASK),%eax
#endif /* PAE */
- movl KERNELBASE(%ecx,%eax,4),%ecx
+ movl KERNELBASE(%ecx,%eax,PTE_SIZE),%ecx
/* get page directory pointer */
testl $(PTE_V),%ecx /* present? */
jz 0f /* if not, fault is OK */
@@ -1287,7 +1287,7 @@ copyout_retry:
movl %edi,%eax /* get page table bits */
shrl $(PTESHIFT),%eax
andl $(PTEMASK),%eax /* from user address */
- leal KERNELBASE(%ecx,%eax,4),%ecx
+ leal KERNELBASE(%ecx,%eax,PTE_SIZE),%ecx
/* point to page table entry */
movl (%ecx),%eax /* get it */
testl $(PTE_V),%eax /* present? */
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index a648592..697e5f8 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -589,7 +589,7 @@ void pmap_bootstrap()
{
int i;
for (i = 0; i < PDPNUM; i++)
- kernel_pmap->pdpbase[i] = pa_to_pte((vm_offset_t) kernel_pmap->dirbase + i * INTEL_PGBYTES) | INTEL_PTE_VALID;
+ WRITE_PTE(&kernel_pmap->pdpbase[i], pa_to_pte((vm_offset_t) kernel_pmap->dirbase + i * INTEL_PGBYTES) | INTEL_PTE_VALID);
}
#else /* PAE */
kernel_pmap->dirbase = kernel_page_dir = (pt_entry_t*)pmap_grab_page();
@@ -625,8 +625,8 @@ void pmap_bootstrap()
pt_entry_t *pte;
/* Initialize the page directory entry. */
- *pde = pa_to_pte((vm_offset_t)ptable)
- | INTEL_PTE_VALID | INTEL_PTE_WRITE | global;
+ WRITE_PTE(pde, pa_to_pte((vm_offset_t)ptable)
+ | INTEL_PTE_VALID | INTEL_PTE_WRITE);
/* Initialize the page table. */
for (pte = ptable; (va < phys_last_addr) && (pte < ptable+NPTES); pte++)
@@ -887,7 +887,7 @@ pmap_t pmap_create(size)
{
int i;
for (i = 0; i < PDPNUM; i++)
- p->pdpbase[i] = pa_to_pte(kvtophys((vm_offset_t) p->dirbase + i * INTEL_PGBYTES)) | INTEL_PTE_VALID;
+ WRITE_PTE(&p->pdpbase[i], pa_to_pte(kvtophys((vm_offset_t) p->dirbase + i * INTEL_PGBYTES)) | INTEL_PTE_VALID);
}
#endif /* PAE */