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