[compiler-rt] r200317 - Cache invalidation for AARCH64. Disabled for Apple for now as requested

Joerg Sonnenberger joerg at bec.de
Tue Jan 28 06:02:23 PST 2014


Author: joerg
Date: Tue Jan 28 08:02:22 2014
New Revision: 200317

URL: http://llvm.org/viewvc/llvm-project?rev=200317&view=rev
Log:
Cache invalidation for AARCH64. Disabled for Apple for now as requested
by Tim Northover. Written by Matt Thomas.

Differential Revision: http://llvm-reviews.chandlerc.com/D2631

Modified:
    compiler-rt/trunk/lib/clear_cache.c

Modified: compiler-rt/trunk/lib/clear_cache.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/clear_cache.c?rev=200317&r1=200316&r2=200317&view=diff
==============================================================================
--- compiler-rt/trunk/lib/clear_cache.c (original)
+++ compiler-rt/trunk/lib/clear_cache.c Tue Jan 28 08:02:22 2014
@@ -38,6 +38,27 @@ void __clear_cache(void* start, void* en
   arg.len = (uintptr_t)end - (uintptr_t)start;
 
   sysarch(ARM_SYNC_ICACHE, &arg);
+#elif defined(__aarch64__) && !defined(__APPLE__)
+  uint64_t xstart = (uint64_t)(uintptr_t) start;
+  uint64_t xend = (uint64_t)(uintptr_t) end;
+
+  // Get Cache Type Info
+  uint64_t ctr_el0;
+  __asm __volatile("mrs %0, ctr_el0" : "=r"(ctr_el0));
+
+  /*
+   * dc & ic instructions must use 64bit registers so we don't use
+   * uintptr_t in case this runs in an IPL32 environment.
+   */
+  const size_t dcache_line_size = 4 << ((ctr_el0 >> 16) & 15);
+  for (uint64_t addr = xstart; addr < xend; addr += dcache_line_size)
+    __asm __volatile("dc cvau, %0" :: "r"(addr));
+  __asm __volatile("dsb ish");
+
+  const size_t icache_line_size = 4 << ((ctr_el0 >> 0) & 15);
+  for (uint64_t addr = xstart; addr < xend; addr += icache_line_size)
+    __asm __volatile("ic ivau, %0" :: "r"(addr));
+  __asm __volatile("isb sy");
 #else
     #if __APPLE__
         /* On Darwin, sys_icache_invalidate() provides this functionality */





More information about the llvm-commits mailing list