1 //===-- memprof_shadow_setup.cpp -----------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is a part of MemProfiler, a memory profiler. 10 // 11 // Set up the shadow memory. 12 //===----------------------------------------------------------------------===// 13 14 #include "sanitizer_common/sanitizer_platform.h" 15 16 #include "memprof_internal.h" 17 #include "memprof_mapping.h" 18 19 namespace __memprof { 20 21 static void ProtectGap(uptr addr, uptr size) { 22 if (!flags()->protect_shadow_gap) { 23 // The shadow gap is unprotected, so there is a chance that someone 24 // is actually using this memory. Which means it needs a shadow... 25 uptr GapShadowBeg = RoundDownTo(MEM_TO_SHADOW(addr), GetPageSizeCached()); 26 uptr GapShadowEnd = 27 RoundUpTo(MEM_TO_SHADOW(addr + size), GetPageSizeCached()) - 1; 28 if (Verbosity()) 29 Printf("protect_shadow_gap=0:" 30 " not protecting shadow gap, allocating gap's shadow\n" 31 "|| `[%p, %p]` || ShadowGap's shadow ||\n", 32 GapShadowBeg, GapShadowEnd); 33 ReserveShadowMemoryRange(GapShadowBeg, GapShadowEnd, 34 "unprotected gap shadow"); 35 return; 36 } 37 __sanitizer::ProtectGap(addr, size, kZeroBaseShadowStart, 38 kZeroBaseMaxShadowStart); 39 } 40 41 void InitializeShadowMemory() { 42 uptr shadow_start = FindDynamicShadowStart(); 43 // Update the shadow memory address (potentially) used by instrumentation. 44 __memprof_shadow_memory_dynamic_address = shadow_start; 45 46 if (kLowShadowBeg) 47 shadow_start -= GetMmapGranularity(); 48 49 if (Verbosity()) 50 PrintAddressSpaceLayout(); 51 52 // mmap the low shadow plus at least one page at the left. 53 if (kLowShadowBeg) 54 ReserveShadowMemoryRange(shadow_start, kLowShadowEnd, "low shadow"); 55 // mmap the high shadow. 56 ReserveShadowMemoryRange(kHighShadowBeg, kHighShadowEnd, "high shadow"); 57 // protect the gap. 58 ProtectGap(kShadowGapBeg, kShadowGapEnd - kShadowGapBeg + 1); 59 CHECK_EQ(kShadowGapEnd, kHighShadowBeg - 1); 60 } 61 62 } // namespace __memprof 63