You've already forked linux-packaging-mono
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
cmake
docs
include
lib
BlocksRuntime
asan
builtins
cfi
dfsan
esan
fuzzer
hwasan
interception
lsan
msan
profile
safestack
sanitizer_common
scripts
symbolizer
tests
.clang-format
.clang-tidy
CMakeLists.txt
sancov_begin.S
sancov_end.S
sancov_flags.cc
sancov_flags.h
sancov_flags.inc
sanitizer_addrhashmap.h
sanitizer_allocator.cc
sanitizer_allocator.h
sanitizer_allocator_bytemap.h
sanitizer_allocator_checks.cc
sanitizer_allocator_checks.h
sanitizer_allocator_combined.h
sanitizer_allocator_interface.h
sanitizer_allocator_internal.h
sanitizer_allocator_local_cache.h
sanitizer_allocator_primary32.h
sanitizer_allocator_primary64.h
sanitizer_allocator_secondary.h
sanitizer_allocator_size_class_map.h
sanitizer_allocator_stats.h
sanitizer_asm.h
sanitizer_atomic.h
sanitizer_atomic_clang.h
sanitizer_atomic_clang_mips.h
sanitizer_atomic_clang_other.h
sanitizer_atomic_clang_x86.h
sanitizer_atomic_msvc.h
sanitizer_bitvector.h
sanitizer_bvgraph.h
sanitizer_common.cc
sanitizer_common.h
sanitizer_common_interceptors.inc.REMOVED.git-id
sanitizer_common_interceptors_format.inc
sanitizer_common_interceptors_ioctl.inc
sanitizer_common_interface.inc
sanitizer_common_interface_posix.inc
sanitizer_common_libcdep.cc
sanitizer_common_nolibc.cc
sanitizer_common_syscalls.inc
sanitizer_coverage_fuchsia.cc
sanitizer_coverage_interface.inc
sanitizer_coverage_libcdep_new.cc
sanitizer_coverage_win_dll_thunk.cc
sanitizer_coverage_win_dynamic_runtime_thunk.cc
sanitizer_coverage_win_sections.cc
sanitizer_coverage_win_weak_interception.cc
sanitizer_dbghelp.h
sanitizer_deadlock_detector.h
sanitizer_deadlock_detector1.cc
sanitizer_deadlock_detector2.cc
sanitizer_deadlock_detector_interface.h
sanitizer_errno.cc
sanitizer_errno.h
sanitizer_errno_codes.h
sanitizer_file.cc
sanitizer_file.h
sanitizer_flag_parser.cc
sanitizer_flag_parser.h
sanitizer_flags.cc
sanitizer_flags.h
sanitizer_flags.inc
sanitizer_freebsd.h
sanitizer_fuchsia.cc
sanitizer_fuchsia.h
sanitizer_getauxval.h
sanitizer_interface_internal.h
sanitizer_internal_defs.h
sanitizer_lfstack.h
sanitizer_libc.cc
sanitizer_libc.h
sanitizer_libignore.cc
sanitizer_libignore.h
sanitizer_linux.cc
sanitizer_linux.h
sanitizer_linux_libcdep.cc
sanitizer_linux_mips64.S
sanitizer_linux_s390.cc
sanitizer_linux_x86_64.S
sanitizer_list.h
sanitizer_mac.cc
sanitizer_mac.h
sanitizer_mac_libcdep.cc
sanitizer_malloc_mac.inc
sanitizer_mutex.h
sanitizer_persistent_allocator.cc
sanitizer_persistent_allocator.h
sanitizer_placement_new.h
sanitizer_platform.h
sanitizer_platform_interceptors.h
sanitizer_platform_limits_linux.cc
sanitizer_platform_limits_netbsd.cc
sanitizer_platform_limits_netbsd.h
sanitizer_platform_limits_posix.cc
sanitizer_platform_limits_posix.h
sanitizer_platform_limits_solaris.cc
sanitizer_platform_limits_solaris.h
sanitizer_posix.cc
sanitizer_posix.h
sanitizer_posix_libcdep.cc
sanitizer_printf.cc
sanitizer_procmaps.h
sanitizer_procmaps_common.cc
sanitizer_procmaps_freebsd.cc
sanitizer_procmaps_linux.cc
sanitizer_procmaps_mac.cc
sanitizer_procmaps_solaris.cc
sanitizer_quarantine.h
sanitizer_report_decorator.h
sanitizer_signal_interceptors.inc
sanitizer_solaris.cc
sanitizer_stackdepot.cc
sanitizer_stackdepot.h
sanitizer_stackdepotbase.h
sanitizer_stacktrace.cc
sanitizer_stacktrace.h
sanitizer_stacktrace_libcdep.cc
sanitizer_stacktrace_printer.cc
sanitizer_stacktrace_printer.h
sanitizer_stoptheworld.h
sanitizer_stoptheworld_linux_libcdep.cc
sanitizer_stoptheworld_mac.cc
sanitizer_suppressions.cc
sanitizer_suppressions.h
sanitizer_symbolizer.cc
sanitizer_symbolizer.h
sanitizer_symbolizer_fuchsia.cc
sanitizer_symbolizer_internal.h
sanitizer_symbolizer_libbacktrace.cc
sanitizer_symbolizer_libbacktrace.h
sanitizer_symbolizer_libcdep.cc
sanitizer_symbolizer_mac.cc
sanitizer_symbolizer_mac.h
sanitizer_symbolizer_posix_libcdep.cc
sanitizer_symbolizer_win.cc
sanitizer_syscall_generic.inc
sanitizer_syscall_linux_aarch64.inc
sanitizer_syscall_linux_arm.inc
sanitizer_syscall_linux_x86_64.inc
sanitizer_termination.cc
sanitizer_thread_registry.cc
sanitizer_thread_registry.h
sanitizer_tls_get_addr.cc
sanitizer_tls_get_addr.h
sanitizer_unwind_linux_libcdep.cc
sanitizer_vector.h
sanitizer_win.cc
sanitizer_win.h
sanitizer_win_defs.h
sanitizer_win_dll_thunk.cc
sanitizer_win_dll_thunk.h
sanitizer_win_dynamic_runtime_thunk.cc
sanitizer_win_weak_interception.cc
sanitizer_win_weak_interception.h
weak_symbols.txt
scudo
stats
tsan
ubsan
ubsan_minimal
xray
CMakeLists.txt
test
unittests
www
.arcconfig
.gitignore
CMakeLists.txt
CODE_OWNERS.TXT
CREDITS.TXT
LICENSE.TXT
README.txt
eng
libcxx
libcxxabi
libunwind
lld
lldb
llvm
nuget
openmp
polly
Directory.Build.props
Directory.Build.targets
NuGet.config
azure-pipelines.yml
build.cmd
build.sh
dir.common.props
global.json
llvm.proj
mxe-Win64.cmake.in
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
151 lines
4.8 KiB
C
151 lines
4.8 KiB
C
![]() |
//===-- sanitizer_linux.h ---------------------------------------*- C++ -*-===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// Linux-specific syscall wrappers and classes.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
#ifndef SANITIZER_LINUX_H
|
||
|
#define SANITIZER_LINUX_H
|
||
|
|
||
|
#include "sanitizer_platform.h"
|
||
|
#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
|
||
|
SANITIZER_SOLARIS
|
||
|
#include "sanitizer_common.h"
|
||
|
#include "sanitizer_internal_defs.h"
|
||
|
#include "sanitizer_platform_limits_netbsd.h"
|
||
|
#include "sanitizer_platform_limits_posix.h"
|
||
|
#include "sanitizer_platform_limits_solaris.h"
|
||
|
#include "sanitizer_posix.h"
|
||
|
|
||
|
struct link_map; // Opaque type returned by dlopen().
|
||
|
|
||
|
namespace __sanitizer {
|
||
|
// Dirent structure for getdents(). Note that this structure is different from
|
||
|
// the one in <dirent.h>, which is used by readdir().
|
||
|
struct linux_dirent;
|
||
|
|
||
|
struct ProcSelfMapsBuff {
|
||
|
char *data;
|
||
|
uptr mmaped_size;
|
||
|
uptr len;
|
||
|
};
|
||
|
|
||
|
struct MemoryMappingLayoutData {
|
||
|
ProcSelfMapsBuff proc_self_maps;
|
||
|
const char *current;
|
||
|
};
|
||
|
|
||
|
void ReadProcMaps(ProcSelfMapsBuff *proc_maps);
|
||
|
|
||
|
// Syscall wrappers.
|
||
|
uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
|
||
|
uptr internal_sigaltstack(const void* ss, void* oss);
|
||
|
uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
|
||
|
__sanitizer_sigset_t *oldset);
|
||
|
uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp);
|
||
|
|
||
|
// Linux-only syscalls.
|
||
|
#if SANITIZER_LINUX
|
||
|
uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5);
|
||
|
// Used only by sanitizer_stoptheworld. Signal handlers that are actually used
|
||
|
// (like the process-wide error reporting SEGV handler) must use
|
||
|
// internal_sigaction instead.
|
||
|
int internal_sigaction_norestorer(int signum, const void *act, void *oldact);
|
||
|
#if (defined(__x86_64__) || SANITIZER_MIPS64) && !SANITIZER_GO
|
||
|
// Uses a raw system call to avoid interceptors.
|
||
|
int internal_sigaction_syscall(int signum, const void *act, void *oldact);
|
||
|
#endif
|
||
|
void internal_sigdelset(__sanitizer_sigset_t *set, int signum);
|
||
|
#if defined(__x86_64__) || defined(__mips__) || defined(__aarch64__) \
|
||
|
|| defined(__powerpc64__) || defined(__s390__) || defined(__i386__) \
|
||
|
|| defined(__arm__)
|
||
|
uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
|
||
|
int *parent_tidptr, void *newtls, int *child_tidptr);
|
||
|
#endif
|
||
|
#endif // SANITIZER_LINUX
|
||
|
|
||
|
// This class reads thread IDs from /proc/<pid>/task using only syscalls.
|
||
|
class ThreadLister {
|
||
|
public:
|
||
|
explicit ThreadLister(int pid);
|
||
|
~ThreadLister();
|
||
|
// GetNextTID returns -1 if the list of threads is exhausted, or if there has
|
||
|
// been an error.
|
||
|
int GetNextTID();
|
||
|
void Reset();
|
||
|
bool error();
|
||
|
|
||
|
private:
|
||
|
bool GetDirectoryEntries();
|
||
|
|
||
|
int pid_;
|
||
|
int descriptor_;
|
||
|
InternalScopedBuffer<char> buffer_;
|
||
|
bool error_;
|
||
|
struct linux_dirent* entry_;
|
||
|
int bytes_read_;
|
||
|
};
|
||
|
|
||
|
// Exposed for testing.
|
||
|
uptr ThreadDescriptorSize();
|
||
|
uptr ThreadSelf();
|
||
|
uptr ThreadSelfOffset();
|
||
|
|
||
|
// Matches a library's file name against a base name (stripping path and version
|
||
|
// information).
|
||
|
bool LibraryNameIs(const char *full_name, const char *base_name);
|
||
|
|
||
|
// Call cb for each region mapped by map.
|
||
|
void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));
|
||
|
|
||
|
#if SANITIZER_ANDROID
|
||
|
|
||
|
#if defined(__aarch64__)
|
||
|
# define __get_tls() \
|
||
|
({ void** __v; __asm__("mrs %0, tpidr_el0" : "=r"(__v)); __v; })
|
||
|
#elif defined(__arm__)
|
||
|
# define __get_tls() \
|
||
|
({ void** __v; __asm__("mrc p15, 0, %0, c13, c0, 3" : "=r"(__v)); __v; })
|
||
|
#elif defined(__mips__)
|
||
|
// On mips32r1, this goes via a kernel illegal instruction trap that's
|
||
|
// optimized for v1.
|
||
|
# define __get_tls() \
|
||
|
({ register void** __v asm("v1"); \
|
||
|
__asm__(".set push\n" \
|
||
|
".set mips32r2\n" \
|
||
|
"rdhwr %0,$29\n" \
|
||
|
".set pop\n" : "=r"(__v)); \
|
||
|
__v; })
|
||
|
#elif defined(__i386__)
|
||
|
# define __get_tls() \
|
||
|
({ void** __v; __asm__("movl %%gs:0, %0" : "=r"(__v)); __v; })
|
||
|
#elif defined(__x86_64__)
|
||
|
# define __get_tls() \
|
||
|
({ void** __v; __asm__("mov %%fs:0, %0" : "=r"(__v)); __v; })
|
||
|
#else
|
||
|
#error "Unsupported architecture."
|
||
|
#endif
|
||
|
|
||
|
// The Android Bionic team has allocated a TLS slot for TSan starting with N,
|
||
|
// given that Android currently doesn't support ELF TLS. It is used to store
|
||
|
// Sanitizers thread specific data.
|
||
|
static const int TLS_SLOT_TSAN = 8;
|
||
|
|
||
|
ALWAYS_INLINE uptr *get_android_tls_ptr() {
|
||
|
return reinterpret_cast<uptr *>(&__get_tls()[TLS_SLOT_TSAN]);
|
||
|
}
|
||
|
|
||
|
#endif // SANITIZER_ANDROID
|
||
|
|
||
|
} // namespace __sanitizer
|
||
|
|
||
|
#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD ||
|
||
|
// SANITIZER_SOLARIS
|
||
|
#endif // SANITIZER_LINUX_H
|