diff --git a/compiler-rt/lib/asan/asan_linux.cpp b/compiler-rt/lib/asan/asan_linux.cpp index 0b470db86748f..a517de5af00dc 100644 --- a/compiler-rt/lib/asan/asan_linux.cpp +++ b/compiler-rt/lib/asan/asan_linux.cpp @@ -93,8 +93,7 @@ uptr FindDynamicShadowStart() { # endif return MapDynamicShadow(shadow_size_bytes, ASAN_SHADOW_SCALE, - /*min_shadow_base_alignment*/ 0, kHighMemEnd, - GetMmapGranularity()); + /*min_shadow_base_alignment*/ 0, kHighMemEnd); } void AsanApplyToGlobals(globals_op_fptr op, const void *needle) { diff --git a/compiler-rt/lib/asan/asan_mac.cpp b/compiler-rt/lib/asan/asan_mac.cpp index bfc349223258b..b250f796e165f 100644 --- a/compiler-rt/lib/asan/asan_mac.cpp +++ b/compiler-rt/lib/asan/asan_mac.cpp @@ -51,8 +51,7 @@ bool IsSystemHeapAddress (uptr addr) { return false; } uptr FindDynamicShadowStart() { return MapDynamicShadow(MemToShadowSize(kHighMemEnd), ASAN_SHADOW_SCALE, - /*min_shadow_base_alignment*/ 0, kHighMemEnd, - GetMmapGranularity()); + /*min_shadow_base_alignment*/ 0, kHighMemEnd); } // No-op. Mac does not support static linkage anyway. diff --git a/compiler-rt/lib/asan/asan_premap_shadow.cpp b/compiler-rt/lib/asan/asan_premap_shadow.cpp index 6e08b8f966507..bed2f62a22511 100644 --- a/compiler-rt/lib/asan/asan_premap_shadow.cpp +++ b/compiler-rt/lib/asan/asan_premap_shadow.cpp @@ -33,8 +33,7 @@ uptr PremapShadowSize() { // PremapShadowSize() bytes on the right of it are mapped r/o. uptr PremapShadow() { return MapDynamicShadow(PremapShadowSize(), /*mmap_alignment_scale*/ 3, - /*min_shadow_base_alignment*/ 0, kHighMemEnd, - GetMmapGranularity()); + /*min_shadow_base_alignment*/ 0, kHighMemEnd); } bool PremapShadowFailed() { diff --git a/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp b/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp index 48bc3b631ac07..7642ba6c0bf08 100644 --- a/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp +++ b/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp @@ -36,20 +36,15 @@ decltype(__hwasan_shadow)* __hwasan_premap_shadow(); namespace __hwasan { -// We cannot call anything in libc here (see comment above), so we need to -// assume the biggest allowed page size. -// Android max page size is defined as 16k here: -// https://android.googlesource.com/platform/bionic/+/main/libc/platform/bionic/page.h#41 -static constexpr uptr kMaxGranularity = 16384; - // Conservative upper limit. static uptr PremapShadowSize() { - return RoundUpTo(GetMaxVirtualAddress() >> kShadowScale, kMaxGranularity); + return RoundUpTo(GetMaxVirtualAddress() >> kShadowScale, + GetMmapGranularity()); } static uptr PremapShadow() { return MapDynamicShadow(PremapShadowSize(), kShadowScale, - kShadowBaseAlignment, kHighMemEnd, kMaxGranularity); + kShadowBaseAlignment, kHighMemEnd); } static bool IsPremapShadowAvailable() { @@ -61,7 +56,7 @@ static bool IsPremapShadowAvailable() { } static uptr FindPremappedShadowStart(uptr shadow_size_bytes) { - const uptr granularity = kMaxGranularity; + const uptr granularity = GetMmapGranularity(); const uptr shadow_start = reinterpret_cast(&__hwasan_shadow); const uptr premap_shadow_size = PremapShadowSize(); const uptr shadow_size = RoundUpTo(shadow_size_bytes, granularity); @@ -114,7 +109,7 @@ uptr FindDynamicShadowStart(uptr shadow_size_bytes) { if (IsPremapShadowAvailable()) return FindPremappedShadowStart(shadow_size_bytes); return MapDynamicShadow(shadow_size_bytes, kShadowScale, kShadowBaseAlignment, - kHighMemEnd, kMaxGranularity); + kHighMemEnd); } } // namespace __hwasan @@ -140,7 +135,7 @@ uptr FindDynamicShadowStart(uptr shadow_size_bytes) { RingBufferSize()); # endif return MapDynamicShadow(shadow_size_bytes, kShadowScale, kShadowBaseAlignment, - kHighMemEnd, GetMmapGranularity()); + kHighMemEnd); } } // namespace __hwasan diff --git a/compiler-rt/lib/memprof/memprof_linux.cpp b/compiler-rt/lib/memprof/memprof_linux.cpp index fbe5d250f840b..26a2b456b874e 100644 --- a/compiler-rt/lib/memprof/memprof_linux.cpp +++ b/compiler-rt/lib/memprof/memprof_linux.cpp @@ -58,8 +58,7 @@ void InitializePlatformExceptionHandlers() {} uptr FindDynamicShadowStart() { uptr shadow_size_bytes = MemToShadowSize(kHighMemEnd); return MapDynamicShadow(shadow_size_bytes, SHADOW_SCALE, - /*min_shadow_base_alignment*/ 0, kHighMemEnd, - GetMmapGranularity()); + /*min_shadow_base_alignment*/ 0, kHighMemEnd); } void *MemprofDlSymNext(const char *sym) { return dlsym(RTLD_NEXT, sym); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index 2d1059140c303..c451fc962c529 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -60,10 +60,14 @@ inline int Verbosity() { return atomic_load(¤t_verbosity, memory_order_relaxed); } -#if SANITIZER_ANDROID && !defined(__aarch64__) -// 32-bit Android only has 4k pages. -inline uptr GetPageSize() { return 4096; } -inline uptr GetPageSizeCached() { return 4096; } +#if SANITIZER_ANDROID +inline uptr GetPageSize() { +// Android post-M sysconf(_SC_PAGESIZE) crashes if called from .preinit_array. + return 4096; +} +inline uptr GetPageSizeCached() { + return 4096; +} #else uptr GetPageSize(); extern uptr PageSizeCached; @@ -73,7 +77,6 @@ inline uptr GetPageSizeCached() { return PageSizeCached; } #endif - uptr GetMmapGranularity(); uptr GetMaxVirtualAddress(); uptr GetMaxUserVirtualAddress(); @@ -88,7 +91,6 @@ void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, // Memory management void *MmapOrDie(uptr size, const char *mem_type, bool raw_report = false); - inline void *MmapOrDieQuietly(uptr size, const char *mem_type) { return MmapOrDie(size, mem_type, /*raw_report*/ true); } @@ -137,8 +139,7 @@ void UnmapFromTo(uptr from, uptr to); // shadow_size_bytes bytes on the right, which on linux is mapped no access. // The high_mem_end may be updated if the original shadow size doesn't fit. uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale, - uptr min_shadow_base_alignment, uptr &high_mem_end, - uptr granularity); + uptr min_shadow_base_alignment, uptr &high_mem_end); // Let S = max(shadow_size, num_aliases * alias_size, ring_buffer_size). // Reserves 2*S bytes of address space to the right of the returned address and diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index d15caa76efb06..5d2dd3a7a658f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -1136,7 +1136,7 @@ uptr GetMaxUserVirtualAddress() { return addr; } -# if !SANITIZER_ANDROID || defined(__aarch64__) +# if !SANITIZER_ANDROID uptr GetPageSize() { # if SANITIZER_LINUX && (defined(__x86_64__) || defined(__i386__)) && \ defined(EXEC_PAGESIZE) @@ -1155,7 +1155,7 @@ uptr GetPageSize() { return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy. # endif } -# endif +# endif // !SANITIZER_ANDROID uptr ReadBinaryName(/*out*/ char *buf, uptr buf_len) { # if SANITIZER_SOLARIS diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index 175362183fd78..6d05411222d9e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -995,8 +995,9 @@ void UnmapFromTo(uptr from, uptr to) { } uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale, - uptr min_shadow_base_alignment, UNUSED uptr &high_mem_end, - uptr granularity) { + uptr min_shadow_base_alignment, + UNUSED uptr &high_mem_end) { + const uptr granularity = GetMmapGranularity(); const uptr alignment = Max(granularity << shadow_scale, 1ULL << min_shadow_base_alignment); const uptr left_padding = diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp index cbdf3e95925bf..24e3d1112520e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp @@ -1188,8 +1188,8 @@ uptr GetMaxVirtualAddress() { } uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale, - uptr min_shadow_base_alignment, uptr &high_mem_end, - uptr granularity) { + uptr min_shadow_base_alignment, uptr &high_mem_end) { + const uptr granularity = GetMmapGranularity(); const uptr alignment = Max(granularity << shadow_scale, 1ULL << min_shadow_base_alignment); const uptr left_padding = diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp index 0b198890fc798..4e5ad8e4693b4 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp @@ -384,8 +384,9 @@ bool DontDumpShadowMemory(uptr addr, uptr length) { } uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale, - uptr min_shadow_base_alignment, UNUSED uptr &high_mem_end, - uptr granularity) { + uptr min_shadow_base_alignment, + UNUSED uptr &high_mem_end) { + const uptr granularity = GetMmapGranularity(); const uptr alignment = Max(granularity << shadow_scale, 1ULL << min_shadow_base_alignment); const uptr left_padding =