]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- sanitizer_linux.h ---------------------------------------*- C++ -*-===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // Linux-specific syscall wrappers and classes. | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | #ifndef SANITIZER_LINUX_H | |
14 | #define SANITIZER_LINUX_H | |
15 | ||
16 | #include "sanitizer_platform.h" | |
17 | #if SANITIZER_FREEBSD || SANITIZER_LINUX | |
18 | #include "sanitizer_common.h" | |
19 | #include "sanitizer_internal_defs.h" | |
92a42be0 | 20 | #include "sanitizer_posix.h" |
1a4d82fc JJ |
21 | #include "sanitizer_platform_limits_posix.h" |
22 | ||
23 | struct link_map; // Opaque type returned by dlopen(). | |
24 | struct sigaltstack; | |
25 | ||
26 | namespace __sanitizer { | |
27 | // Dirent structure for getdents(). Note that this structure is different from | |
28 | // the one in <dirent.h>, which is used by readdir(). | |
29 | struct linux_dirent; | |
30 | ||
31 | // Syscall wrappers. | |
32 | uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count); | |
33 | uptr internal_sigaltstack(const struct sigaltstack* ss, | |
34 | struct sigaltstack* oss); | |
35 | uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set, | |
36 | __sanitizer_sigset_t *oldset); | |
37 | void internal_sigfillset(__sanitizer_sigset_t *set); | |
38 | ||
39 | // Linux-only syscalls. | |
40 | #if SANITIZER_LINUX | |
41 | uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5); | |
42 | // Used only by sanitizer_stoptheworld. Signal handlers that are actually used | |
43 | // (like the process-wide error reporting SEGV handler) must use | |
44 | // internal_sigaction instead. | |
45 | int internal_sigaction_norestorer(int signum, const void *act, void *oldact); | |
46 | void internal_sigdelset(__sanitizer_sigset_t *set, int signum); | |
92a42be0 | 47 | #if defined(__x86_64__) || defined(__mips__) || defined(__aarch64__) |
1a4d82fc JJ |
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 | |
51 | #endif // SANITIZER_LINUX | |
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 | ||
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 | ||
1a4d82fc JJ |
84 | // Call cb for each region mapped by map. |
85 | void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)); | |
86 | } // namespace __sanitizer | |
87 | ||
88 | #endif // SANITIZER_FREEBSD || SANITIZER_LINUX | |
89 | #endif // SANITIZER_LINUX_H |