@@ -33,12 +33,18 @@ struct MappingDesc {
3333 uptr start;
3434 uptr end;
3535 enum Type {
36- INVALID, APP, SHADOW, ORIGIN
36+ INVALID = 1 ,
37+ ALLOCATOR = 2 ,
38+ APP = 4 ,
39+ SHADOW = 8 ,
40+ ORIGIN = 16 ,
3741 } type;
3842 const char *name;
3943};
4044
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.
4248#if SANITIZER_LINUX && defined(__mips64)
4349
4450// MIPS64 maps:
@@ -84,7 +90,8 @@ const MappingDesc kMemoryLayout[] = {
8490 {0X0B00000000000 , 0X0C00000000000 , MappingDesc::SHADOW, " shadow-10-13" },
8591 {0X0C00000000000 , 0X0D00000000000 , MappingDesc::INVALID, " invalid" },
8692 {0X0D00000000000 , 0X0E00000000000 , MappingDesc::ORIGIN, " origin-10-13" },
87- {0X0E00000000000 , 0X1000000000000 , MappingDesc::APP, " app-15" },
93+ {0x0E00000000000 , 0x0E40000000000 , MappingDesc::ALLOCATOR, " allocator" },
94+ {0X0E40000000000 , 0X1000000000000 , MappingDesc::APP, " app-15" },
8895};
8996# define MEM_TO_SHADOW (mem ) ((uptr)mem ^ 0xB00000000000ULL )
9097# define SHADOW_TO_ORIGIN (shadow ) (((uptr)(shadow)) + 0x200000000000ULL )
@@ -106,7 +113,8 @@ const MappingDesc kMemoryLayout[] = {
106113 {0x510000000000ULL , 0x600000000000ULL , MappingDesc::APP, " app-2" },
107114 {0x600000000000ULL , 0x610000000000ULL , MappingDesc::ORIGIN, " origin-1" },
108115 {0x610000000000ULL , 0x700000000000ULL , MappingDesc::INVALID, " invalid" },
109- {0x700000000000ULL , 0x800000000000ULL , MappingDesc::APP, " app-3" }};
116+ {0x700000000000ULL , 0x740000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
117+ {0x740000000000ULL , 0x800000000000ULL , MappingDesc::APP, " app-3" }};
110118# define MEM_TO_SHADOW (mem ) (((uptr)(mem)) ^ 0x500000000000ULL )
111119# define SHADOW_TO_ORIGIN (shadow ) (((uptr)(shadow)) + 0x100000000000ULL )
112120
@@ -118,7 +126,8 @@ const MappingDesc kMemoryLayout[] = {
118126 {0x180200000000ULL , 0x1C0000000000ULL , MappingDesc::INVALID, " invalid" },
119127 {0x1C0000000000ULL , 0x2C0200000000ULL , MappingDesc::ORIGIN, " origin" },
120128 {0x2C0200000000ULL , 0x300000000000ULL , MappingDesc::INVALID, " invalid" },
121- {0x300000000000ULL , 0x800000000000ULL , MappingDesc::APP, " high memory" }};
129+ {0x300000000000ULL , 0x320000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
130+ {0x320000000000ULL , 0x800000000000ULL , MappingDesc::APP, " high memory" }};
122131
123132// Various kernels use different low end ranges but we can combine them into one
124133// big range. They also use different high end ranges but we can map them all to
@@ -141,7 +150,8 @@ const MappingDesc kMemoryLayout[] = {
141150 {0x180000000000ULL , 0x1C0000000000ULL , MappingDesc::INVALID, " invalid" },
142151 {0x1C0000000000ULL , 0x2C0000000000ULL , MappingDesc::ORIGIN, " origin" },
143152 {0x2C0000000000ULL , 0x440000000000ULL , MappingDesc::INVALID, " invalid" },
144- {0x440000000000ULL , 0x500000000000ULL , MappingDesc::APP, " high memory" }};
153+ {0x440000000000ULL , 0x460000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
154+ {0x460000000000ULL , 0x500000000000ULL , MappingDesc::APP, " high memory" }};
145155
146156#define MEM_TO_SHADOW (mem ) \
147157 ((((uptr)(mem)) & ~0xC00000000000ULL ) + 0x080000000000ULL )
@@ -208,7 +218,8 @@ const MappingDesc kMemoryLayout[] = {
208218 {0x510000000000ULL , 0x600000000000ULL , MappingDesc::APP, " app-2" },
209219 {0x600000000000ULL , 0x610000000000ULL , MappingDesc::ORIGIN, " origin-1" },
210220 {0x610000000000ULL , 0x700000000000ULL , MappingDesc::INVALID, " invalid" },
211- {0x700000000000ULL , 0x800000000000ULL , MappingDesc::APP, " app-3" }};
221+ {0x700000000000ULL , 0x740000000000ULL , MappingDesc::ALLOCATOR, " allocator" },
222+ {0x740000000000ULL , 0x800000000000ULL , MappingDesc::APP, " app-3" }};
212223#define MEM_TO_SHADOW (mem ) (((uptr)(mem)) ^ 0x500000000000ULL )
213224#define SHADOW_TO_ORIGIN (mem ) (((uptr)(mem)) + 0x100000000000ULL )
214225
@@ -223,20 +234,22 @@ const uptr kMemoryLayoutSize = sizeof(kMemoryLayout) / sizeof(kMemoryLayout[0]);
223234#ifndef __clang__
224235__attribute__ ((optimize(" unroll-loops" )))
225236#endif
226- inline bool addr_is_type (uptr addr, MappingDesc::Type mapping_type) {
237+ inline bool
238+ addr_is_type (uptr addr, int mapping_types) {
227239// It is critical for performance that this loop is unrolled (because then it is
228240// simplified into just a few constant comparisons).
229241#ifdef __clang__
230242#pragma unroll
231243#endif
232244 for (unsigned i = 0 ; i < kMemoryLayoutSize ; ++i)
233- if (kMemoryLayout [i].type == mapping_type &&
245+ if (( kMemoryLayout [i].type & mapping_types) &&
234246 addr >= kMemoryLayout [i].start && addr < kMemoryLayout [i].end )
235247 return true ;
236248 return false ;
237249}
238250
239- #define MEM_IS_APP (mem ) addr_is_type((uptr)(mem), MappingDesc::APP)
251+ #define MEM_IS_APP (mem ) \
252+ (addr_is_type((uptr)(mem), MappingDesc::APP | MappingDesc::ALLOCATOR))
240253#define MEM_IS_SHADOW (mem ) addr_is_type((uptr)(mem), MappingDesc::SHADOW)
241254#define MEM_IS_ORIGIN (mem ) addr_is_type((uptr)(mem), MappingDesc::ORIGIN)
242255
0 commit comments