@@ -29,35 +29,42 @@ namespace __tsan {
29
29
#if defined(__x86_64__)
30
30
/*
31
31
C/C++ on linux/x86_64 and freebsd/x86_64
32
- 0000 0000 1000 - 0100 0000 0000: main binary and/or MAP_32BIT mappings
33
- 0100 0000 0000 - 0200 0000 0000: -
34
- 0200 0000 0000 - 1000 0000 0000: shadow
32
+ 0000 0000 1000 - 0040 0000 0000: main binary and/or MAP_32BIT mappings (256GB)
33
+ 0040 0000 0000 - 0100 0000 0000: -
34
+ 0100 0000 0000 - 1000 0000 0000: shadow
35
35
1000 0000 0000 - 3000 0000 0000: -
36
36
3000 0000 0000 - 4000 0000 0000: metainfo (memory blocks and sync objects)
37
- 4000 0000 0000 - 6000 0000 0000: -
37
+ 4000 0000 0000 - 5540 0000 0000: -
38
+ 5540 0000 0000 - 5680 0000 0000: pie binaries without ASLR or on 4.1+ kernels
39
+ 5680 0000 0000 - 6000 0000 0000: -
38
40
6000 0000 0000 - 6200 0000 0000: traces
39
41
6200 0000 0000 - 7d00 0000 0000: -
40
- 7d00 0000 0000 - 7e00 0000 0000: heap
41
- 7e00 0000 0000 - 7e80 0000 0000: -
42
- 7e80 0000 0000 - 8000 0000 0000: modules and main thread stack
42
+ 7c40 0000 0000 - 7d40 0000 0000: heap
43
+ 7d40 0000 0000 - 7ec0 0000 0000: -
44
+ 7ec0 0000 0000 - 8000 0000 0000: modules and main thread stack
43
45
*/
44
46
struct Mapping {
45
47
static const uptr kMetaShadowBeg = 0x300000000000ull ;
46
48
static const uptr kMetaShadowEnd = 0x400000000000ull ;
47
49
static const uptr kTraceMemBeg = 0x600000000000ull ;
48
50
static const uptr kTraceMemEnd = 0x620000000000ull ;
49
- static const uptr kShadowBeg = 0x020000000000ull ;
51
+ static const uptr kShadowBeg = 0x010000000000ull ;
50
52
static const uptr kShadowEnd = 0x100000000000ull ;
51
- static const uptr kHeapMemBeg = 0x7d0000000000ull ;
52
- static const uptr kHeapMemEnd = 0x7e0000000000ull ;
53
+ static const uptr kHeapMemBeg = 0x7c4000000000ull ;
54
+ static const uptr kHeapMemEnd = 0x7d4000000000ull ;
53
55
static const uptr kLoAppMemBeg = 0x000000001000ull ;
54
- static const uptr kLoAppMemEnd = 0x010000000000ull ;
55
- static const uptr kHiAppMemBeg = 0x7e8000000000ull ;
56
+ static const uptr kLoAppMemEnd = 0x004000000000ull ;
57
+ static const uptr kMidAppMemBeg = 0x554000000000ull ;
58
+ static const uptr kMidAppMemEnd = 0x568000000000ull ;
59
+ static const uptr kMidShadowOff = 0x540000000000ull ;
60
+ static const uptr kHiAppMemBeg = 0x7ec000000000ull ;
56
61
static const uptr kHiAppMemEnd = 0x800000000000ull ;
57
62
static const uptr kAppMemMsk = 0x7c0000000000ull ;
58
- static const uptr kAppMemXor = 0x020000000000ull ;
63
+ static const uptr kAppMemXor = 0x028000000000ull ;
59
64
static const uptr kVdsoBeg = 0xf000000000000000ull ;
60
65
};
66
+
67
+ #define TSAN_MID_APP_RANGE 1
61
68
#elif defined(__mips64)
62
69
/*
63
70
C/C++ on linux/mips64
@@ -652,17 +659,23 @@ template<typename Mapping>
652
659
uptr ShadowToMemImpl (uptr s) {
653
660
DCHECK (IsShadowMem (s));
654
661
#ifndef SANITIZER_GO
655
- if (s >= MemToShadow (Mapping::kLoAppMemBeg )
656
- && s <= MemToShadow (Mapping::kLoAppMemEnd - 1 ))
657
- return (s / kShadowCnt ) ^ Mapping::kAppMemXor ;
662
+ // The shadow mapping is non-linear and we've lost some bits, so we don't have
663
+ // an easy way to restore the original app address. But the mapping is a
664
+ // bijection, so we try to restore the address as belonging to low/mid/high
665
+ // range consecutively and see if shadow->app->shadow mapping gives us the
666
+ // same address.
667
+ uptr p = (s / kShadowCnt ) ^ Mapping::kAppMemXor ;
668
+ if (MemToShadow (p) == s &&
669
+ p >= Mapping::kLoAppMemBeg && p < Mapping::kLoAppMemEnd )
670
+ return p;
658
671
# ifdef TSAN_MID_APP_RANGE
659
- if (s >= MemToShadow (Mapping::kMidAppMemBeg )
660
- && s <= MemToShadow (Mapping::kMidAppMemEnd - 1 ))
661
- return ((s / kShadowCnt ) ^ Mapping::kAppMemXor ) + Mapping::kMidShadowOff ;
672
+ p = ((s / kShadowCnt ) ^ Mapping::kAppMemXor ) + Mapping::kMidShadowOff ;
673
+ if (MemToShadow (p) == s &&
674
+ p >= Mapping::kMidAppMemBeg && p < Mapping::kMidAppMemEnd )
675
+ return p;
662
676
# endif
663
- else
664
- return ((s / kShadowCnt ) ^ Mapping::kAppMemXor ) | Mapping::kAppMemMsk ;
665
- #else
677
+ return ((s / kShadowCnt ) ^ Mapping::kAppMemXor ) | Mapping::kAppMemMsk ;
678
+ #else // #ifndef SANITIZER_GO
666
679
# ifndef SANITIZER_WINDOWS
667
680
return (s & ~Mapping::kShadowBeg ) / kShadowCnt ;
668
681
# else
0 commit comments