blob: 61b8a697ec74919c2cb001286ca7a90c41dba201 [file] [log] [blame]
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00001//===-- tsan_platform.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// This file is a part of ThreadSanitizer (TSan), a race detector.
11//
12// Platform-specific code.
13//===----------------------------------------------------------------------===//
14
15#ifndef TSAN_LINUX_H
16#define TSAN_LINUX_H
17#ifdef __linux__
18
19#include "tsan_rtl.h"
20
21#if __LP64__
22namespace __tsan {
23
24// TSAN_COMPAT_SHADOW is intended for COMPAT virtual memory layout,
25// when memory addresses are of the 0x2axxxxxxxxxx form.
26// The option is enabled with 'setarch x86_64 -L'.
27#if defined(TSAN_COMPAT_SHADOW) && TSAN_COMPAT_SHADOW
28
29static const uptr kLinuxAppMemBeg = 0x2a0000000000ULL;
30static const uptr kLinuxAppMemEnd = 0x7fffffffffffULL;
31
32#else
33
34static const uptr kLinuxAppMemBeg = 0x7ef000000000ULL;
35static const uptr kLinuxAppMemEnd = 0x7fffffffffffULL;
36
37#endif
38
39static const uptr kLinuxAppMemMsk = 0x7c0000000000ULL;
40
41// This has to be a macro to allow constant initialization of constants below.
42#define MemToShadow(addr) \
43 (((addr) & ~(kLinuxAppMemMsk | (kShadowCell - 1))) * kShadowCnt)
44
45static const uptr kLinuxShadowBeg = MemToShadow(kLinuxAppMemBeg);
46static const uptr kLinuxShadowEnd =
47 MemToShadow(kLinuxAppMemEnd) | (kPageSize - 1);
48
49static inline bool IsAppMem(uptr mem) {
50 return mem >= kLinuxAppMemBeg && mem <= kLinuxAppMemEnd;
51}
52
53static inline bool IsShadowMem(uptr mem) {
54 return mem >= kLinuxShadowBeg && mem <= kLinuxShadowEnd;
55}
56
57static inline uptr ShadowToMem(uptr shadow) {
58 CHECK(IsShadowMem(shadow));
59#if defined(TSAN_COMPAT_SHADOW) && TSAN_COMPAT_SHADOW
60 // COMPAT mapping is not quite one-to-one.
61 return (shadow / kShadowCnt) | 0x280000000000ULL;
62#else
63 return (shadow / kShadowCnt) | kLinuxAppMemMsk;
64#endif
65}
66
Dmitry Vyukov15710c92012-05-22 11:33:03 +000067uptr GetShadowMemoryConsumption();
68
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000069const char *InitializePlatform();
70void FinalizePlatform();
71int GetPid();
72
Dmitry Vyukov15710c92012-05-22 11:33:03 +000073void internal_yield();
74void internal_sleep_ms(u32 ms);
75
76void internal_start_thread(void(*func)(void*), void *arg);
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000077
78typedef int fd_t;
79const fd_t kInvalidFd = -1;
80fd_t internal_open(const char *name, bool write);
81void internal_close(fd_t fd);
82uptr internal_filesize(fd_t fd); // -1 on error.
83uptr internal_read(fd_t fd, void *p, uptr size);
84uptr internal_write(fd_t fd, const void *p, uptr size);
85const char *internal_getpwd();
86
87uptr GetTlsSize();
88void GetThreadStackAndTls(uptr *stk_addr, uptr *stk_size,
89 uptr *tls_addr, uptr *tls_size);
90
91} // namespace __tsan
92
93#else // __LP64__
94# error "Only 64-bit is supported"
95#endif
96
97#endif // __linux__
98#endif // TSAN_LINUX_H