svn commit: r195604 - user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64

Kip Macy kmacy at FreeBSD.org
Sat Jul 11 02:58:36 UTC 2009


Author: kmacy
Date: Sat Jul 11 02:58:36 2009
New Revision: 195604
URL: http://svn.freebsd.org/changeset/base/195604

Log:
  implement pmap_qenter_prot for "amd64"

Modified:
  user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c

Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c	Sat Jul 11 02:58:09 2009	(r195603)
+++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c	Sat Jul 11 02:58:36 2009	(r195604)
@@ -1204,16 +1204,24 @@ pmap_map(vm_offset_t *virt, vm_paddr_t s
  * Note: SMP coherent.  Uses a ranged shootdown IPI.
  */
 void
-pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
+pmap_qenter_prot(vm_offset_t sva, vm_page_t *ma, int count, vm_prot_t prot)
 {
 	pt_entry_t *endpte, oldpte, *pte;
+	uint64_t flags = PG_V;
 
+	if (prot & VM_PROT_WRITE)
+		flags |= PG_RW;
+	if ((prot & VM_PROT_EXECUTE) == 0)
+		flags |= PG_NX;
+	
 	oldpte = 0;
 	pte = vtopte(sva);
 	endpte = pte + count;
 	while (pte < endpte) {
 		oldpte |= *pte;
-		pte_store(pte, VM_PAGE_TO_PHYS(*ma) | PG_G | PG_RW | PG_V);
+		pte_store(pte, VM_PAGE_TO_PHYS(*ma) | PG_G | flags);
+		if (prot & VM_PROT_EXCLUDE)
+			dump_exclude_page(VM_PAGE_TO_PHYS(*ma));
 		pte++;
 		ma++;
 	}
@@ -1222,6 +1230,16 @@ pmap_qenter(vm_offset_t sva, vm_page_t *
 		    PAGE_SIZE);
 }
 
+void
+pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
+{
+
+	pmap_qenter_prot(sva, ma, count,
+	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
+
+}
+
+
 /*
  * This routine tears out page mappings from the
  * kernel -- it is meant only for temporary mappings.
@@ -1234,6 +1252,7 @@ pmap_qremove(vm_offset_t sva, int count)
 
 	va = sva;
 	while (count-- > 0) {
+		dump_unexclude_page(pmap_kextract(va));
 		pmap_kremove(va);
 		va += PAGE_SIZE;
 	}


More information about the svn-src-user mailing list