Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jul 2015 12:37:47 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285537 - in head/sys/arm64: arm64 include
Message-ID:  <201507141237.t6ECbl4c074043@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Tue Jul 14 12:37:47 2015
New Revision: 285537
URL: https://svnweb.freebsd.org/changeset/base/285537

Log:
  Set memory to be inner-sharable. This isn't needed on device memory as the
  MMU will ignore the attribute there, howeverit simplifies to code to alwas
  set it.
  
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/arm64/arm64/locore.S
  head/sys/arm64/arm64/pmap.c
  head/sys/arm64/include/pte.h

Modified: head/sys/arm64/arm64/locore.S
==============================================================================
--- head/sys/arm64/arm64/locore.S	Tue Jul 14 12:21:47 2015	(r285536)
+++ head/sys/arm64/arm64/locore.S	Tue Jul 14 12:37:47 2015	(r285537)
@@ -469,6 +469,9 @@ build_block_pagetable:
 	lsl	x12, x7, #2
 	orr	x12, x12, #L2_BLOCK
 	orr	x12, x12, #(ATTR_AF)
+#ifdef SMP
+	orr	x12, x12, ATTR_SH(ATTR_SH_IS)
+#endif
 
 	/* Only use the output address bits */
 	lsr	x9, x9, #L2_SHIFT

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c	Tue Jul 14 12:21:47 2015	(r285536)
+++ head/sys/arm64/arm64/pmap.c	Tue Jul 14 12:37:47 2015	(r285537)
@@ -428,8 +428,8 @@ pmap_bootstrap_dmap(vm_offset_t l1pt)
 		KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
 
 		pmap_load_store(&l1[l1_slot],
-		    (pa & ~L1_OFFSET) | ATTR_AF | L1_BLOCK |
-		    ATTR_IDX(CACHED_MEMORY));
+		    (pa & ~L1_OFFSET) | ATTR_DEFAULT |
+		    ATTR_IDX(CACHED_MEMORY) | L1_BLOCK);
 	}
 
 	cpu_dcache_wb_range((vm_offset_t)l1, PAGE_SIZE);
@@ -860,8 +860,8 @@ pmap_kenter_device(vm_offset_t sva, vm_s
 	while (size != 0) {
 		l3 = pmap_l3(kernel_pmap, va);
 		KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
-		pmap_load_store(l3, (pa & ~L3_OFFSET) | ATTR_AF | L3_PAGE |
-		    ATTR_IDX(DEVICE_MEMORY));
+		pmap_load_store(l3, (pa & ~L3_OFFSET) | ATTR_DEFAULT |
+		    ATTR_IDX(DEVICE_MEMORY) | L3_PAGE);
 		PTE_SYNC(l3);
 
 		va += PAGE_SIZE;
@@ -953,8 +953,8 @@ pmap_qenter(vm_offset_t sva, vm_page_t *
 	va = sva;
 	for (i = 0; i < count; i++) {
 		m = ma[i];
-		pa = VM_PAGE_TO_PHYS(m) | ATTR_AF |
-		    ATTR_IDX(m->md.pv_memattr) | ATTR_AP(ATTR_AP_RW) | L3_PAGE;
+		pa = VM_PAGE_TO_PHYS(m) | ATTR_DEFAULT | ATTR_AP(ATTR_AP_RW) |
+		    ATTR_IDX(m->md.pv_memattr) | L3_PAGE;
 		l3 = pmap_l3(kernel_pmap, va);
 		pmap_load_store(l3, pa);
 		PTE_SYNC(l3);
@@ -1214,8 +1214,7 @@ _pmap_alloc_l3(pmap_t pmap, vm_pindex_t 
 
 		l2 = (pd_entry_t *)PHYS_TO_DMAP(*l1 & ~ATTR_MASK);
 		l2 = &l2[ptepindex & Ln_ADDR_MASK];
-		pmap_load_store(l2, VM_PAGE_TO_PHYS(m) | ATTR_AF |
-		    ATTR_IDX(CACHED_MEMORY) | L2_TABLE);
+		pmap_load_store(l2, VM_PAGE_TO_PHYS(m) | L2_TABLE);
 		PTE_SYNC(l2);
 	}
 
@@ -1907,14 +1906,14 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m))
 		VM_OBJECT_ASSERT_LOCKED(m->object);
 	pa = VM_PAGE_TO_PHYS(m);
-	new_l3 = (pt_entry_t)(pa | ATTR_AF | L3_PAGE);
+	new_l3 = (pt_entry_t)(pa | ATTR_DEFAULT | ATTR_IDX(m->md.pv_memattr) |
+	    L3_PAGE);
 	if ((prot & VM_PROT_WRITE) == 0)
 		new_l3 |= ATTR_AP(ATTR_AP_RO);
 	if ((flags & PMAP_ENTER_WIRED) != 0)
 		new_l3 |= ATTR_SW_WIRED;
 	if ((va >> 63) == 0)
 		new_l3 |= ATTR_AP(ATTR_AP_USER);
-	new_l3 |= ATTR_IDX(m->md.pv_memattr);
 
 	CTR2(KTR_PMAP, "pmap_enter: %.16lx -> %.16lx", va, pa);
 
@@ -2243,7 +2242,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_
 	 */
 	pmap_resident_count_inc(pmap, 1);
 
-	pa = VM_PAGE_TO_PHYS(m) | ATTR_AF | ATTR_IDX(m->md.pv_memattr) |
+	pa = VM_PAGE_TO_PHYS(m) | ATTR_DEFAULT | ATTR_IDX(m->md.pv_memattr) |
 	    ATTR_AP(ATTR_AP_RW) | L3_PAGE;
 
 	/*

Modified: head/sys/arm64/include/pte.h
==============================================================================
--- head/sys/arm64/include/pte.h	Tue Jul 14 12:21:47 2015	(r285536)
+++ head/sys/arm64/include/pte.h	Tue Jul 14 12:37:47 2015	(r285537)
@@ -63,6 +63,12 @@ typedef	uint64_t	pt_entry_t;		/* page ta
 #define	ATTR_IDX(x)	((x) << 2)
 #define	ATTR_IDX_MASK	(7 << 2)
 
+#ifdef SMP
+#define	ATTR_DEFAULT	(ATTR_AF | ATTR_SH(ATTR_SH_IS))
+#else
+#define	ATTR_DEFAULT	(ATTR_AF)
+#endif
+
 #define	ATTR_DESCR_MASK	3
 
 /* Level 0 table, 512GiB per entry */



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