summaryrefslogtreecommitdiff
path: root/libartbase/base/utils.h
diff options
context:
space:
mode:
author Orion Hodson <oth@google.com> 2018-07-11 15:14:10 +0100
committer Orion Hodson <oth@google.com> 2018-09-06 13:47:10 +0100
commitf233136f2ca25316643b7f409df7af55a762f98a (patch)
treea5aee0db607b4dc4d08e695426ebb74abcaabc35 /libartbase/base/utils.h
parent9999327c8fbcab1d57f609457d68085ddefb7eb7 (diff)
ART: Add FlushInstructionPipeline()
Use membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED), where available, to flush CPU instruction pipelines after JIT code cache updates. This is needed on architectures where TLB updates do not require a TLB shootdown. Bug: 65312375 Bug: 66095511 Bug: 111199492 Test: manual (requires kernel >= 4.16). Change-Id: I96811c611133ba765a546a09432c0c951ad39e10
Diffstat (limited to 'libartbase/base/utils.h')
-rw-r--r--libartbase/base/utils.h11
1 files changed, 7 insertions, 4 deletions
diff --git a/libartbase/base/utils.h b/libartbase/base/utils.h
index ba61e1b0a3..44499415f8 100644
--- a/libartbase/base/utils.h
+++ b/libartbase/base/utils.h
@@ -179,16 +179,19 @@ static T GetRandomNumber(T min, T max) {
// Sleep forever and never come back.
NO_RETURN void SleepForever();
-inline void FlushInstructionCache(char* begin, char* end) {
- __builtin___clear_cache(begin, end);
-}
-
inline void FlushDataCache(char* begin, char* end) {
// Same as FlushInstructionCache for lack of other builtin. __builtin___clear_cache
// flushes both caches.
__builtin___clear_cache(begin, end);
}
+inline void FlushInstructionCache(char* begin, char* end) {
+ __builtin___clear_cache(begin, end);
+}
+
+// Flush instruction pipeline. Returns true on success, false if feature is unsupported.
+bool FlushInstructionPipeline();
+
template <typename T>
constexpr PointerSize ConvertToPointerSize(T any) {
if (any == 4 || any == 8) {