]>
Commit | Line | Data |
---|---|---|
ef1b3fda KS |
1 | //===-- sanitizer_linux.h ---------------------------------------*- C++ -*-===// |
2 | // | |
3 | // This file is distributed under the University of Illinois Open Source | |
4 | // License. See LICENSE.TXT for details. | |
5 | // | |
6 | //===----------------------------------------------------------------------===// | |
7 | // | |
8 | // Linux-specific syscall wrappers and classes. | |
9 | // | |
10 | //===----------------------------------------------------------------------===// | |
11 | #ifndef SANITIZER_LINUX_H | |
12 | #define SANITIZER_LINUX_H | |
13 | ||
14 | #include "sanitizer_platform.h" | |
dee5ea7a | 15 | #if SANITIZER_FREEBSD || SANITIZER_LINUX |
ef1b3fda KS |
16 | #include "sanitizer_common.h" |
17 | #include "sanitizer_internal_defs.h" | |
696d846a | 18 | #include "sanitizer_posix.h" |
df77f0e4 | 19 | #include "sanitizer_platform_limits_posix.h" |
ef1b3fda KS |
20 | |
21 | struct link_map; // Opaque type returned by dlopen(). | |
ef1b3fda KS |
22 | |
23 | namespace __sanitizer { | |
24 | // Dirent structure for getdents(). Note that this structure is different from | |
25 | // the one in <dirent.h>, which is used by readdir(). | |
26 | struct linux_dirent; | |
27 | ||
28 | // Syscall wrappers. | |
29 | uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count); | |
144e36a7 | 30 | uptr internal_sigaltstack(const void* ss, void* oss); |
dee5ea7a KS |
31 | uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set, |
32 | __sanitizer_sigset_t *oldset); | |
df77f0e4 | 33 | |
dee5ea7a KS |
34 | // Linux-only syscalls. |
35 | #if SANITIZER_LINUX | |
36 | uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5); | |
37 | // Used only by sanitizer_stoptheworld. Signal handlers that are actually used | |
38 | // (like the process-wide error reporting SEGV handler) must use | |
39 | // internal_sigaction instead. | |
40 | int internal_sigaction_norestorer(int signum, const void *act, void *oldact); | |
10189819 MO |
41 | #if (defined(__x86_64__) || SANITIZER_MIPS64) && !SANITIZER_GO |
42 | // Uses a raw system call to avoid interceptors. | |
43 | int internal_sigaction_syscall(int signum, const void *act, void *oldact); | |
44 | #endif | |
dee5ea7a | 45 | void internal_sigdelset(__sanitizer_sigset_t *set, int signum); |
10189819 MO |
46 | #if defined(__x86_64__) || defined(__mips__) || defined(__aarch64__) \ |
47 | || defined(__powerpc64__) || defined(__s390__) | |
ef1b3fda KS |
48 | uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg, |
49 | int *parent_tidptr, void *newtls, int *child_tidptr); | |
50 | #endif | |
dee5ea7a | 51 | #endif // SANITIZER_LINUX |
ef1b3fda KS |
52 | |
53 | // This class reads thread IDs from /proc/<pid>/task using only syscalls. | |
54 | class ThreadLister { | |
55 | public: | |
56 | explicit ThreadLister(int pid); | |
57 | ~ThreadLister(); | |
58 | // GetNextTID returns -1 if the list of threads is exhausted, or if there has | |
59 | // been an error. | |
60 | int GetNextTID(); | |
61 | void Reset(); | |
62 | bool error(); | |
63 | ||
64 | private: | |
65 | bool GetDirectoryEntries(); | |
66 | ||
67 | int pid_; | |
68 | int descriptor_; | |
69 | InternalScopedBuffer<char> buffer_; | |
70 | bool error_; | |
71 | struct linux_dirent* entry_; | |
72 | int bytes_read_; | |
73 | }; | |
74 | ||
ef1b3fda KS |
75 | // Exposed for testing. |
76 | uptr ThreadDescriptorSize(); | |
77 | uptr ThreadSelf(); | |
78 | uptr ThreadSelfOffset(); | |
79 | ||
80 | // Matches a library's file name against a base name (stripping path and version | |
81 | // information). | |
82 | bool LibraryNameIs(const char *full_name, const char *base_name); | |
83 | ||
ef1b3fda KS |
84 | // Call cb for each region mapped by map. |
85 | void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)); | |
ef1b3fda KS |
86 | } // namespace __sanitizer |
87 | ||
dee5ea7a | 88 | #endif // SANITIZER_FREEBSD || SANITIZER_LINUX |
ef1b3fda | 89 | #endif // SANITIZER_LINUX_H |