PERFORCE change 28502 for review
Peter Wemm
peter at FreeBSD.org
Tue Apr 8 01:51:47 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=28502
Change 28502 by peter at peter_daintree on 2003/04/08 01:50:45
actually create the 4-level structure. extra mappings are needed because
I'm not using UMA for the pages.
Affected files ...
.. //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#18 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#18 (text+ko) ====
@@ -1036,6 +1036,8 @@
register struct pmap *pmap;
{
vm_page_t ptdpg[NPGPTD];
+ vm_page_t pdppg;
+ vm_page_t pml4pg;
vm_paddr_t pa;
int i;
@@ -1057,7 +1059,7 @@
*/
if (pmap->pm_pteobj == NULL)
pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, PTDPTDI +
- NPGPTD);
+ NPGPTD + 2);
/*
* allocate the page directory page(s)
@@ -1072,12 +1074,32 @@
vm_page_unlock_queues();
}
+ pml4pg = vm_page_grab(pmap->pm_pteobj, PTDPTDI + NPGPTD,
+ VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
+ vm_page_lock_queues();
+ vm_page_flag_clear(pml4pg, PG_BUSY);
+ pml4pg->valid = VM_PAGE_BITS_ALL;
+ vm_page_unlock_queues();
+
+ pdppg = vm_page_grab(pmap->pm_pteobj, PTDPTDI + NPGPTD + 1,
+ VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
+ vm_page_lock_queues();
+ vm_page_flag_clear(pdppg, PG_BUSY);
+ pdppg->valid = VM_PAGE_BITS_ALL;
+ vm_page_unlock_queues();
+
pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD);
+ pmap_qenter((vm_offset_t)pmap->pm_pdp, &pdppg, 1);
+ pmap_qenter((vm_offset_t)pmap->pm_pml4, &pml4pg, 1);
for (i = 0; i < NPGPTD; i++) {
if ((ptdpg[i]->flags & PG_ZERO) == 0)
bzero(pmap->pm_pdir + (i * NPDEPG), PAGE_SIZE);
}
+ if ((pdppg->flags & PG_ZERO) == 0)
+ bzero(pmap->pm_pdp, PAGE_SIZE);
+ if ((pml4pg->flags & PG_ZERO) == 0)
+ bzero(pmap->pm_pml4, PAGE_SIZE);
mtx_lock_spin(&allpmaps_lock);
LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
@@ -1089,10 +1111,9 @@
for (i = 0; i < NPGPTD; i++) {
pa = VM_PAGE_TO_PHYS(ptdpg[i]);
pmap->pm_pdir[PTDPTDI + i] = pa | PG_V | PG_RW | PG_A | PG_M;
-#ifdef PAE
pmap->pm_pdp[i] = pa | PG_V;
-#endif
}
+ pmap->pm_pml4[0] = VM_PAGE_TO_PHYS(pdppg) | PG_V;
pmap->pm_active = 0;
TAILQ_INIT(&pmap->pm_pvlist);
More information about the p4-projects
mailing list