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(); |
32 | uptr tls_begin() { return tls_begin_; } |
33 | uptr tls_end() { return tls_end_; } |
34 | bool IsMainThread() { return start_routine_ == nullptr; } |
35 | |
36 | bool AddrIsInStack(uptr addr); |
37 | |
38 | bool InSignalHandler() { return in_signal_handler_; } |
39 | void EnterSignalHandler() { in_signal_handler_++; } |
40 | void LeaveSignalHandler() { in_signal_handler_--; } |
41 | |
42 | void StartSwitchFiber(uptr bottom, uptr size); |
43 | void FinishSwitchFiber(uptr *bottom_old, uptr *size_old); |
44 | |
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 | |