diff options
| author | Jun Tian <jun.j.tian@intel.com> | 2013-08-06 15:03:15 +0800 |
|---|---|---|
| committer | Elliott Hughes <enh@google.com> | 2013-08-09 16:57:16 -0700 |
| commit | 9cf04e3569d48dae36e0492226250da04699f8d4 (patch) | |
| tree | 1f2bfecbcf82a25601421ad5cc2638eec8532fd4 /vm/compiler/codegen/x86/CodegenInterface.cpp | |
| parent | e19b6bd17c794e7ff2b17fa378f1b5357df83a5a (diff) | |
Fix the protection of code cache for x86 JIT
During generation of code into code cache
an unprotected region of memory does not correspond to
protected one, The patch fixes that.
Author: Katkov Serguei <serguei.i.katkov@intel.com>
(cherry picked from commit 74a62214ef262380371bc21be2a1c42295046fb2)
Change-Id: I362a10897564b987c8a3b2dfc9ded8f0a9efd56a
Diffstat (limited to 'vm/compiler/codegen/x86/CodegenInterface.cpp')
| -rw-r--r-- | vm/compiler/codegen/x86/CodegenInterface.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/vm/compiler/codegen/x86/CodegenInterface.cpp b/vm/compiler/codegen/x86/CodegenInterface.cpp index 451c5e537..337bd61ae 100644 --- a/vm/compiler/codegen/x86/CodegenInterface.cpp +++ b/vm/compiler/codegen/x86/CodegenInterface.cpp @@ -1085,14 +1085,14 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit, JitTranslationInfo *info) info->codeAddress = NULL; stream = (char*)gDvmJit.codeCache + gDvmJit.codeCacheByteUsed; + streamStart = stream; /* trace start before alignment */ // TODO: compile into a temporary buffer and then copy into the code cache. // That would let us leave the code cache unprotected for a shorter time. size_t unprotected_code_cache_bytes = - gDvmJit.codeCacheSize - gDvmJit.codeCacheByteUsed - CODE_CACHE_PADDING; - UNPROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + gDvmJit.codeCacheSize - gDvmJit.codeCacheByteUsed; + UNPROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); - streamStart = stream; /* trace start before alignment */ stream += EXTRA_BYTES_FOR_CHAINING; /* This is needed for chaining. Add the bytes before the alignment */ stream = (char*)(((unsigned int)stream + 0xF) & ~0xF); /* Align trace to 16-bytes */ streamMethodStart = stream; /* code start */ @@ -1252,7 +1252,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit, JitTranslationInfo *info) if(cg_ret < 0) { endOfTrace(true/*freeOnly*/); cUnit->baseAddr = NULL; - PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + PROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); return; } } else { @@ -1293,7 +1293,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit, JitTranslationInfo *info) gDvmJit.codeCacheFull = true; cUnit->baseAddr = NULL; endOfTrace(true/*freeOnly*/); - PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + PROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); return; } } @@ -1387,7 +1387,7 @@ gen_fallthrough: gDvmJit.codeCacheFull = true; cUnit->baseAddr = NULL; endOfTrace(true); /* need to free structures */ - PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + PROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); return; } } @@ -1403,7 +1403,7 @@ gen_fallthrough: */ ALOGI("JIT code cache full after endOfTrace (trace uses %uB)", (stream - streamStart)); cUnit->baseAddr = NULL; - PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + PROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); return; } @@ -1425,7 +1425,7 @@ gen_fallthrough: ALOGI("JIT code cache full after ChainingCellCounts (trace uses %uB)", (stream - streamStart)); gDvmJit.codeCacheFull = true; cUnit->baseAddr = NULL; - PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + PROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); return; } @@ -1434,7 +1434,7 @@ gen_fallthrough: *pOffset = streamCountStart - streamMethodStart; /* from codeAddr */ pOffset[1] = streamChainingStart - streamMethodStart; - PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes); + PROTECT_CODE_CACHE(streamStart, unprotected_code_cache_bytes); gDvmJit.codeCacheByteUsed += (stream - streamStart); if (cUnit->printMe) { |
