diff options
author | 2021-01-02 17:14:13 +0000 | |
---|---|---|
committer | 2021-01-02 17:14:13 +0000 | |
commit | cfed65dbba37a01196e6114d7667df35e4bed07c (patch) | |
tree | 2d6c61a95fba39bb1d18151ed961976d7007564a /gnu/llvm/compiler-rt/lib/builtins/clear_cache.c | |
parent | Import compiler-rt 11.0.0 release. (diff) | |
download | wireguard-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.c | 10 |
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 |