Daily bump.
[official-gcc.git] / libsanitizer / tsan / tsan_platform.h
blobd9ed3979b69eaf5fd68eb7e13f0a87b452058aff
1 //===-- tsan_platform.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 ThreadSanitizer (TSan), a race detector.
11 // Platform-specific code.
12 //===----------------------------------------------------------------------===//
14 #ifndef TSAN_PLATFORM_H
15 #define TSAN_PLATFORM_H
17 #if !defined(__LP64__) && !defined(_WIN64)
18 # error "Only 64-bit is supported"
19 #endif
21 #include "sanitizer_common/sanitizer_common.h"
22 #include "tsan_defs.h"
24 namespace __tsan {
26 enum {
27 // App memory is not mapped onto shadow memory range.
28 kBrokenMapping = 1 << 0,
29 // Mapping app memory and back does not produce the same address,
30 // this can lead to wrong addresses in reports and potentially
31 // other bad consequences.
32 kBrokenReverseMapping = 1 << 1,
33 // Mapping is non-linear for linear user range.
34 // This is bad and can lead to unpredictable memory corruptions, etc
35 // because range access functions assume linearity.
36 kBrokenLinearity = 1 << 2,
37 // Meta for an app region overlaps with the meta of another app region.
38 // This is determined by recomputing the individual meta regions for
39 // each app region.
41 // N.B. There is no "kBrokenReverseMetaMapping" constant because there
42 // is no MetaToMem function. However, note that (!kBrokenLinearity
43 // && !kBrokenAliasedMetas) implies that MemToMeta is invertible.
44 kBrokenAliasedMetas = 1 << 3,
48 C/C++ on linux/x86_64 and freebsd/x86_64
49 0000 0000 1000 - 0200 0000 0000: main binary and/or MAP_32BIT mappings (2TB)
50 0200 0000 0000 - 1000 0000 0000: -
51 1000 0000 0000 - 3000 0000 0000: shadow (32TB)
52 3000 0000 0000 - 3800 0000 0000: metainfo (memory blocks and sync objects; 8TB)
53 3800 0000 0000 - 5500 0000 0000: -
54 5500 0000 0000 - 5a00 0000 0000: pie binaries without ASLR or on 4.1+ kernels
55 5a00 0000 0000 - 7200 0000 0000: -
56 7200 0000 0000 - 7300 0000 0000: heap (1TB)
57 7300 0000 0000 - 7a00 0000 0000: -
58 7a00 0000 0000 - 8000 0000 0000: modules and main thread stack (6TB)
60 C/C++ on netbsd/amd64 can reuse the same mapping:
61 * The address space starts from 0x1000 (option with 0x0) and ends with
62 0x7f7ffffff000.
63 * LoAppMem-kHeapMemEnd can be reused as it is.
64 * No VDSO support.
65 * No MidAppMem region.
66 * No additional HeapMem region.
67 * HiAppMem contains the stack, loader, shared libraries and heap.
68 * Stack on NetBSD/amd64 has prereserved 128MB.
69 * Heap grows downwards (top-down).
70 * ASLR must be disabled per-process or globally.
72 struct Mapping48AddressSpace {
73 static const uptr kMetaShadowBeg = 0x300000000000ull;
74 static const uptr kMetaShadowEnd = 0x380000000000ull;
75 static const uptr kShadowBeg = 0x100000000000ull;
76 static const uptr kShadowEnd = 0x300000000000ull;
77 static const uptr kHeapMemBeg = 0x720000000000ull;
78 static const uptr kHeapMemEnd = 0x730000000000ull;
79 static const uptr kLoAppMemBeg = 0x000000001000ull;
80 static const uptr kLoAppMemEnd = 0x020000000000ull;
81 static const uptr kMidAppMemBeg = 0x550000000000ull;
82 static const uptr kMidAppMemEnd = 0x5a0000000000ull;
83 static const uptr kHiAppMemBeg = 0x7a0000000000ull;
84 static const uptr kHiAppMemEnd = 0x800000000000ull;
85 static const uptr kShadowMsk = 0x700000000000ull;
86 static const uptr kShadowXor = 0x000000000000ull;
87 static const uptr kShadowAdd = 0x100000000000ull;
88 static const uptr kVdsoBeg = 0xf000000000000000ull;
92 C/C++ on linux/mips64 (40-bit VMA)
93 0000 0000 00 - 0100 0000 00: - (4 GB)
94 0100 0000 00 - 0200 0000 00: main binary (4 GB)
95 0200 0000 00 - 1200 0000 00: - (64 GB)
96 1200 0000 00 - 2200 0000 00: shadow (64 GB)
97 2200 0000 00 - 4000 0000 00: - (120 GB)
98 4000 0000 00 - 5000 0000 00: metainfo (memory blocks and sync objects) (64 GB)
99 5000 0000 00 - aa00 0000 00: - (360 GB)
100 aa00 0000 00 - ab00 0000 00: main binary (PIE) (4 GB)
101 ab00 0000 00 - fe00 0000 00: - (332 GB)
102 fe00 0000 00 - ff00 0000 00: heap (4 GB)
103 ff00 0000 00 - ff80 0000 00: - (2 GB)
104 ff80 0000 00 - ffff ffff ff: modules and main thread stack (<2 GB)
106 struct MappingMips64_40 {
107 static const uptr kMetaShadowBeg = 0x4000000000ull;
108 static const uptr kMetaShadowEnd = 0x5000000000ull;
109 static const uptr kShadowBeg = 0x1200000000ull;
110 static const uptr kShadowEnd = 0x2200000000ull;
111 static const uptr kHeapMemBeg = 0xfe00000000ull;
112 static const uptr kHeapMemEnd = 0xff00000000ull;
113 static const uptr kLoAppMemBeg = 0x0100000000ull;
114 static const uptr kLoAppMemEnd = 0x0200000000ull;
115 static const uptr kMidAppMemBeg = 0xaa00000000ull;
116 static const uptr kMidAppMemEnd = 0xab00000000ull;
117 static const uptr kHiAppMemBeg = 0xff80000000ull;
118 static const uptr kHiAppMemEnd = 0xffffffffffull;
119 static const uptr kShadowMsk = 0xf800000000ull;
120 static const uptr kShadowXor = 0x0800000000ull;
121 static const uptr kShadowAdd = 0x0000000000ull;
122 static const uptr kVdsoBeg = 0xfffff00000ull;
126 C/C++ on Darwin/iOS/ARM64 (36-bit VMA, 64 GB VM)
127 0000 0000 00 - 0100 0000 00: - (4 GB)
128 0100 0000 00 - 0200 0000 00: main binary, modules, thread stacks (4 GB)
129 0200 0000 00 - 0300 0000 00: heap (4 GB)
130 0300 0000 00 - 0400 0000 00: - (4 GB)
131 0400 0000 00 - 0800 0000 00: shadow memory (16 GB)
132 0800 0000 00 - 0d00 0000 00: - (20 GB)
133 0d00 0000 00 - 0e00 0000 00: metainfo (4 GB)
134 0e00 0000 00 - 1000 0000 00: -
136 struct MappingAppleAarch64 {
137 static const uptr kLoAppMemBeg = 0x0100000000ull;
138 static const uptr kLoAppMemEnd = 0x0200000000ull;
139 static const uptr kHeapMemBeg = 0x0200000000ull;
140 static const uptr kHeapMemEnd = 0x0300000000ull;
141 static const uptr kShadowBeg = 0x0400000000ull;
142 static const uptr kShadowEnd = 0x0800000000ull;
143 static const uptr kMetaShadowBeg = 0x0d00000000ull;
144 static const uptr kMetaShadowEnd = 0x0e00000000ull;
145 static const uptr kHiAppMemBeg = 0x0fc0000000ull;
146 static const uptr kHiAppMemEnd = 0x0fc0000000ull;
147 static const uptr kShadowMsk = 0x0ull;
148 static const uptr kShadowXor = 0x0ull;
149 static const uptr kShadowAdd = 0x0200000000ull;
150 static const uptr kVdsoBeg = 0x7000000000000000ull;
151 static const uptr kMidAppMemBeg = 0;
152 static const uptr kMidAppMemEnd = 0;
156 C/C++ on linux/aarch64 (39-bit VMA)
157 0000 0010 00 - 0500 0000 00: main binary (20 GB)
158 0100 0000 00 - 2000 0000 00: -
159 2000 0000 00 - 4000 0000 00: shadow memory (128 GB)
160 4000 0000 00 - 4800 0000 00: metainfo (32 GB)
161 4800 0000 00 - 5500 0000 00: -
162 5500 0000 00 - 5a00 0000 00: main binary (PIE) (20 GB)
163 5600 0000 00 - 7c00 0000 00: -
164 7a00 0000 00 - 7d00 0000 00: heap (12 GB)
165 7d00 0000 00 - 7fff ffff ff: modules and main thread stack (12 GB)
167 struct MappingAarch64_39 {
168 static const uptr kLoAppMemBeg = 0x0000001000ull;
169 static const uptr kLoAppMemEnd = 0x0500000000ull;
170 static const uptr kShadowBeg = 0x2000000000ull;
171 static const uptr kShadowEnd = 0x4000000000ull;
172 static const uptr kMetaShadowBeg = 0x4000000000ull;
173 static const uptr kMetaShadowEnd = 0x4800000000ull;
174 static const uptr kMidAppMemBeg = 0x5500000000ull;
175 static const uptr kMidAppMemEnd = 0x5a00000000ull;
176 static const uptr kHeapMemBeg = 0x7a00000000ull;
177 static const uptr kHeapMemEnd = 0x7d00000000ull;
178 static const uptr kHiAppMemBeg = 0x7d00000000ull;
179 static const uptr kHiAppMemEnd = 0x7fffffffffull;
180 static const uptr kShadowMsk = 0x7000000000ull;
181 static const uptr kShadowXor = 0x1000000000ull;
182 static const uptr kShadowAdd = 0x0000000000ull;
183 static const uptr kVdsoBeg = 0x7f00000000ull;
187 C/C++ on linux/aarch64 (42-bit VMA)
188 00000 0010 00 - 02000 0000 00: main binary (128 GB)
189 02000 0000 00 - 08000 0000 00: -
190 10000 0000 00 - 20000 0000 00: shadow memory (1024 GB)
191 20000 0000 00 - 24000 0000 00: metainfo (256 GB)
192 24000 0000 00 - 2aa00 0000 00: -
193 2aa00 0000 00 - 2c000 0000 00: main binary (PIE) (88 GB)
194 2c000 0000 00 - 3c000 0000 00: -
195 3c000 0000 00 - 3f000 0000 00: heap (192 GB)
196 3f000 0000 00 - 3ffff ffff ff: modules and main thread stack (64 GB)
198 struct MappingAarch64_42 {
199 static const uptr kLoAppMemBeg = 0x00000001000ull;
200 static const uptr kLoAppMemEnd = 0x02000000000ull;
201 static const uptr kShadowBeg = 0x10000000000ull;
202 static const uptr kShadowEnd = 0x20000000000ull;
203 static const uptr kMetaShadowBeg = 0x20000000000ull;
204 static const uptr kMetaShadowEnd = 0x24000000000ull;
205 static const uptr kMidAppMemBeg = 0x2aa00000000ull;
206 static const uptr kMidAppMemEnd = 0x2c000000000ull;
207 static const uptr kHeapMemBeg = 0x3c000000000ull;
208 static const uptr kHeapMemEnd = 0x3f000000000ull;
209 static const uptr kHiAppMemBeg = 0x3f000000000ull;
210 static const uptr kHiAppMemEnd = 0x3ffffffffffull;
211 static const uptr kShadowMsk = 0x38000000000ull;
212 static const uptr kShadowXor = 0x08000000000ull;
213 static const uptr kShadowAdd = 0x00000000000ull;
214 static const uptr kVdsoBeg = 0x37f00000000ull;
218 C/C++ on linux/aarch64 (48-bit VMA)
219 0000 0000 1000 - 0a00 0000 0000: main binary (10240 GB)
220 0a00 0000 1000 - 1554 0000 0000: -
221 1554 0000 1000 - 5400 0000 0000: shadow memory (64176 GB)
222 5400 0000 1000 - 8000 0000 0000: -
223 8000 0000 1000 - 0a00 0000 0000: metainfo (32768 GB)
224 a000 0000 1000 - aaaa 0000 0000: -
225 aaaa 0000 1000 - ac00 0000 0000: main binary (PIE) (1368 GB)
226 ac00 0000 1000 - fc00 0000 0000: -
227 fc00 0000 1000 - ffff ffff ffff: modules and main thread stack (4096 GB)
229 N.B. the shadow memory region has a strange start address, because it
230 contains the shadows for the mid, high and low app regions (in this
231 unusual order).
233 struct MappingAarch64_48 {
234 static const uptr kLoAppMemBeg = 0x0000000001000ull;
235 static const uptr kLoAppMemEnd = 0x00a0000000000ull;
236 static const uptr kShadowBeg = 0x0155400000000ull;
237 static const uptr kShadowEnd = 0x0540000000000ull;
238 static const uptr kMetaShadowBeg = 0x0800000000000ull;
239 static const uptr kMetaShadowEnd = 0x0a00000000000ull;
240 static const uptr kMidAppMemBeg = 0x0aaaa00000000ull;
241 static const uptr kMidAppMemEnd = 0x0ac0000000000ull;
242 static const uptr kHiAppMemBeg = 0x0fc0000000000ull;
243 static const uptr kHiAppMemEnd = 0x1000000000000ull;
244 static const uptr kHeapMemBeg = 0x0fc0000000000ull;
245 static const uptr kHeapMemEnd = 0x0fc0000000000ull;
246 static const uptr kShadowMsk = 0x0c00000000000ull;
247 static const uptr kShadowXor = 0x0200000000000ull;
248 static const uptr kShadowAdd = 0x0000000000000ull;
249 static const uptr kVdsoBeg = 0xffff000000000ull;
252 /* C/C++ on linux/loongarch64 (47-bit VMA)
253 0000 0000 4000 - 0080 0000 0000: main binary
254 0080 0000 0000 - 0100 0000 0000: -
255 0100 0000 0000 - 1000 0000 0000: shadow memory
256 1000 0000 0000 - 3000 0000 0000: -
257 3000 0000 0000 - 3400 0000 0000: metainfo
258 3400 0000 0000 - 5555 0000 0000: -
259 5555 0000 0000 - 5556 0000 0000: main binary (PIE)
260 5556 0000 0000 - 7ffe 0000 0000: -
261 7ffe 0000 0000 - 7fff 0000 0000: heap
262 7fff 0000 0000 - 7fff 8000 0000: -
263 7fff 8000 0000 - 8000 0000 0000: modules and main thread stack
265 struct MappingLoongArch64_47 {
266 static const uptr kMetaShadowBeg = 0x300000000000ull;
267 static const uptr kMetaShadowEnd = 0x340000000000ull;
268 static const uptr kShadowBeg = 0x010000000000ull;
269 static const uptr kShadowEnd = 0x100000000000ull;
270 static const uptr kHeapMemBeg = 0x7ffe00000000ull;
271 static const uptr kHeapMemEnd = 0x7fff00000000ull;
272 static const uptr kLoAppMemBeg = 0x000000004000ull;
273 static const uptr kLoAppMemEnd = 0x008000000000ull;
274 static const uptr kMidAppMemBeg = 0x555500000000ull;
275 static const uptr kMidAppMemEnd = 0x555600000000ull;
276 static const uptr kHiAppMemBeg = 0x7fff80000000ull;
277 static const uptr kHiAppMemEnd = 0x800000000000ull;
278 static const uptr kShadowMsk = 0x780000000000ull;
279 static const uptr kShadowXor = 0x040000000000ull;
280 static const uptr kShadowAdd = 0x000000000000ull;
281 static const uptr kVdsoBeg = 0x7fffffffc000ull;
285 C/C++ on linux/powerpc64 (44-bit VMA)
286 0000 0000 0100 - 0001 0000 0000: main binary
287 0001 0000 0000 - 0001 0000 0000: -
288 0001 0000 0000 - 0b00 0000 0000: shadow
289 0b00 0000 0000 - 0b00 0000 0000: -
290 0b00 0000 0000 - 0d00 0000 0000: metainfo (memory blocks and sync objects)
291 0d00 0000 0000 - 0f00 0000 0000: -
292 0f00 0000 0000 - 0f50 0000 0000: heap
293 0f50 0000 0000 - 0f60 0000 0000: -
294 0f60 0000 0000 - 1000 0000 0000: modules and main thread stack
296 struct MappingPPC64_44 {
297 static const uptr kBroken = kBrokenMapping | kBrokenReverseMapping |
298 kBrokenLinearity | kBrokenAliasedMetas;
299 static const uptr kMetaShadowBeg = 0x0b0000000000ull;
300 static const uptr kMetaShadowEnd = 0x0d0000000000ull;
301 static const uptr kShadowBeg = 0x000100000000ull;
302 static const uptr kShadowEnd = 0x0b0000000000ull;
303 static const uptr kLoAppMemBeg = 0x000000000100ull;
304 static const uptr kLoAppMemEnd = 0x000100000000ull;
305 static const uptr kHeapMemBeg = 0x0f0000000000ull;
306 static const uptr kHeapMemEnd = 0x0f5000000000ull;
307 static const uptr kHiAppMemBeg = 0x0f6000000000ull;
308 static const uptr kHiAppMemEnd = 0x100000000000ull; // 44 bits
309 static const uptr kShadowMsk = 0x0f0000000000ull;
310 static const uptr kShadowXor = 0x002100000000ull;
311 static const uptr kShadowAdd = 0x000000000000ull;
312 static const uptr kVdsoBeg = 0x3c0000000000000ull;
313 static const uptr kMidAppMemBeg = 0;
314 static const uptr kMidAppMemEnd = 0;
318 C/C++ on linux/powerpc64 (46-bit VMA)
319 0000 0000 1000 - 0100 0000 0000: main binary
320 0100 0000 0000 - 0200 0000 0000: -
321 0100 0000 0000 - 0800 0000 0000: shadow
322 0800 0000 0000 - 1000 0000 0000: -
323 1000 0000 0000 - 1200 0000 0000: metainfo (memory blocks and sync objects)
324 1200 0000 0000 - 3d00 0000 0000: -
325 3d00 0000 0000 - 3e00 0000 0000: heap
326 3e00 0000 0000 - 3e80 0000 0000: -
327 3e80 0000 0000 - 4000 0000 0000: modules and main thread stack
329 struct MappingPPC64_46 {
330 static const uptr kMetaShadowBeg = 0x100000000000ull;
331 static const uptr kMetaShadowEnd = 0x120000000000ull;
332 static const uptr kShadowBeg = 0x010000000000ull;
333 static const uptr kShadowEnd = 0x080000000000ull;
334 static const uptr kHeapMemBeg = 0x3d0000000000ull;
335 static const uptr kHeapMemEnd = 0x3e0000000000ull;
336 static const uptr kLoAppMemBeg = 0x000000001000ull;
337 static const uptr kLoAppMemEnd = 0x010000000000ull;
338 static const uptr kHiAppMemBeg = 0x3e8000000000ull;
339 static const uptr kHiAppMemEnd = 0x400000000000ull; // 46 bits
340 static const uptr kShadowMsk = 0x3c0000000000ull;
341 static const uptr kShadowXor = 0x020000000000ull;
342 static const uptr kShadowAdd = 0x000000000000ull;
343 static const uptr kVdsoBeg = 0x7800000000000000ull;
344 static const uptr kMidAppMemBeg = 0;
345 static const uptr kMidAppMemEnd = 0;
349 C/C++ on linux/powerpc64 (47-bit VMA)
350 0000 0000 1000 - 0100 0000 0000: main binary
351 0100 0000 0000 - 0200 0000 0000: -
352 0100 0000 0000 - 0800 0000 0000: shadow
353 0800 0000 0000 - 1000 0000 0000: -
354 1000 0000 0000 - 1200 0000 0000: metainfo (memory blocks and sync objects)
355 1200 0000 0000 - 7d00 0000 0000: -
356 7d00 0000 0000 - 7e00 0000 0000: heap
357 7e00 0000 0000 - 7e80 0000 0000: -
358 7e80 0000 0000 - 8000 0000 0000: modules and main thread stack
360 struct MappingPPC64_47 {
361 static const uptr kMetaShadowBeg = 0x100000000000ull;
362 static const uptr kMetaShadowEnd = 0x120000000000ull;
363 static const uptr kShadowBeg = 0x010000000000ull;
364 static const uptr kShadowEnd = 0x080000000000ull;
365 static const uptr kHeapMemBeg = 0x7d0000000000ull;
366 static const uptr kHeapMemEnd = 0x7e0000000000ull;
367 static const uptr kLoAppMemBeg = 0x000000001000ull;
368 static const uptr kLoAppMemEnd = 0x010000000000ull;
369 static const uptr kHiAppMemBeg = 0x7e8000000000ull;
370 static const uptr kHiAppMemEnd = 0x800000000000ull; // 47 bits
371 static const uptr kShadowMsk = 0x7c0000000000ull;
372 static const uptr kShadowXor = 0x020000000000ull;
373 static const uptr kShadowAdd = 0x000000000000ull;
374 static const uptr kVdsoBeg = 0x7800000000000000ull;
375 static const uptr kMidAppMemBeg = 0;
376 static const uptr kMidAppMemEnd = 0;
380 C/C++ on linux/riscv64 (39-bit VMA)
381 0000 0010 00 - 0200 0000 00: main binary ( 8 GB)
382 0200 0000 00 - 1000 0000 00: -
383 1000 0000 00 - 4000 0000 00: shadow memory (64 GB)
384 4000 0000 00 - 4800 0000 00: metainfo (16 GB)
385 4800 0000 00 - 5500 0000 00: -
386 5500 0000 00 - 5a00 0000 00: main binary (PIE) (~8 GB)
387 5600 0000 00 - 7c00 0000 00: -
388 7d00 0000 00 - 7fff ffff ff: libraries and main thread stack ( 8 GB)
390 mmap by default allocates from top downwards
391 VDSO sits below loader and above dynamic libraries, within HiApp region.
392 Heap starts after program region whose position depends on pie or non-pie.
393 Disable tracking them since their locations are not fixed.
395 struct MappingRiscv64_39 {
396 static const uptr kLoAppMemBeg = 0x0000001000ull;
397 static const uptr kLoAppMemEnd = 0x0200000000ull;
398 static const uptr kShadowBeg = 0x1000000000ull;
399 static const uptr kShadowEnd = 0x2000000000ull;
400 static const uptr kMetaShadowBeg = 0x2000000000ull;
401 static const uptr kMetaShadowEnd = 0x2400000000ull;
402 static const uptr kMidAppMemBeg = 0x2aaaaaa000ull;
403 static const uptr kMidAppMemEnd = 0x2c00000000ull;
404 static const uptr kHeapMemBeg = 0x2c00000000ull;
405 static const uptr kHeapMemEnd = 0x2c00000000ull;
406 static const uptr kHiAppMemBeg = 0x3c00000000ull;
407 static const uptr kHiAppMemEnd = 0x3fffffffffull;
408 static const uptr kShadowMsk = 0x3800000000ull;
409 static const uptr kShadowXor = 0x0800000000ull;
410 static const uptr kShadowAdd = 0x0000000000ull;
411 static const uptr kVdsoBeg = 0x4000000000ull;
415 C/C++ on linux/riscv64 (48-bit VMA)
416 0000 0000 1000 - 0500 0000 0000: main binary ( 5 TB)
417 0500 0000 0000 - 2000 0000 0000: -
418 2000 0000 0000 - 4000 0000 0000: shadow memory (32 TB)
419 4000 0000 0000 - 4800 0000 0000: metainfo ( 8 TB)
420 4800 0000 0000 - 5555 5555 5000: -
421 5555 5555 5000 - 5a00 0000 0000: main binary (PIE) (~5 TB)
422 5a00 0000 0000 - 7a00 0000 0000: -
423 7a00 0000 0000 - 7fff ffff ffff: libraries and main thread stack ( 5 TB)
425 struct MappingRiscv64_48 {
426 static const uptr kLoAppMemBeg = 0x000000001000ull;
427 static const uptr kLoAppMemEnd = 0x050000000000ull;
428 static const uptr kShadowBeg = 0x200000000000ull;
429 static const uptr kShadowEnd = 0x400000000000ull;
430 static const uptr kMetaShadowBeg = 0x400000000000ull;
431 static const uptr kMetaShadowEnd = 0x480000000000ull;
432 static const uptr kMidAppMemBeg = 0x555555555000ull;
433 static const uptr kMidAppMemEnd = 0x5a0000000000ull;
434 static const uptr kHeapMemBeg = 0x5a0000000000ull;
435 static const uptr kHeapMemEnd = 0x5a0000000000ull;
436 static const uptr kHiAppMemBeg = 0x7a0000000000ull;
437 static const uptr kHiAppMemEnd = 0x7fffffffffffull;
438 static const uptr kShadowMsk = 0x700000000000ull;
439 static const uptr kShadowXor = 0x100000000000ull;
440 static const uptr kShadowAdd = 0x000000000000ull;
441 static const uptr kVdsoBeg = 0x800000000000ull;
445 C/C++ on linux/s390x
446 While the kernel provides a 64-bit address space, we have to restrict ourselves
447 to 48 bits due to how e.g. SyncVar::GetId() works.
448 0000 0000 1000 - 0e00 0000 0000: binary, modules, stacks - 14 TiB
449 0e00 0000 0000 - 2000 0000 0000: -
450 2000 0000 0000 - 4000 0000 0000: shadow - 32TiB (2 * app)
451 4000 0000 0000 - 9000 0000 0000: -
452 9000 0000 0000 - 9800 0000 0000: metainfo - 8TiB (0.5 * app)
453 9800 0000 0000 - be00 0000 0000: -
454 be00 0000 0000 - c000 0000 0000: heap - 2TiB (max supported by the allocator)
456 struct MappingS390x {
457 static const uptr kMetaShadowBeg = 0x900000000000ull;
458 static const uptr kMetaShadowEnd = 0x980000000000ull;
459 static const uptr kShadowBeg = 0x200000000000ull;
460 static const uptr kShadowEnd = 0x400000000000ull;
461 static const uptr kHeapMemBeg = 0xbe0000000000ull;
462 static const uptr kHeapMemEnd = 0xc00000000000ull;
463 static const uptr kLoAppMemBeg = 0x000000001000ull;
464 static const uptr kLoAppMemEnd = 0x0e0000000000ull;
465 static const uptr kHiAppMemBeg = 0xc00000004000ull;
466 static const uptr kHiAppMemEnd = 0xc00000004000ull;
467 static const uptr kShadowMsk = 0xb00000000000ull;
468 static const uptr kShadowXor = 0x100000000000ull;
469 static const uptr kShadowAdd = 0x000000000000ull;
470 static const uptr kVdsoBeg = 0xfffffffff000ull;
471 static const uptr kMidAppMemBeg = 0;
472 static const uptr kMidAppMemEnd = 0;
475 /* Go on linux, darwin and freebsd on x86_64
476 0000 0000 1000 - 0000 1000 0000: executable
477 0000 1000 0000 - 00c0 0000 0000: -
478 00c0 0000 0000 - 00e0 0000 0000: heap
479 00e0 0000 0000 - 2000 0000 0000: -
480 2000 0000 0000 - 21c0 0000 0000: shadow
481 21c0 0000 0000 - 3000 0000 0000: -
482 3000 0000 0000 - 4000 0000 0000: metainfo (memory blocks and sync objects)
483 4000 0000 0000 - 8000 0000 0000: -
486 struct MappingGo48 {
487 static const uptr kMetaShadowBeg = 0x300000000000ull;
488 static const uptr kMetaShadowEnd = 0x400000000000ull;
489 static const uptr kShadowBeg = 0x200000000000ull;
490 static const uptr kShadowEnd = 0x21c000000000ull;
491 static const uptr kLoAppMemBeg = 0x000000001000ull;
492 static const uptr kLoAppMemEnd = 0x00e000000000ull;
493 static const uptr kMidAppMemBeg = 0;
494 static const uptr kMidAppMemEnd = 0;
495 static const uptr kHiAppMemBeg = 0;
496 static const uptr kHiAppMemEnd = 0;
497 static const uptr kHeapMemBeg = 0;
498 static const uptr kHeapMemEnd = 0;
499 static const uptr kVdsoBeg = 0;
500 static const uptr kShadowMsk = 0;
501 static const uptr kShadowXor = 0;
502 static const uptr kShadowAdd = 0x200000000000ull;
505 /* Go on windows
506 0000 0000 1000 - 0000 1000 0000: executable
507 0000 1000 0000 - 00f8 0000 0000: -
508 00c0 0000 0000 - 00e0 0000 0000: heap
509 00e0 0000 0000 - 0100 0000 0000: -
510 0100 0000 0000 - 0300 0000 0000: shadow
511 0300 0000 0000 - 0700 0000 0000: -
512 0700 0000 0000 - 0770 0000 0000: metainfo (memory blocks and sync objects)
513 07d0 0000 0000 - 8000 0000 0000: -
514 PIE binaries currently not supported, but it should be theoretically possible.
517 struct MappingGoWindows {
518 static const uptr kMetaShadowBeg = 0x070000000000ull;
519 static const uptr kMetaShadowEnd = 0x077000000000ull;
520 static const uptr kShadowBeg = 0x010000000000ull;
521 static const uptr kShadowEnd = 0x030000000000ull;
522 static const uptr kLoAppMemBeg = 0x000000001000ull;
523 static const uptr kLoAppMemEnd = 0x00e000000000ull;
524 static const uptr kMidAppMemBeg = 0;
525 static const uptr kMidAppMemEnd = 0;
526 static const uptr kHiAppMemBeg = 0;
527 static const uptr kHiAppMemEnd = 0;
528 static const uptr kHeapMemBeg = 0;
529 static const uptr kHeapMemEnd = 0;
530 static const uptr kVdsoBeg = 0;
531 static const uptr kShadowMsk = 0;
532 static const uptr kShadowXor = 0;
533 static const uptr kShadowAdd = 0x010000000000ull;
536 /* Go on linux/powerpc64 (46-bit VMA)
537 0000 0000 1000 - 0000 1000 0000: executable
538 0000 1000 0000 - 00c0 0000 0000: -
539 00c0 0000 0000 - 00e0 0000 0000: heap
540 00e0 0000 0000 - 2000 0000 0000: -
541 2000 0000 0000 - 21c0 0000 0000: shadow
542 21c0 0000 0000 - 2400 0000 0000: -
543 2400 0000 0000 - 2470 0000 0000: metainfo (memory blocks and sync objects)
544 2470 0000 0000 - 4000 0000 0000: -
547 struct MappingGoPPC64_46 {
548 static const uptr kMetaShadowBeg = 0x240000000000ull;
549 static const uptr kMetaShadowEnd = 0x247000000000ull;
550 static const uptr kShadowBeg = 0x200000000000ull;
551 static const uptr kShadowEnd = 0x21c000000000ull;
552 static const uptr kLoAppMemBeg = 0x000000001000ull;
553 static const uptr kLoAppMemEnd = 0x00e000000000ull;
554 static const uptr kMidAppMemBeg = 0;
555 static const uptr kMidAppMemEnd = 0;
556 static const uptr kHiAppMemBeg = 0;
557 static const uptr kHiAppMemEnd = 0;
558 static const uptr kHeapMemBeg = 0;
559 static const uptr kHeapMemEnd = 0;
560 static const uptr kVdsoBeg = 0;
561 static const uptr kShadowMsk = 0;
562 static const uptr kShadowXor = 0;
563 static const uptr kShadowAdd = 0x200000000000ull;
566 /* Go on linux/powerpc64 (47-bit VMA)
567 0000 0000 1000 - 0000 1000 0000: executable
568 0000 1000 0000 - 00c0 0000 0000: -
569 00c0 0000 0000 - 00e0 0000 0000: heap
570 00e0 0000 0000 - 2000 0000 0000: -
571 2000 0000 0000 - 2800 0000 0000: shadow
572 2800 0000 0000 - 3000 0000 0000: -
573 3000 0000 0000 - 3200 0000 0000: metainfo (memory blocks and sync objects)
574 3200 0000 0000 - 8000 0000 0000: -
577 struct MappingGoPPC64_47 {
578 static const uptr kMetaShadowBeg = 0x300000000000ull;
579 static const uptr kMetaShadowEnd = 0x320000000000ull;
580 static const uptr kShadowBeg = 0x200000000000ull;
581 static const uptr kShadowEnd = 0x280000000000ull;
582 static const uptr kLoAppMemBeg = 0x000000001000ull;
583 static const uptr kLoAppMemEnd = 0x00e000000000ull;
584 static const uptr kMidAppMemBeg = 0;
585 static const uptr kMidAppMemEnd = 0;
586 static const uptr kHiAppMemBeg = 0;
587 static const uptr kHiAppMemEnd = 0;
588 static const uptr kHeapMemBeg = 0;
589 static const uptr kHeapMemEnd = 0;
590 static const uptr kVdsoBeg = 0;
591 static const uptr kShadowMsk = 0;
592 static const uptr kShadowXor = 0;
593 static const uptr kShadowAdd = 0x200000000000ull;
596 /* Go on linux/aarch64 (48-bit VMA) and darwin/aarch64 (47-bit VMA)
597 0000 0000 1000 - 0000 1000 0000: executable
598 0000 1000 0000 - 00c0 0000 0000: -
599 00c0 0000 0000 - 00e0 0000 0000: heap
600 00e0 0000 0000 - 2000 0000 0000: -
601 2000 0000 0000 - 2800 0000 0000: shadow
602 2800 0000 0000 - 3000 0000 0000: -
603 3000 0000 0000 - 3200 0000 0000: metainfo (memory blocks and sync objects)
604 3200 0000 0000 - 8000 0000 0000: -
606 struct MappingGoAarch64 {
607 static const uptr kMetaShadowBeg = 0x300000000000ull;
608 static const uptr kMetaShadowEnd = 0x320000000000ull;
609 static const uptr kShadowBeg = 0x200000000000ull;
610 static const uptr kShadowEnd = 0x280000000000ull;
611 static const uptr kLoAppMemBeg = 0x000000001000ull;
612 static const uptr kLoAppMemEnd = 0x00e000000000ull;
613 static const uptr kMidAppMemBeg = 0;
614 static const uptr kMidAppMemEnd = 0;
615 static const uptr kHiAppMemBeg = 0;
616 static const uptr kHiAppMemEnd = 0;
617 static const uptr kHeapMemBeg = 0;
618 static const uptr kHeapMemEnd = 0;
619 static const uptr kVdsoBeg = 0;
620 static const uptr kShadowMsk = 0;
621 static const uptr kShadowXor = 0;
622 static const uptr kShadowAdd = 0x200000000000ull;
626 Go on linux/mips64 (47-bit VMA)
627 0000 0000 1000 - 0000 1000 0000: executable
628 0000 1000 0000 - 00c0 0000 0000: -
629 00c0 0000 0000 - 00e0 0000 0000: heap
630 00e0 0000 0000 - 2000 0000 0000: -
631 2000 0000 0000 - 2800 0000 0000: shadow
632 2800 0000 0000 - 3000 0000 0000: -
633 3000 0000 0000 - 3200 0000 0000: metainfo (memory blocks and sync objects)
634 3200 0000 0000 - 8000 0000 0000: -
636 struct MappingGoMips64_47 {
637 static const uptr kMetaShadowBeg = 0x300000000000ull;
638 static const uptr kMetaShadowEnd = 0x320000000000ull;
639 static const uptr kShadowBeg = 0x200000000000ull;
640 static const uptr kShadowEnd = 0x280000000000ull;
641 static const uptr kLoAppMemBeg = 0x000000001000ull;
642 static const uptr kLoAppMemEnd = 0x00e000000000ull;
643 static const uptr kMidAppMemBeg = 0;
644 static const uptr kMidAppMemEnd = 0;
645 static const uptr kHiAppMemBeg = 0;
646 static const uptr kHiAppMemEnd = 0;
647 static const uptr kHeapMemBeg = 0;
648 static const uptr kHeapMemEnd = 0;
649 static const uptr kVdsoBeg = 0;
650 static const uptr kShadowMsk = 0;
651 static const uptr kShadowXor = 0;
652 static const uptr kShadowAdd = 0x200000000000ull;
656 Go on linux/s390x
657 0000 0000 1000 - 1000 0000 0000: executable and heap - 16 TiB
658 1000 0000 0000 - 4000 0000 0000: -
659 4000 0000 0000 - 6000 0000 0000: shadow - 64TiB (4 * app)
660 6000 0000 0000 - 9000 0000 0000: -
661 9000 0000 0000 - 9800 0000 0000: metainfo - 8TiB (0.5 * app)
663 struct MappingGoS390x {
664 static const uptr kMetaShadowBeg = 0x900000000000ull;
665 static const uptr kMetaShadowEnd = 0x980000000000ull;
666 static const uptr kShadowBeg = 0x400000000000ull;
667 static const uptr kShadowEnd = 0x600000000000ull;
668 static const uptr kLoAppMemBeg = 0x000000001000ull;
669 static const uptr kLoAppMemEnd = 0x100000000000ull;
670 static const uptr kMidAppMemBeg = 0;
671 static const uptr kMidAppMemEnd = 0;
672 static const uptr kHiAppMemBeg = 0;
673 static const uptr kHiAppMemEnd = 0;
674 static const uptr kHeapMemBeg = 0;
675 static const uptr kHeapMemEnd = 0;
676 static const uptr kVdsoBeg = 0;
677 static const uptr kShadowMsk = 0;
678 static const uptr kShadowXor = 0;
679 static const uptr kShadowAdd = 0x400000000000ull;
682 extern uptr vmaSize;
684 template <typename Func, typename Arg>
685 ALWAYS_INLINE auto SelectMapping(Arg arg) {
686 #if SANITIZER_GO
687 # if defined(__powerpc64__)
688 switch (vmaSize) {
689 case 46:
690 return Func::template Apply<MappingGoPPC64_46>(arg);
691 case 47:
692 return Func::template Apply<MappingGoPPC64_47>(arg);
694 # elif defined(__mips64)
695 return Func::template Apply<MappingGoMips64_47>(arg);
696 # elif defined(__s390x__)
697 return Func::template Apply<MappingGoS390x>(arg);
698 # elif defined(__aarch64__)
699 return Func::template Apply<MappingGoAarch64>(arg);
700 # elif SANITIZER_WINDOWS
701 return Func::template Apply<MappingGoWindows>(arg);
702 # else
703 return Func::template Apply<MappingGo48>(arg);
704 # endif
705 #else // SANITIZER_GO
706 # if SANITIZER_IOS && !SANITIZER_IOSSIM
707 return Func::template Apply<MappingAppleAarch64>(arg);
708 # elif defined(__x86_64__) || SANITIZER_APPLE
709 return Func::template Apply<Mapping48AddressSpace>(arg);
710 # elif defined(__aarch64__)
711 switch (vmaSize) {
712 case 39:
713 return Func::template Apply<MappingAarch64_39>(arg);
714 case 42:
715 return Func::template Apply<MappingAarch64_42>(arg);
716 case 48:
717 return Func::template Apply<MappingAarch64_48>(arg);
719 # elif SANITIZER_LOONGARCH64
720 return Func::template Apply<MappingLoongArch64_47>(arg);
721 # elif defined(__powerpc64__)
722 switch (vmaSize) {
723 case 44:
724 return Func::template Apply<MappingPPC64_44>(arg);
725 case 46:
726 return Func::template Apply<MappingPPC64_46>(arg);
727 case 47:
728 return Func::template Apply<MappingPPC64_47>(arg);
730 # elif defined(__mips64)
731 return Func::template Apply<MappingMips64_40>(arg);
732 # elif SANITIZER_RISCV64
733 switch (vmaSize) {
734 case 39:
735 return Func::template Apply<MappingRiscv64_39>(arg);
736 case 48:
737 return Func::template Apply<MappingRiscv64_48>(arg);
739 # elif defined(__s390x__)
740 return Func::template Apply<MappingS390x>(arg);
741 # else
742 # error "unsupported platform"
743 # endif
744 #endif
745 Die();
748 template <typename Func>
749 void ForEachMapping() {
750 Func::template Apply<Mapping48AddressSpace>();
751 Func::template Apply<MappingMips64_40>();
752 Func::template Apply<MappingAppleAarch64>();
753 Func::template Apply<MappingAarch64_39>();
754 Func::template Apply<MappingAarch64_42>();
755 Func::template Apply<MappingAarch64_48>();
756 Func::template Apply<MappingLoongArch64_47>();
757 Func::template Apply<MappingPPC64_44>();
758 Func::template Apply<MappingPPC64_46>();
759 Func::template Apply<MappingPPC64_47>();
760 Func::template Apply<MappingRiscv64_39>();
761 Func::template Apply<MappingRiscv64_48>();
762 Func::template Apply<MappingS390x>();
763 Func::template Apply<MappingGo48>();
764 Func::template Apply<MappingGoWindows>();
765 Func::template Apply<MappingGoPPC64_46>();
766 Func::template Apply<MappingGoPPC64_47>();
767 Func::template Apply<MappingGoAarch64>();
768 Func::template Apply<MappingGoMips64_47>();
769 Func::template Apply<MappingGoS390x>();
772 enum MappingType {
773 kLoAppMemBeg,
774 kLoAppMemEnd,
775 kHiAppMemBeg,
776 kHiAppMemEnd,
777 kMidAppMemBeg,
778 kMidAppMemEnd,
779 kHeapMemBeg,
780 kHeapMemEnd,
781 kShadowBeg,
782 kShadowEnd,
783 kMetaShadowBeg,
784 kMetaShadowEnd,
785 kVdsoBeg,
788 struct MappingField {
789 template <typename Mapping>
790 static uptr Apply(MappingType type) {
791 switch (type) {
792 case kLoAppMemBeg:
793 return Mapping::kLoAppMemBeg;
794 case kLoAppMemEnd:
795 return Mapping::kLoAppMemEnd;
796 case kMidAppMemBeg:
797 return Mapping::kMidAppMemBeg;
798 case kMidAppMemEnd:
799 return Mapping::kMidAppMemEnd;
800 case kHiAppMemBeg:
801 return Mapping::kHiAppMemBeg;
802 case kHiAppMemEnd:
803 return Mapping::kHiAppMemEnd;
804 case kHeapMemBeg:
805 return Mapping::kHeapMemBeg;
806 case kHeapMemEnd:
807 return Mapping::kHeapMemEnd;
808 case kVdsoBeg:
809 return Mapping::kVdsoBeg;
810 case kShadowBeg:
811 return Mapping::kShadowBeg;
812 case kShadowEnd:
813 return Mapping::kShadowEnd;
814 case kMetaShadowBeg:
815 return Mapping::kMetaShadowBeg;
816 case kMetaShadowEnd:
817 return Mapping::kMetaShadowEnd;
819 Die();
823 ALWAYS_INLINE
824 uptr LoAppMemBeg(void) { return SelectMapping<MappingField>(kLoAppMemBeg); }
825 ALWAYS_INLINE
826 uptr LoAppMemEnd(void) { return SelectMapping<MappingField>(kLoAppMemEnd); }
828 ALWAYS_INLINE
829 uptr MidAppMemBeg(void) { return SelectMapping<MappingField>(kMidAppMemBeg); }
830 ALWAYS_INLINE
831 uptr MidAppMemEnd(void) { return SelectMapping<MappingField>(kMidAppMemEnd); }
833 ALWAYS_INLINE
834 uptr HeapMemBeg(void) { return SelectMapping<MappingField>(kHeapMemBeg); }
835 ALWAYS_INLINE
836 uptr HeapMemEnd(void) { return SelectMapping<MappingField>(kHeapMemEnd); }
838 ALWAYS_INLINE
839 uptr HiAppMemBeg(void) { return SelectMapping<MappingField>(kHiAppMemBeg); }
840 ALWAYS_INLINE
841 uptr HiAppMemEnd(void) { return SelectMapping<MappingField>(kHiAppMemEnd); }
843 ALWAYS_INLINE
844 uptr VdsoBeg(void) { return SelectMapping<MappingField>(kVdsoBeg); }
846 ALWAYS_INLINE
847 uptr ShadowBeg(void) { return SelectMapping<MappingField>(kShadowBeg); }
848 ALWAYS_INLINE
849 uptr ShadowEnd(void) { return SelectMapping<MappingField>(kShadowEnd); }
851 ALWAYS_INLINE
852 uptr MetaShadowBeg(void) { return SelectMapping<MappingField>(kMetaShadowBeg); }
853 ALWAYS_INLINE
854 uptr MetaShadowEnd(void) { return SelectMapping<MappingField>(kMetaShadowEnd); }
856 struct IsAppMemImpl {
857 template <typename Mapping>
858 static bool Apply(uptr mem) {
859 return (mem >= Mapping::kHeapMemBeg && mem < Mapping::kHeapMemEnd) ||
860 (mem >= Mapping::kMidAppMemBeg && mem < Mapping::kMidAppMemEnd) ||
861 (mem >= Mapping::kLoAppMemBeg && mem < Mapping::kLoAppMemEnd) ||
862 (mem >= Mapping::kHiAppMemBeg && mem < Mapping::kHiAppMemEnd);
866 ALWAYS_INLINE
867 bool IsAppMem(uptr mem) { return SelectMapping<IsAppMemImpl>(mem); }
869 struct IsShadowMemImpl {
870 template <typename Mapping>
871 static bool Apply(uptr mem) {
872 return mem >= Mapping::kShadowBeg && mem <= Mapping::kShadowEnd;
876 ALWAYS_INLINE
877 bool IsShadowMem(RawShadow *p) {
878 return SelectMapping<IsShadowMemImpl>(reinterpret_cast<uptr>(p));
881 struct IsMetaMemImpl {
882 template <typename Mapping>
883 static bool Apply(uptr mem) {
884 return mem >= Mapping::kMetaShadowBeg && mem <= Mapping::kMetaShadowEnd;
888 ALWAYS_INLINE
889 bool IsMetaMem(const u32 *p) {
890 return SelectMapping<IsMetaMemImpl>(reinterpret_cast<uptr>(p));
893 struct MemToShadowImpl {
894 template <typename Mapping>
895 static uptr Apply(uptr x) {
896 DCHECK(IsAppMemImpl::Apply<Mapping>(x));
897 return (((x) & ~(Mapping::kShadowMsk | (kShadowCell - 1))) ^
898 Mapping::kShadowXor) *
899 kShadowMultiplier +
900 Mapping::kShadowAdd;
904 ALWAYS_INLINE
905 RawShadow *MemToShadow(uptr x) {
906 return reinterpret_cast<RawShadow *>(SelectMapping<MemToShadowImpl>(x));
909 struct MemToMetaImpl {
910 template <typename Mapping>
911 static u32 *Apply(uptr x) {
912 DCHECK(IsAppMemImpl::Apply<Mapping>(x));
913 return (u32 *)(((((x) & ~(Mapping::kShadowMsk | (kMetaShadowCell - 1)))) /
914 kMetaShadowCell * kMetaShadowSize) |
915 Mapping::kMetaShadowBeg);
919 ALWAYS_INLINE
920 u32 *MemToMeta(uptr x) { return SelectMapping<MemToMetaImpl>(x); }
922 struct ShadowToMemImpl {
923 template <typename Mapping>
924 static uptr Apply(uptr sp) {
925 if (!IsShadowMemImpl::Apply<Mapping>(sp))
926 return 0;
927 // The shadow mapping is non-linear and we've lost some bits, so we don't
928 // have an easy way to restore the original app address. But the mapping is
929 // a bijection, so we try to restore the address as belonging to
930 // low/mid/high range consecutively and see if shadow->app->shadow mapping
931 // gives us the same address.
932 uptr p =
933 ((sp - Mapping::kShadowAdd) / kShadowMultiplier) ^ Mapping::kShadowXor;
934 if (p >= Mapping::kLoAppMemBeg && p < Mapping::kLoAppMemEnd &&
935 MemToShadowImpl::Apply<Mapping>(p) == sp)
936 return p;
937 if (Mapping::kMidAppMemBeg) {
938 uptr p_mid = p + (Mapping::kMidAppMemBeg & Mapping::kShadowMsk);
939 if (p_mid >= Mapping::kMidAppMemBeg && p_mid < Mapping::kMidAppMemEnd &&
940 MemToShadowImpl::Apply<Mapping>(p_mid) == sp)
941 return p_mid;
943 return p | Mapping::kShadowMsk;
947 ALWAYS_INLINE
948 uptr ShadowToMem(RawShadow *s) {
949 return SelectMapping<ShadowToMemImpl>(reinterpret_cast<uptr>(s));
952 // Compresses addr to kCompressedAddrBits stored in least significant bits.
953 ALWAYS_INLINE uptr CompressAddr(uptr addr) {
954 return addr & ((1ull << kCompressedAddrBits) - 1);
957 struct RestoreAddrImpl {
958 typedef uptr Result;
959 template <typename Mapping>
960 static Result Apply(uptr addr) {
961 // To restore the address we go over all app memory ranges and check if top
962 // 3 bits of the compressed addr match that of the app range. If yes, we
963 // assume that the compressed address come from that range and restore the
964 // missing top bits to match the app range address.
965 const uptr ranges[] = {
966 Mapping::kLoAppMemBeg, Mapping::kLoAppMemEnd, Mapping::kMidAppMemBeg,
967 Mapping::kMidAppMemEnd, Mapping::kHiAppMemBeg, Mapping::kHiAppMemEnd,
968 Mapping::kHeapMemBeg, Mapping::kHeapMemEnd,
970 const uptr indicator = 0x0f0000000000ull;
971 const uptr ind_lsb = 1ull << LeastSignificantSetBitIndex(indicator);
972 for (uptr i = 0; i < ARRAY_SIZE(ranges); i += 2) {
973 uptr beg = ranges[i];
974 uptr end = ranges[i + 1];
975 if (beg == end)
976 continue;
977 for (uptr p = beg; p < end; p = RoundDown(p + ind_lsb, ind_lsb)) {
978 if ((addr & indicator) == (p & indicator))
979 return addr | (p & ~(ind_lsb - 1));
982 Printf("ThreadSanitizer: failed to restore address 0x%zx\n", addr);
983 Die();
987 // Restores compressed addr from kCompressedAddrBits to full representation.
988 // This is called only during reporting and is not performance-critical.
989 inline uptr RestoreAddr(uptr addr) {
990 return SelectMapping<RestoreAddrImpl>(addr);
993 void InitializePlatform();
994 void InitializePlatformEarly();
995 void CheckAndProtect();
996 void InitializeShadowMemoryPlatform();
997 void WriteMemoryProfile(char *buf, uptr buf_size, u64 uptime_ns);
998 int ExtractResolvFDs(void *state, int *fds, int nfd);
999 int ExtractRecvmsgFDs(void *msg, int *fds, int nfd);
1000 uptr ExtractLongJmpSp(uptr *env);
1001 void ImitateTlsWrite(ThreadState *thr, uptr tls_addr, uptr tls_size);
1003 int call_pthread_cancel_with_cleanup(int (*fn)(void *arg),
1004 void (*cleanup)(void *arg), void *arg);
1006 void DestroyThreadState();
1007 void PlatformCleanUpThreadState(ThreadState *thr);
1009 } // namespace __tsan
1011 #endif // TSAN_PLATFORM_H