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