asan_mapping.h revision 7f790caa37ec1c9807c877297d30e040e83ed215
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===-- asan_mapping.h ------------------------------------------*- C++ -*-===// 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// The LLVM Compiler Infrastructure 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details. 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 103ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is a part of AddressSanitizer, an address sanity checker. 113ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 1253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar// Defines ASan memory mapping. 131b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar//===----------------------------------------------------------------------===// 141b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#ifndef ASAN_MAPPING_H 151b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#define ASAN_MAPPING_H 164ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 17f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "asan_internal.h" 1827e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar 190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar// The full explanation of the memory mapping could be found here: 201b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar// http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm 21f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// 22f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// Typical shadow mapping on Linux/x86_64 with SHADOW_OFFSET == 0x00007fff8000: 230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar// || `[0x10007fff8000, 0x7fffffffffff]` || HighMem || 24ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor// || `[0x02008fff7000, 0x10007fff7fff]` || HighShadow || 25ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor// || `[0x00008fff7000, 0x02008fff6fff]` || ShadowGap || 267f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner// || `[0x00007fff8000, 0x00008fff6fff]` || LowShadow || 271368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar// || `[0x000000000000, 0x00007fff7fff]` || LowMem || 284d7b14734f2285695dcec347f8718b512093390aTed Kremenek// 29548f6c8e8010b181cb151df92f0a989363cb993eDavid Blaikie// When SHADOW_OFFSET is zero (-pie): 308f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar// || `[0x100000000000, 0x7fffffffffff]` || HighMem || 310648262df75d97b464c2be0ed867da3615659785Daniel Dunbar// || `[0x020000000000, 0x0fffffffffff]` || HighShadow || 32256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer// || `[0x000000040000, 0x01ffffffffff]` || ShadowGap || 3303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer// 3403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer// Special case when something is already mapped between 35ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar// 0x003000000000 and 0x005000000000 (e.g. when prelink is installed): 36f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// || `[0x10007fff8000, 0x7fffffffffff]` || HighMem || 3718d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth// || `[0x02008fff7000, 0x10007fff7fff]` || HighShadow || 38f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar// || `[0x005000000000, 0x02008fff6fff]` || ShadowGap3 || 39f2462be34a49e2108c9b4151f8e6d3fe1b916179Dylan Noblesmith// || `[0x003000000000, 0x004fffffffff]` || MidMem || 4069d3b4f7c9fa818d2536b4f1b220b942ae392128Dylan Noblesmith// || `[0x000a7fff8000, 0x002fffffffff]` || ShadowGap2 || 41cc8a94565ec2ff459dcee9ef34237fdcdfc69b3fDylan Noblesmith// || `[0x00067fff8000, 0x000a7fff7fff]` || MidShadow || 42cc8a94565ec2ff459dcee9ef34237fdcdfc69b3fDylan Noblesmith// || `[0x00008fff7000, 0x00067fff7fff]` || ShadowGap || 431b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar// || `[0x00007fff8000, 0x00008fff6fff]` || LowShadow || 4492b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattner// || `[0x000000000000, 0x00007fff7fff]` || LowMem || 451b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar// 465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner// Default Linux/i386 mapping: 479606a57b6f2c43bf438a958fdffea1de60f6b2b7Sebastian Pop// || `[0x40000000, 0xffffffff]` || HighMem || 485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner// || `[0x28000000, 0x3fffffff]` || HighShadow || 4910a82cde7c317c5dd41dc3faf17f503c52ce2a3dBob Wilson// || `[0x24000000, 0x27ffffff]` || ShadowGap || 50d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie// || `[0x20000000, 0x23ffffff]` || LowShadow || 517e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky// || `[0x00000000, 0x1fffffff]` || LowMem || 524762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop// 534762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop// Default Linux/MIPS mapping: 54abac441b7d114d5980864093ee0643bf68f1a8f2Chad Rosier// || `[0x2aaa8000, 0xffffffff]` || HighMem || 5543302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar// || `[0x0fffd000, 0x2aaa7fff]` || HighShadow || 56c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar// || `[0x0bffd000, 0x0fffcfff]` || ShadowGap || 57c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar// || `[0x0aaa8000, 0x0bffcfff]` || LowShadow || 58951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenberger// || `[0x00000000, 0x0aaa7fff]` || LowMem || 59c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar 602b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic const u64 kDefaultShadowScale = 3; 612b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic const u64 kDefaultShadowOffset32 = 1ULL << 29; 622b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierstatic const u64 kDefaultShadowOffset64 = 1ULL << 44; 63f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarstatic const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000; // < 2G. 64f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarstatic const u64 kPPC64_ShadowOffset64 = 1ULL << 41; 65b9da55780eb66fb09e771dbc5ff01eec5c4d957bDavid Blaikiestatic const u64 kMIPS32_ShadowOffset32 = 0x0aaa8000; 66f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar 67f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#if ASAN_FLEXIBLE_MAPPING_AND_OFFSET == 1 68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarextern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_scale; 69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbarextern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_offset; 70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar# define SHADOW_SCALE (__asan_mapping_scale) 71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar# define SHADOW_OFFSET (__asan_mapping_offset) 72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar#else 73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar# define SHADOW_SCALE kDefaultShadowScale 74225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar# if SANITIZER_ANDROID 75d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# define SHADOW_OFFSET (0) 76d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# else 770bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar# if SANITIZER_WORDSIZE == 32 78225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar# if defined(__mips__) 795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner# define SHADOW_OFFSET kMIPS32_ShadowOffset32 80f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith# else 81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# define SHADOW_OFFSET kDefaultShadowOffset32 82d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# endif 83d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# else 84d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# if defined(__powerpc64__) 85225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar# define SHADOW_OFFSET kPPC64_ShadowOffset64 863ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar# elif SANITIZER_MAC 873ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar# define SHADOW_OFFSET kDefaultShadowOffset64 883ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar# else 891b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar# define SHADOW_OFFSET kDefaultShort64bitShadowOffset 9018d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth# endif 9118d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth# endif 9218d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth# endif 9318d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth#endif // ASAN_FLEXIBLE_MAPPING_AND_OFFSET 9418d7f3af752c41a197552a1ff25ddd639224b4bbChandler Carruth 953ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#define SHADOW_GRANULARITY (1ULL << SHADOW_SCALE) 963ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#define MEM_TO_SHADOW(mem) (((mem) >> SHADOW_SCALE) + (SHADOW_OFFSET)) 972d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris Lattner#define SHADOW_TO_MEM(shadow) (((shadow) - SHADOW_OFFSET) << SHADOW_SCALE) 988f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar 99847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kLowMemBeg 0 1007f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner#define kLowMemEnd (SHADOW_OFFSET ? SHADOW_OFFSET - 1 : 0) 101847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 102847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kLowShadowBeg SHADOW_OFFSET 103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kLowShadowEnd MEM_TO_SHADOW(kLowMemEnd) 104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kHighMemBeg (MEM_TO_SHADOW(kHighMemEnd) + 1) 106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kHighShadowBeg MEM_TO_SHADOW(kHighMemBeg) 108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar#define kHighShadowEnd MEM_TO_SHADOW(kHighMemEnd) 109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar# define kMidShadowBeg MEM_TO_SHADOW(kMidMemBeg) 111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar# define kMidShadowEnd MEM_TO_SHADOW(kMidMemEnd) 112b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar 113b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar// With the zero shadow base we can not actually map pages starting from 0. 114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar// This constant is somewhat arbitrary. 115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar#define kZeroBaseShadowStart (1 << 18) 1162dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier 1172dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier#define kShadowGapBeg (kLowShadowEnd ? kLowShadowEnd + 1 \ 1182dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier : kZeroBaseShadowStart) 1192dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier#define kShadowGapEnd ((kMidMemBeg ? kMidShadowBeg : kHighShadowBeg) - 1) 1202dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier 1212dd17a15ddc0184790d790b6128d79ffddae4964Chad Rosier#define kShadowGap2Beg (kMidMemBeg ? kMidShadowEnd + 1 : 0) 1220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#define kShadowGap2End (kMidMemBeg ? kMidMemBeg - 1 : 0) 1230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 1240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#define kShadowGap3Beg (kMidMemBeg ? kMidMemEnd + 1 : 0) 1250648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#define kShadowGap3End (kMidMemBeg ? kHighShadowBeg - 1 : 0) 1260648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 1271fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#define DO_ASAN_MAPPING_PROFILE 0 // Set to 1 to profile the functions below. 1281fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1291fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#if DO_ASAN_MAPPING_PROFILE 1301fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier# define PROFILE_ASAN_MAPPING() AsanMappingProfile[__LINE__]++; 1311fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#else 1321fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier# define PROFILE_ASAN_MAPPING() 1331fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#endif 13459f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher 1351fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// If 1, all shadow boundaries are constants. 1361fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// Don't set to 1 other than for testing. 1371fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#define ASAN_FIXED_MAPPING 0 1381fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1391fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosiernamespace __asan { 14059f9b26bcb59bfb4d66c6ea129172795dcd1cb6bEric Christopher 1411fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierextern uptr AsanMappingProfile[]; 1421fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1431fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#if ASAN_FIXED_MAPPING 144582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian// Fixed mapping for 64-bit Linux. Mostly used for performance comparison 14530660a898545416f0fea2d717f16f75640001e38Ted Kremenek// with non-fixed mapping. As of r175253 (Feb 2013) the performance 1461fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// difference between fixed and non-fixed mapping is below the noise level. 14753cb2b47596b0ca893a449fa81e0912ded658759Chad Rosierstatic uptr kHighMemEnd = 0x7fffffffffffULL; 1481fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic uptr kMidMemBeg = 0x3000000000ULL; 1491fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic uptr kMidMemEnd = 0x4fffffffffULL; 1501fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#else 1511fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierextern uptr kHighMemEnd, kMidMemBeg, kMidMemEnd; // Initialized in __asan_init. 1521fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier#endif 1531fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1541fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic inline bool AddrIsInLowMem(uptr a) { 1551fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier PROFILE_ASAN_MAPPING(); 1561fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier return a < kLowMemEnd; 1571fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier} 1581fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1591fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic inline bool AddrIsInLowShadow(uptr a) { 1601fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier PROFILE_ASAN_MAPPING(); 1611fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier return a >= kLowShadowBeg && a <= kLowShadowEnd; 1621fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier} 1631fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier 1641fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierstatic inline bool AddrIsInHighMem(uptr a) { 1651fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier PROFILE_ASAN_MAPPING(); 166279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar return a >= kHighMemBeg && a <= kHighMemEnd; 167279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar} 168279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 169e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbarstatic inline bool AddrIsInMidMem(uptr a) { 170279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar PROFILE_ASAN_MAPPING(); 171f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar return kMidMemBeg && a >= kMidMemBeg && a <= kMidMemEnd; 172f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar} 173f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 174f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic inline bool AddrIsInMem(uptr a) { 175f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar PROFILE_ASAN_MAPPING(); 176f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar return AddrIsInLowMem(a) || AddrIsInMidMem(a) || AddrIsInHighMem(a); 177eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar} 178eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 179eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbarstatic inline uptr MemToShadow(uptr p) { 180eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar PROFILE_ASAN_MAPPING(); 181eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar CHECK(AddrIsInMem(p)); 182eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar return MEM_TO_SHADOW(p); 183f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar} 184f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 185f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic inline bool AddrIsInHighShadow(uptr a) { 186f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar PROFILE_ASAN_MAPPING(); 187f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar return a >= kHighShadowBeg && a <= kHighMemEnd; 1885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner} 189f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 190f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbarstatic inline bool AddrIsInMidShadow(uptr a) { 191f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar PROFILE_ASAN_MAPPING(); 192f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar return kMidMemBeg && a >= kMidShadowBeg && a <= kMidMemEnd; 193f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar} 194f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 195eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbarstatic inline bool AddrIsInShadow(uptr a) { 196eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar PROFILE_ASAN_MAPPING(); 197eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar return AddrIsInLowShadow(a) || AddrIsInMidShadow(a) || AddrIsInHighShadow(a); 198eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar} 199eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 2005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic inline bool AddrIsInShadowGap(uptr a) { 2015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner PROFILE_ASAN_MAPPING(); 202212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar if (kMidMemBeg) { 2035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (a <= kShadowGapEnd) 204212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar return SHADOW_OFFSET == 0 || a >= kShadowGapBeg; 205212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar return (a >= kShadowGap2Beg && a <= kShadowGap2End) || 206212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar (a >= kShadowGap3Beg && a <= kShadowGap3End); 207eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar } 208eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // In zero-based shadow mode we treat addresses near zero as addresses 209eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // in shadow gap as well. 210eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar if (SHADOW_OFFSET == 0) 211eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar return a <= kShadowGapEnd; 2127433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen return a >= kShadowGapBeg && a <= kShadowGapEnd; 2137433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen} 2145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 215e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbarstatic inline bool AddrIsAlignedByGranularity(uptr a) { 2167433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen PROFILE_ASAN_MAPPING(); 2177433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen return (a & (SHADOW_GRANULARITY - 1)) == 0; 218e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar} 219e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 220e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbarstatic inline bool AddressIsPoisoned(uptr a) { 221e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar PROFILE_ASAN_MAPPING(); 2227433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen const uptr kAccessSize = 1; 2237433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen u8 *shadow_address = (u8*)MEM_TO_SHADOW(a); 2247433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen s8 shadow_value = *shadow_address; 2257433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen if (shadow_value) { 2267433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen u8 last_accessed_byte = (a & (SHADOW_GRANULARITY - 1)) 2277433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen + kAccessSize - 1; 2287433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen return (last_accessed_byte >= shadow_value); 229e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } 230e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar return false; 231279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar} 232f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 233279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar// Must be after all calls to PROFILE_ASAN_MAPPING(). 234a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbarstatic const uptr kAsanMappingProfileSize = __LINE__; 235a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar 236a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar} // namespace __asan 237a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar 238a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#endif // ASAN_MAPPING_H 239a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar