diff options
Diffstat (limited to 'compiler-rt/lib/hwasan/hwasan_linux.cc')
| -rw-r--r-- | compiler-rt/lib/hwasan/hwasan_linux.cc | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/compiler-rt/lib/hwasan/hwasan_linux.cc b/compiler-rt/lib/hwasan/hwasan_linux.cc index 3285431eb12..f8e83ff0370 100644 --- a/compiler-rt/lib/hwasan/hwasan_linux.cc +++ b/compiler-rt/lib/hwasan/hwasan_linux.cc @@ -22,6 +22,7 @@ #include "hwasan_mapping.h" #include "hwasan_report.h" #include "hwasan_thread.h" +#include "hwasan_thread_list.h" #include <elf.h> #include <link.h> @@ -37,6 +38,10 @@ #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_procmaps.h" +#if HWASAN_WITH_INTERCEPTORS && !SANITIZER_ANDROID +THREADLOCAL uptr __hwasan_tls; +#endif + namespace __hwasan { static void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name) { @@ -179,6 +184,20 @@ bool InitShadow() { return true; } +void InitThreads() { + CHECK(__hwasan_shadow_memory_dynamic_address); + uptr guard_page_size = GetMmapGranularity(); + uptr thread_space_start = + __hwasan_shadow_memory_dynamic_address - (1ULL << kShadowBaseAlignment); + uptr thread_space_end = + __hwasan_shadow_memory_dynamic_address - guard_page_size; + ReserveShadowMemoryRange(thread_space_start, thread_space_end - 1, + "hwasan threads"); + ProtectGap(thread_space_end, + __hwasan_shadow_memory_dynamic_address - thread_space_end); + InitThreadList(thread_space_start, thread_space_end - thread_space_start); +} + static void MadviseShadowRegion(uptr beg, uptr end) { uptr size = end - beg + 1; if (common_flags()->no_huge_pages_for_shadow) @@ -214,7 +233,7 @@ void InstallAtExitHandler() { // ---------------------- TSD ---------------- {{{1 extern "C" void __hwasan_thread_enter() { - Thread::Create(); + hwasanThreadList().CreateCurrentThread(); } extern "C" void __hwasan_thread_exit() { @@ -222,21 +241,25 @@ extern "C" void __hwasan_thread_exit() { // Make sure that signal handler can not see a stale current thread pointer. atomic_signal_fence(memory_order_seq_cst); if (t) - t->Destroy(); + hwasanThreadList().ReleaseThread(t); } #if HWASAN_WITH_INTERCEPTORS static pthread_key_t tsd_key; static bool tsd_key_inited = false; +void HwasanTSDThreadInit() { + if (tsd_key_inited) + CHECK_EQ(0, pthread_setspecific(tsd_key, + (void *)GetPthreadDestructorIterations())); +} + void HwasanTSDDtor(void *tsd) { - Thread *t = (Thread*)tsd; - if (t->destructor_iterations_ > 1) { - t->destructor_iterations_--; - CHECK_EQ(0, pthread_setspecific(tsd_key, tsd)); + uptr iterations = (uptr)tsd; + if (iterations > 1) { + CHECK_EQ(0, pthread_setspecific(tsd_key, (void *)(iterations - 1))); return; } - t->Destroy(); __hwasan_thread_exit(); } @@ -245,31 +268,26 @@ void HwasanTSDInit() { tsd_key_inited = true; CHECK_EQ(0, pthread_key_create(&tsd_key, HwasanTSDDtor)); } - -Thread *GetCurrentThread() { - return (Thread *)pthread_getspecific(tsd_key); -} - -void SetCurrentThread(Thread *t) { - // Make sure that HwasanTSDDtor gets called at the end. - CHECK(tsd_key_inited); - // Make sure we do not reset the current Thread. - CHECK_EQ(0, pthread_getspecific(tsd_key)); - pthread_setspecific(tsd_key, (void *)t); -} -#elif SANITIZER_ANDROID +#else void HwasanTSDInit() {} -Thread *GetCurrentThread() { - return (Thread*)*get_android_tls_ptr(); -} +void HwasanTSDThreadInit() {} +#endif -void SetCurrentThread(Thread *t) { - *get_android_tls_ptr() = (uptr)t; +#if SANITIZER_ANDROID +uptr *GetCurrentThreadLongPtr() { + return (uptr *)get_android_tls_ptr(); } #else -#error unsupported configuration !HWASAN_WITH_INTERCEPTORS && !SANITIZER_ANDROID +uptr *GetCurrentThreadLongPtr() { + return &__hwasan_tls; +} #endif +Thread *GetCurrentThread() { + auto *R = (StackAllocationsRingBuffer*)GetCurrentThreadLongPtr(); + return hwasanThreadList().GetThreadByBufferAddress((uptr)(R->Next())); +} + struct AccessInfo { uptr addr; uptr size; |

