Commit c191b1ab by Marek Polacek Committed by Marek Polacek

Cherry-pick compiler-rt revision 318044 and 319180.

    [PowerPC][tsan] Update tsan to handle changed memory layouts in newer kernels
    
    In more recent Linux kernels with 47 bit VMAs the layout of virtual memory
    for powerpc64 changed causing the thread sanitizer to not work properly. This
    patch adds support for 47 bit VMA kernels for powerpc64.
    
    Tested on several 4.x and 3.x kernel releases.

Regtested/bootstrapped on ppc64le-linux with kernel 4.14; applying to
trunk/8.3.

2018-08-01  Marek Polacek  <polacek@redhat.com>

	PR sanitizer/86759
	* tsan/tsan_platform.h: Cherry-pick compiler-rt revision 318044.
	* tsan/tsan_platform_linux.cc: Cherry-pick compiler-rt revision
	319180.

From-SVN: r263229
parent 616fc41c
2018-08-01 Marek Polacek <polacek@redhat.com>
PR sanitizer/86759
* tsan/tsan_platform.h: Cherry-pick compiler-rt revision 318044.
* tsan/tsan_platform_linux.cc: Cherry-pick compiler-rt revision
319180.
2018-07-25 H.J. Lu <hongjiu.lu@intel.com> 2018-07-25 H.J. Lu <hongjiu.lu@intel.com>
PR target/86560 PR target/86560
......
...@@ -301,6 +301,38 @@ struct Mapping46 { ...@@ -301,6 +301,38 @@ struct Mapping46 {
static const uptr kVdsoBeg = 0x7800000000000000ull; static const uptr kVdsoBeg = 0x7800000000000000ull;
}; };
/*
C/C++ on linux/powerpc64 (47-bit VMA)
0000 0000 1000 - 0100 0000 0000: main binary
0100 0000 0000 - 0200 0000 0000: -
0100 0000 0000 - 1000 0000 0000: shadow
1000 0000 0000 - 1000 0000 0000: -
1000 0000 0000 - 2000 0000 0000: metainfo (memory blocks and sync objects)
2000 0000 0000 - 2000 0000 0000: -
2000 0000 0000 - 2200 0000 0000: traces
2200 0000 0000 - 7d00 0000 0000: -
7d00 0000 0000 - 7e00 0000 0000: heap
7e00 0000 0000 - 7e80 0000 0000: -
7e80 0000 0000 - 8000 0000 0000: modules and main thread stack
*/
struct Mapping47 {
static const uptr kMetaShadowBeg = 0x100000000000ull;
static const uptr kMetaShadowEnd = 0x200000000000ull;
static const uptr kTraceMemBeg = 0x200000000000ull;
static const uptr kTraceMemEnd = 0x220000000000ull;
static const uptr kShadowBeg = 0x010000000000ull;
static const uptr kShadowEnd = 0x100000000000ull;
static const uptr kHeapMemBeg = 0x7d0000000000ull;
static const uptr kHeapMemEnd = 0x7e0000000000ull;
static const uptr kLoAppMemBeg = 0x000000001000ull;
static const uptr kLoAppMemEnd = 0x010000000000ull;
static const uptr kHiAppMemBeg = 0x7e8000000000ull;
static const uptr kHiAppMemEnd = 0x800000000000ull; // 47 bits
static const uptr kAppMemMsk = 0x7c0000000000ull;
static const uptr kAppMemXor = 0x020000000000ull;
static const uptr kVdsoBeg = 0x7800000000000000ull;
};
// Indicates the runtime will define the memory regions at runtime. // Indicates the runtime will define the memory regions at runtime.
#define TSAN_RUNTIME_VMA 1 #define TSAN_RUNTIME_VMA 1
#endif #endif
...@@ -427,11 +459,13 @@ uptr MappingArchImpl(void) { ...@@ -427,11 +459,13 @@ uptr MappingArchImpl(void) {
DCHECK(0); DCHECK(0);
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return MappingImpl<Mapping44, Type>(); case 44: return MappingImpl<Mapping44, Type>();
else case 46: return MappingImpl<Mapping46, Type>();
return MappingImpl<Mapping46, Type>(); case 47: return MappingImpl<Mapping47, Type>();
}
DCHECK(0); DCHECK(0);
return 0;
#else #else
return MappingImpl<Mapping, Type>(); return MappingImpl<Mapping, Type>();
#endif #endif
...@@ -580,11 +614,13 @@ bool IsAppMem(uptr mem) { ...@@ -580,11 +614,13 @@ bool IsAppMem(uptr mem) {
DCHECK(0); DCHECK(0);
return false; return false;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return IsAppMemImpl<Mapping44>(mem); case 44: return IsAppMemImpl<Mapping44>(mem);
else case 46: return IsAppMemImpl<Mapping46>(mem);
return IsAppMemImpl<Mapping46>(mem); case 47: return IsAppMemImpl<Mapping47>(mem);
}
DCHECK(0); DCHECK(0);
return false;
#else #else
return IsAppMemImpl<Mapping>(mem); return IsAppMemImpl<Mapping>(mem);
#endif #endif
...@@ -607,11 +643,13 @@ bool IsShadowMem(uptr mem) { ...@@ -607,11 +643,13 @@ bool IsShadowMem(uptr mem) {
DCHECK(0); DCHECK(0);
return false; return false;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return IsShadowMemImpl<Mapping44>(mem); case 44: return IsShadowMemImpl<Mapping44>(mem);
else case 46: return IsShadowMemImpl<Mapping46>(mem);
return IsShadowMemImpl<Mapping46>(mem); case 47: return IsShadowMemImpl<Mapping47>(mem);
}
DCHECK(0); DCHECK(0);
return false;
#else #else
return IsShadowMemImpl<Mapping>(mem); return IsShadowMemImpl<Mapping>(mem);
#endif #endif
...@@ -634,11 +672,13 @@ bool IsMetaMem(uptr mem) { ...@@ -634,11 +672,13 @@ bool IsMetaMem(uptr mem) {
DCHECK(0); DCHECK(0);
return false; return false;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return IsMetaMemImpl<Mapping44>(mem); case 44: return IsMetaMemImpl<Mapping44>(mem);
else case 46: return IsMetaMemImpl<Mapping46>(mem);
return IsMetaMemImpl<Mapping46>(mem); case 47: return IsMetaMemImpl<Mapping47>(mem);
}
DCHECK(0); DCHECK(0);
return false;
#else #else
return IsMetaMemImpl<Mapping>(mem); return IsMetaMemImpl<Mapping>(mem);
#endif #endif
...@@ -671,11 +711,13 @@ uptr MemToShadow(uptr x) { ...@@ -671,11 +711,13 @@ uptr MemToShadow(uptr x) {
DCHECK(0); DCHECK(0);
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return MemToShadowImpl<Mapping44>(x); case 44: return MemToShadowImpl<Mapping44>(x);
else case 46: return MemToShadowImpl<Mapping46>(x);
return MemToShadowImpl<Mapping46>(x); case 47: return MemToShadowImpl<Mapping47>(x);
}
DCHECK(0); DCHECK(0);
return 0;
#else #else
return MemToShadowImpl<Mapping>(x); return MemToShadowImpl<Mapping>(x);
#endif #endif
...@@ -710,11 +752,13 @@ u32 *MemToMeta(uptr x) { ...@@ -710,11 +752,13 @@ u32 *MemToMeta(uptr x) {
DCHECK(0); DCHECK(0);
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return MemToMetaImpl<Mapping44>(x); case 44: return MemToMetaImpl<Mapping44>(x);
else case 46: return MemToMetaImpl<Mapping46>(x);
return MemToMetaImpl<Mapping46>(x); case 47: return MemToMetaImpl<Mapping47>(x);
}
DCHECK(0); DCHECK(0);
return 0;
#else #else
return MemToMetaImpl<Mapping>(x); return MemToMetaImpl<Mapping>(x);
#endif #endif
...@@ -762,11 +806,13 @@ uptr ShadowToMem(uptr s) { ...@@ -762,11 +806,13 @@ uptr ShadowToMem(uptr s) {
DCHECK(0); DCHECK(0);
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return ShadowToMemImpl<Mapping44>(s); case 44: return ShadowToMemImpl<Mapping44>(s);
else case 46: return ShadowToMemImpl<Mapping46>(s);
return ShadowToMemImpl<Mapping46>(s); case 47: return ShadowToMemImpl<Mapping47>(s);
}
DCHECK(0); DCHECK(0);
return 0;
#else #else
return ShadowToMemImpl<Mapping>(s); return ShadowToMemImpl<Mapping>(s);
#endif #endif
...@@ -797,11 +843,13 @@ uptr GetThreadTrace(int tid) { ...@@ -797,11 +843,13 @@ uptr GetThreadTrace(int tid) {
DCHECK(0); DCHECK(0);
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return GetThreadTraceImpl<Mapping44>(tid); case 44: return GetThreadTraceImpl<Mapping44>(tid);
else case 46: return GetThreadTraceImpl<Mapping46>(tid);
return GetThreadTraceImpl<Mapping46>(tid); case 47: return GetThreadTraceImpl<Mapping47>(tid);
}
DCHECK(0); DCHECK(0);
return 0;
#else #else
return GetThreadTraceImpl<Mapping>(tid); return GetThreadTraceImpl<Mapping>(tid);
#endif #endif
...@@ -827,11 +875,13 @@ uptr GetThreadTraceHeader(int tid) { ...@@ -827,11 +875,13 @@ uptr GetThreadTraceHeader(int tid) {
DCHECK(0); DCHECK(0);
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize == 44) switch (vmaSize) {
return GetThreadTraceHeaderImpl<Mapping44>(tid); case 44: return GetThreadTraceHeaderImpl<Mapping44>(tid);
else case 46: return GetThreadTraceHeaderImpl<Mapping46>(tid);
return GetThreadTraceHeaderImpl<Mapping46>(tid); case 47: return GetThreadTraceHeaderImpl<Mapping47>(tid);
}
DCHECK(0); DCHECK(0);
return 0;
#else #else
return GetThreadTraceHeaderImpl<Mapping>(tid); return GetThreadTraceHeaderImpl<Mapping>(tid);
#endif #endif
......
...@@ -214,9 +214,9 @@ void InitializePlatformEarly() { ...@@ -214,9 +214,9 @@ void InitializePlatformEarly() {
Die(); Die();
} }
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
if (vmaSize != 44 && vmaSize != 46) { if (vmaSize != 44 && vmaSize != 46 && vmaSize != 47) {
Printf("FATAL: ThreadSanitizer: unsupported VMA range\n"); Printf("FATAL: ThreadSanitizer: unsupported VMA range\n");
Printf("FATAL: Found %d - Supported 44 and 46\n", vmaSize); Printf("FATAL: Found %d - Supported 44, 46, and 47\n", vmaSize);
Die(); Die();
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment