1 //===-- msan_thread.h -------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is a part of MemorySanitizer. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef MSAN_THREAD_H 14 #define MSAN_THREAD_H 15 16 #include "msan_allocator.h" 17 #include "sanitizer_common/sanitizer_common.h" 18 #include "sanitizer_common/sanitizer_posix.h" 19 namespace __msan { 20 21 class MsanThread { 22 public: 23 static MsanThread *Create(thread_callback_t start_routine, void *arg); 24 static void TSDDtor(void *tsd); 25 void Destroy(); 26 27 void Init(); // Should be called from the thread itself. 28 thread_return_t ThreadStart(); 29 30 uptr stack_top(); 31 uptr stack_bottom(); tls_begin()32 uptr tls_begin() { return tls_begin_; } tls_end()33 uptr tls_end() { return tls_end_; } IsMainThread()34 bool IsMainThread() { return start_routine_ == nullptr; } 35 36 bool AddrIsInStack(uptr addr); 37 InSignalHandler()38 bool InSignalHandler() { return in_signal_handler_; } EnterSignalHandler()39 void EnterSignalHandler() { in_signal_handler_++; } LeaveSignalHandler()40 void LeaveSignalHandler() { in_signal_handler_--; } 41 42 void StartSwitchFiber(uptr bottom, uptr size); 43 void FinishSwitchFiber(uptr *bottom_old, uptr *size_old); 44 malloc_storage()45 MsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; } 46 47 int destructor_iterations_; 48 __sanitizer_sigset_t starting_sigset_; 49 50 private: 51 // NOTE: There is no MsanThread constructor. It is allocated 52 // via mmap() and *must* be valid in zero-initialized state. 53 void SetThreadStackAndTls(); 54 void ClearShadowForThreadStackAndTLS(); 55 struct StackBounds { 56 uptr bottom; 57 uptr top; 58 }; 59 StackBounds GetStackBounds() const; 60 thread_callback_t start_routine_; 61 void *arg_; 62 63 bool stack_switching_; 64 65 StackBounds stack_; 66 StackBounds next_stack_; 67 68 uptr tls_begin_; 69 uptr tls_end_; 70 71 unsigned in_signal_handler_; 72 73 MsanThreadLocalMallocStorage malloc_storage_; 74 }; 75 76 MsanThread *GetCurrentThread(); 77 void SetCurrentThread(MsanThread *t); 78 79 } // namespace __msan 80 81 #endif // MSAN_THREAD_H 82