17ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===-- tsan_platform.h -----------------------------------------*- C++ -*-===// 27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 37ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// The LLVM Compiler Infrastructure 47ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is distributed under the University of Illinois Open Source 67ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// License. See LICENSE.TXT for details. 77ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===// 97ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 117ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// 127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// Platform-specific code. 137ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===// 147ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 156d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#ifndef TSAN_PLATFORM_H 166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#define TSAN_PLATFORM_H 176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#if !defined(__LP64__) && !defined(_WIN64) 196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# error "Only 64-bit is supported" 206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#endif 216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include "tsan_defs.h" 236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include "tsan_trace.h" 246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 256d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesnamespace __tsan { 266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 2786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if !defined(SANITIZER_GO) 286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 2986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(__x86_64__) 3045bdb2ffb2878a6c22493af76256d5950dc0a6a2Dmitry Vyukov/* 3186277eb844c4983c81de62d7c050e92fe7155788Stephen HinesC/C++ on linux/x86_64 and freebsd/x86_64 326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines0000 0000 1000 - 0100 0000 0000: main binary and/or MAP_32BIT mappings 336d1862363c88c183b0ed7740fca876342cf0474bStephen Hines0100 0000 0000 - 0200 0000 0000: - 346d1862363c88c183b0ed7740fca876342cf0474bStephen Hines0200 0000 0000 - 1000 0000 0000: shadow 356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines1000 0000 0000 - 3000 0000 0000: - 366a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines3000 0000 0000 - 4000 0000 0000: metainfo (memory blocks and sync objects) 376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines4000 0000 0000 - 6000 0000 0000: - 38385542a2e83a4f37de4232d6c72097c1b7d6d44bDmitry Vyukov6000 0000 0000 - 6200 0000 0000: traces 39385542a2e83a4f37de4232d6c72097c1b7d6d44bDmitry Vyukov6200 0000 0000 - 7d00 0000 0000: - 4045bdb2ffb2878a6c22493af76256d5950dc0a6a2Dmitry Vyukov7d00 0000 0000 - 7e00 0000 0000: heap 416d1862363c88c183b0ed7740fca876342cf0474bStephen Hines7e00 0000 0000 - 7e80 0000 0000: - 426d1862363c88c183b0ed7740fca876342cf0474bStephen Hines7e80 0000 0000 - 8000 0000 0000: modules and main thread stack 436d1862363c88c183b0ed7740fca876342cf0474bStephen Hines*/ 443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping { 453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x300000000000ull; 463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x400000000000ull; 473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x600000000000ull; 483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x620000000000ull; 493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x020000000000ull; 503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x100000000000ull; 513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemBeg = 0x7d0000000000ull; 523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemEnd = 0x7e0000000000ull; 533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemBeg = 0x000000001000ull; 543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemEnd = 0x010000000000ull; 553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemBeg = 0x7e8000000000ull; 563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemEnd = 0x800000000000ull; 573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemMsk = 0x7c0000000000ull; 583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemXor = 0x020000000000ull; 593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kVdsoBeg = 0xf000000000000000ull; 603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 6186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(__mips64) 6286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines/* 6386277eb844c4983c81de62d7c050e92fe7155788Stephen HinesC/C++ on linux/mips64 6486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines0100 0000 00 - 0200 0000 00: main binary 6586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines0200 0000 00 - 1400 0000 00: - 6686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines1400 0000 00 - 2400 0000 00: shadow 6786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines2400 0000 00 - 3000 0000 00: - 6886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines3000 0000 00 - 4000 0000 00: metainfo (memory blocks and sync objects) 6986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines4000 0000 00 - 6000 0000 00: - 7086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines6000 0000 00 - 6200 0000 00: traces 7186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines6200 0000 00 - fe00 0000 00: - 7286277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfe00 0000 00 - ff00 0000 00: heap 7386277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesff00 0000 00 - ff80 0000 00: - 7486277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesff80 0000 00 - ffff ffff ff: modules and main thread stack 7586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines*/ 763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping { 773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x3000000000ull; 783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x4000000000ull; 793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x6000000000ull; 803d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x6200000000ull; 813d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x1400000000ull; 823d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x2400000000ull; 833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemBeg = 0xfe00000000ull; 843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemEnd = 0xff00000000ull; 853d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemBeg = 0x0100000000ull; 863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemEnd = 0x0200000000ull; 873d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemBeg = 0xff80000000ull; 883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemEnd = 0xffffffffffull; 893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemMsk = 0xfc00000000ull; 903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemXor = 0x0400000000ull; 913d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kVdsoBeg = 0xfffff00000ull; 923d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 933d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__aarch64__) 943d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// AArch64 supports multiple VMA which leads to multiple address transformation 953d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// functions. To support these multiple VMAS transformations and mappings TSAN 963d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// runtime for AArch64 uses an external memory read (vmaSize) to select which 973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// mapping to use. Although slower, it make a same instrumented binary run on 983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// multiple kernels. 996d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/* 1013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarC/C++ on linux/aarch64 (39-bit VMA) 1023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0000 0010 00 - 0100 0000 00: main binary 1033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0100 0000 00 - 0800 0000 00: - 1043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0800 0000 00 - 2000 0000 00: shadow memory 1053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar2000 0000 00 - 3100 0000 00: - 1063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3100 0000 00 - 3400 0000 00: metainfo 1073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3400 0000 00 - 5500 0000 00: - 1083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar5500 0000 00 - 5600 0000 00: main binary (PIE) 1093d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar5600 0000 00 - 6000 0000 00: - 1103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar6000 0000 00 - 6200 0000 00: traces 1113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar6200 0000 00 - 7d00 0000 00: - 1123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar7c00 0000 00 - 7d00 0000 00: heap 1133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar7d00 0000 00 - 7fff ffff ff: modules and main thread stack 1143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar*/ 1153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping39 { 1163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemBeg = 0x0000001000ull; 1173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemEnd = 0x0100000000ull; 1183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x0800000000ull; 1193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x2000000000ull; 1203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x3100000000ull; 1213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x3400000000ull; 1223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMidAppMemBeg = 0x5500000000ull; 1233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMidAppMemEnd = 0x5600000000ull; 1243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMidShadowOff = 0x5000000000ull; 1253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x6000000000ull; 1263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x6200000000ull; 1273d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemBeg = 0x7c00000000ull; 1283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemEnd = 0x7d00000000ull; 1293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemBeg = 0x7e00000000ull; 1303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemEnd = 0x7fffffffffull; 1313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemMsk = 0x7800000000ull; 1323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemXor = 0x0200000000ull; 1333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kVdsoBeg = 0x7f00000000ull; 1343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 1356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/* 1373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarC/C++ on linux/aarch64 (42-bit VMA) 1383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar00000 0010 00 - 01000 0000 00: main binary 1393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar01000 0000 00 - 10000 0000 00: - 1403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar10000 0000 00 - 20000 0000 00: shadow memory 1413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar20000 0000 00 - 26000 0000 00: - 1423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar26000 0000 00 - 28000 0000 00: metainfo 1433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar28000 0000 00 - 2aa00 0000 00: - 1443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar2aa00 0000 00 - 2ab00 0000 00: main binary (PIE) 1453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar2ab00 0000 00 - 36200 0000 00: - 1463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar36200 0000 00 - 36240 0000 00: traces 1473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar36240 0000 00 - 3e000 0000 00: - 1483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3e000 0000 00 - 3f000 0000 00: heap 1493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3f000 0000 00 - 3ffff ffff ff: modules and main thread stack 1503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar*/ 1513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping42 { 1523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemBeg = 0x00000001000ull; 1533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemEnd = 0x01000000000ull; 1543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x10000000000ull; 1553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x20000000000ull; 1563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x26000000000ull; 1573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x28000000000ull; 1583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMidAppMemBeg = 0x2aa00000000ull; 1593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMidAppMemEnd = 0x2ab00000000ull; 1603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMidShadowOff = 0x28000000000ull; 1613d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x36200000000ull; 1623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x36400000000ull; 1633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemBeg = 0x3e000000000ull; 1643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemEnd = 0x3f000000000ull; 1653d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemBeg = 0x3f000000000ull; 1663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemEnd = 0x3ffffffffffull; 1673d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemMsk = 0x3c000000000ull; 1683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemXor = 0x04000000000ull; 1693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kVdsoBeg = 0x37f00000000ull; 1703d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 1716d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1723d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// Indicates the runtime will define the memory regions at runtime. 1733d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#define TSAN_RUNTIME_VMA 1 1743d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// Indicates that mapping defines a mid range memory segment. 1753d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#define TSAN_MID_APP_RANGE 1 1763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 1773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// PPC64 supports multiple VMA which leads to multiple address transformation 1783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// functions. To support these multiple VMAS transformations and mappings TSAN 1793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// runtime for PPC64 uses an external memory read (vmaSize) to select which 1803d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// mapping to use. Although slower, it make a same instrumented binary run on 1813d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// multiple kernels. 1826d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 1833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/* 1843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarC/C++ on linux/powerpc64 (44-bit VMA) 1853d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0000 0000 0100 - 0001 0000 0000: main binary 1863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0001 0000 0000 - 0001 0000 0000: - 1873d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0001 0000 0000 - 0b00 0000 0000: shadow 1883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0b00 0000 0000 - 0b00 0000 0000: - 1893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0b00 0000 0000 - 0d00 0000 0000: metainfo (memory blocks and sync objects) 1903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0d00 0000 0000 - 0d00 0000 0000: - 1913d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0d00 0000 0000 - 0f00 0000 0000: traces 1923d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0f00 0000 0000 - 0f00 0000 0000: - 1933d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0f00 0000 0000 - 0f50 0000 0000: heap 1943d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0f50 0000 0000 - 0f60 0000 0000: - 1953d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0f60 0000 0000 - 1000 0000 0000: modules and main thread stack 1963d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar*/ 1973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping44 { 1983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x0b0000000000ull; 1993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x0d0000000000ull; 2003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x0d0000000000ull; 2013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x0f0000000000ull; 2023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x000100000000ull; 2033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x0b0000000000ull; 2043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemBeg = 0x000000000100ull; 2053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemEnd = 0x000100000000ull; 2063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemBeg = 0x0f0000000000ull; 2073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemEnd = 0x0f5000000000ull; 2083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemBeg = 0x0f6000000000ull; 2093d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemEnd = 0x100000000000ull; // 44 bits 2103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemMsk = 0x0f0000000000ull; 2113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemXor = 0x002100000000ull; 2123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kVdsoBeg = 0x3c0000000000000ull; 2133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 2146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 2153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/* 2163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarC/C++ on linux/powerpc64 (46-bit VMA) 2173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0000 0000 1000 - 0100 0000 0000: main binary 2183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0100 0000 0000 - 0200 0000 0000: - 2193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0100 0000 0000 - 1000 0000 0000: shadow 2203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar1000 0000 0000 - 1000 0000 0000: - 2213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar1000 0000 0000 - 2000 0000 0000: metainfo (memory blocks and sync objects) 2223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar2000 0000 0000 - 2000 0000 0000: - 2233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar2000 0000 0000 - 2200 0000 0000: traces 2243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar2200 0000 0000 - 3d00 0000 0000: - 2253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3d00 0000 0000 - 3e00 0000 0000: heap 2263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3e00 0000 0000 - 3e80 0000 0000: - 2273d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar3e80 0000 0000 - 4000 0000 0000: modules and main thread stack 2283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar*/ 2293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping46 { 2303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x100000000000ull; 2313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x200000000000ull; 2323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x200000000000ull; 2333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x220000000000ull; 2343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x010000000000ull; 2353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x100000000000ull; 2363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemBeg = 0x3d0000000000ull; 2373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHeapMemEnd = 0x3e0000000000ull; 2383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemBeg = 0x000000001000ull; 2393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kLoAppMemEnd = 0x010000000000ull; 2403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemBeg = 0x3e8000000000ull; 2413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kHiAppMemEnd = 0x400000000000ull; // 46 bits 2423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemMsk = 0x3c0000000000ull; 2433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemXor = 0x020000000000ull; 2443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kVdsoBeg = 0x7800000000000000ull; 2456d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}; 2466d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 2473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar// Indicates the runtime will define the memory regions at runtime. 2483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#define TSAN_RUNTIME_VMA 1 2493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 2503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 25186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(SANITIZER_GO) && !SANITIZER_WINDOWS 2526d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 2536d1862363c88c183b0ed7740fca876342cf0474bStephen Hines/* Go on linux, darwin and freebsd 2546d1862363c88c183b0ed7740fca876342cf0474bStephen Hines0000 0000 1000 - 0000 1000 0000: executable 2556d1862363c88c183b0ed7740fca876342cf0474bStephen Hines0000 1000 0000 - 00c0 0000 0000: - 2564860c68bafe61e02a84ce8bc76095f5e5e5539e1Dmitry Vyukov00c0 0000 0000 - 00e0 0000 0000: heap 2576d1862363c88c183b0ed7740fca876342cf0474bStephen Hines00e0 0000 0000 - 2000 0000 0000: - 2586d1862363c88c183b0ed7740fca876342cf0474bStephen Hines2000 0000 0000 - 2380 0000 0000: shadow 2596d1862363c88c183b0ed7740fca876342cf0474bStephen Hines2380 0000 0000 - 3000 0000 0000: - 2606a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines3000 0000 0000 - 4000 0000 0000: metainfo (memory blocks and sync objects) 2616a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines4000 0000 0000 - 6000 0000 0000: - 262385542a2e83a4f37de4232d6c72097c1b7d6d44bDmitry Vyukov6000 0000 0000 - 6200 0000 0000: traces 2636d1862363c88c183b0ed7740fca876342cf0474bStephen Hines6200 0000 0000 - 8000 0000 0000: - 2646d1862363c88c183b0ed7740fca876342cf0474bStephen Hines*/ 2656d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 2663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping { 2673d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x300000000000ull; 2683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x400000000000ull; 2693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x600000000000ull; 2703d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x620000000000ull; 2713d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x200000000000ull; 2723d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x238000000000ull; 2733d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemBeg = 0x000000001000ull; 2743d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemEnd = 0x00e000000000ull; 2753d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 2763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 2773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(SANITIZER_GO) && SANITIZER_WINDOWS 2783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 2793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/* Go on windows 2803d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0000 0000 1000 - 0000 1000 0000: executable 2813d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0000 1000 0000 - 00f8 0000 0000: - 2823d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar00c0 0000 0000 - 00e0 0000 0000: heap 2833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar00e0 0000 0000 - 0100 0000 0000: - 2843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0100 0000 0000 - 0500 0000 0000: shadow 2853d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0500 0000 0000 - 0560 0000 0000: - 2863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0560 0000 0000 - 0760 0000 0000: traces 2873d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar0760 0000 0000 - 07d0 0000 0000: metainfo (memory blocks and sync objects) 2883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar07d0 0000 0000 - 8000 0000 0000: - 2893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar*/ 2903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 2913d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstruct Mapping { 2923d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowBeg = 0x076000000000ull; 2933d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kMetaShadowEnd = 0x07d000000000ull; 2943d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemBeg = 0x056000000000ull; 2953d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kTraceMemEnd = 0x076000000000ull; 2963d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowBeg = 0x010000000000ull; 2973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kShadowEnd = 0x050000000000ull; 2983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemBeg = 0x000000001000ull; 2993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar static const uptr kAppMemEnd = 0x00e000000000ull; 3003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 3013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 3033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# error "Unknown platform" 3043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 3053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef TSAN_RUNTIME_VMA 3083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarextern uptr vmaSize; 3093d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 3103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarenum MappingType { 3133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_LO_APP_BEG, 3143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_LO_APP_END, 3153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_HI_APP_BEG, 3163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_HI_APP_END, 3173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef TSAN_MID_APP_RANGE 3183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_MID_APP_BEG, 3193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_MID_APP_END, 3203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 3213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_HEAP_BEG, 3223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_HEAP_END, 3233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_APP_BEG, 3243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_APP_END, 3253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_SHADOW_BEG, 3263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_SHADOW_END, 3273d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_META_SHADOW_BEG, 3283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_META_SHADOW_END, 3293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_TRACE_BEG, 3303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_TRACE_END, 3313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar MAPPING_VDSO_BEG, 3323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar}; 3333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping, int Type> 3353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MappingImpl(void) { 3363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar switch (Type) { 3373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 3383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_LO_APP_BEG: return Mapping::kLoAppMemBeg; 3393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_LO_APP_END: return Mapping::kLoAppMemEnd; 3403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# ifdef TSAN_MID_APP_RANGE 3413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_MID_APP_BEG: return Mapping::kMidAppMemBeg; 3423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_MID_APP_END: return Mapping::kMidAppMemEnd; 3433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# endif 3443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_HI_APP_BEG: return Mapping::kHiAppMemBeg; 3453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_HI_APP_END: return Mapping::kHiAppMemEnd; 3463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_HEAP_BEG: return Mapping::kHeapMemBeg; 3473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_HEAP_END: return Mapping::kHeapMemEnd; 3483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_VDSO_BEG: return Mapping::kVdsoBeg; 3493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 3503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_APP_BEG: return Mapping::kAppMemBeg; 3513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_APP_END: return Mapping::kAppMemEnd; 3523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 3533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_SHADOW_BEG: return Mapping::kShadowBeg; 3543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_SHADOW_END: return Mapping::kShadowEnd; 3553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_META_SHADOW_BEG: return Mapping::kMetaShadowBeg; 3563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_META_SHADOW_END: return Mapping::kMetaShadowEnd; 3573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_TRACE_BEG: return Mapping::kTraceMemBeg; 3583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case MAPPING_TRACE_END: return Mapping::kTraceMemEnd; 3593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar } 3603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 3613d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 3623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<int Type> 3633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MappingArchImpl(void) { 3643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 3653d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 3663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingImpl<Mapping39, Type>(); 3673d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 3683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingImpl<Mapping42, Type>(); 3693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 3703d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 3713d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 3723d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingImpl<Mapping44, Type>(); 3733d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 3743d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingImpl<Mapping46, Type>(); 3753d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 3763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 3773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingImpl<Mapping, Type>(); 3783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 3793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 3806d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 3813d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 3826d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 3833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr LoAppMemBeg(void) { 3843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_LO_APP_BEG>(); 3853d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 3863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 3873d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr LoAppMemEnd(void) { 3883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_LO_APP_END>(); 3896d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 39045bdb2ffb2878a6c22493af76256d5950dc0a6a2Dmitry Vyukov 3913d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef TSAN_MID_APP_RANGE 3926d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 3933d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MidAppMemBeg(void) { 3943d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_MID_APP_BEG>(); 3953d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 3963d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 3973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MidAppMemEnd(void) { 3983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_MID_APP_END>(); 3996d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 4003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 4016d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4026d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 4033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr HeapMemBeg(void) { 4043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_HEAP_BEG>(); 4053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr HeapMemEnd(void) { 4083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_HEAP_END>(); 4096d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 4106d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4116d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 4123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr HiAppMemBeg(void) { 4133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_HI_APP_BEG>(); 4143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr HiAppMemEnd(void) { 4173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_HI_APP_END>(); 4186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 4196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4206d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 4213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr VdsoBeg(void) { 4223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_VDSO_BEG>(); 4236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 4246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 4263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 4276d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 4283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr AppMemBeg(void) { 4293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_APP_BEG>(); 4303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr AppMemEnd(void) { 4333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_APP_END>(); 4346d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 4356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 4376d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarstatic inline 4393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarbool GetUserRegion(int i, uptr *start, uptr *end) { 4403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar switch (i) { 4413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar default: 4423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return false; 4433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 4443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case 0: 4453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *start = LoAppMemBeg(); 4463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *end = LoAppMemEnd(); 4473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return true; 4483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case 1: 4493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *start = HiAppMemBeg(); 4503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *end = HiAppMemEnd(); 4513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return true; 4523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case 2: 4533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *start = HeapMemBeg(); 4543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *end = HeapMemEnd(); 4553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return true; 4563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# ifdef TSAN_MID_APP_RANGE 4573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case 3: 4583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *start = MidAppMemBeg(); 4593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *end = MidAppMemEnd(); 4603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return true; 4613d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# endif 4623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 4633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar case 0: 4643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *start = AppMemBeg(); 4653d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar *end = AppMemEnd(); 4663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return true; 4673d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 4683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar } 4693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4706d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 4713d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4723d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr ShadowBeg(void) { 4733d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_SHADOW_BEG>(); 4743d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4753d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr ShadowEnd(void) { 4773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_SHADOW_END>(); 4783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 4803d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4813d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MetaShadowBeg(void) { 4823d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_META_SHADOW_BEG>(); 4833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4853d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MetaShadowEnd(void) { 4863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_META_SHADOW_END>(); 4873d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 4893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr TraceMemBeg(void) { 4913d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_TRACE_BEG>(); 4923d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 4933d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 4943d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr TraceMemEnd(void) { 4953d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MappingArchImpl<MAPPING_TRACE_END>(); 4963d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 49745bdb2ffb2878a6c22493af76256d5950dc0a6a2Dmitry Vyukov 4983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 4993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 5003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarbool IsAppMemImpl(uptr mem) { 5013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 5023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return (mem >= Mapping::kHeapMemBeg && mem < Mapping::kHeapMemEnd) || 5033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# ifdef TSAN_MID_APP_RANGE 5043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar (mem >= Mapping::kMidAppMemBeg && mem < Mapping::kMidAppMemEnd) || 5053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# endif 5063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar (mem >= Mapping::kLoAppMemBeg && mem < Mapping::kLoAppMemEnd) || 5073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar (mem >= Mapping::kHiAppMemBeg && mem < Mapping::kHiAppMemEnd); 5083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 5093d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return mem >= Mapping::kAppMemBeg && mem < Mapping::kAppMemEnd; 5103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 5113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 5127ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 5136d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 5146d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesbool IsAppMem(uptr mem) { 5153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 5163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 5173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsAppMemImpl<Mapping39>(mem); 5183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 5193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsAppMemImpl<Mapping42>(mem); 5203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 5213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 5223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 5233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsAppMemImpl<Mapping44>(mem); 5243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 5253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsAppMemImpl<Mapping46>(mem); 5263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 5273d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 5283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsAppMemImpl<Mapping>(mem); 5293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 5303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 5313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 5323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 5333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 5343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarbool IsShadowMemImpl(uptr mem) { 5353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return mem >= Mapping::kShadowBeg && mem <= Mapping::kShadowEnd; 5366d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 5377ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 5386d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 5396d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesbool IsShadowMem(uptr mem) { 5403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 5413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 5423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsShadowMemImpl<Mapping39>(mem); 5433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 5443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsShadowMemImpl<Mapping42>(mem); 5453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 5463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 5473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 5483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsShadowMemImpl<Mapping44>(mem); 5493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 5503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsShadowMemImpl<Mapping46>(mem); 5513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 5523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 5533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsShadowMemImpl<Mapping>(mem); 5543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 5553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 5563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 5573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 5583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 5593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarbool IsMetaMemImpl(uptr mem) { 5603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return mem >= Mapping::kMetaShadowBeg && mem <= Mapping::kMetaShadowEnd; 5616d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 5627ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 5636d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 5646d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesbool IsMetaMem(uptr mem) { 5653d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 5663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 5673d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsMetaMemImpl<Mapping39>(mem); 5683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 5693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsMetaMemImpl<Mapping42>(mem); 5703d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 5713d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 5723d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 5733d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsMetaMemImpl<Mapping44>(mem); 5743d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 5753d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsMetaMemImpl<Mapping46>(mem); 5763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 5773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 5783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return IsMetaMemImpl<Mapping>(mem); 5793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 5807ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 5817ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 5823d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 5833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 5843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MemToShadowImpl(uptr x) { 5856d1862363c88c183b0ed7740fca876342cf0474bStephen Hines DCHECK(IsAppMem(x)); 5863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 5873d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return (((x) & ~(Mapping::kAppMemMsk | (kShadowCell - 1))) 5883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar ^ Mapping::kAppMemXor) * kShadowCnt; 5893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 5903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ((x & ~(kShadowCell - 1)) * kShadowCnt) | Mapping::kShadowBeg; 5913d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 5927ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 5937ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 5946d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 5953d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr MemToShadow(uptr x) { 5963d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 5973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 5983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToShadowImpl<Mapping39>(x); 5993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToShadowImpl<Mapping42>(x); 6013d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 6023d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 6033d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 6043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToShadowImpl<Mapping44>(x); 6053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToShadowImpl<Mapping46>(x); 6073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 6083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 6093d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToShadowImpl<Mapping>(x); 6103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 6113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 6123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 6133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 6143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 6153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaru32 *MemToMetaImpl(uptr x) { 6166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines DCHECK(IsAppMem(x)); 6173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 6183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return (u32*)(((((x) & ~(Mapping::kAppMemMsk | (kMetaShadowCell - 1))) 6193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar ^ Mapping::kAppMemXor) / kMetaShadowCell * kMetaShadowSize) 6203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar | Mapping::kMetaShadowBeg); 6213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 6226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines return (u32*)(((x & ~(kMetaShadowCell - 1)) / \ 6233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar kMetaShadowCell * kMetaShadowSize) | Mapping::kMetaShadowBeg); 6243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 6257ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} 6267ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 6276d1862363c88c183b0ed7740fca876342cf0474bStephen HinesALWAYS_INLINE 6283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaru32 *MemToMeta(uptr x) { 6293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 6303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 6313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToMetaImpl<Mapping39>(x); 6323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToMetaImpl<Mapping42>(x); 6343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 6353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 6363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 6373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToMetaImpl<Mapping44>(x); 6383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToMetaImpl<Mapping46>(x); 6403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 6413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 6423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return MemToMetaImpl<Mapping>(x); 6433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 6443fb44411ae1b9c2a277c04b3f379554290832009Dmitry Vyukov} 6453fb44411ae1b9c2a277c04b3f379554290832009Dmitry Vyukov 64626127735454fddae3495794f38189d57dde6510fDmitry Vyukov 6473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 6483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr ShadowToMemImpl(uptr s) { 6493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(IsShadowMem(s)); 6503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifndef SANITIZER_GO 6513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (s >= MemToShadow(Mapping::kLoAppMemBeg) 6523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar && s <= MemToShadow(Mapping::kLoAppMemEnd - 1)) 6533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return (s / kShadowCnt) ^ Mapping::kAppMemXor; 6543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# ifdef TSAN_MID_APP_RANGE 6553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (s >= MemToShadow(Mapping::kMidAppMemBeg) 6563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar && s <= MemToShadow(Mapping::kMidAppMemEnd - 1)) 6573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ((s / kShadowCnt) ^ Mapping::kAppMemXor) + Mapping::kMidShadowOff; 6583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# endif 6593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ((s / kShadowCnt) ^ Mapping::kAppMemXor) | Mapping::kAppMemMsk; 6616d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#else 6623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# ifndef SANITIZER_WINDOWS 6633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return (s & ~Mapping::kShadowBeg) / kShadowCnt; 6643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# else 6653d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar // FIXME(dvyukov): this is most likely wrong as the mapping is not bijection. 6663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return (s - Mapping::kShadowBeg) / kShadowCnt; 6673d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar# endif // SANITIZER_WINDOWS 6683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 6693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 6703d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 6713d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 6723d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr ShadowToMem(uptr s) { 6733d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 6743d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 6753d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ShadowToMemImpl<Mapping39>(s); 6763d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6773d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ShadowToMemImpl<Mapping42>(s); 6783d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 6793d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 6803d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 6813d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ShadowToMemImpl<Mapping44>(s); 6823d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 6833d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ShadowToMemImpl<Mapping46>(s); 6843d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 6853d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 6863d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return ShadowToMemImpl<Mapping>(s); 6876d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#endif 6883d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 6893d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 6903d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 69101a7ce809bf7cc627d73c045c70bcca9891f632cDmitry Vyukov 69201a7ce809bf7cc627d73c045c70bcca9891f632cDmitry Vyukov// The additional page is to catch shadow stack overflow as paging fault. 6932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Windows wants 64K alignment for mmaps. 6942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst uptr kTotalTraceSize = (kTraceSize * sizeof(Event) + sizeof(Trace) 6952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines + (64 << 10) + (64 << 10) - 1) & ~((64 << 10) - 1); 69601a7ce809bf7cc627d73c045c70bcca9891f632cDmitry Vyukov 6973d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 6983d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr GetThreadTraceImpl(int tid) { 6993d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar uptr p = Mapping::kTraceMemBeg + (uptr)tid * kTotalTraceSize; 7003d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK_LT(p, Mapping::kTraceMemEnd); 7019743d74426ae43898e4da55e591b09be18f8aa6eDmitry Vyukov return p; 7029743d74426ae43898e4da55e591b09be18f8aa6eDmitry Vyukov} 7039743d74426ae43898e4da55e591b09be18f8aa6eDmitry Vyukov 7043d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 7053d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr GetThreadTrace(int tid) { 7063d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 7073d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 7083d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceImpl<Mapping39>(tid); 7093d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 7103d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceImpl<Mapping42>(tid); 7113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 7123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 7133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 7143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceImpl<Mapping44>(tid); 7153d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 7163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceImpl<Mapping46>(tid); 7173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 7183d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 7193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceImpl<Mapping>(tid); 7203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 7213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 7223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 7233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 7243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainartemplate<typename Mapping> 7253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr GetThreadTraceHeaderImpl(int tid) { 7263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar uptr p = Mapping::kTraceMemBeg + (uptr)tid * kTotalTraceSize 72701a7ce809bf7cc627d73c045c70bcca9891f632cDmitry Vyukov + kTraceSize * sizeof(Event); 7283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK_LT(p, Mapping::kTraceMemEnd); 729385542a2e83a4f37de4232d6c72097c1b7d6d44bDmitry Vyukov return p; 730385542a2e83a4f37de4232d6c72097c1b7d6d44bDmitry Vyukov} 7317ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 7323d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarALWAYS_INLINE 7333d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainaruptr GetThreadTraceHeader(int tid) { 7343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#ifdef __aarch64__ 7353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 39) 7363d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceHeaderImpl<Mapping39>(tid); 7373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 7383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceHeaderImpl<Mapping42>(tid); 7393d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 7403d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#elif defined(__powerpc64__) 7413d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (vmaSize == 44) 7423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceHeaderImpl<Mapping44>(tid); 7433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar else 7443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceHeaderImpl<Mapping46>(tid); 7453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar DCHECK(0); 7463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#else 7473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return GetThreadTraceHeaderImpl<Mapping>(tid); 7483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#endif 7493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 7503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 7516d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid InitializePlatform(); 7523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarvoid InitializePlatformEarly(); 7533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarvoid CheckAndProtect(); 7543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarvoid InitializeShadowMemoryPlatform(); 7556d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid FlushShadowMemory(); 7566d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid WriteMemoryProfile(char *buf, uptr buf_size, uptr nthread, uptr nlive); 7577ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 7580c2feef1067818db0ede4531a2e71c9b5595d57aDmitry Vyukov// Says whether the addr relates to a global var. 7590c2feef1067818db0ede4531a2e71c9b5595d57aDmitry Vyukov// Guesses with high probability, may yield both false positives and negatives. 7600c2feef1067818db0ede4531a2e71c9b5595d57aDmitry Vyukovbool IsGlobalVar(uptr addr); 76103f224835f46801a0e22cc2951d21b67304e0457Dmitry Vyukovint ExtractResolvFDs(void *state, int *fds, int nfd); 7622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint ExtractRecvmsgFDs(void *msg, int *fds, int nfd); 7632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint call_pthread_cancel_with_cleanup(int(*fn)(void *c, void *m, 7652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *abstime), void *c, void *m, void *abstime, 7662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void(*cleanup)(void *arg), void *arg); 7677ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 7683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarvoid DestroyThreadState(); 7693d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 7707ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} // namespace __tsan 7717ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany 7725b266cb19c9c18ab5da77441de5cb45f0f4abac1Dmitry Vyukov#endif // TSAN_PLATFORM_H 773