137
137
// || `[0x36000000, 0x39ffffff]` || ShadowGap ||
138
138
// || `[0x30000000, 0x35ffffff]` || LowShadow ||
139
139
// || `[0x00000000, 0x2fffffff]` || LowMem ||
140
+ //
141
+ // Shadow mapping on Myriad2 (for shadow scale 5):
142
+ // || `[0x9ff80000, 0x9fffffff]` || ShadowGap ||
143
+ // || `[0x9f000000, 0x9ff7ffff]` || LowShadow ||
144
+ // || `[0x80000000, 0x9effffff]` || LowMem ||
145
+ // || `[0x00000000, 0x7fffffff]` || Ignored ||
140
146
141
147
#if defined(ASAN_SHADOW_SCALE)
142
148
static const u64 kDefaultShadowScale = ASAN_SHADOW_SCALE;
143
149
#else
144
- static const u64 kDefaultShadowScale = 3 ;
150
+ static const u64 kDefaultShadowScale = SANITIZER_MYRIAD2 ? 5 : 3 ;
145
151
#endif
146
152
static const u64 kDefaultShadowSentinel = ~(uptr)0 ;
147
153
static const u64 kDefaultShadowOffset32 = 1ULL << 29 ; // 0x20000000
@@ -163,6 +169,15 @@ static const u64 kNetBSD_ShadowOffset32 = 1ULL << 30; // 0x40000000
163
169
static const u64 kNetBSD_ShadowOffset64 = 1ULL << 46 ; // 0x400000000000
164
170
static const u64 kWindowsShadowOffset32 = 3ULL << 28 ; // 0x30000000
165
171
172
+ static const u64 kMyriadMemoryOffset32 = 0x80000000ULL ;
173
+ static const u64 kMyriadMemorySize32 = 0x20000000ULL ;
174
+ static const u64 kMyriadMemoryEnd32 =
175
+ kMyriadMemoryOffset32 + kMyriadMemorySize32 - 1 ;
176
+ static const u64 kMyriadShadowOffset32 =
177
+ (kMyriadMemoryOffset32 + kMyriadMemorySize32 -
178
+ (kMyriadMemorySize32 >> kDefaultShadowScale ));
179
+ static const u64 kMyriadCacheBitMask32 = 0x40000000ULL ;
180
+
166
181
#define SHADOW_SCALE kDefaultShadowScale
167
182
168
183
#if SANITIZER_FUCHSIA
@@ -184,6 +199,8 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
184
199
# else
185
200
# define SHADOW_OFFSET kIosShadowOffset32
186
201
# endif
202
+ # elif SANITIZER_MYRIAD2
203
+ # define SHADOW_OFFSET kMyriadShadowOffset32
187
204
# else
188
205
# define SHADOW_OFFSET kDefaultShadowOffset32
189
206
# endif
@@ -222,6 +239,39 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
222
239
#endif
223
240
224
241
#define SHADOW_GRANULARITY (1ULL << SHADOW_SCALE)
242
+
243
+ #define DO_ASAN_MAPPING_PROFILE 0 // Set to 1 to profile the functions below.
244
+
245
+ #if DO_ASAN_MAPPING_PROFILE
246
+ # define PROFILE_ASAN_MAPPING () AsanMappingProfile[__LINE__]++;
247
+ #else
248
+ # define PROFILE_ASAN_MAPPING ()
249
+ #endif
250
+
251
+ // If 1, all shadow boundaries are constants.
252
+ // Don't set to 1 other than for testing.
253
+ #define ASAN_FIXED_MAPPING 0
254
+
255
+ namespace __asan {
256
+
257
+ extern uptr AsanMappingProfile[];
258
+
259
+ #if ASAN_FIXED_MAPPING
260
+ // Fixed mapping for 64-bit Linux. Mostly used for performance comparison
261
+ // with non-fixed mapping. As of r175253 (Feb 2013) the performance
262
+ // difference between fixed and non-fixed mapping is below the noise level.
263
+ static uptr kHighMemEnd = 0x7fffffffffffULL ;
264
+ static uptr kMidMemBeg = 0x3000000000ULL ;
265
+ static uptr kMidMemEnd = 0x4fffffffffULL ;
266
+ #else
267
+ extern uptr kHighMemEnd , kMidMemBeg , kMidMemEnd ; // Initialized in __asan_init.
268
+ #endif
269
+
270
+ } // namespace __asan
271
+
272
+ #if SANITIZER_MYRIAD2
273
+ #include " asan_mapping_myriad.h"
274
+ #else
225
275
#define MEM_TO_SHADOW (mem ) (((mem) >> SHADOW_SCALE) + (SHADOW_OFFSET))
226
276
227
277
#define kLowMemBeg 0
@@ -253,51 +303,36 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
253
303
#define kShadowGap3Beg (kMidMemBeg ? kMidMemEnd + 1 : 0 )
254
304
#define kShadowGap3End (kMidMemBeg ? kHighShadowBeg - 1 : 0 )
255
305
256
- #define DO_ASAN_MAPPING_PROFILE 0 // Set to 1 to profile the functions below.
257
-
258
- #if DO_ASAN_MAPPING_PROFILE
259
- # define PROFILE_ASAN_MAPPING () AsanMappingProfile[__LINE__]++;
260
- #else
261
- # define PROFILE_ASAN_MAPPING ()
262
- #endif
263
-
264
- // If 1, all shadow boundaries are constants.
265
- // Don't set to 1 other than for testing.
266
- #define ASAN_FIXED_MAPPING 0
267
-
268
306
namespace __asan {
269
307
270
- extern uptr AsanMappingProfile[];
271
-
272
- #if ASAN_FIXED_MAPPING
273
- // Fixed mapping for 64-bit Linux. Mostly used for performance comparison
274
- // with non-fixed mapping. As of r175253 (Feb 2013) the performance
275
- // difference between fixed and non-fixed mapping is below the noise level.
276
- static uptr kHighMemEnd = 0x7fffffffffffULL ;
277
- static uptr kMidMemBeg = 0x3000000000ULL ;
278
- static uptr kMidMemEnd = 0x4fffffffffULL ;
279
- #else
280
- extern uptr kHighMemEnd , kMidMemBeg , kMidMemEnd ; // Initialized in __asan_init.
281
- #endif
282
-
283
308
static inline bool AddrIsInLowMem (uptr a) {
284
309
PROFILE_ASAN_MAPPING ();
285
- return a < kLowMemEnd ;
310
+ return a >= kLowMemBeg && a <= kLowMemEnd ;
286
311
}
287
312
288
313
static inline bool AddrIsInLowShadow (uptr a) {
289
314
PROFILE_ASAN_MAPPING ();
290
315
return a >= kLowShadowBeg && a <= kLowShadowEnd ;
291
316
}
292
317
318
+ static inline bool AddrIsInMidMem (uptr a) {
319
+ PROFILE_ASAN_MAPPING ();
320
+ return kMidMemBeg && a >= kMidMemBeg && a <= kMidMemEnd ;
321
+ }
322
+
323
+ static inline bool AddrIsInMidShadow (uptr a) {
324
+ PROFILE_ASAN_MAPPING ();
325
+ return kMidMemBeg && a >= kMidShadowBeg && a <= kMidShadowEnd ;
326
+ }
327
+
293
328
static inline bool AddrIsInHighMem (uptr a) {
294
329
PROFILE_ASAN_MAPPING ();
295
- return a >= kHighMemBeg && a <= kHighMemEnd ;
330
+ return kHighMemBeg && a >= kHighMemBeg && a <= kHighMemEnd ;
296
331
}
297
332
298
- static inline bool AddrIsInMidMem (uptr a) {
333
+ static inline bool AddrIsInHighShadow (uptr a) {
299
334
PROFILE_ASAN_MAPPING ();
300
- return kMidMemBeg && a >= kMidMemBeg && a <= kMidMemEnd ;
335
+ return kHighMemBeg && a >= kHighShadowBeg && a <= kHighShadowEnd ;
301
336
}
302
337
303
338
static inline bool AddrIsInShadowGap (uptr a) {
@@ -315,6 +350,12 @@ static inline bool AddrIsInShadowGap(uptr a) {
315
350
return a >= kShadowGapBeg && a <= kShadowGapEnd ;
316
351
}
317
352
353
+ } // namespace __asan
354
+
355
+ #endif // SANITIZER_MYRIAD2
356
+
357
+ namespace __asan {
358
+
318
359
static inline bool AddrIsInMem (uptr a) {
319
360
PROFILE_ASAN_MAPPING ();
320
361
return AddrIsInLowMem (a) || AddrIsInMidMem (a) || AddrIsInHighMem (a) ||
@@ -327,16 +368,6 @@ static inline uptr MemToShadow(uptr p) {
327
368
return MEM_TO_SHADOW (p);
328
369
}
329
370
330
- static inline bool AddrIsInHighShadow (uptr a) {
331
- PROFILE_ASAN_MAPPING ();
332
- return a >= kHighShadowBeg && a <= kHighShadowEnd ;
333
- }
334
-
335
- static inline bool AddrIsInMidShadow (uptr a) {
336
- PROFILE_ASAN_MAPPING ();
337
- return kMidMemBeg && a >= kMidShadowBeg && a <= kMidShadowEnd ;
338
- }
339
-
340
371
static inline bool AddrIsInShadow (uptr a) {
341
372
PROFILE_ASAN_MAPPING ();
342
373
return AddrIsInLowShadow (a) || AddrIsInMidShadow (a) || AddrIsInHighShadow (a);
@@ -349,6 +380,8 @@ static inline bool AddrIsAlignedByGranularity(uptr a) {
349
380
350
381
static inline bool AddressIsPoisoned (uptr a) {
351
382
PROFILE_ASAN_MAPPING ();
383
+ if (SANITIZER_MYRIAD2 && !AddrIsInMem (a) && !AddrIsInShadow (a))
384
+ return false ;
352
385
const uptr kAccessSize = 1 ;
353
386
u8 *shadow_address = (u8*)MEM_TO_SHADOW (a);
354
387
s8 shadow_value = *shadow_address;
0 commit comments