1befb3844SAndrew Browne //===-- dfsan_thread.h ------------------------------------------*- C++ -*-===// 20f3fd3b2SJianzhou Zhao // 30f3fd3b2SJianzhou Zhao // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40f3fd3b2SJianzhou Zhao // See https://llvm.org/LICENSE.txt for license information. 50f3fd3b2SJianzhou Zhao // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60f3fd3b2SJianzhou Zhao // 70f3fd3b2SJianzhou Zhao //===----------------------------------------------------------------------===// 80f3fd3b2SJianzhou Zhao // 90f3fd3b2SJianzhou Zhao // This file is a part of DataFlowSanitizer. 100f3fd3b2SJianzhou Zhao // 110f3fd3b2SJianzhou Zhao //===----------------------------------------------------------------------===// 120f3fd3b2SJianzhou Zhao 130f3fd3b2SJianzhou Zhao #ifndef DFSAN_THREAD_H 140f3fd3b2SJianzhou Zhao #define DFSAN_THREAD_H 150f3fd3b2SJianzhou Zhao 161fb612d0SJianzhou Zhao #include "dfsan_allocator.h" 170f3fd3b2SJianzhou Zhao #include "sanitizer_common/sanitizer_common.h" 18ffd9c123SVitaly Buka #include "sanitizer_common/sanitizer_posix.h" 190f3fd3b2SJianzhou Zhao 200f3fd3b2SJianzhou Zhao namespace __dfsan { 210f3fd3b2SJianzhou Zhao 220f3fd3b2SJianzhou Zhao class DFsanThread { 230f3fd3b2SJianzhou Zhao public: 240f3fd3b2SJianzhou Zhao // NOTE: There is no DFsanThread constructor. It is allocated 250f3fd3b2SJianzhou Zhao // via mmap() and *must* be valid in zero-initialized state. 260f3fd3b2SJianzhou Zhao 27*dbf8c00bSAndrew Browne static DFsanThread *Create(thread_callback_t start_routine, void *arg, 284e67ae7bSJianzhou Zhao bool track_origins = false); 290f3fd3b2SJianzhou Zhao static void TSDDtor(void *tsd); 300f3fd3b2SJianzhou Zhao void Destroy(); 310f3fd3b2SJianzhou Zhao 320f3fd3b2SJianzhou Zhao void Init(); // Should be called from the thread itself. 330f3fd3b2SJianzhou Zhao thread_return_t ThreadStart(); 340f3fd3b2SJianzhou Zhao 350f3fd3b2SJianzhou Zhao uptr stack_top(); 360f3fd3b2SJianzhou Zhao uptr stack_bottom(); tls_begin()371fb612d0SJianzhou Zhao uptr tls_begin() { return tls_begin_; } tls_end()381fb612d0SJianzhou Zhao uptr tls_end() { return tls_end_; } IsMainThread()390f3fd3b2SJianzhou Zhao bool IsMainThread() { return start_routine_ == nullptr; } 400f3fd3b2SJianzhou Zhao InSignalHandler()410f3fd3b2SJianzhou Zhao bool InSignalHandler() { return in_signal_handler_; } EnterSignalHandler()420f3fd3b2SJianzhou Zhao void EnterSignalHandler() { in_signal_handler_++; } LeaveSignalHandler()430f3fd3b2SJianzhou Zhao void LeaveSignalHandler() { in_signal_handler_--; } 440f3fd3b2SJianzhou Zhao malloc_storage()451fb612d0SJianzhou Zhao DFsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; } 461fb612d0SJianzhou Zhao 470f3fd3b2SJianzhou Zhao int destructor_iterations_; 48ffd9c123SVitaly Buka __sanitizer_sigset_t starting_sigset_; 490f3fd3b2SJianzhou Zhao 500f3fd3b2SJianzhou Zhao private: 510f3fd3b2SJianzhou Zhao void SetThreadStackAndTls(); 521fb612d0SJianzhou Zhao void ClearShadowForThreadStackAndTLS(); 530f3fd3b2SJianzhou Zhao struct StackBounds { 540f3fd3b2SJianzhou Zhao uptr bottom; 550f3fd3b2SJianzhou Zhao uptr top; 560f3fd3b2SJianzhou Zhao }; 570f3fd3b2SJianzhou Zhao StackBounds GetStackBounds() const; 580f3fd3b2SJianzhou Zhao 590f3fd3b2SJianzhou Zhao bool AddrIsInStack(uptr addr); 600f3fd3b2SJianzhou Zhao 610f3fd3b2SJianzhou Zhao thread_callback_t start_routine_; 620f3fd3b2SJianzhou Zhao void *arg_; 634e67ae7bSJianzhou Zhao bool track_origins_; 640f3fd3b2SJianzhou Zhao 650f3fd3b2SJianzhou Zhao StackBounds stack_; 660f3fd3b2SJianzhou Zhao 671fb612d0SJianzhou Zhao uptr tls_begin_; 681fb612d0SJianzhou Zhao uptr tls_end_; 691fb612d0SJianzhou Zhao 700f3fd3b2SJianzhou Zhao unsigned in_signal_handler_; 711fb612d0SJianzhou Zhao 721fb612d0SJianzhou Zhao DFsanThreadLocalMallocStorage malloc_storage_; 730f3fd3b2SJianzhou Zhao }; 740f3fd3b2SJianzhou Zhao 750f3fd3b2SJianzhou Zhao DFsanThread *GetCurrentThread(); 760f3fd3b2SJianzhou Zhao void SetCurrentThread(DFsanThread *t); 770f3fd3b2SJianzhou Zhao void DFsanTSDInit(void (*destructor)(void *tsd)); 780f3fd3b2SJianzhou Zhao void DFsanTSDDtor(void *tsd); 790f3fd3b2SJianzhou Zhao 800f3fd3b2SJianzhou Zhao } // namespace __dfsan 810f3fd3b2SJianzhou Zhao 820f3fd3b2SJianzhou Zhao #endif // DFSAN_THREAD_H 83