summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/compiler-rt/lib/builtins/clear_cache.c
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2021-01-02 17:14:13 +0000
committerpatrick <patrick@openbsd.org>2021-01-02 17:14:13 +0000
commitcfed65dbba37a01196e6114d7667df35e4bed07c (patch)
tree2d6c61a95fba39bb1d18151ed961976d7007564a /gnu/llvm/compiler-rt/lib/builtins/clear_cache.c
parentImport compiler-rt 11.0.0 release. (diff)
downloadwireguard-openbsd-cfed65dbba37a01196e6114d7667df35e4bed07c.tar.xz
wireguard-openbsd-cfed65dbba37a01196e6114d7667df35e4bed07c.zip
Merge compiler-rt 11.0.0.
ok kettenis@
Diffstat (limited to 'gnu/llvm/compiler-rt/lib/builtins/clear_cache.c')
-rw-r--r--gnu/llvm/compiler-rt/lib/builtins/clear_cache.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gnu/llvm/compiler-rt/lib/builtins/clear_cache.c b/gnu/llvm/compiler-rt/lib/builtins/clear_cache.c
index 4bcbd113310..29e31f55d49 100644
--- a/gnu/llvm/compiler-rt/lib/builtins/clear_cache.c
+++ b/gnu/llvm/compiler-rt/lib/builtins/clear_cache.c
@@ -147,6 +147,16 @@ void __clear_cache(void *start, void *end) {
for (uintptr_t dword = start_dword; dword < end_dword; dword += dword_size)
__asm__ volatile("flush %0" : : "r"(dword));
+#elif defined(__riscv) && defined(__linux__)
+#define __NR_riscv_flush_icache (244 + 15)
+ register void *start_reg __asm("a0") = start;
+ const register void *end_reg __asm("a1") = end;
+ const register long flags __asm("a2") = 0;
+ const register long syscall_nr __asm("a7") = __NR_riscv_flush_icache;
+ __asm __volatile("ecall"
+ : "=r"(start_reg)
+ : "r"(start_reg), "r"(end_reg), "r"(flags), "r"(syscall_nr));
+ assert(start_reg == 0 && "Cache flush syscall failed.");
#else
#if __APPLE__
// On Darwin, sys_icache_invalidate() provides this functionality