Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Apr 2003 01:51:44 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 28502 for review
Message-ID:  <200304080851.h388pi3A011857@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=28502

Change 28502 by peter@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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304080851.h388pi3A011857>