diff options
| author | 2018-07-11 15:14:10 +0100 | |
|---|---|---|
| committer | 2018-09-06 13:47:10 +0100 | |
| commit | f233136f2ca25316643b7f409df7af55a762f98a (patch) | |
| tree | a5aee0db607b4dc4d08e695426ebb74abcaabc35 /libartbase/base/utils.h | |
| parent | 9999327c8fbcab1d57f609457d68085ddefb7eb7 (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.h | 11 |
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) { |