Implement __builtin_clear_cache() on riscv64
authorjca <jca@openbsd.org>
Fri, 17 Sep 2021 08:17:42 +0000 (08:17 +0000)
committerjca <jca@openbsd.org>
Fri, 17 Sep 2021 08:17:42 +0000 (08:17 +0000)
Fixes at least ports/devel/libffi as used by ports/lang/python/2.
ok kettenis@

gnu/llvm/compiler-rt/lib/builtins/clear_cache.c

index 29e31f5..42532b7 100644 (file)
@@ -33,7 +33,7 @@ uintptr_t GetCurrentProcess(void);
 #include <machine/sysarch.h>
 #endif
 
-#if defined(__OpenBSD__) && (defined(__arm__) || defined(__mips__))
+#if defined(__OpenBSD__) && (defined(__arm__) || defined(__mips__) || defined(__riscv))
 // clang-format off
 #include <sys/types.h>
 #include <machine/sysarch.h>
@@ -157,6 +157,13 @@ void __clear_cache(void *start, void *end) {
                    : "=r"(start_reg)
                    : "r"(start_reg), "r"(end_reg), "r"(flags), "r"(syscall_nr));
   assert(start_reg == 0 && "Cache flush syscall failed.");
+#elif defined(__riscv) && defined(__OpenBSD__)
+  struct riscv_sync_icache_args arg;
+
+  arg.addr = (uintptr_t)start;
+  arg.len = (uintptr_t)end - (uintptr_t)start;
+
+  sysarch(RISCV_SYNC_ICACHE, &arg);
 #else
 #if __APPLE__
   // On Darwin, sys_icache_invalidate() provides this functionality