svn commit: r287105 - head/sys/arm64/arm64

Andrew Turner andrew at FreeBSD.org
Mon Aug 24 12:01:40 UTC 2015


Author: andrew
Date: Mon Aug 24 12:01:39 2015
New Revision: 287105
URL: https://svnweb.freebsd.org/changeset/base/287105

Log:
  Add support for pmap_sync_icache on arm64.
  
  Reviewed by:	emaste, imp (both earlier version)
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D3438

Modified:
  head/sys/arm64/arm64/pmap.c

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c	Mon Aug 24 10:55:54 2015	(r287104)
+++ head/sys/arm64/arm64/pmap.c	Mon Aug 24 12:01:39 2015	(r287105)
@@ -3050,10 +3050,32 @@ pmap_activate(struct thread *td)
 }
 
 void
-pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
+pmap_sync_icache(pmap_t pmap, vm_offset_t va, vm_size_t sz)
 {
 
-	panic("ARM64TODO: pmap_sync_icache");
+	if (va >= VM_MIN_KERNEL_ADDRESS) {
+		cpu_icache_sync_range(va, sz);
+	} else {
+		u_int len, offset;
+		vm_paddr_t pa;
+
+		/* Find the length of data in this page to flush */
+		offset = va & PAGE_MASK;
+		len = imin(PAGE_SIZE - offset, sz);
+
+		while (sz != 0) {
+			/* Extract the physical address & find it in the DMAP */
+			pa = pmap_extract(pmap, va);
+			if (pa != 0)
+				cpu_icache_sync_range(PHYS_TO_DMAP(pa), len);
+
+			/* Move to the next page */
+			sz -= len;
+			va += len;
+			/* Set the length for the next iteration */
+			len = imin(PAGE_SIZE, sz);
+		}
+	}
 }
 
 /*


More information about the svn-src-all mailing list