Bug 1271565 - Add autoflush icache for aarch64 target. r=sstangl

This commit is contained in:
sk 2016-07-08 09:05:32 +08:00
Родитель 8f07aa3df1
Коммит aac6f76e6f
4 изменённых файлов: 20 добавлений и 5 удалений

Просмотреть файл

@ -296,6 +296,11 @@ class ExecutableAllocator
: "r" (code), "r" (reinterpret_cast<char*>(code) + size) : "r" (code), "r" (reinterpret_cast<char*>(code) + size)
: "r0", "r1", "r2"); : "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 #elif JS_CPU_SPARC
static void cacheFlush(void* code, size_t size) static void cacheFlush(void* code, size_t size)
{ {

Просмотреть файл

@ -3333,7 +3333,7 @@ PerThreadData::setAutoFlushICache(AutoFlushICache* afc)
void void
AutoFlushICache::setRange(uintptr_t start, size_t len) 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(); AutoFlushICache* afc = TlsPerThreadData.get()->PerThreadData::autoFlushICache();
MOZ_ASSERT(afc); MOZ_ASSERT(afc);
MOZ_ASSERT(!afc->start_); MOZ_ASSERT(!afc->start_);
@ -3420,14 +3420,14 @@ AutoFlushICache::setInhibit()
// the respective AutoFlushICache dynamic context. // the respective AutoFlushICache dynamic context.
// //
AutoFlushICache::AutoFlushICache(const char* nonce, bool inhibit) 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), : start_(0),
stop_(0), stop_(0),
name_(nonce), name_(nonce),
inhibit_(inhibit) inhibit_(inhibit)
#endif #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(); PerThreadData* pt = TlsPerThreadData.get();
AutoFlushICache* afc = pt->PerThreadData::autoFlushICache(); AutoFlushICache* afc = pt->PerThreadData::autoFlushICache();
if (afc) if (afc)
@ -3442,7 +3442,7 @@ AutoFlushICache::AutoFlushICache(const char* nonce, bool inhibit)
AutoFlushICache::~AutoFlushICache() 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(); PerThreadData* pt = TlsPerThreadData.get();
MOZ_ASSERT(pt->PerThreadData::autoFlushICache() == this); MOZ_ASSERT(pt->PerThreadData::autoFlushICache() == this);

Просмотреть файл

@ -751,7 +751,7 @@ struct VMFunction;
struct AutoFlushICache struct AutoFlushICache
{ {
private: 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 start_;
uintptr_t stop_; uintptr_t stop_;
const char* name_; const char* name_;

Просмотреть файл

@ -272,6 +272,7 @@ JitRuntime::generateEnterJIT(JSContext* cx, EnterJitType type)
masm.abiret(); masm.abiret();
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("EnterJIT");
JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE); JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE);
#ifdef JS_ION_PERF #ifdef JS_ION_PERF
@ -313,6 +314,7 @@ JitRuntime::generateInvalidator(JSContext* cx)
masm.branch(bailoutTail); masm.branch(bailoutTail);
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("Invalidator");
return linker.newCode<NoGC>(cx, OTHER_CODE); return linker.newCode<NoGC>(cx, OTHER_CODE);
} }
@ -420,6 +422,7 @@ JitRuntime::generateArgumentsRectifier(JSContext* cx, void** returnAddrOut)
masm.ret(); masm.ret();
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("ArgumentsRectifier");
JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE); JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE);
if (returnAddrOut) if (returnAddrOut)
@ -527,6 +530,7 @@ JitRuntime::generateBailoutTable(JSContext* cx, uint32_t frameClass)
MacroAssembler masm; MacroAssembler masm;
masm.breakpoint(); masm.breakpoint();
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("BailoutTable");
return linker.newCode<NoGC>(cx, OTHER_CODE); return linker.newCode<NoGC>(cx, OTHER_CODE);
} }
@ -541,6 +545,7 @@ JitRuntime::generateBailoutHandler(JSContext* cx)
#endif #endif
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("BailoutHandler");
return linker.newCode<NoGC>(cx, OTHER_CODE); return linker.newCode<NoGC>(cx, OTHER_CODE);
} }
@ -727,6 +732,7 @@ JitRuntime::generateVMWrapper(JSContext* cx, const VMFunction& f)
f.extraValuesToPop * sizeof(Value))); f.extraValuesToPop * sizeof(Value)));
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("VMWrapper");
JitCode* wrapper = linker.newCode<NoGC>(cx, OTHER_CODE); JitCode* wrapper = linker.newCode<NoGC>(cx, OTHER_CODE);
if (!wrapper) if (!wrapper)
return nullptr; return nullptr;
@ -770,6 +776,7 @@ JitRuntime::generatePreBarrier(JSContext* cx, MIRType type)
masm.abiret(); masm.abiret();
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("PreBarrier");
return linker.newCode<NoGC>(cx, OTHER_CODE); return linker.newCode<NoGC>(cx, OTHER_CODE);
} }
@ -824,6 +831,7 @@ JitRuntime::generateDebugTrapHandler(JSContext* cx)
masm.abiret(); masm.abiret();
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("DebugTrapHandler");
JitCode* codeDbg = linker.newCode<NoGC>(cx, OTHER_CODE); JitCode* codeDbg = linker.newCode<NoGC>(cx, OTHER_CODE);
#ifdef JS_ION_PERF #ifdef JS_ION_PERF
@ -841,6 +849,7 @@ JitRuntime::generateExceptionTailStub(JSContext* cx, void* handler)
masm.handleFailureWithHandlerTail(handler); masm.handleFailureWithHandlerTail(handler);
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("ExceptionTailStub");
JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE); JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE);
#ifdef JS_ION_PERF #ifdef JS_ION_PERF
@ -858,6 +867,7 @@ JitRuntime::generateBailoutTailStub(JSContext* cx)
masm.generateBailoutTail(r1, r2); masm.generateBailoutTail(r1, r2);
Linker linker(masm); Linker linker(masm);
AutoFlushICache afc("BailoutTailStub");
JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE); JitCode* code = linker.newCode<NoGC>(cx, OTHER_CODE);
#ifdef JS_ION_PERF #ifdef JS_ION_PERF