aboutsummaryrefslogtreecommitdiff
path: root/vm/compiler/codegen/x86/CodegenInterface.cpp
diff options
context:
space:
mode:
authorJun Tian <jun.j.tian@intel.com>2013-08-06 15:03:15 +0800
committerElliott Hughes <enh@google.com>2013-08-09 16:57:16 -0700
commit9cf04e3569d48dae36e0492226250da04699f8d4 (patch)
tree1f2bfecbcf82a25601421ad5cc2638eec8532fd4 /vm/compiler/codegen/x86/CodegenInterface.cpp
parente19b6bd17c794e7ff2b17fa378f1b5357df83a5a (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.cpp18
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) {