@@ -33,12 +33,18 @@ struct MappingDesc {
33
33
uptr start;
34
34
uptr end;
35
35
enum Type {
36
- INVALID, APP, SHADOW, ORIGIN
36
+ INVALID = 1 ,
37
+ ALLOCATOR = 2 ,
38
+ APP = 4 ,
39
+ SHADOW = 8 ,
40
+ ORIGIN = 16 ,
37
41
} type;
38
42
const char *name;
39
43
};
40
44
41
-
45
+ // Note: MappingDesc::ALLOCATOR entries are only used to check for memory
46
+ // layout compatibility. The actual allocation settings are in
47
+ // msan_allocator.cpp, which need to be kept in sync.
42
48
#if SANITIZER_LINUX && defined(__mips64)
43
49
44
50
// MIPS64 maps:
@@ -65,98 +71,30 @@ const MappingDesc kMemoryLayout[] = {
65
71
66
72
#elif SANITIZER_LINUX && defined(__aarch64__)
67
73
68
- // The mapping describes both 39-bits, 42-bits, and 48-bits VMA. AArch64
69
- // maps:
70
- // - 0x0000000000000-0x0000010000000: 39/42/48-bits program own segments
71
- // - 0x0005500000000-0x0005600000000: 39-bits PIE program segments
72
- // - 0x0007f80000000-0x0007fffffffff: 39-bits libraries segments
73
- // - 0x002aa00000000-0x002ab00000000: 42-bits PIE program segments
74
- // - 0x003ff00000000-0x003ffffffffff: 42-bits libraries segments
75
- // - 0x0aaaaa0000000-0x0aaab00000000: 48-bits PIE program segments
76
- // - 0xffff000000000-0x1000000000000: 48-bits libraries segments
77
- // It is fragmented in multiples segments to increase the memory available
78
- // on 42-bits (12.21% of total VMA available for 42-bits and 13.28 for
79
- // 39 bits). The 48-bits segments only cover the usual PIE/default segments
80
- // plus some more segments (262144GB total, 0.39% total VMA).
74
+ // The mapping assumes 48-bit VMA. AArch64 maps:
75
+ // - 0x0000000000000-0x0100000000000: 39/42/48-bits program own segments
76
+ // - 0x0a00000000000-0x0b00000000000: 48-bits PIE program segments
77
+ // Ideally, this would extend to 0x0c00000000000 (2^45 bytes - the
78
+ // maximum ASLR region for 48-bit VMA) but it is too hard to fit in
79
+ // the larger app/shadow/origin regions.
80
+ // - 0x0e00000000000-0x1000000000000: 48-bits libraries segments
81
81
const MappingDesc kMemoryLayout [] = {
82
- {0x00000000000ULL , 0x01000000000ULL , MappingDesc::INVALID, " invalid" },
83
- {0x01000000000ULL , 0x02000000000ULL , MappingDesc::SHADOW, " shadow-2" },
84
- {0x02000000000ULL , 0x03000000000ULL , MappingDesc::ORIGIN, " origin-2" },
85
- {0x03000000000ULL , 0x04000000000ULL , MappingDesc::SHADOW, " shadow-1" },
86
- {0x04000000000ULL , 0x05000000000ULL , MappingDesc::ORIGIN, " origin-1" },
87
- {0x05000000000ULL , 0x06000000000ULL , MappingDesc::APP, " app-1" },
88
- {0x06000000000ULL , 0x07000000000ULL , MappingDesc::INVALID, " invalid" },
89
- {0x07000000000ULL , 0x08000000000ULL , MappingDesc::APP, " app-2" },
90
- {0x08000000000ULL , 0x09000000000ULL , MappingDesc::INVALID, " invalid" },
91
- // The mappings below are used only for 42-bits VMA.
92
- {0x09000000000ULL , 0x0A000000000ULL , MappingDesc::SHADOW, " shadow-3" },
93
- {0x0A000000000ULL , 0x0B000000000ULL , MappingDesc::ORIGIN, " origin-3" },
94
- {0x0B000000000ULL , 0x0F000000000ULL , MappingDesc::INVALID, " invalid" },
95
- {0x0F000000000ULL , 0x10000000000ULL , MappingDesc::APP, " app-3" },
96
- {0x10000000000ULL , 0x11000000000ULL , MappingDesc::INVALID, " invalid" },
97
- {0x11000000000ULL , 0x12000000000ULL , MappingDesc::APP, " app-4" },
98
- {0x12000000000ULL , 0x17000000000ULL , MappingDesc::INVALID, " invalid" },
99
- {0x17000000000ULL , 0x18000000000ULL , MappingDesc::SHADOW, " shadow-4" },
100
- {0x18000000000ULL , 0x19000000000ULL , MappingDesc::ORIGIN, " origin-4" },
101
- {0x19000000000ULL , 0x20000000000ULL , MappingDesc::INVALID, " invalid" },
102
- {0x20000000000ULL , 0x21000000000ULL , MappingDesc::APP, " app-5" },
103
- {0x21000000000ULL , 0x26000000000ULL , MappingDesc::INVALID, " invalid" },
104
- {0x26000000000ULL , 0x27000000000ULL , MappingDesc::SHADOW, " shadow-5" },
105
- {0x27000000000ULL , 0x28000000000ULL , MappingDesc::ORIGIN, " origin-5" },
106
- {0x28000000000ULL , 0x29000000000ULL , MappingDesc::SHADOW, " shadow-7" },
107
- {0x29000000000ULL , 0x2A000000000ULL , MappingDesc::ORIGIN, " origin-7" },
108
- {0x2A000000000ULL , 0x2B000000000ULL , MappingDesc::APP, " app-6" },
109
- {0x2B000000000ULL , 0x2C000000000ULL , MappingDesc::INVALID, " invalid" },
110
- {0x2C000000000ULL , 0x2D000000000ULL , MappingDesc::SHADOW, " shadow-6" },
111
- {0x2D000000000ULL , 0x2E000000000ULL , MappingDesc::ORIGIN, " origin-6" },
112
- {0x2E000000000ULL , 0x2F000000000ULL , MappingDesc::APP, " app-7" },
113
- {0x2F000000000ULL , 0x39000000000ULL , MappingDesc::INVALID, " invalid" },
114
- {0x39000000000ULL , 0x3A000000000ULL , MappingDesc::SHADOW, " shadow-9" },
115
- {0x3A000000000ULL , 0x3B000000000ULL , MappingDesc::ORIGIN, " origin-9" },
116
- {0x3B000000000ULL , 0x3C000000000ULL , MappingDesc::APP, " app-8" },
117
- {0x3C000000000ULL , 0x3D000000000ULL , MappingDesc::INVALID, " invalid" },
118
- {0x3D000000000ULL , 0x3E000000000ULL , MappingDesc::SHADOW, " shadow-8" },
119
- {0x3E000000000ULL , 0x3F000000000ULL , MappingDesc::ORIGIN, " origin-8" },
120
- {0x3F000000000ULL , 0x40000000000ULL , MappingDesc::APP, " app-9" },
121
- // The mappings below are used only for 48-bits VMA.
122
- // TODO(unknown): 48-bit mapping ony covers the usual PIE, non-PIE
123
- // segments and some more segments totalizing 262144GB of VMA (which cover
124
- // only 0.32% of all 48-bit VMA). Memory availability can be increase by
125
- // adding multiple application segments like 39 and 42 mapping.
126
- {0x0040000000000ULL , 0x0041000000000ULL , MappingDesc::INVALID, " invalid" },
127
- {0x0041000000000ULL , 0x0042000000000ULL , MappingDesc::APP, " app-10" },
128
- {0x0042000000000ULL , 0x0047000000000ULL , MappingDesc::INVALID, " invalid" },
129
- {0x0047000000000ULL , 0x0048000000000ULL , MappingDesc::SHADOW, " shadow-10" },
130
- {0x0048000000000ULL , 0x0049000000000ULL , MappingDesc::ORIGIN, " origin-10" },
131
- {0x0049000000000ULL , 0x0050000000000ULL , MappingDesc::INVALID, " invalid" },
132
- {0x0050000000000ULL , 0x0051000000000ULL , MappingDesc::APP, " app-11" },
133
- {0x0051000000000ULL , 0x0056000000000ULL , MappingDesc::INVALID, " invalid" },
134
- {0x0056000000000ULL , 0x0057000000000ULL , MappingDesc::SHADOW, " shadow-11" },
135
- {0x0057000000000ULL , 0x0058000000000ULL , MappingDesc::ORIGIN, " origin-11" },
136
- {0x0058000000000ULL , 0x0059000000000ULL , MappingDesc::APP, " app-12" },
137
- {0x0059000000000ULL , 0x005E000000000ULL , MappingDesc::INVALID, " invalid" },
138
- {0x005E000000000ULL , 0x005F000000000ULL , MappingDesc::SHADOW, " shadow-12" },
139
- {0x005F000000000ULL , 0x0060000000000ULL , MappingDesc::ORIGIN, " origin-12" },
140
- {0x0060000000000ULL , 0x0061000000000ULL , MappingDesc::INVALID, " invalid" },
141
- {0x0061000000000ULL , 0x0062000000000ULL , MappingDesc::APP, " app-13" },
142
- {0x0062000000000ULL , 0x0067000000000ULL , MappingDesc::INVALID, " invalid" },
143
- {0x0067000000000ULL , 0x0068000000000ULL , MappingDesc::SHADOW, " shadow-13" },
144
- {0x0068000000000ULL , 0x0069000000000ULL , MappingDesc::ORIGIN, " origin-13" },
145
- {0x0069000000000ULL , 0x0AAAAA0000000ULL , MappingDesc::INVALID, " invalid" },
146
- {0x0AAAAA0000000ULL , 0x0AAAB00000000ULL , MappingDesc::APP, " app-14" },
147
- {0x0AAAB00000000ULL , 0x0AACAA0000000ULL , MappingDesc::INVALID, " invalid" },
148
- {0x0AACAA0000000ULL , 0x0AACB00000000ULL , MappingDesc::SHADOW, " shadow-14" },
149
- {0x0AACB00000000ULL , 0x0AADAA0000000ULL , MappingDesc::INVALID, " invalid" },
150
- {0x0AADAA0000000ULL , 0x0AADB00000000ULL , MappingDesc::ORIGIN, " origin-14" },
151
- {0x0AADB00000000ULL , 0x0FF9F00000000ULL , MappingDesc::INVALID, " invalid" },
152
- {0x0FF9F00000000ULL , 0x0FFA000000000ULL , MappingDesc::SHADOW, " shadow-15" },
153
- {0x0FFA000000000ULL , 0x0FFAF00000000ULL , MappingDesc::INVALID, " invalid" },
154
- {0x0FFAF00000000ULL , 0x0FFB000000000ULL , MappingDesc::ORIGIN, " origin-15" },
155
- {0x0FFB000000000ULL , 0x0FFFF00000000ULL , MappingDesc::INVALID, " invalid" },
156
- {0x0FFFF00000000ULL , 0x1000000000000ULL , MappingDesc::APP, " app-15" },
82
+ {0X0000000000000 , 0X0100000000000 , MappingDesc::APP, " app-10-13" },
83
+ {0X0100000000000 , 0X0200000000000 , MappingDesc::SHADOW, " shadow-14" },
84
+ {0X0200000000000 , 0X0300000000000 , MappingDesc::INVALID, " invalid" },
85
+ {0X0300000000000 , 0X0400000000000 , MappingDesc::ORIGIN, " origin-14" },
86
+ {0X0400000000000 , 0X0600000000000 , MappingDesc::SHADOW, " shadow-15" },
87
+ {0X0600000000000 , 0X0800000000000 , MappingDesc::ORIGIN, " origin-15" },
88
+ {0X0800000000000 , 0X0A00000000000 , MappingDesc::INVALID, " invalid" },
89
+ {0X0A00000000000 , 0X0B00000000000 , MappingDesc::APP, " app-14" },
90
+ {0X0B00000000000 , 0X0C00000000000 , MappingDesc::SHADOW, " shadow-10-13" },
91
+ {0X0C00000000000 , 0X0D00000000000 , MappingDesc::INVALID, " invalid" },
92
+ {0X0D00000000000 , 0X0E00000000000 , MappingDesc::ORIGIN, " origin-10-13" },
93
+ {0x0E00000000000 , 0x0E40000000000 , MappingDesc::ALLOCATOR, " allocator" },
94
+ {0X0E40000000000 , 0X1000000000000 , MappingDesc::APP, " app-15" },
157
95
};
158
- # define MEM_TO_SHADOW (mem ) ((uptr)mem ^ 0x6000000000ULL )
159
- # define SHADOW_TO_ORIGIN (shadow ) (((uptr)(shadow)) + 0x1000000000ULL )
96
+ # define MEM_TO_SHADOW (mem ) ((uptr)mem ^ 0xB00000000000ULL )
97
+ # define SHADOW_TO_ORIGIN (shadow ) (((uptr)(shadow)) + 0x200000000000ULL )
160
98
161
99
#elif SANITIZER_LINUX && SANITIZER_PPC64
162
100
const MappingDesc kMemoryLayout [] = {
@@ -166,7 +104,8 @@ const MappingDesc kMemoryLayout[] = {
166
104
{0x180200000000ULL , 0x1C0000000000ULL , MappingDesc::INVALID, " invalid" },
167
105
{0x1C0000000000ULL , 0x2C0200000000ULL , MappingDesc::ORIGIN, " origin" },
168
106
{0x2C0200000000ULL , 0x300000000000ULL , MappingDesc::INVALID, " invalid" },
169
- {0x300000000000ULL , 0x800000000000ULL , MappingDesc::APP, " high memory" }};
107
+ {0x300000000000ULL , 0x320000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
108
+ {0x320000000000ULL , 0x800000000000ULL , MappingDesc::APP, " high memory" }};
170
109
171
110
// Various kernels use different low end ranges but we can combine them into one
172
111
// big range. They also use different high end ranges but we can map them all to
@@ -189,7 +128,8 @@ const MappingDesc kMemoryLayout[] = {
189
128
{0x180000000000ULL , 0x1C0000000000ULL , MappingDesc::INVALID, " invalid" },
190
129
{0x1C0000000000ULL , 0x2C0000000000ULL , MappingDesc::ORIGIN, " origin" },
191
130
{0x2C0000000000ULL , 0x440000000000ULL , MappingDesc::INVALID, " invalid" },
192
- {0x440000000000ULL , 0x500000000000ULL , MappingDesc::APP, " high memory" }};
131
+ {0x440000000000ULL , 0x460000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
132
+ {0x460000000000ULL , 0x500000000000ULL , MappingDesc::APP, " high memory" }};
193
133
194
134
#define MEM_TO_SHADOW (mem ) \
195
135
((((uptr)(mem)) & ~0xC00000000000ULL ) + 0x080000000000ULL )
@@ -269,7 +209,8 @@ const MappingDesc kMemoryLayout[] = {
269
209
{0x510000000000ULL , 0x600000000000ULL , MappingDesc::APP, " app-2" },
270
210
{0x600000000000ULL , 0x610000000000ULL , MappingDesc::ORIGIN, " origin-1" },
271
211
{0x610000000000ULL , 0x700000000000ULL , MappingDesc::INVALID, " invalid" },
272
- {0x700000000000ULL , 0x800000000000ULL , MappingDesc::APP, " app-3" }};
212
+ {0x700000000000ULL , 0x740000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
213
+ {0x740000000000ULL , 0x800000000000ULL , MappingDesc::APP, " app-3" }};
273
214
#define MEM_TO_SHADOW (mem ) (((uptr)(mem)) ^ 0x500000000000ULL )
274
215
#define SHADOW_TO_ORIGIN (mem ) (((uptr)(mem)) + 0x100000000000ULL )
275
216
#endif // MSAN_LINUX_X86_64_OLD_MAPPING
@@ -285,20 +226,22 @@ const uptr kMemoryLayoutSize = sizeof(kMemoryLayout) / sizeof(kMemoryLayout[0]);
285
226
#ifndef __clang__
286
227
__attribute__ ((optimize(" unroll-loops" )))
287
228
#endif
288
- inline bool addr_is_type (uptr addr, MappingDesc::Type mapping_type) {
229
+ inline bool
230
+ addr_is_type (uptr addr, int mapping_types) {
289
231
// It is critical for performance that this loop is unrolled (because then it is
290
232
// simplified into just a few constant comparisons).
291
233
#ifdef __clang__
292
234
#pragma unroll
293
235
#endif
294
236
for (unsigned i = 0 ; i < kMemoryLayoutSize ; ++i)
295
- if (kMemoryLayout [i].type == mapping_type &&
237
+ if (kMemoryLayout [i].type & mapping_types &&
296
238
addr >= kMemoryLayout [i].start && addr < kMemoryLayout [i].end )
297
239
return true ;
298
240
return false ;
299
241
}
300
242
301
- #define MEM_IS_APP (mem ) addr_is_type((uptr)(mem), MappingDesc::APP)
243
+ #define MEM_IS_APP (mem ) \
244
+ (addr_is_type((uptr)(mem), MappingDesc::APP | MappingDesc::ALLOCATOR))
302
245
#define MEM_IS_SHADOW (mem ) addr_is_type((uptr)(mem), MappingDesc::SHADOW)
303
246
#define MEM_IS_ORIGIN (mem ) addr_is_type((uptr)(mem), MappingDesc::ORIGIN)
304
247
@@ -312,7 +255,7 @@ extern bool msan_init_is_running;
312
255
extern int msan_report_count;
313
256
314
257
bool ProtectRange (uptr beg, uptr end);
315
- bool InitShadow (bool init_origins);
258
+ bool InitShadowWithReExec (bool init_origins);
316
259
char *GetProcSelfMaps ();
317
260
void InitializeInterceptors ();
318
261
0 commit comments