Module Name:    src
Committed By:   skrll
Date:           Wed Nov 11 17:54:17 UTC 2015

Modified Files:
        src/sys/arch/arm/arm32: pmap.c
        src/sys/arch/arm/conf: files.arm
        src/sys/arch/arm/include/arm32: pmap.h

Log Message:
Support pmap_pv_track and friends


To generate a diff of this commit:
cvs rdiff -u -r1.327 -r1.328 src/sys/arch/arm/arm32/pmap.c
cvs rdiff -u -r1.130 -r1.131 src/sys/arch/arm/conf/files.arm
cvs rdiff -u -r1.142 -r1.143 src/sys/arch/arm/include/arm32/pmap.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.327 src/sys/arch/arm/arm32/pmap.c:1.328
--- src/sys/arch/arm/arm32/pmap.c:1.327	Fri Nov  6 08:44:35 2015
+++ src/sys/arch/arm/arm32/pmap.c	Wed Nov 11 17:54:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.327 2015/11/06 08:44:35 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.328 2015/11/11 17:54:17 skrll Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -213,10 +213,11 @@
 #include <sys/kernhist.h>
 
 #include <uvm/uvm.h>
+#include <uvm/pmap/pmap_pvt.h>
 
 #include <arm/locore.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.327 2015/11/06 08:44:35 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.328 2015/11/11 17:54:17 skrll Exp $");
 
 //#define PMAP_DEBUG
 #ifdef PMAP_DEBUG
@@ -757,6 +758,7 @@ static void		pmap_flush_page(struct vm_p
 #endif
 #endif
 static void		pmap_page_remove(struct vm_page_md *, paddr_t);
+static void		pmap_pv_remove(paddr_t);
 
 #ifndef ARM_MMU_EXTENDED
 static void		pmap_init_l1(struct l1_ttable *, pd_entry_t *);
@@ -3118,15 +3120,20 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 		 * If the physical address is different, lookup the
 		 * vm_page.
 		 */
-		if (l2pte_pa(opte) != pa)
+		if (l2pte_pa(opte) != pa) {
+			KASSERT(!pmap_pv_tracked(pa));
 			opg = PHYS_TO_VM_PAGE(l2pte_pa(opte));
-		else
+		} else
 			opg = pg;
 	} else
 		opg = NULL;
 
-	if (pg) {
-		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
+	struct pmap_page *pp = pmap_pv_tracked(pa);
+
+	if (pg || pp) {
+		KASSERT((pg != NULL) != (pp != NULL));
+		struct vm_page_md *md = (pg != NULL) ? VM_PAGE_TO_MD(pg) :
+		    PMAP_PAGE_TO_MD(pp);
 
 		/*
 		 * This is to be a managed mapping.
@@ -3180,7 +3187,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 		} else
 			npte |= pte_l2_s_cache_mode;
 
-		if (pg == opg) {
+		if (pg != NULL && pg == opg) {
 			/*
 			 * We're changing the attrs of an existing mapping.
 			 */
@@ -3949,6 +3956,34 @@ pmap_extract(pmap_t pm, vaddr_t va, padd
 	return true;
 }
 
+/*
+ * pmap_pv_remove: remove an unmanaged pv-tracked page from all pmaps
+ *	that map it
+ */
+
+static void
+pmap_pv_remove(paddr_t pa)
+{
+	struct pmap_page *pp;
+
+	pp = pmap_pv_tracked(pa);
+	if (pp == NULL)
+		panic("pmap_pv_protect: page not pv-tracked: 0x%"PRIxPADDR,
+		    pa);
+
+	struct vm_page_md *md = PMAP_PAGE_TO_MD(pp);
+	pmap_page_remove(md, pa);
+}
+
+void
+pmap_pv_protect(paddr_t pa, vm_prot_t prot)
+{
+
+	/* the only case is remove at the moment */
+	KASSERT(prot == VM_PROT_NONE);
+	pmap_pv_remove(pa);
+}
+
 void
 pmap_protect(pmap_t pm, vaddr_t sva, vaddr_t eva, vm_prot_t prot)
 {

Index: src/sys/arch/arm/conf/files.arm
diff -u src/sys/arch/arm/conf/files.arm:1.130 src/sys/arch/arm/conf/files.arm:1.131
--- src/sys/arch/arm/conf/files.arm:1.130	Sat Feb  7 17:14:32 2015
+++ src/sys/arch/arm/conf/files.arm	Wed Nov 11 17:54:17 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: files.arm,v 1.130 2015/02/07 17:14:32 jmcneill Exp $
+#	$NetBSD: files.arm,v 1.131 2015/11/11 17:54:17 skrll Exp $
 
 # temporary define to allow easy moving to ../arch/arm/arm32
 defflag				ARM32
@@ -213,6 +213,9 @@ file	arch/arm/arm32/cortex_pmc.c		cortex
 file	arch/arm/arm32/arm32_tlb.c		(cpu_armv7 | cpu_arm11) & (!arm11_compat_mmu & !cpu_pre_armv6)
 file	uvm/pmap/pmap_tlb.c			(cpu_armv7 | cpu_arm11) & (!arm11_compat_mmu & !cpu_pre_armv6)
 
+# generic pmap files for arm32 implementations
+file	uvm/pmap/pmap_pvt.c			arm32
+
 # arm32 library functions
 file	arch/arm/arm32/bcopy_page.S		arm32
 

Index: src/sys/arch/arm/include/arm32/pmap.h
diff -u src/sys/arch/arm/include/arm32/pmap.h:1.142 src/sys/arch/arm/include/arm32/pmap.h:1.143
--- src/sys/arch/arm/include/arm32/pmap.h:1.142	Wed Sep  9 07:37:36 2015
+++ src/sys/arch/arm/include/arm32/pmap.h	Wed Nov 11 17:54:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.142 2015/09/09 07:37:36 skrll Exp $	*/
+/*	$NetBSD: pmap.h,v 1.143 2015/11/11 17:54:17 skrll Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -80,6 +80,7 @@
 #include <arm/cpufunc.h>
 #include <arm/locore.h>
 #include <uvm/uvm_object.h>
+#include <uvm/pmap/pmap_pvt.h>
 #endif
 
 #ifdef ARM_MMU_EXTENDED
@@ -1066,11 +1067,11 @@ paddr_t	pmap_unmap_poolpage(vaddr_t);
 #define PMAP_UNMAP_POOLPAGE(va)	pmap_unmap_poolpage(va)
 #endif
 
-/*
- * pmap-specific data store in the vm_page structure.
- */
-#define	__HAVE_VM_PAGE_MD
-struct vm_page_md {
+#define __HAVE_PMAP_PV_TRACK	1
+
+void pmap_pv_protect(paddr_t, vm_prot_t);
+
+struct pmap_page {
 	SLIST_HEAD(,pv_entry) pvh_list;		/* pv_entry list */
 	int pvh_attrs;				/* page attributes */
 	u_int uro_mappings;
@@ -1079,12 +1080,26 @@ struct vm_page_md {
 		u_short s_mappings[2];	/* Assume kernel count <= 65535 */
 		u_int i_mappings;
 	} k_u;
-#define	kro_mappings	k_u.s_mappings[0]
-#define	krw_mappings	k_u.s_mappings[1]
-#define	k_mappings	k_u.i_mappings
 };
 
 /*
+ * pmap-specific data store in the vm_page structure.
+ */
+#define	__HAVE_VM_PAGE_MD
+struct vm_page_md {
+	struct pmap_page pp;
+#define	pvh_list	pp.pvh_list
+#define	pvh_attrs	pp.pvh_attrs
+#define	uro_mappings	pp.uro_mappings
+#define	urw_mappings	pp.urw_mappings
+#define	kro_mappings	pp.k_u.s_mappings[0]
+#define	krw_mappings	pp.k_u.s_mappings[1]
+#define	k_mappings	pp.k_u.i_mappings
+};
+
+#define PMAP_PAGE_TO_MD(ppage) container_of((ppage), struct vm_page_md, pp)
+
+/*
  * Set the default color of each page.
  */
 #if ARM_MMU_V6 > 0

Reply via email to