1//===-- asan_mapping_sparc64.h ----------------------------------*- C++ -*-===// 2// 3// This file is distributed under the University of Illinois Open Source 4// License. See LICENSE.TXT for details 5// 6//===----------------------------------------------------------------------===// 7// 8// This file is a part of AddressSanitizer, an address sanity checker. 9// 10// SPARC64-specific definitions for ASan memory mapping. 11//===----------------------------------------------------------------------===// 12#ifndef ASAN_MAPPING_SPARC64_H 13#define ASAN_MAPPING_SPARC64_H 14 15// This is tailored to the 52-bit VM layout on SPARC-T4 and later. 16// The VM space is split into two 51-bit halves at both ends: the low part 17// has all the bits above the 51st cleared, while the high part has them set. 18// 0xfff8000000000000 - 0xffffffffffffffff 19// 0x0000000000000000 - 0x0007ffffffffffff 20 21#define VMA_BITS 52 22#define HIGH_BITS (64 - VMA_BITS) 23 24// The idea is to chop the high bits before doing the scaling, so the two 25// parts become contiguous again and the usual scheme can be applied. 26 27#define MEM_TO_SHADOW(mem) \ 28 ((((mem) << HIGH_BITS) >> (HIGH_BITS + (SHADOW_SCALE))) + (SHADOW_OFFSET)) 29 30#define kLowMemBeg 0 31#define kLowMemEnd (SHADOW_OFFSET - 1) 32 33#define kLowShadowBeg SHADOW_OFFSET 34#define kLowShadowEnd MEM_TO_SHADOW(kLowMemEnd) 35 36// But of course there is the huge hole between the high shadow memory, 37// which is in the low part, and the beginning of the high part. 38 39#define kHighMemBeg (-(1ULL << (VMA_BITS - 1))) 40 41#define kHighShadowBeg MEM_TO_SHADOW(kHighMemBeg) 42#define kHighShadowEnd MEM_TO_SHADOW(kHighMemEnd) 43 44#define kMidShadowBeg 0 45#define kMidShadowEnd 0 46 47// With the zero shadow base we can not actually map pages starting from 0. 48// This constant is somewhat arbitrary. 49#define kZeroBaseShadowStart 0 50#define kZeroBaseMaxShadowStart (1 << 18) 51 52#define kShadowGapBeg (kLowShadowEnd + 1) 53#define kShadowGapEnd (kHighShadowBeg - 1) 54 55#define kShadowGap2Beg 0 56#define kShadowGap2End 0 57 58#define kShadowGap3Beg 0 59#define kShadowGap3End 0 60 61namespace __asan { 62 63static inline bool AddrIsInLowMem(uptr a) { 64 PROFILE_ASAN_MAPPING(); 65 return a <= kLowMemEnd; 66} 67 68static inline bool AddrIsInLowShadow(uptr a) { 69 PROFILE_ASAN_MAPPING(); 70 return a >= kLowShadowBeg && a <= kLowShadowEnd; 71} 72 73static inline bool AddrIsInMidMem(uptr a) { 74 PROFILE_ASAN_MAPPING(); 75 return false; 76} 77 78static inline bool AddrIsInMidShadow(uptr a) { 79 PROFILE_ASAN_MAPPING(); 80 return false; 81} 82 83static inline bool AddrIsInHighMem(uptr a) { 84 PROFILE_ASAN_MAPPING(); 85 return kHighMemBeg && a >= kHighMemBeg && a <= kHighMemEnd; 86} 87 88static inline bool AddrIsInHighShadow(uptr a) { 89 PROFILE_ASAN_MAPPING(); 90 return kHighMemBeg && a >= kHighShadowBeg && a <= kHighShadowEnd; 91} 92 93static inline bool AddrIsInShadowGap(uptr a) { 94 PROFILE_ASAN_MAPPING(); 95 return a >= kShadowGapBeg && a <= kShadowGapEnd; 96} 97 98} // namespace __asan 99 100#endif // ASAN_MAPPING_SPARC64_H 101