From e2a45eb4bc14787b374996a485527e9353d63e67 Mon Sep 17 00:00:00 2001 From: gns Date: Wed, 6 Mar 2024 09:43:46 +0800 Subject: [PATCH] riscv(support,linux): add Linux specfic icache sync codepath --- src/lj_mcode.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/lj_mcode.c b/src/lj_mcode.c index 864da7fb..3b88cfcf 100644 --- a/src/lj_mcode.c +++ b/src/lj_mcode.c @@ -38,6 +38,12 @@ void sys_icache_invalidate(void *start, size_t len); #endif +#if LJ_TARGET_RISCV64 && LJ_TARGET_LINUX +#include +#include +#include +#endif + /* Synchronize data/instruction cache. */ void lj_mcode_sync(void *start, void *end) { @@ -52,6 +58,17 @@ void lj_mcode_sync(void *start, void *end) sys_icache_invalidate(start, (char *)end-(char *)start); #elif LJ_TARGET_PPC lj_vm_cachesync(start, end); +#elif LJ_TARGET_RISCV64 && LJ_TARGET_LINUX +#if (defined(__GNUC__) || defined(__clang__)) + __asm__ volatile("fence rw, rw"); +#else + lj_vm_fence_rw_rw(); +#endif +#ifdef __GLIBC__ + __riscv_flush_icache(start, end, 0); +#else + syscall(__NR_riscv_flush_icache, start, end, 0UL); +#endif #elif defined(__GNUC__) || defined(__clang__) __clear_cache(start, end); #else