diff --git a/js/src/jit/ExecutableAllocator.h b/js/src/jit/ExecutableAllocator.h index ba7cce1387ee..ae964e9dc1b4 100644 --- a/js/src/jit/ExecutableAllocator.h +++ b/js/src/jit/ExecutableAllocator.h @@ -296,6 +296,11 @@ class ExecutableAllocator : "r" (code), "r" (reinterpret_cast(code) + size) : "r0", "r1", "r2"); } +#elif defined(JS_CODEGEN_ARM64) && (defined(__linux__) || defined(ANDROID)) && defined(__GNUC__) + static void cacheFlush(void* code, size_t size) + { + __clear_cache(code, (void *)((size_t)code + size)); + } #elif JS_CPU_SPARC static void cacheFlush(void* code, size_t size) { diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp index 9f61a3b63340..87af58835173 100644 --- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -3333,7 +3333,7 @@ PerThreadData::setAutoFlushICache(AutoFlushICache* afc) void AutoFlushICache::setRange(uintptr_t start, size_t len) { -#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) +#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) AutoFlushICache* afc = TlsPerThreadData.get()->PerThreadData::autoFlushICache(); MOZ_ASSERT(afc); MOZ_ASSERT(!afc->start_); @@ -3420,14 +3420,14 @@ AutoFlushICache::setInhibit() // the respective AutoFlushICache dynamic context. // AutoFlushICache::AutoFlushICache(const char* nonce, bool inhibit) -#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) +#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) : start_(0), stop_(0), name_(nonce), inhibit_(inhibit) #endif { -#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) +#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) PerThreadData* pt = TlsPerThreadData.get(); AutoFlushICache* afc = pt->PerThreadData::autoFlushICache(); if (afc) @@ -3442,7 +3442,7 @@ AutoFlushICache::AutoFlushICache(const char* nonce, bool inhibit) AutoFlushICache::~AutoFlushICache() { -#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) +#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) PerThreadData* pt = TlsPerThreadData.get(); MOZ_ASSERT(pt->PerThreadData::autoFlushICache() == this); diff --git a/js/src/jit/IonCode.h b/js/src/jit/IonCode.h index c165fd7f5443..835d9fc59398 100644 --- a/js/src/jit/IonCode.h +++ b/js/src/jit/IonCode.h @@ -751,7 +751,7 @@ struct VMFunction; struct AutoFlushICache { private: -#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) +#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) || defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) uintptr_t start_; uintptr_t stop_; const char* name_; diff --git a/js/src/jit/arm64/Trampoline-arm64.cpp b/js/src/jit/arm64/Trampoline-arm64.cpp index 18ca752c020d..0dd3fcf66a7b 100644 --- a/js/src/jit/arm64/Trampoline-arm64.cpp +++ b/js/src/jit/arm64/Trampoline-arm64.cpp @@ -272,6 +272,7 @@ JitRuntime::generateEnterJIT(JSContext* cx, EnterJitType type) masm.abiret(); Linker linker(masm); + AutoFlushICache afc("EnterJIT"); JitCode* code = linker.newCode(cx, OTHER_CODE); #ifdef JS_ION_PERF @@ -313,6 +314,7 @@ JitRuntime::generateInvalidator(JSContext* cx) masm.branch(bailoutTail); Linker linker(masm); + AutoFlushICache afc("Invalidator"); return linker.newCode(cx, OTHER_CODE); } @@ -420,6 +422,7 @@ JitRuntime::generateArgumentsRectifier(JSContext* cx, void** returnAddrOut) masm.ret(); Linker linker(masm); + AutoFlushICache afc("ArgumentsRectifier"); JitCode* code = linker.newCode(cx, OTHER_CODE); if (returnAddrOut) @@ -527,6 +530,7 @@ JitRuntime::generateBailoutTable(JSContext* cx, uint32_t frameClass) MacroAssembler masm; masm.breakpoint(); Linker linker(masm); + AutoFlushICache afc("BailoutTable"); return linker.newCode(cx, OTHER_CODE); } @@ -541,6 +545,7 @@ JitRuntime::generateBailoutHandler(JSContext* cx) #endif Linker linker(masm); + AutoFlushICache afc("BailoutHandler"); return linker.newCode(cx, OTHER_CODE); } @@ -727,6 +732,7 @@ JitRuntime::generateVMWrapper(JSContext* cx, const VMFunction& f) f.extraValuesToPop * sizeof(Value))); Linker linker(masm); + AutoFlushICache afc("VMWrapper"); JitCode* wrapper = linker.newCode(cx, OTHER_CODE); if (!wrapper) return nullptr; @@ -770,6 +776,7 @@ JitRuntime::generatePreBarrier(JSContext* cx, MIRType type) masm.abiret(); Linker linker(masm); + AutoFlushICache afc("PreBarrier"); return linker.newCode(cx, OTHER_CODE); } @@ -824,6 +831,7 @@ JitRuntime::generateDebugTrapHandler(JSContext* cx) masm.abiret(); Linker linker(masm); + AutoFlushICache afc("DebugTrapHandler"); JitCode* codeDbg = linker.newCode(cx, OTHER_CODE); #ifdef JS_ION_PERF @@ -841,6 +849,7 @@ JitRuntime::generateExceptionTailStub(JSContext* cx, void* handler) masm.handleFailureWithHandlerTail(handler); Linker linker(masm); + AutoFlushICache afc("ExceptionTailStub"); JitCode* code = linker.newCode(cx, OTHER_CODE); #ifdef JS_ION_PERF @@ -858,6 +867,7 @@ JitRuntime::generateBailoutTailStub(JSContext* cx) masm.generateBailoutTail(r1, r2); Linker linker(masm); + AutoFlushICache afc("BailoutTailStub"); JitCode* code = linker.newCode(cx, OTHER_CODE); #ifdef JS_ION_PERF