aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_asm.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index ff64402c..0c794ebb 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -933,6 +933,15 @@ static uint32_t ir_khash(IRIns *ir)
933void sys_icache_invalidate(void *start, size_t len); 933void sys_icache_invalidate(void *start, size_t len);
934#endif 934#endif
935 935
936#if LJ_TARGET_LINUX && LJ_TARGET_PPC
937#include <dlfcn.h>
938static void (*asm_ppc_cache_flush)(MCode *start, MCode *end);
939static void asm_dummy_cache_flush(MCode *start, MCode *end)
940{
941 UNUSED(start); UNUSED(end);
942}
943#endif
944
936/* Flush instruction cache. */ 945/* Flush instruction cache. */
937static void asm_cache_flush(MCode *start, MCode *end) 946static void asm_cache_flush(MCode *start, MCode *end)
938{ 947{
@@ -941,7 +950,14 @@ static void asm_cache_flush(MCode *start, MCode *end)
941 UNUSED(start); UNUSED(end); 950 UNUSED(start); UNUSED(end);
942#elif LJ_TARGET_OSX 951#elif LJ_TARGET_OSX
943 sys_icache_invalidate(start, end-start); 952 sys_icache_invalidate(start, end-start);
944#elif defined(__GNUC__) 953#elif LJ_TARGET_LINUX && LJ_TARGET_PPC
954 if (!asm_ppc_cache_flush) {
955 void *vdso = dlopen("linux-vdso32.so.1", RTLD_LAZY);
956 if (!vdso || !(asm_ppc_cache_flush = dlsym(vdso, "__kernel_sync_dicache")))
957 asm_ppc_cache_flush = asm_dummy_cache_flush;
958 }
959 asm_ppc_cache_flush(start, end);
960#elif defined(__GNUC__) && !LJ_TARGET_PPC
945 __clear_cache(start, end); 961 __clear_cache(start, end);
946#else 962#else
947#error "Missing builtin to flush instruction cache" 963#error "Missing builtin to flush instruction cache"